├── .gitignore
├── .vscode
└── extensions.json
├── README.md
├── android
├── .gitignore
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── capacitor.build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── getcapacitor
│ │ │ └── myapp
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── dev
│ │ │ │ └── adoe
│ │ │ │ └── perfice
│ │ │ │ └── MainActivity.java
│ │ └── res
│ │ │ ├── drawable-land-hdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-ldpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-mdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-hdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-ldpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-mdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-xhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-xxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-night-xxxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-xhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-xxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-land-xxxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-night
│ │ │ └── splash.png
│ │ │ ├── drawable-port-hdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-ldpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-mdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-hdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-ldpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-mdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-xhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-xxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-night-xxxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-xhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-xxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-port-xxxhdpi
│ │ │ └── splash.png
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── small_icon.png
│ │ │ └── splash.png
│ │ │ ├── layout
│ │ │ └── activity_main.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-ldpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── values
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ │ └── xml
│ │ │ └── file_paths.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── getcapacitor
│ │ └── myapp
│ │ └── ExampleUnitTest.java
├── build.gradle
├── capacitor.settings.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── variables.gradle
├── assets
├── icon-background.png
├── icon-foreground.png
├── icon-only.png
├── splash-dark.png
└── splash.png
├── capacitor.config.ts
├── index.html
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── analytics-onboarding-mobile.png
├── analytics-onboarding.png
├── dashboard-onboarding-mobile.png
├── dashboard-onboarding.png
├── favicon-128x128.png
├── favicon-512x512.png
├── favicon-64x64.png
├── goals-onboarding-mobile.png
├── goals-onboarding.png
├── sw.js
├── tags-onboarding-mobile.png
├── tags-onboarding.png
├── trackables-onboarding-mobile.png
└── trackables-onboarding.png
├── src
├── App.svelte
├── app.css
├── app.ts
├── assets
│ ├── OpenMoji-black-glyf.woff2
│ ├── dashboard_suggestions.json
│ ├── emojis.json
│ ├── goal_suggestions.json
│ ├── reflection_suggestions.json
│ ├── tag_suggestions.json
│ └── trackable_suggestions.json
├── components
│ ├── QuickLogField.svelte
│ ├── analytics
│ │ ├── AnalyticsCorrelationView.svelte
│ │ ├── Heatmap.svelte
│ │ ├── NewCorrelations.svelte
│ │ ├── QuestionLabel.svelte
│ │ ├── details
│ │ │ ├── CorrelationAnalytics.svelte
│ │ │ ├── CorrelationBar.svelte
│ │ │ ├── CorrelationCard.svelte
│ │ │ ├── CorrelationMessage.svelte
│ │ │ ├── CorrelationMessagePart.svelte
│ │ │ ├── tag
│ │ │ │ ├── AnalyticsTagDetailsView.svelte
│ │ │ │ └── TagWeekDayAnalytics.svelte
│ │ │ └── trackable
│ │ │ │ ├── AnalyticsTrackableDetailsView.svelte
│ │ │ │ ├── BasicCategoricalAnalyticsRow.svelte
│ │ │ │ ├── BasicQuantitativeAnalyticsRow.svelte
│ │ │ │ └── TrackableWeekDayAnalytics.svelte
│ │ ├── modal
│ │ │ └── EditAnalyticsSettingsModal.svelte
│ │ ├── tag
│ │ │ └── AnalyticsTagView.svelte
│ │ └── trackable
│ │ │ ├── AnalyticsTrackableCard.svelte
│ │ │ ├── AnalyticsTrackableLineChart.svelte
│ │ │ └── AnalyticsTrackableView.svelte
│ ├── base
│ │ ├── button
│ │ │ ├── Button.svelte
│ │ │ ├── CardButton.svelte
│ │ │ ├── HorizontalPlusButton.svelte
│ │ │ ├── IconButton.svelte
│ │ │ ├── LineButton.svelte
│ │ │ ├── PopupIconButton.svelte
│ │ │ └── SelectCardButton.svelte
│ │ ├── calendarScroll
│ │ │ ├── CalendarScroll.svelte
│ │ │ └── CalendarScrollItem.svelte
│ │ ├── card
│ │ │ ├── GenericActionsCard.svelte
│ │ │ ├── GenericEditDeleteCard.svelte
│ │ │ └── TitledCard.svelte
│ │ ├── category
│ │ │ ├── CategoryContainerHeader.svelte
│ │ │ └── GenericCategoryContainer.svelte
│ │ ├── color
│ │ │ └── ColorPickerButton.svelte
│ │ ├── contextMenu
│ │ │ ├── ContextMenu.svelte
│ │ │ ├── ContextMenuButtons.svelte
│ │ │ └── PopupContextMenuButton.svelte
│ │ ├── datePicker
│ │ │ └── DatePicker.svelte
│ │ ├── dnd
│ │ │ └── DragAndDropContainer.svelte
│ │ ├── dropdown
│ │ │ ├── BindableDropdownButton.svelte
│ │ │ ├── DropdownButton.svelte
│ │ │ └── MultiSelectDropdownButton.svelte
│ │ ├── dynamic
│ │ │ ├── DynamicInput.svelte
│ │ │ └── DynamicLabel.svelte
│ │ ├── fileButton
│ │ │ └── FileButton.svelte
│ │ ├── gesture
│ │ │ └── SwipeDetector.svelte
│ │ ├── icon
│ │ │ ├── Icon.svelte
│ │ │ └── icons.ts
│ │ ├── iconLabel
│ │ │ ├── IconLabel.svelte
│ │ │ └── IconLabelBetween.svelte
│ │ ├── iconPicker
│ │ │ ├── IconPicker.svelte
│ │ │ └── IconPickerButton.svelte
│ │ ├── inline
│ │ │ ├── InlineCreateInput.svelte
│ │ │ └── InlineCreateLineButton.svelte
│ │ ├── invertedSegmented
│ │ │ ├── InvertedSegment.svelte
│ │ │ └── InvertedSegmentedControl.svelte
│ │ ├── modal
│ │ │ ├── MobileModalHeader.svelte
│ │ │ ├── Modal.svelte
│ │ │ ├── ModalFooter.svelte
│ │ │ ├── ModalFooterContainer.svelte
│ │ │ └── generic
│ │ │ │ ├── GenericDeleteModal.svelte
│ │ │ │ └── GenericEntityModal.svelte
│ │ ├── progress
│ │ │ └── CircularProgressBar.svelte
│ │ ├── segmented
│ │ │ ├── Segment.svelte
│ │ │ └── SegmentedControl.svelte
│ │ ├── sidebar
│ │ │ └── Sidebar.svelte
│ │ ├── textOrDynamic
│ │ │ └── EditTextOrDynamic.svelte
│ │ ├── timePicker
│ │ │ └── TimePicker.svelte
│ │ ├── timeScope
│ │ │ ├── RangedDatePicker.svelte
│ │ │ ├── RangedTimeScopePicker.svelte
│ │ │ ├── SimpleTimeScopePicker.svelte
│ │ │ └── TimeScopePicker.svelte
│ │ ├── title
│ │ │ ├── Title.svelte
│ │ │ └── TitleAndCalendar.svelte
│ │ └── weekDays
│ │ │ └── WeekDays.svelte
│ ├── chart
│ │ ├── CanvasChartRenderer.svelte
│ │ ├── DualLineChart.svelte
│ │ ├── PieChart.svelte
│ │ └── SingleChart.svelte
│ ├── dashboard
│ │ ├── DashboardSidebar.svelte
│ │ ├── DashboardWidgetRenderer.svelte
│ │ ├── GridstackGrid.svelte
│ │ ├── sidebar
│ │ │ ├── add
│ │ │ │ ├── AddWidgetSidebar.svelte
│ │ │ │ └── DashboardDragInCard.svelte
│ │ │ └── edit
│ │ │ │ ├── EditWidgetSidebar.svelte
│ │ │ │ ├── SelectFormAndQuestion.svelte
│ │ │ │ └── types
│ │ │ │ ├── chart
│ │ │ │ └── EditChartWidgetSidebar.svelte
│ │ │ │ ├── checklist
│ │ │ │ └── EditChecklistWidgetSidebar.svelte
│ │ │ │ ├── entryRow
│ │ │ │ └── EditEntryRowWidgetSidebar.svelte
│ │ │ │ ├── goal
│ │ │ │ └── EditGoalWidgetSidebar.svelte
│ │ │ │ ├── insights
│ │ │ │ └── EditInsightsWidgetSidebar.svelte
│ │ │ │ ├── metric
│ │ │ │ └── EditMetricWidgetSidebar.svelte
│ │ │ │ ├── newCorrelations
│ │ │ │ └── EditNewCorrelationsWidgetSidebar.svelte
│ │ │ │ ├── table
│ │ │ │ └── EditTableWidgetSidebar.svelte
│ │ │ │ ├── tags
│ │ │ │ └── EditTagsWidgetSidebar.svelte
│ │ │ │ ├── trackable
│ │ │ │ └── EditTrackableWidgetSidebar.svelte
│ │ │ │ └── welcome
│ │ │ │ └── EditWelcomeWidgetSidebar.svelte
│ │ └── types
│ │ │ ├── chart
│ │ │ └── DashboardChartWidget.svelte
│ │ │ ├── checkList
│ │ │ ├── ChecklistEntry.svelte
│ │ │ └── DashboardChecklistWidget.svelte
│ │ │ ├── entryRow
│ │ │ ├── DashboardEntryRowWidget.svelte
│ │ │ └── EntryRowItem.svelte
│ │ │ ├── goal
│ │ │ └── DashboardGoalWidget.svelte
│ │ │ ├── insights
│ │ │ └── DashboardInsightsWidget.svelte
│ │ │ ├── metric
│ │ │ └── DashboardMetricWidget.svelte
│ │ │ ├── newCorrelations
│ │ │ └── DashboardNewCorrelationsWidget.svelte
│ │ │ ├── table
│ │ │ ├── DashboardTableWidget.svelte
│ │ │ ├── TableWidgetEntry.svelte
│ │ │ └── TableWidgetGroupHeader.svelte
│ │ │ ├── tags
│ │ │ └── DashboardTagsWidget.svelte
│ │ │ ├── trackable
│ │ │ └── DashboardTrackableWidget.svelte
│ │ │ └── welcome
│ │ │ └── DashboardWelcomeWidget.svelte
│ ├── form
│ │ ├── FormEmbed.svelte
│ │ ├── editor
│ │ │ ├── data
│ │ │ │ ├── EditDataQuestionSettings.svelte
│ │ │ │ ├── hierarchy
│ │ │ │ │ ├── EditHierarchyOption.svelte
│ │ │ │ │ ├── EditHierarchyOptionModal.svelte
│ │ │ │ │ └── EditHierarchyQuestionSettings.svelte
│ │ │ │ ├── number
│ │ │ │ │ └── EditNumberQuestionSettings.svelte
│ │ │ │ └── text
│ │ │ │ │ └── EditTextQuestionSettings.svelte
│ │ │ ├── display
│ │ │ │ ├── EditDisplayQuestionSettings.svelte
│ │ │ │ ├── hierarchy
│ │ │ │ │ └── EditHierarchyQuestionDisplaySettings.svelte
│ │ │ │ ├── range
│ │ │ │ │ └── EditRangeQuestionSettings.svelte
│ │ │ │ ├── segmented
│ │ │ │ │ ├── EditSegmentedOptionCard.svelte
│ │ │ │ │ ├── EditSegmentedOptionModal.svelte
│ │ │ │ │ └── EditSegmentedQuestionSettings.svelte
│ │ │ │ └── select
│ │ │ │ │ ├── EditSelectGrid.svelte
│ │ │ │ │ ├── EditSelectOptionCard.svelte
│ │ │ │ │ ├── EditSelectOptionModal.svelte
│ │ │ │ │ └── EditSelectQuestionSettings.svelte
│ │ │ ├── field
│ │ │ │ └── FormFieldEdit.svelte
│ │ │ └── sidebar
│ │ │ │ ├── FormEditorSidebar.svelte
│ │ │ │ └── SidebarDropdownHeader.svelte
│ │ ├── fields
│ │ │ ├── FormFieldRenderer.svelte
│ │ │ ├── ValidatedFormField.svelte
│ │ │ ├── hierarchy
│ │ │ │ ├── HierarchyButton.svelte
│ │ │ │ └── HierarchyFormField.svelte
│ │ │ ├── input
│ │ │ │ ├── BooleanInputFormField.svelte
│ │ │ │ ├── DateInputFormField.svelte
│ │ │ │ ├── DateTimeInputFormField.svelte
│ │ │ │ ├── InputFormField.svelte
│ │ │ │ ├── TimeElapsedInputFormField.svelte
│ │ │ │ ├── TimeOfDayInputFormField.svelte
│ │ │ │ └── VanillaInputFormField.svelte
│ │ │ ├── range
│ │ │ │ └── RangeFormField.svelte
│ │ │ ├── richInput
│ │ │ │ └── RichInputFormField.svelte
│ │ │ ├── segmented
│ │ │ │ └── SegmentedFormField.svelte
│ │ │ ├── select
│ │ │ │ ├── SelectFormField.svelte
│ │ │ │ └── SelectOptionButton.svelte
│ │ │ └── textArea
│ │ │ │ └── TextAreaFormField.svelte
│ │ ├── modals
│ │ │ ├── FormModal.svelte
│ │ │ └── FormTemplateButton.svelte
│ │ └── valueInput
│ │ │ ├── FormQuestionValueInput.svelte
│ │ │ └── PrimitiveVanillaInputField.svelte
│ ├── goal
│ │ ├── GoalCard.svelte
│ │ ├── GoalCardBase.svelte
│ │ ├── GoalMetIndicator.svelte
│ │ ├── GoalNewCard.svelte
│ │ ├── GoalValueRenderer.svelte
│ │ ├── editor
│ │ │ ├── GoalConditionCard.svelte
│ │ │ ├── condition
│ │ │ │ ├── comparison
│ │ │ │ │ ├── AddSourceButton.svelte
│ │ │ │ │ └── ComparisonConditionRenderer.svelte
│ │ │ │ └── goalMet
│ │ │ │ │ └── GoalMetConditionRenderer.svelte
│ │ │ └── sidebar
│ │ │ │ ├── AddConditionSidebar.svelte
│ │ │ │ ├── AddSourceSidebar.svelte
│ │ │ │ └── GoalEditorSidebar.svelte
│ │ ├── multi
│ │ │ ├── ComparisonConditionEntry.svelte
│ │ │ ├── ConditionEntry.svelte
│ │ │ ├── GoalMetConditionEntry.svelte
│ │ │ └── MultiConditionRenderer.svelte
│ │ └── single
│ │ │ ├── ComparisonSingleCondition.svelte
│ │ │ ├── GoalMetSingleCondition.svelte
│ │ │ └── SingleConditionRenderer.svelte
│ ├── import
│ │ └── EntryImportResultModal.svelte
│ ├── journal
│ │ ├── day
│ │ │ ├── JournalCardBase.svelte
│ │ │ ├── JournalCardHeader.svelte
│ │ │ ├── JournalDayCard.svelte
│ │ │ ├── JournalDayDate.svelte
│ │ │ ├── JournalEntryTimestamp.svelte
│ │ │ ├── JournalMultiGroup.svelte
│ │ │ ├── JournalSingleGroup.svelte
│ │ │ ├── JournalSummaryContainer.svelte
│ │ │ └── JournalTagEntries.svelte
│ │ └── search
│ │ │ ├── JournalSearchEntityCard.svelte
│ │ │ ├── common
│ │ │ ├── ByCategoryFilterCard.svelte
│ │ │ └── OneOfFilterCard.svelte
│ │ │ └── types
│ │ │ ├── GenericFilterContainer.svelte
│ │ │ ├── date
│ │ │ └── DateSearchOptions.svelte
│ │ │ ├── freeText
│ │ │ └── FreeTextSearchOptions.svelte
│ │ │ ├── tag
│ │ │ ├── TagFilterRenderer.svelte
│ │ │ ├── TagSearchActions.svelte
│ │ │ ├── TagSearchOptions.svelte
│ │ │ └── filters
│ │ │ │ ├── TagByCategoryFilterCard.svelte
│ │ │ │ └── TagOneOfFilterCard.svelte
│ │ │ └── trackable
│ │ │ ├── TrackableFilterRenderer.svelte
│ │ │ ├── TrackableSearchActions.svelte
│ │ │ ├── TrackableSearchOptions.svelte
│ │ │ └── filters
│ │ │ ├── TrackableByAnswersFilterCard.svelte
│ │ │ ├── TrackableByCategoryFilterCard.svelte
│ │ │ └── TrackableOneOfFilterCard.svelte
│ ├── mobile
│ │ └── MobileTopBar.svelte
│ ├── onboarding
│ │ ├── OnboardingImage.svelte
│ │ ├── OnboardingPageNavigation.svelte
│ │ ├── OnboardingSelect.svelte
│ │ └── OnboardingSelectButton.svelte
│ ├── reflection
│ │ ├── GlobalReflectionModal.svelte
│ │ ├── editor
│ │ │ ├── ReflectionPageGroup.svelte
│ │ │ ├── notifications
│ │ │ │ ├── EditNotificationModal.svelte
│ │ │ │ ├── EditReflectionNotifications.svelte
│ │ │ │ └── NotificationCard.svelte
│ │ │ └── sidebar
│ │ │ │ ├── ReflectionEditPageSidebar.svelte
│ │ │ │ ├── ReflectionEditWidgetSidebar.svelte
│ │ │ │ ├── ReflectionEditorSidebar.svelte
│ │ │ │ └── widget
│ │ │ │ ├── ReflectionEditChecklistWidget.svelte
│ │ │ │ ├── ReflectionEditFormWidget.svelte
│ │ │ │ ├── ReflectionEditTableWidget.svelte
│ │ │ │ └── ReflectionEditTagsWidget.svelte
│ │ └── modal
│ │ │ ├── ReflectionModal.svelte
│ │ │ ├── ReflectionPageButton.svelte
│ │ │ ├── ReflectionPageRenderer.svelte
│ │ │ └── widgets
│ │ │ ├── ReflectionChecklistWidget.svelte
│ │ │ ├── ReflectionFormWidget.svelte
│ │ │ ├── ReflectionTableWidget.svelte
│ │ │ ├── ReflectionTagsWidget.svelte
│ │ │ └── ReflectionWidgetRenderer.svelte
│ ├── settings
│ │ ├── SettingsDataExport.svelte
│ │ ├── SettingsDataImport.svelte
│ │ └── SettingsDeleteData.svelte
│ ├── sharedWidgets
│ │ ├── checklist
│ │ │ ├── ChecklistWidget.svelte
│ │ │ ├── EditChecklistConditionCard.svelte
│ │ │ ├── EditChecklistConditionModal.svelte
│ │ │ ├── EditChecklistWidgetSettings.svelte
│ │ │ ├── EditFormChecklistCondition.svelte
│ │ │ └── EditTagChecklistCondition.svelte
│ │ └── table
│ │ │ ├── EditTableWidgetSettings.svelte
│ │ │ └── TableWidget.svelte
│ ├── sidebar
│ │ ├── NavigationSidebar.svelte
│ │ ├── SidebarButton.svelte
│ │ └── drawer
│ │ │ ├── DrawerButton.svelte
│ │ │ ├── DrawerOpenButton.svelte
│ │ │ └── MobileDrawer.svelte
│ ├── tag
│ │ ├── FilteredTagCategories.svelte
│ │ ├── TagButtonBase.svelte
│ │ ├── TagCard.svelte
│ │ ├── TagCategoryContainer.svelte
│ │ ├── TagValueCard.svelte
│ │ └── modal
│ │ │ └── EditTagModal.svelte
│ ├── trackable
│ │ ├── TrackableCategoryContainer.svelte
│ │ ├── TrackableList.svelte
│ │ ├── card
│ │ │ ├── TrackableCard.svelte
│ │ │ ├── chart
│ │ │ │ └── ChartTrackableRenderer.svelte
│ │ │ ├── tally
│ │ │ │ └── TallyTrackableRenderer.svelte
│ │ │ └── value
│ │ │ │ ├── ValueTrackableRenderer.svelte
│ │ │ │ ├── latest
│ │ │ │ └── LatestTrackableRenderer.svelte
│ │ │ │ └── table
│ │ │ │ ├── TableTrackableRenderer.svelte
│ │ │ │ └── TrackableTableEntry.svelte
│ │ └── modals
│ │ │ ├── create
│ │ │ ├── CreateSingleValueTrackable.svelte
│ │ │ └── CreateTrackableModal.svelte
│ │ │ └── edit
│ │ │ ├── EditTrackableImportExport.svelte
│ │ │ ├── EditTrackableModal.svelte
│ │ │ └── general
│ │ │ ├── EditTrackableCard.svelte
│ │ │ ├── EditTrackableCategory.svelte
│ │ │ ├── EditTrackableGeneral.svelte
│ │ │ ├── chart
│ │ │ └── EditTrackableChartCard.svelte
│ │ │ ├── tally
│ │ │ └── EditTrackableTallyCard.svelte
│ │ │ └── value
│ │ │ ├── EditTrackableValueCard.svelte
│ │ │ └── EditTrackableValueRepresentation.svelte
│ └── variable
│ │ └── edit
│ │ ├── EditBackButton.svelte
│ │ ├── EditConstant.svelte
│ │ ├── EditConstantOrVariable.svelte
│ │ ├── EditVariable.svelte
│ │ ├── EditVariableName.svelte
│ │ ├── aggregation
│ │ ├── EditAggregationVariable.svelte
│ │ ├── EditListFilter.svelte
│ │ ├── EditListFilters.svelte
│ │ └── EditListOperatorValue.svelte
│ │ ├── calculation
│ │ └── EditCalculationVariable.svelte
│ │ └── latest
│ │ └── EditLatestVariable.svelte
├── db
│ ├── collections.ts
│ ├── dexie
│ │ ├── analytics.ts
│ │ ├── dashboard.ts
│ │ ├── db.ts
│ │ ├── form.ts
│ │ ├── goal.ts
│ │ ├── index.ts
│ │ ├── journal.ts
│ │ ├── migration.ts
│ │ ├── notification.ts
│ │ ├── reflection.ts
│ │ ├── search.ts
│ │ ├── tag.ts
│ │ ├── trackable.ts
│ │ └── variable.ts
│ └── migration
│ │ ├── migration.ts
│ │ └── migrations
│ │ ├── chartTitles.ts
│ │ └── defaultQuestionValues.ts
├── gridstack-extra-columns.css
├── main.ts
├── model
│ ├── analytics
│ │ ├── analytics.ts
│ │ └── ui.ts
│ ├── dashboard
│ │ ├── dashboard.ts
│ │ ├── suggestions.ts
│ │ ├── ui.ts
│ │ └── widgets
│ │ │ ├── chart.ts
│ │ │ ├── checklist.ts
│ │ │ ├── entryRow.ts
│ │ │ ├── goal.ts
│ │ │ ├── insights.ts
│ │ │ ├── metric.ts
│ │ │ ├── newCorrelations.ts
│ │ │ ├── table.ts
│ │ │ ├── tags.ts
│ │ │ ├── trackable.ts
│ │ │ └── welcome.ts
│ ├── form
│ │ ├── data.ts
│ │ ├── data
│ │ │ ├── boolean.ts
│ │ │ ├── date-time.ts
│ │ │ ├── date.ts
│ │ │ ├── hierarchy.ts
│ │ │ ├── number.ts
│ │ │ ├── rich-text.ts
│ │ │ ├── text.ts
│ │ │ ├── time-elapsed.ts
│ │ │ └── time-of-day.ts
│ │ ├── display.ts
│ │ ├── display
│ │ │ ├── hierarchy.ts
│ │ │ ├── input.ts
│ │ │ ├── range.ts
│ │ │ ├── rich-input.ts
│ │ │ ├── segmented.ts
│ │ │ ├── select.ts
│ │ │ └── text-area.ts
│ │ ├── form.ts
│ │ ├── suggestions.ts
│ │ ├── ui.ts
│ │ └── validation.ts
│ ├── goal
│ │ ├── goal.ts
│ │ ├── suggestions.ts
│ │ └── ui.ts
│ ├── journal
│ │ ├── journal.ts
│ │ └── search
│ │ │ ├── date.ts
│ │ │ ├── freeText.ts
│ │ │ ├── search.ts
│ │ │ ├── tag.ts
│ │ │ ├── trackable.ts
│ │ │ └── ui.ts
│ ├── notification
│ │ └── notification.ts
│ ├── onboarding
│ │ └── onboarding.ts
│ ├── primitive
│ │ └── primitive.ts
│ ├── reflection
│ │ ├── reflection.ts
│ │ ├── suggestions.ts
│ │ ├── ui.ts
│ │ └── widgets
│ │ │ ├── checklist.ts
│ │ │ ├── form.ts
│ │ │ ├── table.ts
│ │ │ └── tags.ts
│ ├── sharedWidgets
│ │ ├── checklist
│ │ │ └── checklist.ts
│ │ └── table
│ │ │ └── table.ts
│ ├── tag
│ │ ├── suggestions.ts
│ │ └── tag.ts
│ ├── trackable
│ │ ├── suggestions.ts
│ │ ├── trackable.ts
│ │ └── ui.ts
│ ├── ui
│ │ ├── button.ts
│ │ ├── context-menu.ts
│ │ ├── dropdown.ts
│ │ ├── dynamicInput.ts
│ │ ├── modal.ts
│ │ ├── router.svelte.ts
│ │ ├── segmented.ts
│ │ └── sidebar.ts
│ └── variable
│ │ ├── time
│ │ ├── serialization.ts
│ │ └── time.ts
│ │ ├── ui.ts
│ │ └── variable.ts
├── services.ts
├── services
│ ├── analytics
│ │ ├── analytics.ts
│ │ ├── display.ts
│ │ ├── history.ts
│ │ ├── ignore.ts
│ │ └── settings.ts
│ ├── dashboard
│ │ ├── dashboard.ts
│ │ └── widget.ts
│ ├── deletion
│ │ └── deletion.ts
│ ├── export
│ │ ├── complete
│ │ │ └── complete.ts
│ │ └── formEntries
│ │ │ └── export.ts
│ ├── form
│ │ ├── form.ts
│ │ └── template.ts
│ ├── goal
│ │ └── goal.ts
│ ├── import
│ │ ├── complete
│ │ │ ├── complete.ts
│ │ │ └── oldFormat.ts
│ │ └── formEntries
│ │ │ ├── csv.ts
│ │ │ ├── import.ts
│ │ │ └── json.ts
│ ├── journal
│ │ ├── journal.ts
│ │ └── search.ts
│ ├── notification
│ │ ├── native.ts
│ │ ├── notification.ts
│ │ └── web.ts
│ ├── observer.ts
│ ├── reflection
│ │ └── reflection.ts
│ ├── tag
│ │ ├── category.ts
│ │ ├── entry.ts
│ │ └── tag.ts
│ ├── trackable
│ │ ├── category.ts
│ │ └── trackable.ts
│ └── variable
│ │ ├── dependencies.ts
│ │ ├── filtering.ts
│ │ ├── graph.ts
│ │ ├── types
│ │ ├── aggregate.ts
│ │ ├── calculation.ts
│ │ ├── goal.ts
│ │ ├── goalStreak.ts
│ │ ├── group.ts
│ │ ├── latest.ts
│ │ ├── list.ts
│ │ ├── serialization.ts
│ │ └── tag.ts
│ │ └── variable.ts
├── stores.ts
├── stores
│ ├── analytics
│ │ ├── analytics.ts
│ │ ├── settings.ts
│ │ ├── tags.ts
│ │ └── trackable.ts
│ ├── cached.ts
│ ├── dashboard
│ │ ├── dashboard.ts
│ │ └── widget
│ │ │ ├── chart.ts
│ │ │ ├── entryRow.ts
│ │ │ ├── goal.ts
│ │ │ ├── insights.ts
│ │ │ ├── metric.ts
│ │ │ └── trackable.ts
│ ├── deletion
│ │ └── deletion.ts
│ ├── export
│ │ ├── complete.ts
│ │ └── formEntry.ts
│ ├── form
│ │ └── form.ts
│ ├── goal
│ │ ├── goal.ts
│ │ └── value.ts
│ ├── import
│ │ ├── complete.ts
│ │ └── formEntry.ts
│ ├── journal
│ │ ├── entry.ts
│ │ ├── grouped.ts
│ │ ├── search.ts
│ │ └── tag.ts
│ ├── onboarding
│ │ └── onboarding.ts
│ ├── reflection
│ │ └── reflection.ts
│ ├── sharedWidgets
│ │ ├── checklist
│ │ │ └── checklist.ts
│ │ └── table
│ │ │ └── table.ts
│ ├── store.ts
│ ├── tag
│ │ ├── categorized.ts
│ │ ├── category.ts
│ │ ├── tag.ts
│ │ └── value.ts
│ ├── trackable
│ │ ├── categorized.ts
│ │ ├── category.ts
│ │ ├── trackable.ts
│ │ └── value.ts
│ ├── ui
│ │ ├── drawer.ts
│ │ └── weekStart.ts
│ └── variable
│ │ ├── edit.ts
│ │ ├── editState.ts
│ │ ├── value.ts
│ │ └── variable.ts
├── swSetup.ts
├── util
│ ├── array.ts
│ ├── category.ts
│ ├── color.ts
│ ├── event.ts
│ ├── file.ts
│ ├── local.ts
│ ├── long-press.ts
│ ├── math.ts
│ ├── perf.ts
│ ├── promise.ts
│ ├── time
│ │ ├── format.ts
│ │ └── simple.ts
│ └── window.ts
├── views
│ ├── analytics
│ │ ├── AnalyticsDetailView.svelte
│ │ └── AnalyticsView.svelte
│ ├── dashboard
│ │ └── DashboardView.svelte
│ ├── form
│ │ └── FormEditorView.svelte
│ ├── goal
│ │ ├── GoalEditorView.svelte
│ │ └── GoalView.svelte
│ ├── journal
│ │ ├── JournalSearchView.svelte
│ │ └── JournalView.svelte
│ ├── onboarding
│ │ └── OnboardingView.svelte
│ ├── reflection
│ │ ├── ReflectionEditorView.svelte
│ │ └── ReflectionListView.svelte
│ ├── settings
│ │ └── SettingsView.svelte
│ ├── tag
│ │ └── TagsView.svelte
│ └── trackable
│ │ └── TrackableView.svelte
└── vite-env.d.ts
├── svelte.config.js
├── tailwind.config.js
├── tests
├── analytics
│ ├── basic.test.ts
│ ├── correlation.test.ts
│ ├── history.test.ts
│ ├── insights.test.ts
│ ├── raw.test.ts
│ ├── tags.test.ts
│ └── weekday.test.ts
├── common.ts
├── dummy-collections.ts
├── graph
│ ├── edit.test.ts
│ ├── filter.test.ts
│ ├── goal.test.ts
│ ├── goalStreak.test.ts
│ ├── graph.test.ts
│ ├── group.test.ts
│ ├── latest.test.ts
│ └── tag.test.ts
├── journal
│ └── search.test.ts
├── primitive.test.ts
├── simple-time.test.ts
└── time-scope.test.ts
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
├── vite.config.ts
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | Perfice.drawio
27 | .$Perfice.drawio.bkp
28 |
29 | dev-dist
30 | deploy-apk.sh
31 | deploy.sh
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["svelte.svelte-vscode"]
3 | }
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # perfice
2 | Open source self-tracking app in Svelte 5.
3 |
--------------------------------------------------------------------------------
/android/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build/*
2 | !/build/.npmkeep
3 |
--------------------------------------------------------------------------------
/android/app/capacitor.build.gradle:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
2 |
3 | android {
4 | compileOptions {
5 | sourceCompatibility JavaVersion.VERSION_21
6 | targetCompatibility JavaVersion.VERSION_21
7 | }
8 | }
9 |
10 | apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
11 | dependencies {
12 | implementation project(':capacitor-app')
13 | implementation project(':capacitor-filesystem')
14 | implementation project(':capacitor-local-notifications')
15 | implementation project(':capacitor-share')
16 |
17 | }
18 |
19 |
20 | if (hasProperty('postBuildExtras')) {
21 | postBuildExtras()
22 | }
23 |
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.getcapacitor.myapp;
2 |
3 | import static org.junit.Assert.*;
4 |
5 | import android.content.Context;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 | import androidx.test.platform.app.InstrumentationRegistry;
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * @see Testing documentation
15 | */
16 | @RunWith(AndroidJUnit4.class)
17 | public class ExampleInstrumentedTest {
18 |
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
23 |
24 | assertEquals("com.getcapacitor.app", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/android/app/src/main/java/dev/adoe/perfice/MainActivity.java:
--------------------------------------------------------------------------------
1 | package io.perfice.app;
2 |
3 | import android.os.Bundle;
4 | import android.webkit.WebView;
5 |
6 | import com.getcapacitor.BridgeActivity;
7 |
8 | public class MainActivity extends BridgeActivity {
9 | @Override
10 | public void onCreate(Bundle savedInstanceState) {
11 | super.onCreate(savedInstanceState);
12 | }
13 |
14 | @Override
15 | public void onStart() {
16 | super.onStart();
17 | WebView webview = getBridge().getWebView();
18 | webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-ldpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-ldpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-ldpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-ldpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-land-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-land-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-night/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-night/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-ldpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-ldpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-ldpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-ldpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-port-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable-port-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/small_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable/small_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/drawable/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFFFFF
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Perfice
4 | Perfice
5 | io.perfice.app
6 | io.perfice.app
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
11 |
12 |
17 |
18 |
19 |
22 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.getcapacitor.myapp;
2 |
3 | import static org.junit.Assert.*;
4 |
5 | import org.junit.Test;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 |
14 | @Test
15 | public void addition_isCorrect() throws Exception {
16 | assertEquals(4, 2 + 2);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | mavenCentral()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:8.7.2'
11 | classpath 'com.google.gms:google-services:4.4.2'
12 |
13 | // NOTE: Do not place your application dependencies here; they belong
14 | // in the individual module build.gradle files
15 | }
16 | }
17 |
18 | apply from: "variables.gradle"
19 |
20 | allprojects {
21 | repositories {
22 | google()
23 | mavenCentral()
24 | }
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/android/capacitor.settings.gradle:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
2 | include ':capacitor-android'
3 | project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
4 |
5 | include ':capacitor-app'
6 | project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
7 |
8 | include ':capacitor-filesystem'
9 | project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android')
10 |
11 | include ':capacitor-local-notifications'
12 | project(':capacitor-local-notifications').projectDir = new File('../node_modules/@capacitor/local-notifications/android')
13 |
14 | include ':capacitor-share'
15 | project(':capacitor-share').projectDir = new File('../node_modules/@capacitor/share/android')
16 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
19 | # AndroidX package structure to make it clearer which packages are bundled with the
20 | # Android operating system, and which are packaged with your app's APK
21 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
22 | android.useAndroidX=true
23 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 | include ':capacitor-cordova-android-plugins'
3 | project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
4 |
5 | apply from: 'capacitor.settings.gradle'
--------------------------------------------------------------------------------
/android/variables.gradle:
--------------------------------------------------------------------------------
1 | ext {
2 | minSdkVersion = 23
3 | compileSdkVersion = 35
4 | targetSdkVersion = 35
5 | androidxActivityVersion = '1.9.2'
6 | androidxAppCompatVersion = '1.7.0'
7 | androidxCoordinatorLayoutVersion = '1.2.0'
8 | androidxCoreVersion = '1.15.0'
9 | androidxFragmentVersion = '1.8.4'
10 | coreSplashScreenVersion = '1.0.1'
11 | androidxWebkitVersion = '1.12.1'
12 | junitVersion = '4.13.2'
13 | androidxJunitVersion = '1.2.1'
14 | androidxEspressoCoreVersion = '3.6.1'
15 | cordovaAndroidVersion = '10.1.1'
16 | }
--------------------------------------------------------------------------------
/assets/icon-background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/assets/icon-background.png
--------------------------------------------------------------------------------
/assets/icon-foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/assets/icon-foreground.png
--------------------------------------------------------------------------------
/assets/icon-only.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/assets/icon-only.png
--------------------------------------------------------------------------------
/assets/splash-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/assets/splash-dark.png
--------------------------------------------------------------------------------
/assets/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/assets/splash.png
--------------------------------------------------------------------------------
/capacitor.config.ts:
--------------------------------------------------------------------------------
1 | import type {CapacitorConfig} from '@capacitor/cli';
2 |
3 | const config: CapacitorConfig = {
4 | appId: 'io.perfice.app',
5 | appName: 'Perfice',
6 | webDir: 'dist',
7 | plugins: {
8 | LocalNotifications: {
9 | smallIcon: "res://drawable/small_icon",
10 | largeIcon: "res://drawable/splash",
11 | iconColor: "#16A34A"
12 | }
13 | }
14 | };
15 |
16 | export default config;
17 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
12 |
13 |
14 | Perfice
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/analytics-onboarding-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/analytics-onboarding-mobile.png
--------------------------------------------------------------------------------
/public/analytics-onboarding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/analytics-onboarding.png
--------------------------------------------------------------------------------
/public/dashboard-onboarding-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/dashboard-onboarding-mobile.png
--------------------------------------------------------------------------------
/public/dashboard-onboarding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/dashboard-onboarding.png
--------------------------------------------------------------------------------
/public/favicon-128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/favicon-128x128.png
--------------------------------------------------------------------------------
/public/favicon-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/favicon-512x512.png
--------------------------------------------------------------------------------
/public/favicon-64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/favicon-64x64.png
--------------------------------------------------------------------------------
/public/goals-onboarding-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/goals-onboarding-mobile.png
--------------------------------------------------------------------------------
/public/goals-onboarding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/goals-onboarding.png
--------------------------------------------------------------------------------
/public/sw.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/sw.js
--------------------------------------------------------------------------------
/public/tags-onboarding-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/tags-onboarding-mobile.png
--------------------------------------------------------------------------------
/public/tags-onboarding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/tags-onboarding.png
--------------------------------------------------------------------------------
/public/trackables-onboarding-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/trackables-onboarding-mobile.png
--------------------------------------------------------------------------------
/public/trackables-onboarding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/public/trackables-onboarding.png
--------------------------------------------------------------------------------
/src/assets/OpenMoji-black-glyf.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/p0lloc/perfice/591c0e4256dee64e1f1960e37bcf9ea53c47e393/src/assets/OpenMoji-black-glyf.woff2
--------------------------------------------------------------------------------
/src/assets/goal_suggestions.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Daily steps",
4 | "color": "#ff0000",
5 | "conditions": [
6 | {
7 | "type": "COMPARISON",
8 | "value": {
9 | "source": "steps",
10 | "operator": "GREATER_THAN_EQUAL",
11 | "target": 5000
12 | }
13 | }
14 | ]
15 | },
16 | {
17 | "name": "Good sleep",
18 | "color": "#ff0000",
19 | "conditions": [
20 | {
21 | "type": "COMPARISON",
22 | "value": {
23 | "source": "steps",
24 | "operator": "GREATER_THAN_EQUAL",
25 | "target": 5000
26 | }
27 | }
28 | ]
29 | }
30 | ]
--------------------------------------------------------------------------------
/src/components/analytics/QuestionLabel.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
19 |
20 |
25 |
--------------------------------------------------------------------------------
/src/components/analytics/details/CorrelationBar.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | {#if !full && positive}
10 |
11 | {/if}
12 |
24 |
25 | {#if !full && negative}
26 |
27 | {/if}
28 |
29 |
--------------------------------------------------------------------------------
/src/components/analytics/details/CorrelationMessage.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 | {display.between}
11 |
12 |
--------------------------------------------------------------------------------
/src/components/analytics/details/tag/TagWeekDayAnalytics.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
Week days
11 |
12 | Most tagged on {WEEK_DAYS_SHORT[analytics.max]}, least tagged on {WEEK_DAYS_SHORT[analytics.min]}
13 |
14 |
15 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/components/analytics/details/trackable/BasicCategoricalAnalyticsRow.svelte:
--------------------------------------------------------------------------------
1 |
8 |
14 |
20 |
--------------------------------------------------------------------------------
/src/components/analytics/tag/AnalyticsTagView.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | {#await $res}
11 | Loading...
12 | {:then data}
13 | {#each data.results as value(value.tag.id)}
14 |
21 | {/each}
22 | {/await}
23 |
24 |
--------------------------------------------------------------------------------
/src/components/analytics/trackable/AnalyticsTrackableLineChart.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/src/components/base/button/Button.svelte:
--------------------------------------------------------------------------------
1 |
18 |
19 |
22 |
--------------------------------------------------------------------------------
/src/components/base/button/CardButton.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/base/button/HorizontalPlusButton.svelte:
--------------------------------------------------------------------------------
1 |
8 |
14 |
--------------------------------------------------------------------------------
/src/components/base/button/IconButton.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
16 |
--------------------------------------------------------------------------------
/src/components/base/button/LineButton.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
10 |
11 |
16 |
--------------------------------------------------------------------------------
/src/components/base/button/PopupIconButton.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/base/button/SelectCardButton.svelte:
--------------------------------------------------------------------------------
1 |
27 |
28 |
32 |
--------------------------------------------------------------------------------
/src/components/base/calendarScroll/CalendarScrollItem.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
18 |
--------------------------------------------------------------------------------
/src/components/base/card/GenericActionsCard.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 | {#if icon != null}
17 |
18 | {/if}
19 |
20 | {text}
21 |
22 |
23 | {@render actions()}
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/components/base/card/GenericEditDeleteCard.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 | {#snippet actions()}
18 |
19 |
20 | {/snippet}
21 |
--------------------------------------------------------------------------------
/src/components/base/card/TitledCard.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 | {#if icon != null}
21 |
22 | {/if}
23 |
24 |
25 |
{title}
26 |
{description}
27 |
28 |
29 |
30 | {@render suffix?.()}
31 |
32 |
33 |
--------------------------------------------------------------------------------
/src/components/base/color/ColorPickerButton.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 | onChange?.(e.currentTarget.value)}>
7 |
--------------------------------------------------------------------------------
/src/components/base/contextMenu/ContextMenuButtons.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | {#each buttons as button}
11 |
18 | {/each}
19 |
20 |
--------------------------------------------------------------------------------
/src/components/base/contextMenu/PopupContextMenuButton.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/components/base/dropdown/BindableDropdownButton.svelte:
--------------------------------------------------------------------------------
1 |
18 |
19 | {
20 | return {
21 | ...i,
22 | action: () => change(i.value),
23 | }
24 | })}/>
25 |
--------------------------------------------------------------------------------
/src/components/base/dynamic/DynamicLabel.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | {@render children()}
9 |
10 |
--------------------------------------------------------------------------------
/src/components/base/fileButton/FileButton.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
33 |
34 |
--------------------------------------------------------------------------------
/src/components/base/gesture/SwipeDetector.svelte:
--------------------------------------------------------------------------------
1 |
26 |
27 |
--------------------------------------------------------------------------------
/src/components/base/icon/Icon.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | {name !== "" ? name : "\u2b50\ufe0f"}
7 |
8 |
--------------------------------------------------------------------------------
/src/components/base/iconLabel/IconLabel.svelte:
--------------------------------------------------------------------------------
1 |
8 |
12 |
--------------------------------------------------------------------------------
/src/components/base/iconLabel/IconLabelBetween.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 | {@render children()}
13 |
14 |
--------------------------------------------------------------------------------
/src/components/base/inline/InlineCreateInput.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 |
26 |
--------------------------------------------------------------------------------
/src/components/base/inline/InlineCreateLineButton.svelte:
--------------------------------------------------------------------------------
1 |
15 | {#if addingCategory}
16 |
17 | addingCategory = false}
18 | onSubmit={(name) => onSubmit(name)}/>
19 |
20 | {:else}
21 |
22 | {/if}
23 |
--------------------------------------------------------------------------------
/src/components/base/invertedSegmented/InvertedSegment.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
17 |
18 |
27 |
--------------------------------------------------------------------------------
/src/components/base/invertedSegmented/InvertedSegmentedControl.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 |
23 | {#each segments as segment}
24 | onSegmentClick(segment)}>
26 |
27 | {#if segment.prefix != null}
28 |
29 | {/if}
30 | {segment.name}
31 | {#if segment.suffix != null}
32 |
33 | {/if}
34 |
35 | {/each}
36 |
37 |
--------------------------------------------------------------------------------
/src/components/base/modal/ModalFooterContainer.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | {@render children?.()}
7 |
8 |
--------------------------------------------------------------------------------
/src/components/base/modal/generic/GenericDeleteModal.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
--------------------------------------------------------------------------------
/src/components/base/modal/generic/GenericEntityModal.svelte:
--------------------------------------------------------------------------------
1 |
27 |
28 |
30 | {message}
31 |
32 |
--------------------------------------------------------------------------------
/src/components/base/segmented/Segment.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
28 |
29 |
46 |
--------------------------------------------------------------------------------
/src/components/base/timeScope/RangedTimeScopePicker.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/components/base/timeScope/SimpleTimeScopePicker.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/src/components/base/title/Title.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
{title}
14 |
15 |
--------------------------------------------------------------------------------
/src/components/base/title/TitleAndCalendar.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/components/base/weekDays/WeekDays.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 |
23 | {#each Array(7) as _, i}
24 |
25 | onWeekDayChange(i)}/>
27 | {WEEK_DAYS_SHORT[i][0]}
28 |
29 | {/each}
30 |
--------------------------------------------------------------------------------
/src/components/chart/CanvasChartRenderer.svelte:
--------------------------------------------------------------------------------
1 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/add/AddWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 | {#if mobile}
13 | The new widget will be added to the bottom of the dashboard.
14 | {/if}
15 |
16 |
17 | {#each definitions as definition}
18 | action.onClick(definition.getType(), mobile)}/>
19 | {/each}
20 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/checklist/EditChecklistWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/entryRow/EditEntryRowWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/insights/EditInsightsWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
17 | Time scope
18 | onChange({...settings, timeScope: v})}
20 | items={SIMPLE_TIME_SCOPE_TYPES}/>
21 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/newCorrelations/EditNewCorrelationsWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/table/EditTableWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/trackable/EditTrackableWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
23 | {#await availableTrackables}
24 | Loading...
25 | {:then value}
26 |
27 | Trackable
28 |
30 |
31 |
32 | {/await}
33 |
--------------------------------------------------------------------------------
/src/components/dashboard/sidebar/edit/types/welcome/EditWelcomeWidgetSidebar.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/checkList/ChecklistEntry.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
14 | {name}
15 |
16 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/entryRow/EntryRowItem.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | {#if entry.icon}
11 |
12 | {:else}
13 | {entry.value}
14 | {/if}
15 | {formatTimestampHHMM(entry.timestamp)}
16 |
17 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/goal/DashboardGoalWidget.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
20 | {#await $res}
21 | Please select a goal
22 | {:then value}
23 |
24 |
25 | {/await}
26 |
27 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/table/DashboardTableWidget.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/table/TableWidgetEntry.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 | {entry.prefix}
10 |
11 |
{entry.suffix}
12 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/table/TableWidgetGroupHeader.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | {name}
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/components/dashboard/types/trackable/DashboardTrackableWidget.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 | {#await $res}
22 | Loading...
23 | {:then value}
24 | {}} onLog={() => onLog(value.trackable)}/>
26 | {/await}
--------------------------------------------------------------------------------
/src/components/dashboard/types/welcome/DashboardWelcomeWidget.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
Good morning!
15 |
Today is going to be a great day!
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/components/form/editor/data/hierarchy/EditHierarchyQuestionSettings.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 |
23 | {}}/>
24 |
25 |
--------------------------------------------------------------------------------
/src/components/form/editor/display/hierarchy/EditHierarchyQuestionDisplaySettings.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 | Show only last option
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/form/editor/display/range/EditRangeQuestionSettings.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 | Step
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/form/editor/display/segmented/EditSegmentedOptionCard.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/components/form/editor/display/select/EditSelectGrid.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
Items per row
18 |
19 |
20 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/form/editor/display/select/EditSelectOptionCard.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
11 |
12 |
--------------------------------------------------------------------------------
/src/components/form/editor/sidebar/SidebarDropdownHeader.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
24 |
--------------------------------------------------------------------------------
/src/components/form/fields/hierarchy/HierarchyButton.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
13 |
14 |
19 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/BooleanInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/DateInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/DateTimeInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/TimeElapsedInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/TimeOfDayInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/components/form/fields/input/VanillaInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
20 |
--------------------------------------------------------------------------------
/src/components/form/fields/range/RangeFormField.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 | onChange(e.detail.value)}
15 | pips
16 | springValues={{ stiffness: 1.0, damping: 1.0 }}
17 | all="label"
18 | value={value} min={data.min ?? 0} max={data.max ?? 100} step={display.step ?? 1} {disabled}/>
--------------------------------------------------------------------------------
/src/components/form/fields/richInput/RichInputFormField.svelte:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/src/components/form/fields/segmented/SegmentedFormField.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 | {
13 | return {
14 | name: o.text,
15 | value: o.value.value,
16 | }
17 | })} {onChange}/>
18 |
--------------------------------------------------------------------------------
/src/components/form/fields/select/SelectOptionButton.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
26 |
27 |
32 |
--------------------------------------------------------------------------------
/src/components/form/fields/textArea/TextAreaFormField.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
21 |
--------------------------------------------------------------------------------
/src/components/form/valueInput/PrimitiveVanillaInputField.svelte:
--------------------------------------------------------------------------------
1 |
29 |
30 |
32 |
--------------------------------------------------------------------------------
/src/components/goal/GoalMetIndicator.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 | {#if value}
11 |
12 | {:else}
13 |
14 | {/if}
15 |
--------------------------------------------------------------------------------
/src/components/goal/GoalNewCard.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
16 |
--------------------------------------------------------------------------------
/src/components/goal/editor/condition/comparison/AddSourceButton.svelte:
--------------------------------------------------------------------------------
1 |
21 |
22 | Add source
23 |
--------------------------------------------------------------------------------
/src/components/goal/editor/sidebar/AddConditionSidebar.svelte:
--------------------------------------------------------------------------------
1 |
28 |
29 |
30 | {#each GOAL_CONDITION_TYPES as type}
31 | onSelect(type.type)}
36 | />
37 | {/each}
38 |
39 |
--------------------------------------------------------------------------------
/src/components/goal/editor/sidebar/AddSourceSidebar.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 | {#each COMPARISON_SOURCE_TYPES as type}
22 | onSelect(type.type)}
27 | />
28 | {/each}
29 |
30 |
--------------------------------------------------------------------------------
/src/components/goal/multi/ConditionEntry.svelte:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/goal/multi/GoalMetConditionEntry.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 | {value.name}
11 |
12 |
--------------------------------------------------------------------------------
/src/components/goal/multi/MultiConditionRenderer.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | {#each value as val}
10 |
11 | {/each}
12 |
13 |
--------------------------------------------------------------------------------
/src/components/goal/single/ComparisonSingleCondition.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 | {formatComparisonNumberValues(first, second, dataType, unit)}
13 |
14 |
--------------------------------------------------------------------------------
/src/components/goal/single/GoalMetSingleCondition.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 | {value.name}
11 |
12 |
--------------------------------------------------------------------------------
/src/components/goal/single/SingleConditionRenderer.svelte:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalCardBase.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
19 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalCardHeader.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 | {@render children()}
19 |
20 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalDayDate.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
10 |
11 | {MONTHS_SHORT[date.getMonth()]}
12 |
13 |
{dayOfMonth}
14 |
{weekDay.toUpperCase()}
15 |
16 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalEntryTimestamp.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | {formatTimestampHHMM(timestamp)}
9 |
10 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalSummaryContainer.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | {@render children()}
9 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/src/components/journal/day/JournalTagEntries.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 | {#if tagEntries.length > 0}
17 |
18 | {#each tagEntries as entry (entry.id)}
19 | e.entry.id === entry.id)}
20 | onClick={() => onClick(entry)}>
21 | {entry.tag.name}
22 |
23 |
24 | {/each}
25 |
26 | {/if}
27 |
--------------------------------------------------------------------------------
/src/components/journal/search/common/ByCategoryFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 | onChange({...filter, categories: v})} noneText="None"
16 | value={filter.categories}
17 | items={items}/>
18 |
19 |
--------------------------------------------------------------------------------
/src/components/journal/search/common/OneOfFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 | onChange({...filter, values: v})} noneText="None" value={filter.values}
16 | items={items}/>
17 |
18 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/GenericFilterContainer.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
17 | {name}
18 | {@render children()}
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/date/DateSearchOptions.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 | {#if converted.type !== TimeRangeType.ALL && ranged.getStart() === ranged.getEnd()}
14 |
15 | Empty date range, to select a single date, set "To" as the next day.
16 |
17 | {/if}
18 | onChange({...options, range: v.convertToRange()})}/>
20 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/freeText/FreeTextSearchOptions.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
10 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/tag/TagSearchActions.svelte:
--------------------------------------------------------------------------------
1 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/tag/filters/TagByCategoryFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/tag/filters/TagOneOfFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
18 |
19 | ({ name: t.name, value: t.id }))}
21 | {onDelete}
22 | {onChange}
23 | {filter}
24 | />
25 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/trackable/TrackableSearchActions.svelte:
--------------------------------------------------------------------------------
1 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/trackable/filters/TrackableByCategoryFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 |
22 |
--------------------------------------------------------------------------------
/src/components/journal/search/types/trackable/filters/TrackableOneOfFilterCard.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 | ({name: t.name, value: t.id}))}
15 | onDelete={onDelete} onChange={onChange} filter={filter}/>
--------------------------------------------------------------------------------
/src/components/mobile/MobileTopBar.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 | {#if leading != null}
16 | {@render leading()}
17 | {:else}
18 |
19 | {/if}
20 |
21 |
22 | {@render actions?.()}
23 |
24 |
25 | {title}
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/components/onboarding/OnboardingImage.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |

10 |

11 |
12 |
13 |
14 |
{page.title}
15 |
{page.description}
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/components/onboarding/OnboardingSelect.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 | {page.title}
13 | {page.description}
14 |
--------------------------------------------------------------------------------
/src/components/reflection/GlobalReflectionModal.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/components/reflection/editor/notifications/NotificationCard.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 |
22 |
--------------------------------------------------------------------------------
/src/components/reflection/editor/sidebar/widget/ReflectionEditChecklistWidget.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/reflection/editor/sidebar/widget/ReflectionEditFormWidget.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 | Form
22 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/reflection/editor/sidebar/widget/ReflectionEditTableWidget.svelte:
--------------------------------------------------------------------------------
1 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/reflection/editor/sidebar/widget/ReflectionEditTagsWidget.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 | Categories
21 | Select which categories to show
22 |
23 | {#await availableCategories then val}
24 | onChange({...settings, categories: v})}/>
26 | {/await}
27 |
--------------------------------------------------------------------------------
/src/components/reflection/modal/ReflectionPageButton.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
15 |
--------------------------------------------------------------------------------
/src/components/settings/SettingsDataExport.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | Export data
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/components/settings/SettingsDataImport.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 | Import data
22 |
23 | newFormat = v}/>
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/components/settings/SettingsDeleteData.svelte:
--------------------------------------------------------------------------------
1 |
18 |
19 |
22 |
23 | Delete data
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/components/sharedWidgets/checklist/EditChecklistConditionCard.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
14 |
15 |
--------------------------------------------------------------------------------
/src/components/sharedWidgets/checklist/EditTagChecklistCondition.svelte:
--------------------------------------------------------------------------------
1 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/components/sidebar/SidebarButton.svelte:
--------------------------------------------------------------------------------
1 |
23 |
31 |
--------------------------------------------------------------------------------
/src/components/sidebar/drawer/DrawerButton.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
22 |
--------------------------------------------------------------------------------
/src/components/sidebar/drawer/DrawerOpenButton.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 | setTimeout(toggleDrawer)}/>
8 |
--------------------------------------------------------------------------------
/src/components/tag/FilteredTagCategories.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | {#each categories as category (category.category?.id)}
14 | {#if visibleCategories.length === 0 || visibleCategories.includes(category.category?.id ?? UNCATEGORIZED_TAG_CATEGORY_ID)}
15 |
16 |
{category.category?.name ?? UNCATEGORIZED_NAME}
17 |
18 | {#each category.items as tag}
19 | {@render item(tag)}
20 | {/each}
21 |
22 |
23 | {/if}
24 | {/each}
25 |
26 |
--------------------------------------------------------------------------------
/src/components/tag/TagButtonBase.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
15 |
--------------------------------------------------------------------------------
/src/components/tag/TagCard.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 | {tag.name}
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/components/tag/TagValueCard.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 |
21 | {#await $tagEntry then entryId}
22 | onClick(entryId)}/>
23 | {/await}
24 |
25 |
--------------------------------------------------------------------------------
/src/components/trackable/card/chart/ChartTrackableRenderer.svelte:
--------------------------------------------------------------------------------
1 |
22 |
23 |
24 |
25 | i.toString())}/>
28 |
29 |
--------------------------------------------------------------------------------
/src/components/trackable/card/value/table/TableTrackableRenderer.svelte:
--------------------------------------------------------------------------------
1 |
13 |
22 |
--------------------------------------------------------------------------------
/src/components/trackable/card/value/table/TrackableTableEntry.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 |
26 | {formatAnswersIntoRepresentation(entry.value, representation)}
27 |
28 |
29 | {formatTimestampHHMM(entry.timestamp)}
30 |
31 |
32 |
--------------------------------------------------------------------------------
/src/components/trackable/modals/edit/general/EditTrackableCategory.svelte:
--------------------------------------------------------------------------------
1 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/components/trackable/modals/edit/general/tally/EditTrackableTallyCard.svelte:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/src/components/trackable/modals/edit/general/value/EditTrackableValueRepresentation.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | v.id}
16 | getDynamicText={(v) => v.name}/>
17 |
18 |
--------------------------------------------------------------------------------
/src/components/variable/edit/EditBackButton.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
14 |
--------------------------------------------------------------------------------
/src/components/variable/edit/EditVariableName.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/db/dexie/analytics.ts:
--------------------------------------------------------------------------------
1 | import type {AnalyticsSettingsCollection} from "@perfice/db/collections";
2 | import type {EntityTable} from "dexie";
3 | import type {AnalyticsSettings} from "@perfice/model/analytics/analytics";
4 |
5 | export class DexieAnalyticsSettingsCollection implements AnalyticsSettingsCollection {
6 |
7 | private table: EntityTable;
8 |
9 | constructor(table: EntityTable) {
10 | this.table = table;
11 | }
12 |
13 | async insertSettings(settings: AnalyticsSettings): Promise {
14 | await this.table.add(settings);
15 | }
16 |
17 | async updateSettings(settings: AnalyticsSettings): Promise {
18 | await this.table.put(settings);
19 | }
20 |
21 | async getAllSettings(): Promise {
22 | return this.table.toArray();
23 | }
24 |
25 | async getSettingsByFormId(formId: string): Promise {
26 | return this.table.get(formId);
27 | }
28 |
29 | async deleteSettingsByFormId(formId: string): Promise {
30 | await this.table.delete(formId);
31 | }
32 |
33 | }
--------------------------------------------------------------------------------
/src/db/dexie/goal.ts:
--------------------------------------------------------------------------------
1 | import type {EntityTable} from "dexie";
2 | import type {GoalCollection} from "@perfice/db/collections";
3 | import type {Goal} from "@perfice/model/goal/goal";
4 |
5 | export class DexieGoalCollection implements GoalCollection {
6 |
7 | private table: EntityTable;
8 |
9 | constructor(table: EntityTable) {
10 | this.table = table;
11 | }
12 |
13 | getGoalByVariableId(goalVariableId: string): Promise {
14 | return this.table.where("variableId").equals(goalVariableId).first();
15 | }
16 |
17 | async getGoalById(id: string): Promise {
18 | return this.table.get(id);
19 | }
20 |
21 | async getGoals(): Promise {
22 | return this.table.toArray();
23 | }
24 |
25 | async createGoal(goal: Goal): Promise {
26 | await this.table.add(goal);
27 | }
28 |
29 | async updateGoal(goal: Goal): Promise {
30 | await this.table.put(goal);
31 | }
32 |
33 | async deleteGoalById(id: string): Promise {
34 | await this.table.delete(id);
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/db/dexie/migration.ts:
--------------------------------------------------------------------------------
1 | import type {DexieDB} from "@perfice/db/dexie/db";
2 | import type {Table} from "dexie";
3 | import type {Migration, Migrator} from "@perfice/db/migration/migration";
4 |
5 | export class DexieMigrator implements Migrator {
6 | private readonly db: DexieDB;
7 |
8 | constructor(db: DexieDB) {
9 | this.db = db;
10 | }
11 |
12 | async applyMigration(migration: Migration): Promise {
13 | // @ts-ignore
14 | let collection: Table