├── .dockerignore ├── .eslintrc.js ├── .github └── workflows │ └── publish.yaml ├── .gitignore ├── .nvmrc ├── .prettierrc ├── .vscode ├── extensions.json └── settings.json ├── 20230801_update.md ├── Dockerfile ├── LICENSE ├── README.md ├── RELEASENOTES.md ├── babel.config.js ├── bin ├── nomie6-oss.6.1.zip ├── nomie6-oss.6.5-dn.zip ├── nomie6-oss.6.5.0-dn.zip ├── nomie6-oss.6.6.0-dn.zip ├── nomie6-oss.6.7.0-dn.zip ├── nomie6-oss.6.7.0dev-dn.zip ├── nomie6-oss.6.7.1-dn.zip ├── nomie6-oss.6.7.3-dn.zip ├── nomie6-oss.6.7.4-dn.zip ├── nomie6-oss.6.7.4dev-dn.zip └── nomie6-oss.latest.zip ├── build-tools ├── bundle-vendors.js ├── csv-generator.js ├── extract-language.js ├── generate-whats-new.js ├── generate-zip.js ├── get-todo.js ├── icons │ ├── generate.js │ └── icons.json └── move-resources.js ├── commitlint.config.js ├── cypress ├── actions │ ├── compose-note.js │ └── create-a-tracker.js ├── disabled │ └── _sm ├── fixtures │ └── example.json ├── integration │ ├── app-x │ │ └── app.js │ └── nomie6 │ │ ├── create-trackables.js │ │ ├── onboard.js │ │ └── timeline.js ├── plugins │ └── index.js └── support │ ├── commands.js │ └── index.js ├── index.html ├── jest.config.js ├── manifest.js ├── netlify.toml ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── .well-known │ └── apple-developer-merchantid-domain-association ├── _headers ├── app-icons │ ├── nomie-6-120.png │ ├── nomie-6-128.png │ ├── nomie-6-144.png │ ├── nomie-6-152.png │ ├── nomie-6-180.png │ ├── nomie-6-192.png │ ├── nomie-6-384.png │ ├── nomie-6-512.png │ ├── nomie-6-72.png │ ├── nomie-6-96.png │ ├── nomie6-head-120.png │ ├── nomie6-head-128.png │ ├── nomie6-head-144.png │ ├── nomie6-head-152.png │ ├── nomie6-head-180.png │ ├── nomie6-head-192.png │ ├── nomie6-head-384.png │ ├── nomie6-head-512.png │ ├── nomie6-head-72.png │ └── nomie6-head-96.png ├── content │ ├── privacy.md │ └── terms.md ├── favicon.png ├── images │ ├── awards │ │ ├── award-creator.svg │ │ ├── award-wordsmith.svg │ │ ├── nomie-6.svg │ │ ├── nomieer.svg │ │ ├── open-streak-1.svg │ │ ├── open-streak-14.svg │ │ ├── open-streak-2.svg │ │ ├── open-streak-30.svg │ │ ├── open-streak-365.svg │ │ ├── open-streak-5.svg │ │ ├── open-streak-7.svg │ │ ├── open-streak-90.svg │ │ ├── usage-1-year.svg │ │ ├── usage-10-year.svg │ │ ├── usage-2-year.svg │ │ ├── usage-3-year.svg │ │ ├── usage-4-year.svg │ │ ├── usage-5-year.svg │ │ ├── usage-6-year.svg │ │ ├── usage-7-year.svg │ │ ├── usage-8-year.svg │ │ └── usage-9-year.svg │ ├── editor-background.png │ ├── icon.png │ ├── icons │ │ ├── nomie-114.png │ │ ├── nomie-120.png │ │ ├── nomie-128.png │ │ ├── nomie-144.png │ │ ├── nomie-152.png │ │ ├── nomie-180.png │ │ ├── nomie-192.png │ │ ├── nomie-384.png │ │ ├── nomie-400.png │ │ ├── nomie-512.png │ │ ├── nomie-72.png │ │ ├── nomie-96.png │ │ ├── nomie-android-114.png │ │ ├── nomie-android-168.png │ │ ├── nomie-android-192.png │ │ ├── nomie-android-400.png │ │ ├── nomie-android-512.png │ │ ├── nomie-android-72.png │ │ └── nomie-android-96.png │ ├── logos │ │ ├── Blockstack-logo.png │ │ ├── DN-logo_grey.svg │ │ └── DN-logo_grey_beta.svg │ ├── map │ │ ├── map-marker.svg │ │ └── marker.svg │ ├── nomie-blue-type.png │ ├── nomie-head-on.png │ ├── nomie-splash.png │ ├── nomie-splash.svg │ ├── nomie-white-type.png │ ├── nomie-words.svg │ ├── onboard │ │ ├── nomie-history.png │ │ ├── nomie-homescreen.png │ │ └── nomie4.2.3.stats.png │ ├── pin.png │ ├── screens │ │ ├── blockstack.png │ │ ├── board.png │ │ ├── capture.png │ │ ├── homescreen.png │ │ └── stats.png │ └── widget-types │ │ ├── bar-chart.svg │ │ ├── display-value.svg │ │ ├── just-text.svg │ │ ├── last-used.svg │ │ ├── latest-note.svg │ │ ├── line-chart.svg │ │ ├── map.svg │ │ ├── min-max.svg │ │ ├── positivity-pie.svg │ │ └── streak.svg ├── js │ └── vendors.js ├── plugins │ └── 1.0 │ │ ├── connect.js │ │ └── connect.ts ├── privacy.md ├── robots.txt ├── screenshots │ ├── popmenu-screenshot.png │ ├── stats-screenshot.png │ └── track-screenshot.png ├── system │ └── index.html ├── templates │ ├── adhd-template.json │ ├── care-template.json │ ├── mood-template.json │ └── period-template.json └── version.json ├── src ├── App.svelte ├── AppKeyCommands.svelte ├── BootStore.ts ├── DynamicPage.svelte ├── components │ ├── alertbox │ │ ├── alertbox.svelte │ │ └── prompt.svelte │ ├── app-tab │ │ └── app-tab.svelte │ ├── auto-complete │ │ ├── auto-complete.svelte │ │ └── textarea-dropmenu.svelte │ ├── avatar │ │ ├── avatar.svelte │ │ └── trackable-avatar.svelte │ ├── back-button │ │ └── back-button.svelte │ ├── backdrop │ │ ├── BackdropStore2.ts │ │ ├── backdrop-modal.svelte │ │ ├── backdrop-store.ts │ │ ├── backdrop.svelte │ │ ├── backdrop2.svelte │ │ ├── blocker-modal.svelte │ │ ├── scroll-stopper.svelte │ │ └── wrap.svelte │ ├── backup-message │ │ ├── backup-list-items.svelte │ │ └── backup-message.svelte │ ├── badge │ │ └── badge.svelte │ ├── board-tabs │ │ ├── board-tabs.css │ │ └── board-tabs.svelte │ ├── button-group │ │ ├── button-group.css │ │ └── button-group.svelte │ ├── button │ │ ├── button.css │ │ ├── button.svelte │ │ └── close-button.svelte │ ├── calculator │ │ ├── calculate.ts │ │ ├── calculator.svelte │ │ └── display.svelte │ ├── calendar │ │ ├── calendar.svelte │ │ └── date-time.ts │ ├── calendar4 │ │ ├── calendar-utils.ts │ │ └── calendar4.svelte │ ├── card │ │ └── card.svelte │ ├── charts │ │ ├── bar-chart-2.svelte │ │ ├── chartjs.svelte │ │ ├── focus-graph.svelte │ │ └── pie.svelte │ ├── classic-button │ │ ├── ball.svelte │ │ ├── classic-button.css │ │ ├── classic-button.svelte │ │ └── score-pill.svelte │ ├── color-picker │ │ ├── color-picker.svelte │ │ └── tiny-color-picker.svelte │ ├── confetti │ │ ├── ConfettiStore.ts │ │ └── confetti.svelte │ ├── container │ │ └── container.svelte │ ├── counter │ │ ├── counter.svelte │ │ └── manual-time.svelte │ ├── date-picker │ │ ├── date-picker.svelte │ │ └── day-stepper.svelte │ ├── date-range-controller │ │ └── date-range-controller.svelte │ ├── date-time-bar │ │ ├── date-time-bar.svelte │ │ └── time-select.svelte │ ├── day-time-grid │ │ ├── day-time-grid.svelte │ │ ├── time-dots.svelte │ │ ├── time-grid-utils.ts │ │ └── time-grid.svelte │ ├── divider │ │ └── divider.svelte │ ├── dot │ │ └── dot.svelte │ ├── dymoji │ │ ├── dymoji.ts │ │ ├── info.json │ │ └── info.md │ ├── elephant.svelte │ ├── emoji-editor │ │ └── emoji-editor.svelte │ ├── emoji-selector │ │ ├── Emoji.svelte │ │ ├── EmojiDetail.svelte │ │ ├── EmojiList.svelte │ │ ├── EmojiSearch.svelte │ │ ├── EmojiSearchResults.svelte │ │ ├── EmojiSelector.svelte │ │ ├── VariantPopup.svelte │ │ ├── data │ │ │ ├── .gitkeep │ │ │ └── emoji-light.ts │ │ └── many-emoji │ │ │ └── many-emoji.svelte │ ├── empty │ │ └── empty.svelte │ ├── file-browser │ │ └── file-browser.svelte │ ├── file-uploader │ │ └── file-uploader.svelte │ ├── form-group │ │ └── form-group.svelte │ ├── grid │ │ ├── grid.css │ │ └── grid.svelte │ ├── h-scroller │ │ └── h-scroller.svelte │ ├── icon │ │ ├── ion-icon.svelte │ │ ├── n-icons │ │ │ ├── button-view.svelte │ │ │ ├── detail-view.svelte │ │ │ └── no-mood-outline.svg │ │ └── nicons.ts │ ├── input-slider │ │ ├── input-slider.svelte │ │ └── input-slider2.svelte │ ├── input │ │ └── input.svelte │ ├── label-meta │ │ └── label-meta.svelte │ ├── letter-ticker │ │ └── letter-ticker.svelte │ ├── link.svelte │ ├── list-item-log │ │ ├── list-item-log.svelte │ │ └── list-item-single-trackable.svelte │ ├── list-item │ │ ├── list-item.css │ │ └── list-item.svelte │ ├── list │ │ └── list.svelte │ ├── location-badge │ │ └── location-badge.svelte │ ├── log-list │ │ ├── log-list-loader.svelte │ │ └── log-list.svelte │ ├── logo │ │ └── logo.svelte │ ├── markdown-modal │ │ ├── MarkdownModalStore.ts │ │ └── markdown-modal.svelte │ ├── markdown │ │ └── markdown.svelte │ ├── menu │ │ ├── dropdown-menu.store.ts │ │ ├── dropdown-menu.svelte │ │ ├── menu-blocker.svelte │ │ ├── menu-inline.svelte │ │ ├── menu.svelte │ │ ├── n-menu.css │ │ └── useDropmenu.ts │ ├── modal │ │ ├── PanelModal.svelte │ │ ├── iframe-modal-helper.ts │ │ ├── iframe-modal.svelte │ │ ├── modal.svelte │ │ └── modal2.svelte │ ├── ndump │ │ ├── ndump-object.svelte │ │ └── ndump.svelte │ ├── next-prev-cal │ │ └── next-prev-cal.svelte │ ├── note-textualizer │ │ └── note-textualizer.svelte │ ├── nvirtual-list │ │ └── nvirtual-list.svelte │ ├── offline-queue │ │ └── offline-queue.svelte │ ├── panel │ │ └── panel.svelte │ ├── picker-list │ │ ├── picker-editor.svelte │ │ └── picker-select.svelte │ ├── points │ │ └── points.svelte │ ├── pop-menu │ │ ├── pop-buttons.svelte │ │ ├── pop-menu.css │ │ ├── pop-menu2.svelte │ │ ├── pop-menus.svelte │ │ └── usePopmenu.ts │ ├── positivity-bar │ │ ├── positivity-bar.svelte │ │ └── positivity-grid.svelte │ ├── positivity-selector │ │ ├── positivity-and-focus-bar.svelte │ │ ├── positivity-menu.svelte │ │ └── positivity-selector.svelte │ ├── progress-bar │ │ └── progress-bar.svelte │ ├── progress-circle │ │ └── progress-circle.svelte │ ├── radio-button │ │ └── radio-button.svelte │ ├── row │ │ └── row.svelte │ ├── scorebar │ │ ├── positivity-scorebar.svelte │ │ └── scorebar.svelte │ ├── scroller │ │ └── scroller.svelte │ ├── search-bar │ │ └── search-bar.svelte │ ├── share-image │ │ └── share-image.svelte │ ├── shortcut-button │ │ ├── shortcut-button.svelte │ │ └── shortcut-user-button.svelte │ ├── sortable-list │ │ └── sortable-list2.svelte │ ├── spacer │ │ └── spacer.svelte │ ├── spinner │ │ ├── circle3.svelte │ │ └── spinner.svelte │ ├── stepper │ │ └── stepper.svelte │ ├── swiper │ │ └── swiper.svelte │ ├── tab-panel-swiper │ │ ├── tab-button.svelte │ │ ├── tab-panel-swiper.svelte │ │ └── tab-panel.svelte │ ├── text │ │ └── text.svelte │ ├── textarea │ │ └── textarea.svelte │ ├── time-balls │ │ └── time-balls.svelte │ ├── time-gap │ │ └── time-gap.svelte │ ├── time-progressbar │ │ └── time-progressbar.svelte │ ├── time-range │ │ └── time-range-text.svelte │ ├── time-select │ │ └── time-select.svelte │ ├── tiny-trackable │ │ └── tiny-trackable.svelte │ ├── tip │ │ └── tip.svelte │ ├── title │ │ └── title.svelte │ ├── toast │ │ ├── ToastStore.ts │ │ ├── toast.svelte │ │ └── toasts.svelte │ ├── toggle-switch │ │ └── toggle-switch.svelte │ ├── toolbar │ │ ├── toolbar-grid.svelte │ │ ├── toolbar.css │ │ └── toolbar.svelte │ ├── update-available │ │ └── update-available.svelte │ ├── upgrade-message │ │ └── upgrade-message.svelte │ ├── uploader │ │ └── image-uploader.svelte │ ├── value-button │ │ └── value-button.svelte │ └── width-box │ │ └── width-box.svelte ├── config │ ├── appConfig.ts │ ├── faq.ts │ ├── sponsors.ts │ ├── tips.ts │ ├── whatsNew.json │ └── whatsNew.ts ├── domains │ ├── afternomie │ │ └── afternomie-view.svelte │ ├── analytics │ │ ├── Pivot-table │ │ │ ├── PivotTable.svelte │ │ │ ├── PivotTable.svelte.d.ts │ │ │ ├── PivotTableUI.svelte │ │ │ ├── PivotTableUI.svelte.d.ts │ │ │ ├── PlotlyRenderer.svelte │ │ │ ├── PlotlyRenderer.svelte.d.ts │ │ │ ├── PlotlyRenderers.d.ts │ │ │ ├── PlotlyRenderers.js │ │ │ ├── ScatterRenderer.svelte │ │ │ ├── ScatterRenderer.svelte.d.ts │ │ │ ├── TSVExportRenderer.svelte │ │ │ ├── TSVExportRenderer.svelte.d.ts │ │ │ ├── TableRenderer.svelte │ │ │ ├── TableRenderer.svelte.d.ts │ │ │ ├── TableRenderers.d.ts │ │ │ ├── TableRenderers.js │ │ │ ├── UI │ │ │ │ ├── Aggregators.svelte │ │ │ │ ├── Aggregators.svelte.d.ts │ │ │ │ ├── DnDCell.svelte │ │ │ │ ├── DnDCell.svelte.d.ts │ │ │ │ ├── Draggable.svelte │ │ │ │ ├── Draggable.svelte.d.ts │ │ │ │ ├── DraggableAttribute.svelte │ │ │ │ ├── DraggableAttribute.svelte.d.ts │ │ │ │ ├── Dropdown.svelte │ │ │ │ ├── Dropdown.svelte.d.ts │ │ │ │ ├── DropdownNomie.svelte │ │ │ │ ├── FilterBox.svelte │ │ │ │ ├── FilterBox.svelte.d.ts │ │ │ │ ├── MainTable.svelte │ │ │ │ ├── MainTable.svelte.d.ts │ │ │ │ ├── PivotSelector.svelte │ │ │ │ ├── Plotly.svelte │ │ │ │ ├── Plotly.svelte.d.ts │ │ │ │ ├── Sortable.svelte │ │ │ │ ├── Sortable.svelte.d.ts │ │ │ │ ├── utils.d.ts │ │ │ │ └── utils.js │ │ │ ├── Utilities.d.ts │ │ │ ├── Utilities.js │ │ │ ├── grouping.css │ │ │ ├── groupingdark.css │ │ │ ├── index.d.ts │ │ │ └── pivottable.css │ │ ├── PivotStore.ts │ │ ├── analytics-view.svelte │ │ ├── pivot-class.ts │ │ └── pivot-editor-modal.svelte │ ├── awards │ │ ├── AwardsStore.ts │ │ ├── awards-view.svelte │ │ ├── awards.spec.ts │ │ ├── components │ │ │ ├── award-badge.svelte │ │ │ └── awards-preview-list.svelte │ │ ├── helpers │ │ │ ├── award-chain.class.ts │ │ │ ├── award-chain.spec.ts │ │ │ ├── award-utils.spec.ts │ │ │ ├── award-utils.ts │ │ │ ├── award.class.ts │ │ │ ├── award.spec.ts │ │ │ └── usage-awards.ts │ │ └── new-awards-modal.svelte │ ├── backup │ │ └── BackupStore.ts │ ├── board │ │ ├── Uniboard.svelte │ │ ├── UniboardStore.ts │ │ ├── UniboardTrackableGrid.svelte │ │ ├── board-sort.svelte │ │ ├── boardActions.ts │ │ ├── uniboard-editor-view.svelte │ │ └── useBoardSortModal.ts │ ├── calendar-view │ │ ├── CalendarViewStore.ts │ │ ├── calendar-view-modal.svelte │ │ ├── calendar3.svelte │ │ └── trackableUsageCalendar.svelte │ ├── capture-log │ │ ├── CaptureLogStore.ts │ │ ├── capture-addon-menu-controller.svelte │ │ ├── capture-date-picker.svelte │ │ ├── capture-log-utils.ts │ │ ├── capture-log.css │ │ ├── capture-log.svelte │ │ └── capture-textarea.svelte │ ├── context │ │ ├── context-chart.svelte │ │ ├── context-class.spec.ts │ │ ├── context-class.ts │ │ ├── context-editor-view.svelte │ │ ├── context-store.ts │ │ └── context-utils.ts │ ├── csvr │ │ ├── csvr-importer.svelte │ │ ├── csvr.svelte │ │ └── samples │ │ │ └── zenobase.csv │ ├── dashboard2 │ │ ├── DashStore.ts │ │ ├── dashbard-edit-view.svelte │ │ ├── dashboard-class.ts │ │ ├── dashboard-empty-view.svelte │ │ ├── dashboard-list-item.svelte │ │ ├── dashboard-tabs.svelte │ │ ├── dashboard-view.svelte │ │ ├── dashboard-widget-grid.svelte │ │ └── widget │ │ │ ├── types │ │ │ ├── widget-bar-chart.svelte │ │ │ ├── widget-focus.svelte │ │ │ ├── widget-habit.svelte │ │ │ ├── widget-last-used.svelte │ │ │ ├── widget-map.svelte │ │ │ ├── widget-min-max.svelte │ │ │ ├── widget-note.svelte │ │ │ ├── widget-plugin.svelte │ │ │ ├── widget-pointer.svelte │ │ │ ├── widget-positivity-pie.svelte │ │ │ ├── widget-streak.svelte │ │ │ ├── widget-todos.svelte │ │ │ ├── widget-value-display.svelte │ │ │ └── widget-what-time.svelte │ │ │ ├── widget-class.ts │ │ │ ├── widget-date-class.ts │ │ │ ├── widget-display-type.svelte │ │ │ ├── widget-display.svelte │ │ │ ├── widget-editor │ │ │ ├── useWidgetEditorModal.ts │ │ │ ├── widget-editor-modal.svelte │ │ │ └── widget-type-selector.svelte │ │ │ ├── widget-list-item.svelte │ │ │ ├── widget-timeframe.ts │ │ │ ├── widget-types.ts │ │ │ └── widget-utils.ts │ ├── focus │ │ ├── focus-utils.spec.ts │ │ └── focus-utils.ts │ ├── goals │ │ ├── GoalStore.ts │ │ ├── GoalsPage.svelte │ │ ├── goal-class.ts │ │ ├── goal-detail │ │ │ ├── day-goal.svelte │ │ │ ├── goal-detail.svelte │ │ │ ├── month-goal.svelte │ │ │ └── week-goal.svelte │ │ ├── goal-details-modal.svelte │ │ ├── goal-editor-modal.svelte │ │ ├── goal-utils.ts │ │ └── goals.spec.ts │ ├── import-export │ │ ├── ImporterStore.ts │ │ ├── importer-item.svelte │ │ └── importer.svelte │ ├── import │ │ └── csv │ │ │ ├── csv-import-helper.ts │ │ │ ├── csv-import-view.svelte │ │ │ └── csvr.spec.ts │ ├── interactions │ │ └── interactions.svelte │ ├── layout │ │ ├── app.svelte │ │ ├── desktop-sidebar.svelte │ │ ├── layout.css │ │ ├── layout.svelte │ │ ├── page.svelte │ │ └── tabs.svelte │ ├── ledger │ │ ├── LastUsedStore.ts │ │ ├── LedgerStore.ts │ │ ├── Memories.svelte │ │ ├── last-used-utils.spec.ts │ │ ├── last-used-utils.ts │ │ ├── ledger-add-location.ts │ │ ├── ledger-books-to-get.spec.ts │ │ ├── ledger-books-to-get.ts │ │ ├── ledger-cache.spec.ts │ │ ├── ledger-cache.ts │ │ ├── ledger-importer.ts │ │ ├── ledger-tools.spec.ts │ │ └── ledger-tools.ts │ ├── library │ │ ├── all-individual-trackers.json │ │ ├── library-manager │ │ │ ├── LibraryManagerStore.ts │ │ │ ├── library-manager.svelte │ │ │ └── library-tracker-editor.svelte │ │ ├── library-modal.svelte │ │ ├── library-tracker-item-details.svelte │ │ ├── library-tracker-item.svelte │ │ └── tracker-library.ts │ ├── locations │ │ ├── LocationClass.ts │ │ └── LocationStore.ts │ ├── log-cache │ │ ├── LogCacheStore.ts │ │ └── log-cache-modal.svelte │ ├── map │ │ ├── LocationModalStore.ts │ │ ├── location-list-item.svelte │ │ ├── location-manager-modal.svelte │ │ ├── location-modal.svelte │ │ ├── location-viewer-modal.svelte │ │ └── map.svelte │ ├── nomie-log │ │ ├── LogEditorStore.ts │ │ ├── log-display-modal │ │ │ ├── LogDisplayStore.ts │ │ │ └── log-display-modal.svelte │ │ ├── log-editor │ │ │ └── log-editor-modal.svelte │ │ ├── log-filter │ │ │ ├── log-filter.spec.ts │ │ │ └── log-filter.ts │ │ ├── log-list-scroller │ │ │ └── log-list-scroller.svelte │ │ ├── log-mass-editor │ │ │ └── mass-editor.svelte │ │ ├── nomie-log-utils.spec.ts │ │ ├── nomie-log-utils.ts │ │ ├── nomie-log.spec.ts │ │ └── nomie-log.ts │ ├── on-this-day │ │ ├── on-this-day-helper.spec.ts │ │ ├── on-this-day-helpers.ts │ │ ├── on-this-day-utils.ts │ │ ├── on-this-day-views.svelte │ │ ├── on-this-day.svelte │ │ └── useOnThisDayModal.ts │ ├── people │ │ ├── PeopleStore.ts │ │ ├── Person.class.ts │ │ └── usePersonModal.ts │ ├── pin-lock │ │ ├── keypad.svelte │ │ ├── pin-helper.ts │ │ └── pin-lock.svelte │ ├── plugins │ │ ├── PluginStore.ts │ │ ├── plugin-frame.svelte │ │ ├── plugin-helpers.ts │ │ ├── plugin-installer-modal.svelte │ │ ├── plugin-installer.svelte │ │ ├── plugin-loader.svelte │ │ ├── plugin-modal.svelte │ │ ├── plugins-modal.svelte │ │ └── plugins-more-menu.svelte │ ├── pointers │ │ ├── PointerStore_old.ts │ │ ├── pointer-board.svelte │ │ ├── pointer-class.ts │ │ ├── pointer-editor-view.svelte │ │ ├── pointer-loader.svelte │ │ ├── pointer-store.ts │ │ ├── pointer-utils.ts │ │ └── pointers-modal.svelte │ ├── positivity-editor │ │ ├── PositivityEditorStore.ts │ │ ├── condition-item.svelte │ │ ├── positivity-editor-modal.svelte │ │ └── positivity-helpers.ts │ ├── preferences │ │ ├── LaunchCount.ts │ │ └── Preferences.ts │ ├── related │ │ ├── RelatedStore.ts │ │ ├── related-modal.svelte │ │ ├── related-view.svelte │ │ └── related-worker.ts │ ├── search │ │ ├── UnisearchStore.ts │ │ ├── search-history.svelte │ │ ├── search-modal.svelte │ │ ├── search-recent.svelte │ │ ├── search-store.ts │ │ ├── unisearch-commands.ts │ │ └── unisearch-modal.svelte │ ├── settings │ │ ├── settings-about-list.svelte │ │ ├── settings-account-list.svelte │ │ ├── settings-data-list.svelte │ │ ├── settings-features-list.svelte │ │ ├── settings-functions.ts │ │ ├── settings-helpers.ts │ │ ├── settings-page.svelte │ │ └── settings-tweak-list.svelte │ ├── setup │ │ ├── setup.svelte │ │ ├── slide-location.svelte │ │ ├── slide-pwa-install.svelte │ │ ├── slide-storage.svelte │ │ ├── slide-template.svelte │ │ ├── slide-time-format.svelte │ │ ├── slide-welcome.svelte │ │ └── slide.svelte │ ├── stats │ │ ├── StatsStore.ts │ │ ├── ignore-zeros.spec.ts │ │ ├── ignore-zeros.ts │ │ ├── stats-functions.spec.ts │ │ ├── stats-functions.ts │ │ ├── stats-overview.svelte │ │ ├── stats-processor.class.ts │ │ ├── stats-ref.ts │ │ ├── stats-time.svelte │ │ ├── stats-types.ts │ │ ├── statsV5.ts │ │ ├── statsv5.spec.ts │ │ └── time-of-day.ts │ ├── stats2 │ │ ├── Stats2Store.ts │ │ ├── day-of-week.ts │ │ ├── overview │ │ │ ├── overview-range.svelte │ │ │ ├── overview-timer.svelte │ │ │ ├── overview-value.svelte │ │ │ └── overview.svelte │ │ ├── stats2-date-controller.svelte │ │ ├── stats2-modal.svelte │ │ ├── stats2-time-formats.ts │ │ ├── stats2.spec.ts │ │ └── when-view.svelte │ ├── steak │ │ ├── StreakModalStore.ts │ │ ├── StreakStore.ts │ │ ├── screak-scroller.svelte │ │ ├── streak-days.svelte │ │ ├── streak-helper.spec.ts │ │ ├── streak-helper.ts │ │ ├── streak-modal.svelte │ │ ├── streak-monitor.ts │ │ └── streak.svelte │ ├── storage │ │ ├── engines │ │ │ ├── localforage │ │ │ │ └── engine.localforage.ts │ │ │ ├── pouchdb │ │ │ │ ├── engine.pouchdb.ts │ │ │ │ └── pouchdb.svelte │ │ │ └── storage.dumb.ts │ │ ├── import-export.ts │ │ ├── side-storage.ts │ │ ├── smart-merge.spec.ts │ │ ├── smart-merge.ts │ │ ├── storage-export.helper.ts │ │ ├── storage.spec.ts │ │ ├── storage.svelte │ │ └── storage.ts │ ├── templates │ │ ├── available-templates-list.svelte │ │ ├── template-editor-list.svelte │ │ ├── template-editor-modal.svelte │ │ ├── template-editor.svelte │ │ ├── template-manager-modal.svelte │ │ ├── template-preview-modal.svelte │ │ ├── template-view.svelte │ │ ├── templates-svelte-helpers.ts │ │ └── templates-utils.ts │ ├── timeline │ │ ├── select-date-fuzzy.ts │ │ ├── timeline-helpers.ts │ │ ├── timeline-item.svelte │ │ ├── timeline-loader.svelte │ │ ├── timeline-modal.svelte │ │ ├── timeline-utils.spec.ts │ │ ├── timeline-utils.ts │ │ ├── timeline-view-og.svelte │ │ └── timeline-view.svelte │ ├── trackable │ │ ├── Trackable.class.ts │ │ ├── TrackableListBuilder.svelte │ │ ├── TrackableStore.ts │ │ ├── positivity-editor │ │ │ └── positivity-editor.svelte │ │ ├── trackable-editor │ │ │ ├── TrackableEditorStore.ts │ │ │ ├── TrackableVisualStore.ts │ │ │ ├── context │ │ │ │ └── trackable-editor-context.svelte │ │ │ ├── person │ │ │ │ └── trackable-editor-person.svelte │ │ │ ├── pointer │ │ │ │ └── trackable-editor-pointer.svelte │ │ │ ├── trackable-editor-actions.svelte │ │ │ ├── trackable-editor-modal.svelte │ │ │ ├── trackable-visual-modal.svelte │ │ │ └── tracker │ │ │ │ ├── editor.css │ │ │ │ └── trackable-editor-tracker.svelte │ │ ├── trackable-pill.svelte │ │ ├── trackable-selector │ │ │ ├── TrackableSelectorStore.ts │ │ │ └── trackable-selector-modal.svelte │ │ ├── trackable-utils.ts │ │ └── trackableUtils.spec.ts │ ├── tracker │ │ ├── TrackerStore.ts │ │ ├── editor │ │ │ ├── TrackerEditorStore.ts │ │ │ ├── color-emoji-title-input.svelte │ │ │ ├── editor.css │ │ │ └── editor.scss │ │ ├── input │ │ │ ├── TrackerInputStore.ts │ │ │ ├── habit.svelte │ │ │ ├── input-modal-footer.svelte │ │ │ ├── input-modal.svelte │ │ │ ├── note-combo.svelte │ │ │ ├── picker.svelte │ │ │ ├── slider.svelte │ │ │ ├── timer.svelte │ │ │ └── tracker-input-utils.ts │ │ ├── positivity-editor.svelte │ │ └── timers │ │ │ ├── timers-modal.svelte │ │ │ └── useTimersModal.ts │ ├── trending │ │ ├── TrendingModalStore.ts │ │ ├── trending-item.svelte │ │ └── trending-modal.svelte │ ├── uom │ │ ├── README.md │ │ ├── uom-editor │ │ │ ├── uom-modal.svelte │ │ │ ├── uoms-view.svelte │ │ │ └── useUomModal.ts │ │ ├── uom-types.ts │ │ ├── uom-utils.ts │ │ ├── uom.class.spec.ts │ │ ├── uom.class.ts │ │ ├── uom.config.spec.ts │ │ ├── uom.config.ts │ │ ├── uom.spec.ts │ │ └── uom.ts │ ├── usage │ │ ├── ChartOptionsStore.ts │ │ ├── UsageStore.ts │ │ ├── stat-ping.ts │ │ ├── today-date-controller.svelte │ │ ├── today │ │ │ └── TodayStore.ts │ │ ├── trackable-usage-utils.ts │ │ ├── trackable-usage.class.ts │ │ ├── trackable-usage.spec.ts │ │ ├── usage-chart.svelte │ │ ├── usage-stats.ts │ │ ├── usage-store-visualizer.svelte │ │ ├── usage-utils.spec.ts │ │ ├── usage-utils.ts │ │ └── usage.class.ts │ ├── whats-new │ │ └── whats-new-modal.svelte │ └── writing-prompts │ │ ├── useWritingPrompts.ts │ │ ├── writing-prompt-modal.svelte │ │ └── writing-prompts-v2.json ├── env.ts ├── lang │ ├── base.ts │ ├── de.ts │ ├── en.ts │ ├── it.ts │ ├── lang.ts │ ├── test.ts │ └── zh-cn.ts ├── main.ts ├── modules │ ├── app-version │ │ └── app-version.ts │ ├── board │ │ └── board.ts │ ├── chainer │ │ ├── chainer.spec.ts │ │ └── chainer.ts │ ├── colors │ │ ├── colors.ts │ │ └── string-to-color.ts │ ├── dashboard │ │ └── widget.spec.ts │ ├── date-diff │ │ └── date-diff.ts │ ├── download │ │ └── download.ts │ ├── emoji-count │ │ ├── emoji-count.spec.ts │ │ └── emoji-count.ts │ ├── export │ │ ├── csv-column-worker.ts │ │ ├── csv.ts │ │ ├── export-helper.ts │ │ └── export.ts │ ├── geohash │ │ └── geohash.ts │ ├── hooks │ │ ├── hooks.ts │ │ └── useAutoresize.ts │ ├── html-elements │ │ └── position.ts │ ├── import │ │ ├── import-loader.ts │ │ ├── import.n1.ts │ │ ├── import.n2.ts │ │ ├── import.n3.ts │ │ ├── import.n5.ts │ │ └── import.ts │ ├── keyDown │ │ └── keyDown.svelte │ ├── localstorage │ │ └── localStorageObj.ts │ ├── locate │ │ ├── distance.spec.ts │ │ ├── distance.ts │ │ └── locate.ts │ ├── location-extractor │ │ ├── location-exctractor.spec.ts │ │ └── location-extractor.ts │ ├── nid │ │ ├── nid.spec.ts │ │ └── nid.ts │ ├── object-hash │ │ └── object-hash.ts │ ├── pop-buttons │ │ └── pop-buttons.ts │ ├── remote │ │ └── remote.ts │ ├── scoring │ │ ├── score-note.ts │ │ └── score-tracker.ts │ ├── share │ │ └── share.ts │ ├── svelte-actions │ │ ├── autofocus.ts │ │ └── autosize.ts │ ├── task-queue │ │ └── task-queue.ts │ ├── time │ │ ├── DateTime.js │ │ ├── time.spec.ts │ │ └── time.ts │ ├── tokenizer │ │ ├── deep.ts │ │ ├── lite.ts │ │ ├── tokenToTrackable.ts │ │ └── tokenizer.spec.ts │ ├── trackable-element │ │ ├── trackable-element.spec.ts │ │ └── trackable-element.ts │ ├── tracker-types │ │ └── tracker-types.ts │ ├── tracker │ │ ├── TrackerClass.ts │ │ ├── bundle.js │ │ ├── positivity-condition.ts │ │ ├── tracker-inputer.ts │ │ ├── tracker-utils.ts │ │ └── tracker.spec.ts │ ├── uencode │ │ ├── uencode.spec.ts │ │ └── uencode.ts │ └── uid │ │ └── uid.ts ├── n-icons │ ├── AccessibilityOutline.svelte │ ├── AddCircleOutline.svelte │ ├── AddIcon.svelte │ ├── AddSquareOutline.svelte │ ├── AlarmOutline.svelte │ ├── AppsOutline.svelte │ ├── AppsSolid.svelte │ ├── ArchiveOutline.svelte │ ├── ArrowBack.svelte │ ├── ArrowForard.svelte │ ├── BarChart.svelte │ ├── BarChartOutline.svelte │ ├── BarChartSolid.svelte │ ├── BookOutline.svelte │ ├── BookmarksOutline.svelte │ ├── BulbOutline.svelte │ ├── BulbSolid.svelte │ ├── CalendarNumberOutline.svelte │ ├── CalendarNumberSolid.svelte │ ├── CalendarOutline.svelte │ ├── CalendarSolid.svelte │ ├── CameraSolid.svelte │ ├── CaretDown.svelte │ ├── CaretDownCircle.svelte │ ├── ChatboxOutline.svelte │ ├── CheckmarkCircle.svelte │ ├── CheckmarkCircleOutline.svelte │ ├── CheckmarkOutline.svelte │ ├── ChevronBackCircleOutline.svelte │ ├── ChevronBackOutline.svelte │ ├── ChevronDownOutline.svelte │ ├── ChevronForwardCircleOutline.svelte │ ├── ChevronForwardOutline.svelte │ ├── ChevronUpOutline.svelte │ ├── CircleOutline.svelte │ ├── CloseCircleOutline.svelte │ ├── CloseOutline.svelte │ ├── ColorBookmark.svelte.svg │ ├── CopyOutline.svelte │ ├── CreateOutline.svelte │ ├── CubeOutline.svelte │ ├── CubeSolid.svelte │ ├── DownloadOutline.svelte │ ├── DuplicateOutline.svelte │ ├── EaselOutline.svelte │ ├── EaselSolid.svelte │ ├── ExpandOutline.svelte │ ├── EyeClosedSolid.svelte │ ├── EyeSolid.svelte │ ├── FilterCircleOutline.svelte │ ├── Git.svelte │ ├── HappyOutline.svelte │ ├── HighLowIcon.svelte │ ├── Layers.svelte │ ├── LineChartOutline.svelte │ ├── ListOutline.svelte │ ├── ListSolid.svelte │ ├── LockClosedSolid.svelte │ ├── MagnetOutline.svelte │ ├── MagnetSolid.svelte │ ├── MailOutline.svelte │ ├── MailUnreadOutline.svelte │ ├── MapOutline.svelte │ ├── MenuOutline.svelte │ ├── MoonOutline.svelte │ ├── More.svelte │ ├── MoreCircle.svelte │ ├── MoreCircleOutline.svelte │ ├── MoreVertical.svelte │ ├── NavigateCircleOutline.svelte │ ├── NavigateCircleSolid.svelte │ ├── NavigateSolid.svelte │ ├── OptionsOutline.svelte │ ├── PaperPlaneSolid.svelte │ ├── PencilOutline.svelte │ ├── People.svelte │ ├── PeopleCircle.svelte │ ├── PeopleOutline.svelte │ ├── PersonAddOutline.svelte │ ├── PieChartOutline.svelte │ ├── PinSolid.svelte │ ├── PlayBackCircle.svelte │ ├── PlusIcon.svelte │ ├── PrintOutline.svelte │ ├── PulseOutline.svelte │ ├── QRCode.svelte │ ├── QRCodeSolid.svelte │ ├── RelatedOutline.svelte │ ├── RemoveCircle.svelte │ ├── RemoveCircleOutline.svelte │ ├── RepeatOutline.svelte │ ├── ReplyOutline.svelte │ ├── RibbonOutline.svelte │ ├── RibbonSolid.svelte │ ├── ScanOutline.svelte │ ├── SearchIcon.svelte │ ├── SettingsOutline.svelte │ ├── SettingsSolid.svelte │ ├── ShareOutline.svelte │ ├── ShuffleOutline.svelte │ ├── SparklesOutline.svelte │ ├── StarFilled.svelte │ ├── StarOutline.svelte │ ├── StarSolid.svelte │ ├── StopSolid.svelte │ ├── SunnyOutline.svelte │ ├── SwapOutline.svelte │ ├── TabsOutline.svelte │ ├── TagOutline.svelte │ ├── TextOutline.svelte │ ├── ThermometerIcon.svelte │ ├── TrashOutline.svelte │ ├── TrophyOutline.svelte │ ├── TrophySolid.svelte │ └── board-tab-icons │ │ ├── AllBoardIcon.svelte │ │ ├── ContextBoardIcon.svelte │ │ ├── PeopleBoardIcon.svelte │ │ ├── allBoard.svg │ │ ├── contextBoard.svg │ │ └── peopleBoard.svg ├── paths.ts ├── routes │ ├── AfterNomie.svelte │ ├── Analytics.svelte │ ├── ArrayStoreTest.svelte │ ├── Awards.svelte │ ├── Error404.svelte │ ├── Goals.svelte │ ├── LibraryManager.svelte │ ├── Messages.svelte │ ├── RouteControl.svelte │ ├── Timeline.svelte │ ├── Uoms.svelte │ ├── cloud-api-page.svelte │ ├── csv-import.svelte │ ├── dashboard.svelte │ ├── export.svelte │ ├── export │ │ └── csv.svelte │ ├── faq.svelte │ ├── file-browser.svelte │ ├── history.svelte │ ├── routes.svelte │ ├── settings.svelte │ ├── setup.svelte │ ├── tests │ │ ├── language.svelte │ │ ├── storage.svelte │ │ ├── tests-old.svelte │ │ └── tests.svelte │ └── track.svelte ├── select-pop │ └── select-pop.svelte ├── service-worker.js ├── store │ ├── ArrayStore.ts │ ├── KVStore.ts │ ├── LSStore.ts │ ├── VersionStore.ts │ ├── device-store.ts │ ├── interact.ts │ ├── lang.ts │ └── offline-queue-store.ts ├── style │ ├── Tailwind.svelte │ └── main.css ├── types.d.ts └── utils │ ├── array │ ├── array_utils.spec.ts │ └── array_utils.ts │ ├── calculate │ ├── calculate.spec.ts │ └── calculate.ts │ ├── calendar-map │ └── calendar-map.ts │ ├── clipboard │ └── clipboard.ts │ ├── dom │ └── dom-utils.ts │ ├── encrypt │ └── encrypt.ts │ ├── extract │ ├── extract.spec.ts │ ├── extract.ts │ └── note-parser.js.deprecated │ ├── is │ ├── is.spec.ts │ └── is.ts │ ├── log │ └── log.ts │ ├── math │ ├── math.spec.ts │ └── math.ts │ ├── ndate │ ├── ndate.spec.ts │ └── ndate.ts │ ├── ordinal │ ├── ordinal.spec.ts │ └── ordinal.ts │ ├── parseNumber │ ├── parseNumber.spec.ts │ └── parseNumber.ts │ ├── positivity │ └── positivity.ts │ ├── promise-step │ ├── promise-step.spec.ts │ └── promise-step.ts │ ├── regex.ts │ ├── search │ ├── latinize.ts │ ├── search-items.ts │ ├── search-tokenizer.ts │ └── search.spec.ts │ ├── snake-case │ └── snake-case.ts │ ├── string-to-value │ └── string-to-value.ts │ ├── test │ └── TestItem.ts │ ├── text │ ├── text.spec.ts │ └── text.ts │ ├── tick │ └── tick.ts │ ├── time │ ├── time.spec.ts │ └── time.ts │ ├── timer │ └── timer.ts │ ├── tracker-logs-to-time │ └── tracker-logs-to-time.ts │ ├── truthy │ ├── truthy.spec.ts │ └── truthy.ts │ └── url-parser │ ├── url-parser.spec.ts │ └── url-parser.ts ├── svelte.config.js ├── svelte.config_temp.mjs ├── tailwind.config.js ├── tsconfig.json └── vite.config.mjs /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 16 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true, 6 | "printWidth": 120 7 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "kuscamara.remove-unused-imports" 4 | ] 5 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javascript.preferences.importModuleSpecifier": "relative", 3 | "typescript.preferences.importModuleSpecifier": "relative", 4 | "liveServer.settings.port": "30001" 5 | } -------------------------------------------------------------------------------- /20230801_update.md: -------------------------------------------------------------------------------- 1 | After all updates there were 0 vulnerabilities. 2 | 3 | The following packages were not updated in order to keep the code running: 4 | 5 | ronalddelange@Ronalds-MBP dailynomie6-oss % ncu 6 | Checking /Users/ronalddelange/SynologyDrive/DailyNomie/AppCode/Nomie/dailynomie6-oss/package.json 7 | [====================] 91/91 100% 8 | 9 | @rgossiaux/svelte-headlessui ^1.0.2 → ^2.0.0 10 | @tailwindcss/line-clamp ^0.2.2 → ^0.4.4 11 | @tailwindcss/typography ^0.4.1 → ^0.5.9 12 | @tsconfig/svelte ^1.0.2 → ^5.0.0 13 | cypress ^4.2.0 → ^12.17.3 14 | postcss ^8.4.5 → ^8.4.27 15 | postcss-load-config ^3.1.0 → ^4.0.1 16 | svelte-preprocess ^5.0.3 → ^5.0.4 17 | tailwindcss ^2.2.19 → ^3.3.3 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-buster 2 | 3 | WORKDIR /usr/app 4 | COPY ./package.json ./ 5 | RUN npm install --force 6 | COPY ./ /usr/app 7 | RUN NODE_OPTIONS=--max-old-space-size=8192 npm run vbuild 8 | 9 | FROM nginx 10 | WORKDIR /usr/app 11 | COPY --from=0 /usr/app/dist /usr/share/nginx/html 12 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transformIgnorePatterns: ['/node_modules/(?!my-package)(.*)'], 3 | presets: [ 4 | [ 5 | '@babel/preset-env', 6 | 'babel-plugin-transform-vite-meta-env', 7 | { 8 | targets: { 9 | node: 'current', 10 | }, 11 | }, 12 | ], 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /bin/nomie6-oss.6.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.1.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.5-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.5-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.5.0-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.5.0-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.6.0-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.6.0-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.0-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.0-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.0dev-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.0dev-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.1-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.1-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.3-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.3-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.4-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.4-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.6.7.4dev-dn.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.6.7.4dev-dn.zip -------------------------------------------------------------------------------- /bin/nomie6-oss.latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/bin/nomie6-oss.latest.zip -------------------------------------------------------------------------------- /build-tools/csv-generator.js: -------------------------------------------------------------------------------- 1 | const dayjs = require("dayjs"); 2 | const fs = require("fs"); 3 | const _ = require("lodash"); 4 | 5 | let daycount = 800; 6 | let tag = "mood"; 7 | let tag2 = "sleep_quality"; 8 | 9 | let rows = [["date", "note"]]; 10 | 11 | let start = dayjs().subtract(daycount, "day"); 12 | for (var i = 0; i < daycount; i++) { 13 | let d = start.add(i, "day"); 14 | rows.push([d.hour(_.random(1, 23)).minute(_.random(1, 23)).toJSON(), `#${tag}(${i + 1})`]); 15 | rows.push([d.hour(_.random(8, 12)).minute(_.random(1, 23)).toJSON(), `#${tag2}(${_.random(20, 90)})`]); 16 | } 17 | 18 | let csv = rows 19 | .map((row) => { 20 | return row.join(","); 21 | }) 22 | .join("\n"); 23 | 24 | fs.writeFileSync("./artifacts/generated.csv", csv, "UTF-8"); 25 | -------------------------------------------------------------------------------- /build-tools/get-todo.js: -------------------------------------------------------------------------------- 1 | const findInFiles = require('find-in-files'); 2 | const dayjs = require('dayjs'); 3 | const fs = require('fs'); 4 | 5 | let md = ['# TODO', '', `Generated ${dayjs().format('ddd MMM D YYYY h:mm a')}`, '']; 6 | 7 | let stripComment = str => { 8 | return str.replace(/(\/\/|\<\!\-\-|\*)/gi, ''); 9 | }; 10 | 11 | findInFiles.find('TODO:', './src').then(res => { 12 | let fileNames = Object.keys(res); 13 | fileNames.forEach(name => { 14 | let file = name; 15 | let node = res[file]; 16 | md.push(`- **${file}**`); 17 | node.line.forEach(line => { 18 | md.push(` - ${stripComment(line).trim()}`); 19 | }); 20 | }); 21 | fs.writeFileSync('./TODO.md', md.join(`\n`), 'UTF-8'); 22 | }); 23 | -------------------------------------------------------------------------------- /build-tools/icons/generate.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const icons = JSON.parse(fs.readFileSync('./build-tools/icons/icons.json', 'utf-8')) 3 | 4 | icons.forEach((icon) => { 5 | let path = icon.path 6 | let name = icon.name 7 | let content = fs.readFileSync(`./${path}`, 'utf-8') 8 | content = content.replace(' 14 | export let size:number = 24; 15 | 16 | ${content} 17 | `, 18 | 'utf-8' 19 | ) 20 | }) 21 | -------------------------------------------------------------------------------- /build-tools/move-resources.js: -------------------------------------------------------------------------------- 1 | // let copy = require('copy') 2 | let move = [ 3 | { 4 | src: 'node_modules/leaflet/dist/**/*', 5 | dest: 'vendors/leaflet', 6 | }, 7 | // { 8 | // src: "node_modules/pouchdb/dist/**/*", 9 | // dest: "vendors/pouchdb", 10 | // }, 11 | { 12 | src: 'node_modules/esri-leaflet/dist/**/*', 13 | dest: 'vendors/leaflet/esri', 14 | }, 15 | { 16 | src: 'node_modules/esri-leaflet-geocoder/dist/**/*', 17 | dest: 'vendors/leaflet/geocoder', 18 | }, 19 | ] 20 | 21 | console.log('Moving Vendor Resources....') 22 | 23 | // let copyp = (to, from) => { 24 | // return new Promise((resolve, reject) => { 25 | // copy(to, from, (err, files) => { 26 | // if (!err) { 27 | // resolve(files) 28 | // } else { 29 | // reject(err) 30 | // } 31 | // }) 32 | // }) 33 | // } 34 | 35 | // move.forEach(async (transport) => { 36 | // await copyp(transport.src, transport.dest) 37 | // }) 38 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = {extends: ['@commitlint/config-conventional']}; 2 | -------------------------------------------------------------------------------- /cypress/actions/compose-note.js: -------------------------------------------------------------------------------- 1 | export const composeNote = (note, save = true) => { 2 | cy.get('#textarea-capture-note').type(note) 3 | cy.get('#positivity-button').click() 4 | cy.wait(400) 5 | cy.get('.pop-button-0').click() 6 | cy.wait(200) 7 | if (save) { 8 | cy.get('#save-log-button').click() 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cypress/disabled/_sm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/cypress/disabled/_sm -------------------------------------------------------------------------------- /cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } -------------------------------------------------------------------------------- /cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example plugins/index.js can be used to load plugins 3 | // 4 | // You can change the location of this file or turn off loading 5 | // the plugins file with the 'pluginsFile' configuration option. 6 | // 7 | // You can read more here: 8 | // https://on.cypress.io/plugins-guide 9 | // *********************************************************** 10 | 11 | // This function is called when a project is opened or re-opened (e.g. due to 12 | // the project's config changing) 13 | 14 | module.exports = (on, config) => { 15 | // `on` is used to hook into various events Cypress emits 16 | // `config` is the resolved Cypress config 17 | } 18 | -------------------------------------------------------------------------------- /cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | verbose: true, 3 | roots: ['/src'], 4 | testMatch: ['**/__tests__/**/*.+(ts|tsx|js)', '**/?(*.)+(spec).+(ts|tsx|js)'], 5 | transform: { 6 | '^.+\\.(ts|tsx)$': 'ts-jest', 7 | '^.+\\.svelte$': 'svelte-jester', 8 | '^.+\\.js$': 'babel-jest', 9 | }, 10 | moduleFileExtensions: ['js', 'svelte', 'ts'], 11 | extensionsToTreatAsEsm: ['.ts'], 12 | globals: { 13 | 'ts-jest': { 14 | useESM: true, 15 | diagnostics: { 16 | //ignore "cannot use import.meta" TS error b/c it will be transformed by babel-preset-vite 17 | ignoreCodes: [1343], 18 | }, 19 | }, 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run vbuild" 3 | publish = "dist" 4 | [[redirects]] 5 | from = "/api/*" 6 | to = "/.netlify/functions/:splat" 7 | status = 200 8 | [[redirects]] 9 | from = "/system" 10 | to = "/system/index.html" 11 | status = 200 12 | [[redirects]] 13 | from = "/*" 14 | to = "/" 15 | status = 200 16 | [[headers]] 17 | for = "/manifest.webmanifest" 18 | [headers.values] 19 | Content-Type = "application/manifest+json" 20 | [functions] 21 | # Directory with serverless functions, including background functions, 22 | # to deploy. This is relative to the base directory if one has been set, 23 | # or the root directory if a base hasn’t been set. 24 | directory = "functions/" 25 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require("tailwindcss"), 4 | require("autoprefixer") 5 | ] 6 | } -------------------------------------------------------------------------------- /public/_headers: -------------------------------------------------------------------------------- 1 | /assets/* 2 | cache-control: max-age=31536000 3 | cache-control: immutable 4 | /* 5 | Access-Control-Allow-Origin: https://browser.blockstack.org 6 | -------------------------------------------------------------------------------- /public/app-icons/nomie-6-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-120.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-128.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-144.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-152.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-180.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-192.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-384.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-512.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-72.png -------------------------------------------------------------------------------- /public/app-icons/nomie-6-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie-6-96.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-120.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-128.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-144.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-152.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-180.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-192.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-384.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-512.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-72.png -------------------------------------------------------------------------------- /public/app-icons/nomie6-head-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/app-icons/nomie6-head-96.png -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/favicon.png -------------------------------------------------------------------------------- /public/images/editor-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/editor-background.png -------------------------------------------------------------------------------- /public/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icon.png -------------------------------------------------------------------------------- /public/images/icons/nomie-114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-114.png -------------------------------------------------------------------------------- /public/images/icons/nomie-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-120.png -------------------------------------------------------------------------------- /public/images/icons/nomie-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-128.png -------------------------------------------------------------------------------- /public/images/icons/nomie-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-144.png -------------------------------------------------------------------------------- /public/images/icons/nomie-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-152.png -------------------------------------------------------------------------------- /public/images/icons/nomie-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-180.png -------------------------------------------------------------------------------- /public/images/icons/nomie-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-192.png -------------------------------------------------------------------------------- /public/images/icons/nomie-384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-384.png -------------------------------------------------------------------------------- /public/images/icons/nomie-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-400.png -------------------------------------------------------------------------------- /public/images/icons/nomie-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-512.png -------------------------------------------------------------------------------- /public/images/icons/nomie-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-72.png -------------------------------------------------------------------------------- /public/images/icons/nomie-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-96.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-114.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-168.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-168.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-192.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-400.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-512.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-72.png -------------------------------------------------------------------------------- /public/images/icons/nomie-android-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/icons/nomie-android-96.png -------------------------------------------------------------------------------- /public/images/logos/Blockstack-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/logos/Blockstack-logo.png -------------------------------------------------------------------------------- /public/images/map/map-marker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/images/map/marker.svg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/map/marker.svg -------------------------------------------------------------------------------- /public/images/nomie-blue-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/nomie-blue-type.png -------------------------------------------------------------------------------- /public/images/nomie-head-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/nomie-head-on.png -------------------------------------------------------------------------------- /public/images/nomie-splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/nomie-splash.png -------------------------------------------------------------------------------- /public/images/nomie-white-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/nomie-white-type.png -------------------------------------------------------------------------------- /public/images/onboard/nomie-history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/onboard/nomie-history.png -------------------------------------------------------------------------------- /public/images/onboard/nomie-homescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/onboard/nomie-homescreen.png -------------------------------------------------------------------------------- /public/images/onboard/nomie4.2.3.stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/onboard/nomie4.2.3.stats.png -------------------------------------------------------------------------------- /public/images/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/pin.png -------------------------------------------------------------------------------- /public/images/screens/blockstack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/screens/blockstack.png -------------------------------------------------------------------------------- /public/images/screens/board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/screens/board.png -------------------------------------------------------------------------------- /public/images/screens/capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/screens/capture.png -------------------------------------------------------------------------------- /public/images/screens/homescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/screens/homescreen.png -------------------------------------------------------------------------------- /public/images/screens/stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/images/screens/stats.png -------------------------------------------------------------------------------- /public/privacy.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/privacy.md -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / -------------------------------------------------------------------------------- /public/screenshots/popmenu-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/screenshots/popmenu-screenshot.png -------------------------------------------------------------------------------- /public/screenshots/stats-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/screenshots/stats-screenshot.png -------------------------------------------------------------------------------- /public/screenshots/track-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/public/screenshots/track-screenshot.png -------------------------------------------------------------------------------- /public/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "6" 3 | } -------------------------------------------------------------------------------- /src/AppKeyCommands.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/backdrop/scroll-stopper.svelte: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/components/backdrop/wrap.svelte: -------------------------------------------------------------------------------- 1 | DUMB WRAP -------------------------------------------------------------------------------- /src/components/board-tabs/board-tabs.css: -------------------------------------------------------------------------------- 1 | .n-board-tabs button { 2 | @apply flex items-center justify-center; 3 | @apply rounded-full; 4 | @apply py-1 px-1; 5 | @apply text-base font-medium; 6 | @apply text-gray-800 dark:text-gray-200; 7 | @apply transform; 8 | @apply transition-all; 9 | } 10 | .n-board-tabs { 11 | @apply h-10; 12 | @apply shadow-inner lg:shadow-none; 13 | @apply rounded-full; 14 | @apply overflow-hidden; 15 | @apply w-full lg:w-auto; 16 | } 17 | .n-board-tabs .wrapper { 18 | @apply px-2; 19 | @apply h-10; 20 | @apply items-center; 21 | } 22 | .n-board-tabs button.selected { 23 | @apply bg-white dark:bg-black; 24 | @apply text-primary-500; 25 | @apply shadow-md; 26 | @apply px-4 py-1 rounded-full; 27 | } 28 | .n-board-tabs button { 29 | @apply whitespace-nowrap; 30 | } 31 | -------------------------------------------------------------------------------- /src/components/button/close-button.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /src/components/calculator/display.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/components/calculator/display.svelte -------------------------------------------------------------------------------- /src/components/calendar4/calendar-utils.ts: -------------------------------------------------------------------------------- 1 | import type NLog from '../../domains/nomie-log/nomie-log' 2 | 3 | export type CalendarDayUnit = { 4 | date: Date 5 | value?: number 6 | max?: number 7 | positivity?: number 8 | percentage?: number 9 | logs?: Array 10 | } 11 | -------------------------------------------------------------------------------- /src/components/confetti/ConfettiStore.ts: -------------------------------------------------------------------------------- 1 | import confetti from 'canvas-confetti' 2 | import { wait } from '../../utils/tick/tick' 3 | 4 | type ConfettiProps = { 5 | duration?: number 6 | } 7 | 8 | export const showConfetti = async ({ ...props }: ConfettiProps = {}) => { 9 | const canvas = document.getElementById('canvas') // in app.svelte - bad I know 10 | const explosion = confetti.create(canvas, { 11 | resize: true, 12 | particleCount: 100, 13 | spread: 80, 14 | origin: { y: 0.6 }, 15 | zIndex: 10000, 16 | }) 17 | explosion() 18 | await wait(props.duration || 3000) 19 | explosion.reset() 20 | } 21 | -------------------------------------------------------------------------------- /src/components/confetti/confetti.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 | 14 |
15 | 16 | 34 | -------------------------------------------------------------------------------- /src/components/container/container.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 | 8 |
9 | 10 | 31 | -------------------------------------------------------------------------------- /src/components/day-time-grid/day-time-grid.svelte: -------------------------------------------------------------------------------- 1 |
Needs fixing
2 | -------------------------------------------------------------------------------- /src/components/dot/dot.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
9 | -------------------------------------------------------------------------------- /src/components/dymoji/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dymoji", 3 | "description": "Unique, Consistent Avatars" 4 | } -------------------------------------------------------------------------------- /src/components/dymoji/info.md: -------------------------------------------------------------------------------- 1 | # Dymoji! 2 | 3 | Dymoji is a simple web component to give you private, consistent and unique avatars for users who don't wish to share their photo. 4 | 5 | 6 | 7 | For example, this is the avatar for brandoncorbin 8 | -------------------------------------------------------------------------------- /src/components/emoji-editor/emoji-editor.svelte: -------------------------------------------------------------------------------- 1 | Old Emoji Editor 2 | -------------------------------------------------------------------------------- /src/components/emoji-selector/Emoji.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 34 | -------------------------------------------------------------------------------- /src/components/emoji-selector/EmojiDetail.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | {#if emoji} 7 | {emoji.n} 8 | {:else} 9 |   10 | {/if} 11 |
12 | 13 | 24 | -------------------------------------------------------------------------------- /src/components/emoji-selector/EmojiList.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 |
8 | {#each emojis as emoji} 9 | 10 | {/each} 11 |
12 | -------------------------------------------------------------------------------- /src/components/emoji-selector/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/components/emoji-selector/data/.gitkeep -------------------------------------------------------------------------------- /src/components/emoji-selector/many-emoji/many-emoji.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | {#each emojis as emoji} 9 | {emoji} 10 | {/each} 11 |
12 | 13 | 25 | -------------------------------------------------------------------------------- /src/components/form-group/form-group.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | 29 |
30 | 31 |
32 | -------------------------------------------------------------------------------- /src/components/grid/grid.css: -------------------------------------------------------------------------------- 1 | .n-grid { 2 | width: 100%; 3 | margin: 0 auto; 4 | display: flex; 5 | flex-direction: row; 6 | flex-wrap: wrap; 7 | align-items: flex-start; 8 | min-height: 30vh; 9 | padding: 10px 0; 10 | align-items: flex-start; 11 | justify-content: space-evenly; 12 | } 13 | .n-grid-split { 14 | display: grid; 15 | grid-template-rows: 1fr 1fr; 16 | } 17 | .n-grid.framed { 18 | background-color: var(--color-solid-2); 19 | width: calc(100% - 16pt); 20 | border-radius: 8pt; 21 | padding: 8pt; 22 | position: relative; 23 | margin: 8pt; 24 | } 25 | .n-grid.framed .btn-close { 26 | left: auto; 27 | right: 10px; 28 | top: 10px; 29 | } 30 | -------------------------------------------------------------------------------- /src/components/grid/grid.svelte: -------------------------------------------------------------------------------- 1 | 19 | 20 |
21 | 22 |
23 | 24 | 33 | -------------------------------------------------------------------------------- /src/components/icon/ion-icon.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | {#if icon} 12 | 13 | 14 | 15 | {/if} 16 | 17 | 28 | -------------------------------------------------------------------------------- /src/components/icon/n-icons/button-view.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/components/icon/n-icons/detail-view.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/icon/n-icons/no-mood-outline.svg: -------------------------------------------------------------------------------- 1 | 2 | No Mood 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/input-slider/input-slider.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 |
19 | { 21 | dispatch('change', evt.detail) 22 | }} 23 | values={[value]} 24 | {steps} 25 | {min} 26 | {max} 27 | pips 28 | /> 29 |
30 | -------------------------------------------------------------------------------- /src/components/link.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/markdown/markdown.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 |
19 | 20 |
21 | 22 | 28 | -------------------------------------------------------------------------------- /src/components/menu/menu-blocker.svelte: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /src/components/modal/iframe-modal-helper.ts: -------------------------------------------------------------------------------- 1 | import { md5 } from "../../modules/nid/nid"; 2 | import { openModal } from "../backdrop/BackdropStore2" 3 | import iFrameModal from "./iframe-modal.svelte"; 4 | export const openIFrameModal = (url:string, title?:string, messagePayload?:any)=>{ 5 | 6 | openModal({ 7 | component: iFrameModal, 8 | id: `id-${md5(url)}`, 9 | componentProps: { 10 | url, 11 | title: title || url, 12 | messagePayload 13 | } 14 | }) 15 | } -------------------------------------------------------------------------------- /src/components/ndump/ndump.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /src/components/radio-button/radio-button.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 25 | -------------------------------------------------------------------------------- /src/components/row/row.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 |
22 | 23 |
24 | -------------------------------------------------------------------------------- /src/components/share-image/share-image.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/components/share-image/share-image.svelte -------------------------------------------------------------------------------- /src/components/spacer/spacer.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | {#if gap} 9 |
10 | {/if} 11 |
12 | -------------------------------------------------------------------------------- /src/components/spinner/spinner.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/tab-panel-swiper/tab-button.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 33 | -------------------------------------------------------------------------------- /src/components/tab-panel-swiper/tab-panel.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | {#if !isActive} 10 | 11 | {:else} 12 | 13 | {/if} 14 | 15 |
16 | 17 | 23 | -------------------------------------------------------------------------------- /src/components/time-balls/time-balls.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 | {#each hours as hour} 8 |
9 | {/each} 10 |
11 | 12 | 31 | -------------------------------------------------------------------------------- /src/components/title/title.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#if listHeader} 10 |

11 | {:else if h1} 12 |

13 | {:else} 14 |

15 | {/if} 16 | {#if subTitle} 17 |

{subTitle}

18 | {/if} 19 | -------------------------------------------------------------------------------- /src/components/toast/ToastStore.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store' 2 | 3 | export type ToastType = { 4 | message: string 5 | buttonLabel?: string 6 | buttonClick?: Function 7 | timeout?: number 8 | type?: 'success' | 'failure' 9 | } 10 | 11 | export const ToastStore = writable>([]) 12 | 13 | export const removeToast = (toast: ToastType) => { 14 | ToastStore.update((s) => { 15 | return s.filter((t) => t !== toast) 16 | }) 17 | } 18 | 19 | export const showToast = (toast: ToastType) => { 20 | ToastStore.update((s) => { 21 | s.push(toast) 22 | return s 23 | }) 24 | setTimeout(() => { 25 | ToastStore.update((s) => { 26 | return s.filter((t) => t !== toast) 27 | }) 28 | }, toast.timeout || 2000) 29 | } 30 | -------------------------------------------------------------------------------- /src/components/upgrade-message/upgrade-message.svelte: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/config/sponsors.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | name: "Brandon Corbin", 4 | description: "Product Architect", 5 | url: "https://www.linkedin.com/in/brandoncorbin/?utm_source=v5.nomie.app", 6 | emoji: undefined, 7 | }, 8 | { 9 | name: "National Autism Association", 10 | description: "", 11 | url: "https://nationalautismassociation.org/?utm_source=v5.nomie.app", 12 | emoji: undefined, 13 | avatar: "/sponsors/naa-avatar.svg", 14 | }, 15 | { 16 | name: "Adopt an Orphan Elephant", 17 | description: "Sheldrick Wildlife", 18 | url: "https://www.sheldrickwildlifetrust.org/?utm_source=v5.nomie.app", 19 | emoji: "🐘", 20 | }, 21 | { 22 | name: "Become a Sponsor", 23 | description: undefined, 24 | url: "https://www.patreon.com/nomieapp?utm_source=v5.nomie.app", 25 | avatar: "/images/nomie-head-on.png", 26 | }, 27 | ]; 28 | -------------------------------------------------------------------------------- /src/config/tips.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'Tapping a trackable button to record its value in a data note', 3 | 'Nomie stores all tracking data as a note like: #coffee(1) with @dad', 4 | "You can manually type your own data notes even if a tracker doesn't exist", 5 | 'Press and hold a tracker to automatically save a log using the trackers default', 6 | 'Use the Dashboard to setup custom views of your tracking data', 7 | 'Tap the ••• on your trackable button to open up streaks, stats and more', 8 | 'You can Enable location tracking in the Settings tab', 9 | 'Use @username in notes to tag people', 10 | 'Include +context to add additional context to your day', 11 | 'Include ^pointers to leave a tag for a specific note', 12 | ] 13 | -------------------------------------------------------------------------------- /src/config/whatsNew.ts: -------------------------------------------------------------------------------- 1 | import { AppVersion } from "../modules/app-version/app-version"; 2 | import latest from "./whatsNew.json"; 3 | 4 | export default { 5 | version: AppVersion, 6 | features: latest.features, 7 | fixes: latest.fixes, 8 | chores: latest.chores, 9 | }; 10 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/PivotTable.svelte.d.ts: -------------------------------------------------------------------------------- 1 | /** @typedef {typeof __propDef.props} PivotTableProps */ 2 | /** @typedef {typeof __propDef.events} PivotTableEvents */ 3 | /** @typedef {typeof __propDef.slots} PivotTableSlots */ 4 | export default class PivotTable extends SvelteComponent<{ 5 | [x: string]: any; 6 | renderer?: typeof import("./TableRenderer.svelte").default; 7 | }, { 8 | [evt: string]: CustomEvent; 9 | }, {}> { 10 | } 11 | export type PivotTableProps = typeof __propDef.props; 12 | export type PivotTableEvents = typeof __propDef.events; 13 | export type PivotTableSlots = typeof __propDef.slots; 14 | import { SvelteComponent } from "svelte"; 15 | declare const __propDef: { 16 | props: { 17 | [x: string]: any; 18 | renderer?: typeof import("./TableRenderer.svelte").default; 19 | }; 20 | events: { 21 | [evt: string]: CustomEvent; 22 | }; 23 | slots: {}; 24 | }; 25 | export {}; 26 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/PlotlyRenderers.d.ts: -------------------------------------------------------------------------------- 1 | export default function _default(Plotly: any): { 2 | 'Grouped Column Chart': any; 3 | 'Stacked Column Chart': any; 4 | 'Grouped Bar Chart': any; 5 | 'Stacked Bar Chart': any; 6 | 'Line Chart': any; 7 | 'Dot Chart': any; 8 | 'Area Chart': any; 9 | 'Scatter Chart': typeof ScatterRenerer; 10 | 'Multiple Pie Chart': any; 11 | }; 12 | import ScatterRenerer from "./ScatterRenderer.svelte"; 13 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/TSVExportRenderer.svelte.d.ts: -------------------------------------------------------------------------------- 1 | /** @typedef {typeof __propDef.props} TsvExportRendererProps */ 2 | /** @typedef {typeof __propDef.events} TsvExportRendererEvents */ 3 | /** @typedef {typeof __propDef.slots} TsvExportRendererSlots */ 4 | export default class TsvExportRenderer extends SvelteComponent<{ 5 | [x: string]: any; 6 | }, { 7 | [evt: string]: CustomEvent; 8 | }, {}> { 9 | } 10 | export type TsvExportRendererProps = typeof __propDef.props; 11 | export type TsvExportRendererEvents = typeof __propDef.events; 12 | export type TsvExportRendererSlots = typeof __propDef.slots; 13 | import { SvelteComponent } from "svelte"; 14 | declare const __propDef: { 15 | props: { 16 | [x: string]: any; 17 | }; 18 | events: { 19 | [evt: string]: CustomEvent; 20 | }; 21 | slots: {}; 22 | }; 23 | export {}; 24 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/TableRenderers.d.ts: -------------------------------------------------------------------------------- 1 | declare const _default: { 2 | Table: typeof TableRenderer; 3 | 'Table Heatmap': any; 4 | 'Table Col Heatmap': any; 5 | 'Table Row Heatmap': any; 6 | TsvExport: typeof TsvExportRenderer; 7 | }; 8 | export default _default; 9 | import TableRenderer from "./TableRenderer.svelte"; 10 | import TsvExportRenderer from "./TSVExportRenderer.svelte"; 11 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/TableRenderers.js: -------------------------------------------------------------------------------- 1 | import TsvExportRenderer from './TSVExportRenderer.svelte'; 2 | import TableRenderer from './TableRenderer.svelte'; 3 | import { partial } from './UI/utils'; 4 | 5 | export default { 6 | Table: TableRenderer, 7 | 'Table Heatmap': partial(TableRenderer, { opts: { heatmapMode: 'full' } }), 8 | 'Table Col Heatmap': partial(TableRenderer, { opts: { heatmapMode: 'col' } }), 9 | 'Table Row Heatmap': partial(TableRenderer, { opts: { heatmapMode: 'row' } }), 10 | TsvExport: TsvExportRenderer, 11 | }; 12 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/UI/Draggable.svelte.d.ts: -------------------------------------------------------------------------------- 1 | /** @typedef {typeof __propDef.props} DraggableProps */ 2 | /** @typedef {typeof __propDef.events} DraggableEvents */ 3 | /** @typedef {typeof __propDef.slots} DraggableSlots */ 4 | export default class Draggable extends SvelteComponent<{ 5 | handle: any; 6 | close: any; 7 | }, { 8 | close: Event; 9 | } & { 10 | [evt: string]: CustomEvent; 11 | }, { 12 | default: {}; 13 | }> { 14 | } 15 | export type DraggableProps = typeof __propDef.props; 16 | export type DraggableEvents = typeof __propDef.events; 17 | export type DraggableSlots = typeof __propDef.slots; 18 | import { SvelteComponent } from "svelte"; 19 | declare const __propDef: { 20 | props: { 21 | handle: any; 22 | close: any; 23 | }; 24 | events: { 25 | close: Event; 26 | } & { 27 | [evt: string]: CustomEvent; 28 | }; 29 | slots: { 30 | default: {}; 31 | }; 32 | }; 33 | export {}; 34 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/UI/Dropdown.svelte.d.ts: -------------------------------------------------------------------------------- 1 | /** @typedef {typeof __propDef.props} DropdownProps */ 2 | /** @typedef {typeof __propDef.events} DropdownEvents */ 3 | /** @typedef {typeof __propDef.slots} DropdownSlots */ 4 | export default class Dropdown extends SvelteComponent<{ 5 | current: any; 6 | values?: any[]; 7 | }, { 8 | change: CustomEvent; 9 | } & { 10 | [evt: string]: CustomEvent; 11 | }, {}> { 12 | } 13 | export type DropdownProps = typeof __propDef.props; 14 | export type DropdownEvents = typeof __propDef.events; 15 | export type DropdownSlots = typeof __propDef.slots; 16 | import { SvelteComponent } from "svelte"; 17 | declare const __propDef: { 18 | props: { 19 | current: any; 20 | values?: any[]; 21 | }; 22 | events: { 23 | change: CustomEvent; 24 | } & { 25 | [evt: string]: CustomEvent; 26 | }; 27 | slots: {}; 28 | }; 29 | export {}; 30 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/UI/Plotly.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 29 | 30 | {#if Plotly} 31 |
32 | {:else} 33 |

Error! Plotly.js not initialized.

34 | {/if} 35 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/UI/utils.d.ts: -------------------------------------------------------------------------------- 1 | export function partial(Component: any, partialProps?: {}): any; 2 | export function clickOutside(node: any): { 3 | destroy(): void; 4 | }; 5 | export function clickClose(node: any, selector: any): { 6 | destroy(): void; 7 | }; 8 | export function delta(newObj: any, oldObj: any): {}; 9 | -------------------------------------------------------------------------------- /src/domains/analytics/Pivot-table/index.d.ts: -------------------------------------------------------------------------------- 1 | import PivotTable from "./PivotTable.svelte"; 2 | import PivotTableUI from "./PivotTableUI.svelte"; 3 | export { PivotTable, PivotTableUI }; 4 | -------------------------------------------------------------------------------- /src/domains/awards/awards.spec.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | import { test, describe, expect } from 'vitest' 3 | describe('Award Tests', () => { 4 | // const day = dayjs() 5 | test('Should handle dates', () => { 6 | const dateString1 = '2021-12-09T14:04:54.911Z' 7 | const date = new Date(dateString1) 8 | expect(dayjs(date).format('YYYY-MM-DD')).toBe('2021-12-09') 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/domains/awards/components/awards-preview-list.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 |
🥇
16 |
17 | {#if awardsToShow.length} 18 | {#each awardsToShow as award, index} 19 | award 20 | {/each} 21 | {:else} 22 | None 23 | {/if} 24 |
25 |
26 | -------------------------------------------------------------------------------- /src/domains/awards/helpers/award-chain.spec.ts: -------------------------------------------------------------------------------- 1 | import DumbStorage from '../../storage/engines/storage.dumb' 2 | import AwardChain from './award-chain.class' 3 | import Award from './award.class' 4 | import { it, describe, expect } from 'vitest' 5 | export async function generateMockChain(): Promise { 6 | let chain = new AwardChain(DumbStorage, 'awards.json') 7 | await chain.open() 8 | await chain.add( 9 | new Award({ 10 | name: 'Test Award', 11 | reason: 'Need to Test!', 12 | }) 13 | ) 14 | return chain 15 | } 16 | 17 | describe('AwardChain', () => { 18 | it('should create a new one', async () => { 19 | const chain = await generateMockChain() 20 | 21 | expect(chain.chain.length).toEqual(2) 22 | expect(chain.valid).toBe(true) 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/domains/awards/helpers/award-utils.spec.ts: -------------------------------------------------------------------------------- 1 | import Award from './award.class' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Award Chain Test', () => { 4 | it('Should be ok', () => { 5 | expect(Award).toBeTruthy() 6 | }) 7 | }) 8 | -------------------------------------------------------------------------------- /src/domains/awards/helpers/award.spec.ts: -------------------------------------------------------------------------------- 1 | import Award from './award.class' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Award', () => { 4 | it('should create a new one', () => { 5 | let award = new Award({ name: 'Test Award' }) 6 | expect(award.id).toBeTruthy() 7 | }) 8 | it('should require a name', () => { 9 | try { 10 | let award = new Award() 11 | expect(award).toBeTruthy() 12 | } catch (e) { 13 | expect(e).toBeTruthy() 14 | } 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /src/domains/board/useBoardSortModal.ts: -------------------------------------------------------------------------------- 1 | import BoardSorter from './board-sort.svelte' 2 | import { openModal } from '../../components/backdrop/BackdropStore2' 3 | import { writable } from 'svelte/store' 4 | export const showBoardSorter = writable(false) 5 | 6 | export const openBoardSorter = () => { 7 | openModal({ 8 | id: 'board-sorter', 9 | component: BoardSorter, 10 | componentProps: {}, 11 | }) 12 | } 13 | 14 | export const useBoardSortModal = () => { 15 | return [ 16 | () => { 17 | showBoardSorter.update((s) => true) 18 | }, 19 | () => { 20 | showBoardSorter.update((s) => false) 21 | }, 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/domains/context/context-editor-view.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/domains/csvr/csvr-importer.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | Import Builder 24 | -------------------------------------------------------------------------------- /src/domains/csvr/csvr.svelte: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /src/domains/csvr/samples/zenobase.csv: -------------------------------------------------------------------------------- 1 | tag,timestamp 2 | Peed,2020-08-30T08:28:00.000-04:00 3 | Peed,2020-08-29T08:28:00.000-04:00 4 | Peed,2020-08-28T08:28:00.000-04:00 5 | Peed,2020-08-27T08:28:00.000-04:00 6 | Peed,2020-08-23T08:28:00.000-04:00 7 | Peed,2020-08-22T08:28:00.000-04:00 8 | Peed,2020-08-12T08:28:00.000-04:00 9 | Peed,2020-08-11T08:28:00.000-04:00 -------------------------------------------------------------------------------- /src/domains/dashboard2/dashboard-empty-view.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | { 17 | createNewWidget() 18 | }} 19 | /> 20 | -------------------------------------------------------------------------------- /src/domains/dashboard2/widget/types/widget-focus.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | {#await init()} 19 | Loading... 20 | {:then value} 21 |
22 | 23 |
24 | {:catch error} 25 | error{error.message} 26 | {/await} 27 | 28 | 30 | -------------------------------------------------------------------------------- /src/domains/dashboard2/widget/types/widget-map.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | {#if widget} 14 |
15 | 16 |
17 | {/if} 18 | -------------------------------------------------------------------------------- /src/domains/dashboard2/widget/widget-list-item.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | {widget.getLabel()} 12 | 13 | -------------------------------------------------------------------------------- /src/domains/goals/goal-detail/goal-detail.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | {#if goal} 15 | {#if goal.duration === 'day'} 16 | 17 | {:else if goal.duration === 'week'} 18 | 19 | {:else if goal.duration === 'month'} 20 | 21 | {/if} 22 | {:else} 23 | 24 | 25 | 26 | {/if} 27 |
28 | -------------------------------------------------------------------------------- /src/domains/layout/page.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 |
20 | 21 | {#if hasSubHeader} 22 | 23 | 24 | 25 | {/if} 26 |
27 |
28 | 29 |
30 |
31 | -------------------------------------------------------------------------------- /src/domains/locations/LocationClass.ts: -------------------------------------------------------------------------------- 1 | import Geohash from 'latlon-geohash' 2 | import nid from '../../modules/nid/nid' 3 | 4 | export type ILocation = { 5 | lat: number 6 | lng: number 7 | name: string 8 | hash?: string 9 | id?: string 10 | } 11 | 12 | export default class Location { 13 | lat: number 14 | lng: number 15 | name: string 16 | hash?: string 17 | id: string 18 | 19 | constructor(starter: any) { 20 | this.lat = starter.lat 21 | this.lng = starter.lng 22 | this.name = starter.name 23 | this.hash = starter.hash || this.getGeoHash() 24 | this.id = starter.id || `${this.hash}:${nid(4)}` 25 | } 26 | getGeoHash(): string { 27 | return Geohash.encode(this.lat, this.lng, 10) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/domains/log-cache/LogCacheStore.ts: -------------------------------------------------------------------------------- 1 | import { closeModal, openModal } from '../../components/backdrop/BackdropStore2' 2 | 3 | import LogCacheModal from './log-cache-modal.svelte' 4 | import { writable } from 'svelte/store' 5 | 6 | export const LogCacheStore = writable(undefined) 7 | 8 | export const openLogCacheModal = (date: Date = new Date()) => { 9 | openModal({ 10 | id: 'log-cache', 11 | position: 'fullscreen', 12 | component: LogCacheModal, 13 | componentProps: {}, 14 | }) 15 | } 16 | export const closeLogCacheModal = () => { 17 | closeModal('log-cache') 18 | } 19 | -------------------------------------------------------------------------------- /src/domains/map/location-list-item.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/domains/map/location-list-item.svelte -------------------------------------------------------------------------------- /src/domains/nomie-log/LogEditorStore.ts: -------------------------------------------------------------------------------- 1 | import LogEditorModal from './log-editor/log-editor-modal.svelte' 2 | import type NLog from './nomie-log' 3 | import type { NomieLogType } from './nomie-log' 4 | import { objectHash } from '../../modules/object-hash/object-hash' 5 | import { openModal } from '../../components/backdrop/BackdropStore2' 6 | import { writable } from 'svelte/store' 7 | import { trackEvent } from '../usage/stat-ping' 8 | export const LogEditorStore = writable(undefined) 9 | 10 | export const openLogEditor = (log: NomieLogType) => { 11 | trackEvent('open_log_editor'); 12 | openModal({ 13 | id: `log-editor-${objectHash(log)}`, 14 | position: 'fullscreen', 15 | component: LogEditorModal, 16 | componentProps: { 17 | log, 18 | }, 19 | }) 20 | // LogEditorStore.update((s) => log) 21 | } 22 | export const closeLogEditor = () => { 23 | // LogEditorStore.update((s) => undefined) 24 | } 25 | -------------------------------------------------------------------------------- /src/domains/nomie-log/log-display-modal/LogDisplayStore.ts: -------------------------------------------------------------------------------- 1 | import LogDisplayModal from './log-display-modal.svelte' 2 | import type NLog from '../nomie-log' 3 | import { openModal } from '../../../components/backdrop/BackdropStore2' 4 | import { writable } from 'svelte/store' 5 | 6 | export const LogDisplayStore = writable({ 7 | log: undefined as undefined | NLog, 8 | }) 9 | 10 | export const openLogDisplay = (log: NLog) => { 11 | openModal({ 12 | position: 'bottom', 13 | id: `display-log-${log._id}`, 14 | componentProps: { log }, 15 | component: LogDisplayModal, 16 | }) 17 | // LogDisplayStore.update((s) => { 18 | // s.log = log 19 | // return s 20 | // }) 21 | } 22 | 23 | export const closeLogDisplay = () => { 24 | // LogDisplayStore.update((s) => { 25 | // s.log = undefined 26 | // return s 27 | // }) 28 | } 29 | -------------------------------------------------------------------------------- /src/domains/nomie-log/log-list-scroller/log-list-scroller.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | 10 |
11 | 12 |
13 |
14 |
15 | 16 | 23 | -------------------------------------------------------------------------------- /src/domains/nomie-log/nomie-log-utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { isDataNote, isTextNote, notePercentage } from './nomie-log-utils' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Nomie Log Utils', () => { 4 | it('should know if a note is a note or a data note', () => { 5 | const note1 = '#brandon is #taging a #bunch of #stuff and #should be a #note' 6 | const note2 = '#brandon #taging #bunch #stuff and #should be NOT be a #note' 7 | 8 | expect(notePercentage(note1)).toBe(50) 9 | expect(notePercentage(note2)).toBe(45) 10 | 11 | expect(isTextNote(note1)).toBe(true) 12 | expect(isTextNote(note2)).toBe(false) 13 | 14 | expect(isDataNote(note1)).toBe(false) 15 | expect(isDataNote(note2)).toBe(true) 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /src/domains/nomie-log/nomie-log-utils.ts: -------------------------------------------------------------------------------- 1 | import { tokenizeLite } from '../../modules/tokenizer/lite' 2 | import math from '../../utils/math/math' 3 | 4 | export const notePercentage = (str: string): number => { 5 | const tokens = tokenizeLite(str) 6 | const generics = tokens.filter((t) => t.type === 'generic').length 7 | return Math.round(100 * math.percentage(tokens.length, generics)) / 100 8 | } 9 | 10 | export const isTextNote = (str: string): boolean => { 11 | return notePercentage(str) >= 50 12 | } 13 | 14 | export const isDataNote = (str: string): boolean => { 15 | return notePercentage(str) < 50 16 | } 17 | 18 | export const isLongFormat = (str: string): boolean => { 19 | if (str.split(' ').length < 5) return false 20 | return isTextNote(str) 21 | } 22 | -------------------------------------------------------------------------------- /src/domains/on-this-day/on-this-day-helper.spec.ts: -------------------------------------------------------------------------------- 1 | import { hasNote } from './on-this-day-utils' 2 | import { it, describe, expect } from 'vitest' 3 | describe('On this day helper', () => { 4 | it('should know if a note is a note or a data note', () => { 5 | const note1 = '#brandon is #taging a #bunch of #stuff and #should be a #note' 6 | const note2 = '#brandon #taging #bunch #stuff and #should #note' 7 | expect(hasNote(note1)).toBe(true) 8 | 9 | expect(hasNote(note2)).toBe(false) 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/domains/on-this-day/on-this-day-utils.ts: -------------------------------------------------------------------------------- 1 | import extractor from '../../utils/extract/extract' 2 | import math from '../../utils/math/math' 3 | 4 | export function hasNote(str, fuzzy: boolean = true): boolean { 5 | let parsed = extractor.parse(str, { includeGeneric: true }) 6 | let generic = parsed.filter((tElement) => { 7 | return tElement.type == 'generic' 8 | }) 9 | let percentage = math.percentage(parsed.length, generic.length) 10 | 11 | if (generic.length === 0) { 12 | return false 13 | } else if (percentage >= 20) { 14 | return true 15 | } else { 16 | return false 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/domains/on-this-day/useOnThisDayModal.ts: -------------------------------------------------------------------------------- 1 | import OnThisDayModal from './on-this-day.svelte' 2 | import { openModal } from '../../components/backdrop/BackdropStore2' 3 | import { writable } from 'svelte/store' 4 | 5 | const state: Date | undefined = undefined 6 | export const OnThisDayModalStore = writable(state) 7 | 8 | export const openOnThisDayModal = (day: Date) => { 9 | if (day) { 10 | OnThisDayModalStore.update((s) => day) 11 | openModal({ 12 | id: `on-this-day-modal-${day.toDateString()}`, 13 | component: OnThisDayModal, 14 | componentProps: {}, 15 | }) 16 | } 17 | } 18 | 19 | export const changeOnThisDay = (date: Date) => { 20 | OnThisDayModalStore.update((s) => { 21 | return date 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /src/domains/people/PeopleStore.ts: -------------------------------------------------------------------------------- 1 | import NPaths from '../../paths' 2 | import Person from './Person.class' 3 | import { createKVStore } from '../../store/KVStore' 4 | import { derived } from 'svelte/store' 5 | 6 | export const PeopleStore = createKVStore(NPaths.storage.people(), { 7 | label: 'People', 8 | key: 'username', 9 | itemInitializer(item: any) { 10 | return new Person(item) 11 | }, 12 | itemSerializer(item: Person) { 13 | return JSON.parse(JSON.stringify(item)) 14 | }, 15 | }) 16 | 17 | export const PeopleStoreAsArray = derived(PeopleStore, ($PeopleStore) => { 18 | return Object.keys($PeopleStore).map((key) => { 19 | return $PeopleStore[key] 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /src/domains/people/usePersonModal.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store' 2 | import type Person from './Person.class' 3 | 4 | type PersonModalType = { 5 | person?: Person 6 | date?: Date 7 | } 8 | 9 | export const PersonModalStore = writable(undefined) 10 | 11 | export const openPersonModal = (person: Person, options?: { date: Date }) => { 12 | PersonModalStore.update((s) => { 13 | s = s || {} 14 | s.person = person 15 | s.date = options?.date 16 | return s 17 | }) 18 | } 19 | export const closePersonModal = () => { 20 | PersonModalStore.update((s) => undefined) 21 | } 22 | -------------------------------------------------------------------------------- /src/domains/pin-lock/pin-helper.ts: -------------------------------------------------------------------------------- 1 | import PinModal from './pin-lock.svelte' 2 | import { openModal } from '../../components/backdrop/BackdropStore2' 3 | 4 | import { Interact } from '../../store/interact' 5 | 6 | type OpenPinLockProps = { 7 | canClose?: boolean 8 | title?: string 9 | isMatch: Function 10 | } 11 | 12 | export const openPinLock = async (props: OpenPinLockProps) => { 13 | return new Promise((resolve) => { 14 | openModal({ 15 | id: 'pin-lock', 16 | position: 'center', 17 | component: PinModal, 18 | tappable: props.canClose, 19 | componentProps: { 20 | title: props.title, 21 | canClose: props.canClose, 22 | 23 | onPin: (pin) => { 24 | if (props.isMatch(pin)) { 25 | resolve(pin) 26 | } else { 27 | Interact.error('Invalid Pin. Try again') 28 | } 29 | }, 30 | }, 31 | }) 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /src/domains/plugins/plugins-more-menu.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | {#each list as plugin} 14 | openPluginModal(plugin)} title={plugin.name}> 15 | {plugin.emoji} 16 | 17 | {/each} 18 | -------------------------------------------------------------------------------- /src/domains/pointers/PointerStore_old.ts: -------------------------------------------------------------------------------- 1 | import { closeModal, openModal } from "../../components/backdrop/BackdropStore2"; 2 | //import { PluginClass } from "./plugin-helpers"; 3 | //import PluginInstallerModal from "./plugin-installer-modal.svelte"; 4 | //import pointerModalSvelte from "./pointer-modal.svelte"; 5 | import { AllTrackablesAsArray} from '../trackable/TrackableStore' 6 | 7 | import type { ITrackables } from '../trackable/trackable-utils' 8 | import { toTrackableArray } from '../trackable/trackable-utils' 9 | import pointersModalSvelte from "./pointers-modal.svelte"; 10 | 11 | 12 | export const openPointersModal = () => { 13 | openModal({ 14 | id: 'pointers', 15 | component: pointersModalSvelte, 16 | componentProps: { 17 | 18 | } 19 | }) 20 | } 21 | 22 | 23 | export const closePointerModal = () => { 24 | 25 | } 26 | 27 | export const closePointersModal = () => { 28 | closeModal('pointers'); 29 | } -------------------------------------------------------------------------------- /src/domains/pointers/pointer-editor-view.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/domains/positivity-editor/positivity-helpers.ts: -------------------------------------------------------------------------------- 1 | import type { PositivityType } from '../../config/appConfig' 2 | import appConfig from '../../config/appConfig' 3 | import { openDropMenu } from '../../components/menu/useDropmenu' 4 | 5 | export const openScoreSelectMenu = (target): Promise => { 6 | return new Promise((resolve, reject) => { 7 | openDropMenu( 8 | target, 9 | appConfig.positivity 10 | .sort((a, b) => (a.score < b.score ? 1 : -1)) 11 | .map((pos) => { 12 | return { 13 | title: pos.label, 14 | emoji: pos.emoji, 15 | click() { 16 | resolve(pos) 17 | }, 18 | } 19 | }) 20 | ) 21 | }) 22 | } 23 | -------------------------------------------------------------------------------- /src/domains/preferences/LaunchCount.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store' 2 | import { parseNumber } from '../../utils/parseNumber/parseNumber' 3 | 4 | const launchCount: number = parseNumber(localStorage.getItem('launchCount') || '1') 5 | export const LaunchCount = writable(launchCount) 6 | 7 | export const trackLaunch = () => { 8 | localStorage.setItem('launchCount', `${launchCount + 1}`) 9 | } 10 | -------------------------------------------------------------------------------- /src/domains/related/related-worker.ts: -------------------------------------------------------------------------------- 1 | import calculateCorrelation from 'calculate-correlation' 2 | 3 | type MessageType = { 4 | data: { 5 | tag: string 6 | values: Array 7 | dates: Array 8 | compareTo: Array<{ tag: string; values: Array }> 9 | } 10 | } 11 | 12 | onmessage = (e: MessageType) => { 13 | const message = e.data 14 | const base = message.values.map((v) => (isNaN(v) ? 0 : v)) 15 | const scores = [] 16 | 17 | Object.keys(message.compareTo).forEach((tag) => { 18 | const compareValues = message.compareTo[tag].map((v) => (isNaN(v) ? 0 : v)) 19 | // let score = linearRegression(base, compareValues) 20 | // let score = -sampleCorrelation(base, compareValues) 21 | let score = calculateCorrelation(base, compareValues, { decimals: 5 }) 22 | scores.push({ tag, score }) 23 | }) 24 | 25 | postMessage(scores) 26 | } 27 | -------------------------------------------------------------------------------- /src/domains/settings/settings-account-list.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/domains/settings/settings-account-list.svelte -------------------------------------------------------------------------------- /src/domains/settings/settings-helpers.ts: -------------------------------------------------------------------------------- 1 | 2 | export const showNomieConnectPopup = () => { 3 | alert("Remove me - settings-helper.ts") 4 | } -------------------------------------------------------------------------------- /src/domains/stats/ignore-zeros.spec.ts: -------------------------------------------------------------------------------- 1 | import ignoreZeros from './ignore-zeros' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Ignore Zeros from an array by back filling', () => { 4 | it('should remove zeros and replace with the last known', () => { 5 | let arr: Array = [0, 10, 0, 0, 0] 6 | expect(ignoreZeros(arr)[3]).toBe(10) 7 | 8 | let arr2: Array = [0, 1.3, 0, 4, 0, 0, 0, 0, 20, 0, 0, 3.4, 0] 9 | let answer = [0, 1.3, 1.3, 4, 4, 4, 4, 4, 20, 20, 20, 3.4, 3.4] 10 | expect(ignoreZeros(arr2).join()).toBe(answer.join()) 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /src/domains/stats/ignore-zeros.ts: -------------------------------------------------------------------------------- 1 | export default function (dataset: Array): Array { 2 | let lastKnownValue = 0; 3 | return dataset.map((value, index) => { 4 | if (value !== 0) { 5 | lastKnownValue = value; 6 | } else if (value === 0 && index > 0) { 7 | value = lastKnownValue; 8 | } 9 | return value; 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /src/domains/stats/stats-time.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/domains/stats2/overview/overview-range.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
I'm a Range Over View!
10 | -------------------------------------------------------------------------------- /src/domains/stats2/overview/overview-timer.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
I'm a Timer Over View!
10 | -------------------------------------------------------------------------------- /src/domains/stats2/overview/overview-value.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /src/domains/steak/streak-monitor.ts: -------------------------------------------------------------------------------- 1 | import type { Dayjs } from 'dayjs' 2 | import dayjs from 'dayjs' 3 | 4 | type StreakMonitorType = { 5 | date: string 6 | streak: number 7 | today?: Dayjs 8 | } 9 | 10 | export class StreakMonitor { 11 | today: Dayjs = dayjs() 12 | date: Dayjs 13 | streak: number = 0 14 | constructor(starter: StreakMonitorType) { 15 | if (starter.today) this.today = starter.today 16 | 17 | this.date = dayjs(new Date(starter.date)) 18 | let diff = this.date.diff(this.today, 'day') 19 | if (diff == 1) { 20 | this.streak = this.streak + 1 21 | this.date = dayjs() 22 | } else if (diff > 1) { 23 | this.streak = 0 24 | } 25 | } 26 | get asObject() { 27 | return { 28 | date: this.date.toJSON(), 29 | streak: this.streak, 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/domains/storage/side-storage.ts: -------------------------------------------------------------------------------- 1 | import appConfig from '../../config/appConfig' 2 | 3 | /* SideStore is a class that allows you to store data in the browser's localStorage, and it's a lot 4 | easier to use than localStorage directly. */ 5 | export class SideStore { 6 | dbPath: string 7 | data: any 8 | constructor(path) { 9 | this.dbPath = `${appConfig.data_root}/localDB/${path}` 10 | try { 11 | this.data = JSON.parse(localStorage.getItem(this.dbPath) || '{}') 12 | } catch (e) { 13 | console.error("SideStorage could not parse the JSON data"); 14 | } 15 | } 16 | get(key) { 17 | return this.data.hasOwnProperty(key) ? this.data[key] : null 18 | } 19 | put(key, value) { 20 | this.data[key] = value 21 | localStorage.setItem(this.dbPath, JSON.stringify(this.data)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/domains/templates/available-templates-list.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#each templateRefs as templateRef, index} 10 | { 15 | openTemplateRef(templateRef.url) 16 | }} 17 | > 18 | {templateRef.title} 19 | 20 | {/each} 21 | -------------------------------------------------------------------------------- /src/domains/templates/template-preview-modal.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 |
24 |
25 | -------------------------------------------------------------------------------- /src/domains/timeline/timeline-item.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | {item.usage.length}! 9 |
10 | -------------------------------------------------------------------------------- /src/domains/trackable/trackable-editor/person/trackable-editor-person.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 17 | 18 | -------------------------------------------------------------------------------- /src/domains/tracker/input/tracker-input-utils.ts: -------------------------------------------------------------------------------- 1 | import type TrackerClass from '../../../modules/tracker/TrackerClass' 2 | 3 | export type TrackerInputResponseType = { 4 | value?: number 5 | tracker: TrackerClass 6 | ready?: boolean 7 | suffix?: string 8 | action?: 'add' | 'save' 9 | note?: string 10 | } 11 | -------------------------------------------------------------------------------- /src/domains/tracker/timers/useTimersModal.ts: -------------------------------------------------------------------------------- 1 | import TimersModal from './timers-modal.svelte' 2 | import { openModal } from '../../../components/backdrop/BackdropStore2' 3 | import { wait } from '../../../utils/tick/tick' 4 | import { writable } from 'svelte/store' 5 | 6 | export const RunningTimersModalStore = writable({ 7 | showDom: false, 8 | showModal: false, 9 | }) 10 | 11 | export const showRunningTimersModal = async (): Promise => { 12 | openModal({ 13 | id: `timers-modal`, 14 | component: TimersModal, 15 | tappable: true, 16 | componentProps: {}, 17 | position: 'bottom', 18 | }) 19 | } 20 | 21 | export const hideRunningTimersModal = async () => { 22 | RunningTimersModalStore.update((s) => { 23 | s.showModal = false 24 | return s 25 | }) 26 | await wait(200) 27 | RunningTimersModalStore.update((s) => { 28 | s.showDom = false 29 | return s 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /src/domains/uom/README.md: -------------------------------------------------------------------------------- 1 | # Unit of Measurement 2 | 3 | Nomie's Unit of Messurement is used to convert a UOM and a value into a formated string. 4 | 5 | ``` 6 | import { uom } from "nomie-utils" 7 | 8 | console.log(uom.format(100.34, 'dollars')) 9 | ``` 10 | 11 | ## Methods 12 | 13 | ### format(value, uomKey) 14 | 15 | Returns a formated value. Example `uom.format(10,'dollars')` generates `$10.00` 16 | 17 | --- 18 | 19 | ### toArray() 20 | 21 | Get an array of all possible UOMS 22 | 23 | --- 24 | 25 | ### toGroupedArray() 26 | 27 | An object of types containing an array of UOMs 28 | 29 | --- 30 | 31 | ### plural(uomKey) 32 | 33 | Get the plural name of the unit. For example: `uom.plural('inch')` outputs `Inches` 34 | 35 | --- 36 | -------------------------------------------------------------------------------- /src/domains/uom/uom-editor/useUomModal.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store' 2 | import type { UomType } from '../../utils/nomie-uom/uoms' 3 | 4 | type uomModalStoreType = { 5 | uom?: UomType 6 | onSave?: Function 7 | onCancel?: Function 8 | show?: boolean 9 | } 10 | 11 | const state: uomModalStoreType = {} 12 | export const UomModalStore = writable(state) 13 | 14 | type OpenUomEditorProps = { 15 | uom?: UomType 16 | onSave?: Function 17 | onCancel?: Function 18 | } 19 | export const openUomEditor = (props: OpenUomEditorProps) => { 20 | UomModalStore.update((s) => { 21 | s.onCancel = props.onCancel 22 | s.onSave = props.onSave 23 | s.uom = props.uom 24 | s.show = true 25 | return s 26 | }) 27 | } 28 | 29 | export const closeUomEditor = () => { 30 | UomModalStore.update((s) => { 31 | s.onCancel = undefined 32 | s.onSave = undefined 33 | s.uom = undefined 34 | s.show = false 35 | return s 36 | }) 37 | } 38 | -------------------------------------------------------------------------------- /src/domains/uom/uom-types.ts: -------------------------------------------------------------------------------- 1 | export type UOMGroupingTypes = 2 | | 'general' 3 | | 'currency' 4 | | 'timer' 5 | | 'time' 6 | | 'distance' 7 | | 'temperature' 8 | | 'weight' 9 | | 'volume' 10 | | 'health' 11 | 12 | export interface UOMElement { 13 | singular: string 14 | plural: string 15 | symbol: string 16 | type: UOMGroupingTypes 17 | symbolAffix?: 'post' | 'pre' 18 | display?: Function 19 | symbolSpace?: boolean 20 | system?: 'metric' | 'imperial' 21 | cousin?: string 22 | key?: string 23 | convert?: Function 24 | } 25 | 26 | export interface IUOM { 27 | [key: string]: UOMElement 28 | } 29 | -------------------------------------------------------------------------------- /src/domains/usage/stat-ping.ts: -------------------------------------------------------------------------------- 1 | declare var sa_event:any 2 | export const trackEvent = (label:string) => { 3 | sa_event(label) 4 | } -------------------------------------------------------------------------------- /src/env.ts: -------------------------------------------------------------------------------- 1 | import isObject from 'lodash/isObject' 2 | 3 | //@ts-ignore 4 | const base: any = isObject(import.meta.env) ? import.meta.env : { env: {} } 5 | 6 | export const Env = { 7 | apiKey: `${base.VITE_APP_APIKEY}`, 8 | authDomain: `${base.VITE_APP_AUTHDOMAIN}`, 9 | projectId: `${base.VITE_APP_PROJECTID}`, 10 | storageBucket: `${base.VITE_APP_STORAGEBUCKET}`, 11 | messagingSenderId: `${base.VITE_APP_MESSAGINGSENDERID}`, 12 | appId: `${base.VITE_APP_APPID}`, 13 | measurementId: `${base.VITE_APP_MEASUREMENTID}`, 14 | } 15 | -------------------------------------------------------------------------------- /src/lang/en.ts: -------------------------------------------------------------------------------- 1 | // This is generated by the code itself 2 | // To generate a base run node build-tools/extract-language.js 3 | 4 | export default { 5 | translation: {}, 6 | }; 7 | -------------------------------------------------------------------------------- /src/lang/lang.ts: -------------------------------------------------------------------------------- 1 | import Italian from "./it"; 2 | import SimplifiedChinese from "./zh-cn"; 3 | import Test from "./test"; 4 | import base from "./base"; 5 | import de from "./de"; 6 | export default { 7 | en: { 8 | label: "English", 9 | lang: base, 10 | }, 11 | it: { 12 | label: "Italian", 13 | lang: Italian, 14 | }, 15 | de: { 16 | label: "German", 17 | lang: de, 18 | }, 19 | zhcn: { 20 | label: "Simplified Chinese", 21 | lang: SimplifiedChinese, 22 | }, 23 | test: { 24 | label: "Tester", 25 | lang: Test, 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /src/modules/app-version/app-version.ts: -------------------------------------------------------------------------------- 1 | export const AppVersion = import.meta.env.PACKAGE_VERSION; 2 | -------------------------------------------------------------------------------- /src/modules/board/board.ts: -------------------------------------------------------------------------------- 1 | import nid from "../nid/nid"; 2 | 3 | export interface IBoard { 4 | index?: number; 5 | id?: string; 6 | trackers: Array; 7 | label: string; 8 | } 9 | export default class Board { 10 | index?: number; 11 | id?: string; 12 | trackers: Array; 13 | label: string; 14 | constructor(starter: IBoard) { 15 | if (starter) { 16 | this.index = starter.index; 17 | this.id = starter.id; 18 | this.trackers = starter.trackers; 19 | this.label = starter.label; 20 | } else { 21 | this.id = nid(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/modules/chainer/chainer.spec.ts: -------------------------------------------------------------------------------- 1 | import Chainer from './chainer' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Chainer', () => { 4 | it('should chain steps', () => { 5 | let test = 'Hi there' 6 | let d = new Chainer(test).whenExists((val) => val).value 7 | expect(d).toBe('Hi there') 8 | }) 9 | }) 10 | -------------------------------------------------------------------------------- /src/modules/chainer/chainer.ts: -------------------------------------------------------------------------------- 1 | class Chainer { 2 | value: any; 3 | constructor(v: any) { 4 | this.value = v; 5 | } 6 | whenExists(f: any) { 7 | if (!this.value) return this; 8 | return new Chainer(f(this.value)); 9 | } 10 | } 11 | 12 | export default Chainer; 13 | -------------------------------------------------------------------------------- /src/modules/colors/string-to-color.ts: -------------------------------------------------------------------------------- 1 | import colors from './colors' 2 | 3 | export const strToColor = (str) => { 4 | return new Hash(str).pick(colors) 5 | } 6 | 7 | export class Hash { 8 | hash: number 9 | assets: any 10 | constructor(id) { 11 | this.hash = this.fh5(id) 12 | this.assets = {} 13 | } 14 | fh5(s) { 15 | //Knuth multiplicative hash 16 | let h = 0xdeadbeef 17 | for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 2654435761) 18 | return (h ^ (h >>> 16)) >>> 0 19 | } 20 | xor() { 21 | return this.hash % 2 22 | } 23 | pick(arr, seed = '') { 24 | // Convert to hash+seed, then to hex 25 | // then get from pos 3 2 chars 26 | const digit2 = Math.sqrt(parseInt(`${this.hash}${seed}`, 16)) 27 | .toString() 28 | .substr(3, 4) 29 | return arr.length ? arr[parseInt(digit2) % arr.length] : null 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/modules/date-diff/date-diff.ts: -------------------------------------------------------------------------------- 1 | export const dateDiff = (date1: Date, date2: Date, part: 'days' = 'days') => { 2 | // To calculate the time difference of two dates 3 | var timeDiff = date2.getTime() - date1.getTime() 4 | // To calculate the no. of days between two dates 5 | var dayDiff = timeDiff / (1000 * 3600 * 24) 6 | // return day diff 7 | return Math.abs(dayDiff) 8 | } 9 | -------------------------------------------------------------------------------- /src/modules/emoji-count/emoji-count.spec.ts: -------------------------------------------------------------------------------- 1 | import emojiCount from './emoji-count' 2 | import { it, describe, expect } from 'vitest' 3 | describe('emoji-count', () => { 4 | it('should count the right number of emojis', () => { 5 | expect(emojiCount(`☀️😙❤️🍔`)).toBe(4) 6 | expect(emojiCount(`WD`)).toBe(0) 7 | expect(emojiCount(`👏😆`)).toBe(2) 8 | }) 9 | }) 10 | -------------------------------------------------------------------------------- /src/modules/emoji-count/emoji-count.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * From Jon New's Article 3 | * https://blog.jonnew.com/posts/poo-dot-length-equals-two 4 | * Yes he said we shouldn't use it. But honestly, it's the best 5 | * for what we need. Just to identify if we have multiple emojis 6 | * in the avatar, so the other Regex solutions are WAY overkill. 7 | * @param str 8 | */ 9 | export default function emojiCount(str: string): number { 10 | const joiner = "\u{200D}"; 11 | const split = str.replace(/[a-zA-Z0-9]+/g, "").split(joiner); 12 | let count = 0; 13 | 14 | for (const s of split) { 15 | const num = Array.from(s.split(/[\ufe00-\ufe0f]/).join("")).length; 16 | count += num; 17 | } 18 | 19 | return count / split.length; 20 | } 21 | -------------------------------------------------------------------------------- /src/modules/export/export-helper.ts: -------------------------------------------------------------------------------- 1 | import Exporter from './export' 2 | 3 | export default async function exportData(onChange: Function): Promise { 4 | const Export = new Exporter() 5 | return new Promise((resolve) => { 6 | Export.onChange((change) => { 7 | if (onChange) onChange(change) 8 | }) 9 | Export.start() 10 | .then(() => { 11 | resolve(true) 12 | }) 13 | .catch((e) => { 14 | resolve(false) 15 | }) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /src/modules/hooks/useAutoresize.ts: -------------------------------------------------------------------------------- 1 | export function autoresize(el) { 2 | 3 | const onChange = ()=>{ 4 | const baseHeight = 100; 5 | const dynamic = (el.scrollHeight); 6 | el.style.cssText = 'height:auto; padding:0'; 7 | el.style.cssText = 'height:' + (dynamic > baseHeight ? dynamic : baseHeight) + 'px'; 8 | } 9 | 10 | el.addEventListener('input', onChange); 11 | el.addEventListener('focus', onChange); 12 | return { 13 | destroy() { 14 | el.removeEventListener('input', onChange); 15 | el.removeEventListener('focus', onChange); 16 | } 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /src/modules/html-elements/position.ts: -------------------------------------------------------------------------------- 1 | export const getElementPosition = ( 2 | elem: HTMLElement 3 | ): { top: number; left: number; eleHeight: number; eleWidth: number } | undefined => { 4 | if (elem) { 5 | const box: DOMRect = elem.getBoundingClientRect() 6 | 7 | const body = document.body 8 | const docEl = document.documentElement 9 | 10 | const scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop 11 | const scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft 12 | 13 | const clientTop = docEl.clientTop || body.clientTop || 0 14 | const clientLeft = docEl.clientLeft || body.clientLeft || 0 15 | 16 | const top = box.top + scrollTop - clientTop 17 | const left = box.left + scrollLeft - clientLeft 18 | 19 | return { top: Math.round(top), left: Math.round(left), eleHeight: box.height, eleWidth: box.width } 20 | } 21 | return undefined 22 | } 23 | -------------------------------------------------------------------------------- /src/modules/localstorage/localStorageObj.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/modules/localstorage/localStorageObj.ts -------------------------------------------------------------------------------- /src/modules/location-extractor/location-exctractor.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, describe, expect } from 'vitest' 2 | import NLog from '../../domains/nomie-log/nomie-log' 3 | import extractLocations from './location-extractor' 4 | 5 | const testLogs = [ 6 | new NLog({ lat: 25.321345, lng: 85.633456, note: 'Tracker #cheese for Brandon 1' }), 7 | new NLog({ lat: 25.321545, lng: 85.633556, note: 'Tracker #cheese for Brandon 1' }), 8 | new NLog({ lat: 25.421345, lng: 85.632456, _id: 'brandontest', note: 'Tracker #cheese for @brandon, 2' }), 9 | new NLog({ lat: 26.321345, lng: 86.432456, note: 'Tracker #cheese? for @Brandon 3' }), 10 | new NLog({ lat: 27.321345, lng: 85.662456, note: 'Tracker #burger! for covid @brandOn 4' }), 11 | ] 12 | 13 | describe('location grouping / extractro', () => { 14 | test('Should group locations', () => { 15 | const locations = extractLocations(testLogs) 16 | expect(locations.length).toBe(4) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /src/modules/nid/nid.spec.ts: -------------------------------------------------------------------------------- 1 | import nid from './nid' 2 | import { it, describe, expect } from 'vitest' 3 | // Nomie ID 4 | describe('modules/nid', function () { 5 | it('empty nid generator', () => { 6 | expect(nid().length).toEqual(32) 7 | }) 8 | it('nid(4) should generate a length of 4', () => { 9 | expect(nid(4).length).toEqual(4) 10 | }) 11 | it('two nid()s should generate unique values', () => { 12 | let nid1 = nid() 13 | let nid2 = nid() 14 | let match = nid1 == nid2 15 | expect(match).toBeFalsy() 16 | }) 17 | it('should hash a string if provided', () => { 18 | let nid1 = nid('my string is this', 10) 19 | let nid2 = nid('my string is this', 10) 20 | let match = nid1 == nid2 21 | expect(match).toBeTruthy() 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /src/modules/object-hash/object-hash.ts: -------------------------------------------------------------------------------- 1 | import { md5 } from '../nid/nid' 2 | 3 | export const objectHash = (obj: unknown = {}): string => { 4 | return md5(JSON.stringify(obj)) 5 | } 6 | -------------------------------------------------------------------------------- /src/modules/svelte-actions/autofocus.ts: -------------------------------------------------------------------------------- 1 | export default function autofocus(node) { 2 | node.focus(); 3 | } 4 | -------------------------------------------------------------------------------- /src/modules/svelte-actions/autosize.ts: -------------------------------------------------------------------------------- 1 | export default function autoresize(node) { 2 | function handleChange() { 3 | if (node.scrollHeight > 60) { 4 | node.style.height = `${node.scrollHeight}px`; 5 | } 6 | } 7 | 8 | handleChange(); 9 | node.addEventListener("input", handleChange); 10 | 11 | return { 12 | destroy() { 13 | node.removeEventListener("input", handleChange); 14 | }, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/modules/tracker/bundle.js: -------------------------------------------------------------------------------- 1 | import TrackerClass from './tracker' 2 | 3 | export default class Bundle { 4 | constructor(starter = {}) { 5 | this.title = starter.title 6 | this.summary = starter.summary 7 | this.author = starter.author 8 | if (starter.trackers) { 9 | this.trackers = starter.trackers.map((tracker) => { 10 | return new TrackerClass(tracker) 11 | }) 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/modules/tracker/positivity-condition.ts: -------------------------------------------------------------------------------- 1 | export default class PositivityCondition { 2 | if: "value" | "hour" | "momth"; 3 | is: "gt" | "gte" | "lt" | "lte" | "eq"; 4 | v: number; 5 | sc: number; 6 | constructor(starter) { 7 | starter = starter || {}; 8 | this.if = starter.if || "value"; 9 | this.is = starter.is || "gt"; 10 | this.v = starter.v || 1; 11 | // Score 12 | this.sc = starter.sc || undefined; 13 | } 14 | 15 | get score() { 16 | return this.sc; 17 | } 18 | set score(score) { 19 | this.sc = score; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/modules/tracker/tracker.spec.ts: -------------------------------------------------------------------------------- 1 | import Tracker from './TrackerClass' 2 | import calcTrackerScore from '../scoring/score-tracker' 3 | import { it, describe, expect } from 'vitest' 4 | 5 | const mood = new Tracker({ 6 | tag: 'mood', 7 | type: 'range', 8 | color: '#369DD3', 9 | math: 'mean', 10 | ignore_zeros: false, 11 | uom: 'num', 12 | emoji: '😉', 13 | default: '3', 14 | max: '10', 15 | min: '1', 16 | score: 'custom', 17 | score_calc: [ 18 | { 19 | if: 'value', 20 | is: 'gt', 21 | v: '5', 22 | sc: '1', 23 | }, 24 | { 25 | if: 'value', 26 | is: 'lt', 27 | v: '5', 28 | sc: '-1', 29 | }, 30 | ], 31 | goal: null, 32 | one_tap: false, 33 | label: 'Mood', 34 | }) 35 | 36 | describe('Calculate Tracker Score', () => { 37 | it('should calculate a dynamic score', () => { 38 | let score = calcTrackerScore(6, mood) 39 | expect(score).toEqual(1) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /src/modules/uencode/uencode.spec.ts: -------------------------------------------------------------------------------- 1 | import { fromBlob, toBlob } from './uencode' 2 | import { it, describe, expect } from 'vitest' 3 | import { Blob } from 'buffer' 4 | global['Blob'] = Blob; 5 | 6 | describe('Chainer', () => { 7 | it('should chain steps', async () => { 8 | let test = { payload: 'Hi there'} 9 | let en = toBlob(test); 10 | let de = await fromBlob(en); 11 | console.log({en, de}) 12 | expect(de.payload).toBe('Hi there') 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /src/modules/uencode/uencode.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export const toBlob = (obj:any):Blob => { 4 | const json = JSON.stringify(obj); 5 | const bytes = new TextEncoder().encode(json); 6 | const blob = new Blob([bytes], { 7 | type: "application/json;charset=utf-8" 8 | }); 9 | return blob; 10 | } 11 | 12 | export const fromBlob = async (blob:Blob):Promise => { 13 | const content = await blob.text(); 14 | return JSON.parse(content); 15 | } -------------------------------------------------------------------------------- /src/modules/uid/uid.ts: -------------------------------------------------------------------------------- 1 | export const uid = ():string => { 2 | return `${Math.random().toString(16).slice(2)}${Math.random().toString(16).slice(2).substring(0,6)}` 3 | } -------------------------------------------------------------------------------- /src/n-icons/AccessibilityOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Accessibility 6 | -------------------------------------------------------------------------------- /src/n-icons/AddCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Add Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/AddIcon.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Add 6 | -------------------------------------------------------------------------------- /src/n-icons/AlarmOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Alarm 6 | -------------------------------------------------------------------------------- /src/n-icons/AppsSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Apps 6 | -------------------------------------------------------------------------------- /src/n-icons/ArchiveOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Archive 6 | -------------------------------------------------------------------------------- /src/n-icons/ArrowBack.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Arrow Back 6 | -------------------------------------------------------------------------------- /src/n-icons/ArrowForard.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Arrow Forward 6 | -------------------------------------------------------------------------------- /src/n-icons/BarChart.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bar Chart 6 | -------------------------------------------------------------------------------- /src/n-icons/BarChartOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bar Chart 6 | -------------------------------------------------------------------------------- /src/n-icons/BarChartSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bar Chart 6 | -------------------------------------------------------------------------------- /src/n-icons/BookOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Book 6 | -------------------------------------------------------------------------------- /src/n-icons/BookmarksOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bookmarks 6 | -------------------------------------------------------------------------------- /src/n-icons/BulbOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bulb 6 | -------------------------------------------------------------------------------- /src/n-icons/BulbSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Bulb 6 | -------------------------------------------------------------------------------- /src/n-icons/CalendarNumberOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Calendar Number 6 | -------------------------------------------------------------------------------- /src/n-icons/CalendarOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Calendar 6 | -------------------------------------------------------------------------------- /src/n-icons/CalendarSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Calendar 6 | -------------------------------------------------------------------------------- /src/n-icons/CameraSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Camera 6 | -------------------------------------------------------------------------------- /src/n-icons/CaretDown.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Caret Down 6 | -------------------------------------------------------------------------------- /src/n-icons/CaretDownCircle.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Caret Down Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/ChatboxOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chatbox 6 | -------------------------------------------------------------------------------- /src/n-icons/CheckmarkCircle.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Checkmark Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/CheckmarkCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Checkmark Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/CheckmarkOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Checkmark 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronBackCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Back Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronBackOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Back 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronDownOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Down 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronForwardCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Forward Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronForwardOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Forward 6 | -------------------------------------------------------------------------------- /src/n-icons/ChevronUpOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Chevron Up 6 | -------------------------------------------------------------------------------- /src/n-icons/CircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ellipse 6 | -------------------------------------------------------------------------------- /src/n-icons/CloseCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Close Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/CloseOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Close 6 | -------------------------------------------------------------------------------- /src/n-icons/CopyOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Copy 6 | -------------------------------------------------------------------------------- /src/n-icons/CreateOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Create 6 | -------------------------------------------------------------------------------- /src/n-icons/CubeOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Cube 16 | -------------------------------------------------------------------------------- /src/n-icons/CubeSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Cube 7 | 10 | 13 | -------------------------------------------------------------------------------- /src/n-icons/DownloadOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Download 6 | -------------------------------------------------------------------------------- /src/n-icons/DuplicateOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Duplicate 6 | -------------------------------------------------------------------------------- /src/n-icons/EaselOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Easel 6 | -------------------------------------------------------------------------------- /src/n-icons/EaselSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Easel 6 | -------------------------------------------------------------------------------- /src/n-icons/ExpandOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Expand 6 | -------------------------------------------------------------------------------- /src/n-icons/EyeSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Eye 6 | -------------------------------------------------------------------------------- /src/n-icons/FilterCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Filter Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/Git.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Git Compare 6 | -------------------------------------------------------------------------------- /src/n-icons/HappyOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Happy 6 | -------------------------------------------------------------------------------- /src/n-icons/HighLowIcon.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Git Compare 6 | -------------------------------------------------------------------------------- /src/n-icons/Layers.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Layers 6 | -------------------------------------------------------------------------------- /src/n-icons/LineChartOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Analytics 6 | -------------------------------------------------------------------------------- /src/n-icons/ListOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | List 6 | -------------------------------------------------------------------------------- /src/n-icons/ListSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | List 6 | -------------------------------------------------------------------------------- /src/n-icons/LockClosedSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Lock Closed 6 | -------------------------------------------------------------------------------- /src/n-icons/MagnetOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Magnet 6 | -------------------------------------------------------------------------------- /src/n-icons/MagnetSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Magnet 6 | -------------------------------------------------------------------------------- /src/n-icons/MailOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Mail 6 | -------------------------------------------------------------------------------- /src/n-icons/MailUnreadOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Mail Unread 6 | -------------------------------------------------------------------------------- /src/n-icons/MapOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Map 6 | -------------------------------------------------------------------------------- /src/n-icons/MenuOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Menu 6 | -------------------------------------------------------------------------------- /src/n-icons/MoonOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Moon 6 | -------------------------------------------------------------------------------- /src/n-icons/More.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ellipsis Horizontal 6 | -------------------------------------------------------------------------------- /src/n-icons/MoreCircle.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ellipsis Horizontal Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/MoreCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ellipsis Horizontal Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/MoreVertical.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ellipsis Vertical 6 | -------------------------------------------------------------------------------- /src/n-icons/NavigateCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Navigate Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/NavigateCircleSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Navigate Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/NavigateSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Navigate 6 | -------------------------------------------------------------------------------- /src/n-icons/OptionsOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Options 6 | -------------------------------------------------------------------------------- /src/n-icons/PaperPlaneSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Paper Plane 6 | -------------------------------------------------------------------------------- /src/n-icons/PencilOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Pencil 6 | -------------------------------------------------------------------------------- /src/n-icons/PersonAddOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Person Add 6 | -------------------------------------------------------------------------------- /src/n-icons/PieChartOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Pie Chart 6 | -------------------------------------------------------------------------------- /src/n-icons/PinSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Pin 6 | -------------------------------------------------------------------------------- /src/n-icons/PlayBackCircle.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Play Back Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/PlusIcon.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Add 6 | -------------------------------------------------------------------------------- /src/n-icons/PrintOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Print 6 | -------------------------------------------------------------------------------- /src/n-icons/PulseOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Pulse 6 | -------------------------------------------------------------------------------- /src/n-icons/RelatedOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Git Network 6 | -------------------------------------------------------------------------------- /src/n-icons/RemoveCircle.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Remove Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/RemoveCircleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Remove Circle 6 | -------------------------------------------------------------------------------- /src/n-icons/RepeatOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Repeat 6 | -------------------------------------------------------------------------------- /src/n-icons/ReplyOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Arrow Redo 6 | -------------------------------------------------------------------------------- /src/n-icons/RibbonOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Ribbon 6 | -------------------------------------------------------------------------------- /src/n-icons/ScanOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Scan 6 | -------------------------------------------------------------------------------- /src/n-icons/SearchIcon.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Search 6 | -------------------------------------------------------------------------------- /src/n-icons/ShareOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Share 6 | -------------------------------------------------------------------------------- /src/n-icons/ShuffleOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Shuffle 6 | -------------------------------------------------------------------------------- /src/n-icons/SparklesOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Sparkles 6 | -------------------------------------------------------------------------------- /src/n-icons/StarFilled.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Star 6 | -------------------------------------------------------------------------------- /src/n-icons/StarOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Star 6 | -------------------------------------------------------------------------------- /src/n-icons/StarSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Star 6 | -------------------------------------------------------------------------------- /src/n-icons/StopSolid.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Stop 6 | -------------------------------------------------------------------------------- /src/n-icons/SunnyOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Sunny 6 | -------------------------------------------------------------------------------- /src/n-icons/SwapOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Swap Horizontal 6 | -------------------------------------------------------------------------------- /src/n-icons/TabsOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Albums 6 | -------------------------------------------------------------------------------- /src/n-icons/TagOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Pricetag 6 | -------------------------------------------------------------------------------- /src/n-icons/TextOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Text 6 | -------------------------------------------------------------------------------- /src/n-icons/ThermometerIcon.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Thermometer 6 | -------------------------------------------------------------------------------- /src/n-icons/TrashOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Trash 6 | -------------------------------------------------------------------------------- /src/n-icons/TrophyOutline.svelte: -------------------------------------------------------------------------------- 1 | 2 | 5 | Trophy 6 | -------------------------------------------------------------------------------- /src/n-icons/board-tab-icons/contextBoard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/routes/AfterNomie.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 |

14 | AfterNomie BETA 15 |

16 |
17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /src/routes/Analytics.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 |

14 | My Analytics BETA 15 |

16 |
17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /src/routes/Awards.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/Error404.svelte: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /src/routes/Goals.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/LibraryManager.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/Messages.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/RouteControl.svelte: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/routes/Uoms.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 15 |

Units of Measure

16 |
17 | 18 |
19 | -------------------------------------------------------------------------------- /src/routes/cloud-api-page.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | {#if $PermissionsStore.canAPI} 17 | 18 | {:else if mounted} 19 | Subscription required 20 | {:else} 21 | Loading... 22 | {/if} 23 | -------------------------------------------------------------------------------- /src/routes/csv-import.svelte: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/routes/dashboard.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/file-browser.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/routes/settings.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/routes/setup.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/routes/tests/storage.svelte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dailynomie/nomie6-oss/2fbe10d8f46872977eaeea4c8ca7b48a8cfdf88e/src/routes/tests/storage.svelte -------------------------------------------------------------------------------- /src/style/Tailwind.svelte: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /src/utils/array/array_utils.spec.ts: -------------------------------------------------------------------------------- 1 | import arrayUtils, { dedupArray } from './array_utils' 2 | import { it, describe, expect } from 'vitest' 3 | describe('array utils test', () => { 4 | let test = [1, 1, 2, 3, 4, 5, 5] 5 | it('should remove duplicates', () => { 6 | expect(JSON.stringify(arrayUtils.unique(test))).toBe(JSON.stringify([1, 2, 3, 4, 5])) 7 | }) 8 | it('should split an array', () => { 9 | let split = arrayUtils.split(test) 10 | expect(split[0].length).toBe(4) 11 | }) 12 | it('should chunk an array', () => { 13 | let split = arrayUtils.chunk(['brandon', 'bob', 'jake', 'emily', 'carrie'], 2) 14 | expect(split.length).toBe(3) 15 | }) 16 | it('should dedup', () => { 17 | const dups = [ 18 | { name: 'Bob', id: '1' }, 19 | { name: 'Alice', id: '1' }, 20 | ] 21 | const deduped = dedupArray(dups, 'id') 22 | expect(deduped.length).toBe(1) 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /src/utils/array/array_utils.ts: -------------------------------------------------------------------------------- 1 | import chunk from 'lodash/chunk' 2 | import uniq from 'lodash/uniq' 3 | 4 | export default { 5 | split(arr = []) { 6 | let half = Math.ceil(arr.length * 0.5) 7 | return [arr.splice(0, half), arr.splice(-half)] 8 | }, 9 | unique(array) { 10 | return uniq(array) 11 | }, 12 | chunk(array, chunkSize) { 13 | return chunk(array, chunkSize) 14 | }, 15 | } 16 | 17 | /** 18 | * It takes an array of objects and a key, and returns a new array of objects with no duplicates based 19 | * on the key 20 | * @param array - The array you want to deduplicate 21 | * @param {string} key - The key to dedup by. 22 | * @returns an array of objects that have unique ids. 23 | */ 24 | export const dedupArray = (array: Array, key: string): Array => { 25 | return Array.from(new Set(array.map((a) => a[key]))).map((id) => { 26 | return array.find((a) => a.id === id) 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /src/utils/calculate/calculate.spec.ts: -------------------------------------------------------------------------------- 1 | import calculate from './calculate' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Calculate tests', () => { 4 | it('should add', () => { 5 | expect(calculate([1, '+', 1])).toBe(2) 6 | }) 7 | it('should subtract', () => { 8 | expect(calculate([4, '-', 1])).toBe(3) 9 | }) 10 | it('should multiply', () => { 11 | expect(calculate([4, '*', 2])).toBe(8) 12 | }) 13 | it('should divide', () => { 14 | expect(calculate([8, '/', 2])).toBe(4) 15 | }) 16 | it('should do multiple', () => { 17 | expect(calculate([1, '+', 1, '*', 2])).toBe(4) 18 | }) 19 | it('should handle decimals', () => { 20 | expect(calculate([1.5, '+', 1.5, '*', 2])).toBe(6) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /src/utils/clipboard/clipboard.ts: -------------------------------------------------------------------------------- 1 | export default function copy(str: string) { 2 | try { 3 | const el = document.createElement("textarea"); 4 | el.value = str; 5 | document.body.appendChild(el); 6 | el.select(); 7 | document.execCommand("copy"); 8 | document.body.removeChild(el); 9 | return true; 10 | } catch (e) { 11 | alert(e.message); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/encrypt/encrypt.ts: -------------------------------------------------------------------------------- 1 | // import Cryptr from "cryptr"; 2 | import * as CryptoJS from "crypto-js"; 3 | 4 | export const encrypt = (str:string, key:string)=>{ 5 | const encryptedStr = CryptoJS.AES.encrypt(str, key).toString(); 6 | return encodeURIComponent(encryptedStr); 7 | } 8 | 9 | export const decrypt = (str:string, key:string)=>{ 10 | const bytes = CryptoJS.AES.decrypt(decodeURIComponent(str), key); 11 | return bytes.toString(CryptoJS.enc.Utf8); 12 | } 13 | 14 | export const encryptObject = (obj, key: string):string=>{ 15 | const str = JSON.stringify(obj); 16 | return encrypt(str, key); 17 | } 18 | 19 | export const decryptObject = (str, key:string):any => { 20 | 21 | const raw = decrypt(str, key); 22 | 23 | return JSON.parse(raw); 24 | } -------------------------------------------------------------------------------- /src/utils/is/is.spec.ts: -------------------------------------------------------------------------------- 1 | import is from './is' 2 | import { it, describe, expect } from 'vitest' 3 | describe('is test sweeeet!', () => { 4 | it('should identify an emoji', () => { 5 | expect(is.emoji('😁')).toBe(true) 6 | }) 7 | it('should identify NOT an emoji', () => { 8 | expect(is.emoji('d')).toBe(false) 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /src/utils/ordinal/ordinal.spec.ts: -------------------------------------------------------------------------------- 1 | import ordinal from './ordinal' 2 | import { it, describe, expect } from 'vitest' 3 | describe('ordinal!', () => { 4 | it('should change things to ordinal', () => { 5 | expect(ordinal(1)).toBe('1st') 6 | expect(ordinal(2)).toBe('2nd') 7 | expect(ordinal(3)).toBe('3rd') 8 | expect(ordinal(4)).toBe('4th') 9 | expect(ordinal(432)).toBe('432nd') 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/utils/ordinal/ordinal.ts: -------------------------------------------------------------------------------- 1 | const Ordinal = (value) => { 2 | if (!value) return ""; 3 | let i = parseInt(value); 4 | let j = i % 10, 5 | k = i % 100; 6 | if (j == 1 && k != 11) { 7 | return i + "st"; 8 | } 9 | if (j == 2 && k != 12) { 10 | return i + "nd"; 11 | } 12 | if (j == 3 && k != 13) { 13 | return i + "rd"; 14 | } 15 | return i + "th"; 16 | }; 17 | 18 | export { Ordinal }; 19 | export default Ordinal; 20 | -------------------------------------------------------------------------------- /src/utils/parseNumber/parseNumber.spec.ts: -------------------------------------------------------------------------------- 1 | import { parseNumber } from './parseNumber' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Parse Number', () => { 4 | it('should handle parsing a float string', () => { 5 | expect(parseNumber('1.2345')).toBe(1.23) 6 | }) 7 | it('should handle parsing a regular string', () => { 8 | expect(parseNumber('12345')).toBe(12345) 9 | }) 10 | it('should handle parsing a float string', () => { 11 | expect(parseNumber('1.2345')).toBe(1.23) 12 | }) 13 | 14 | it('should handle parsing a weird thing as NaN', () => { 15 | expect(parseNumber('abc1.2345')).toBe(NaN) 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /src/utils/parseNumber/parseNumber.ts: -------------------------------------------------------------------------------- 1 | export const parseNumber = (value: number | string): number => { 2 | if (typeof value === 'number') return Math.round(100 * value) / 100 3 | 4 | if (typeof value === 'string' && value.search(/\./) > -1) { 5 | const v = parseFloat(`${value}`) 6 | return Math.round(100 * v) / 100 7 | } 8 | if (typeof value === 'string') return parseInt(`${value}`) 9 | return NaN 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/promise-step/promise-step.spec.ts: -------------------------------------------------------------------------------- 1 | import promiseStep from './promise-step' 2 | import { it, describe, expect } from 'vitest' 3 | describe('promise step!', () => { 4 | it('should wait to do things one at a time.', async () => { 5 | let sample: Array = ['max', 'george', 'meag', 'ryan', 'sowmya'] 6 | let final: Array = [] 7 | let finished: any = await promiseStep(sample, (row) => { 8 | final.push(row) 9 | return Promise.resolve(row) 10 | }) 11 | expect(finished.length).toBe(sample.length) 12 | expect(final.join(',')).toEqual(sample.join(',')) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /src/utils/promise-step/promise-step.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * PromiseStep 3 | * Like promise.all, but one at a time. 4 | * 5 | * PromiseStep([1,2,3], (row)=>{ 6 | * return Promise.resolve(row) 7 | * }, (status)=>{ 8 | * alert("Status", status) 9 | * }).then((finished)=>{ 10 | * alert("All Done", finished); 11 | * }) 12 | * 13 | */ 14 | 15 | export default async (rows: Array, promiseFunction: Function, onChange?: Function): Promise> => { 16 | onChange = onChange || function () {}; // a status callback 17 | let final = []; 18 | for (const row of rows) { 19 | try { 20 | let res = await promiseFunction(row); 21 | onChange({ row, res }); 22 | final.push(res); 23 | } catch (e) { 24 | final.push({ error: e.message }); 25 | } 26 | } 27 | return final; 28 | }; 29 | -------------------------------------------------------------------------------- /src/utils/regex.ts: -------------------------------------------------------------------------------- 1 | const regex = { 2 | escape(str) { 3 | return str.replace(/[@.*+?^${}()|[\]\\]/g, '\\$&') // $& means the whole matched string 4 | }, 5 | } 6 | 7 | export const encodeRegex = regex.escape 8 | export default regex 9 | -------------------------------------------------------------------------------- /src/utils/search/search-tokenizer.ts: -------------------------------------------------------------------------------- 1 | import latinize from "./latinize"; 2 | import { parseBooleanQuery } from "boolean-parser"; 3 | export default (query: string) => { 4 | // Remove latin elements 5 | // Replace and or with AND and OR 6 | query = latinize(query.toLowerCase()).replace(/\s(and|or)\s/g, (a, l) => { 7 | return ` ${l.toUpperCase()} `; 8 | }); 9 | // Break down and / or lookup words 10 | return parseBooleanQuery(query); 11 | }; 12 | -------------------------------------------------------------------------------- /src/utils/snake-case/snake-case.ts: -------------------------------------------------------------------------------- 1 | const snakeCase = (str: string) => { 2 | const matches = str.match( 3 | /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g 4 | ); 5 | if (matches) { 6 | return matches.join("_").toLowerCase(); 7 | } else { 8 | return ""; 9 | } 10 | }; 11 | export default snakeCase; 12 | -------------------------------------------------------------------------------- /src/utils/string-to-value/string-to-value.ts: -------------------------------------------------------------------------------- 1 | import { parseNumber } from '../parseNumber/parseNumber' 2 | import time from '../time/time' 3 | const StringToValue = (valueStr: any) => { 4 | if (typeof valueStr == 'string') { 5 | if (valueStr.split('.').length == 2) { 6 | // For 1.345 7 | return parseNumber(valueStr) 8 | } else if (valueStr.search(':') > -1) { 9 | // For 00:00:00 10 | return time.timestringToSeconds(valueStr) 11 | } else { 12 | return parseInt(valueStr) 13 | } 14 | } else { 15 | return valueStr 16 | } 17 | } 18 | 19 | export default StringToValue 20 | -------------------------------------------------------------------------------- /src/utils/test/TestItem.ts: -------------------------------------------------------------------------------- 1 | import nid from '../../modules/nid/nid' 2 | 3 | export class TestItem { 4 | //@ts-ignore 5 | id?: string 6 | name?: string 7 | constructor(starter: any = {}) { 8 | this.id = starter.id || nid() 9 | this.name = starter.name 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/utils/tick/tick.ts: -------------------------------------------------------------------------------- 1 | const tick = (time: number, callback?: Function) => { 2 | return new Promise((resolve) => { 3 | setTimeout(() => { 4 | if (callback) { 5 | callback(); 6 | } 7 | resolve(true); 8 | }, time); 9 | }); 10 | }; 11 | 12 | export default tick; 13 | export const wait = tick; -------------------------------------------------------------------------------- /src/utils/truthy/truthy.spec.ts: -------------------------------------------------------------------------------- 1 | import { isTruthy } from './truthy' 2 | import { it, describe, expect } from 'vitest' 3 | describe('Truthy', () => { 4 | it('should test for truth elements', () => { 5 | expect(isTruthy(0)).toBe(true) 6 | expect(isTruthy('0')).toBe(true) 7 | expect(isTruthy([])).toBe(true) 8 | expect(isTruthy({})).toBe(true) 9 | }) 10 | it('should return false for undefined null and false', () => { 11 | expect(isTruthy(false)).toBe(false) 12 | expect(isTruthy(null)).toBe(false) 13 | expect(isTruthy(undefined)).toBe(false) 14 | expect(isTruthy()).toBe(false) 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /src/utils/truthy/truthy.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Is Truthy 3 | * Checks if it's a true "thing" - INCLUDING 0 4 | * @param o any 5 | */ 6 | export function isTruthy(o?: any) { 7 | if (o === false) { 8 | return false; 9 | } else if (o === undefined || o === null) { 10 | return false; 11 | } else { 12 | return true; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | const sveltePreprocess = require("svelte-preprocess"); 2 | module.exports = { 3 | preprocess: [ 4 | sveltePreprocess({ 5 | postcss: true 6 | }), 7 | ], 8 | }; -------------------------------------------------------------------------------- /svelte.config_temp.mjs: -------------------------------------------------------------------------------- 1 | //const sveltePreprocess = require("svelte-preprocess"); 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | //module.exports = { 4 | // preprocess: [ 5 | // sveltePreprocess({ 6 | // postcss: true 7 | // }), 8 | // ], 9 | //}; 10 | export default { 11 | preprocess: [vitePreprocess({ script: true })], 12 | compilerOptions: { 13 | runes: false 14 | } 15 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "isolatedModules": true, 7 | "resolveJsonModule": true, 8 | "baseUrl": "./src", 9 | "allowSyntheticDefaultImports": true, 10 | "skipLibCheck": true, 11 | "types": ["jest", "svelte", "vite/client"], 12 | "esModuleInterop": true, 13 | "verbatimModuleSyntax": true, 14 | "ignoreDeprecations": "5.0", 15 | "noUnusedLocals": true, 16 | "noImplicitReturns": true, 17 | "allowUnreachableCode": false, 18 | "allowJs": true, 19 | "checkJs": true, 20 | }, 21 | "extends": "@tsconfig/svelte/tsconfig.json", 22 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.svelte"], 23 | "exclude": ["node_modules/*", "__sapper__/*", "public/*"] 24 | } 25 | --------------------------------------------------------------------------------