ready for v2.0.0

This commit is contained in:
vishnuraghavb 2021-06-18 18:22:03 +05:30
parent d2af7fd3e6
commit 7889eceea4
38 changed files with 1133 additions and 944 deletions

View file

@ -17,7 +17,7 @@ $t1: 25;
$t2: 21;
$t3: 17;
$t4: 14;
$t5: 12; // Base size
$t5: 12; // Base
$t6: 10;
Page {
@ -25,29 +25,31 @@ Page {
font-size: $t4;
}
.ico {
font-family: 'enrecipes';
font-size: 24;
vertical-alignment: center;
&.sm {
font-family: 'EnRecipes';
font-size: 23;
&.s {
font-size: $t3;
opacity: 0.5;
}
}
.vc {
vertical-align: center;
}
.tb {
font-family: 'Inter-Bold', sans-serif;
}
.tac {
.tc {
text-align: center;
}
.tw {
text-wrap: true;
}
.pageTitle {
@extend .tb;
@extend .tw;
.pTitle {
font-size: $t1;
padding: 16 16 24;
}
.Light {
color: $gray9;
background: $gray1;
@ -67,8 +69,9 @@ Page {
.appbar,
.modal {
background: $gray0;
box-shadow: 0 2 rgba($gray10, 0.1);
}
.fieldLabel,
.fLabel,
.sub {
color: $gray6;
}
@ -105,7 +108,7 @@ Page {
color: $gray0;
background: $gray8;
}
.fieldLabel,
.fLabel,
.sub {
color: $gray5;
}
@ -142,7 +145,7 @@ Page {
color: $gray1;
background: $gray9;
}
.fieldLabel,
.fLabel,
.sub {
color: $gray6;
}
@ -158,8 +161,9 @@ Page {
color: $gray10;
}
}
TextField.combField,
#searchBar {
#search {
border-color: transparent;
}
@ -167,28 +171,24 @@ TextField.combField,
// Elements
TextField,
TextView {
width: 100%;
// width: 100%;
padding: 14 8;
border-bottom-width: 1;
}
TextView {
line-height: 4;
}
#searchBar {
#search {
padding: 13 12;
}
.inputField {
.inputC {
margin-bottom: 24;
}
.fieldLabel {
.fLabel {
font-size: $t5;
}
.progressContainer {
width: 100%;
}
progress {
color: $orange;
width: 100%;
height: 2;
background-color: $gray5;
}
@ -197,12 +197,17 @@ Switch {
off-background-color: $gray5;
}
button {
background-color: transparent;
z-index: 0;
padding: 8;
border-radius: 12;
min-width: 0;
min-height: 0;
text-transform: none;
background-color: transparent;
&.sst {
width: 48;
height: 48;
}
&.ico {
width: 48;
height: 48;
@ -212,36 +217,28 @@ button {
@extend .fade;
}
}
&.text {
@extend .tb;
color: $orange;
&:active {
@extend .fade;
&.si {
width: 40;
height: 40;
}
&.text {
color: $orange;
}
&.st {
font-size: $t5;
padding: 12;
}
&.big {
margin-top: 8;
padding: 16 0;
}
&.sm {
font-size: $t5;
padding: 12;
}
&.min {
width: 40;
height: 40;
vertical-alignment: center;
}
&.fb:active {
@extend .fade;
}
&.rate {
margin: 0 4 0 0;
width: 32;
height: 32;
&:active {
@extend .fade;
}
&.fb:active {
@extend .fade;
}
}
ActivityIndicator {
@ -255,52 +252,44 @@ ActivityIndicator {
// Home
.segment {
border-radius: 12;
margin: 0 4 0 0;
padding: 0 12;
.value {
padding: 0 0 0 8;
vertical-alignment: center;
&.r {
padding: 0 8 0 0;
transform: scaleX(-1);
}
padding: 8;
.v {
padding: 0 4;
}
}
.select {
color: $orange;
@extend .hl;
}
.emptyState {
padding: 16 16 8;
label {
@extend .tw;
}
.title {
@extend .tb;
.t3 {
font-size: $t3;
}
.empty {
padding: 16 16 8;
}
// -----------------------------
// Recipe Item
.recipeItem {
.recipe {
padding: 8 16;
.recipeInfo {
vertical-alignment: center;
.info {
padding: 0 8 4;
}
.title {
padding: 0 0 4;
}
}
.attrs {
.oh {
orientation: horizontal;
}
.t6 {
font-size: $t6;
}
.attr {
font-size: $t6;
padding: 1 4;
padding: 0 4 2;
}
.simple .recipeInfo {
.simple .info {
padding: 8 0;
}
.minimal .title {
@ -308,7 +297,7 @@ ActivityIndicator {
}
.grid {
padding: 8;
.recipeInfo {
.info {
padding: 8 0 4;
}
&.odd {
@ -318,7 +307,7 @@ ActivityIndicator {
padding: 8 16 8 8;
}
}
.photogrid .recipeInfo {
.photogrid .info {
padding: 8 0 0;
}
.lastItem {
@ -401,7 +390,7 @@ ActivityIndicator {
margin: 24 16 0 0;
vertical-align: top;
}
.photoviewer {
.imgViewer {
width: 96;
height: 96;
opacity: 0;
@ -417,94 +406,55 @@ ActivityIndicator {
@extend .tw;
}
}
.ingredient {
.check {
padding: 0 16;
.value {
@extend .tw;
vertical-align: center;
padding: 14 16;
line-height: 4;
}
}
.instruction {
padding: 0 16;
.count {
@extend .tb;
font-size: $t3;
}
.value {
@extend .tw;
.v {
padding: 14 16;
line-height: 4;
}
}
.done {
opacity: 0.5;
.value {
.v {
text-decoration: line-through;
}
}
.combination {
@extend .tw;
text-align: left;
padding: 16;
.comb {
padding: 16 24;
line-height: 4;
}
.note {
@extend .tw;
line-height: 4;
padding: 16 0;
}
.dateInfo {
padding: 32 16 16;
font-size: $t5;
padding: 16 24;
line-height: 4;
}
// -----------------------------
// AppBar
.appbar {
z-index: 4;
min-height: 56;
margin: 8;
padding: 4;
border-radius: 16;
.title {
@extend .tb;
@extend .tw;
vertical-align: center;
margin: 0 12;
line-height: 4;
}
.msg {
padding: 14 16;
margin: 0;
}
.fab {
margin-left: 8;
}
&.home {
margin: 8 8 0;
}
}
.sidebar {
margin-bottom: 0;
}
.toolbar {
z-index: 4;
padding: 4;
margin: 0 0 52;
vertical-align: bottom;
height: 1;
transform: translateY(48);
.tool {
padding: 0 8;
label {
vertical-alignment: center;
orientation: horizontal;
}
.value,
.v,
.ico {
padding: 0 4;
}
}
}
.fab {
border-radius: 12;
background: $orange;
@ -512,64 +462,44 @@ ActivityIndicator {
// -----------------------------
// EditRecipe
.sectionTitle {
@extend .tb;
@extend .tw;
font-size: $t2;
padding: 0;
.section {
padding: 0 16;
margin: 32 0 16;
}
.t2 {
font-size: $t2;
}
.sticky {
width: 100%;
padding: 0 16 16;
margin: 0;
}
.countdown {
font-size: $t3;
color: $orange;
}
// -----------------------------
// MealPlanner
.monthSwitcher {
padding: 0 16;
.month {
vertical-alignment: center;
text-align: center;
font-size: $t3;
}
}
.calendar {
padding: 0 16;
.dayName {
vertical-alignment: center;
text-align: center;
font-size: $t5;
}
.accent.sub {
color: rgba($orange, 0.5);
color: rgba($orange, 0.6);
}
}
.plans {
padding: 8 16 80;
width: 100%;
margin: 16 16 0;
.date {
font-size: $t2;
padding: 16 0;
margin: 16 0 8;
}
.type {
padding: 8 0;
}
.plan {
padding: 8 0;
}
.meal {
font-size: $t3;
padding: 8 0;
}
.planContent {
min-height: 48;
padding: 8;
padding: 4 0;
}
.attr {
padding: 0;
.info {
min-height: 40;
padding: 0 8;
}
.note {
padding: 4 0;
}
}
@ -626,12 +556,6 @@ ActivityIndicator {
margin: 0 0 8;
}
}
.noResInfo {
@extend .tac;
@extend .tw;
padding: 16;
line-height: 4;
}
// -----------------------------
// Transitions
@ -646,7 +570,7 @@ ActivityIndicator {
background-color: transparent;
}
100% {
background-color: rgba($orange, 0.2);
background-color: rgba($orange, 0.1);
}
}
.fade {
@ -660,7 +584,7 @@ ActivityIndicator {
opacity: 1;
}
100% {
opacity: 0.5;
opacity: 0.75;
}
}
@ -678,3 +602,12 @@ ActivityIndicator {
horizontal-alignment: right;
}
}
.har {
horizontal-alignment: right;
&.r {
horizontal-alignment: left;
}
}
.edge {
width: 16;
}

View file

@ -1,5 +1,5 @@
<template>
<Page @loaded="pgLoad" @unloaded="pgUnload" actionBarHidden="true">
<Page @loaded="pgLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="*">
<ScrollView
@scroll="svScroll($event)"
@ -8,7 +8,7 @@
>
<StackLayout>
<RGridLayout :rtl="RTL" rows="auto" columns="*, auto, 12">
<RLabel class="pageTitle" :text="'timer' | L" />
<RLabel class="pTitle tw tb" :text="'timer' | L" />
<Button col="1" class="ico" :text="icon.cog" @tap="navigateTo" />
</RGridLayout>
<Timer
@ -25,9 +25,9 @@
</StackLayout>
</ScrollView>
<GridLayout v-if="!activeTimers.length" rows="*, auto">
<StackLayout row="1" class="emptyState">
<RLabel class="title" :text="'ccwt' | L" />
<RLabel :text="'plsAdd' | L" />
<StackLayout row="1" class="empty">
<RLabel class="tb t3 tw" :text="'ccwt' | L" />
<RLabel class="tw" :text="'plsAdd' | L" />
</StackLayout>
</GridLayout>
<RGridLayout
@ -50,6 +50,18 @@
:onload="sbLoad"
/>
<Toast :onload="tbLoad" :toast="toast" :action="hideBar" />
<Label
rowSpan="2"
class="edge hal"
:class="{ 'f r': RTL }"
@swipe="swipeBack($event, navigateBack)"
/>
<Label
rowSpan="2"
class="edge har rtl"
:class="{ r: RTL, f: !RTL }"
@swipe="swipeBack($event, navigateBack)"
/>
</GridLayout>
</Page>
</template>
@ -58,7 +70,6 @@
import { localize } from "@nativescript/localize";
import {
Observable,
CoreTypes,
Application,
Utils,
Device,
@ -128,12 +139,8 @@ export default {
object.bindingContext = new Observable();
if (this.activeTimers.filter((e: any) => e.done).length)
this.openReminder();
this.keepScreenOnCountUp();
setNumber("isTimer", 1);
},
pgUnload() {
utils.keepScreenOn(0);
},
abLoad({ object }) {
this.appbar = object;
},
@ -151,19 +158,8 @@ export default {
scrollUp = y < this.scrollPos;
this.scrollPos = Math.abs(y);
let ab = this.appbar.translateY;
if (!scrollUp && ab == 0) {
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
} else if (scrollUp && ab == 64) {
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
}
if (!scrollUp && ab == 0) this.animateBar(this.appbar, 0);
else if (scrollUp && ab == 64) this.animateBar(this.appbar, 1);
}
},
@ -210,7 +206,6 @@ export default {
}
if (this.FGService)
setTimeout(() => this.activeTimers.length && show(), 250);
this.keepScreenOnCountUp();
utils.wakeLock(ongoingCount);
},
timerAlert() {
@ -390,7 +385,7 @@ export default {
this.animateBar(this.appbar, 0).then(() => {
this.showUndo = 0;
this.toast = localize(data);
this.animateBar(this.toastbar, 1);
this.animateBar(this.toastbar, 1, 1);
let a = 5;
clearInterval(barTimer);
barTimer = setInterval(() => a-- < 1 && this.hideBar(), 1000);
@ -404,7 +399,7 @@ export default {
this.showUndo = 1;
this.snackMsg = message;
this.countdown = 5;
this.animateBar(this.snackbar, 1).then(() => {
this.animateBar(this.snackbar, 1, 1).then(() => {
let a = 5;
clearInterval(barTimer);
barTimer = setInterval(() => {
@ -456,11 +451,6 @@ export default {
},
// HELPERS
keepScreenOnCountUp() {
utils.keepScreenOn(
this.activeTimers.filter((e: any) => !e.isPaused).length
);
},
},
created() {
this.clearTimerInterval();

View file

@ -3,7 +3,11 @@
<GridLayout rows="*, auto" columns="auto, *, auto">
<ScrollView rowSpan="2" colSpan="3" @scroll="!showUndo && svLoad($event)">
<StackLayout padding="0 16 72">
<RLabel class="pageTitle" padding="16 0 24" :text="`${title}` | L" />
<RLabel
class="pTitle tw tb"
padding="16 0 24"
:text="`${title}` | L"
/>
<Image
margin="0 0 32"
v-if="recipe.image"
@ -25,8 +29,8 @@
@tap="imageHandler"
/>
<!-- OVERVIEW -->
<StackLayout class="inputField">
<Label class="fieldLabel" :text="'title' | L" />
<StackLayout class="inputC">
<Label class="fLabel" :text="'title' | L" />
<TextField
:hint="'recTitle' | L"
v-model="recipe.title"
@ -34,8 +38,8 @@
/>
</StackLayout>
<RGridLayout :rtl="RTL" class="" columns="*, 8, *">
<StackLayout class="inputField">
<Label class="fieldLabel" :text="'cui' | L" />
<StackLayout class="inputC">
<Label class="fLabel" :text="'cui' | L" />
<TextField
@loaded="setGravity"
:text="recipe.cuisine | L"
@ -44,8 +48,8 @@
@tap="showCuisine(0)"
/>
</StackLayout>
<StackLayout class="inputField" col="2">
<Label class="fieldLabel" :text="'cat' | L" />
<StackLayout class="inputC" col="2">
<Label class="fLabel" :text="'cat' | L" />
<TextField
@loaded="setGravity"
ref="category"
@ -56,8 +60,8 @@
/>
</StackLayout>
</RGridLayout>
<StackLayout class="inputField">
<Label class="fieldLabel" :text="'ts' | L" />
<StackLayout class="inputC">
<Label class="fLabel" :text="'ts' | L" />
<TextField
@loaded="setGravity"
:hint="'tsInfo' | L"
@ -69,8 +73,8 @@
/>
</StackLayout>
<RGridLayout :rtl="RTL" columns="*, 8, *">
<StackLayout class="inputField">
<Label class="fieldLabel" :text="'prepT' | L" />
<StackLayout class="inputC">
<Label class="fLabel" :text="'prepT' | L" />
<TextField
@loaded="setGravity"
:text="timeRequired('prepTime')"
@ -79,8 +83,8 @@
@tap="setTimeRequired(0, 'prepTime')"
/>
</StackLayout>
<StackLayout class="inputField" col="2">
<Label class="fieldLabel" :text="'cookT' | L" />
<StackLayout class="inputC" col="2">
<Label class="fLabel" :text="'cookT' | L" />
<TextField
@loaded="setGravity"
ref="cookTime"
@ -92,8 +96,8 @@
</StackLayout>
</RGridLayout>
<RGridLayout :rtl="RTL" columns="*, 8, *">
<StackLayout class="inputField">
<Label class="fieldLabel" :text="'yieldQ' | L" />
<StackLayout class="inputC">
<Label class="fLabel" :text="'yieldQ' | L" />
<TextField
@loaded="setGravity"
ref="yieldQuantity"
@ -103,8 +107,8 @@
returnKeyType="next"
/>
</StackLayout>
<StackLayout class="inputField" col="2">
<Label class="fieldLabel" :text="'yieldU' | L" />
<StackLayout class="inputC" col="2">
<Label class="fLabel" :text="'yieldU' | L" />
<TextField
@loaded="setGravity"
:text="`${recipe.yieldUnit}` | L"
@ -115,8 +119,8 @@
</StackLayout>
</RGridLayout>
<GridLayout columns="*, 8, *">
<StackLayout class="inputField" :col="RTL ? 2 : 0">
<Label class="fieldLabel" :text="'Difficulty level' | L" />
<StackLayout class="inputC" :col="RTL ? 2 : 0">
<Label class="fLabel" :text="'Difficulty level' | L" />
<TextField
@loaded="setGravity"
ref="difficultyLevel"
@ -130,7 +134,8 @@
<!-- INGREDIENTS -->
<Label
:text="getTitleCount('ings', 'ingredients')"
class="sectionTitle"
padding="0"
class="section t2 tb tw"
/>
<RGridLayout
:rtl="RTL"
@ -168,13 +173,13 @@
/>
<Button
col="5"
class="ico min"
class="ico si"
:text="icon.x"
@tap="removeIngredient(index)"
/>
</RGridLayout>
<Button
class="text big hal"
class="text tb big hal fb"
:class="{ r: RTL }"
:text="'aIngBtn' | L"
@tap="addIngredient()"
@ -182,7 +187,8 @@
<!-- INSTRUCTIONS -->
<Label
:text="getTitleCount('inss', 'instructions')"
class="sectionTitle"
padding="0"
class="section t2 tb tw"
/>
<RGridLayout
:rtl="RTL"
@ -197,13 +203,13 @@
/>
<Button
col="1"
class="ico min"
class="ico si"
:text="icon.x"
@tap="removeInstruction(index)"
/>
</RGridLayout>
<Button
class="text big hal"
class="text tb big hal fb"
:class="{ r: RTL }"
:text="'aStpBtn' | L"
@tap="addInstruction"
@ -211,7 +217,8 @@
<!-- COMBINATIONS -->
<Label
:text="getTitleCount('cmbs', 'combinations')"
class="sectionTitle"
padding="0"
class="section t2 tb tw"
/>
<RGridLayout
:rtl="RTL"
@ -227,19 +234,23 @@
/>
<Button
col="1"
class="ico min"
class="ico si"
:text="icon.x"
@tap="removeCombination(combination)"
/>
</RGridLayout>
<Button
class="text big hal"
class="text tb big hal fb"
:class="{ r: RTL }"
:text="'addCmbBtn' | L"
@tap="showCombinations"
/>
<!-- NOTES -->
<Label :text="getTitleCount('nos', 'notes')" class="sectionTitle" />
<Label
:text="getTitleCount('nos', 'notes')"
padding="0"
class="section t2 tb tw"
/>
<RGridLayout
:rtl="RTL"
columns="*, auto"
@ -253,13 +264,13 @@
/>
<Button
col="1"
class="ico min"
class="ico si"
:text="icon.x"
@tap="removeNote(index)"
/>
</RGridLayout>
<Button
class="text big hal"
class="text tb big hal fb"
:class="{ r: RTL }"
:text="'aNoBtn' | L"
@tap="addNote"
@ -300,6 +311,19 @@
:action="hideBar"
:onload="sbLoad"
/>
<Label
rowSpan="2"
colSpan="3"
class="edge hal"
:class="{ 'f r': RTL }"
@swipe="swipeBack($event, navigateBack)"
/>
<Label
rowSpan="2"
colSpan="3"
class="edge har rtl f"
@swipe="swipeBack($event, navigateBack)"
/>
</GridLayout>
</Page>
</template>
@ -315,10 +339,8 @@ import {
Screen,
Utils,
Observable,
CoreTypes,
Frame,
Application,
GridLayout,
} from "@nativescript/core";
import { getString, setString } from "@nativescript/core/application-settings";
import { localize } from "@nativescript/localize";
@ -430,19 +452,10 @@ export default {
scrollUp = y < this.scrollPos;
this.scrollPos = Math.abs(y);
let ab = this.appbar.translateY;
if (!scrollUp && ab == 0) {
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
} else if (scrollUp && ab == 64) {
if (!scrollUp && ab == 0) this.animateBar(this.appbar, 0);
else if (scrollUp && ab == 64) {
Utils.ad.dismissSoftInput();
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 1);
}
}
},
@ -844,7 +857,7 @@ export default {
this.showUndo = 1;
this.snackMsg = message;
this.countdown = 5;
this.animateBar(this.snackbar, 1).then(() => {
this.animateBar(this.snackbar, 1, 1).then(() => {
let a = 5;
barTimer = setInterval(() => {
if (this.undo) {

View file

@ -1,6 +1,6 @@
<template>
<Page @loaded="pgLoad" @unloaded="onPageUnload" actionBarHidden="true">
<GridLayout rows="*, auto, 64, 8" columns="*">
<Page @loaded="pgLoad" @unloaded="pgUnload" actionBarHidden="true">
<GridLayout rows="*, 104, auto" columns="*">
<CollectionView
rowSpan="4"
:spanSize="getSpanSize"
@ -12,7 +12,7 @@
>
<v-template name="header">
<RGridLayout :rtl="RTL" rows="auto" columns="*, auto, 12">
<RLabel class="pageTitle" :text="`${currentComp}` | L" />
<RLabel class="pTitle tw tb" :text="`${currentComp}` | L" />
<Button
col="1"
class="ico"
@ -24,39 +24,39 @@
<v-template name="lists">
<RStackLayout :rtl="RTL" orientation="horizontal" padding="0 16 24">
<GridLayout
rows="48"
columns="auto, auto"
rows="32"
columns="32, auto"
class="segment rtl"
v-for="(item, index) in topmenu"
:key="index"
:class="{
select: currentComp === item.title,
select: currentComp == item.title,
}"
@touch="touchSelector($event, item.title, item.title)"
>
<Label class="ico" :text="icon[item.icon]" />
<Label class="ico tc vc" :text="icon[item.icon]" />
<Label
col="1"
class="value"
:class="{ r: RTL }"
class="v vc"
:class="{ f: RTL }"
:hidden="!getRecipeCount(item.title)"
:text="getRecipeCount(item.title)"
/>
</GridLayout>
<GridLayout
:hidden="currentComp !== 'Filtered recipes'"
rows="48"
columns="auto, auto"
rows="32"
columns="32, auto"
class="segment rtl"
:class="{
select: currentComp === 'Filtered recipes',
}"
>
<Label class="ico" :text="icon.filter" />
<Label class="ico tc vc" :text="icon.filter" />
<Label
col="1"
class="value"
:class="{ r: RTL }"
class="v vc"
:class="{ f: RTL }"
:text="getRecipeCount('filtered')"
/>
</GridLayout>
@ -65,7 +65,7 @@
<v-template name="detailed">
<RGridLayout
:rtl="RTL"
class="recipeItem"
class="recipe"
:class="getItemPos(recipe.id)"
rows="auto"
columns="96, *"
@ -97,31 +97,27 @@
decodeHeight="96"
loadMode="async"
/>
<StackLayout class="recipeInfo" col="1">
<StackLayout class="info vc" col="1">
<RLabel :text="recipe.title" class="tb title tw" />
<RStackLayout :rtl="RTL" class="attrs"
><Label class="ico sm rtl" :text="icon.cuisine" />
<RStackLayout :rtl="RTL" class="oh"
><Label class="ico s rtl vc" :text="icon.cuisine" />
<Label class="attr" :text="recipe.cuisine | L" />
<Label class="ico sm" :text="icon.category" />
<Label class="ico s vc" :text="icon.category" />
<Label class="attr" :text="recipe.category | L" />
</RStackLayout>
<RStackLayout
:rtl="RTL"
:hidden="!recipe.tags.length"
class="attrs"
>
<Label class="ico sm rtl" :text="icon.tag" />
<RStackLayout :rtl="RTL" :hidden="!recipe.tags.length" class="oh">
<Label class="ico s rtl vc" :text="icon.tag" />
<Label class="attr" :text="getTags(recipe.tags)" />
</RStackLayout>
<RStackLayout :rtl="RTL" class="attrs">
<Label class="ico sm" :text="icon.star" />
<RStackLayout :rtl="RTL" class="oh">
<Label class="ico s vc" :text="icon.star" />
<Label class="attr" :text="getLocaleN(recipe.rating)" />
<Label class="ico sm" :text="icon.time" />
<Label class="ico s vc" :text="icon.time" />
<Label
class="attr"
:text="`${totalTime(recipe.prepTime, recipe.cookTime).time}`"
/>
<Label class="ico sm" :text="icon.diff" />
<Label class="ico s vc" :text="icon.diff" />
<Label class="attr" :text="recipe.difficulty | L" />
</RStackLayout>
</StackLayout>
@ -129,7 +125,7 @@
</v-template>
<v-template name="grid">
<GridLayout
class="recipeItem grid"
class="recipe grid"
:class="getItemPos(recipe.id)"
rows="auto, auto"
columns="*"
@ -159,28 +155,24 @@
:fontSize="imgWidth / 2"
:text="icon.img"
/>
<StackLayout class="recipeInfo" row="1">
<StackLayout class="info" row="1">
<RLabel :text="recipe.title" class="tb title tw" />
<FlexboxLayout
flexWrap="wrap"
:justifyContent="RTL ? 'flex-end' : 'flex-start'"
>
<RStackLayout :rtl="RTL" class="attrs">
<Label class="ico sm rtl" :text="icon.cuisine" />
<RStackLayout :rtl="RTL" class="oh">
<Label class="ico s rtl vc" :text="icon.cuisine" />
<Label class="attr" :text="recipe.cuisine | L" />
</RStackLayout>
<RStackLayout :rtl="RTL" class="attrs">
<Label class="ico sm" :text="icon.category" />
<RStackLayout :rtl="RTL" class="oh">
<Label class="ico s vc" :text="icon.category" />
<Label class="attr" :text="recipe.category | L" />
</RStackLayout>
</FlexboxLayout>
<RStackLayout
:rtl="RTL"
:hidden="!recipe.tags.length"
class="attrs"
>
<Label class="ico sm rtl" :text="icon.tag" />
<RStackLayout :rtl="RTL" :hidden="!recipe.tags.length" class="oh">
<Label class="ico s rtl vc" :text="icon.tag" />
<Label class="attr" :text="getTags(recipe.tags)" />
</RStackLayout>
</StackLayout>
@ -189,7 +181,7 @@
<v-template name="photogrid">
<RGridLayout
:rtl="RTL"
class="recipeItem grid photogrid"
class="recipe grid photogrid"
:class="getItemPos(recipe.id)"
rows="auto, auto"
columns="*"
@ -219,7 +211,7 @@
:fontSize="imgWidth / 2"
:text="icon.img"
/>
<StackLayout class="recipeInfo" row="1">
<StackLayout class="info" row="1">
<RLabel :text="recipe.title" class="tb title tw" />
</StackLayout>
</RGridLayout>
@ -227,7 +219,7 @@
<v-template name="simple">
<RGridLayout
:rtl="RTL"
class="recipeItem simple"
class="recipe simple"
:class="getItemPos(recipe.id)"
columns="*"
@longPress="
@ -238,20 +230,16 @@
selectMode ? addToSelection(recipe.id) : viewRecipe(recipe.id)
"
>
<StackLayout class="recipeInfo">
<StackLayout class="info">
<RLabel :text="recipe.title" class="tb title tw" />
<RStackLayout :rtl="RTL" class="attrs">
<Label class="ico sm rtl" :text="icon.cuisine" />
<RStackLayout :rtl="RTL" class="oh">
<Label class="ico s rtl vc" :text="icon.cuisine" />
<Label class="attr" :text="recipe.cuisine | L" />
<Label class="ico sm" :text="icon.category" />
<Label class="ico s vc" :text="icon.category" />
<Label class="attr" :text="recipe.category | L" />
</RStackLayout>
<RStackLayout
:rtl="RTL"
:hidden="!recipe.tags.length"
class="attrs"
>
<Label class="ico sm rtl" :text="icon.tag" />
<RStackLayout :rtl="RTL" :hidden="!recipe.tags.length" class="oh">
<Label class="ico s rtl vc" :text="icon.tag" />
<Label class="attr" :text="getTags(recipe.tags)" />
</RStackLayout>
</StackLayout>
@ -259,7 +247,7 @@
</v-template>
<v-template name="minimal">
<GridLayout
class="recipeItem simple minimal"
class="recipe simple minimal"
:class="getItemPos(recipe.id)"
columns="*"
@longPress="
@ -270,7 +258,7 @@
selectMode ? addToSelection(recipe.id) : viewRecipe(recipe.id)
"
>
<StackLayout class="recipeInfo">
<StackLayout class="info">
<RLabel :text="recipe.title" class="tb title tw" />
</StackLayout>
</GridLayout>
@ -278,66 +266,55 @@
</CollectionView>
<GridLayout
rowSpan="2"
class="emptyState"
v-if="emptyState"
class="empty"
:hidden="!empty"
rows="*, auto, auto"
columns="*"
>
<RLabel row="1" class="title" :text="emptyState.title | L" />
<RLabel row="1" class="tb t3 tw" :text="empty.title | L" />
<Button
row="2"
v-if="
emptyState.action &&
(filterFavourites || filterTrylater || selCuisine)
empty.action && (filterFavourites || filterTrylater || selCuisine)
"
class="text big"
class="text tb big fb"
@loaded="setGravity"
:text="emptyState.sub | L"
@tap="emptyState.action"
:text="empty.sub | L"
@tap="empty.action"
/>
<RLabel
class="tw"
row="2"
v-else-if="!emptyState.action"
:text="emptyState.sub | L"
v-else-if="!empty.action"
:text="empty.sub | L"
/>
</GridLayout>
<StackLayout row="1" rowSpan="2" margin="12 8">
<GridLayout
@loaded="tbLoad"
rows="auto, auto"
columns="auto"
class="appbar toolbar hal"
:class="{ r: RTL }"
:hidden="!showTools"
>
<RGridLayout
:rtl="RTL"
rows="48"
class="tool"
columns="auto, *"
@touch="touchTool($event, CookingTimer, 'timer')"
>
<Label class="ico" :text="icon.timer" />
<Label col="1" class="value" :text="'timer' | L" />
</RGridLayout>
<RGridLayout
:rtl="RTL"
row="1"
rows="48"
class="tool"
columns="auto, *"
@touch="touchTool($event, MealPlanner, 'planner')"
@loaded="tbLoad"
:rows="tbRows"
columns="auto"
class="appbar toolbar sidebar hal"
:class="{ r: RTL }"
:visibility="showTools ? 'visible' : 'hidden'"
>
<Label class="ico" :text="icon.cal" />
<Label col="1" class="value" :text="'planner' | L" />
</RGridLayout>
<RStackLayout
v-for="(item, i) in tbItems"
:key="i"
:row="i"
:rtl="RTL"
class="tool"
@touch="touchTool($event, item.comp, item.title)"
>
<Label class="ico vc" :text="icon[item.icon]" />
<Label col="1" class="v vc" :text="item.title | L" />
</RStackLayout>
</GridLayout>
</StackLayout>
<RGridLayout
row="2"
@loaded="abLoad"
:rtl="RTL"
class="appbar home"
class="appbar"
columns="auto, *, auto, auto, auto, auto"
@swipe="stSwipe"
@touch="() => null"
@ -363,7 +340,7 @@
"
/>
<TextField
id="searchBar"
id="search"
:class="{ f: RTL }"
@loaded="focusField"
autocapitalizationType="words"
@ -376,7 +353,7 @@
/>
<Label
:hidden="!selectMode"
class="title"
class="tb tw vc lh4"
:text="`${selection.length} ${$options.filters.L('sltd')}`"
col="1"
/>
@ -451,7 +428,7 @@ let lastShake = 0;
let lastForce = 0;
let shakeCount = 0;
let typingTimer;
let filterTimer;
export default {
data() {
return {
@ -554,6 +531,23 @@ export default {
getRecipes() {
return [{}, {}].concat(this.filteredRecipes);
},
tbItems() {
return [
{
title: "timer",
icon: "timer",
comp: CookingTimer,
},
{
title: "planner",
icon: "cal",
comp: MealPlanner,
},
];
},
tbRows() {
return "48, ".repeat(this.tbItems.length) + 48;
},
noResultFor() {
if (this.filterFavourites || this.filterTrylater || this.selCuisine)
return "noRecsInL";
@ -562,17 +556,18 @@ export default {
imgWidth() {
return Screen.mainScreen.widthDIPs / 2 - 24;
},
emptyState() {
empty() {
let rl = this.recipes.length;
let fr = this.filteredRecipes.length;
let ff = this.filterFavourites;
let ftl = this.filterTrylater;
let sq = this.searchQuery;
let r: {
interface EmptyState {
title: string;
sub: string;
action?: Function;
};
}
let r = <EmptyState>{};
if (!rl && !ff && !ftl) {
r.title = "strAdd";
r.sub = "plsAdd";
@ -626,9 +621,8 @@ export default {
setTimeout(() => {
if (this.listview) this.listview.refresh();
}, 1000);
this.showTools && this.toggleTools();
},
onPageUnload() {
pgUnload() {
if (this.shake) stopAccelerometerUpdates();
},
abLoad({ object }) {
@ -656,19 +650,11 @@ export default {
}
},
showBars() {
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 1);
},
hideBars() {
this.showTools && this.toggleTools();
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 0);
},
getSpanSize(index) {
return (this.layout == "grid" || this.layout == "photogrid") &&
@ -736,22 +722,25 @@ export default {
// Tools
toggleTools() {
if (this.showTools) {
this.toolbar.translateY = 0;
this.toolbar
.animate({
translate: { x: 0, y: 112 },
height: 0,
translate: { x: 0, y: 48 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeIn,
})
.then(() => (this.showTools = 0));
} else {
this.toolbar.height = 1;
this.showTools = 1;
this.toolbar.translateY = 112;
setTimeout(() => {
this.toolbar.animate({
translate: { x: 0, y: 0 },
height: 104,
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
translate: { x: 0, y: 0 },
curve: CoreTypes.AnimationCurve.easeOut,
});
}, 1);
}
},
@ -1126,24 +1115,16 @@ export default {
});
},
touchSelector({ object, action }, comp, title) {
let selected = this.currentComp == comp;
object.className = action.match(/down|move/)
? `segment r ${selected ? "select" : "fade"}`
: `segment r ${selected && "select"}`;
if (this.currentComp != title) {
this.touchFade(object, action);
if (action == "up") this.navigateTo(comp, title);
},
touchRecipe({ object, action }) {
let classes = object.className;
if (!this.selectMode) {
object.className = action.match(/down|move/)
? !classes.includes("fade")
? classes + " fade"
: classes
: classes.replace(/ fade/g, "");
}
},
touchRecipe({ object, action }) {
if (!this.selectMode) this.touchFade(object, action);
},
touchTool({ object, action }, comp, value) {
object.className = action.match(/down|move/) ? `tool fade` : `tool`;
this.touchFade(object, action);
if (action == "up") this.navigateTo(comp, value, 1);
},
},

View file

@ -6,34 +6,35 @@
rowSpan="3"
scrollBarIndicatorVisible="false"
>
<StackLayout>
<StackLayout rows="auto, auto, auto, *">
<RGridLayout :rtl="RTL" columns="*, auto, 12">
<Label class="pageTitle a" :text="'planner' | L" />
<Label class="pTitle tw tb a" :text="'planner' | L" />
<Button col="1" class="ico" :text="icon.cog" @tap="navigateTo" />
</RGridLayout>
<GridLayout class="monthSwitcher" columns="auto, *, auto">
<Button class="ico min" :text="icon.left" @tap="navigate(0)" />
<Label
class="month"
<GridLayout row="1" padding="0 16" columns="auto, *, auto">
<Button class="ico si" :text="icon.left" @tap="navigate(0)" />
<Button
class="t3"
@touch="mYPicker"
col="1"
:text="formattedDate(0)"
/>
<Button
class="ico min"
class="ico si"
col="2"
:text="icon.right"
@tap="navigate(1)"
/>
</GridLayout>
<RGridLayout
row="2"
:rtl="RTL"
class="calendar"
columns="*, *, *, *, *, *, *"
:rows="calRows"
>
<Label
class="dayName sub rtl"
class="sub rtl t5 vc tc"
:class="{ f: RTL }"
:col="i"
v-for="(d, i) in getDayNames"
@ -50,85 +51,97 @@
@tap="setDate(cal)"
/>
</RGridLayout>
<StackLayout class="plans">
<RLabel
v-if="plannerView != 'd' && mealPlans.length"
class="date tb"
:text="formattedDate(1)"
textWrap="true"
/>
<StackLayout v-for="(meal, i) in mealTypes" :key="'meal' + i">
<Label
:hidden="!getRecipes[meal]"
class="meal tb"
:class="[meal]"
:text="meal | L"
/>
<RGridLayout
:rtl="RTL"
v-for="(plan, i) in getRecipes[meal]"
:key="meal + i"
class="plan"
columns="*, auto"
<StackLayout row="3" class="plans">
<CollectionView
@loaded="cvLoad"
for="item in mpItems"
:height="listHeight"
>
<v-template if="item.type == 0">
<RLabel class="date tb t2" :text="item.date" textWrap="true" />
</v-template>
<v-template if="item.type == 1">
<Label
class="type t3"
:class="{ tb: plannerView == 'd' }"
:text="item.mealType | L"
/>
</v-template>
<v-template if="item.type == 2">
<RGridLayout
:rtl="RTL"
class="rtl"
:hidden="!plan.recipeID"
:columns="noImg ? '*' : '48, *'"
@touch="touchRecipe"
@tap="viewRecipe(plan.id)"
class="plan vc"
columns="auto, *, auto"
@touch="!edit && touchRecipe"
@tap="!edit && viewRecipe(item.id)"
>
<Image
class="imgHolder"
verticalAlignment="middle"
v-if="!noImg && getRecipeImage(plan.recipeID)"
:src="getRecipeImage(plan.recipeID)"
v-if="!noImg && item.image"
:src="item.image"
stretch="none"
decodeWidth="48"
decodeHeight="48"
loadMode="async"
/>
<Label
v-else-if="!noImg && !getRecipeImage(plan.recipeID)"
v-else-if="!noImg && !item.image"
verticalAlignment="middle"
class="ico imgHolder"
@loaded="centerLabel($event, 17)"
width="48"
height="48"
fontSize="24"
fontSize="23"
:text="icon.img"
/>
<StackLayout class="planContent" col="1">
<GridLayout rows="auto, auto" class="info vc" col="1">
<RLabel :text="item.title" />
<RLabel
class="title"
:text="getRecipeTitle(plan.recipeID)"
row="1"
:hidden="!item.size"
class="t6"
:text="item.size"
/>
</GridLayout>
<Button
:hidden="!edit"
col="2"
class="ico si"
:text="icon.x"
@tap="removeRecipe(item.id)"
/>
<RLabel class="attr" :text="getYield(plan.id)" />
</StackLayout>
</RGridLayout>
</v-template>
<v-template if="item.type == 3">
<RGridLayout :rtl="RTL" class="plan vc" columns="*, auto">
<Label
class="planContent tw"
class="info lh4 tw"
:class="{ note: !noImg }"
@loaded="centerLabel($event, 16)"
:hidden="!plan.note"
:text="plan.note"
:hidden="!item.note"
:text="item.note"
/>
<Button
:hidden="!edit"
col="1"
class="ico min"
col="2"
class="ico si"
:text="icon.x"
@tap="removeRecipe(plan.id)"
@tap="removeRecipe(item.id)"
/>
</RGridLayout>
</StackLayout>
</v-template>
<v-template>
<StackLayout class="listSpace"> </StackLayout>
</v-template>
</CollectionView>
</StackLayout>
</StackLayout>
</ScrollView>
<GridLayout rowSpan="2" rows="*, auto" v-if="!mealPlans.length">
<StackLayout row="1" class="emptyState">
<RLabel class="title" :text="'ehwmp' | L" />
<RLabel :text="'plsCrt' | L" />
<StackLayout row="1" class="empty">
<RLabel class="tb t3 tw" :text="'ehwmp' | L" />
<RLabel class="tw" :text="'plsCrt' | L" />
</StackLayout>
</GridLayout>
<RGridLayout
@ -172,12 +185,24 @@
:action="hideBar"
:onload="sbLoad"
/>
<Label
rowSpan="3"
class="edge hal"
:class="{ 'f r': RTL }"
@swipe="swipeBack($event, navigateBack)"
/>
<Label
rowSpan="3"
class="edge har rtl"
:class="{ r: RTL, f: !RTL }"
@swipe="swipeBack($event, navigateBack)"
/>
</GridLayout>
</Page>
</template>
<script lang="ts">
import { Frame, Observable, CoreTypes, Screen } from "@nativescript/core";
import { Frame, Observable, Screen } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import ViewRecipe from "./ViewRecipe.vue";
import EditRecipe from "./EditRecipe.vue";
@ -200,29 +225,16 @@ export default {
data() {
return {
mealTypes: ["breakfast", "lunch", "dinner", "snacks"],
year: 2021,
monthNames: [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
],
year: 0,
month: 0,
date: null,
date: 0,
edit: 0,
scrollPos: 1,
appbar: null,
snackbar: null,
appbar: 0,
snackbar: 0,
listView: 0,
countdown: 5,
snackMsg: null,
snackMsg: 0,
showUndo: 0,
undo: 0,
temp: 0,
@ -241,6 +253,9 @@ export default {
todaysTime() {
return new Date(this.year, this.month, this.date, 0).getTime();
},
listHeight() {
return Math.floor(Screen.mainScreen.heightDIPs);
},
getRecipes() {
if (this.mealPlans.length) {
return this.mealPlans.reduce((acc, e) => {
@ -253,6 +268,7 @@ export default {
},
calRows() {
let h = (Screen.mainScreen.widthDIPs - 32) / 8;
if (h < 48) h = 48;
let pv = this.plannerView;
return pv != "d" ? `${h}, `.repeat(pv == "wk" ? 1 : 6) + h : 0;
},
@ -296,7 +312,7 @@ export default {
date.setDate(date.getDate() - date.getDay() + this.mondayFirst),
date.setDate(date.getDate() + (pv == "mnth" ? 41 : 6))
)
: 0;
: [];
},
isExactlyToday() {
let d = new Date();
@ -307,9 +323,7 @@ export default {
);
},
hasRecipes() {
return this.mealTypes.filter(
(e) => this.getRecipes[e] && this.getRecipes[e].length
).length;
return this.mpItems.length > 1;
},
noImg() {
return /simple|minimal/.test(this.layout);
@ -317,12 +331,65 @@ export default {
noAttr() {
return /minimal/.test(this.layout);
},
mpItems() {
let pv = this.plannerView;
let days =
pv == "wk"
? this.getCal.slice(0, 7)
: [
{
d: this.date,
m: this.month,
y: this.year,
},
];
let meals = {};
for (let i = 0; i < (pv == "wk" ? 7 : 1); i++)
meals[i] = this.getRecipesOn(days[i]);
let plans = [];
for (const k1 in meals) {
if (Object.keys(meals[k1]).length && pv != "d")
plans.push({
type: 0,
date: this.formattedDate(1, days[k1]),
d: days[k1].d,
});
if (Object.keys(meals[k1]).length) {
this.mealTypes.forEach((e) => {
if (meals[k1][e]) {
plans.push({
type: 1,
mealType: e,
});
meals[k1][e].forEach(({ id, recipeID, note }) => {
if (recipeID) {
plans.push({
type: 2,
id,
image: this.getRecipeImage(recipeID),
title: this.getRecipeTitle(recipeID),
size: this.getYield(id),
});
} else {
plans.push({
type: 3,
id,
note,
});
}
});
}
});
}
}
plans.push({});
return plans;
},
},
methods: {
...mapActions(["addMealPlanAction", "deleteMealPlanAction"]),
pgLoad({ object }) {
object.bindingContext = new Observable();
if (!this.date || this.date === new Date().getDate()) this.goToToday();
this.showBar();
},
abLoad({ object }) {
@ -331,6 +398,9 @@ export default {
sbLoad({ object }) {
this.snackbar = object;
},
cvLoad({ object }) {
this.listView = object;
},
svScroll(args) {
let scrollUp;
let y = args.scrollY;
@ -338,19 +408,8 @@ export default {
scrollUp = y < this.scrollPos;
this.scrollPos = Math.abs(y);
let ab = this.appbar.translateY;
if (!scrollUp && ab == 0) {
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
} else if (scrollUp && ab == 64) {
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
}
if (!scrollUp && ab == 0) this.animateBar(this.appbar, 0);
else if (scrollUp && ab == 64) this.animateBar(this.appbar, 1);
}
},
@ -359,12 +418,7 @@ export default {
object.android.setGravity(n);
},
showBar() {
// this.appbar.translateY = 0;
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 1);
},
getrow(i) {
return Math.floor(1 + i / 7);
@ -382,14 +436,10 @@ export default {
let r = this.recipes.filter((e) => e.id === id)[0];
return r ? r.title : `[ ${this.$options.filters.L("resNF")} ]`;
},
getRecipeTotalTime(id) {
let r = this.recipes.filter((e) => e.id === id)[0];
return r ? this.totalTime(r.prepTime, r.cookTime).time : "00:00";
},
getYield(id) {
let mp = this.mealPlans.filter((e) => e.id == id)[0];
let r = this.recipes.filter((e) => e.id === mp.recipeID)[0];
return r ? `${this.getLocaleN(mp.quantity)} ${localize(r.yieldUnit)}` : 1;
return r ? `${this.getLocaleN(mp.quantity)} ${localize(r.yieldUnit)}` : 0;
},
// NavigationHandlers
@ -447,7 +497,7 @@ export default {
this.date = d.getDate();
},
dayClasses({ d, m }) {
let classes = "min ";
let classes = "sst ";
let dt1 = new Date();
let dt2 = new Date(this.year, m, d, 0).getTime();
if (
@ -457,7 +507,7 @@ export default {
d == dt1.getDate()
)
classes += "tb ";
classes += this.date == d && this.month == m ? "hl " : "fb ";
classes += this.date == d && this.month == m ? "select " : "fb ";
if (!!this.mealPlans.filter((e) => e.date == dt2).length)
classes += "accent ";
if (this.month != m) classes += "sub";
@ -471,12 +521,18 @@ export default {
},
toggleEditMode() {
this.edit = !this.edit;
this.listView.refresh();
},
openMonthYearPicker() {
let monthNames = [...Array(12).keys()].map((m) =>
new Intl.DateTimeFormat("en-IN", {
month: "short",
}).format(new Date(2021, m, 1, 0))
);
this.$showModal(DMYPicker, {
props: {
title: "gtD",
monthNames: this.monthNames,
monthNames,
currentD: this.date,
currentM: this.month,
currentY: this.year,
@ -621,7 +677,7 @@ export default {
this.showUndo = 1;
this.snackMsg = message;
this.countdown = 5;
this.animateBar(this.snackbar, 1).then(() => {
this.animateBar(this.snackbar, 1, 1).then(() => {
let a = 5;
clearInterval(barTimer);
barTimer = setInterval(() => {
@ -651,9 +707,23 @@ export default {
this.undo = 1;
},
// ListHandlers
getRecipesOn(d) {
let date = new Date(d.y, d.m, d.d, 0, 0, 0);
if (this.mealPlans.length) {
return this.mealPlans.reduce((acc, e) => {
if (e.date == date.getTime()) {
acc[e.mealType] = [...(acc[e.mealType] || []), e];
}
return acc;
}, {});
} else return {};
},
// Helpers
formattedDate(v) {
let d = new Date(this.year, this.month, this.date, 0, 0, 0);
formattedDate(v, fd) {
if (fd) fd = new Date(fd.y, fd.m, fd.d, 0, 0, 0);
let dt = new Date(this.year, this.month, this.date, 0, 0, 0);
let today = new Date();
let myToday = new Date(
today.getFullYear(),
@ -685,9 +755,9 @@ export default {
options.day = "numeric";
options.month = "short";
}
let date = new Intl.DateTimeFormat(null, options).format(d);
let date = new Intl.DateTimeFormat(null, options).format(fd || dt);
let val;
switch (d.getTime()) {
switch ((fd || dt).getTime()) {
case ystr:
val = "ystr";
break;
@ -699,18 +769,22 @@ export default {
break;
}
return v
? [ystr, tdy, tmrw].some((e) => e == d.getTime())
? [ystr, tdy, tmrw].some((e) => e == (fd || dt).getTime())
? localize(val)
: date
: date;
},
mYPicker({ object, action }) {
object.className = action.match(/down|move/) ? "month fade" : "month";
this.touchFade(object, action);
if (action == "up") this.openMonthYearPicker();
},
touchRecipe({ object, action }) {
object.className = action.match(/down|move/) ? "fade" : "";
this.touchFade(object, action);
},
},
created() {
// if (!this.date || this.date === new Date().getDate()) this.goToToday();
this.goToToday();
},
};
</script>

View file

@ -10,7 +10,11 @@
paddingBottom="24"
>
<StackLayout>
<RLabel class="pageTitle" paddingBottom="8" :text="recipe.title" />
<RLabel
class="pTitle tw tb"
paddingBottom="8"
:text="recipe.title"
/>
<StackLayout
:class="{ f: RTL }"
margin="0 12"
@ -22,10 +26,7 @@
v-for="n in 5"
:key="n"
:text="recipe.rating < n ? icon.star : icon.starred"
@tap="
recipe.rating == 1 && n == 1 ? setRating(0) : setRating(n)
"
@longPress="setRating(n)"
@touch="touchRate($event, n)"
/>
</StackLayout>
</StackLayout>
@ -108,8 +109,7 @@
</RGridLayout>
<StackLayout @loaded="onIngsLoad">
<RLabel
padding="0 16"
class="sectionTitle"
class="section t2 tb tw"
:hidden="!recipe.ingredients.length"
:text="getTitleCount('ings', 'ingredients')"
/>
@ -118,18 +118,17 @@
orientation="horizontal"
v-for="(item, index) in recipe.ingredients"
:key="index + 'ing'"
class="ingredient"
class="check"
@touch="touchIngredient($event, index)"
>
<Button class="ico min" :text="icon.uncheck" />
<RLabel class="value tw" :text="getIngredientItem(item)" />
<Button class="ico si" :text="icon.uncheck" />
<RLabel class="v tw" :text="getIngredientItem(item)" />
</RStackLayout>
</StackLayout>
<StackLayout @loaded="onInsLoad">
<RLabel
padding="0 16"
:hidden="!recipe.instructions.length"
class="sectionTitle"
class="section t2 tb tw"
:text="getTitleCount('inss', 'instructions')"
/>
<RStackLayout
@ -138,40 +137,43 @@
@touch="touchInstruction"
v-for="(instruction, index) in recipe.instructions"
:key="index + 'ins'"
class="instruction"
class="check"
>
<Button class="count ico min" :text="getLocaleN(index + 1)" />
<RLabel class="value tw" :text="instruction" />
<Button class="tb t3 ico si" :text="getLocaleN(index + 1)" />
<RLabel class="v tw" :text="instruction" />
</RStackLayout>
</StackLayout>
<RLabel
@loaded="onCmbLoad"
padding="0 16"
:hidden="!recipe.combinations.length"
class="sectionTitle"
class="section t2 tb tw"
:text="getTitleCount('cmbs', 'combinations')"
/>
<Button
v-for="(combination, index) in recipe.combinations"
:key="index + 'comb'"
class="combination"
class="comb tw hal lh4 fb"
:class="{ r: RTL }"
:text="getCombinationTitle(combination)"
@tap="viewCombination(combination)"
/>
<RLabel
@loaded="onNosTLoad"
padding="0 16"
:hidden="!recipe.notes.length"
class="sectionTitle"
class="section t2 tb tw"
:text="getTitleCount('nos', 'notes')"
/>
<StackLayout @loaded="onNosLoad" padding="0 16"> </StackLayout>
<Label class="dateInfo sub tw" :text="getDates().uc" />
<StackLayout @loaded="onNosLoad"> </StackLayout>
<Label
padding="32 16 16"
class="lh4 t5 sub tw"
:text="getDates().uc"
/>
</StackLayout>
</ScrollView>
<RLabel
@loaded="onStickyLoad"
class="sectionTitle sticky"
class="t2 tb tw sticky"
:hidden="!stickyTitle"
:text="stickyTitle"
/>
@ -262,10 +264,23 @@
stretch="aspectFit"
@loaded="onImgViewLoad"
:src="recipe.image"
class="photoviewer"
class="imgViewer"
/>
</AbsoluteLayout>
<WebView @loaded="wvLoad" hidden />
<Label
rowSpan="3"
colSpan="3"
class="edge hal"
:class="{ 'f r': RTL }"
@swipe="swipeBack"
/>
<Label
rowSpan="3"
colSpan="3"
class="edge har rtl f"
@swipe="swipeBack"
/>
</GridLayout>
</Page>
</template>
@ -328,7 +343,7 @@ export default {
};
},
computed: {
...mapState(["icon", "recipes", "RTL"]),
...mapState(["icon", "recipes", "RTL", "awakeViewer"]),
tempYieldQuantity() {
return Math.abs(this.yieldMultiplier) > 0
? Math.abs(parseFloat(this.yieldMultiplier))
@ -363,7 +378,7 @@ export default {
object.bindingContext = new Observable();
if (this.yieldMultiplier == this.recipe.yieldQuantity)
this.yieldMultiplier = this.recipe.yieldQuantity;
utils.keepScreenOn(1);
if (this.awakeViewer) utils.keepScreenOn(1);
this.syncCombinations();
this.view = object.page.getViewById("printview");
},
@ -465,27 +480,15 @@ export default {
}
},
showBars() {
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.sidebar.animate({
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 1);
this.animateBar(this.sidebar, 1);
},
hideBars() {
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
this.animateBar(this.appbar, 0);
this.sidebar.animate({
translate: { x: this.RTL ? -64 : 64, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeIn,
});
},
@ -554,7 +557,7 @@ export default {
"triedInfo",
this.niceDate(this.recipe.lastTried)
);
this.animateBar(this.toastbar, 1);
this.animateBar(this.toastbar, 1, 1);
let a = 10;
clearInterval(barTimer);
barTimer = setInterval(() => a-- < 1 && this.hideBar(), 1000);
@ -657,9 +660,7 @@ export default {
// });
},
touchIngredient({ object, action }, index) {
object.className = action.match(/down|move/)
? "ingredient fade"
: "ingredient";
this.touchFade(object, action);
if (action == "up") this.checkChange(object, index);
},
checkChange(obj, index) {
@ -681,25 +682,23 @@ export default {
},
touchInstruction({ object, action }) {
let hasDone = object.className.includes("done");
object.className = action.match(/down|move/)
? `instruction ${hasDone ? "done" : "fade"}`
: `instruction ${hasDone ? "done" : ""}`;
if (!hasDone) this.touchFade(object, action);
if (action == "up") this.stepDone(object);
},
stepDone(object) {
let a = object;
if (a.className.includes("done")) {
a.className = "instruction";
a.className = "check";
this.stepsDid--;
} else {
a.className = "instruction done";
a.className = "check done";
this.stepsDid++;
}
},
clearSteps() {
this.stepsDid = 0;
for (let i = 1; i < this.inscon.getChildrenCount(); i++) {
this.inscon.getChildAt(i).className = "instruction";
this.inscon.getChildAt(i).className = "check";
}
},
getDates() {
@ -838,11 +837,16 @@ export default {
});
if (setDate) this.$navigateBack();
},
setRating(rating) {
if (rating !== this.recipe.rating || rating === 1) {
touchRate({ object, action }, r) {
this.touchFade(object, action);
if (action == "up") this.setRating(r);
},
setRating(r) {
if (r !== this.recipe.rating || r === 1) {
if (this.recipe.rating == 1 && r == 1) r = 0;
this.setRatingAction({
id: this.currentRecipeID,
rating,
rating: r,
});
}
},
@ -861,7 +865,7 @@ export default {
createNote(note) {
let regex = /(https?:\/\/[^\s]+)/g;
const lbl = new RLabel();
lbl.className = "note";
lbl.className = "note tw";
lbl.textWrap = true;
let fString = new FormattedString();
let arr = note.split(regex);
@ -928,7 +932,7 @@ export default {
height: sw,
translate: { x: this.RTL ? -16 : 112 - sw, y: (sh - sw) / 3 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeOut,
})
)
.then(() =>
@ -936,7 +940,7 @@ export default {
height: sh,
translate: { x: this.RTL ? -16 : 112 - sw, y: -((sh - sw) / 6) },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeOut,
})
);
},
@ -949,7 +953,7 @@ export default {
height: sw,
translate: { x: this.RTL ? -16 : 112 - sw, y: (sh - sw) / 3 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeIn,
})
.then(() =>
pv.animate({
@ -957,7 +961,7 @@ export default {
height: 96,
translate: { x: 0, y: 0 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: CoreTypes.AnimationCurve.easeIn,
})
)
.then(() =>
@ -1112,9 +1116,8 @@ export default {
// Helpers
touchYield({ object, action }) {
object.className = action.match(/down|move/)
? "value accent fade"
: "value accent";
this.touchFade(object, action);
if (action == "up") this.changeYield();
},
},

View file

@ -1,9 +1,5 @@
<template>
<Page
@loaded="transparentPage"
backgroundColor="transparent"
:class="theme"
>
<Page @loaded="mLoad" backgroundColor="transparent" :class="theme">
<GridLayout
columns="*"
:rows="`auto, auto, ${stretch ? '*' : 'auto'}, auto`"
@ -30,13 +26,13 @@
<RGridLayout :rtl="RTL" row="3" columns="auto, *, auto" class="actions">
<Button
:hidden="!action"
class="text sm"
class="text tb st fb"
:text="action | L"
@tap="$modal.close(action)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
@ -158,12 +154,7 @@ export default {
}
},
touch({ object, action }): void {
let classes = object.className;
object.className = action.match(/down|move/)
? !classes.includes("fade")
? classes + " fade"
: classes
: classes.replace(/ fade/g, "");
this.touchFade(object, action);
},
},
created() {

View file

@ -1,9 +1,5 @@
<template>
<Page
@loaded="transparentPage"
backgroundColor="transparent"
:class="theme"
>
<Page @loaded="mLoad" backgroundColor="transparent" :class="theme">
<GridLayout columns="*" rows="auto, auto, *, auto" class="modal">
<RLabel class="title" :text="title | L" />
<StackLayout
@ -29,26 +25,22 @@
</ListView>
<Label
row="2"
class="noResInfo"
:hidden="recipes.length"
:text="'recListEmp' | L"
/>
<Label
row="2"
class="noResInfo"
:hidden="filteredRecipes.length || !searchQuery"
:text="'noRecs' | L"
padding="16"
lineHeight="4"
class="tc tw"
:hidden="!noResult"
:text="noResult | L"
/>
<RGridLayout :rtl="RTL" row="3" columns="auto, *, auto" class="actions">
<Button
:hidden="!action"
class="text sm"
class="text tb st fb"
:text="action | L"
@tap="$modal.close(action)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
@ -82,6 +74,12 @@ export default {
})
.filter((e) => this.recipeFilter(e));
},
noResult() {
if (!this.recipes.length) return "recListEmp";
else if (!this.filteredRecipes.length && this.searchQuery)
return "noRecs";
else 0;
},
},
methods: {
tapAction(recipe) {
@ -101,9 +99,7 @@ export default {
);
},
touch({ object, action }, recipe) {
object.className = action.match(/down|move/)
? "listItem fade"
: "listItem ";
this.touchFade(object, action);
if (action == "up") this.tapAction(recipe);
},
},

View file

@ -1,6 +1,6 @@
<template>
<Page
@loaded="transparentPage"
@loaded="mLoad"
backgroundColor="transparent"
:class="theme"
>
@ -16,13 +16,13 @@
<Button
v-if="cancelButtonText"
col="1"
class="text sm"
class="text tb st fb"
:text="cancelButtonText | L"
@tap="$modal.close(0)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="okButtonText | L"
@tap="$modal.close(1)"
/>

View file

@ -1,6 +1,6 @@
<template>
<Page
@loaded="transparentPage"
@loaded="mLoad"
backgroundColor="transparent"
:class="theme"
>
@ -33,13 +33,13 @@
<RGridLayout :rtl="RTL" row="2" columns="*, auto, auto" class="actions">
<Button
col="1"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'SET' | L"
@tap="$modal.close(selected)"
/>

View file

@ -5,19 +5,19 @@
<ScrollView orientation="horizontal" row="1" @loaded="onScrollLoad">
<RStackLayout :rtl="RTL" class="filters" orientation="horizontal">
<GridLayout
rows="48"
columns="auto, auto"
rows="32"
columns="32, auto"
class="segment rtl"
v-for="(item, index) in pathList"
:key="index"
:class="{ select: filterType === item.type }"
:class="{ select: filter === item.type }"
@touch="touchSelector($event, item.type)"
>
<Label class="ico" :text="icon[item.type]" />
<Label class="ico tc vc" :text="icon[item.type]" />
<Label
:hidden="!item.title"
class="value"
:class="{ r: RTL }"
class="v vc"
:class="{ f: RTL }"
:text="item.title"
col="1"
/>
@ -41,16 +41,16 @@
columns="auto, *, auto, auto"
class="actions"
>
<Button class="text sm" :text="'rest' | L" @tap="resetFilter" />
<Button class="text tb st fb" :text="'rstBtn' | L" @tap="resetFilter" />
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close()"
/>
<Button
col="3"
class="text sm"
class="text tb st fb"
:text="'apply' | L"
@tap="applyFilter"
/>
@ -66,7 +66,7 @@ let filterTimer;
export default {
data() {
return {
filterType: "cuisine",
filter: "cuisine",
localCuisine: null,
localCategory: null,
localTag: null,
@ -100,7 +100,7 @@ export default {
title: localize(this.localTag),
},
];
switch (this.filterType) {
switch (this.filter) {
case "cuisine":
return arr.slice(0, -2);
case "category":
@ -109,7 +109,7 @@ export default {
return arr;
},
filterList() {
switch (this.filterType) {
switch (this.filter) {
case "cuisine":
return this.cuisineList;
case "category":
@ -175,19 +175,19 @@ export default {
methods: {
...mapActions(["setCuisine", "setCategory", "setTag", "clearFilter"]),
pgLoad(args) {
this.transparentPage(args);
this.mLoad(args);
this.localCuisine = this.selCuisine;
this.localCategory = this.selCategory;
this.localTag = this.selTag;
if (this.localCuisine) this.filterType = "category";
if (this.localCategory && this.localTag) this.filterType = "tag";
if (this.localCuisine) this.filter = "category";
if (this.localCategory && this.localTag) this.filter = "tag";
this.scrollToRight();
},
onScrollLoad(args) {
this.scrollview = args.object;
},
setFilterType(type) {
this.filterType = type;
this.filter = type;
switch (type) {
case "cuisine":
this.localCategory = null;
@ -210,14 +210,14 @@ export default {
},
setRecipeFilter(item) {
this.reset = 0;
switch (this.filterType) {
switch (this.filter) {
case "cuisine":
this.localCuisine = item;
this.filterType = "category";
this.filter = "category";
break;
case "category":
this.localCategory = item;
if (this.tagList.length) this.filterType = "tag";
if (this.tagList.length) this.filter = "tag";
break;
default:
this.localTag = item;
@ -233,23 +233,19 @@ export default {
this.$modal.close(this.reset);
},
resetFilter() {
this.filterType = "cuisine";
this.filter = "cuisine";
this.localCuisine = this.localCategory = this.localTag = null;
this.reset = 1;
},
touch({ object, action }, item) {
object.className = action.match(/down|move/)
? "listItem fade"
: "listItem ";
this.touchFade(object, action);
if (action == "up") this.setRecipeFilter(item);
},
touchSelector({ object, action }, type) {
let selected = this.filterType == type;
let classes = `segment ${this.RTL ? "rtl" : ""} `;
object.className = action.match(/down|move/)
? `${classes}${selected ? "select" : "fade"}`
: `${classes}${selected && "select"}`;
if (this.filter != type) {
this.touchFade(object, action);
if (action == "up") this.setFilterType(type);
}
},
},
};

View file

@ -1,6 +1,6 @@
<template>
<Page
@loaded="transparentPage"
@loaded="mLoad"
backgroundColor="transparent"
:class="theme"
>
@ -28,13 +28,13 @@
<RGridLayout :rtl="RTL" row="2" columns="*, auto, auto" class="actions">
<Button
col="1"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="action | L"
@tap="$modal.close(text)"
/>

View file

@ -1,6 +1,6 @@
<template>
<Page
@loaded="transparentPage"
@loaded="mLoad"
backgroundColor="transparent"
:class="theme"
>
@ -28,13 +28,13 @@
<RGridLayout :rtl="RTL" row="2" columns="*, auto, auto" class="actions">
<Button
col="1"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'SET' | L"
@tap="$modal.close(selectedTime)"
/>

View file

@ -1,9 +1,5 @@
<template>
<Page
@loaded="transparentPage"
backgroundColor="transparent"
:class="theme"
>
<Page @loaded="mLoad" backgroundColor="transparent" :class="theme">
<GridLayout rows="auto, auto, auto" class="modal">
<RLabel class="title" :text="title | L" />
<StackLayout row="1">
@ -47,17 +43,22 @@
>
<Button
v-if="showPreset"
class="text sm"
class="text tb st fb"
:text="'prstBtn' | L"
@tap="$modal.close('presets')"
/>
<Button
col="2"
class="text sm"
class="text tb st fb"
:text="'cBtn' | L"
@tap="$modal.close(0)"
/>
<Button col="3" class="text sm" :text="action | L" @tap="sendRespose" />
<Button
col="3"
class="text tb st fb"
:text="action | L"
@tap="sendRespose"
/>
</RGridLayout>
</GridLayout>
</Page>

View file

@ -3,15 +3,15 @@
<RGridLayout :rtl="RTL" rows="*, auto" columns="auto, *">
<ListView rowSpan="2" colSpan="2" class="options" for="item in items">
<v-template if="$index == 0">
<Label class="pageTitle" :text="'About' | L" />
<Label class="pTitle tw tb" :text="'About' | L" />
</v-template>
<v-template if="$index == 1">
<StackLayout class="app-info">
<Image class="icon" src="res://logo" stretch="none" />
<Label class="name tb tac" :text="'EnRecipes' | L" />
<Label :text="getVersion" class="version tb tac" />
<Label class="name tb tc" :text="'EnRecipes' | L" />
<Label :text="getVersion" class="version tb tc" />
<Label class="info tac tw" :text="'appInfo' | L" />
<Label class="info tc tw" :text="'appInfo' | L" />
</StackLayout>
</v-template>
<v-template if="$index == 8">
@ -37,6 +37,13 @@
<GridLayout row="1" class="appbar rtl" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -103,7 +110,7 @@ export default {
Utils.openUrl(url);
},
touch({ object, action }, url) {
object.className = action.match(/down|move/) ? "option fade" : "option";
this.touchFade(object, action);
if (action == "up") this.openURL(url);
},
},

View file

@ -5,6 +5,13 @@
<GridLayout row="1" class="appbar rtl" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>

View file

@ -5,6 +5,13 @@
<GridLayout row="1" class="appbar rtl" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -113,6 +120,9 @@ export default {
props: {
title: "tmrSnd",
list: getTones.tones.map((e) => e.title),
selected: getTones.tones.findIndex(
(e) => e.title == this.timerSound.title
),
},
}).then(
(tone) =>

View file

@ -22,8 +22,15 @@
columns="auto, *"
>
<ActivityIndicator :busy="!!progress" />
<RLabel col="1" class="title" :text="progress" />
<RLabel margin="0 12" col="1" class="tb tw vc lh4" :text="progress" />
</RGridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -474,7 +481,7 @@ export default {
showToast(data) {
this.animateBar(this.appbar, 0).then(() => {
this.toast = data;
this.animateBar(this.toastbar, 1);
this.animateBar(this.toastbar, 1, 1);
utils.timer(5, (val) => !val && this.hideBar());
});
},

View file

@ -5,6 +5,13 @@
<GridLayout row="1" class="appbar rtl" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -42,9 +49,7 @@ export default {
icon: "theme",
rtl: 0,
title: "Theme",
subTitle: localize(
ApplicationSettings.getString("theme", "sysDef")
),
subTitle: localize(ApplicationSettings.getString("theme", "sysDef")),
action: this.selectThemes,
},
{
@ -71,6 +76,7 @@ export default {
props: {
title: "lang",
list: [...languages],
selected: this.applang,
},
}).then((action) => {
if (action && this.applang !== action) {
@ -97,6 +103,7 @@ export default {
props: {
title: "Theme",
list: ["Light", "Dark", "Black", "sysDef", "sysDefB"],
selected: ApplicationSettings.getString("theme", "sysDef"),
},
}).then((action) => {
if (
@ -116,13 +123,10 @@ export default {
props: {
title: "listVM",
list: ["detailed", "grid", "photogrid", "simple", "minimal"],
selected: this.layout,
},
}).then((action) => {
if (action && this.layoutMode !== action) {
let act = action.toLowerCase();
ApplicationSettings.setString("layout", act);
this.setLayout(act);
}
}).then((mode) => {
if (mode && this.layout !== mode) this.setLayout(mode.toLowerCase());
});
},
},

View file

@ -5,6 +5,13 @@
<GridLayout row="1" class="appbar rtl" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -60,7 +67,8 @@ export default {
this.$showModal(Action, {
props: {
title: "calVM",
list: ["mnth", "wk", "d"],
list: ["d", "wk", "mnth"],
selected: this.plannerView,
},
}).then((res) => {
if (res && this.plannerView != res) this.setPlannerView(res);
@ -70,7 +78,8 @@ export default {
this.$showModal(Action, {
props: {
title: "admp",
list: ["otay", "otam", "otaw", "nvr"],
list: ["otaw", "otam", "otay", "nvr"],
selected: this.planDeletion,
},
}).then((res) => {
if (res && this.planDeletion != res) this.setPlanDeletion(res);

View file

@ -13,6 +13,13 @@
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Toast :onload="tbLoad" :toast="toast" :action="hideBar" />
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -35,7 +42,7 @@ export default {
};
},
computed: {
...mapState(["icon", "shake", "RTL"]),
...mapState(["icon", "shake", "RTL", "edgeSwipe", "awakeViewer"]),
items() {
return [
{},
@ -47,12 +54,28 @@ export default {
checked: !!this.shake,
action: this.toggleShake,
},
{
type: "switch",
icon: "awake",
title: "ksavr",
subTitle: localize("ksavrInfo"),
checked: !!this.awakeViewer,
action: this.toggleAwake,
},
{
type: "switch",
icon: "edge",
title: "esgb",
subTitle: localize("esgbInfo"),
checked: !!this.edgeSwipe,
action: this.toggleSwipe,
},
{},
];
},
},
methods: {
...mapActions(["setShake"]),
...mapActions(["setShake", "toggleEdgeSwipe", "toggleAwakeViewer"]),
pgLoad({ object }) {
object.bindingContext = new Observable();
},
@ -63,17 +86,23 @@ export default {
this.toastbar = object;
},
// SHAKE VIEW RANDOM RECIPE
toggleShake() {
let checked = this.shake;
if (checked && !utils.hasAccelerometer())
this.showToast(localize("noAccSensor"));
else this.setShake(!checked | 0);
else this.setShake(+!checked);
},
toggleSwipe() {
this.toggleEdgeSwipe(+!this.edgeSwipe);
},
toggleAwake() {
this.toggleAwakeViewer(+!this.awakeViewer);
},
showToast(data) {
this.animateBar(this.appbar, 0).then(() => {
this.toast = data;
this.animateBar(this.toastbar, 1);
this.animateBar(this.toastbar, 1, 1);
utils.timer(5, (val) => !val && this.hideBar());
});
},

View file

@ -12,6 +12,13 @@
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Toast :onload="tbLoad" :toast="toast" :action="hideToast" />
<Label rowSpan="2" class="edge hal rtl" @swipe="swipeBack" />
<Label
rowSpan="2"
colSpan="2"
class="edge har rtl f"
@swipe="swipeBack"
/>
</RGridLayout>
</Page>
</template>
@ -94,7 +101,7 @@ export default {
showToast() {
this.animateBar(this.appbar, 0).then(() => {
this.toast = localize("restDone");
this.animateBar(this.toastbar, 1);
this.animateBar(this.toastbar, 1, 1);
});
utils.timer(5, (val) => !val && this.hideToast());
},

View file

@ -1,7 +1,7 @@
<template>
<ListView colSpan="2" rowSpan="2" class="options" for="item in items">
<v-template if="$index == 0">
<Label class="pageTitle" :text="title | L" />
<Label class="pTitle tw tb" :text="title | L" />
</v-template>
<v-template if="item.type == 'switch'">
<RGridLayout
@ -10,7 +10,7 @@
class="option"
@touch="touch($event, item.data, item.action)"
>
<Label class="ico rtl" :text="icon[item.icon]" />
<Label class="ico vc rtl" :text="icon[item.icon]" />
<StackLayout col="1" class="info">
<RLabel :text="item.title | L" class="tw" />
<RLabel
@ -35,7 +35,11 @@
class="option"
@touch="touch($event, item.data, item.action)"
>
<Label class="ico" :class="{ rtl: item.rtl }" :text="icon[item.icon]" />
<Label
class="ico vc"
:class="{ rtl: item.rtl }"
:text="icon[item.icon]"
/>
<StackLayout col="1" class="info">
<RLabel :text="item.title | L" class="tw" />
<RLabel
@ -75,7 +79,7 @@ export default {
);
},
touch({ object, action }, data, localAction) {
object.className = action.match(/down|move/) ? "option fade" : "option";
this.touchFade(object, action);
if (action == "up") localAction ? localAction(data) : this.action(data);
},
},

View file

@ -7,8 +7,8 @@
@swipe="action"
@loaded="onload"
>
<Button @tap="action" :text="count" class="ico countdown tb" />
<RLabel @tap="action" class="title" col="1" :text="msg | L" />
<Button @tap="action" :text="count" class="ico t3 accent tb" />
<RLabel @tap="action" margin="0 4" class="tb tw vc lh4" col="1" :text="msg | L" />
<Button class="ico fab rtl" :text="icon.undo" @tap="undo" col="3" />
</RGridLayout>
</template>

View file

@ -6,7 +6,7 @@
class="timer"
>
<Button
class="ico min rtl"
class="ico si rtl"
:text="done ? icon.ring : timer.isPaused ? icon.start : icon.pause"
@tap="!done && toggleProgress()"
/>
@ -18,7 +18,7 @@
<RLabel :text="timer.label" class="tb title tw a" />
<RLabel
:hidden="!timer.recipeID && done"
@touch="!done && touch($event)"
@touch="!timer.recipeID && !done && touch($event)"
:text="getRecipeTitle"
class="a"
:class="timer.recipeID ? 'sub' : 'accent'"
@ -48,7 +48,7 @@
/>
<Button
col="4"
class="ico min"
class="ico si"
:text="icon.x"
@tap="removeTimer(timer.id, done)"
/>
@ -61,7 +61,7 @@ import { ApplicationSettings } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
import ActionWithSearch from "../modals/ActionWithSearch";
import ViewRecipe from "../ViewRecipe";
import EditRecipe from "../EditRecipe";
import * as utils from "~/shared/utils";
import { EvtBus } from "~/main";
export default {
@ -150,13 +150,6 @@ export default {
);
this.initTimer();
},
viewRecipe(recipeID) {
this.$navigateTo(ViewRecipe, {
props: {
recipeID,
},
});
},
attachRecipe() {
this.$showModal(ActionWithSearch, {
props: {
@ -251,12 +244,7 @@ export default {
// HELPERS
touch({ object, action }) {
let classes = object.className;
classes = action.match(/down|move/)
? !classes.includes("fade")
? classes + " fade"
: classes
: classes.replace(/ fade/g, "");
this.touchFade(object, action);
if (action == "up") this.attachRecipe();
},
},

View file

@ -10,7 +10,7 @@
@loaded="onload"
>
<StackLayout minHeight="48">
<RLabel class="title msg" :text="toast" />
<RLabel padding="14 20" :text="toast" />
</StackLayout>
</GridLayout>
</template>

View file

@ -3,47 +3,51 @@ import store from './store'
import {
Application,
AndroidApplication,
ApplicationSettings,
Utils,
Frame,
} from '@nativescript/core'
import {
setNumber,
getNumber,
getString,
} from '@nativescript/core/application-settings'
import { localize } from '@nativescript/localize'
import EnRecipes from './components/EnRecipes.vue'
import EditRecipe from './components/EditRecipe.vue'
import MealPlanner from './components/MealPlanner.vue'
import CookingTimer from './components/CookingTimer.vue'
// import GroceryList from './components/GroceryList.vue'
import * as utils from '~/shared/utils'
export const EvtBus = new Vue()
let renderView = EnRecipes
let renderView: any = EnRecipes
import CollectionView from '@nativescript-community/ui-collectionview/vue'
Vue.use(CollectionView)
import { RGridLayout, RStackLayout, RDockLayout, RLabel } from './rtl-ui'
import { RGridLayout, RStackLayout, RLabel } from './rtl-ui'
Vue.registerElement('RGridLayout', () => RGridLayout)
Vue.registerElement('RStackLayout', () => RStackLayout)
Vue.registerElement('RDockLayout', () => RDockLayout)
Vue.registerElement('RLabel', () => RLabel)
import { myMixin } from './shared/mixins'
Vue.mixin(myMixin)
Vue.filter('L', localize)
const initFrame = () => {
const vm = store
const s = store
// MainInit
vm.commit('setTheme', ApplicationSettings.getString('theme', 'sysDef'))
vm.commit('initRecipes')
vm.commit('initMealPlans')
vm.commit('initListItems')
vm.commit('initTimerPresets')
if (!Object.keys(vm.state.timerSound).length) {
let hasTimerSound = ApplicationSettings.getString('timerSound', null)
vm.commit(
s.commit('setTheme', getString('theme', 'sysDef'))
s.commit('initRecipes')
s.commit('initMealPlans')
s.commit('initListItems')
s.commit('initTimerPresets')
if (!Object.keys(s.state.timerSound).length) {
let hasTimerSound = getString('timerSound', null)
s.commit(
'setTimerSound',
hasTimerSound ? JSON.parse(hasTimerSound) : utils.getTones().defaultTone
)
@ -51,15 +55,14 @@ const initFrame = () => {
// InitFrame
const window = Application.android.startActivity.getWindow()
const decorView = window.getDecorView()
utils.setBarColors(window, decorView, vm.state.theme)
Frame.topmost().className = vm.state.theme
utils.setBarColors(window, decorView, s.state.theme)
Frame.topmost().className = s.state.theme
}
const showOverLockscreen = () => {
let ctx = Utils.ad.getApplicationContext()
const pm = ctx.getSystemService(android.content.Context.POWER_SERVICE)
let isScreenOff = !pm.isInteractive()
if (isScreenOff) {
console.log('showOverLockscreen')
const window = Application.android.startActivity.getWindow()
const windowMgr = android.view.WindowManager
const flags =
@ -82,19 +85,21 @@ const intentListener = ({ intent, android }: any) => {
break
case 'timer':
renderView = CookingTimer
switch (ApplicationSettings.getNumber('isTimer', 0)) {
switch (getNumber('isTimer', 0)) {
case 0:
// Closing all modals if available before navigation
if (Frame.topmost()) {
let modals = Frame.topmost()._getRootModalViews()
for (let i = modals.length - 1; i >= 0; i--) {
Frame.topmost()
._getRootModalViews()
[i].closeModal()
}
}
Vue.navigateTo(CookingTimer as any, {
animated: false,
})
ApplicationSettings.setNumber('isTimer', 1)
setNumber('isTimer', 1)
break
case 2:
Vue.navigateBack()
@ -108,17 +113,6 @@ const intentListener = ({ intent, android }: any) => {
}
}
Application.on(Application.resumeEvent, () => {
showOverLockscreen()
if (
utils.sysLocale() !==
ApplicationSettings.getString('sysLocale', utils.sysLocale())
) {
Frame.reloadPage()
utils.updateLocale()
}
})
Application.on(Application.launchEvent, (args) => {
utils.updateLocale()
store.commit('setRTL')
@ -130,6 +124,15 @@ Application.on(Application.launchEvent, (args) => {
Frame.on(Frame.loadedEvent, initFrame)
})
Application.on(Application.resumeEvent, () => {
showOverLockscreen()
if (utils.sysLocale() !== getString('sysLocale', utils.sysLocale())) {
Frame.reloadPage()
utils.updateLocale()
store.commit('setRTL')
}
})
Application.on(Application.exitEvent, () => {
renderView = EnRecipes
Application.android.off(
@ -140,8 +143,6 @@ Application.on(Application.exitEvent, () => {
Vue.config.silent = false
Vue.filter('L', localize)
new Vue({
store,
render: (h) => h('Frame', [h(renderView)]),

View file

@ -1,52 +0,0 @@
import { Property, DockLayout } from '@nativescript/core'
class Common extends DockLayout {
public rtl: boolean
}
const RTLProperty = new Property({
name: 'rtl',
defaultValue: false,
valueConverter(v): boolean {
return !!v
},
})
RTLProperty.register(Common)
export class RDockLayout extends Common {
public initNativeView(): void {
super.initNativeView()
this._updateDirection()
}
[RTLProperty.setNative](rtl: boolean): void {
this.rtl = rtl
this._updateDirection()
}
public addChild(view): void {
super.addChild(view)
if (view.nativeViewProtected) {
this._updateDirection()
}
}
public removeChild(view): void {
super.removeChild(view)
if (view.nativeViewProtected) {
this._updateDirection()
}
}
private _updateDirection(): void {
let v = this
setTimeout(() => {
v.nativeViewProtected.setRotationY(v.rtl ? 180 : 0)
for (let i = 0; i < v.getChildrenCount(); i++) {
let c = v.getChildAt(i).className
let r = /(^|\s)rtl($|\s)/.test(c)
let a = /(^|\s)a($|\s)/.test(c)
if (!v.rtl) r = !r
if (/(^|\s)a($|\s)/.test(c))
v.getChildAt(i).horizontalAlignment = a ? 'left' : 'right'
v.getChildAt(i).nativeView &&
v.getChildAt(i).nativeView.setRotationY(v.rtl ? (r ? 0 : 180) : 0)
}
}, 1)
}
}

View file

@ -1 +0,0 @@
export { RDockLayout } from './index.android'

View file

@ -1,4 +1,3 @@
export { RGridLayout } from './grid-layout'
export { RStackLayout } from './stack-layout'
export { RDockLayout } from './dock-layout'
export { RLabel } from './label'

View file

@ -5,7 +5,7 @@ const Intl = require('nativescript-intl')
export const myMixin = {
methods: {
transparentPage({ object }) {
mLoad({ object }) {
object._dialogFragment
.getDialog()
.getWindow()
@ -15,16 +15,14 @@ export const myMixin = {
)
)
},
animateBar(obj, op) {
if (op) {
obj.translateY = 64
obj.opacity = 0
}
animateBar(obj, x: number, y?: number) {
let c = CoreTypes.AnimationCurve
if (y) obj.translateY = 64
return obj.animate({
opacity: op,
translate: { x: 0, y: op ? 0 : 64 },
opacity: 1,
translate: { x: 0, y: x ? 0 : 64 },
duration: 200,
curve: CoreTypes.AnimationCurve.ease,
curve: x ? c.easeOut : c.easeIn,
})
},
totalTime(prepTime, cookTime) {
@ -47,7 +45,19 @@ export const myMixin = {
;(args.object || args).android.setGravity(this.RTL ? 5 : 3)
},
getLocaleN(n) {
return new Intl.NumberFormat(null).format(n)
return new Intl.NumberFormat(null).format(Number(n))
},
touchFade(object, action) {
let c = object.className
object.className = action.match(/down|move/)
? !c.includes('fade')
? c + ' fade'
: c
: c.replace(/ fade/g, '')
},
swipeBack({ direction }, method) {
if (this.$store.state.edgeSwipe)
if (direction == 1) method ? method(0) : this.$navigateBack()
},
},
}

View file

@ -328,12 +328,12 @@ export function shareImage(image, subject, title) {
share(intent, subject)
}
export function keepScreenOn(bool) {
export function keepScreenOn(n: number) {
let ctx =
Application.android.foregroundActivity || Application.android.startActivity
let window = ctx.getWindow()
let flag = android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
bool ? window.addFlags(flag) : window.clearFlags(flag)
n ? window.addFlags(flag) : window.clearFlags(flag)
}
// TIMER NOTIFICATION
@ -600,6 +600,8 @@ export function updateLocale() {
ctx.createConfigurationContext(config)
res.updateConfiguration(config, res.getDisplayMetrics())
ApplicationSettings.setNumber('RTL', config.getLayoutDirection() | 0)
} else {
ApplicationSettings.setNumber('RTL', sysRTL() | 0)
}
ApplicationSettings.setString('sysLocale', sysLocale())
}

View file

@ -246,6 +246,8 @@ export default new Vuex.Store({
calv: '\ue941',
mpd: '\ue942',
madd: '\ue943',
awake: '\ue944',
edge: '\ue945',
},
sortType: 'random',
language: [
@ -264,15 +266,15 @@ export default new Vuex.Store({
},
{
locale: 'en-IN',
title: 'English (IN)',
title: 'English (India)',
},
{
locale: 'en-GB',
title: 'English (UK)',
title: 'English (United Kingdom)',
},
{
locale: 'en-US',
title: 'English (US)',
title: 'English (United States)',
},
{
locale: 'es',
@ -284,15 +286,15 @@ export default new Vuex.Store({
},
{
locale: 'fr-BE',
title: 'Français (BE)',
title: 'Français (Belgium)',
},
{
locale: 'fr-CA',
title: 'Français (CA)',
title: 'Français (Canada)',
},
{
locale: 'fr-CH',
title: 'Français (CH)',
title: 'Français (Switzerland)',
},
{
locale: 'hi',
@ -306,14 +308,14 @@ export default new Vuex.Store({
locale: 'it',
title: 'Italiano',
},
// {
// locale: 'ja',
// title: '日本語',
// },
// {
// locale: 'ml',
// title: 'മലയാളം',
// },
{
locale: 'ja',
title: '日本語',
},
{
locale: 'ml',
title: 'മലയാളം',
},
{
locale: 'nb-NO',
title: 'Norsk bokmål',
@ -328,7 +330,7 @@ export default new Vuex.Store({
},
{
locale: 'pt-BR',
title: 'Português (BR)',
title: 'Português (Brazil)',
},
{
locale: 'ru',
@ -364,8 +366,18 @@ export default new Vuex.Store({
RTL: getNumber('RTL', 0),
plannerView: getString('plannerView', 'wk'),
planDeletion: getString('planDeletion', 'nvr'),
edgeSwipe: getNumber('edgeSwipe', 1),
awakeViewer: getNumber('awakeViewer', 1),
},
mutations: {
toggleAwakeViewer(state) {
state.awakeViewer = +!state.awakeViewer
setNumber('awakeViewer', state.awakeViewer)
},
toggleEdgeSwipe(state) {
state.edgeSwipe = +!state.edgeSwipe
setNumber('edgeSwipe', state.edgeSwipe)
},
setPlanDeletion(state, s) {
state.planDeletion = s
setString('planDeletion', s)
@ -483,6 +495,7 @@ export default new Vuex.Store({
},
setLayout(state, type) {
state.layout = type
setString('layout', type)
},
setSortType(state, sortType) {
state.sortType = sortType
@ -817,7 +830,6 @@ export default new Vuex.Store({
let c = state.planDeletion
let date = new Date()
let d = new Date()
if (c != 'nvr') {
d.setHours(0, 0, 0, 0)
let ld =
c == 'otay'
@ -826,15 +838,13 @@ export default new Vuex.Store({
? new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
: 7
d.setDate(d.getDate() - ld)
}
db.select(`SELECT * FROM mealPlans`).then((res) =>
res.forEach((p: any) => {
if (p.date < d.getTime())
// DeletingOldMealPlans
db.execute(`DELETE FROM mealPlans WHERE id = '${p.id}'`)
else state.mealPlans.push(p)
})
res.forEach((p: any) =>
c !== 'nvr' && p.date < d.getTime()
? db.execute(`DELETE FROM mealPlans WHERE id = '${p.id}'`)
: state.mealPlans.push(p)
)
)
}
},
@ -1024,6 +1034,12 @@ export default new Vuex.Store({
},
},
actions: {
toggleAwakeViewer({ commit }) {
commit('toggleAwakeViewer')
},
toggleEdgeSwipe({ commit }) {
commit('toggleEdgeSwipe')
},
setPlanDeletion({ commit }, s) {
commit('setPlanDeletion', s)
},

382
package-lock.json generated
View file

@ -11,7 +11,7 @@
"dependencies": {
"@akylas/nativescript-sqlite": "^3.3.12",
"@nativescript-community/ui-collectionview": "^4.0.32",
"@nativescript/core": "^8.0.7",
"@nativescript/core": "^8.0.8",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
"nativescript-imagecropper": "^4.0.1",
@ -25,7 +25,7 @@
"@nativescript/webpack": "^5.0.0-beta.14",
"@types/node": "^15.12.2",
"nativescript-vue-template-compiler": "~2.9.0",
"sass": "^1.34.1",
"sass": "^1.35.1",
"typescript": "^4.2.4",
"vue": "^2.6.13"
}
@ -64,17 +64,17 @@
}
},
"node_modules/@babel/core": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.5.tgz",
"integrity": "sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz",
"integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.14.5",
"@babel/generator": "^7.14.5",
"@babel/helper-compilation-targets": "^7.14.5",
"@babel/helper-module-transforms": "^7.14.5",
"@babel/helpers": "^7.14.5",
"@babel/parser": "^7.14.5",
"@babel/helpers": "^7.14.6",
"@babel/parser": "^7.14.6",
"@babel/template": "^7.14.5",
"@babel/traverse": "^7.14.5",
"@babel/types": "^7.14.5",
@ -294,9 +294,9 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.5.tgz",
"integrity": "sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz",
"integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==",
"dev": true,
"dependencies": {
"@babel/template": "^7.14.5",
@ -384,9 +384,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz",
"integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz",
"integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -463,9 +463,9 @@
"dev": true
},
"node_modules/@nativescript/core": {
"version": "8.0.7",
"resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.7.tgz",
"integrity": "sha512-2OLwPa5Y+9aKLyo0zWl0YSjWS0f+EFG8SdZe+uuU2mzEhCb8q9djdICjHynuXZkmrtQsx/lKjLhbtnoYQsMRvA==",
"version": "8.0.8",
"resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.8.tgz",
"integrity": "sha512-oeJIeHggLSXMBMwhIORW5WV3UyG4zu7M1G2VtG7Z6/Kd9JCUwglJTcP+1YPKt9emAPAz9bhGSCzMFpasNBPQzw==",
"hasInstallScript": true,
"dependencies": {
"@nativescript/hook": "~2.0.0",
@ -709,15 +709,16 @@
"dev": true
},
"node_modules/@vue/component-compiler-utils": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz",
"integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==",
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz",
"integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==",
"dev": true,
"dependencies": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
"postcss": "^7.0.36",
"postcss-selector-parser": "^6.0.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
@ -726,6 +727,86 @@
"prettier": "^1.18.2"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/chalk/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/@vue/component-compiler-utils/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/postcss": {
"version": "7.0.36",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
"integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
"dev": true,
"dependencies": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
},
"engines": {
"node": ">=6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -735,6 +816,18 @@
"node": ">=0.10.0"
}
},
"node_modules/@vue/component-compiler-utils/node_modules/supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@webassemblyjs/ast": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz",
@ -1344,24 +1437,24 @@
}
},
"node_modules/chokidar": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
"integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"dependencies": {
"anymatch": "~3.1.1",
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.0",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.5.0"
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.1"
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
@ -2279,9 +2372,9 @@
}
},
"node_modules/globby": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
"integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
"dev": true,
"dependencies": {
"array-union": "^2.1.0",
@ -3222,9 +3315,9 @@
}
},
"node_modules/postcss": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.2.tgz",
"integrity": "sha512-y1FK/AWdZlBF5lusS5j5l4/vF67+vQZt1SXPVJ32y1kRGDQyrs1zk32hG1cInRTu14P0V+orPz+ifwW/7rR4bg==",
"version": "8.3.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
"integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
"dev": true,
"dependencies": {
"colorette": "^1.2.2",
@ -3528,9 +3621,9 @@
}
},
"node_modules/readdirp": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
"integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
@ -3657,9 +3750,9 @@
"dev": true
},
"node_modules/sass": {
"version": "1.34.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.34.1.tgz",
"integrity": "sha512-scLA7EIZM+MmYlej6sdVr0HRbZX5caX5ofDT9asWnUJj21oqgsC+1LuNfm0eg+vM0fCTZHhwImTiCU0sx9h9CQ==",
"version": "1.35.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz",
"integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0"
@ -4170,9 +4263,10 @@
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
},
"node_modules/typescript": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
"integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.3.tgz",
"integrity": "sha512-rUvLW0WtF7PF2b9yenwWUi9Da9euvDRhmH7BLyBG4DCFfOJ850LGNknmRpp8Z8kXNUPObdZQEfKOiHtXuQHHKA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -4214,7 +4308,8 @@
"node_modules/vue": {
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
"dev": true
},
"node_modules/vue-hot-reload-api": {
"version": "2.3.4",
@ -4337,9 +4432,9 @@
}
},
"node_modules/webpack": {
"version": "5.38.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz",
"integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==",
"version": "5.39.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.0.tgz",
"integrity": "sha512-25CHmuDj+oOTyteI13sUqNlCnjCnySuhiKWE/cRYPQYeoQ3ijHgyWX27CiyUKLNGq27v8S0mrksyTreT/xo7pg==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.0",
@ -4592,9 +4687,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
"integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
"dev": true,
"engines": {
"node": ">=8.3.0"
@ -4725,17 +4820,17 @@
"dev": true
},
"@babel/core": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.5.tgz",
"integrity": "sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz",
"integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
"@babel/generator": "^7.14.5",
"@babel/helper-compilation-targets": "^7.14.5",
"@babel/helper-module-transforms": "^7.14.5",
"@babel/helpers": "^7.14.5",
"@babel/parser": "^7.14.5",
"@babel/helpers": "^7.14.6",
"@babel/parser": "^7.14.6",
"@babel/template": "^7.14.5",
"@babel/traverse": "^7.14.5",
"@babel/types": "^7.14.5",
@ -4901,9 +4996,9 @@
"dev": true
},
"@babel/helpers": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.5.tgz",
"integrity": "sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz",
"integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==",
"dev": true,
"requires": {
"@babel/template": "^7.14.5",
@ -4975,9 +5070,9 @@
}
},
"@babel/parser": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz",
"integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==",
"version": "7.14.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz",
"integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==",
"dev": true
},
"@babel/template": {
@ -5036,9 +5131,9 @@
"dev": true
},
"@nativescript/core": {
"version": "8.0.7",
"resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.7.tgz",
"integrity": "sha512-2OLwPa5Y+9aKLyo0zWl0YSjWS0f+EFG8SdZe+uuU2mzEhCb8q9djdICjHynuXZkmrtQsx/lKjLhbtnoYQsMRvA==",
"version": "8.0.8",
"resolved": "https://registry.npmjs.org/@nativescript/core/-/core-8.0.8.tgz",
"integrity": "sha512-oeJIeHggLSXMBMwhIORW5WV3UyG4zu7M1G2VtG7Z6/Kd9JCUwglJTcP+1YPKt9emAPAz9bhGSCzMFpasNBPQzw==",
"requires": {
"@nativescript/hook": "~2.0.0",
"css-tree": "^1.1.2",
@ -5227,26 +5322,99 @@
"dev": true
},
"@vue/component-compiler-utils": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz",
"integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==",
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz",
"integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==",
"dev": true,
"requires": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
"postcss": "^7.0.36",
"postcss-selector-parser": "^6.0.2",
"prettier": "^1.18.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"dependencies": {
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"postcss": {
"version": "7.0.36",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
"integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"supports-color": "^6.1.0"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
@ -5400,8 +5568,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz",
"integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==",
"dev": true,
"requires": {}
"dev": true
},
"@webpack-cli/info": {
"version": "1.3.0",
@ -5416,8 +5583,7 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz",
"integrity": "sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==",
"dev": true,
"requires": {}
"dev": true
},
"@xtuc/ieee754": {
"version": "1.2.0",
@ -5450,8 +5616,7 @@
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz",
"integrity": "sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==",
"dev": true,
"requires": {}
"dev": true
},
"acorn-private-methods": {
"version": "0.3.3",
@ -5504,8 +5669,7 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
"dev": true
},
"ansi-html": {
"version": "0.0.7",
@ -5709,19 +5873,19 @@
}
},
"chokidar": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
"integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"requires": {
"anymatch": "~3.1.1",
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.1",
"glob-parent": "~5.1.0",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.5.0"
"readdirp": "~3.6.0"
},
"dependencies": {
"glob-parent": {
@ -6425,9 +6589,9 @@
"dev": true
},
"globby": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
"integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@ -6502,8 +6666,7 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
"dev": true,
"requires": {}
"dev": true
},
"ignore": {
"version": "5.1.8",
@ -7141,9 +7304,9 @@
}
},
"postcss": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.2.tgz",
"integrity": "sha512-y1FK/AWdZlBF5lusS5j5l4/vF67+vQZt1SXPVJ32y1kRGDQyrs1zk32hG1cInRTu14P0V+orPz+ifwW/7rR4bg==",
"version": "8.3.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
"integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
"dev": true,
"requires": {
"colorette": "^1.2.2",
@ -7216,8 +7379,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
"dev": true,
"requires": {}
"dev": true
},
"postcss-modules-local-by-default": {
"version": "4.0.0",
@ -7343,9 +7505,9 @@
}
},
"readdirp": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
"integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
@ -7437,9 +7599,9 @@
"dev": true
},
"sass": {
"version": "1.34.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.34.1.tgz",
"integrity": "sha512-scLA7EIZM+MmYlej6sdVr0HRbZX5caX5ofDT9asWnUJj21oqgsC+1LuNfm0eg+vM0fCTZHhwImTiCU0sx9h9CQ==",
"version": "1.35.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz",
"integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0"
@ -7804,9 +7966,10 @@
"integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
},
"typescript": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
"integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw=="
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.3.tgz",
"integrity": "sha512-rUvLW0WtF7PF2b9yenwWUi9Da9euvDRhmH7BLyBG4DCFfOJ850LGNknmRpp8Z8kXNUPObdZQEfKOiHtXuQHHKA==",
"dev": true
},
"universalify": {
"version": "2.0.0",
@ -7838,7 +8001,8 @@
"vue": {
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
"integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
"dev": true
},
"vue-hot-reload-api": {
"version": "2.3.4",
@ -7922,8 +8086,7 @@
"vuex": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
"requires": {}
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
},
"watchpack": {
"version": "2.2.0",
@ -7936,9 +8099,9 @@
}
},
"webpack": {
"version": "5.38.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz",
"integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==",
"version": "5.39.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.0.tgz",
"integrity": "sha512-25CHmuDj+oOTyteI13sUqNlCnjCnySuhiKWE/cRYPQYeoQ3ijHgyWX27CiyUKLNGq27v8S0mrksyTreT/xo7pg==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.0",
@ -8115,11 +8278,10 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true,
"requires": {}
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
"integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
"dev": true
},
"xmlbuilder": {
"version": "9.0.7",

View file

@ -20,7 +20,7 @@
"dependencies": {
"@akylas/nativescript-sqlite": "^3.3.12",
"@nativescript-community/ui-collectionview": "^4.0.32",
"@nativescript/core": "^8.0.7",
"@nativescript/core": "^8.0.8",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
"nativescript-imagecropper": "^4.0.1",
@ -34,7 +34,7 @@
"@nativescript/webpack": "^5.0.0-beta.14",
"@types/node": "^15.12.2",
"nativescript-vue-template-compiler": "~2.9.0",
"sass": "^1.34.1",
"sass": "^1.35.1",
"typescript": "^4.2.4",
"vue": "^2.6.13"
}

View file

@ -0,0 +1 @@
EnRecipes

View file

@ -0,0 +1 @@
EnRecipes