aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/kit/.gitignore8
-rw-r--r--apps/kit/.npmrc1
-rw-r--r--apps/kit/.typesafe-i18n.json5
-rwxr-xr-xapps/kit/bun.lockbbin0 -> 100851 bytes
-rw-r--r--apps/kit/package.json45
-rw-r--r--apps/kit/playwright.config.ts10
-rw-r--r--apps/kit/pnpm-lock.yaml2815
-rw-r--r--apps/kit/postcss.config.cjs13
-rw-r--r--apps/kit/src/app.d.ts9
-rw-r--r--apps/kit/src/app.html12
-rw-r--r--apps/kit/src/app.pcss21
-rw-r--r--apps/kit/src/hooks/index.server.ts52
-rw-r--r--apps/kit/src/lib/api/internal-fetch.ts (renamed from apps/web-shared/src/lib/api/internal-fetch.ts)32
-rw-r--r--apps/kit/src/lib/api/root.ts6
-rw-r--r--apps/kit/src/lib/api/time-entry.ts (renamed from apps/web-shared/src/lib/api/time-entry.ts)15
-rw-r--r--apps/kit/src/lib/api/user.ts (renamed from apps/web-shared/src/lib/api/user.ts)10
-rw-r--r--apps/kit/src/lib/colors.ts (renamed from apps/web-shared/src/lib/colors.ts)4
-rw-r--r--apps/kit/src/lib/components/alert.svelte149
-rw-r--r--apps/kit/src/lib/components/button.svelte72
-rw-r--r--apps/kit/src/lib/components/icons/adjustments.svelte5
-rw-r--r--apps/kit/src/lib/components/icons/database.svelte3
-rw-r--r--apps/kit/src/lib/components/icons/home.svelte5
-rw-r--r--apps/kit/src/lib/components/icons/index.ts13
-rw-r--r--apps/kit/src/lib/components/icons/menu.svelte4
-rw-r--r--apps/kit/src/lib/components/icons/x.svelte4
-rw-r--r--apps/kit/src/lib/components/locale-switcher.svelte52
-rw-r--r--apps/kit/src/lib/configuration.ts45
-rw-r--r--apps/kit/src/lib/helpers.ts (renamed from apps/web-shared/src/lib/helpers.ts)96
-rw-r--r--apps/kit/src/lib/i18n/en/index.ts (renamed from apps/projects/src/app/lib/i18n/en/index.ts)12
-rw-r--r--apps/kit/src/lib/i18n/formatters.ts (renamed from apps/projects/src/app/lib/i18n/formatters.ts)0
-rw-r--r--apps/kit/src/lib/i18n/i18n-svelte.ts (renamed from apps/projects/src/app/lib/i18n/i18n-svelte.ts)0
-rw-r--r--apps/kit/src/lib/i18n/i18n-types.ts (renamed from apps/projects/src/app/lib/i18n/i18n-types.ts)68
-rw-r--r--apps/kit/src/lib/i18n/i18n-util.async.ts (renamed from apps/projects/src/app/lib/i18n/i18n-util.async.ts)0
-rw-r--r--apps/kit/src/lib/i18n/i18n-util.sync.ts (renamed from apps/projects/src/app/lib/i18n/i18n-util.sync.ts)0
-rw-r--r--apps/kit/src/lib/i18n/i18n-util.ts (renamed from apps/projects/src/app/lib/i18n/i18n-util.ts)2
-rw-r--r--apps/kit/src/lib/i18n/nb/index.ts (renamed from apps/projects/src/app/lib/i18n/nb/index.ts)12
-rw-r--r--apps/kit/src/lib/locale.ts (renamed from apps/web-shared/src/lib/locale.ts)0
-rw-r--r--apps/kit/src/lib/logger.ts87
-rw-r--r--apps/kit/src/lib/models/CreateAccountPayload.ts (renamed from apps/web-shared/src/lib/models/CreateAccountPayload.ts)0
-rw-r--r--apps/kit/src/lib/models/ErrorResult.ts (renamed from apps/web-shared/src/lib/models/ErrorResult.ts)0
-rw-r--r--apps/kit/src/lib/models/IInternalFetchRequest.ts (renamed from apps/web-shared/src/lib/models/IInternalFetchRequest.ts)0
-rw-r--r--apps/kit/src/lib/models/IInternalFetchResponse.ts (renamed from apps/web-shared/src/lib/models/IInternalFetchResponse.ts)0
-rw-r--r--apps/kit/src/lib/models/ISession.ts (renamed from apps/web-shared/src/lib/models/ISession.ts)0
-rw-r--r--apps/kit/src/lib/models/IValidationResult.ts (renamed from apps/web-shared/src/lib/models/IValidationResult.ts)0
-rw-r--r--apps/kit/src/lib/models/LoginPayload.ts (renamed from apps/web-shared/src/lib/models/LoginPayload.ts)0
-rw-r--r--apps/kit/src/lib/models/TimeCategoryDto.ts (renamed from apps/web-shared/src/lib/models/TimeCategoryDto.ts)2
-rw-r--r--apps/kit/src/lib/models/TimeEntryDto.ts (renamed from apps/web-shared/src/lib/models/TimeEntryDto.ts)2
-rw-r--r--apps/kit/src/lib/models/TimeEntryQuery.ts (renamed from apps/web-shared/src/lib/models/TimeEntryQuery.ts)2
-rw-r--r--apps/kit/src/lib/models/TimeLabelDto.ts (renamed from apps/web-shared/src/lib/models/TimeLabelDto.ts)2
-rw-r--r--apps/kit/src/lib/models/TimeQueryDto.ts (renamed from apps/web-shared/src/lib/models/TimeQueryDto.ts)0
-rw-r--r--apps/kit/src/lib/models/UnwrappedEntryDateTime.ts (renamed from apps/web-shared/src/lib/models/UnwrappedEntryDateTime.ts)2
-rw-r--r--apps/kit/src/lib/models/UpdateProfilePayload.ts (renamed from apps/web-shared/src/lib/models/UpdateProfilePayload.ts)0
-rw-r--r--apps/kit/src/lib/persistent-store.ts (renamed from apps/web-shared/src/lib/persistent-store.ts)0
-rw-r--r--apps/kit/src/lib/session.ts (renamed from apps/web-shared/src/lib/session.ts)25
-rw-r--r--apps/kit/src/params/guid.ts5
-rw-r--r--apps/kit/src/params/integer.ts3
-rw-r--r--apps/kit/src/routes/(app)/+layout.svelte215
-rw-r--r--apps/kit/src/routes/(app)/home/+page.svelte1
-rw-r--r--apps/kit/src/routes/(public)/+layout.svelte6
-rw-r--r--apps/kit/src/routes/(public)/login/+page.svelte95
-rw-r--r--apps/kit/src/routes/(public)/reset/+page.svelte29
-rw-r--r--apps/kit/src/routes/(public)/signup/+page.svelte38
-rw-r--r--apps/kit/src/routes/+layout.server.ts13
-rw-r--r--apps/kit/src/routes/+layout.svelte23
-rw-r--r--apps/kit/static/preload.js (renamed from apps/web-shared/src/assets/preload.js)0
-rw-r--r--apps/kit/svelte.config.js16
-rw-r--r--apps/kit/tailwind.config.cjs13
-rw-r--r--apps/kit/tests/test.ts6
-rw-r--r--apps/kit/tsconfig.json35
-rw-r--r--apps/kit/vite.config.js14
-rw-r--r--apps/portal/.version1
-rw-r--r--apps/portal/.version-dev1
-rw-r--r--apps/portal/CHANGELOG.md135
-rwxr-xr-xapps/portal/build_and_push.sh76
-rw-r--r--apps/portal/cliff.toml62
l---------apps/portal/src/_assets/preload.css1
l---------apps/portal/src/_assets/preload.js1
-rw-r--r--apps/portal/src/_assets/pwa/android-chrome-192x192.pngbin3291 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/android-chrome-512x512.pngbin9687 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/apple-touch-icon.pngbin2769 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/browserconfig.xml9
-rw-r--r--apps/portal/src/_assets/pwa/favicon-16x16.pngbin636 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/favicon-32x32.pngbin907 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/favicon.icobin15086 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/favicon.svg4
-rw-r--r--apps/portal/src/_assets/pwa/manifest.json28
-rw-r--r--apps/portal/src/_assets/pwa/mstile-144x144.pngbin3109 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/mstile-150x150.pngbin3238 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/mstile-310x150.pngbin3501 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/mstile-310x310.pngbin6823 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/mstile-70x70.pngbin2238 -> 0 bytes
-rw-r--r--apps/portal/src/_assets/pwa/safari-pinned-tab.svg50
-rw-r--r--apps/portal/src/app/components/user-menu.svelte70
-rw-r--r--apps/portal/src/app/index.d.ts48
-rw-r--r--apps/portal/src/app/index.scss27
-rw-r--r--apps/portal/src/app/index.svelte87
-rw-r--r--apps/portal/src/app/index.ts14
-rw-r--r--apps/portal/src/app/pages/_layout.svelte62
-rw-r--r--apps/portal/src/app/pages/_layout@loggedin.svelte75
-rw-r--r--apps/portal/src/app/pages/admin/index.svelte18
-rw-r--r--apps/portal/src/app/pages/forgot.svelte102
-rw-r--r--apps/portal/src/app/pages/home.svelte103
-rw-r--r--apps/portal/src/app/pages/login.svelte142
-rw-r--r--apps/portal/src/app/pages/profile/index.svelte167
-rw-r--r--apps/portal/src/app/pages/reset-password.svelte138
-rw-r--r--apps/portal/src/app/pages/sign-up.svelte131
-rw-r--r--apps/portal/src/index.html55
-rw-r--r--apps/portal/src/package.json24
-rw-r--r--apps/portal/src/pnpm-lock.yaml787
-rw-r--r--apps/portal/src/tsconfig.json27
-rw-r--r--apps/portal/src/vite.config.ts32
-rw-r--r--apps/projects/.version1
-rw-r--r--apps/projects/.version-dev1
-rw-r--r--apps/projects/CHANGELOG.md118
-rwxr-xr-xapps/projects/build_and_push.sh76
-rw-r--r--apps/projects/cliff.toml62
-rw-r--r--apps/projects/src/.typesafe-i18n.json5
l---------apps/projects/src/_assets/preload.css1
l---------apps/projects/src/_assets/preload.js1
-rw-r--r--apps/projects/src/_assets/projects.pngbin7951 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/android-chrome-192x192.pngbin3291 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/android-chrome-512x512.pngbin9687 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/apple-touch-icon.pngbin2769 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/browserconfig.xml9
-rw-r--r--apps/projects/src/_assets/pwa/favicon-16x16.pngbin636 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/favicon-32x32.pngbin907 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/favicon.icobin15086 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/favicon.svg4
-rw-r--r--apps/projects/src/_assets/pwa/manifest.json28
-rw-r--r--apps/projects/src/_assets/pwa/mstile-144x144.pngbin3109 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/mstile-150x150.pngbin3238 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/mstile-310x150.pngbin3501 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/mstile-310x310.pngbin6823 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/mstile-70x70.pngbin2238 -> 0 bytes
-rw-r--r--apps/projects/src/_assets/pwa/safari-pinned-tab.svg50
-rw-r--r--apps/projects/src/app/index.d.ts48
-rw-r--r--apps/projects/src/app/index.html63
-rw-r--r--apps/projects/src/app/index.scss40
-rw-r--r--apps/projects/src/app/index.svelte96
-rw-r--r--apps/projects/src/app/index.ts16
-rw-r--r--apps/projects/src/app/lib/services/user-service.ts14
-rw-r--r--apps/projects/src/app/lib/stores/categories.ts44
-rw-r--r--apps/projects/src/app/lib/stores/entries.ts74
-rw-r--r--apps/projects/src/app/lib/stores/labels.ts44
-rw-r--r--apps/projects/src/app/pages/_layout.svelte66
-rw-r--r--apps/projects/src/app/pages/data.svelte396
-rw-r--r--apps/projects/src/app/pages/home.svelte178
-rw-r--r--apps/projects/src/app/pages/nav/css/1_responsive-sidebar.css179
-rw-r--r--apps/projects/src/app/pages/nav/css/2_side-navigation-v4.css213
-rw-r--r--apps/projects/src/app/pages/nav/html/side-navigation-v4.html211
-rw-r--r--apps/projects/src/app/pages/nav/index.ts6
-rw-r--r--apps/projects/src/app/pages/nav/js/_1_diagonal-movement.js296
-rw-r--r--apps/projects/src/app/pages/nav/js/_1_responsive-sidebar.js215
-rw-r--r--apps/projects/src/app/pages/nav/js/_2_side-navigation-v4.js73
-rw-r--r--apps/projects/src/app/pages/nav/nav-item.svelte18
-rw-r--r--apps/projects/src/app/pages/nav/nav-wrapper.svelte20
-rw-r--r--apps/projects/src/app/pages/nav/scss/_1_responsive-sidebar.scss147
-rw-r--r--apps/projects/src/app/pages/nav/scss/_2_side-navigation-v4.scss237
-rw-r--r--apps/projects/src/app/pages/nav/side-navigation-v4.zipbin13503 -> 0 bytes
-rw-r--r--apps/projects/src/app/pages/not-found.svelte25
-rw-r--r--apps/projects/src/app/pages/settings.svelte12
-rw-r--r--apps/projects/src/app/pages/ui-workbench.svelte7
-rw-r--r--apps/projects/src/app/pages/views/category-form/index.svelte144
-rw-r--r--apps/projects/src/app/pages/views/data-table-paginator.svelte101
-rw-r--r--apps/projects/src/app/pages/views/entry-form/index.svelte199
-rw-r--r--apps/projects/src/app/pages/views/entry-form/sections/category.svelte76
-rw-r--r--apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte167
-rw-r--r--apps/projects/src/app/pages/views/entry-form/sections/labels.svelte66
-rw-r--r--apps/projects/src/app/pages/views/profile-modal.svelte156
-rw-r--r--apps/projects/src/app/pages/views/settings-categories-tile.svelte126
-rw-r--r--apps/projects/src/app/pages/views/settings-labels-tile.svelte111
-rw-r--r--apps/projects/src/index.html55
-rw-r--r--apps/projects/src/package.json28
-rw-r--r--apps/projects/src/pnpm-lock.yaml1374
-rw-r--r--apps/projects/src/tsconfig.json27
-rw-r--r--apps/projects/src/vite.config.ts32
-rw-r--r--apps/web-shared/.typesafe-i18n.json5
-rw-r--r--apps/web-shared/package.json20
-rw-r--r--apps/web-shared/pnpm-lock.yaml628
-rw-r--r--apps/web-shared/src/assets/logos/projects.pngbin7951 -> 0 bytes
-rw-r--r--apps/web-shared/src/assets/preload.css127
-rw-r--r--apps/web-shared/src/components/alert.svelte121
-rw-r--r--apps/web-shared/src/components/blowout-toolbelt.svelte70
-rw-r--r--apps/web-shared/src/components/breadcrumb/bread.svelte9
-rw-r--r--apps/web-shared/src/components/breadcrumb/crumb.svelte27
-rw-r--r--apps/web-shared/src/components/breadcrumb/index.ts7
-rw-r--r--apps/web-shared/src/components/button.svelte116
-rw-r--r--apps/web-shared/src/components/chip.svelte50
-rw-r--r--apps/web-shared/src/components/details.svelte35
-rw-r--r--apps/web-shared/src/components/dropdown.svelte389
-rw-r--r--apps/web-shared/src/components/form/index.ts5
-rw-r--r--apps/web-shared/src/components/form/textarea.svelte48
-rw-r--r--apps/web-shared/src/components/icon.svelte87
-rw-r--r--apps/web-shared/src/components/link-card.svelte47
-rw-r--r--apps/web-shared/src/components/locale-switcher-icon.svelte16
-rw-r--r--apps/web-shared/src/components/locale-switcher.svelte62
-rw-r--r--apps/web-shared/src/components/menu/index.ts9
-rw-r--r--apps/web-shared/src/components/menu/item.svelte8
-rw-r--r--apps/web-shared/src/components/menu/menu.svelte54
-rw-r--r--apps/web-shared/src/components/menu/separator.svelte2
-rw-r--r--apps/web-shared/src/components/modal.svelte66
-rw-r--r--apps/web-shared/src/components/pre-header.svelte37
-rw-r--r--apps/web-shared/src/components/screens/GeneralErrorScreen.svelte7
-rw-r--r--apps/web-shared/src/components/screens/NotFoundScreen.svelte161
-rw-r--r--apps/web-shared/src/components/stopwatch.svelte196
-rw-r--r--apps/web-shared/src/components/table/index.ts15
-rw-r--r--apps/web-shared/src/components/table/paginator.svelte101
-rw-r--r--apps/web-shared/src/components/table/table.svelte3
-rw-r--r--apps/web-shared/src/components/table/tbody.svelte3
-rw-r--r--apps/web-shared/src/components/table/tcell.svelte23
-rw-r--r--apps/web-shared/src/components/table/thead.svelte10
-rw-r--r--apps/web-shared/src/components/table/trow.svelte6
-rw-r--r--apps/web-shared/src/components/theme-switcher-icon.svelte248
-rw-r--r--apps/web-shared/src/components/theme-switcher.svelte215
-rw-r--r--apps/web-shared/src/components/tile.svelte4
-rw-r--r--apps/web-shared/src/components/user-menu.svelte99
-rw-r--r--apps/web-shared/src/lib/api/root.ts6
-rw-r--r--apps/web-shared/src/lib/configuration.ts78
-rw-r--r--apps/web-shared/src/lib/i18n/en/index.ts18
-rw-r--r--apps/web-shared/src/lib/i18n/formatters.ts11
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-types.ts94
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.async.ts27
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.sync.ts27
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.ts31
-rw-r--r--apps/web-shared/src/lib/i18n/nb/index.ts15
-rw-r--r--apps/web-shared/src/styles/_base.scss48
-rw-r--r--apps/web-shared/src/styles/base/_accessibility.scss17
-rw-r--r--apps/web-shared/src/styles/base/_breakpoints.scss19
-rw-r--r--apps/web-shared/src/styles/base/_buttons.scss24
-rw-r--r--apps/web-shared/src/styles/base/_colors.scss6
-rw-r--r--apps/web-shared/src/styles/base/_forms.scss22
-rw-r--r--apps/web-shared/src/styles/base/_grid-layout.scss261
-rw-r--r--apps/web-shared/src/styles/base/_icons.scss62
-rw-r--r--apps/web-shared/src/styles/base/_mixins.scss151
-rw-r--r--apps/web-shared/src/styles/base/_reset.scss83
-rw-r--r--apps/web-shared/src/styles/base/_shared-styles.scss34
-rw-r--r--apps/web-shared/src/styles/base/_spacing.scss20
-rw-r--r--apps/web-shared/src/styles/base/_typography.scss185
-rw-r--r--apps/web-shared/src/styles/base/_util.scss1738
-rw-r--r--apps/web-shared/src/styles/base/_visibility.scss23
-rw-r--r--apps/web-shared/src/styles/base/_z-index.scss6
-rw-r--r--apps/web-shared/src/styles/components/404.scss43
-rw-r--r--apps/web-shared/src/styles/components/adv-custom-select.scss79
-rw-r--r--apps/web-shared/src/styles/components/alert.scss69
-rw-r--r--apps/web-shared/src/styles/components/auto-sized-grid.scss56
-rw-r--r--apps/web-shared/src/styles/components/autocomplete.scss76
-rw-r--r--apps/web-shared/src/styles/components/breadcrumbs.scss18
-rw-r--r--apps/web-shared/src/styles/components/btn-states.scss51
-rw-r--r--apps/web-shared/src/styles/components/chip.scss117
-rw-r--r--apps/web-shared/src/styles/components/circle-loader.scss315
-rw-r--r--apps/web-shared/src/styles/components/custom-checkbox.scss131
-rw-r--r--apps/web-shared/src/styles/components/custom-select.scss158
-rw-r--r--apps/web-shared/src/styles/components/details.scss57
-rw-r--r--apps/web-shared/src/styles/components/dropdown.scss98
-rw-r--r--apps/web-shared/src/styles/components/form-validator.scss18
-rw-r--r--apps/web-shared/src/styles/components/interactive-table.scss156
-rw-r--r--apps/web-shared/src/styles/components/light-dark-switch.scss96
-rw-r--r--apps/web-shared/src/styles/components/link-card.scss56
-rw-r--r--apps/web-shared/src/styles/components/list.scss195
-rw-r--r--apps/web-shared/src/styles/components/menu-bar.scss139
-rw-r--r--apps/web-shared/src/styles/components/menu.scss81
-rw-r--r--apps/web-shared/src/styles/components/modal.scss105
-rw-r--r--apps/web-shared/src/styles/components/pagination.scss77
-rw-r--r--apps/web-shared/src/styles/components/popover.scss38
-rw-r--r--apps/web-shared/src/styles/components/pre-header.scss46
-rw-r--r--apps/web-shared/src/styles/components/radios-checkboxes.scss134
-rw-r--r--apps/web-shared/src/styles/components/responsive-sidebar.scss139
-rw-r--r--apps/web-shared/src/styles/components/select-autocomplete.scss176
-rw-r--r--apps/web-shared/src/styles/components/side-navigation-v4.scss237
-rw-r--r--apps/web-shared/src/styles/components/tabbed-navigation.scss133
-rw-r--r--apps/web-shared/src/styles/components/table.scss147
-rw-r--r--apps/web-shared/src/styles/components/user-menu.scss81
-rw-r--r--apps/web-shared/src/styles/components/vanilla-responsive-sidebar.scss146
-rw-r--r--apps/web-shared/src/styles/custom-style/_buttons.scss89
-rw-r--r--apps/web-shared/src/styles/custom-style/_colors.scss119
-rw-r--r--apps/web-shared/src/styles/custom-style/_forms.scss58
-rw-r--r--apps/web-shared/src/styles/custom-style/_icons.scss19
-rw-r--r--apps/web-shared/src/styles/custom-style/_shared-styles.scss70
-rw-r--r--apps/web-shared/src/styles/custom-style/_spacing.scss49
-rw-r--r--apps/web-shared/src/styles/custom-style/_typography.scss95
-rw-r--r--apps/web-shared/src/styles/custom-style/_util.scss34
-rw-r--r--apps/web-shared/tsconfig.json24
282 files changed, 4137 insertions, 18497 deletions
diff --git a/apps/kit/.gitignore b/apps/kit/.gitignore
new file mode 100644
index 0000000..f4401a3
--- /dev/null
+++ b/apps/kit/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
diff --git a/apps/kit/.npmrc b/apps/kit/.npmrc
new file mode 100644
index 0000000..b6f27f1
--- /dev/null
+++ b/apps/kit/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/apps/kit/.typesafe-i18n.json b/apps/kit/.typesafe-i18n.json
new file mode 100644
index 0000000..e2a0d73
--- /dev/null
+++ b/apps/kit/.typesafe-i18n.json
@@ -0,0 +1,5 @@
+{
+ "adapter": "svelte",
+ "$schema": "https://unpkg.com/typesafe-i18n@5.13.0/schema/typesafe-i18n.json",
+ "outputPath": "src/lib/i18n"
+} \ No newline at end of file
diff --git a/apps/kit/bun.lockb b/apps/kit/bun.lockb
new file mode 100755
index 0000000..25eeab8
--- /dev/null
+++ b/apps/kit/bun.lockb
Binary files differ
diff --git a/apps/kit/package.json b/apps/kit/package.json
new file mode 100644
index 0000000..32b3219
--- /dev/null
+++ b/apps/kit/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "greatoffice-kit",
+ "version": "0.0.1",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "npm-run-all --parallel vite typesafe-i18n",
+ "typesafe-i18n": "typesafe-i18n",
+ "vite": "vite",
+ "build": "vite build",
+ "preview": "vite preview",
+ "test": "playwright test",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
+ },
+ "devDependencies": {
+ "@leveluptuts/bookit": "^0.0.25",
+ "@playwright/test": "^1.25.2",
+ "@rgossiaux/svelte-headlessui": "^1.0.2",
+ "@sveltejs/kit": "1.0.0-next.489",
+ "@sveltestack/svelte-query": "^1.6.0",
+ "@tailwindcss/forms": "^0.5.3",
+ "@types/cookie": "^0.5.1",
+ "autoprefixer": "^10.4.11",
+ "bun-types": "^0.1.11",
+ "cookie": "^0.5.0",
+ "dotenv": "^16.0.2",
+ "fuzzysort": "^2.0.1",
+ "npm-run-all": "^4.1.5",
+ "pino": "^8.6.0",
+ "pino-pretty": "^9.1.0",
+ "postcss": "^8.4.16",
+ "postcss-load-config": "^4.0.1",
+ "svelte": "^3.50.1",
+ "svelte-adapter-bun": "^0.3.1",
+ "svelte-check": "^2.9.0",
+ "svelte-preprocess": "^4.10.7",
+ "tailwindcss": "^3.1.8",
+ "temporal-polyfill": "^0.0.8",
+ "tslib": "^2.4.0",
+ "typesafe-i18n": "^5.13.0",
+ "typescript": "^4.8.3",
+ "vite": "^3.1.3"
+ }
+} \ No newline at end of file
diff --git a/apps/kit/playwright.config.ts b/apps/kit/playwright.config.ts
new file mode 100644
index 0000000..6ad3a7f
--- /dev/null
+++ b/apps/kit/playwright.config.ts
@@ -0,0 +1,10 @@
+import type { PlaywrightTestConfig } from '@playwright/test';
+
+const config: PlaywrightTestConfig = {
+ webServer: {
+ command: 'npm run build && npm run preview',
+ port: 4173
+ }
+};
+
+export default config;
diff --git a/apps/kit/pnpm-lock.yaml b/apps/kit/pnpm-lock.yaml
new file mode 100644
index 0000000..b36ac59
--- /dev/null
+++ b/apps/kit/pnpm-lock.yaml
@@ -0,0 +1,2815 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@leveluptuts/bookit': ^0.0.25
+ '@playwright/test': ^1.25.2
+ '@rgossiaux/svelte-headlessui': ^1.0.2
+ '@sveltejs/kit': 1.0.0-next.489
+ '@sveltestack/svelte-query': ^1.6.0
+ '@tailwindcss/forms': ^0.5.3
+ '@types/cookie': ^0.5.1
+ autoprefixer: ^10.4.11
+ bun-types: ^0.1.11
+ cookie: ^0.5.0
+ dotenv: ^16.0.2
+ fuzzysort: ^2.0.1
+ npm-run-all: ^4.1.5
+ pino: ^8.6.0
+ pino-pretty: ^9.1.0
+ postcss: ^8.4.16
+ postcss-load-config: ^4.0.1
+ svelte: ^3.50.1
+ svelte-adapter-bun: ^0.3.1
+ svelte-check: ^2.9.0
+ svelte-preprocess: ^4.10.7
+ tailwindcss: ^3.1.8
+ temporal-polyfill: ^0.0.8
+ tslib: ^2.4.0
+ typesafe-i18n: ^5.13.0
+ typescript: ^4.8.3
+ vite: ^3.1.3
+
+devDependencies:
+ '@leveluptuts/bookit': 0.0.25
+ '@playwright/test': 1.25.2
+ '@rgossiaux/svelte-headlessui': 1.0.2_svelte@3.50.1
+ '@sveltejs/kit': 1.0.0-next.489_svelte@3.50.1+vite@3.1.3
+ '@sveltestack/svelte-query': 1.6.0
+ '@tailwindcss/forms': 0.5.3_tailwindcss@3.1.8
+ '@types/cookie': 0.5.1
+ autoprefixer: 10.4.11_postcss@8.4.16
+ bun-types: 0.1.11
+ cookie: 0.5.0
+ dotenv: 16.0.2
+ fuzzysort: 2.0.1
+ npm-run-all: 4.1.5
+ pino: 8.6.0
+ pino-pretty: 9.1.0
+ postcss: 8.4.16
+ postcss-load-config: 4.0.1_postcss@8.4.16
+ svelte: 3.50.1
+ svelte-adapter-bun: 0.3.1
+ svelte-check: 2.9.0_zy537mcxrfn3wq4nghluxnsi5a
+ svelte-preprocess: 4.10.7_sxt3mkf5m54vn3maobdwhqzitu
+ tailwindcss: 3.1.8_postcss@8.4.16
+ temporal-polyfill: 0.0.8
+ tslib: 2.4.0
+ typesafe-i18n: 5.13.0_typescript@4.8.3
+ typescript: 4.8.3
+ vite: 3.1.3
+
+packages:
+
+ /@esbuild/android-arm/0.15.8:
+ resolution: {integrity: sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dependencies:
+ esbuild-wasm: 0.15.8
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64/0.15.8:
+ resolution: {integrity: sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@jridgewell/resolve-uri/3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec/1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ dev: true
+
+ /@jridgewell/trace-mapping/0.3.15:
+ resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+ dev: true
+
+ /@leveluptuts/bookit/0.0.25:
+ resolution: {integrity: sha512-myzMQXm8nFg7GvqY3uU4OT29L6imUaWe/ZptRSroFtK2XchDSSyiQVk1xr05ivZjeyTG6QiG9lGFRrTGgmPcfw==}
+ dependencies:
+ '@leveluptuts/svelte-side-menu': 1.0.2
+ '@leveluptuts/svelte-toy': 2.0.2
+ just-safe-set: 4.1.1
+ svelte-splitpanes: 0.7.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@leveluptuts/svelte-side-menu/1.0.2:
+ resolution: {integrity: sha512-ZaR2euPXm7SFhcKvIBA6ug0Yd2tpoS3MUJed3sI5WxBk4UlbrLRk+RVrftxYGJr0hPQ6LY+WPBhen6TNHtZb5Q==}
+ dev: true
+
+ /@leveluptuts/svelte-toy/2.0.2:
+ resolution: {integrity: sha512-DHFsRL3/p6qNgnOla2EeF+3tZTCoYMWpMy7uJRYUjBAYfog8BNziLgenFIKhcRlDgLOBPUqXB8FRB2SdNmkfAg==}
+ dependencies:
+ lodash.set: 4.3.2
+ dev: true
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.13.0
+ dev: true
+
+ /@playwright/test/1.24.2:
+ resolution: {integrity: sha512-Q4X224pRHw4Dtkk5PoNJplZCokLNvVbXD9wDQEMrHcEuvWpJWEQDeJ9gEwkZ3iCWSFSWBshIX177B231XW4wOQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ '@types/node': 18.7.18
+ playwright-core: 1.24.2
+ dev: true
+ optional: true
+
+ /@playwright/test/1.25.2:
+ resolution: {integrity: sha512-6qPznIR4Fw02OMbqXUPMG6bFFg1hDVNEdihKy0t9K0dmRbus1DyP5Q5XFQhGwEHQkLG5hrSfBuu9CW/foqhQHQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ '@types/node': 18.7.18
+ playwright-core: 1.25.2
+ dev: true
+
+ /@polka/url/1.0.0-next.21:
+ resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
+ dev: true
+
+ /@rgossiaux/svelte-headlessui/1.0.2_svelte@3.50.1:
+ resolution: {integrity: sha512-sauopYTSivhzXe1kAvgawkhyYJcQlK8Li3p0d2OtcCIVprOzdbard5lbqWB4xHDv83zAobt2mR08oizO2poHLQ==}
+ peerDependencies:
+ svelte: ^3.44.0
+ dependencies:
+ svelte: 3.50.1
+ dev: true
+
+ /@rollup/pluginutils/4.2.1:
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /@sveltejs/kit/1.0.0-next.489_svelte@3.50.1+vite@3.1.3:
+ resolution: {integrity: sha512-7oag1fimI9f8e8mNy2wQRgMCXSov5dASqeTdXffgnptWBpuEjr8myffJ9djoRVQXoFjCja39lCHBo239iY8+KA==}
+ engines: {node: '>=16.14'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ svelte: ^3.44.0
+ vite: ^3.1.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 1.0.7_svelte@3.50.1+vite@3.1.3
+ '@types/cookie': 0.5.1
+ cookie: 0.5.0
+ devalue: 3.1.3
+ kleur: 4.1.5
+ magic-string: 0.26.3
+ mime: 3.0.0
+ node-fetch: 3.2.10
+ sade: 1.8.1
+ set-cookie-parser: 2.5.1
+ sirv: 2.0.2
+ svelte: 3.50.1
+ tiny-glob: 0.2.9
+ undici: 5.10.0
+ vite: 3.1.3
+ transitivePeerDependencies:
+ - diff-match-patch
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte/1.0.7_svelte@3.50.1+vite@3.1.3:
+ resolution: {integrity: sha512-bf3/xrpKP5Sj9I6hT0slYwY4rVElocWZ79zLPc/bPFCOjjuty0jW4hmC4Uehb7yifjf3I6QnT3eIs2EKqw+Kig==}
+ engines: {node: ^14.18.0 || >= 16}
+ peerDependencies:
+ diff-match-patch: ^1.0.5
+ svelte: ^3.44.0
+ vite: ^3.0.0
+ peerDependenciesMeta:
+ diff-match-patch:
+ optional: true
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ debug: 4.3.4
+ deepmerge: 4.2.2
+ kleur: 4.1.5
+ magic-string: 0.26.3
+ svelte: 3.50.1
+ svelte-hmr: 0.15.0_svelte@3.50.1
+ vite: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sveltestack/svelte-query/1.6.0:
+ resolution: {integrity: sha512-C0wWuh6av1zu3Pzwrg6EQmX3BhDZQ4gMAdYu6Tfv4bjbEZTB00uEDz52z92IZdONh+iUKuyo0xRZ2e16k2Xifg==}
+ peerDependencies:
+ broadcast-channel: ^4.5.0
+ peerDependenciesMeta:
+ broadcast-channel:
+ optional: true
+ dev: true
+
+ /@tailwindcss/forms/0.5.3_tailwindcss@3.1.8:
+ resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
+ dependencies:
+ mini-svg-data-uri: 1.4.4
+ tailwindcss: 3.1.8_postcss@8.4.16
+ dev: true
+
+ /@types/cookie/0.5.1:
+ resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==}
+ dev: true
+
+ /@types/node/18.7.18:
+ resolution: {integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==}
+ dev: true
+
+ /@types/pug/2.0.6:
+ resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
+ dev: true
+
+ /@types/sass/1.43.1:
+ resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
+ dependencies:
+ '@types/node': 18.7.18
+ dev: true
+
+ /@zeit/schemas/2.21.0:
+ resolution: {integrity: sha512-/J4WBTpWtQ4itN1rb3ao8LfClmVcmz2pO6oYb7Qd4h7VSqUhIbJIvrykz9Ew1WMg6eFWsKdsMHc5uPbFxqlCpg==}
+ dev: true
+ optional: true
+
+ /abort-controller/3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+ dependencies:
+ event-target-shim: 5.0.1
+ dev: true
+
+ /accepts/1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+ dev: true
+ optional: true
+
+ /acorn-node/1.8.2:
+ resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
+ dependencies:
+ acorn: 7.4.1
+ acorn-walk: 7.2.0
+ xtend: 4.0.2
+ dev: true
+
+ /acorn-walk/7.2.0:
+ resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn/7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /ajv/8.11.0:
+ resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+ optional: true
+
+ /ansi-align/3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+ optional: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /ansi-regex/6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+ optional: true
+
+ /ansi-styles/3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+ optional: true
+
+ /ansi-styles/6.1.1:
+ resolution: {integrity: sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==}
+ engines: {node: '>=12'}
+ dev: true
+ optional: true
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arch/2.2.0:
+ resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
+ dev: true
+ optional: true
+
+ /arg/5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: true
+
+ /atomic-sleep/1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /autoprefixer/10.4.11_postcss@8.4.16:
+ resolution: {integrity: sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.21.4
+ caniuse-lite: 1.0.30001407
+ fraction.js: 4.2.0
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ postcss: 8.4.16
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /boxen/7.0.0:
+ resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 7.0.0
+ chalk: 5.0.1
+ cli-boxes: 3.0.0
+ string-width: 5.1.2
+ type-fest: 2.19.0
+ widest-line: 4.0.1
+ wrap-ansi: 8.0.1
+ dev: true
+ optional: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion/2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /browserslist/4.21.4:
+ resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001407
+ electron-to-chromium: 1.4.255
+ node-releases: 2.0.6
+ update-browserslist-db: 1.0.9_browserslist@4.21.4
+ dev: true
+
+ /buffer-crc32/0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /bun-types/0.1.11:
+ resolution: {integrity: sha512-a5G9LZtF5qBsDMjGnS5FfTvIeg1bS0PzI3Q2LqShEjJWdhZTB56xO8ewqZ83J+3my5rW/PPPWT/udAofRQ3zdg==}
+ dev: true
+
+ /bytes/3.0.0:
+ resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
+ engines: {node: '>= 0.8'}
+ dev: true
+ optional: true
+
+ /call-bind/1.0.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase-css/2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /camelcase/7.0.0:
+ resolution: {integrity: sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==}
+ engines: {node: '>=14.16'}
+ dev: true
+ optional: true
+
+ /caniuse-lite/1.0.30001407:
+ resolution: {integrity: sha512-4ydV+t4P7X3zH83fQWNDX/mQEzYomossfpViCOx9zHBSMV+rIe3LFqglHHtVyvNl1FhTNxPxs3jei82iqOW04w==}
+ dev: true
+
+ /chalk-template/0.4.0:
+ resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ chalk: 4.1.2
+ dev: true
+ optional: true
+
+ /chalk/2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+ optional: true
+
+ /chalk/5.0.1:
+ resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+ optional: true
+
+ /chokidar/3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.2
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /cli-boxes/3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+ dev: true
+ optional: true
+
+ /clipboardy/3.0.0:
+ resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ arch: 2.2.0
+ execa: 5.1.1
+ is-wsl: 2.2.0
+ dev: true
+ optional: true
+
+ /color-convert/1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+ optional: true
+
+ /color-name/1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: true
+
+ /colorette/2.0.19:
+ resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
+ dev: true
+
+ /compressible/2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+ optional: true
+
+ /compression/1.7.4:
+ resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ accepts: 1.3.8
+ bytes: 3.0.0
+ compressible: 2.0.18
+ debug: 2.6.9
+ on-headers: 1.0.2
+ safe-buffer: 5.1.2
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+ optional: true
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /content-disposition/0.5.2:
+ resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+ optional: true
+
+ /cookie/0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /cross-spawn/6.0.5:
+ resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
+ engines: {node: '>=4.8'}
+ dependencies:
+ nice-try: 1.0.5
+ path-key: 2.0.1
+ semver: 5.7.1
+ shebang-command: 1.2.0
+ which: 1.3.1
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+ optional: true
+
+ /cssesc/3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /data-uri-to-buffer/4.0.0:
+ resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /dateformat/4.6.3:
+ resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
+ dev: true
+
+ /debug/2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+ optional: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /deep-extend/0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+ optional: true
+
+ /deepmerge/4.2.2:
+ resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /define-properties/1.1.4:
+ resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-property-descriptors: 1.0.0
+ object-keys: 1.1.1
+ dev: true
+
+ /defined/1.0.0:
+ resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
+ dev: true
+
+ /detect-indent/6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /detective/5.2.1:
+ resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+ dependencies:
+ acorn-node: 1.8.2
+ defined: 1.0.0
+ minimist: 1.2.6
+ dev: true
+
+ /devalue/3.1.3:
+ resolution: {integrity: sha512-9KO89Cb+qjzf2CqdrH+NuLaqdk9GhDP5EhR4zlkR51dvuIaiqtlkDkGzLMShDemwUy21raSMdu+kpX8Enw3yGQ==}
+ dev: true
+
+ /didyoumean/1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ dev: true
+
+ /dlv/1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dev: true
+
+ /dotenv/16.0.2:
+ resolution: {integrity: sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /eastasianwidth/0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ dev: true
+ optional: true
+
+ /electron-to-chromium/1.4.255:
+ resolution: {integrity: sha512-H+mFNKow6gi2P5Gi2d1Fvd3TUEJlB9CF7zYaIV9T83BE3wP1xZ0mRPbNTm0KUjyd1QiVy7iKXuIcjlDtBQMiAQ==}
+ dev: true
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+ optional: true
+
+ /emoji-regex/9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+ optional: true
+
+ /end-of-stream/1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /error-ex/1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-abstract/1.20.2:
+ resolution: {integrity: sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ es-to-primitive: 1.2.1
+ function-bind: 1.1.1
+ function.prototype.name: 1.1.5
+ get-intrinsic: 1.1.3
+ get-symbol-description: 1.0.0
+ has: 1.0.3
+ has-property-descriptors: 1.0.0
+ has-symbols: 1.0.3
+ internal-slot: 1.0.3
+ is-callable: 1.2.6
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-weakref: 1.0.2
+ object-inspect: 1.12.2
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.4.3
+ string.prototype.trimend: 1.0.5
+ string.prototype.trimstart: 1.0.5
+ unbox-primitive: 1.0.2
+ dev: true
+
+ /es-to-primitive/1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.6
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: true
+
+ /es6-promise/3.3.1:
+ resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ dev: true
+
+ /esbuild-android-64/0.15.8:
+ resolution: {integrity: sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dependencies:
+ esbuild-wasm: 0.15.8
+ dev: true
+ optional: true
+
+ /esbuild-android-arm64/0.15.8:
+ resolution: {integrity: sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-64/0.15.8:
+ resolution: {integrity: sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-arm64/0.15.8:
+ resolution: {integrity: sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-64/0.15.8:
+ resolution: {integrity: sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-arm64/0.15.8:
+ resolution: {integrity: sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-32/0.15.8:
+ resolution: {integrity: sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-64/0.15.8:
+ resolution: {integrity: sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm/0.15.8:
+ resolution: {integrity: sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm64/0.15.8:
+ resolution: {integrity: sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-mips64le/0.15.8:
+ resolution: {integrity: sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-ppc64le/0.15.8:
+ resolution: {integrity: sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-riscv64/0.15.8:
+ resolution: {integrity: sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-s390x/0.15.8:
+ resolution: {integrity: sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-netbsd-64/0.15.8:
+ resolution: {integrity: sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-openbsd-64/0.15.8:
+ resolution: {integrity: sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-sunos-64/0.15.8:
+ resolution: {integrity: sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-wasm/0.15.8:
+ resolution: {integrity: sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-32/0.15.8:
+ resolution: {integrity: sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-64/0.15.8:
+ resolution: {integrity: sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-arm64/0.15.8:
+ resolution: {integrity: sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild/0.15.8:
+ resolution: {integrity: sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.15.8
+ '@esbuild/linux-loong64': 0.15.8
+ esbuild-android-64: 0.15.8
+ esbuild-android-arm64: 0.15.8
+ esbuild-darwin-64: 0.15.8
+ esbuild-darwin-arm64: 0.15.8
+ esbuild-freebsd-64: 0.15.8
+ esbuild-freebsd-arm64: 0.15.8
+ esbuild-linux-32: 0.15.8
+ esbuild-linux-64: 0.15.8
+ esbuild-linux-arm: 0.15.8
+ esbuild-linux-arm64: 0.15.8
+ esbuild-linux-mips64le: 0.15.8
+ esbuild-linux-ppc64le: 0.15.8
+ esbuild-linux-riscv64: 0.15.8
+ esbuild-linux-s390x: 0.15.8
+ esbuild-netbsd-64: 0.15.8
+ esbuild-openbsd-64: 0.15.8
+ esbuild-sunos-64: 0.15.8
+ esbuild-windows-32: 0.15.8
+ esbuild-windows-64: 0.15.8
+ esbuild-windows-arm64: 0.15.8
+ dev: true
+
+ /escalade/3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /escape-string-regexp/1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ dev: true
+
+ /event-target-shim/5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /execa/5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+ optional: true
+
+ /fast-copy/2.1.3:
+ resolution: {integrity: sha512-LDzYKNTHhD+XOp8wGMuCkY4eTxFZOOycmpwLBiuF3r3OjOmZnURRD8t2dUAbmKuXGbo/MGggwbSjcBdp8QT0+g==}
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+ optional: true
+
+ /fast-glob/3.2.12:
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-redact/3.1.2:
+ resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /fast-safe-stringify/2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+ dev: true
+
+ /fast-url-parser/1.1.3:
+ resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+ dependencies:
+ punycode: 1.4.1
+ dev: true
+ optional: true
+
+ /fastq/1.13.0:
+ resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fetch-blob/3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.2.1
+ dev: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /formdata-polyfill/4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+ dependencies:
+ fetch-blob: 3.2.0
+ dev: true
+
+ /fraction.js/4.2.0:
+ resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+ dev: true
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ dev: true
+
+ /function.prototype.name/1.1.5:
+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.2
+ functions-have-names: 1.2.3
+ dev: true
+
+ /functions-have-names/1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: true
+
+ /fuzzysort/2.0.1:
+ resolution: {integrity: sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg==}
+ dev: true
+
+ /get-intrinsic/1.1.3:
+ resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==}
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-symbols: 1.0.3
+ dev: true
+
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+ optional: true
+
+ /get-symbol-description/1.0.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent/6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob/7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /glob/8.0.3:
+ resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.1.0
+ once: 1.4.0
+ dev: true
+
+ /globalyzer/0.1.0:
+ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
+ dev: true
+
+ /globrex/0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+ dev: true
+
+ /graceful-fs/4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /has-bigints/1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag/3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /has-property-descriptors/1.0.0:
+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ dependencies:
+ get-intrinsic: 1.1.3
+ dev: true
+
+ /has-symbols/1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag/1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+ dev: true
+
+ /help-me/4.1.0:
+ resolution: {integrity: sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==}
+ dependencies:
+ glob: 8.0.3
+ readable-stream: 3.6.0
+ dev: true
+
+ /hosted-git-info/2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /human-signals/2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+ optional: true
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /ini/1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+ optional: true
+
+ /internal-slot/1.0.3:
+ resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.1.3
+ has: 1.0.3
+ side-channel: 1.0.4
+ dev: true
+
+ /is-arrayish/0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-bigint/1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: true
+
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-boolean-object/1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-callable/1.2.6:
+ resolution: {integrity: sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module/2.10.0:
+ resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-date-object/1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-docker/2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+ optional: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-negative-zero/2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object/1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-port-reachable/4.0.0:
+ resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+ optional: true
+
+ /is-regex/1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-shared-array-buffer/1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-stream/2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /is-string/1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /is-symbol/1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-weakref/1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-wsl/2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+ optional: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /joycon/3.1.1:
+ resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /json-parse-better-errors/1.0.2:
+ resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+ dev: true
+
+ /json-schema-traverse/1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+ optional: true
+
+ /just-safe-set/4.1.1:
+ resolution: {integrity: sha512-3tQtDVCvZfWc64yEbh2D8R80Zlz+x9LJVpkQ4K3ppdiO7iI1Jzf6wYgsAs1o/EMSwucRbaNb6JHex/24TbSaKw==}
+ dev: true
+
+ /kleur/4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /lilconfig/2.0.6:
+ resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /load-json-file/4.0.0:
+ resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
+ engines: {node: '>=4'}
+ dependencies:
+ graceful-fs: 4.2.10
+ parse-json: 4.0.0
+ pify: 3.0.0
+ strip-bom: 3.0.0
+ dev: true
+
+ /lodash.set/4.3.2:
+ resolution: {integrity: sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==}
+ dev: true
+
+ /magic-string/0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /magic-string/0.26.3:
+ resolution: {integrity: sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==}
+ engines: {node: '>=12'}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /memorystream/0.3.1:
+ resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
+ engines: {node: '>= 0.10.0'}
+ dev: true
+
+ /merge-stream/2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+ optional: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /mime-db/1.33.0:
+ resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
+ engines: {node: '>= 0.6'}
+ dev: true
+ optional: true
+
+ /mime-db/1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+ optional: true
+
+ /mime-types/2.1.18:
+ resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.33.0
+ dev: true
+ optional: true
+
+ /mime-types/2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: true
+ optional: true
+
+ /mime/3.0.0:
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ dev: true
+
+ /mimic-fn/2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+ optional: true
+
+ /min-indent/1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mini-svg-data-uri/1.4.4:
+ resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
+ hasBin: true
+ dev: true
+
+ /minimatch/3.0.4:
+ resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+ optional: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch/5.1.0:
+ resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist/1.2.6:
+ resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
+ dev: true
+
+ /mkdirp/0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.6
+ dev: true
+
+ /mri/1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mrmime/1.0.1:
+ resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ms/2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+ optional: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /nanoid/3.3.4:
+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /negotiator/0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+ optional: true
+
+ /nice-try/1.0.5:
+ resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
+ dev: true
+
+ /node-domexception/1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ dev: true
+
+ /node-fetch/3.2.10:
+ resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ data-uri-to-buffer: 4.0.0
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+ dev: true
+
+ /node-releases/2.0.6:
+ resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
+ dev: true
+
+ /normalize-package-data/2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.1
+ semver: 5.7.1
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-range/0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /npm-run-all/4.1.5:
+ resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
+ engines: {node: '>= 4'}
+ hasBin: true
+ dependencies:
+ ansi-styles: 3.2.1
+ chalk: 2.4.2
+ cross-spawn: 6.0.5
+ memorystream: 0.3.1
+ minimatch: 3.1.2
+ pidtree: 0.3.1
+ read-pkg: 3.0.0
+ shell-quote: 1.7.3
+ string.prototype.padend: 3.1.3
+ dev: true
+
+ /npm-run-path/4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+ optional: true
+
+ /object-hash/3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /object-inspect/1.12.2:
+ resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
+ dev: true
+
+ /object-keys/1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign/4.1.4:
+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /on-exit-leak-free/2.1.0:
+ resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==}
+ dev: true
+
+ /on-headers/1.0.2:
+ resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+ engines: {node: '>= 0.8'}
+ dev: true
+ optional: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /onetime/5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+ optional: true
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-json/4.0.0:
+ resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
+ engines: {node: '>=4'}
+ dependencies:
+ error-ex: 1.3.2
+ json-parse-better-errors: 1.0.2
+ dev: true
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-is-inside/1.0.2:
+ resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
+ dev: true
+ optional: true
+
+ /path-key/2.0.1:
+ resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-to-regexp/2.2.1:
+ resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
+ dev: true
+ optional: true
+
+ /path-type/3.0.0:
+ resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
+ engines: {node: '>=4'}
+ dependencies:
+ pify: 3.0.0
+ dev: true
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pidtree/0.3.1:
+ resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+ dev: true
+
+ /pify/2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /pify/3.0.0:
+ resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /pino-abstract-transport/1.0.0:
+ resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==}
+ dependencies:
+ readable-stream: 4.1.0
+ split2: 4.1.0
+ dev: true
+
+ /pino-pretty/9.1.0:
+ resolution: {integrity: sha512-IM6NY9LLo/dVgY7/prJhCh4rAJukafdt0ibxeNOWc2fxKMyTk90SOB9Ao2HfbtShT9QPeP0ePpJktksMhSQMYA==}
+ hasBin: true
+ dependencies:
+ colorette: 2.0.19
+ dateformat: 4.6.3
+ fast-copy: 2.1.3
+ fast-safe-stringify: 2.1.1
+ help-me: 4.1.0
+ joycon: 3.1.1
+ minimist: 1.2.6
+ on-exit-leak-free: 2.1.0
+ pino-abstract-transport: 1.0.0
+ pump: 3.0.0
+ readable-stream: 4.1.0
+ secure-json-parse: 2.5.0
+ sonic-boom: 3.2.0
+ strip-json-comments: 3.1.1
+ dev: true
+
+ /pino-std-serializers/6.0.0:
+ resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==}
+ dev: true
+
+ /pino/8.6.0:
+ resolution: {integrity: sha512-gCEOs6XpgiM8mSFjiLXQejDJ1PZww8AUmHowQ16QpqpXQDIm3mFwn/29+Y6CJxd6i+x3uXduuerjq+IqWoABbA==}
+ hasBin: true
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.1.2
+ on-exit-leak-free: 2.1.0
+ pino-abstract-transport: 1.0.0
+ pino-std-serializers: 6.0.0
+ process-warning: 2.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.4.0
+ sonic-boom: 3.2.0
+ thread-stream: 2.2.0
+ dev: true
+
+ /playwright-core/1.24.2:
+ resolution: {integrity: sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+ optional: true
+
+ /playwright-core/1.25.2:
+ resolution: {integrity: sha512-0yTbUE9lIddkEpLHL3u8PoCL+pWiZtj5A/j3U7YoNjcmKKDGBnCrgHJMzwd2J5vy6l28q4ki3JIuz7McLHhl1A==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /postcss-import/14.1.0_postcss@8.4.16:
+ resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ postcss: 8.4.16
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.1
+ dev: true
+
+ /postcss-js/4.0.0_postcss@8.4.16:
+ resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.3.3
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.16
+ dev: true
+
+ /postcss-load-config/3.1.4_postcss@8.4.16:
+ resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.0.6
+ postcss: 8.4.16
+ yaml: 1.10.2
+ dev: true
+
+ /postcss-load-config/4.0.1_postcss@8.4.16:
+ resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.0.6
+ postcss: 8.4.16
+ yaml: 2.1.1
+ dev: true
+
+ /postcss-nested/5.0.6_postcss@8.4.16:
+ resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss: 8.4.16
+ postcss-selector-parser: 6.0.10
+ dev: true
+
+ /postcss-selector-parser/6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /postcss-value-parser/4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ dev: true
+
+ /postcss/8.4.16:
+ resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.4
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /process-warning/2.0.0:
+ resolution: {integrity: sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==}
+ dev: true
+
+ /pump/3.0.0:
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: true
+
+ /punycode/1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+ dev: true
+ optional: true
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: true
+ optional: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /quick-format-unescaped/4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+ dev: true
+
+ /quick-lru/5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /range-parser/1.2.0:
+ resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
+ engines: {node: '>= 0.6'}
+ dev: true
+ optional: true
+
+ /rc/1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.6
+ strip-json-comments: 2.0.1
+ dev: true
+ optional: true
+
+ /read-cache/1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ dependencies:
+ pify: 2.3.0
+ dev: true
+
+ /read-pkg/3.0.0:
+ resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
+ engines: {node: '>=4'}
+ dependencies:
+ load-json-file: 4.0.0
+ normalize-package-data: 2.5.0
+ path-type: 3.0.0
+ dev: true
+
+ /readable-stream/3.6.0:
+ resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readable-stream/4.1.0:
+ resolution: {integrity: sha512-sVisi3+P2lJ2t0BPbpK629j8wRW06yKGJUcaLAGXPAUhyUxVJm7VsCTit1PFgT4JHUDMrGNR+ZjSKpzGaRF3zw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ abort-controller: 3.0.0
+ dev: true
+
+ /readdirp/3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /real-require/0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+ dev: true
+
+ /regexp.prototype.flags/1.4.3:
+ resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ functions-have-names: 1.2.3
+ dev: true
+
+ /registry-auth-token/3.3.2:
+ resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==}
+ dependencies:
+ rc: 1.2.8
+ safe-buffer: 5.2.1
+ dev: true
+ optional: true
+
+ /registry-url/3.1.0:
+ resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ rc: 1.2.8
+ dev: true
+ optional: true
+
+ /require-from-string/2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+ optional: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.10.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf/2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup/2.78.1:
+ resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /sade/1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: true
+
+ /safe-buffer/5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+ dev: true
+ optional: true
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-stable-stringify/2.4.0:
+ resolution: {integrity: sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /sander/0.5.1:
+ resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
+ dependencies:
+ es6-promise: 3.3.1
+ graceful-fs: 4.2.10
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ dev: true
+
+ /secure-json-parse/2.5.0:
+ resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==}
+ dev: true
+
+ /semver/5.7.1:
+ resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+ hasBin: true
+ dev: true
+
+ /serve-handler/6.1.3:
+ resolution: {integrity: sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==}
+ dependencies:
+ bytes: 3.0.0
+ content-disposition: 0.5.2
+ fast-url-parser: 1.1.3
+ mime-types: 2.1.18
+ minimatch: 3.0.4
+ path-is-inside: 1.0.2
+ path-to-regexp: 2.2.1
+ range-parser: 1.2.0
+ dev: true
+ optional: true
+
+ /serve/14.0.1:
+ resolution: {integrity: sha512-tNGwxl27FwA8TbmMQqN0jTaSx8/trL532qZsJHX1VdiEIjjtMJHCs7AFS6OvtC7cTHOvmjXqt5yczejU6CV2Xg==}
+ engines: {node: '>= 14'}
+ hasBin: true
+ requiresBuild: true
+ dependencies:
+ '@zeit/schemas': 2.21.0
+ ajv: 8.11.0
+ arg: 5.0.2
+ boxen: 7.0.0
+ chalk: 5.0.1
+ chalk-template: 0.4.0
+ clipboardy: 3.0.0
+ compression: 1.7.4
+ is-port-reachable: 4.0.0
+ serve-handler: 6.1.3
+ update-check: 1.5.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+ optional: true
+
+ /set-cookie-parser/2.5.1:
+ resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==}
+ dev: true
+
+ /shebang-command/1.2.0:
+ resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ shebang-regex: 1.0.0
+ dev: true
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+ optional: true
+
+ /shebang-regex/1.0.0:
+ resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+ optional: true
+
+ /shell-quote/1.7.3:
+ resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
+ dev: true
+
+ /side-channel/1.0.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ object-inspect: 1.12.2
+ dev: true
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+ optional: true
+
+ /sirv/2.0.2:
+ resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@polka/url': 1.0.0-next.21
+ mrmime: 1.0.1
+ totalist: 3.0.0
+ dev: true
+
+ /sonic-boom/3.2.0:
+ resolution: {integrity: sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==}
+ dependencies:
+ atomic-sleep: 1.0.0
+ dev: true
+
+ /sorcery/0.10.0:
+ resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
+ hasBin: true
+ dependencies:
+ buffer-crc32: 0.2.13
+ minimist: 1.2.6
+ sander: 0.5.1
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /sourcemap-codec/1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ dev: true
+
+ /spdx-correct/3.1.1:
+ resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.12
+ dev: true
+
+ /spdx-exceptions/2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+ dev: true
+
+ /spdx-expression-parse/3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.12
+ dev: true
+
+ /spdx-license-ids/3.0.12:
+ resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==}
+ dev: true
+
+ /split2/4.1.0:
+ resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==}
+ engines: {node: '>= 10.x'}
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+ optional: true
+
+ /string-width/5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.0.1
+ dev: true
+ optional: true
+
+ /string.prototype.padend/3.1.3:
+ resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.2
+ dev: true
+
+ /string.prototype.trimend/1.0.5:
+ resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.2
+ dev: true
+
+ /string.prototype.trimstart/1.0.5:
+ resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.2
+ dev: true
+
+ /string_decoder/1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+ optional: true
+
+ /strip-ansi/7.0.1:
+ resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+ optional: true
+
+ /strip-bom/3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-final-newline/2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+ optional: true
+
+ /strip-indent/3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments/2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+ optional: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /supports-color/5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+ optional: true
+
+ /supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /svelte-adapter-bun/0.3.1:
+ resolution: {integrity: sha512-IoxRX6VYd7JlX+g5NVRH2Uc6WadQMPEOF2Cz4y7XasyY1XC8DriD8osdhm8ENQYf8/ou8fCjuddh1MiHqGFQDA==}
+ dependencies:
+ tiny-glob: 0.2.9
+ dev: true
+
+ /svelte-check/2.9.0_zy537mcxrfn3wq4nghluxnsi5a:
+ resolution: {integrity: sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.24.0
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.15
+ chokidar: 3.5.3
+ fast-glob: 3.2.12
+ import-fresh: 3.3.0
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 3.50.1
+ svelte-preprocess: 4.10.7_sxt3mkf5m54vn3maobdwhqzitu
+ typescript: 4.8.3
+ transitivePeerDependencies:
+ - '@babel/core'
+ - coffeescript
+ - less
+ - node-sass
+ - postcss
+ - postcss-load-config
+ - pug
+ - sass
+ - stylus
+ - sugarss
+ dev: true
+
+ /svelte-hmr/0.15.0_svelte@3.50.1:
+ resolution: {integrity: sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==}
+ engines: {node: ^12.20 || ^14.13.1 || >= 16}
+ peerDependencies:
+ svelte: '>=3.19.0'
+ dependencies:
+ svelte: 3.50.1
+ dev: true
+
+ /svelte-preprocess/4.10.7_sxt3mkf5m54vn3maobdwhqzitu:
+ resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
+ engines: {node: '>= 9.11.2'}
+ requiresBuild: true
+ peerDependencies:
+ '@babel/core': ^7.10.2
+ coffeescript: ^2.5.1
+ less: ^3.11.3 || ^4.0.0
+ node-sass: '*'
+ postcss: ^7 || ^8
+ postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
+ pug: ^3.0.0
+ sass: ^1.26.8
+ stylus: ^0.55.0
+ sugarss: ^2.0.0
+ svelte: ^3.23.0
+ typescript: ^3.9.5 || ^4.0.0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ coffeescript:
+ optional: true
+ less:
+ optional: true
+ node-sass:
+ optional: true
+ postcss:
+ optional: true
+ postcss-load-config:
+ optional: true
+ pug:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@types/pug': 2.0.6
+ '@types/sass': 1.43.1
+ detect-indent: 6.1.0
+ magic-string: 0.25.9
+ postcss: 8.4.16
+ postcss-load-config: 4.0.1_postcss@8.4.16
+ sorcery: 0.10.0
+ strip-indent: 3.0.0
+ svelte: 3.50.1
+ typescript: 4.8.3
+ dev: true
+
+ /svelte-splitpanes/0.7.3:
+ resolution: {integrity: sha512-IsByD11xPI/KnI6T8xMWL+YHr+dATt4tVVoFJR676o0w7Lw3lUFq6l4zdibg3Apli7duFfCicGhT6/7NPblnyQ==}
+ optionalDependencies:
+ '@playwright/test': 1.24.2
+ serve: 14.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /svelte/3.50.1:
+ resolution: {integrity: sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /tailwindcss/3.1.8_postcss@8.4.16:
+ resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.0.9
+ dependencies:
+ arg: 5.0.2
+ chokidar: 3.5.3
+ color-name: 1.1.4
+ detective: 5.2.1
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.2.12
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ lilconfig: 2.0.6
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.0.0
+ postcss: 8.4.16
+ postcss-import: 14.1.0_postcss@8.4.16
+ postcss-js: 4.0.0_postcss@8.4.16
+ postcss-load-config: 3.1.4_postcss@8.4.16
+ postcss-nested: 5.0.6_postcss@8.4.16
+ postcss-selector-parser: 6.0.10
+ postcss-value-parser: 4.2.0
+ quick-lru: 5.1.1
+ resolve: 1.22.1
+ transitivePeerDependencies:
+ - ts-node
+ dev: true
+
+ /temporal-polyfill/0.0.8:
+ resolution: {integrity: sha512-IuA8GhS1PRC04H/zVNAIxJvCZQum6V5HjqFj7gz1a3SMUf/Kf1xIXILNYtxrWYnGqIU/RrDRxlCKCm/vmqnBvw==}
+ dependencies:
+ temporal-spec: 0.0.3
+ dev: true
+
+ /temporal-spec/0.0.3:
+ resolution: {integrity: sha512-gJu7QRqn5c2vTSkYWGC4qz1i+FZ9C+Cz16UIBMRcjgXOsHfXeSIgaWUKeq/2rz1iNfFxvmF/ywqbfC6ggTpjkA==}
+ dev: true
+
+ /thread-stream/2.2.0:
+ resolution: {integrity: sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==}
+ dependencies:
+ real-require: 0.2.0
+ dev: true
+
+ /tiny-glob/0.2.9:
+ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
+ dependencies:
+ globalyzer: 0.1.0
+ globrex: 0.1.2
+ dev: true
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /totalist/3.0.0:
+ resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /tslib/2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+ dev: true
+
+ /type-fest/2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+ optional: true
+
+ /typesafe-i18n/5.13.0_typescript@4.8.3:
+ resolution: {integrity: sha512-Q72l+LqB37kNT2R39mkTwQy1tuQ7URAahD1QXbR84itO864xvVgdoS8xaRAatp0y2/oU7f+2EzpAK3YGp0g+eA==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=3.5.1'
+ dependencies:
+ typescript: 4.8.3
+ dev: true
+
+ /typescript/4.8.3:
+ resolution: {integrity: sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
+
+ /unbox-primitive/1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.2
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /undici/5.10.0:
+ resolution: {integrity: sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==}
+ engines: {node: '>=12.18'}
+ dev: true
+
+ /update-browserslist-db/1.0.9_browserslist@4.21.4:
+ resolution: {integrity: sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.21.4
+ escalade: 3.1.1
+ picocolors: 1.0.0
+ dev: true
+
+ /update-check/1.5.4:
+ resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==}
+ dependencies:
+ registry-auth-token: 3.3.2
+ registry-url: 3.1.0
+ dev: true
+ optional: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+ optional: true
+
+ /util-deprecate/1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /validate-npm-package-license/3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.1.1
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /vary/1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+ optional: true
+
+ /vite/3.1.3:
+ resolution: {integrity: sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.15.8
+ postcss: 8.4.16
+ resolve: 1.22.1
+ rollup: 2.78.1
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /web-streams-polyfill/3.2.1:
+ resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /which-boxed-primitive/1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ dev: true
+
+ /which/1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+ optional: true
+
+ /widest-line/4.0.1:
+ resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ dev: true
+ optional: true
+
+ /wrap-ansi/8.0.1:
+ resolution: {integrity: sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.1.1
+ string-width: 5.1.2
+ strip-ansi: 7.0.1
+ dev: true
+ optional: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /xtend/4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: true
+
+ /yaml/1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /yaml/2.1.1:
+ resolution: {integrity: sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==}
+ engines: {node: '>= 14'}
+ dev: true
diff --git a/apps/kit/postcss.config.cjs b/apps/kit/postcss.config.cjs
new file mode 100644
index 0000000..e48cff5
--- /dev/null
+++ b/apps/kit/postcss.config.cjs
@@ -0,0 +1,13 @@
+const tailwindcss = require("tailwindcss");
+const autoprefixer = require("autoprefixer");
+
+const config = {
+ plugins: [
+ //Some plugins, like tailwindcss/nesting, need to run before Tailwind,
+ tailwindcss(),
+ //But others, like autoprefixer, need to run after,
+ autoprefixer,
+ ],
+};
+
+module.exports = config;
diff --git a/apps/kit/src/app.d.ts b/apps/kit/src/app.d.ts
new file mode 100644
index 0000000..4ab4e43
--- /dev/null
+++ b/apps/kit/src/app.d.ts
@@ -0,0 +1,9 @@
+// See https://kit.svelte.dev/docs/types#app
+// for information about these interfaces
+// and what to do when importing types
+declare namespace App {
+ interface Locals {}
+ interface Platform {}
+ interface PrivateEnv {}
+ interface PublicEnv {}
+}
diff --git a/apps/kit/src/app.html b/apps/kit/src/app.html
new file mode 100644
index 0000000..3df27c1
--- /dev/null
+++ b/apps/kit/src/app.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html class="h-full" lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width" />
+ <script src="%sveltekit.assets%/preload.js"></script>
+ %sveltekit.head%
+ </head>
+ <body class="h-full">
+ <div>%sveltekit.body%</div>
+ </body>
+</html>
diff --git a/apps/kit/src/app.pcss b/apps/kit/src/app.pcss
new file mode 100644
index 0000000..f9c290c
--- /dev/null
+++ b/apps/kit/src/app.pcss
@@ -0,0 +1,21 @@
+/* Write your global styles here, in PostCSS syntax */
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+pre {
+ font-family: monospace !important;
+}
+
+*:focus-visible {
+ outline: 1px auto;
+}
+
+.c-disabled {
+ cursor: not-allowed !important;
+ filter: opacity(.45);
+ pointer-events: none !important;
+}
+
+.c-disabled.loading {
+ cursor: wait !important;
+}
diff --git a/apps/kit/src/hooks/index.server.ts b/apps/kit/src/hooks/index.server.ts
new file mode 100644
index 0000000..414318d
--- /dev/null
+++ b/apps/kit/src/hooks/index.server.ts
@@ -0,0 +1,52 @@
+import { CookieNames } from "$lib/configuration";
+import { detectLocale, locales } from '$lib/i18n/i18n-util'
+import type { Handle, RequestEvent } from '@sveltejs/kit'
+import { sequence } from "@sveltejs/kit/hooks";
+import { initAcceptLanguageHeaderDetector } from 'typesafe-i18n/detectors'
+import { parse, serialize } from "cookie";
+import { logDebug } from "$lib/logger";
+
+const handleLocale: Handle = async ({ event, resolve }) => {
+ const cookies = parse(event.request.headers.get("Cookie") ?? '');
+ const localeCookie = cookies[CookieNames.locale];
+ const preferredLocale = getPreferredLocale(event);
+ let finalLocale = localeCookie ?? preferredLocale;
+
+ logDebug("Handling locale", {
+ locales,
+ localeCookie,
+ preferredLocale,
+ finalLocale
+ });
+
+ if (locales.findIndex((locale) => locale === finalLocale) === -1) finalLocale = "en";
+ if (!localeCookie) {
+ // Set a locale cookie
+ event.setHeaders({
+ "Set-Cookie": serialize(CookieNames.locale, finalLocale, {
+ path: "/",
+ expires: new Date(2099, 1, 1, 0, 0, 0, 0),
+ sameSite: "strict"
+ })
+ });
+ }
+ // replace html lang attribute with correct language
+ return resolve(event, { transformPageChunk: ({ html }) => html.replace('%lang%', finalLocale) });
+}
+
+function getPreferredLocale(event: RequestEvent) {
+ // detect the preferred language the user has configured in it's browser
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
+ const headers = transformHeaders(event)
+ const acceptLanguageDetector = initAcceptLanguageHeaderDetector({ headers })
+
+ return detectLocale(acceptLanguageDetector)
+}
+
+function transformHeaders({ request }: RequestEvent) {
+ const headers: Record<string, string> = {}
+ request.headers.forEach((value, key) => (headers[key] = value))
+ return headers
+}
+
+export const handle = sequence(handleLocale);
diff --git a/apps/web-shared/src/lib/api/internal-fetch.ts b/apps/kit/src/lib/api/internal-fetch.ts
index 8659ccb..b21d669 100644
--- a/apps/web-shared/src/lib/api/internal-fetch.ts
+++ b/apps/kit/src/lib/api/internal-fetch.ts
@@ -1,11 +1,11 @@
-import {Temporal} from "@js-temporal/polyfill";
-import {clear_session_data} from "$shared/lib/session";
-import {resolve_references} from "$shared/lib/helpers";
-import {replace} from "svelte-spa-router";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
-import type {IInternalFetchRequest} from "$shared/lib/models/IInternalFetchRequest";
+import { Temporal } from "temporal-polyfill";
+import { clear_session_data } from "$lib/session";
+import { resolve_references } from "$lib/helpers";
+import type { IInternalFetchResponse } from "$lib/models/IInternalFetchResponse";
+import type { IInternalFetchRequest } from "$lib/models/IInternalFetchRequest";
+import { redirect } from "@sveltejs/kit";
-export async function http_post(url: string, body?: object|string, timeout = -1, skip_401_check = false, abort_signal: AbortSignal = undefined): Promise<IInternalFetchResponse> {
+export async function http_post(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<IInternalFetchResponse> {
const init = {
method: "post",
} as RequestInit;
@@ -21,7 +21,7 @@ export async function http_post(url: string, body?: object|string, timeout = -1,
init.body = JSON.stringify(body);
}
- const response = await internal_fetch({url, init, timeout});
+ const response = await internal_fetch({ url, init, timeout });
const result = {} as IInternalFetchResponse;
if (!skip_401_check && await is_401(response)) return result;
@@ -48,7 +48,7 @@ export async function http_post(url: string, body?: object|string, timeout = -1,
return result;
}
-export async function http_get(url: string, timeout = -1, skip_401_check = false, abort_signal: AbortSignal = undefined): Promise<IInternalFetchResponse> {
+export async function http_get(url: string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<IInternalFetchResponse> {
const init = {
method: "get",
} as RequestInit;
@@ -57,7 +57,7 @@ export async function http_get(url: string, timeout = -1, skip_401_check = false
init.signal = abort_signal;
}
- const response = await internal_fetch({url, init, timeout});
+ const response = await internal_fetch({ url, init, timeout });
const result = {} as IInternalFetchResponse;
if (!skip_401_check && await is_401(response)) return result;
@@ -84,7 +84,7 @@ export async function http_get(url: string, timeout = -1, skip_401_check = false
return result;
}
-export async function http_delete(url: string, body?: object|string, timeout = -1, skip_401_check = false, abort_signal: AbortSignal = undefined): Promise<IInternalFetchResponse> {
+export async function http_delete(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<IInternalFetchResponse> {
const init = {
method: "delete",
} as RequestInit;
@@ -100,7 +100,7 @@ export async function http_delete(url: string, body?: object|string, timeout = -
init.body = JSON.stringify(body);
}
- const response = await internal_fetch({url, init, timeout});
+ const response = await internal_fetch({ url, init, timeout });
const result = {} as IInternalFetchResponse;
if (!skip_401_check && await is_401(response)) return result;
@@ -139,7 +139,7 @@ async function internal_fetch(request: IInternalFetchRequest): Promise<Response>
let response: any;
try {
- if (request.timeout > 500) {
+ if (request.timeout && request.timeout > 500) {
response = await Promise.race([
fetch(fetch_request),
new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), request.timeout))
@@ -147,7 +147,8 @@ async function internal_fetch(request: IInternalFetchRequest): Promise<Response>
} else {
response = await fetch(fetch_request);
}
- } catch (error) {
+ } catch (error: any) {
+ console.log(error);
if (error.message === "Timeout") {
console.error("Request timed out");
} else if (error.message === "Network request failed") {
@@ -163,8 +164,7 @@ async function internal_fetch(request: IInternalFetchRequest): Promise<Response>
async function is_401(response: Response): Promise<boolean> {
if (response.status === 401) {
clear_session_data();
- await replace("/login");
- return true;
+ throw redirect(307, "/login");
}
return false;
}
diff --git a/apps/kit/src/lib/api/root.ts b/apps/kit/src/lib/api/root.ts
new file mode 100644
index 0000000..3e5bda2
--- /dev/null
+++ b/apps/kit/src/lib/api/root.ts
@@ -0,0 +1,6 @@
+import {http_post} from "$lib/api/internal-fetch";
+import {api_base} from "$lib/configuration";
+
+export function server_log(message: string): void {
+ http_post(api_base("_/api/log"), message);
+}
diff --git a/apps/web-shared/src/lib/api/time-entry.ts b/apps/kit/src/lib/api/time-entry.ts
index 064964a..a40b0c2 100644
--- a/apps/web-shared/src/lib/api/time-entry.ts
+++ b/apps/kit/src/lib/api/time-entry.ts
@@ -1,11 +1,11 @@
-import {api_base} from "$shared/lib/configuration";
-import {is_guid} from "$shared/lib/helpers";
+import {api_base} from "$lib/configuration";
+import {is_guid} from "$lib/helpers";
import {http_delete, http_get, http_post} from "./internal-fetch";
-import type {TimeCategoryDto} from "$shared/lib/models/TimeCategoryDto";
-import type {TimeLabelDto} from "$shared/lib/models/TimeLabelDto";
-import type {TimeEntryDto} from "$shared/lib/models/TimeEntryDto";
-import type {TimeEntryQuery} from "$shared/lib/models/TimeEntryQuery";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
+import type {TimeCategoryDto} from "$lib/models/TimeCategoryDto";
+import type {TimeLabelDto} from "$lib/models/TimeLabelDto";
+import type {TimeEntryDto} from "$lib/models/TimeEntryDto";
+import type {TimeEntryQuery} from "$lib/models/TimeEntryQuery";
+import type {IInternalFetchResponse} from "$lib/models/IInternalFetchResponse";
// ENTRIES
@@ -59,7 +59,6 @@ export async function update_time_label(labelDto: TimeLabelDto): Promise<IIntern
return http_post(api_base("v1/labels/update"), labelDto);
}
-
// CATEGORIES
export async function create_time_category(category: TimeCategoryDto): Promise<IInternalFetchResponse> {
if (!category.name) throw new Error("name is empty");
diff --git a/apps/web-shared/src/lib/api/user.ts b/apps/kit/src/lib/api/user.ts
index a3a149e..f0dc932 100644
--- a/apps/web-shared/src/lib/api/user.ts
+++ b/apps/kit/src/lib/api/user.ts
@@ -1,9 +1,9 @@
-import {api_base} from "$shared/lib/configuration";
+import {api_base} from "$lib/configuration";
import {http_delete, http_get, http_post} from "./internal-fetch";
-import type {LoginPayload} from "$shared/lib/models/LoginPayload";
-import type {UpdateProfilePayload} from "$shared/lib/models/UpdateProfilePayload";
-import type {CreateAccountPayload} from "$shared/lib/models/CreateAccountPayload";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
+import type {LoginPayload} from "$lib/models/LoginPayload";
+import type {UpdateProfilePayload} from "$lib/models/UpdateProfilePayload";
+import type {CreateAccountPayload} from "$lib/models/CreateAccountPayload";
+import type {IInternalFetchResponse} from "$lib/models/IInternalFetchResponse";
export async function login(payload: LoginPayload): Promise<IInternalFetchResponse> {
return http_post(api_base("_/account/login"), payload);
diff --git a/apps/web-shared/src/lib/colors.ts b/apps/kit/src/lib/colors.ts
index c2da03d..34c7992 100644
--- a/apps/web-shared/src/lib/colors.ts
+++ b/apps/kit/src/lib/colors.ts
@@ -32,7 +32,7 @@ function __hex_to_rgb(hex: string): number[] {
return [parseInt(hex.substring(0, 2), 16), parseInt(hex.substring(2, 4), 16), parseInt(hex.substring(4, 6), 16)];
}
-function __get_luminance(r, g, b) {
+function __get_luminance(r: any, g: any, b: any) {
// relative luminance
// see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
r = __luminance_x(r);
@@ -41,7 +41,7 @@ function __get_luminance(r, g, b) {
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}
-function __luminance_x(x) {
+function __luminance_x(x: any) {
x /= 255;
return x <= 0.03928 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
}
diff --git a/apps/kit/src/lib/components/alert.svelte b/apps/kit/src/lib/components/alert.svelte
new file mode 100644
index 0000000..4a5c7ea
--- /dev/null
+++ b/apps/kit/src/lib/components/alert.svelte
@@ -0,0 +1,149 @@
+<script lang="ts">
+ import { random_string } from "$shared/lib/helpers";
+ import { afterUpdate, onMount } from "svelte";
+ import { Temporal } from "temporal-polyfill";
+
+ const noCooldownSetting = "no-cooldown";
+ // if no unique id is supplied, cooldown will not work between page loads.
+ // Therefore we are disabling it with noCooldownSetting in the fallback id.
+ export let id = "alert--" + noCooldownSetting + "--" + random_string(4);
+ export let title = "";
+ export let message = "";
+ export let type = "info";
+ export let closeable = false;
+ export let closeableCooldown = "-1";
+ export let visible = true;
+
+ const cooldownStorageKey = "lastseen--" + id;
+ $: cooldownEnabled =
+ id.indexOf(noCooldownSetting) === -1 &&
+ closeable &&
+ (closeableCooldown === "~" || parseInt(closeableCooldown) > 0);
+
+ function close() {
+ visible = false;
+ if (cooldownEnabled) {
+ console.log(
+ "Cooldown enabled for " + id + ", " + closeableCooldown === "~"
+ ? "with an endless cooldown"
+ : ""
+ );
+ localStorage.setItem(
+ cooldownStorageKey,
+ String(Temporal.Now.instant().epochSeconds)
+ );
+ }
+ }
+
+ // Manages the state of the alert if cooldown is enabled
+ function run_cooldown() {
+ if (!cooldownEnabled) {
+ console.log("Alert cooldown is not enabled for " + id);
+ return;
+ }
+ if (!localStorage.getItem(cooldownStorageKey)) {
+ console.log("Alert " + id + " has not been seen yet, displaying");
+ visible = true;
+ return;
+ }
+ if (!visible) {
+ console.log(
+ "Alert " + id + " is not visible, stopping cooldown change"
+ );
+ return;
+ }
+ if (closeableCooldown === "~") {
+ console.log("Alert " + id + " has an infinite cooldown, hiding");
+ visible = false;
+ return;
+ }
+
+ const lastSeen = Temporal.Instant.fromEpochSeconds(
+ localStorage.getItem(cooldownStorageKey) as number
+ );
+ if (
+ Temporal.Instant.compare(
+ Temporal.Now.instant(),
+ lastSeen.add({ seconds: parseInt(closeableCooldown) })
+ ) === 1
+ ) {
+ console.log(
+ "Alert " +
+ id +
+ " has a cooldown of " +
+ closeableCooldown +
+ " and was last seen " +
+ lastSeen.toLocaleString() +
+ " making it due for a showing"
+ );
+ visible = true;
+ } else {
+ visible = false;
+ }
+ }
+
+ onMount(() => {
+ if (cooldownEnabled) {
+ run_cooldown();
+ }
+ });
+
+ afterUpdate(() => {
+ if (type === "default") {
+ type = "primary";
+ }
+ });
+</script>
+
+<div
+ class="alert alert--{type} padding-sm radius-md"
+ {id}
+ class:alert--is-visible={visible}
+ role="alert"
+>
+ <div class="flex justify-between">
+ <div class="flex flex-row items-center">
+ <svg
+ class="icon icon--sm alert__icon margin-right-xxs"
+ viewBox="0 0 24 24"
+ aria-hidden="true"
+ >
+ <path
+ d="M12,0C5.383,0,0,5.383,0,12s5.383,12,12,12s12-5.383,12-12S18.617,0,12,0z M14.658,18.284 c-0.661,0.26-2.952,1.354-4.272,0.191c-0.394-0.346-0.59-0.785-0.59-1.318c0-0.998,0.328-1.868,0.919-3.957 c0.104-0.395,0.231-0.907,0.231-1.313c0-0.701-0.266-0.887-0.987-0.887c-0.352,0-0.742,0.125-1.095,0.257l0.195-0.799 c0.787-0.32,1.775-0.71,2.621-0.71c1.269,0,2.203,0.633,2.203,1.837c0,0.347-0.06,0.955-0.186,1.375l-0.73,2.582 c-0.151,0.522-0.424,1.673-0.001,2.014c0.416,0.337,1.401,0.158,1.887-0.071L14.658,18.284z M13.452,8c-0.828,0-1.5-0.672-1.5-1.5 s0.672-1.5,1.5-1.5s1.5,0.672,1.5,1.5S14.28,8,13.452,8z"
+ />
+ </svg>
+ {#if title}
+ <p class="text-sm">
+ <strong class="error-title">{title}</strong>
+ </p>
+ {:else if message}
+ <div class="text-component text-sm break-word">
+ {@html message}
+ </div>
+ {/if}
+ </div>
+ {#if closeable}
+ <button class="reset alert__close-btn" on:click={close}>
+ <svg
+ class="icon"
+ viewBox="0 0 20 20"
+ fill="none"
+ stroke="currentColor"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="2"
+ >
+ <title>Close alert</title>
+ <line x1="3" y1="3" x2="17" y2="17" />
+ <line x1="17" y1="3" x2="3" y2="17" />
+ </svg>
+ </button>
+ {/if}
+ </div>
+
+ {#if message && title}
+ <div class="text-component text-sm break-word padding-top-xs">
+ {@html message}
+ </div>
+ {/if}
+</div>
diff --git a/apps/kit/src/lib/components/button.svelte b/apps/kit/src/lib/components/button.svelte
new file mode 100644
index 0000000..5550e5e
--- /dev/null
+++ b/apps/kit/src/lib/components/button.svelte
@@ -0,0 +1,72 @@
+<script lang="ts">
+ export type ButtonKind = "primary" | "secondary" | "white"
+ export type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
+ export let kind = "primary" as ButtonKind;
+ export let size = "sm" as ButtonSize;
+ export let type: "button" | "submit" | "reset" = "button";
+ export let id = undefined;
+ export let tabindex = undefined;
+ export let style = undefined;
+ export let title = undefined;
+ export let disabled = false;
+ export let href = undefined;
+ export let text;
+
+ let sizeClasses = "px-3 py-2 text-xs";
+ let kindClasses = "border-transparent text-white bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500";
+
+ $: shared_props = {
+ type: type,
+ id: id || null,
+ title: title || null,
+ disabled: disabled || null,
+ tabindex: tabindex || null,
+ style: style || null,
+ };
+
+ $: switch (size) {
+ case "xs":
+ sizeClasses = "px-2.5 py-1.5 text-xs";
+ break;
+ case "sm":
+ sizeClasses = "px-3 py-2 text-sm";
+ break;
+ case "md":
+ sizeClasses = "px-4 py-2 text-sm";
+ break;
+ case "lg":
+ sizeClasses = "px-4 py-2 text-base";
+ break;
+ case "xl":
+ sizeClasses = "px-6 py-3 text-base";
+ break;
+ }
+
+ $: switch (kind) {
+ case "secondary":
+ kindClasses = "border-transparent text-indigo-700 bg-indigo-100 hover:bg-indigo-200";
+ break;
+ case "primary":
+ kindClasses = "border-transparent text-white bg-indigo-600 hover:bg-indigo-700";
+ break;
+ case "white":
+ kindClasses = "border-gray-300 text-gray-700 bg-white hover:bg-gray-50";
+ break;
+ }
+</script>
+{#if href && !disabled}
+ <a {...shared_props}
+ {href}
+ on:click
+ {type}
+ class="{sizeClasses} {kindClasses} inline-flex items-center border font-medium rounded shadow-sm focus:outline-none focus:ring-2 focus:ring-indigo-500">
+ {text}
+ </a>
+{:else}
+ <button {...shared_props}
+ on:click
+ {type}
+ class="{sizeClasses} {kindClasses} inline-flex items-center border font-medium rounded shadow-sm focus:outline-none focus:ring-2 focus:ring-indigo-500">
+ {text}
+ </button>
+{/if} \ No newline at end of file
diff --git a/apps/kit/src/lib/components/icons/adjustments.svelte b/apps/kit/src/lib/components/icons/adjustments.svelte
new file mode 100644
index 0000000..b6d3f4d
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/adjustments.svelte
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 {$$restProps.class??''}" fill="none" viewBox="0 0 24 24"
+ stroke="currentColor" stroke-width="2">
+ <path stroke-linecap="round" stroke-linejoin="round"
+ d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/>
+</svg> \ No newline at end of file
diff --git a/apps/kit/src/lib/components/icons/database.svelte b/apps/kit/src/lib/components/icons/database.svelte
new file mode 100644
index 0000000..05c70ed
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/database.svelte
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 {$$restProps.class ?? ''}" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4" />
+</svg> \ No newline at end of file
diff --git a/apps/kit/src/lib/components/icons/home.svelte b/apps/kit/src/lib/components/icons/home.svelte
new file mode 100644
index 0000000..cc49c4d
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/home.svelte
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 {$$restProps.class ?? ''}" fill="none" viewBox="0 0 24 24"
+ stroke="currentColor" stroke-width="2">
+ <path stroke-linecap="round" stroke-linejoin="round"
+ d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
+</svg> \ No newline at end of file
diff --git a/apps/kit/src/lib/components/icons/index.ts b/apps/kit/src/lib/components/icons/index.ts
new file mode 100644
index 0000000..d3abf24
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/index.ts
@@ -0,0 +1,13 @@
+import XIcon from "./x.svelte";
+import MenuIcon from "./menu.svelte";
+import AdjustmentsIcon from "./adjustments.svelte";
+import DatabaseIcon from "./database.svelte";
+import HomeIcon from "./home.svelte";
+
+export {
+ XIcon,
+ MenuIcon,
+ HomeIcon,
+ DatabaseIcon,
+ AdjustmentsIcon
+} \ No newline at end of file
diff --git a/apps/kit/src/lib/components/icons/menu.svelte b/apps/kit/src/lib/components/icons/menu.svelte
new file mode 100644
index 0000000..12a68a5
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/menu.svelte
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 {$$restProps.class ?? ''}" fill="none" viewBox="0 0 24 24" stroke="currentColor"
+ stroke-width="2">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/>
+</svg>
diff --git a/apps/kit/src/lib/components/icons/x.svelte b/apps/kit/src/lib/components/icons/x.svelte
new file mode 100644
index 0000000..c7e05a8
--- /dev/null
+++ b/apps/kit/src/lib/components/icons/x.svelte
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 {$$restProps.class ?? ''}" fill="none" viewBox="0 0 24 24"
+ stroke="currentColor" stroke-width="2">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
+</svg> \ No newline at end of file
diff --git a/apps/kit/src/lib/components/locale-switcher.svelte b/apps/kit/src/lib/components/locale-switcher.svelte
new file mode 100644
index 0000000..39d6168
--- /dev/null
+++ b/apps/kit/src/lib/components/locale-switcher.svelte
@@ -0,0 +1,52 @@
+<script lang="ts">
+ import {browser} from "$app/environment";
+ import {page} from "$app/stores";
+ import {setLocale, locale} from "$lib/i18n/i18n-svelte";
+ import type {Locales} from "$lib/i18n/i18n-types";
+ import {locales} from "$lib/i18n/i18n-util";
+ import {loadLocaleAsync} from "$lib/i18n/i18n-util.async";
+
+ const switchLocale = async (
+ newLocale: Locales,
+ updateHistoryState = true,
+ ) => {
+ if (!newLocale || $locale === newLocale) return;
+
+ // load new dictionary from server
+ await loadLocaleAsync(newLocale);
+
+ // select locale
+ setLocale(newLocale);
+
+ // update `lang` attribute
+ document.querySelector("html")?.setAttribute("lang", newLocale);
+
+ //TODO set cookie that persists the locale
+ };
+
+ // update locale when navigating via browser back/forward buttons
+ const handlePopStateEvent = async ({state}: PopStateEvent) =>
+ switchLocale(state.locale, false);
+
+ // update locale when page store changes
+ $: if (browser) {
+ const lang = $page.params.lang as Locales;
+ switchLocale(lang, false);
+ }
+</script>
+
+<svelte:window on:popstate={handlePopStateEvent}/>
+
+<ul>
+ {#each locales as l}
+ <li>
+ <button
+ type="button"
+ class:active={l === $locale}
+ on:click={() => switchLocale(l)}
+ >
+ {l}
+ </button>
+ </li>
+ {/each}
+</ul>
diff --git a/apps/kit/src/lib/configuration.ts b/apps/kit/src/lib/configuration.ts
new file mode 100644
index 0000000..d6f6b4f
--- /dev/null
+++ b/apps/kit/src/lib/configuration.ts
@@ -0,0 +1,45 @@
+export const TOP_BASE_DOMAIN = "greatoffice.app";
+export const BASE_DOMAIN = "dev.greatoffice.app";
+export const DEV_BASE_DOMAIN = "http://127.0.0.1";
+export const API_ADDRESS = "https://api." + BASE_DOMAIN;
+export const DEV_API_ADDRESS = "http://127.0.0.1:5000";
+export const SECONDS_BETWEEN_SESSION_CHECK = 600;
+
+export function base_domain(path: string = ""): string {
+ return (is_development() ? DEV_BASE_DOMAIN : TOP_BASE_DOMAIN) + (path !== "" ? "/" + path : "");
+}
+
+export function api_base(path: string = ""): string {
+ return (is_development() ? DEV_API_ADDRESS : API_ADDRESS) + (path !== "" ? "/" + path : "");
+}
+
+export function is_development(): boolean {
+ // @ts-ignore
+ return import.meta.env.DEV;
+}
+
+export function is_debug(): boolean {
+ return localStorage.getItem(StorageKeys.debug) !== "true";
+}
+
+export const CookieNames = {
+ theme: "go_theme",
+ locale: "go_locale"
+};
+
+export const QueryKeys = {
+ labels: "labels",
+ categories: "categories",
+ entries: "entries",
+};
+
+export const StorageKeys = {
+ session: "sessionData",
+ theme: "theme",
+ debug: "debug",
+ categories: "categories",
+ labels: "labels",
+ entries: "entries",
+ stopwatch: "stopwatchState",
+ logLevel: "logLevel"
+}; \ No newline at end of file
diff --git a/apps/web-shared/src/lib/helpers.ts b/apps/kit/src/lib/helpers.ts
index ad6f280..f0f60cd 100644
--- a/apps/web-shared/src/lib/helpers.ts
+++ b/apps/kit/src/lib/helpers.ts
@@ -1,7 +1,8 @@
-import { base_domain, CookieNames } from "$shared/lib/configuration";
-import { TimeEntryDto } from "$shared/lib/models/TimeEntryDto";
-import { UnwrappedEntryDateTime } from "$shared/lib/models/UnwrappedEntryDateTime";
-import { Temporal } from "@js-temporal/polyfill";
+import {browser} from "$app/environment";
+import type {TimeEntryDto} from "$lib/models/TimeEntryDto";
+import type {UnwrappedEntryDateTime} from "$lib/models/UnwrappedEntryDateTime";
+import {logInfo} from "$lib/logger";
+import {Temporal} from "temporal-polyfill";
export const EMAIL_REGEX = new RegExp(/^([a-z0-9]+(?:([._\-])[a-z0-9]+)*@(?:[a-z0-9]+(?:(-)[a-z0-9]+)?\.)+[a-z0-9](?:[a-z0-9]*[a-z0-9])?)$/i);
export const URL_REGEX = new RegExp(/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-.][a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/gm);
@@ -34,23 +35,23 @@ export function is_norwegian_phone_number(value: string): boolean {
return NORWEGIAN_PHONE_NUMBER_REGEX.test(String(value));
}
-export function switch_theme() {
- const html = document.querySelector("html");
- if (html.dataset.theme === "dark") {
- html.dataset.theme = "light";
- } else {
- html.dataset.theme = "dark";
- }
- set_cookie(CookieNames.theme, html.dataset.theme, base_domain());
-}
+// export function switch_theme() {
+// const html = document.querySelector("html");
+// if (html.dataset.theme === "dark") {
+// html.dataset.theme = "light";
+// } else {
+// html.dataset.theme = "dark";
+// }
+// set_cookie(CookieNames.theme, html.dataset.theme, base_domain());
+// }
-export function get_cookie(name) {
+export function get_cookie(name: string) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
- if (parts.length === 2) return parts.pop().split(";").shift();
+ if (parts.length === 2) return parts.pop()?.split(";").shift();
}
-export function set_cookie(name, value, baseDomain = window.location.host) {
+export function set_cookie(name: string, value: string, baseDomain = window.location.host) {
document.cookie = name + "=" + encodeURIComponent(value) + (baseDomain ? ";domain=" + baseDomain : "");
}
@@ -67,11 +68,11 @@ export function unwrap_date_time_from_entry(entry: TimeEntryDto): UnwrappedEntry
stop_time: stopInstant.toPlainTime(),
duration: Temporal.Duration.from({
hours: stopInstant.hour,
- minutes: stopInstant.minute
+ minutes: stopInstant.minute,
}).subtract(Temporal.Duration.from({
hours: startInstant.hour,
- minutes: startInstant.minute
- }))
+ minutes: startInstant.minute,
+ })),
};
}
@@ -176,29 +177,6 @@ export function make_url(url: string, params: object): string {
return `${url}${get_query_string(params)}`;
}
-export function load_script(url: string) {
- unload_script(url, () => {
- return new Promise(function (resolve, reject) {
- const script = document.createElement("script");
- script.src = url;
-
- script.addEventListener("load", function () {
- // The script is loaded completely
- resolve(true);
- });
-
- document.body.appendChild(script);
- });
- });
-}
-
-export function unload_script(src: string, callback?: Function): void {
- document.querySelectorAll("script[src='" + src + "']").forEach(el => el.remove());
- if (typeof callback === "function") {
- callback();
- }
-}
-
export function noop() {
}
@@ -249,14 +227,14 @@ export function random_string(length: number): string {
interface CreateElementOptions {
name: string,
properties?: object,
- children?: Array<HTMLElement|Function|Node>
+ children?: Array<HTMLElement | Function | Node>
}
export function create_element_from_object(elementOptions: CreateElementOptions): HTMLElement {
return create_element(elementOptions.name, elementOptions.properties, elementOptions.children);
}
-export function create_element(name: string, properties?: object, children?: Array<HTMLElement|any>): HTMLElement {
+export function create_element(name: string, properties?: object, children?: Array<HTMLElement | any>): HTMLElement {
if (!name || name.length < 1) {
throw new Error("name is required");
}
@@ -281,7 +259,7 @@ export function create_element(name: string, properties?: object, children?: Arr
return node;
}
-export function get_element_position(element: HTMLElement|any) {
+export function get_element_position(element: HTMLElement | any) {
if (!element) return {x: 0, y: 0};
let x = 0;
let y = 0;
@@ -299,7 +277,7 @@ export function get_element_position(element: HTMLElement|any) {
export function restrict_input_to_numbers(element: HTMLElement, specials: Array<string> = [], mergeSpecialsWithDefaults: boolean = false): void {
if (element) {
element.addEventListener("keydown", (e) => {
- const defaultSpecials = ["Backspace", "ArrowLeft", "ArrowRight", "Tab",];
+ const defaultSpecials = ["Backspace", "ArrowLeft", "ArrowRight", "Tab"];
let keys = specials.length > 0 ? specials : defaultSpecials;
if (mergeSpecialsWithDefaults && specials) {
keys = [...specials, ...defaultSpecials];
@@ -442,6 +420,10 @@ export function can_use_dom(): boolean {
}
export function session_storage_remove_regex(regex: RegExp): void {
+ if (!browser) {
+ logInfo("sessionStorage is not available in non-browser contexts");
+ return;
+ }
let n = sessionStorage.length;
while (n--) {
const key = sessionStorage.key(n);
@@ -452,6 +434,10 @@ export function session_storage_remove_regex(regex: RegExp): void {
}
export function local_storage_remove_regex(regex: RegExp): void {
+ if (!browser) {
+ logInfo("sessionStorage is not available in non-browser contexts");
+ return;
+ }
let n = localStorage.length;
while (n--) {
const key = localStorage.key(n);
@@ -462,22 +448,38 @@ export function local_storage_remove_regex(regex: RegExp): void {
}
export function session_storage_set_json(key: string, value: object): void {
+ if (!browser) {
+ console.warn("sessionStorage is not available in non-browser contexts");
+ return;
+ }
sessionStorage.setItem(key, JSON.stringify(value));
}
export function session_storage_get_json(key: string): object {
+ if (!browser) {
+ console.warn("sessionStorage is not available in non-browser contexts");
+ return {};
+ }
return JSON.parse(sessionStorage.getItem(key) ?? "{}");
}
export function local_storage_set_json(key: string, value: object): void {
+ if (!browser) {
+ console.warn("sessionStorage is not available in non-browser contexts");
+ return;
+ }
localStorage.setItem(key, JSON.stringify(value));
}
export function local_storage_get_json(key: string): object {
+ if (!browser) {
+ console.warn("sessionStorage is not available in non-browser contexts");
+ return {};
+ }
return JSON.parse(localStorage.getItem(key) ?? "{}");
}
-export function get_hash_code(value: string): number|undefined {
+export function get_hash_code(value: string): number | undefined {
let hash = 0;
if (value.length === 0) {
return;
diff --git a/apps/projects/src/app/lib/i18n/en/index.ts b/apps/kit/src/lib/i18n/en/index.ts
index a85af7b..f3def1b 100644
--- a/apps/projects/src/app/lib/i18n/en/index.ts
+++ b/apps/kit/src/lib/i18n/en/index.ts
@@ -120,7 +120,17 @@ const en: BaseTranslation = {
pageNotFound: "Page not found",
goToFrontpage: "Go to frontpage",
noInternet: "It seems like your device does not have a internet connection, please check your connection."
- }
+ },
+ login: {
+ loginToYourAccount: "Log in to your account",
+ or: "Or",
+ createANewAccount: "create a new account",
+ emailAddress: "Email address",
+ password: "Password",
+ notMyComputer: "This is not my computer",
+ forgotPassword: "Forgot your password?",
+ logIn: "Log in"
+ },
};
export default en;
diff --git a/apps/projects/src/app/lib/i18n/formatters.ts b/apps/kit/src/lib/i18n/formatters.ts
index 78734f9..78734f9 100644
--- a/apps/projects/src/app/lib/i18n/formatters.ts
+++ b/apps/kit/src/lib/i18n/formatters.ts
diff --git a/apps/projects/src/app/lib/i18n/i18n-svelte.ts b/apps/kit/src/lib/i18n/i18n-svelte.ts
index 6cdffb3..6cdffb3 100644
--- a/apps/projects/src/app/lib/i18n/i18n-svelte.ts
+++ b/apps/kit/src/lib/i18n/i18n-svelte.ts
diff --git a/apps/projects/src/app/lib/i18n/i18n-types.ts b/apps/kit/src/lib/i18n/i18n-types.ts
index acba223..f3e0f80 100644
--- a/apps/projects/src/app/lib/i18n/i18n-types.ts
+++ b/apps/kit/src/lib/i18n/i18n-types.ts
@@ -416,6 +416,40 @@ type RootTranslation = {
*/
noInternet: string
}
+ login: {
+ /**
+ * Log in to your account
+ */
+ loginToYourAccount: string
+ /**
+ * Or
+ */
+ or: string
+ /**
+ * create a new account
+ */
+ createANewAccount: string
+ /**
+ * Email address
+ */
+ emailAddress: string
+ /**
+ * Password
+ */
+ password: string
+ /**
+ * This is not my computer
+ */
+ notMyComputer: string
+ /**
+ * Forgot your password?
+ */
+ forgotPassword: string
+ /**
+ * Log in
+ */
+ logIn: string
+ }
}
export type TranslationFunctions = {
@@ -817,6 +851,40 @@ export type TranslationFunctions = {
*/
noInternet: () => LocalizedString
}
+ login: {
+ /**
+ * Log in to your account
+ */
+ loginToYourAccount: () => LocalizedString
+ /**
+ * Or
+ */
+ or: () => LocalizedString
+ /**
+ * create a new account
+ */
+ createANewAccount: () => LocalizedString
+ /**
+ * Email address
+ */
+ emailAddress: () => LocalizedString
+ /**
+ * Password
+ */
+ password: () => LocalizedString
+ /**
+ * This is not my computer
+ */
+ notMyComputer: () => LocalizedString
+ /**
+ * Forgot your password?
+ */
+ forgotPassword: () => LocalizedString
+ /**
+ * Log in
+ */
+ logIn: () => LocalizedString
+ }
}
export type Formatters = {}
diff --git a/apps/projects/src/app/lib/i18n/i18n-util.async.ts b/apps/kit/src/lib/i18n/i18n-util.async.ts
index 3ccef5f..3ccef5f 100644
--- a/apps/projects/src/app/lib/i18n/i18n-util.async.ts
+++ b/apps/kit/src/lib/i18n/i18n-util.async.ts
diff --git a/apps/projects/src/app/lib/i18n/i18n-util.sync.ts b/apps/kit/src/lib/i18n/i18n-util.sync.ts
index f1a8e9e..f1a8e9e 100644
--- a/apps/projects/src/app/lib/i18n/i18n-util.sync.ts
+++ b/apps/kit/src/lib/i18n/i18n-util.sync.ts
diff --git a/apps/projects/src/app/lib/i18n/i18n-util.ts b/apps/kit/src/lib/i18n/i18n-util.ts
index cad1e7a..11d4b23 100644
--- a/apps/projects/src/app/lib/i18n/i18n-util.ts
+++ b/apps/kit/src/lib/i18n/i18n-util.ts
@@ -13,6 +13,8 @@ export const locales: Locales[] = [
'nb'
]
+export const isLocale = (locale: string) => locales.includes(locale as Locales)
+
export const loadedLocales = {} as Record<Locales, Translations>
export const loadedFormatters = {} as Record<Locales, Formatters>
diff --git a/apps/projects/src/app/lib/i18n/nb/index.ts b/apps/kit/src/lib/i18n/nb/index.ts
index 1638345..b350994 100644
--- a/apps/projects/src/app/lib/i18n/nb/index.ts
+++ b/apps/kit/src/lib/i18n/nb/index.ts
@@ -120,7 +120,17 @@ const nb: Translation = {
pageNotFound: "Fant ikke siden",
goToFrontpage: "Gå til forsiden",
noInternet: "Det ser ut som at du er uten internettilgang, vennligst sjekk tilkoblingen din."
- }
+ },
+ login: {
+ loginToYourAccount: "Logg inn i din konto",
+ or: "Eller",
+ createANewAccount: "lag en ny konto",
+ emailAddress: "E-postadresse",
+ password: "Passord",
+ notMyComputer: "Dette er ikke min datamaskin",
+ forgotPassword: "Glem passord?",
+ logIn: "Logg inn"
+ },
};
export default nb;
diff --git a/apps/web-shared/src/lib/locale.ts b/apps/kit/src/lib/locale.ts
index 002f874..002f874 100644
--- a/apps/web-shared/src/lib/locale.ts
+++ b/apps/kit/src/lib/locale.ts
diff --git a/apps/kit/src/lib/logger.ts b/apps/kit/src/lib/logger.ts
new file mode 100644
index 0000000..e017ba0
--- /dev/null
+++ b/apps/kit/src/lib/logger.ts
@@ -0,0 +1,87 @@
+import {browser, dev} from "$app/environment";
+import {StorageKeys} from "$lib/configuration";
+import pino from "pino";
+
+const pinoConfig = dev ? {
+ transport: {
+ target: "pino-pretty",
+ },
+} : {};
+
+const pinoLogger = pino(pinoConfig);
+
+function browserLogLevel(): number {
+ if (browser) return LogLevel.toNumber(sessionStorage.getItem(StorageKeys.logLevel), LogLevel.INFO);
+ throw new Error("Called browser api in server");
+}
+
+function serverLogLevel(): number {
+ if (!browser) return LogLevel.toNumber(process.env.LOG_LEVEL, LogLevel.ERROR);
+ throw new Error("Called server api in browser");
+}
+
+export const LogLevel = {
+ DEBUG: 0,
+ INFO: 1,
+ ERROR: 2,
+ SILENT: 3,
+ toString(levelInt: number): string {
+ switch (levelInt) {
+ case 0:
+ return "DEBUG";
+ case 1:
+ return "INFO";
+ case 2:
+ return "ERROR";
+ case 3:
+ return "SILENT";
+ default:
+ throw new Error("Log level int is unknown");
+ }
+ },
+ toNumber(levelString?: string | null, fallback?: number): number {
+ if (!levelString && fallback) return fallback;
+ else if (!levelString && !fallback) throw new Error("levelString was empty, and no fallback was specified");
+ switch (levelString?.toUpperCase()) {
+ case "DEBUG":
+ return 0;
+ case "INFO":
+ return 1;
+ case "ERROR":
+ return 2;
+ case "SILENT":
+ return 3;
+ default:
+ if (!fallback) throw new Error("Log level string is unknown");
+ else return fallback;
+ }
+ },
+};
+
+export function logDebug(message: string, ...additional: any[]): void {
+ if (browser && browserLogLevel() <= LogLevel.DEBUG) {
+ pinoLogger.debug(message, additional);
+ }
+
+ if (!browser && serverLogLevel() <= LogLevel.DEBUG) {
+ pinoLogger.debug(message, additional);
+ }
+}
+
+export function logInfo(message: string, ...additional: any[]): void {
+ if (browser && browserLogLevel() <= LogLevel.INFO) {
+ pinoLogger.info(message, additional);
+ }
+ if (!browser && serverLogLevel() <= LogLevel.INFO) {
+ pinoLogger.info(message, additional);
+ }
+}
+
+export function logError(message: any, ...additional: any[]): void {
+ if (browser && browserLogLevel() <= LogLevel.ERROR) {
+ pinoLogger.error(message, additional);
+ }
+ if (!browser && serverLogLevel() <= LogLevel.ERROR) {
+ pinoLogger.error(message, additional);
+ }
+} \ No newline at end of file
diff --git a/apps/web-shared/src/lib/models/CreateAccountPayload.ts b/apps/kit/src/lib/models/CreateAccountPayload.ts
index d116308..d116308 100644
--- a/apps/web-shared/src/lib/models/CreateAccountPayload.ts
+++ b/apps/kit/src/lib/models/CreateAccountPayload.ts
diff --git a/apps/web-shared/src/lib/models/ErrorResult.ts b/apps/kit/src/lib/models/ErrorResult.ts
index 7c70017..7c70017 100644
--- a/apps/web-shared/src/lib/models/ErrorResult.ts
+++ b/apps/kit/src/lib/models/ErrorResult.ts
diff --git a/apps/web-shared/src/lib/models/IInternalFetchRequest.ts b/apps/kit/src/lib/models/IInternalFetchRequest.ts
index 68505e2..68505e2 100644
--- a/apps/web-shared/src/lib/models/IInternalFetchRequest.ts
+++ b/apps/kit/src/lib/models/IInternalFetchRequest.ts
diff --git a/apps/web-shared/src/lib/models/IInternalFetchResponse.ts b/apps/kit/src/lib/models/IInternalFetchResponse.ts
index 6c91b35..6c91b35 100644
--- a/apps/web-shared/src/lib/models/IInternalFetchResponse.ts
+++ b/apps/kit/src/lib/models/IInternalFetchResponse.ts
diff --git a/apps/web-shared/src/lib/models/ISession.ts b/apps/kit/src/lib/models/ISession.ts
index f7ed46b..f7ed46b 100644
--- a/apps/web-shared/src/lib/models/ISession.ts
+++ b/apps/kit/src/lib/models/ISession.ts
diff --git a/apps/web-shared/src/lib/models/IValidationResult.ts b/apps/kit/src/lib/models/IValidationResult.ts
index 9a21b13..9a21b13 100644
--- a/apps/web-shared/src/lib/models/IValidationResult.ts
+++ b/apps/kit/src/lib/models/IValidationResult.ts
diff --git a/apps/web-shared/src/lib/models/LoginPayload.ts b/apps/kit/src/lib/models/LoginPayload.ts
index ccd9bed..ccd9bed 100644
--- a/apps/web-shared/src/lib/models/LoginPayload.ts
+++ b/apps/kit/src/lib/models/LoginPayload.ts
diff --git a/apps/web-shared/src/lib/models/TimeCategoryDto.ts b/apps/kit/src/lib/models/TimeCategoryDto.ts
index 875e8cb..fcdb7ea 100644
--- a/apps/web-shared/src/lib/models/TimeCategoryDto.ts
+++ b/apps/kit/src/lib/models/TimeCategoryDto.ts
@@ -1,4 +1,4 @@
-import { Temporal } from "@js-temporal/polyfill";
+import { Temporal } from "temporal-polyfill";
export interface TimeCategoryDto {
selected?: boolean;
diff --git a/apps/web-shared/src/lib/models/TimeEntryDto.ts b/apps/kit/src/lib/models/TimeEntryDto.ts
index 71fe7a3..571c52e 100644
--- a/apps/web-shared/src/lib/models/TimeEntryDto.ts
+++ b/apps/kit/src/lib/models/TimeEntryDto.ts
@@ -1,6 +1,6 @@
import type { TimeLabelDto } from "./TimeLabelDto";
import type { TimeCategoryDto } from "./TimeCategoryDto";
-import { Temporal } from "@js-temporal/polyfill";
+import { Temporal } from "temporal-polyfill";
export interface TimeEntryDto {
id: string,
diff --git a/apps/web-shared/src/lib/models/TimeEntryQuery.ts b/apps/kit/src/lib/models/TimeEntryQuery.ts
index 6681c79..d983d1a 100644
--- a/apps/web-shared/src/lib/models/TimeEntryQuery.ts
+++ b/apps/kit/src/lib/models/TimeEntryQuery.ts
@@ -1,6 +1,6 @@
import type { TimeCategoryDto } from "./TimeCategoryDto";
import type { TimeLabelDto } from "./TimeLabelDto";
-import type { Temporal } from "@js-temporal/polyfill";
+import type { Temporal } from "temporal-polyfill";
export interface TimeEntryQuery {
duration: TimeEntryQueryDuration,
diff --git a/apps/web-shared/src/lib/models/TimeLabelDto.ts b/apps/kit/src/lib/models/TimeLabelDto.ts
index 2b42d07..7183bcf 100644
--- a/apps/web-shared/src/lib/models/TimeLabelDto.ts
+++ b/apps/kit/src/lib/models/TimeLabelDto.ts
@@ -1,4 +1,4 @@
-import { Temporal } from "@js-temporal/polyfill";
+import { Temporal } from "temporal-polyfill";
export interface TimeLabelDto {
id?: string,
diff --git a/apps/web-shared/src/lib/models/TimeQueryDto.ts b/apps/kit/src/lib/models/TimeQueryDto.ts
index 607c51e..607c51e 100644
--- a/apps/web-shared/src/lib/models/TimeQueryDto.ts
+++ b/apps/kit/src/lib/models/TimeQueryDto.ts
diff --git a/apps/web-shared/src/lib/models/UnwrappedEntryDateTime.ts b/apps/kit/src/lib/models/UnwrappedEntryDateTime.ts
index e6022d8..d614f91 100644
--- a/apps/web-shared/src/lib/models/UnwrappedEntryDateTime.ts
+++ b/apps/kit/src/lib/models/UnwrappedEntryDateTime.ts
@@ -1,4 +1,4 @@
-import {Temporal} from "@js-temporal/polyfill";
+import { Temporal } from "temporal-polyfill";
export interface UnwrappedEntryDateTime {
start_date: Temporal.PlainDate,
diff --git a/apps/web-shared/src/lib/models/UpdateProfilePayload.ts b/apps/kit/src/lib/models/UpdateProfilePayload.ts
index d2983ff..d2983ff 100644
--- a/apps/web-shared/src/lib/models/UpdateProfilePayload.ts
+++ b/apps/kit/src/lib/models/UpdateProfilePayload.ts
diff --git a/apps/web-shared/src/lib/persistent-store.ts b/apps/kit/src/lib/persistent-store.ts
index 922f3ab..922f3ab 100644
--- a/apps/web-shared/src/lib/persistent-store.ts
+++ b/apps/kit/src/lib/persistent-store.ts
diff --git a/apps/web-shared/src/lib/session.ts b/apps/kit/src/lib/session.ts
index f729687..ee79933 100644
--- a/apps/web-shared/src/lib/session.ts
+++ b/apps/kit/src/lib/session.ts
@@ -1,8 +1,9 @@
-import {Temporal} from "@js-temporal/polyfill";
-import {get_profile_for_active_check, logout} from "./api/user";
-import {is_guid, session_storage_get_json, session_storage_set_json} from "./helpers";
-import {SECONDS_BETWEEN_SESSION_CHECK, StorageKeys} from "./configuration";
-import type {ISession} from "$shared/lib/models/ISession";
+import {logError, logInfo} from "$lib/logger";
+import { Temporal } from "temporal-polyfill";
+import { get_profile_for_active_check, logout } from "./api/user";
+import { is_guid, session_storage_get_json, session_storage_set_json } from "./helpers";
+import { SECONDS_BETWEEN_SESSION_CHECK, StorageKeys } from "./configuration";
+import type { ISession } from "$lib/models/ISession";
export async function is_active(forceRefresh: boolean = false): Promise<boolean> {
const nowEpoch = Temporal.Now.instant().epochSeconds;
@@ -15,7 +16,7 @@ export async function is_active(forceRefresh: boolean = false): Promise<boolean>
const sessionIsValid = data.profile && is_guid(data.profile.id);
if (!sessionIsValid) {
clear_session_data();
- console.log("Session data is not valid");
+ logInfo("Session data is not valid");
}
return sessionIsValid;
}
@@ -28,7 +29,7 @@ export async function end_session(cb: Function): Promise<void> {
}
async function call_api(): Promise<boolean> {
- console.log("Getting profile data while checking session state");
+ logInfo("Getting profile data while checking session state");
try {
const response = await get_profile_for_active_check();
if (response.ok) {
@@ -39,20 +40,20 @@ async function call_api(): Promise<boolean> {
lastChecked: Temporal.Now.instant().epochSeconds
} as ISession;
session_storage_set_json(StorageKeys.session, session);
- console.log("Successfully got profile data while checking session state");
+ logInfo("Successfully got profile data while checking session state");
return true;
} else {
- console.error("Api returned invalid data while getting profile data");
+ logError("Api returned invalid data while getting profile data");
clear_session_data();
return false;
}
} else {
- console.error("Api returned unsuccessfully while getting profile data");
+ logError("Api returned unsuccessfully while getting profile data");
clear_session_data();
return false;
}
} catch (e) {
- console.error(e);
+ logError(e);
clear_session_data();
return false;
}
@@ -60,7 +61,7 @@ async function call_api(): Promise<boolean> {
export function clear_session_data() {
session_storage_set_json(StorageKeys.session, {});
- console.log("Cleared session data.");
+ logInfo("Cleared session data.");
}
export function get_session_data(): ISession {
diff --git a/apps/kit/src/params/guid.ts b/apps/kit/src/params/guid.ts
new file mode 100644
index 0000000..d8f7231
--- /dev/null
+++ b/apps/kit/src/params/guid.ts
@@ -0,0 +1,5 @@
+import {is_guid} from "$lib/helpers";
+
+export function match(param: string): boolean {
+ return is_guid(param);
+} \ No newline at end of file
diff --git a/apps/kit/src/params/integer.ts b/apps/kit/src/params/integer.ts
new file mode 100644
index 0000000..6e36cd8
--- /dev/null
+++ b/apps/kit/src/params/integer.ts
@@ -0,0 +1,3 @@
+export function match(param: string): boolean {
+ return /^\d+$/.test(param);
+} \ No newline at end of file
diff --git a/apps/kit/src/routes/(app)/+layout.svelte b/apps/kit/src/routes/(app)/+layout.svelte
new file mode 100644
index 0000000..3f60af3
--- /dev/null
+++ b/apps/kit/src/routes/(app)/+layout.svelte
@@ -0,0 +1,215 @@
+<svelte:options immutable={true}/>
+<svelte:window bind:online={online}/>
+<script lang="ts">
+ import LL, {setLocale} from "$lib/i18n/i18n-svelte";
+ import {Dialog, TransitionChild, TransitionRoot} from '@rgossiaux/svelte-headlessui';
+ import {XIcon, MenuIcon, HomeIcon, DatabaseIcon, AdjustmentsIcon} from "$lib/components/icons";
+
+ let online = true;
+ let sidebarIsOpen = false;
+ const username = "dumb";
+
+ setLocale("nb");
+
+ const navigations = [
+ {
+ name: "Home",
+ icon: HomeIcon
+ },
+ {
+ name: "Data",
+ icon: DatabaseIcon
+ },
+ {
+ name: "Settings",
+ icon: AdjustmentsIcon
+ }
+ ]
+</script>
+{#if !online}
+ <div class="bg-yellow-50 border-l-4 border-yellow-400 p-4">
+ <div class="flex">
+ <div class="flex-shrink-0">
+ <svg class="h-5 w-5 text-yellow-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"
+ fill="currentColor" aria-hidden="true">
+ <path fill-rule="evenodd"
+ d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z"
+ clip-rule="evenodd"/>
+ </svg>
+ </div>
+ <div class="ml-3">
+ <p class="text-sm text-yellow-700">
+ You seem to be offline, please check your internet connection.
+ </p>
+ </div>
+ </div>
+ </div>
+{/if}
+<div class="h-full flex">
+ <TransitionRoot show={sidebarIsOpen}>
+ <Dialog class="relative z-40 lg:hidden" on:close={() => sidebarIsOpen = !sidebarIsOpen}>
+ <TransitionChild
+ enter="transition-opacity ease-linear duration-300"
+ enterFrom="opacity-0"
+ enterTo="opacity-100"
+ leave="transition-opacity ease-linear duration-300"
+ leaveFrom="opacity-100"
+ leaveTo="opacity-0">
+ <div class="fixed inset-0 bg-gray-600 bg-opacity-75"></div>
+ </TransitionChild>
+
+ <div class="fixed inset-0 flex z-40">
+ <TransitionChild
+ enter="transition ease-in-out duration-300 transform"
+ enterFrom="-translate-x-full"
+ enterTo="translate-x-0"
+ leave="transition ease-in-out duration-300 transform"
+ leaveFrom="translate-x-0"
+ leaveTo="-translate-x-full">
+ <DialogPanel class="relative flex-1 flex flex-col max-w-xs w-full bg-white focus:outline-none">
+ <TransitionChild
+ enter="ease-in-out duration-300"
+ enterFrom="opacity-0"
+ enterTo="opacity-100"
+ leave="ease-in-out duration-300"
+ leaveFrom="opacity-100"
+ leaveTo="opacity-0">
+ <div class="absolute top-0 right-0 -mr-12 pt-2">
+ <button type="button"
+ class="ml-1 flex items-center justify-center h-10 w-10 rounded-full focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white"
+ on:click={() => sidebarIsOpen = false}>
+ <span class="sr-only">Close sidebar</span>
+ <XIcon class="text-white" aria-hidden="true"/>
+ </button>
+ </div>
+ </TransitionChild>
+ <div class="flex-1 h-0 pt-5 pb-4 overflow-y-auto">
+ <div class="flex-shrink-0 flex items-center px-4">
+ <img class="h-8 w-auto"
+ src="https://tailwindui.com/img/logos/workflow-mark.svg?color=indigo&shade=600"
+ alt="Workflow"
+ />
+ </div>
+ <nav aria-label="Sidebar" class="mt-5">
+ <div class="px-2 space-y-1">
+ {#each navigations as item (item.name)}
+ <a href={item.href}
+ class="{item.current? 'bg-gray-100 text-gray-900': 'text-gray-600 hover:bg-gray-50 hover:text-gray-900'} group flex items-center px-2 py-2 text-base font-medium rounded-md">
+ <svelte:component this="{item.icon}"
+ class="{item.current ? 'text-gray-500' : 'text-gray-400 group-hover:text-gray-500'} mr-4 h-6 w-6"
+ aria-hidden="true"></svelte:component>
+ {item.name}
+ </a>
+ {/each}
+ </div>
+ </nav>
+ </div>
+ <div class="flex-shrink-0 flex border-t border-gray-200 p-4">
+ <a href="#" class="flex-shrink-0 group block">
+ <div class="flex items-center">
+ <div>
+ <img class="inline-block h-10 w-10 rounded-full"
+ src="https://images.unsplash.com/photo-1517365830460-955ce3ccd263?ixlib=rb-=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=256&h=256&q=80"
+ alt=""
+ />
+ </div>
+ <div class="ml-3">
+ <p class="text-base font-medium text-gray-700 group-hover:text-gray-900">
+ {username}
+ </p>
+ <p class="text-sm font-medium text-gray-500 group-hover:text-gray-700">
+ {$LL.nav.usermenu.profileTitle()}
+ </p>
+ </div>
+ </div>
+ </a>
+ </div>
+ </DialogPanel>
+ </TransitionChild>
+ <div class="flex-shrink-0 w-14" aria-hidden="true">
+ <!--{/* Force sidebar to shrink to fit close icon */}-->
+ </div>
+ </div>
+ </Dialog>
+ </TransitionRoot>
+
+ <!--{/* Static sidebar for desktop */}-->
+ <div class="hidden lg:flex lg:flex-shrink-0">
+ <div class="flex flex-col w-64">
+ <!--{/* Sidebar component, swap this element with another sidebar if you like */}-->
+ <div class="flex-1 flex flex-col min-h-0 border-r border-gray-200 bg-gray-100">
+ <div class="flex-1 flex flex-col pt-5 pb-4 overflow-y-auto">
+ <div class="flex items-center flex-shrink-0 px-4">
+ <img class="h-8 w-auto"
+ src="https://tailwindui.com/img/logos/workflow-mark.svg?color=indigo&shade=600"
+ alt="Workflow"
+ />
+ </div>
+ <nav class="mt-5 flex-1" aria-label="Sidebar">
+ <div class="px-2 space-y-1">
+ {#each navigations as item (item.name)}
+ <a key={item.name}
+ href={item.href}
+ class="{item.current ? 'bg-gray-200 text-gray-900' : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900'} group flex items-center px-2 py-2 text-sm font-medium rounded-md">
+ <svelte:component this="{item.icon}"
+ class="{item.current ? 'text-gray-500' : 'text-gray-400 group-hover:text-gray-500'} mr-3 h-6 w-6"
+ aria-hidden="true"></svelte:component>
+ {item.name}
+ </a>
+ {/each}
+ </div>
+ </nav>
+ </div>
+ <div class="flex-shrink-0 flex border-t border-gray-200 p-4">
+ <a href="#" class="flex-shrink-0 w-full group block">
+ <div class="flex items-center">
+ <div>
+ <img class="inline-block h-9 w-9 rounded-full"
+ src="https://images.unsplash.com/photo-1517365830460-955ce3ccd263?ixlib=rb-=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=256&h=256&q=80"
+ alt=""
+ />
+ </div>
+ <div class="ml-3">
+ <p class="text-base font-medium text-gray-700 group-hover:text-gray-900">
+ {username}
+ </p>
+ <p class="text-sm font-medium text-gray-500 group-hover:text-gray-700">
+ {$LL.nav.usermenu.profileTitle()}
+ </p>
+ </div>
+ </div>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="flex flex-col min-w-0 flex-1 overflow-hidden">
+ <div class="lg:hidden">
+ <div class="flex items-center justify-between bg-gray-50 border-b border-gray-200 px-4 py-1.5">
+ <div>
+ <button type="button"
+ class="-mr-3 h-12 w-12 inline-flex items-center justify-center rounded-md text-gray-500 hover:text-gray-900"
+ on:click={() => sidebarIsOpen = true}>
+ <span class="sr-only">Open sidebar</span>
+ <MenuIcon aria-hidden="true"/>
+ </button>
+ </div>
+ </div>
+ </div>
+ <div class="flex-1 relative z-0 flex overflow-hidden">
+ <main class="flex-1 relative z-0 overflow-y-auto focus:outline-none">
+ <!--
+ MAIN CONTENT
+ -->
+ <slot/>
+ </main>
+ <aside class="hidden relative xl:flex xl:flex-col flex-shrink-0 w-96 border-l border-gray-200 overflow-y-auto">
+ <!--{/* Start secondary column (hidden on smaller screens) */}
+ <div class="absolute inset-0 py-6 px-4 sm:px-6 lg:px-8">
+ <div class="h-full border-2 border-gray-200 border-dashed rounded-lg" />
+ </div>
+ {/* End secondary column */}-->
+ </aside>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/apps/kit/src/routes/(app)/home/+page.svelte b/apps/kit/src/routes/(app)/home/+page.svelte
new file mode 100644
index 0000000..247ee47
--- /dev/null
+++ b/apps/kit/src/routes/(app)/home/+page.svelte
@@ -0,0 +1 @@
+<h1>Welcome Home</h1> \ No newline at end of file
diff --git a/apps/kit/src/routes/(public)/+layout.svelte b/apps/kit/src/routes/(public)/+layout.svelte
new file mode 100644
index 0000000..1301e50
--- /dev/null
+++ b/apps/kit/src/routes/(public)/+layout.svelte
@@ -0,0 +1,6 @@
+<script>
+ import {setLocale} from "$lib/i18n/i18n-svelte";
+
+ setLocale("nb");
+</script>
+<slot></slot> \ No newline at end of file
diff --git a/apps/kit/src/routes/(public)/login/+page.svelte b/apps/kit/src/routes/(public)/login/+page.svelte
new file mode 100644
index 0000000..800575e
--- /dev/null
+++ b/apps/kit/src/routes/(public)/login/+page.svelte
@@ -0,0 +1,95 @@
+<script lang="ts">
+ import {goto} from "$app/navigation";
+ import {login} from "$lib/api/user";
+ import LL from "$lib/i18n/i18n-svelte";
+ import type {ErrorResult} from "$lib/models/ErrorResult";
+ import type {LoginPayload} from "$lib/models/LoginPayload";
+
+ const data = {
+ username: "",
+ password: ""
+ } as LoginPayload;
+ let error = {
+ text: "",
+ title: ""
+ } as ErrorResult;
+
+ async function submitFormAsync() {
+ error = {text: "", title: ""};
+ const loginResponse = await login(data);
+ if (loginResponse.ok) {
+ await goto("/home")
+ } else {
+ error.title = loginResponse.data.title;
+ error.text = loginResponse.data.text;
+ }
+ }
+</script>
+<div class="min-h-full flex flex-col justify-center py-12 sm:px-6 lg:px-8">
+ <div class="sm:mx-auto sm:w-full sm:max-w-md">
+ <h2 class="mt-6 text-center text-3xl tracking-tight font-bold text-gray-900">{$LL.login.loginToYourAccount()}</h2>
+ <p class="mt-2 text-center text-sm text-gray-600">
+ {$LL.login.or()}
+ <a href="/signup"
+ class="font-medium text-indigo-600 hover:text-indigo-500">{$LL.login.createANewAccount()}</a>
+ </p>
+ </div>
+
+ <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
+ <div class="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
+ {#if error.text || error.title}
+ <div class="rounded-md bg-red-50 p-3 mb-3">
+ {#if error.title}
+ <h3 class="text-sm font-medium text-red-800">{error.title}</h3>
+ {/if}
+ {#if error.text}
+ <div class="mt-2 text-sm text-red-700">
+ {error.text}
+ </div>
+ {/if}
+ </div>
+ {/if}
+ <form class="space-y-6" on:submit|preventDefault={submitFormAsync}>
+ <div>
+ <label for="email"
+ class="block text-sm font-medium text-gray-700">{$LL.login.emailAddress()}</label>
+ <div class="mt-1">
+ <input id="email" name="email" type="email" autocomplete="email" required
+ value={data.username}
+ class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+ </div>
+ </div>
+
+ <div>
+ <label for="password" class="block text-sm font-medium text-gray-700">{$LL.login.password()}</label>
+ <div class="mt-1">
+ <input id="password" name="password" type="password" autocomplete="current-password" required
+ value={data.password}
+ class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+ </div>
+ </div>
+
+ <div class="flex items-center justify-between">
+ <div class="flex items-center">
+ <input id="remember-me" name="remember-me" type="checkbox"
+ class="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded">
+ <label for="remember-me"
+ class="ml-2 block text-sm text-gray-900">{$LL.login.notMyComputer()}</label>
+ </div>
+
+ <div class="text-sm">
+ <a href="/reset"
+ class="font-medium text-indigo-600 hover:text-indigo-500">{$LL.login.forgotPassword()}</a>
+ </div>
+ </div>
+
+ <div>
+ <button type="submit"
+ class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
+ {$LL.login.logIn()}
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
diff --git a/apps/kit/src/routes/(public)/reset/+page.svelte b/apps/kit/src/routes/(public)/reset/+page.svelte
new file mode 100644
index 0000000..41c4728
--- /dev/null
+++ b/apps/kit/src/routes/(public)/reset/+page.svelte
@@ -0,0 +1,29 @@
+<div class="min-h-full flex flex-col justify-center py-12 sm:px-6 lg:px-8">
+ <div class="sm:mx-auto sm:w-full sm:max-w-md">
+ <h2 class="mt-6 text-center text-3xl tracking-tight font-bold text-gray-900">Request a password reset</h2>
+ <p class="mt-2 text-center text-sm text-gray-600">
+ Or
+ <a href="/login" class="font-medium text-indigo-600 hover:text-indigo-500">go to login page</a>
+ </p>
+ </div>
+
+ <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
+ <div class="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
+ <form class="space-y-6" action="#" method="POST">
+ <div>
+ <label for="email" class="block text-sm font-medium text-gray-700"> Email address </label>
+ <div class="mt-1">
+ <input id="email" name="email" type="email" autocomplete="email" required
+ class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+ </div>
+ </div>
+ <div>
+ <button type="submit"
+ class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
+ Send request
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
diff --git a/apps/kit/src/routes/(public)/signup/+page.svelte b/apps/kit/src/routes/(public)/signup/+page.svelte
new file mode 100644
index 0000000..d4a1bda
--- /dev/null
+++ b/apps/kit/src/routes/(public)/signup/+page.svelte
@@ -0,0 +1,38 @@
+<div class="min-h-full flex flex-col justify-center py-12 sm:px-6 lg:px-8">
+ <div class="sm:mx-auto sm:w-full sm:max-w-md">
+ <h2 class="mt-6 text-center text-3xl tracking-tight font-bold text-gray-900">Create your new account</h2>
+ <p class="mt-2 text-center text-sm text-gray-600">
+ Or
+ <a href="/login" class="font-medium text-indigo-600 hover:text-indigo-500">go to login page</a>
+ </p>
+ </div>
+
+ <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
+ <div class="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
+ <form class="space-y-6" action="#" method="POST">
+ <div>
+ <label for="email" class="block text-sm font-medium text-gray-700"> Email address </label>
+ <div class="mt-1">
+ <input id="email" name="email" type="email" autocomplete="email" required
+ class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+ </div>
+ </div>
+
+ <div>
+ <label for="password" class="block text-sm font-medium text-gray-700"> Password </label>
+ <div class="mt-1">
+ <input id="password" name="password" type="password" autocomplete="current-password" required
+ class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+ </div>
+ </div>
+
+ <div>
+ <button type="submit"
+ class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
+ Create account
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
diff --git a/apps/kit/src/routes/+layout.server.ts b/apps/kit/src/routes/+layout.server.ts
new file mode 100644
index 0000000..01aae89
--- /dev/null
+++ b/apps/kit/src/routes/+layout.server.ts
@@ -0,0 +1,13 @@
+// import {is_active} from "$lib/session";
+// import {redirect} from "@sveltejs/kit";
+// import type {LayoutServerLoad} from "./$types";
+//
+// export const load: LayoutServerLoad = async ({routeId}) => {
+// const sessionIsValid = await is_active();
+// const isPublicRoute = routeId?.startsWith("(public)");
+// if (sessionIsValid && isPublicRoute) {
+// throw redirect(302, "/home");
+// } else if (!sessionIsValid && !isPublicRoute) {
+// throw redirect(302, "/login");
+// }
+// }; \ No newline at end of file
diff --git a/apps/kit/src/routes/+layout.svelte b/apps/kit/src/routes/+layout.svelte
new file mode 100644
index 0000000..ee76da9
--- /dev/null
+++ b/apps/kit/src/routes/+layout.svelte
@@ -0,0 +1,23 @@
+<script lang="ts">
+ import "../app.pcss";
+ import {afterNavigate, beforeNavigate, goto} from "$app/navigation";
+ import {is_active} from "$lib/session";
+ import type {Navigation} from "@sveltejs/kit";
+
+ async function redirect_if_necessary(ticket: Navigation) {
+ const sessionIsValid = await is_active();
+ const isPublicRoute = ticket.to?.routeId?.startsWith("(public)");
+ if (sessionIsValid && isPublicRoute) {
+ await goto("/home");
+ } else if (!sessionIsValid && !isPublicRoute) {
+ await goto("/login");
+ }
+ }
+
+ // This should probably be removed in favor of the logic in layout.server.ts.
+ // That requires a more sophisticated server side implementation of session handling,
+ // and i don't want that tbh, i want to stay as much in the browser as possible.
+ afterNavigate(redirect_if_necessary);
+ beforeNavigate(redirect_if_necessary);
+</script>
+<slot></slot> \ No newline at end of file
diff --git a/apps/web-shared/src/assets/preload.js b/apps/kit/static/preload.js
index 379902f..379902f 100644
--- a/apps/web-shared/src/assets/preload.js
+++ b/apps/kit/static/preload.js
diff --git a/apps/kit/svelte.config.js b/apps/kit/svelte.config.js
new file mode 100644
index 0000000..2c7fdde
--- /dev/null
+++ b/apps/kit/svelte.config.js
@@ -0,0 +1,16 @@
+import adapter from "svelte-adapter-bun";
+import preprocess from "svelte-preprocess";
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ preprocess: [
+ preprocess({
+ postcss: true,
+ }),
+ ],
+ kit: {
+ adapter: adapter(),
+ },
+};
+
+export default config;
diff --git a/apps/kit/tailwind.config.cjs b/apps/kit/tailwind.config.cjs
new file mode 100644
index 0000000..a81035a
--- /dev/null
+++ b/apps/kit/tailwind.config.cjs
@@ -0,0 +1,13 @@
+const config = {
+ content: ["./src/**/*.{html,js,svelte,ts}"],
+
+ theme: {
+ extend: {},
+ },
+
+ plugins: [
+ require("@tailwindcss/forms")
+ ],
+};
+
+module.exports = config;
diff --git a/apps/kit/tests/test.ts b/apps/kit/tests/test.ts
new file mode 100644
index 0000000..4e57937
--- /dev/null
+++ b/apps/kit/tests/test.ts
@@ -0,0 +1,6 @@
+import { expect, test } from '@playwright/test';
+
+test('index page has expected h1', async ({ page }) => {
+ await page.goto('/');
+ expect(await page.textContent('h1')).toBe('Welcome to SvelteKit');
+});
diff --git a/apps/kit/tsconfig.json b/apps/kit/tsconfig.json
new file mode 100644
index 0000000..ed68025
--- /dev/null
+++ b/apps/kit/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "lib": [
+ "es2021",
+ "dom",
+ "es6"
+ ],
+ "paths": {
+ "$lib/*": [
+ "./src/lib/*"
+ ],
+ },
+ "types": [
+ "bun-types"
+ ]
+ },
+ "include": [
+ "./**/*.d.ts",
+ "./**/*.ts",
+ "./**/*.js",
+ "./**/*.svelte"
+ ],
+ "exclude": [
+ "./node_modules"
+ ]
+} \ No newline at end of file
diff --git a/apps/kit/vite.config.js b/apps/kit/vite.config.js
new file mode 100644
index 0000000..f777f75
--- /dev/null
+++ b/apps/kit/vite.config.js
@@ -0,0 +1,14 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+
+/** @type {import('vite').UserConfig} */
+const config = {
+ plugins: [sveltekit()],
+ build: { target: "es2020" },
+ optimizeDeps: {
+ esbuildOptions: {
+ target: "es2020"
+ }
+ }
+};
+
+export default config;
diff --git a/apps/portal/.version b/apps/portal/.version
deleted file mode 100644
index 2a3638d..0000000
--- a/apps/portal/.version
+++ /dev/null
@@ -1 +0,0 @@
-v3-portal
diff --git a/apps/portal/.version-dev b/apps/portal/.version-dev
deleted file mode 100644
index d5c9e03..0000000
--- a/apps/portal/.version-dev
+++ /dev/null
@@ -1 +0,0 @@
-v24-portal-dev
diff --git a/apps/portal/CHANGELOG.md b/apps/portal/CHANGELOG.md
deleted file mode 100644
index 395fd25..0000000
--- a/apps/portal/CHANGELOG.md
+++ /dev/null
@@ -1,135 +0,0 @@
-# Changelog
-
-## [unreleased]
-
-### Bug Fixes
-
-- Correct path to BASE_DOMAIN
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v19-portal-dev
-
-## [unreleased]
-
-### Bug Fixes
-
-- Inherit radius on svg to align styling with other theme figure icons
-
-### Features
-
-- Work in progress more module data models
-- Add inital translation support
-- Add link to BASE_DOMAIN on every public page in portal
-- Centre guarded portal pages
-- Add link to BASE_DOMAIN on every public page in portal
-- Set a max width on the portal layout
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v10-projects-dev
-- Bump version
-- Update CHANGELOG.md for v8-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v7-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v9-projects-dev
-- Bump version
-- Update CHANGELOG.md for v8-projects-dev
-- Bump version
-- Update CHANGELOG.md for v18-portal-dev
-
-### Refactor
-
-- Use dev.greatoffice.life as BASE_DOMAIN while in development-phase
-- Remove all transitions on theme-switcher
-- Put pre.css inside of style tags so that we dont have to wait for the second request on pre.css to show the loader and theme
-- Temporarily disable user deletion from within projects
-
-## [unreleased]
-
-### Features
-
-- More work on portal
-- Implement new theme switcher component and backend
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v7-projects-dev
-- Bump version
-- Update CHANGELOG.md for v17-portal-dev
-
-## [unreleased]
-
-### Features
-
-- Seperate layout for docs
-- New frontpage
-- !WIP start implementation of svelte-query
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v6-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v5-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v4-frontpage-dev
-- Bump version
-- Bump version
-- Bump version
-- Update CHANGELOG.md for v41-server-dev
-- Bump version
-- Update CHANGELOG.md for v40-server-dev
-- Bump version
-- Update CHANGELOG.md for v39-server-dev
-- Bump version
-- Remove logging of quartz db host
-- Update CHANGELOG.md for v6-projects-dev
-- Bump version
-- Bump version
-- Bump version
-- Update CHANGELOG.md for v38-server-dev
-- Bump version
-- Update CHANGELOG.md for v22-server
-- Bump version
-- Update CHANGELOG.md for v16-portal-dev
-
-### Refactor
-
-- Update style on portal forms
-- Implement caching in VaultService and use VaultService instead of IOptions
-- Use Vault to get configuration
-- Use Vault to get configuration
-- Small changes on button style
-- Add a small box-shadow
-
-## [unreleased]
-
-### Bug Fixes
-
-- !WIP flickering dropdown on multi dropdowns with new focus strategy
-- Fix route matching when deciding which tab is open
-
-### Miscellaneous Tasks
-
-- Bump version
-- Bump version
-- Update CHANGELOG.md for v15-portal-dev
-
-### Refactor
-
-- Dont loose focus on search input when navigating results
-- Make optional base fields nullable
-- Remove text
-
-## [unreleased]
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v14-portal-dev
-
diff --git a/apps/portal/build_and_push.sh b/apps/portal/build_and_push.sh
deleted file mode 100755
index b3d827d..0000000
--- a/apps/portal/build_and_push.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env bash
-
-set -Eueo pipefail
-
-APP_NAME="portal";
-CURRENT_DEV_VERSION=$(cat .version-dev)
-CURRENT_DEV_VERSION_INT=${CURRENT_DEV_VERSION//[!0-9]/}
-CURRENT_VERSION=$(cat .version)
-CURRENT_VERSION_INT=${CURRENT_VERSION//[!0-9]/}
-if [ ${1-prod} == "dev" ]; then
- NEW_VERSION="v$((CURRENT_DEV_VERSION_INT+1))-$APP_NAME-dev"
- OLD_VERSION=$CURRENT_DEV_VERSION
-else
- NEW_VERSION="v$((CURRENT_VERSION_INT+1))-$APP_NAME"
- OLD_VERSION=$CURRENT_VERSION
-fi
-# Check for uncommited changes and optionally commit them
-if [ "$(git status --untracked-files=no --porcelain)" ]; then
- echo "Unclean git tree! press CTRL+C to exit or press ENTER to commit and push to the default branch"
- read -n 1
-
- read -p "Enter commit message: " COMMIT_MESSAGE
- git add ../../
- git commit --quiet -m "$COMMIT_MESSAGE"
-fi
-
-if [ ${1-prod} == "dev" ]; then
- echo $NEW_VERSION >| .version-dev
- git add .version-dev
-else
- echo $NEW_VERSION >| .version
- git add .version
-fi
-
-echo "Starting build of $APP_NAME@$NEW_VERSION at $(date -u)..."
-echo
-
-git commit --quiet -m "chore(release): Bump version";
-
-read -p "Do you want to tag this build? (y/n) " -n 1 -r
-echo
-if [[ $REPLY =~ ^[Yy]$ ]]
-then
- read -p "Enter tag message (can be empty): " TAG_MESSAGE
-# commit_msg="chore(release): Update CHANGELOG.md for $NEW_VERSION"
-# git cliff -r ../../ $OLD_VERSION..HEAD --prepend CHANGELOG.md
-# git add CHANGELOG.md
-# git commit --quiet -m "$commit_msg";
- git tag -am "$TAG_MESSAGE" $NEW_VERSION
-fi
-
-read -p "Do you want to push the latest commits and tags to origin? (y/n) " -n 1 -r
-echo
-if [[ $REPLY =~ ^[Yy]$ ]]
-then
- echo "Pushing latest changes to remotes..."
- echo
- git push --quiet --follow-tags
-fi
-
-pushd src
-pnpm run build
-
-cd build
-echo "$NEW_VERSION" >version.txt
-
-
-if [ ${1-prod} == "dev" ]; then
- scp -r * contabo-fast-1:services/public/portal.dev.greatoffice.life/www
-else
- echo "Pushing to production in 10 sec, press CTRL+C to cancel"
- sleep 10
- scp -r * contabo-fast-1:services/public/portal.greatoffice.life/www
-fi
-
-popd
diff --git a/apps/portal/cliff.toml b/apps/portal/cliff.toml
deleted file mode 100644
index 7299951..0000000
--- a/apps/portal/cliff.toml
+++ /dev/null
@@ -1,62 +0,0 @@
-# configuration file for git-cliff (0.1.0)
-
-[changelog]
-# changelog header
-header = """
-# Changelog\n
-"""
-# template for the changelog body
-# https://tera.netlify.app/docs/#introduction
-body = """
-{% if version %}\
- ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
-{% else %}\
- ## [unreleased]
-{% endif %}\
-{% for group, commits in commits | group_by(attribute="group") %}
- ### {{ group | upper_first }}
- {% for commit in commits %}
- - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
- {% endfor %}
-{% endfor %}\n
-"""
-# remove the leading and trailing whitespace from the template
-trim = true
-# changelog footer
-footer = """
-<!-- generated by git-cliff -->
-"""
-
-[git]
-# parse the commits based on https://www.conventionalcommits.org
-conventional_commits = true
-# filter out the commits that are not conventional
-filter_unconventional = true
-# regex for preprocessing the commit messages
-commit_preprocessors = [
- { pattern = "([ \\n])(([a-f0-9]{7})[a-f0-9]*)", replace = "${1}commit # [${3}](https://git.ivar.systems/greatoffice/commit/${2})" },
- { pattern = "https://git.ivar.systems/greatoffice/commit/([a-f0-9]{7})[a-f0-9]*", replace = "commit # [${1}](${0})" },
-]
-# regex for parsing and grouping commits
-commit_parsers = [
- { message = "^feat", group = "Features" },
- { message = "^fix", group = "Bug Fixes" },
- { message = "^doc", group = "Documentation" },
- { message = "^perf", group = "Performance" },
- { message = "^refactor", group = "Refactor" },
- { message = "^style", group = "Styling" },
- { message = "^test", group = "Testing" },
- { message = "^chore", group = "Miscellaneous Tasks" },
-]
-# filter out the commits that are not matched by commit parsers
-filter_commits = true
-# glob pattern for matching git tags
-tag_pattern = "v.*"
-# regex for skipping tags
-skip_tags = "v0.1.0-beta.1"
-# regex for ignoring tags
-ignore_tags = ""
-# sort the tags chronologically
-date_order = true
-# sort the commits inside sections by oldest/newest order
-sort_commits = "newest"
diff --git a/apps/portal/src/_assets/preload.css b/apps/portal/src/_assets/preload.css
deleted file mode 120000
index e248c5b..0000000
--- a/apps/portal/src/_assets/preload.css
+++ /dev/null
@@ -1 +0,0 @@
-/Users/ivarlovlie/i2r/greatoffice/apps/web-shared/src/assets/preload.css \ No newline at end of file
diff --git a/apps/portal/src/_assets/preload.js b/apps/portal/src/_assets/preload.js
deleted file mode 120000
index 3fa1cc7..0000000
--- a/apps/portal/src/_assets/preload.js
+++ /dev/null
@@ -1 +0,0 @@
-/Users/ivarlovlie/i2r/greatoffice/apps/web-shared/src/assets/preload.js \ No newline at end of file
diff --git a/apps/portal/src/_assets/pwa/android-chrome-192x192.png b/apps/portal/src/_assets/pwa/android-chrome-192x192.png
deleted file mode 100644
index 5c098bc..0000000
--- a/apps/portal/src/_assets/pwa/android-chrome-192x192.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/android-chrome-512x512.png b/apps/portal/src/_assets/pwa/android-chrome-512x512.png
deleted file mode 100644
index 973a1c3..0000000
--- a/apps/portal/src/_assets/pwa/android-chrome-512x512.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/apple-touch-icon.png b/apps/portal/src/_assets/pwa/apple-touch-icon.png
deleted file mode 100644
index b4d9773..0000000
--- a/apps/portal/src/_assets/pwa/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/browserconfig.xml b/apps/portal/src/_assets/pwa/browserconfig.xml
deleted file mode 100644
index b3930d0..0000000
--- a/apps/portal/src/_assets/pwa/browserconfig.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
- <msapplication>
- <tile>
- <square150x150logo src="/mstile-150x150.png"/>
- <TileColor>#da532c</TileColor>
- </tile>
- </msapplication>
-</browserconfig>
diff --git a/apps/portal/src/_assets/pwa/favicon-16x16.png b/apps/portal/src/_assets/pwa/favicon-16x16.png
deleted file mode 100644
index 5dde9f9..0000000
--- a/apps/portal/src/_assets/pwa/favicon-16x16.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/favicon-32x32.png b/apps/portal/src/_assets/pwa/favicon-32x32.png
deleted file mode 100644
index 9cef4c4..0000000
--- a/apps/portal/src/_assets/pwa/favicon-32x32.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/favicon.ico b/apps/portal/src/_assets/pwa/favicon.ico
deleted file mode 100644
index 89c7542..0000000
--- a/apps/portal/src/_assets/pwa/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/favicon.svg b/apps/portal/src/_assets/pwa/favicon.svg
deleted file mode 100644
index 964dbb8..0000000
--- a/apps/portal/src/_assets/pwa/favicon.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-stopwatch" viewBox="0 0 16 16">
- <path d="M8.5 5.6a.5.5 0 1 0-1 0v2.9h-3a.5.5 0 0 0 0 1H8a.5.5 0 0 0 .5-.5V5.6z"/>
- <path d="M6.5 1A.5.5 0 0 1 7 .5h2a.5.5 0 0 1 0 1v.57c1.36.196 2.594.78 3.584 1.64a.715.715 0 0 1 .012-.013l.354-.354-.354-.353a.5.5 0 0 1 .707-.708l1.414 1.415a.5.5 0 1 1-.707.707l-.353-.354-.354.354a.512.512 0 0 1-.013.012A7 7 0 1 1 7 2.071V1.5a.5.5 0 0 1-.5-.5zM8 3a6 6 0 1 0 .001 12A6 6 0 0 0 8 3z"/>
-</svg> \ No newline at end of file
diff --git a/apps/portal/src/_assets/pwa/manifest.json b/apps/portal/src/_assets/pwa/manifest.json
deleted file mode 100644
index 4c550fe..0000000
--- a/apps/portal/src/_assets/pwa/manifest.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "manifest_version": 2,
- "version": "0.1",
- "name": "Time Tracker",
- "short_name": "Time Tracker",
- "display": "standalone",
- "background_color": "#fff",
- "theme_color": "#4D3DF7",
- "start_url": ".",
- "orientation": "portrait",
- "icons": [
- {
- "src": "/favicon.svg",
- "purpose": "maskable any",
- "sizes": "any"
- },
- {
- "src": "/pwa/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/pwa/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ]
-}
diff --git a/apps/portal/src/_assets/pwa/mstile-144x144.png b/apps/portal/src/_assets/pwa/mstile-144x144.png
deleted file mode 100644
index 84d94cb..0000000
--- a/apps/portal/src/_assets/pwa/mstile-144x144.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/mstile-150x150.png b/apps/portal/src/_assets/pwa/mstile-150x150.png
deleted file mode 100644
index b1398ae..0000000
--- a/apps/portal/src/_assets/pwa/mstile-150x150.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/mstile-310x150.png b/apps/portal/src/_assets/pwa/mstile-310x150.png
deleted file mode 100644
index 76b16a0..0000000
--- a/apps/portal/src/_assets/pwa/mstile-310x150.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/mstile-310x310.png b/apps/portal/src/_assets/pwa/mstile-310x310.png
deleted file mode 100644
index d8e4097..0000000
--- a/apps/portal/src/_assets/pwa/mstile-310x310.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/mstile-70x70.png b/apps/portal/src/_assets/pwa/mstile-70x70.png
deleted file mode 100644
index 0df1e8c..0000000
--- a/apps/portal/src/_assets/pwa/mstile-70x70.png
+++ /dev/null
Binary files differ
diff --git a/apps/portal/src/_assets/pwa/safari-pinned-tab.svg b/apps/portal/src/_assets/pwa/safari-pinned-tab.svg
deleted file mode 100644
index ba2220c..0000000
--- a/apps/portal/src/_assets/pwa/safari-pinned-tab.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.14, written by Peter Selinger 2001-2017
-</metadata>
-<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M3195 6780 c-116 -3 -211 -10 -226 -17 -39 -17 -105 -98 -116 -142
--19 -72 -2 -146 45 -202 26 -31 96 -69 131 -72 25 -2 31 -6 32 -27 1 -27 1
--198 0 -216 -1 -6 -47 -19 -103 -28 -160 -28 -451 -107 -533 -146 -11 -5 -51
--21 -90 -36 -60 -23 -246 -112 -325 -155 -431 -236 -834 -619 -1101 -1045
--207 -328 -364 -733 -423 -1089 -51 -307 -61 -583 -31 -875 26 -261 119 -615
-225 -861 185 -430 432 -773 800 -1108 75 -69 387 -301 405 -301 1 0 33 -18 70
--40 209 -128 602 -288 796 -325 12 -2 29 -7 39 -10 72 -23 273 -56 435 -73
-144 -14 601 -5 658 13 7 2 37 7 67 10 273 33 616 141 904 283 725 357 1275
-982 1542 1754 55 159 113 395 129 523 4 28 8 57 10 65 2 8 7 47 10 85 3 39 8
-93 10 120 6 66 6 327 0 390 -2 28 -7 82 -10 120 -3 39 -11 99 -16 135 -6 36
--13 79 -16 95 -15 98 -61 279 -103 405 -121 372 -298 694 -542 993 -27 32 -48
-61 -48 65 0 4 35 41 78 84 l77 76 90 -90 c53 -54 108 -99 134 -110 62 -28 130
--25 191 8 95 52 135 151 103 257 -13 46 -44 79 -362 397 -322 323 -351 349
--398 363 -148 44 -287 -61 -285 -215 1 -62 35 -118 126 -208 47 -47 86 -87 86
--90 0 -6 -91 -101 -132 -138 l-25 -23 -46 38 c-264 223 -584 405 -924 528 -92
-34 -320 100 -376 109 -15 3 -35 7 -45 10 -9 3 -34 7 -54 10 -86 13 -113 18
--117 22 -2 2 -4 56 -4 121 l0 118 29 9 c66 19 114 47 139 80 72 95 65 215 -18
-296 -58 56 -83 60 -402 63 -159 1 -380 0 -490 -3z m560 -1104 c224 -24 547
--99 670 -156 11 -5 56 -24 100 -41 90 -37 282 -134 306 -155 8 -8 19 -14 23
--14 13 0 192 -124 286 -199 97 -77 297 -270 364 -351 237 -288 405 -598 509
--941 30 -98 44 -157 72 -299 3 -14 8 -47 11 -75 3 -27 7 -56 10 -63 22 -69 21
--519 -1 -642 -1 -8 -6 -40 -10 -70 -4 -30 -9 -64 -11 -75 -2 -11 -7 -33 -10
--50 -3 -16 -14 -66 -26 -110 -11 -44 -21 -84 -22 -90 -18 -79 -93 -275 -154
--408 -39 -83 -158 -296 -171 -307 -3 -3 -26 -34 -50 -70 -116 -169 -312 -384
--466 -508 -38 -32 -78 -65 -89 -74 -25 -22 -229 -160 -281 -189 -177 -99 -405
--197 -570 -244 -126 -36 -305 -74 -375 -81 -19 -2 -48 -5 -65 -8 -121 -22
--509 -22 -618 0 -12 2 -42 6 -67 10 -369 45 -795 215 -1125 448 -192 135 -399
-326 -517 476 -23 30 -48 61 -55 67 -57 60 -227 336 -291 473 -64 135 -150 365
--167 444 -2 12 -6 30 -9 41 -28 120 -36 156 -41 193 -3 24 -7 53 -10 65 -32
-148 -38 552 -10 707 2 14 7 45 10 70 33 274 160 643 313 910 60 106 201 312
-232 340 3 3 23 28 45 55 22 28 85 96 140 151 347 352 768 590 1252 709 56 14
-118 27 137 30 20 2 61 9 93 14 32 6 92 13 133 17 41 3 76 7 77 8 6 5 368 -2
-428 -8z"/>
-<path d="M3423 4754 c-45 -17 -95 -61 -121 -109 -15 -27 -17 -93 -19 -650 -1
--341 -2 -641 -3 -666 l0 -47 -679 0 -679 -1 -49 -24 c-59 -30 -76 -49 -104
--112 -54 -122 23 -270 154 -293 23 -5 400 -8 837 -7 l795 1 42 22 c52 27 98
-82 112 136 8 29 10 273 9 826 -3 854 1 796 -59 867 -53 63 -153 87 -236 57z"/>
-</g>
-</svg>
diff --git a/apps/portal/src/app/components/user-menu.svelte b/apps/portal/src/app/components/user-menu.svelte
deleted file mode 100644
index b0cfc8a..0000000
--- a/apps/portal/src/app/components/user-menu.svelte
+++ /dev/null
@@ -1,70 +0,0 @@
-<script>
- import {end_session} from "$shared/lib/session";
- import {onMount} from "svelte";
- import {Menu, MenuItem, MenuItemSeparator} from "$shared/components/menu";
- import {replace} from "svelte-spa-router";
-
- let userMenuTrigger;
- let showUserMenu = false;
-
- export let avatar = "";
- export let name;
- export let secondary = "";
- let userMenuId;
-
- async function on_logout() {
- await end_session(() => {
- replace("/login");
- });
- }
-
- onMount(() => {
- userMenuTrigger = document.getElementById("open-user-menu");
- });
-</script>
-
-<button class="reset user-menu-control"
- id="open-user-menu"
- aria-controls="{userMenuId}"
- on:click={() => showUserMenu = true}>
- {#if avatar}
- <figure class="user-menu-control__img-wrapper radius-50%">
- <img class="user-menu-control__img"
- src="{avatar}"
- alt="Avatar">
- </figure>
- {/if}
-
- <div class="margin-x-xs user-menu__meta">
- <p class="user-menu__meta-title text-sm line-height-1 padding-y-xxxxs font-semibold color-contrast-higher text-truncate">{name}</p>
- {#if secondary}
- <p class="text-xs color-contrast-medium line-height-1 padding-bottom-xxxxs">{secondary}</p>
- {/if}
- </div>
-
- <svg class="icon icon--xxs"
- aria-hidden="true"
- viewBox="0 0 12 12">
- <polyline points="1 4 6 9 11 4"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"/>
- </svg>
-</button>
-
-<Menu trigger={userMenuTrigger}
- bind:id={userMenuId}
- bind:show="{showUserMenu}">
- <div slot="options">
- <MenuItem on:click={() => replace("/profile")}>
- <span>Profile</span>
- </MenuItem>
- <MenuItemSeparator/>
- <MenuItem danger="true"
- on:click={() => on_logout()}>
- Logout
- </MenuItem>
- </div>
-</Menu>
diff --git a/apps/portal/src/app/index.d.ts b/apps/portal/src/app/index.d.ts
deleted file mode 100644
index c044583..0000000
--- a/apps/portal/src/app/index.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Use this file to declare any custom file extensions for importing */
-/* Use this folder to also add/extend a package d.ts file, if needed. */
-
-/* CSS MODULES */
-declare module "*.module.css" {
- const classes: { [key: string]: string };
- export default classes;
-}
-declare module "*.module.scss" {
- const classes: { [key: string]: string };
- export default classes;
-}
-
-/* CSS */
-declare module "*.css";
-declare module "*.scss";
-
-/* IMAGES */
-declare module "*.svg" {
- const ref: string;
- export default ref;
-}
-declare module "*.bmp" {
- const ref: string;
- export default ref;
-}
-declare module "*.gif" {
- const ref: string;
- export default ref;
-}
-declare module "*.jpg" {
- const ref: string;
- export default ref;
-}
-declare module "*.jpeg" {
- const ref: string;
- export default ref;
-}
-declare module "*.png" {
- const ref: string;
- export default ref;
-}
-
-/* CUSTOM: ADD YOUR OWN HERE */
-declare module "*.svelte" {
- const value: any;
- export default value;
-}
diff --git a/apps/portal/src/app/index.scss b/apps/portal/src/app/index.scss
deleted file mode 100644
index 718adf2..0000000
--- a/apps/portal/src/app/index.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-@use '../../web-shared/src/styles/base'as * with ($breakpoints: ('xs': "768px",
- 'sm': "768px",
- 'md': "1200px",
- 'lg': "1200px",
- 'xl': "1600px",
- ),
- $grid-columns: 12);
-
-@use '../../web-shared/src/styles/custom-style/colors';
-@use '../../web-shared/src/styles/custom-style/spacing';
-@use '../../web-shared/src/styles/custom-style/shared-styles';
-@use '../../web-shared/src/styles/custom-style/typography';
-@use '../../web-shared/src/styles/custom-style/icons';
-@use '../../web-shared/src/styles/custom-style/buttons';
-@use '../../web-shared/src/styles/custom-style/forms';
-@use '../../web-shared/src/styles/custom-style/util';
-
-@use '../../web-shared/src/styles/components/radios-checkboxes';
-@use '../../web-shared/src/styles/components/btn-states';
-@use '../../web-shared/src/styles/components/alert';
-@use '../../web-shared/src/styles/components/details';
-@use '../../web-shared/src/styles/components/light-dark-switch';
-@use '../../web-shared/src/styles/components/link-card';
-@use '../../web-shared/src/styles/components/auto-sized-grid';
-@use '../../web-shared/src/styles/components/menu';
-@use '../../web-shared/src/styles/components/user-menu';
-@use '../../web-shared/src/styles/components/breadcrumbs';
diff --git a/apps/portal/src/app/index.svelte b/apps/portal/src/app/index.svelte
deleted file mode 100644
index af2b6d0..0000000
--- a/apps/portal/src/app/index.svelte
+++ /dev/null
@@ -1,87 +0,0 @@
-<svelte:options immutable={true}/>
-<svelte:window bind:online={online}/>
-
-<script>
- import Router, {replace} from "svelte-spa-router";
- import {wrap} from "svelte-spa-router/wrap";
- import {is_active} from "$shared/lib/session";
- import SignUp from "$app/pages/sign-up.svelte";
- import Login from "$app/pages/login.svelte";
- import Forgot from "$app/pages/forgot.svelte";
- import Reset from "$app/pages/reset-password.svelte";
- import Home from "$app/pages/home.svelte";
- import ProfileHome from "$app/pages/profile/index.svelte";
- import AdminHome from "$app/pages/admin/index.svelte";
- import PreHeader from "$shared/components/pre-header.svelte";
-
- let online = true;
-
- const publicRoutes = ["/login", "/signup", "/reset-password", "/forgot"];
- const guardedRoutes = ["/", "/home", "/profile", "/admin"];
-
- async function user_is_logged_in(event) {
- const isActive = await is_active();
- if (!isActive && !publicRoutes.includes(event.route)) {
- return false;
- }
- if (isActive && !guardedRoutes.includes(event.route)) {
- await replace("/");
- }
- return true;
- }
-
- function route_guarded(event) {
- if (!publicRoutes.includes(event.detail.route)) {
- replace("/login");
- }
- }
-
- const routes = {
- "/login": wrap({
- component: Login,
- conditions: [user_is_logged_in],
- }),
- "/home": wrap({
- component: Home,
- conditions: [user_is_logged_in],
- }),
- "/admin": wrap({
- component: AdminHome,
- conditions: [user_is_logged_in],
- }),
- "/profile": wrap({
- component: ProfileHome,
- conditions: [user_is_logged_in],
- }),
- "/": wrap({
- component: Home,
- conditions: [user_is_logged_in],
- }),
- "/signup": wrap({
- component: SignUp,
- conditions: [user_is_logged_in],
- }),
- "/reset-password": wrap({
- component: Reset,
- conditions: [user_is_logged_in],
- }),
- "/forgot": wrap({
- component: Forgot,
- conditions: [user_is_logged_in],
- })
- };
-</script>
-
-<PreHeader show="{!online}">You seem to be offline, please check your internet connection.</PreHeader>
-
-<Router
- {routes}
- restoreScrollState={true}
- on:conditionsFailed={route_guarded}
- on:routeLoading={() => {
- document.getElementById("loader").style.display = "inline-block";
- }}
- on:routeLoaded={() => {
- document.getElementById("loader").style.display = "none";
- }}
-/>
diff --git a/apps/portal/src/app/index.ts b/apps/portal/src/app/index.ts
deleted file mode 100644
index 0bfb30d..0000000
--- a/apps/portal/src/app/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import App from "./index.svelte";
-import "./index.scss";
-import {is_debug, is_development} from "$shared/lib/configuration";
-import {noop} from "$shared/lib/helpers";
-
-if (!is_development() && !is_debug()) {
- console.log("%c Production; Suppressing logs", "background-color:yellow;color:black;font-size:18px;");
- console.log = noop;
-}
-
-// @ts-ignore
-export default new App({
- target: document.getElementById("root"),
-});
diff --git a/apps/portal/src/app/pages/_layout.svelte b/apps/portal/src/app/pages/_layout.svelte
deleted file mode 100644
index 8c75cb9..0000000
--- a/apps/portal/src/app/pages/_layout.svelte
+++ /dev/null
@@ -1,62 +0,0 @@
-<script>
- import BlowoutToolbelt from "$shared/components/blowout-toolbelt.svelte";
-</script>
-
-<style>
- #decoration {
- position: absolute;
- top: 0;
- left: 0;
- pointer-events: none;
- width: 100%;
- height: 100%;
- overflow: hidden;
- z-index: 1;
- }
-
- #decoration svg {
- position: absolute;
- top: 0;
- left: 50%;
- -webkit-transform: translateX(-50%);
- transform: translateX(-50%);
- width: 134%;
- min-width: 1280px;
- max-width: 1920px;
- height: auto;
- }
-</style>
-<BlowoutToolbelt/>
-
-<main class="container-fluid padding-x-xs padding-x-xxl@xs padding-y-md padding-y-lg@md max-width-sm">
- <div class="z-index-2 position-relative">
- <slot/>
- </div>
-
- <figure id="decoration"
- class="z-index-1"
- aria-hidden="true">
- <svg class="color-contrast-higher opacity-10%"
- viewBox="0 0 1920 450"
- fill="none">
- <g stroke="currentColor"
- stroke-width="2"
- stroke-linejoin="round"
- stroke-linecap="round">
- <path d="M1449 94.9993V3L1354 48.9995L1259 3V94.9993L1354 140.999L1449 94.9993Z"/>
- <path d="M1639 94.9993V3L1544 48.9995L1449 3V94.9993L1544 140.999L1639 94.9993Z"/>
- <path d="M1354 49.0002V141"/>
- <path d="M1544 49.0002V141"/>
- <path d="M1449 94.9995L1544 140.999L1449 186.999L1354 140.999L1449 94.9995Z"/>
- <path d="M1544 141V232.999L1449 278.999L1354 232.999V141"/>
- <path d="M1449 187V279"/>
- <path d="M1544 264L1639 310L1544 355.999L1449 310L1544 264Z"/>
- <path d="M1639 310V402L1544 447.999L1449 402V310"/>
- <path d="M1544 356.001V448"/>
- <path d="M1639 94.9995L1734 140.999L1639 186.999L1544 140.999L1639 94.9995Z"/>
- <path d="M1734 141V232.999L1639 278.999L1544 232.999V141"/>
- <path d="M1639 187V279"/>
- </g>
- </svg>
- </figure>
-</main>
diff --git a/apps/portal/src/app/pages/_layout@loggedin.svelte b/apps/portal/src/app/pages/_layout@loggedin.svelte
deleted file mode 100644
index 44e2e4a..0000000
--- a/apps/portal/src/app/pages/_layout@loggedin.svelte
+++ /dev/null
@@ -1,75 +0,0 @@
-<script>
- import BlowoutToolbelt from "$shared/components/blowout-toolbelt.svelte";
- import {end_session, get_session_data} from "$shared/lib/session";
- import {replace} from "svelte-spa-router";
-
- const session = get_session_data();
-</script>
-
-<style>
- #decoration {
- position: absolute;
- top: 0;
- left: 0;
- pointer-events: none;
- width: 100%;
- height: 100%;
- overflow: hidden;
- z-index: 1;
- }
-
- #decoration svg {
- position: absolute;
- top: 0;
- left: 50%;
- -webkit-transform: translateX(-50%);
- transform: translateX(-50%);
- width: 134%;
- min-width: 1280px;
- max-width: 1920px;
- height: auto;
- }
-</style>
-<BlowoutToolbelt/>
-<main class="container max-width-xl padding-x-xs padding-x-xxl@xs padding-y-md padding-y-lg@md">
- <div class="z-index-2 position-relative">
- <slot/>
- </div>
-
- <div class="flex flex-row gap-xs position-fixed left-0 top-0 margin-md z-index-2">
- <span on:click={async () => {
- if (confirm("Are you sure?")) await end_session(() => {
- replace("/login");
- })
- }} class="btn btn--sm">
- Logout
- </span>
- </div>
-
- <figure id="decoration"
- class="z-index-1"
- aria-hidden="true">
- <svg class="color-contrast-higher opacity-10%"
- viewBox="0 0 1920 450"
- fill="none">
- <g stroke="currentColor"
- stroke-width="2"
- stroke-linejoin="round"
- stroke-linecap="round">
- <path d="M1449 94.9993V3L1354 48.9995L1259 3V94.9993L1354 140.999L1449 94.9993Z"/>
- <path d="M1639 94.9993V3L1544 48.9995L1449 3V94.9993L1544 140.999L1639 94.9993Z"/>
- <path d="M1354 49.0002V141"/>
- <path d="M1544 49.0002V141"/>
- <path d="M1449 94.9995L1544 140.999L1449 186.999L1354 140.999L1449 94.9995Z"/>
- <path d="M1544 141V232.999L1449 278.999L1354 232.999V141"/>
- <path d="M1449 187V279"/>
- <path d="M1544 264L1639 310L1544 355.999L1449 310L1544 264Z"/>
- <path d="M1639 310V402L1544 447.999L1449 402V310"/>
- <path d="M1544 356.001V448"/>
- <path d="M1639 94.9995L1734 140.999L1639 186.999L1544 140.999L1639 94.9995Z"/>
- <path d="M1734 141V232.999L1639 278.999L1544 232.999V141"/>
- <path d="M1639 187V279"/>
- </g>
- </svg>
- </figure>
-</main>
diff --git a/apps/portal/src/app/pages/admin/index.svelte b/apps/portal/src/app/pages/admin/index.svelte
deleted file mode 100644
index f9b91d2..0000000
--- a/apps/portal/src/app/pages/admin/index.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-<script>
- import Layout from "../_layout@loggedin.svelte";
- import {Bread, Crumb} from "$shared/components/breadcrumb";
- import {push} from "svelte-spa-router";
-
-</script>
-
-<Layout>
- <Bread>
- <Crumb name="Home"
- withArrow="true"
- isLink="true"
- on:click={() => push("/")}/>
- <Crumb name="Organisation"/>
- </Bread>
-
- <main class="max-width-sm"></main>
-</Layout>
diff --git a/apps/portal/src/app/pages/forgot.svelte b/apps/portal/src/app/pages/forgot.svelte
deleted file mode 100644
index 156deab..0000000
--- a/apps/portal/src/app/pages/forgot.svelte
+++ /dev/null
@@ -1,102 +0,0 @@
-<script>
- import {onMount} from "svelte";
- import {link} from "svelte-spa-router";
- import {create_forgot_password_request} from "$shared/lib/api/user";
- import {is_email} from "$shared/lib/helpers";
- import Alert from "$shared/components/alert.svelte";
- import Button from "$shared/components/button.svelte";
- import Tile from "$shared/components/tile.svelte";
- import Layout from "./_layout.svelte";
-
- let isLoading = false;
- let username;
-
- const alert = {
- title: "",
- type: "",
- message: "",
- isVisible: false,
- show(type, obj) {
- alert.title = obj.title;
- alert.message = obj.text;
- alert.type = type;
- alert.isVisible = true;
- isLoading = false;
- },
- hide() {
- alert.isVisible = false;
- alert.title = "";
- alert.message = "";
- alert.type = "";
- isLoading = false;
- },
- };
-
- function is_valid() {
- return is_email(username);
- }
-
- async function submit_form() {
- if (isLoading) {
- return;
- }
- if (is_valid()) {
- isLoading = true;
- const response = await create_forgot_password_request(username);
- if (response.ok) {
- alert.show("success", {
- title: "Request is sent",
- text: "If we find an account associated with this email address, you will receive an email with a reset link very soon.",
- });
- } else {
- console.error(response.data);
- alert.show("error", {
- title: response.data?.title ?? "An error occured",
- text: response.data?.text ?? "Please try again soon",
- });
- }
- }
- }
-
- onMount(() => {
- document.addEventListener("DOMContentLoaded", () => {
- document.getElementById("email-address").focus();
- });
- });
-</script>
-
-<Layout>
- <Tile>
- <form on:submit|preventDefault={submit_form}
- class="max-width-xxs">
- <fieldset>
- <legend class="form-legend">
- <span class="margin-bottom-xs text-xl">Send reset link</span> <br/>
- <span class="text-sm">... or <a href="/login"
- use:link>log in</a></span>
- </legend>
- <div class="margin-bottom-xs">
- <p>Provide your email address, and we'll send you a link to set your new password.</p>
- </div>
- <div class="margin-bottom-xxs max-width-xxs">
- <Alert visible={alert.isVisible}
- title={alert.title}
- message={alert.message}
- type={alert.type}/>
- </div>
- <div class="margin-bottom-xs">
- <input type="email"
- id="email-address"
- placeholder="Email address"
- class="form-control width-100%"
- bind:value={username}/>
- </div>
- <div class="flex justify-end">
- <Button text="Send reset link"
- type="primary"
- loading={isLoading}/>
- </div>
- </fieldset>
- </form>
- </Tile>
-</Layout>
diff --git a/apps/portal/src/app/pages/home.svelte b/apps/portal/src/app/pages/home.svelte
deleted file mode 100644
index 0e325ee..0000000
--- a/apps/portal/src/app/pages/home.svelte
+++ /dev/null
@@ -1,103 +0,0 @@
-<script>
- import {projects_base} from "$shared/lib/configuration";
- import {get_session_data} from "$shared/lib/session";
- import {push} from "svelte-spa-router";
- import Layout from "./_layout@loggedin.svelte";
- import LinkCard from "$shared/components/link-card.svelte";
- import Alert from "$shared/components/alert.svelte";
- import {UserIcon, UsersIcon, WatchIcon, SendIcon, ListIcon} from "svelte-feather-icons";
-
- let showUsers = true;
- const session = get_session_data();
-</script>
-
-<Layout>
- <div class="grid gap-md">
- <div class="row">
- <Alert closeable="true"
- closeableCooldown="~"
- id="welcome-note"
- title="Hello {session.profile?.username}"
- message="This is your portal to Greatoffice, here you will find all your great apps and management options."/>
- </div>
- <div class="row">
- <h2 class="margin-bottom-xs">Apps</h2>
- <div class="grid-auto-md gap-sm">
- <LinkCard name="Projects"
- description="The home for your projects"
- text="Open in a new tab"
- title="Open Projects"
- href="{projects_base()}">
- <figure slot="icon">
- <div class="bg-primary bg-opacity-10% padding-xs border-left border-primary border-2">
- <WatchIcon size="42"
- class="color-primary"
- strokeWidth="1.2"/>
- </div>
- </figure>
- </LinkCard>
- <LinkCard name="Tickets"
- description="The home for your tickets"
- class="c-disabled user-select-none"
- text="Coming soon"
- title="Open Tickets"
- href="{projects_base()}">
- <figure slot="icon">
- <div class="bg-primary bg-opacity-10% padding-xs border-left border-primary border-2">
- <SendIcon size="42"
- class="color-primary"
- strokeWidth="1.2"/>
- </div>
- </figure>
- </LinkCard>
- <LinkCard name="Todo"
- description="The home for your todos"
- class="c-disabled user-select-none"
- text="Coming soon"
- title="Open Todo"
- href="{projects_base()}">
- <figure slot="icon">
- <div class="bg-primary bg-opacity-10% padding-xs border-left border-primary border-2">
- <ListIcon size="42"
- class="color-primary"
- strokeWidth="1.2"/>
- </div>
- </figure>
- </LinkCard>
- </div>
- </div>
- <div class="row">
- <h2 class="margin-bottom-xs">Manage</h2>
- <div class="grid-auto-md gap-sm">
- <LinkCard name="Profile"
- description="Manage your profile"
- text="Open"
- title="Go to your profile management page"
- on:click={() => push("/profile")}>
- <figure slot="icon">
- <div class="bg-primary bg-opacity-10% padding-xs border-left border-primary border-2">
- <UserIcon size="42"
- class="color-primary"
- strokeWidth="1.2"/>
- </div>
- </figure>
- </LinkCard>
- {#if showUsers}
- <LinkCard name="Organisation"
- description="Manage your organisation"
- title="Go to your organisations management page"
- text="Open"
- on:click={() => push("/admin")}>
- <figure slot="icon">
- <div class="bg-primary bg-opacity-10% padding-xs border-left border-primary border-2">
- <UsersIcon size="42"
- class="color-primary"
- strokeWidth="1.2"/>
- </div>
- </figure>
- </LinkCard>
- {/if}
- </div>
- </div>
- </div>
-</Layout>
diff --git a/apps/portal/src/app/pages/login.svelte b/apps/portal/src/app/pages/login.svelte
deleted file mode 100644
index 1ca6b61..0000000
--- a/apps/portal/src/app/pages/login.svelte
+++ /dev/null
@@ -1,142 +0,0 @@
-<script>
- import {onMount} from "svelte";
- import {link, replace, querystring} from "svelte-spa-router";
- import {api_base, IconNames, frontpage_base} from "$shared/lib/configuration";
- import Button from "$shared/components/button.svelte";
- import Alert from "$shared/components/alert.svelte";
- import Tile from "$shared/components/tile.svelte";
- import {login} from "$shared/lib/api/user";
- import {is_email} from "$shared/lib/helpers";
- import Layout from "./_layout.svelte";
-
- const loginForm = {
- loading: false,
- values: {
- username: "",
- password: "",
- persist: true
- },
- alert: {
- title: "",
- type: "",
- message: "",
- isVisible: false,
- show(type, obj) {
- loginForm.alert.title = obj.title;
- loginForm.alert.message = obj.text;
- loginForm.alert.type = type;
- loginForm.alert.isVisible = true;
- loginForm.loading = false;
- },
- hide() {
- loginForm.alert.isVisible = false;
- loginForm.alert.title = "";
- loginForm.alert.message = "";
- loginForm.alert.type = "";
- },
- },
- is_valid() {
- return is_email(loginForm.values.username) && loginForm.values.password.length > 0;
- },
- async submit_form() {
- if (loginForm.loading) {
- return;
- }
- if (loginForm.is_valid()) {
- loginForm.alert.hide();
- loginForm.loading = true;
- try {
- const response = await login(loginForm.values);
- if (response.ok) {
- await replace("#/home");
- } else {
- if (response.data.title || response.data.text) {
- loginForm.alert.show("error", {
- title: response.data.title ?? "",
- text: response.data.text ?? "",
- });
- } else {
- loginForm.alert.show("error", {
- title: "An unknown error occured",
- text: "Try again soon",
- });
- }
- }
- } catch (e) {
- loginForm.alert.show("error", {
- title: "An error occured",
- text: "Could not connect to server, please check your internet connection",
- });
- }
- } else {
- loginForm.alert.show("error", {
- title: "Invalid form",
- });
- }
- },
- };
-
- onMount(() => {
- if ($querystring === "deleted") {
- loginForm.alert.show("info", {
- title: "Account deleted",
- text: "Your account and all its data was successfully deleted.",
- });
- }
- if ($querystring === "expired") {
- loginForm.alert.show("info", {
- title: "Session expired",
- text: "Your session has expired, feel free to log in again.",
- });
- }
- });
-</script>
-
-<Layout>
- <a href="{frontpage_base()}" class="block margin-bottom-xs">Go to {frontpage_base()}</a>
- <Tile>
- <form on:submit|preventDefault={loginForm.submit_form}
- class="max-width-xxs">
- <fieldset>
- <legend class="form-legend">
- <span class="margin-bottom-xs text-xl">Log into your account</span>
- <br/>
- <span class="text-sm">... or <a href="/signup"
- use:link>create a new one</a></span>
- </legend>
- <div class="margin-bottom-xxs max-width-xxs">
- <Alert visible={loginForm.alert.isVisible}
- title={loginForm.alert.title}
- message={loginForm.alert.message}
- type={loginForm.alert.type}/>
- </div>
- <div class="margin-bottom-xxs">
- <input type="email"
- placeholder="Email address"
- class="form-control width-100%"
- id="username"
- bind:value={loginForm.values.username}/>
- </div>
- <div class="margin-bottom-xxs">
- <input type="password"
- placeholder="Password"
- id="password"
- class="form-control width-100%"
- bind:value={loginForm.values.password}/>
- <div class="flex justify-end">
- <a tabindex="-1"
- class="text-sm"
- href="/forgot"
- use:link>Reset password</a>
- </div>
- </div>
- <div class="flex justify-between">
- <Button text="Login"
- type="submit"
- variant="primary"
- loading={loginForm.loading}/>
- </div>
- </fieldset>
- </form>
- </Tile>
-</Layout>
diff --git a/apps/portal/src/app/pages/profile/index.svelte b/apps/portal/src/app/pages/profile/index.svelte
deleted file mode 100644
index a7291d6..0000000
--- a/apps/portal/src/app/pages/profile/index.svelte
+++ /dev/null
@@ -1,167 +0,0 @@
-<script>
- import {push} from "svelte-spa-router";
- import {Bread, Crumb} from "$shared/components/breadcrumb/index";
- import Layout from "$app/pages/_layout@loggedin.svelte";
- import {update_profile} from "$shared/lib/api/user";
- import Alert from "$shared/components/alert.svelte";
- import Button from "$shared/components/button.svelte";
- import {is_email} from "$shared/lib/helpers";
- import {api_base} from "$shared/lib/configuration";
- import {get_session_data} from "$shared/lib/session";
-
- const archiveLink = api_base("_/account/archive");
-
- let modal;
- let understands = false;
-
- let formIsLoading = false;
- let formError;
-
- let username = get_session_data()?.profile.username;
- let usernameFieldMessage;
- let usernameFieldMessageClass = "color-error";
-
- let password;
- let passwordFieldMessage;
- let passwordFieldMessageClass = "color-error";
-
- async function submit_form(e) {
- e.preventDefault();
- if (!username && !password) {
- console.error("Not submitting because both values is empty");
- return;
- }
-
- usernameFieldMessage = "";
- passwordFieldMessage = "";
-
- if (username && !is_email(username)) {
- usernameFieldMessage = "Username has to be a valid email";
- return;
- }
-
- if (password && password?.length < 6) {
- passwordFieldMessage = "The new password must contain at least 6 characters";
- return;
- }
-
- formIsLoading = true;
-
- const response = await update_profile({
- username,
- password,
- });
-
- formIsLoading = false;
-
- if (response.ok) {
- if (password) {
- passwordFieldMessage = "Successfully updated";
- passwordFieldMessageClass = "color-success";
- password = "";
- }
- if (username) {
- usernameFieldMessage = "Successfully updated";
- usernameFieldMessageClass = "color-success";
- password = "";
- }
- } else {
- formError = response.data.title ?? "An unknown error occured";
- }
- }
-
- async function handle_delete_account_button_click() {
- alert("Not implemented");
- return;
- if (understands && confirm("Are you absolutely sure that you want to delete your account?")) {
- }
- }
-
- export const functions = {
- open() {
- modal.open();
- },
- close() {
- // modal.close();
- },
- };
-</script>
-
-<Layout>
- <Bread>
- <Crumb name="Home"
- withArrow="true"
- isLink="true"
- on:click={() => push("/")}/>
- <Crumb name="Profile"/>
- </Bread>
-
- <main class="max-width-sm">
- <section class="margin-bottom-md">
- <p class="text-md margin-bottom-sm">Update your information</p>
- <form on:submit={submit_form}
- autocomplete="new-password">
- {#if formError}
- <small class="color-danger">{formError}</small>
- {/if}
- <div class="margin-bottom-sm">
- <label for="email"
- class="form-label margin-bottom-xxs">New username</label>
- <input type="email"
- class="form-control width-100%"
- id="email"
- placeholder={username}
- bind:value={username}/>
- {#if usernameFieldMessage}
- <small class={usernameFieldMessageClass}>{usernameFieldMessage}</small>
- {/if}
- </div>
- <div class="margin-bottom-sm">
- <label for="password"
- class="form-label margin-bottom-xxs">New password</label>
- <input type="password"
- class="form-control width-100%"
- id="password"
- bind:value={password}/>
- {#if passwordFieldMessage}
- <small class={passwordFieldMessageClass}>{passwordFieldMessage}</small>
- {/if}
- </div>
- <div class="flex justify-end">
- <Button text="Save"
- on:click={submit_form}
- variant="primary"
- loading={formIsLoading}/>
- </div>
- </form>
- </section>
- <section class="margin-bottom-md">
- <p class="text-md margin-bottom-sm">Download your data</p>
- <a class="btn btn--subtle"
- href={archiveLink}
- download>Click here to download your data</a>
- </section>
- <section>
- <p class="text-md margin-bottom-sm">Delete account</p>
- <div class="margin-bottom-sm">
- <Alert
- message="Deleting your account and data means that all of your data (entries, categories, etc.) will be unrecoverable forever.<br>You should probably download your data before continuing."
- type="info"
- />
- </div>
- <div class="form-check margin-bottom-sm">
- <input type="checkbox"
- class="checkbox"
- id="the-consequences"
- bind:checked={understands}/>
- <label for="the-consequences">I understand the consequences of deleting my account and data.</label>
- </div>
- <div class="flex justify-end">
- <Button text="Delete everything"
- variant="accent"
- disabled={!understands}
- on:click={handle_delete_account_button_click}/>
- </div>
- </section>
- </main>
-</Layout>
diff --git a/apps/portal/src/app/pages/reset-password.svelte b/apps/portal/src/app/pages/reset-password.svelte
deleted file mode 100644
index dabf5c9..0000000
--- a/apps/portal/src/app/pages/reset-password.svelte
+++ /dev/null
@@ -1,138 +0,0 @@
-<script>
- import {querystring, link} from "svelte-spa-router";
- import {check_forgot_password_request, fulfill_forgot_password_request} from "$shared/lib/api/user";
- import Alert from "$shared/components/alert.svelte";
- import Button from "$shared/components/button.svelte";
- import Tile from "$shared/components/tile.svelte";
- import Layout from "./_layout.svelte";
-
- const requestId = new URLSearchParams($querystring).get("id");
- let isLoading = false;
- let newPassword;
- let newPasswordError;
- let alert = {
- title: "",
- type: "",
- message: "",
- isVisible: false,
- show(type, obj) {
- alert.title = obj.title;
- alert.message = obj.text;
- alert.type = type;
- alert.isVisible = true;
- isLoading = false;
- },
- hide() {
- alert.isVisible = false;
- alert.title = "";
- alert.message = "";
- alert.type = "";
- isLoading = false;
- },
- };
-
- function is_valid() {
- let isValid = true;
- if (!newPassword.length > 5) {
- newPasswordError = "The new password must be at least 5 characters";
- isValid = false;
- }
- return isValid;
- }
-
- async function submit() {
- if (isLoading) {
- return;
- }
- if (is_valid()) {
- isLoading = true;
- const response = await fulfill_forgot_password_request(requestId, newPassword);
- if (response.ok) {
- alert.show("success", {
- title: "Your new password is set",
- text: "<a href='/#/login'>Click here to log in</a>",
- });
- } else {
- console.error(response.data);
- alert.show("error", {
- title: response.data?.title ?? "An error occured",
- text: response.data?.text ?? "Please try again soon",
- });
- }
- }
- }
-
- async function is_valid_password_reset_request() {
- const response = await check_forgot_password_request(requestId);
- if (response.ok) {
- return response.data === true;
- }
- return false;
- }
-</script>
-
-<Layout>
- <Tile>
- <form on:submit|preventDefault={submit}
- class="max-width-xxs {isLoading ? 'c-disabled loading' : ''}">
- {#if requestId}
- {#await is_valid_password_reset_request()}
- <p>Checking your request...</p>
- <a href="/login"
- use:link>cancel</a>
- {:then isActive}
- {#if isActive === true}
- <fieldset>
- <legend class="form-legend">
- <span class="margin-bottom-xs text-xl">Set your new password</span> <br/>
- <span class="text-sm">
- ... or
- <a href="/login"
- use:link> log in </a>
- </span>
- </legend>
- <div class="margin-bottom-xxs max-width-xxs">
- <Alert visible={alert.isVisible}
- title={alert.title}
- message={alert.message}
- type={alert.type}/>
- </div>
- <div class="margin-bottom-xs">
- <input
- type="password"
- id="new-password"
- placeholder="New password"
- class="form-control width-100%"
- bind:value={newPassword}
- />
- {#if newPasswordError}
- <small class="color-danger">{newPasswordError}</small>
- {/if}
- </div>
- <div class="flex justify-end">
- <Button text="Set new password"
- type="primary"
- loading={isLoading}
- on:click={submit}/>
- </div>
- </fieldset>
- {:else}
- <Alert title="This request is expired"
- message="Please submit the forgot password form again"
- type="warning"/>
- <div class="flex justify-between width-100% margin-y-sm">
- <a href="/forgot"
- use:link>Go to forgot form</a>
- <a href="/login"
- use:link>Go to login form</a>
- </div>
- {/if}
- {:catch _}
- <Alert title="An error occured"
- message="Please try again soon"
- type="error"/>
- {/await}
- {/if}
- </form>
- </Tile>
-</Layout>
diff --git a/apps/portal/src/app/pages/sign-up.svelte b/apps/portal/src/app/pages/sign-up.svelte
deleted file mode 100644
index 3bcab6d..0000000
--- a/apps/portal/src/app/pages/sign-up.svelte
+++ /dev/null
@@ -1,131 +0,0 @@
-<script>
- import {create_account} from "$shared/lib/api/user";
- import {frontpage_base} from "$shared/lib/configuration";
- import {is_email} from "$shared/lib/helpers";
- import Alert from "$shared/components/alert.svelte";
- import Button from "$shared/components/button.svelte";
- import Tile from "$shared/components/tile.svelte";
- import {link} from "svelte-spa-router";
- import Layout from "./_layout.svelte";
-
- const signupForm = {
- loading: false,
- values: {
- username: "",
- password: "",
- },
- alert: {
- title: "",
- type: "",
- message: "",
- isVisible: false,
- show(type, obj) {
- signupForm.alert.title = obj.title;
- signupForm.alert.message = obj.text;
- signupForm.alert.type = type;
- signupForm.alert.isVisible = true;
- signupForm.loading = false;
- },
- hide() {
- signupForm.alert.isVisible = false;
- signupForm.alert.title = "";
- signupForm.alert.message = "";
- signupForm.alert.type = "";
- },
- },
- is_valid() {
- return (
- is_email(signupForm.values.username) &&
- signupForm.values.password.length > 0
- );
- },
- async submit_form() {
- if (signupForm.loading) {
- return;
- }
- if (signupForm.is_valid()) {
- signupForm.alert.hide();
- signupForm.loading = true;
- try {
- const response = await create_account(signupForm.values);
- if (response.ok) {
- location.reload();
- } else {
- if (response.data.title || response.data.text) {
- signupForm.alert.show("error", {
- title: response.data.title ?? "",
- text: response.data.text ?? "",
- });
- } else {
- signupForm.alert.show("error", {
- title: "An unknown error occured",
- text: "Try again soon",
- });
- }
- }
- } catch (e) {
- console.error(e);
- signupForm.alert.show("error", {
- title: "An error occured",
- text: "Could not connect to server, please check your internet connection",
- });
- }
- } else {
- signupForm.alert.show("error", {
- title: "Invalid form",
- });
- }
- },
- };
-</script>
-
-<Layout>
- <a href="{frontpage_base()}"
- class="block margin-bottom-xs">Go to {frontpage_base()}</a>
- <Tile>
- <form on:submit|preventDefault={signupForm.submit_form}
- class="max-width-xxs">
- <fieldset>
- <legend class="form-legend">
- <span class="margin-bottom-xs text-xl">Create your account</span> <br/>
- <span class="text-sm"
- >... or <a href="/login"
- use:link>log in</a></span
- >
- </legend>
- <div class="margin-bottom-xs">
- <p>Provide an email and password to get immediate access to your new environment (30 days full access, no billing details required, no promotion emails).</p>
- </div>
- <div class="margin-bottom-xxs max-width-xxs">
- <Alert visible={signupForm.alert.isVisible}
- title={signupForm.alert.title}
- message={signupForm.alert.message}
- type={signupForm.alert.type}
- />
- </div>
- <div class="margin-bottom-xxs">
- <input type="email"
- placeholder="Email address"
- class="form-control width-100%"
- id="email-address"
- bind:value={signupForm.values.username}
- />
- </div>
- <div class="margin-bottom-xxs">
- <input type="password"
- placeholder="Password"
- class="form-control width-100%"
- bind:value={signupForm.values.password}
- />
- </div>
- <div class="flex justify-end">
- <Button class="margin-bottom-xs"
- text="Create account"
- type="primary"
- loading={signupForm.loading}
- />
- </div>
- </fieldset>
- </form>
- </Tile>
-</Layout>
diff --git a/apps/portal/src/index.html b/apps/portal/src/index.html
deleted file mode 100644
index 2102205..0000000
--- a/apps/portal/src/index.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-<head>
- <meta charset="UTF-8">
- <meta name="viewport"
- content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
- <link rel="apple-touch-icon"
- sizes="180x180"
- href="./_assets/pwa/apple-touch-icon.png">
- <link rel="icon"
- type="image/png"
- sizes="32x32"
- href="./_assets/pwa/favicon-32x32.png">
- <link rel="icon"
- type="image/png"
- sizes="16x16"
- href="./_assets/pwa/favicon-16x16.png">
- <link rel="manifest"
- href="./_assets/pwa/manifest.json">
- <link rel="mask-icon"
- href="./_assets/pwa/safari-pinned-tab.svg"
- color="#5bbad5">
- <meta name="msapplication-TileColor"
- content="#da532c">
- <link rel="icon"
- href="./_assets/pwa/favicon.svg">
- <link rel="stylesheet" href="./_assets/preload.css">
- <script src="./_assets/preload.js"></script>
- <title>Portal - Greatoffice</title>
-</head>
-
-<body>
-
-<noscript>
- This page is built with javascript. Allow it and try again.
-</noscript>
-
-<div class="fill-loader fill-loader--v4"
- id="loader"
- role="alert">
- <p class="fill-loader__label">Loading Portal...</p>
- <div aria-hidden="true">
- <div class="fill-loader__base"></div>
- <div class="fill-loader__fill"></div>
- </div>
-</div>
-
-<div id="root"></div>
-
-<script type="module"
- src="./app/index.ts"></script>
-</body>
-
-</html>
diff --git a/apps/portal/src/package.json b/apps/portal/src/package.json
deleted file mode 100644
index 07800b3..0000000
--- a/apps/portal/src/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "greatoffice-portal",
- "version": "0.0.1",
- "private": "true",
- "scripts": {
- "dev": "vite",
- "build": "vite build"
- },
- "devDependencies": {
- "@sveltejs/vite-plugin-svelte": "1.0.1",
- "install": "^0.13.0",
- "sass": "^1.54.0",
- "svelte": "^3.49.0",
- "svelte-feather-icons": "^4.0.0",
- "svelte-preprocess": "^4.10.7",
- "svelte-spa-router": "^3.2.0",
- "typescript": "4.7.4",
- "vite": "^3.0.4"
- },
- "dependencies": {
- "@js-temporal/polyfill": "^0.4.2",
- "fuzzysort": "^2.0.1"
- }
-}
diff --git a/apps/portal/src/pnpm-lock.yaml b/apps/portal/src/pnpm-lock.yaml
deleted file mode 100644
index b091925..0000000
--- a/apps/portal/src/pnpm-lock.yaml
+++ /dev/null
@@ -1,787 +0,0 @@
-lockfileVersion: 5.4
-
-specifiers:
- '@js-temporal/polyfill': ^0.4.2
- '@sveltejs/vite-plugin-svelte': 1.0.1
- fuzzysort: ^2.0.1
- install: ^0.13.0
- sass: ^1.54.0
- svelte: ^3.49.0
- svelte-feather-icons: ^4.0.0
- svelte-preprocess: ^4.10.7
- svelte-spa-router: ^3.2.0
- typescript: 4.7.4
- vite: ^3.0.4
-
-dependencies:
- '@js-temporal/polyfill': 0.4.2
- fuzzysort: 2.0.1
-
-devDependencies:
- '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.4
- install: 0.13.0
- sass: 1.54.0
- svelte: 3.49.0
- svelte-feather-icons: 4.0.0
- svelte-preprocess: 4.10.7_qqyngjnvpp2z5rj6eppfx7s47e
- svelte-spa-router: 3.2.0
- typescript: 4.7.4
- vite: 3.0.4_sass@1.54.0
-
-packages:
-
- /@js-temporal/polyfill/0.4.2:
- resolution: {integrity: sha512-c85vRxyqnJaXKyf4tvYij8jwiVIZhNLYDI9C4LLuOwVEHf4HUqGg07BBn70Le71W193QT/vmKg3jPUyQxJRHKQ==}
- engines: {node: '>=12'}
- dependencies:
- jsbi: 4.3.0
- tslib: 2.4.0
- dev: false
-
- /@rollup/pluginutils/4.2.1:
- resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
- engines: {node: '>= 8.0.0'}
- dependencies:
- estree-walker: 2.0.2
- picomatch: 2.3.1
- dev: true
-
- /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.4:
- resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==}
- engines: {node: ^14.18.0 || >= 16}
- peerDependencies:
- diff-match-patch: ^1.0.5
- svelte: ^3.44.0
- vite: ^3.0.0
- peerDependenciesMeta:
- diff-match-patch:
- optional: true
- dependencies:
- '@rollup/pluginutils': 4.2.1
- debug: 4.3.4
- deepmerge: 4.2.2
- kleur: 4.1.5
- magic-string: 0.26.2
- svelte: 3.49.0
- svelte-hmr: 0.14.12_svelte@3.49.0
- vite: 3.0.4_sass@1.54.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@types/node/18.6.3:
- resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==}
- dev: true
-
- /@types/pug/2.0.6:
- resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
- dev: true
-
- /@types/sass/1.43.1:
- resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
- dependencies:
- '@types/node': 18.6.3
- dev: true
-
- /anymatch/3.1.2:
- resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
- engines: {node: '>= 8'}
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
- dev: true
-
- /balanced-match/1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- dev: true
-
- /binary-extensions/2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
- dev: true
-
- /brace-expansion/1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
- dev: true
-
- /braces/3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
- dependencies:
- fill-range: 7.0.1
- dev: true
-
- /buffer-crc32/0.2.13:
- resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
- dev: true
-
- /chokidar/3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
- dependencies:
- anymatch: 3.1.2
- braces: 3.0.2
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /concat-map/0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- dev: true
-
- /debug/4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.1.2
- dev: true
-
- /deepmerge/4.2.2:
- resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /detect-indent/6.1.0:
- resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
- engines: {node: '>=8'}
- dev: true
-
- /es6-promise/3.3.1:
- resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
- dev: true
-
- /esbuild-android-64/0.14.51:
- resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-android-arm64/0.14.51:
- resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-64/0.14.51:
- resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-arm64/0.14.51:
- resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-64/0.14.51:
- resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-arm64/0.14.51:
- resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-32/0.14.51:
- resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-64/0.14.51:
- resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm/0.14.51:
- resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm64/0.14.51:
- resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-mips64le/0.14.51:
- resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-ppc64le/0.14.51:
- resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-riscv64/0.14.51:
- resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-s390x/0.14.51:
- resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-netbsd-64/0.14.51:
- resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-openbsd-64/0.14.51:
- resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-sunos-64/0.14.51:
- resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-32/0.14.51:
- resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-64/0.14.51:
- resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-arm64/0.14.51:
- resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild/0.14.51:
- resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- esbuild-android-64: 0.14.51
- esbuild-android-arm64: 0.14.51
- esbuild-darwin-64: 0.14.51
- esbuild-darwin-arm64: 0.14.51
- esbuild-freebsd-64: 0.14.51
- esbuild-freebsd-arm64: 0.14.51
- esbuild-linux-32: 0.14.51
- esbuild-linux-64: 0.14.51
- esbuild-linux-arm: 0.14.51
- esbuild-linux-arm64: 0.14.51
- esbuild-linux-mips64le: 0.14.51
- esbuild-linux-ppc64le: 0.14.51
- esbuild-linux-riscv64: 0.14.51
- esbuild-linux-s390x: 0.14.51
- esbuild-netbsd-64: 0.14.51
- esbuild-openbsd-64: 0.14.51
- esbuild-sunos-64: 0.14.51
- esbuild-windows-32: 0.14.51
- esbuild-windows-64: 0.14.51
- esbuild-windows-arm64: 0.14.51
- dev: true
-
- /estree-walker/2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- dev: true
-
- /fill-range/7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
- dependencies:
- to-regex-range: 5.0.1
- dev: true
-
- /fs.realpath/1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
- dev: true
-
- /fsevents/2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /function-bind/1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
- dev: true
-
- /fuzzysort/2.0.1:
- resolution: {integrity: sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg==}
- dev: false
-
- /glob-parent/5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
- dependencies:
- is-glob: 4.0.3
- dev: true
-
- /glob/7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
-
- /graceful-fs/4.2.10:
- resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
- dev: true
-
- /has/1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
- dependencies:
- function-bind: 1.1.1
- dev: true
-
- /immutable/4.1.0:
- resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==}
- dev: true
-
- /inflight/1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
- dev: true
-
- /inherits/2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- dev: true
-
- /install/0.13.0:
- resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==}
- engines: {node: '>= 0.10'}
- dev: true
-
- /is-binary-path/2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
- dependencies:
- binary-extensions: 2.2.0
- dev: true
-
- /is-core-module/2.9.0:
- resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
- dependencies:
- has: 1.0.3
- dev: true
-
- /is-extglob/2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /is-glob/4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- is-extglob: 2.1.1
- dev: true
-
- /is-number/7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
- dev: true
-
- /jsbi/4.3.0:
- resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==}
- dev: false
-
- /kleur/4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
- dev: true
-
- /magic-string/0.25.9:
- resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: true
-
- /magic-string/0.26.2:
- resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==}
- engines: {node: '>=12'}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: true
-
- /min-indent/1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
- dev: true
-
- /minimatch/3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
- dependencies:
- brace-expansion: 1.1.11
- dev: true
-
- /minimist/1.2.6:
- resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
- dev: true
-
- /mkdirp/0.5.6:
- resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
- hasBin: true
- dependencies:
- minimist: 1.2.6
- dev: true
-
- /ms/2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- dev: true
-
- /nanoid/3.3.4:
- resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
- dev: true
-
- /normalize-path/3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /once/1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- dependencies:
- wrappy: 1.0.2
- dev: true
-
- /path-is-absolute/1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /path-parse/1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- dev: true
-
- /picocolors/1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
- dev: true
-
- /picomatch/2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
- dev: true
-
- /postcss/8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
- engines: {node: ^10 || ^12 || >=14}
- dependencies:
- nanoid: 3.3.4
- picocolors: 1.0.0
- source-map-js: 1.0.2
- dev: true
-
- /readdirp/3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
- dependencies:
- picomatch: 2.3.1
- dev: true
-
- /regexparam/2.0.0:
- resolution: {integrity: sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==}
- engines: {node: '>=8'}
- dev: true
-
- /resolve/1.22.1:
- resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
- hasBin: true
- dependencies:
- is-core-module: 2.9.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
- dev: true
-
- /rimraf/2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- hasBin: true
- dependencies:
- glob: 7.2.3
- dev: true
-
- /rollup/2.77.2:
- resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /sander/0.5.1:
- resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
- dependencies:
- es6-promise: 3.3.1
- graceful-fs: 4.2.10
- mkdirp: 0.5.6
- rimraf: 2.7.1
- dev: true
-
- /sass/1.54.0:
- resolution: {integrity: sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==}
- engines: {node: '>=12.0.0'}
- hasBin: true
- dependencies:
- chokidar: 3.5.3
- immutable: 4.1.0
- source-map-js: 1.0.2
- dev: true
-
- /sorcery/0.10.0:
- resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
- hasBin: true
- dependencies:
- buffer-crc32: 0.2.13
- minimist: 1.2.6
- sander: 0.5.1
- sourcemap-codec: 1.4.8
- dev: true
-
- /source-map-js/1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /sourcemap-codec/1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- dev: true
-
- /strip-indent/3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
- dependencies:
- min-indent: 1.0.1
- dev: true
-
- /supports-preserve-symlinks-flag/1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /svelte-feather-icons/4.0.0:
- resolution: {integrity: sha512-4ieUsjp+VYa1r6y80jDt9zRiRUZyJNbESpRdHdJJhiBubyuXX96A7f1UZSK4olxzP6Qsg5ZAuyZlnmvD+/swAA==}
- dependencies:
- svelte: 3.49.0
- dev: true
-
- /svelte-hmr/0.14.12_svelte@3.49.0:
- resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==}
- engines: {node: ^12.20 || ^14.13.1 || >= 16}
- peerDependencies:
- svelte: '>=3.19.0'
- dependencies:
- svelte: 3.49.0
- dev: true
-
- /svelte-preprocess/4.10.7_qqyngjnvpp2z5rj6eppfx7s47e:
- resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
- engines: {node: '>= 9.11.2'}
- requiresBuild: true
- peerDependencies:
- '@babel/core': ^7.10.2
- coffeescript: ^2.5.1
- less: ^3.11.3 || ^4.0.0
- node-sass: '*'
- postcss: ^7 || ^8
- postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
- pug: ^3.0.0
- sass: ^1.26.8
- stylus: ^0.55.0
- sugarss: ^2.0.0
- svelte: ^3.23.0
- typescript: ^3.9.5 || ^4.0.0
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- coffeescript:
- optional: true
- less:
- optional: true
- node-sass:
- optional: true
- postcss:
- optional: true
- postcss-load-config:
- optional: true
- pug:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- typescript:
- optional: true
- dependencies:
- '@types/pug': 2.0.6
- '@types/sass': 1.43.1
- detect-indent: 6.1.0
- magic-string: 0.25.9
- sass: 1.54.0
- sorcery: 0.10.0
- strip-indent: 3.0.0
- svelte: 3.49.0
- typescript: 4.7.4
- dev: true
-
- /svelte-spa-router/3.2.0:
- resolution: {integrity: sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==}
- dependencies:
- regexparam: 2.0.0
- dev: true
-
- /svelte/3.49.0:
- resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==}
- engines: {node: '>= 8'}
- dev: true
-
- /to-regex-range/5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
- dependencies:
- is-number: 7.0.0
- dev: true
-
- /tslib/2.4.0:
- resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
- dev: false
-
- /typescript/4.7.4:
- resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
- engines: {node: '>=4.2.0'}
- hasBin: true
- dev: true
-
- /vite/3.0.4_sass@1.54.0:
- resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- less: '*'
- sass: '*'
- stylus: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- less:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.14.51
- postcss: 8.4.14
- resolve: 1.22.1
- rollup: 2.77.2
- sass: 1.54.0
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /wrappy/1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- dev: true
diff --git a/apps/portal/src/tsconfig.json b/apps/portal/src/tsconfig.json
deleted file mode 100644
index c60fce6..0000000
--- a/apps/portal/src/tsconfig.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "include": [
- "./**/*.d.ts",
- "./**/*.ts",
- "./**/*.js",
- "./**/*.svelte"
- ],
- "exclude": [
- "./node_modules"
- ],
- "compilerOptions": {
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "allowJs": true,
- "checkJs": false,
- "paths": {
- "$app/*": [
- "./app/*"
- ],
- "$shared/*": [
- "../../web-shared/src/*"
- ]
- }
- }
-}
diff --git a/apps/portal/src/vite.config.ts b/apps/portal/src/vite.config.ts
deleted file mode 100644
index 684ef14..0000000
--- a/apps/portal/src/vite.config.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import {defineConfig} from "vite";
-import {svelte} from "@sveltejs/vite-plugin-svelte";
-import sveltePreprocess from "svelte-preprocess";
-// @ts-ignore
-import path from "path";
-
-// https://vitejs.dev/config/
-export default defineConfig({
- resolve: {
- alias: {
- "$shared": path.resolve(__dirname, "../../web-shared/src"),
- "$app": path.resolve(__dirname, "./app"),
- }
- },
- build: {
- outDir: "build",
- emptyOutDir: true,
- rollupOptions: {
- input: {
- main: path.resolve(__dirname, "index.html"),
- }
- }
- },
- server: {
- port: 3001
- },
- plugins: [
- svelte({
- preprocess: sveltePreprocess()
- })
- ],
-});
diff --git a/apps/projects/.version b/apps/projects/.version
deleted file mode 100644
index 85aca46..0000000
--- a/apps/projects/.version
+++ /dev/null
@@ -1 +0,0 @@
-v2-projects
diff --git a/apps/projects/.version-dev b/apps/projects/.version-dev
deleted file mode 100644
index 91e061c..0000000
--- a/apps/projects/.version-dev
+++ /dev/null
@@ -1 +0,0 @@
-v13-projects-dev
diff --git a/apps/projects/CHANGELOG.md b/apps/projects/CHANGELOG.md
deleted file mode 100644
index a3af953..0000000
--- a/apps/projects/CHANGELOG.md
+++ /dev/null
@@ -1,118 +0,0 @@
-# Changelog
-
-## [unreleased]
-
-### Bug Fixes
-
-- Correct path to BASE_DOMAIN
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v19-portal-dev
-- Bump version
-- Update CHANGELOG.md for v18-portal-dev
-- Bump version
-- Update CHANGELOG.md for v11-projects-dev
-
-## [unreleased]
-
-### Bug Fixes
-
-- Inherit radius on svg to align styling with other theme figure icons
-
-### Features
-
-- Work in progress more module data models
-- Add inital translation support
-- Add link to BASE_DOMAIN on every public page in portal
-- Centre guarded portal pages
-- Add link to BASE_DOMAIN on every public page in portal
-- Set a max width on the portal layout
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v8-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v7-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v10-projects-dev
-
-### Refactor
-
-- Use dev.greatoffice.life as BASE_DOMAIN while in development-phase
-- Remove all transitions on theme-switcher
-- Put pre.css inside of style tags so that we dont have to wait for the second request on pre.css to show the loader and theme
-
-## [unreleased]
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v9-projects-dev
-
-### Refactor
-
-- Temporarily disable user deletion from within projects
-
-## [unreleased]
-
-### Features
-
-- More work on portal
-- Implement new theme switcher component and backend
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v17-portal-dev
-- Bump version
-- Update CHANGELOG.md for v8-projects-dev
-
-## [unreleased]
-
-### Features
-
-- Seperate layout for docs
-- New frontpage
-- !WIP start implementation of svelte-query
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v16-portal-dev
-- Bump version
-- Update CHANGELOG.md for v6-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v5-frontpage-dev
-- Bump version
-- Update CHANGELOG.md for v4-frontpage-dev
-- Bump version
-- Bump version
-- Bump version
-- Update CHANGELOG.md for v41-server-dev
-- Bump version
-- Update CHANGELOG.md for v40-server-dev
-- Bump version
-- Update CHANGELOG.md for v39-server-dev
-- Bump version
-- Remove logging of quartz db host
-- Update CHANGELOG.md for v7-projects-dev
-
-### Refactor
-
-- Update style on portal forms
-- Implement caching in VaultService and use VaultService instead of IOptions
-- Use Vault to get configuration
-- Use Vault to get configuration
-- Small changes on button style
-- Add a small box-shadow
-
-## [unreleased]
-
-### Miscellaneous Tasks
-
-- Bump version
-- Update CHANGELOG.md for v6-projects-dev
-
diff --git a/apps/projects/build_and_push.sh b/apps/projects/build_and_push.sh
deleted file mode 100755
index abc8ea9..0000000
--- a/apps/projects/build_and_push.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env bash
-
-set -Eueo pipefail
-
-APP_NAME="projects"
-CURRENT_DEV_VERSION=$(cat .version-dev)
-CURRENT_DEV_VERSION_INT=${CURRENT_DEV_VERSION//[!0-9]/}
-CURRENT_VERSION=$(cat .version)
-CURRENT_VERSION_INT=${CURRENT_VERSION//[!0-9]/}
-if [ ${1-prod} == "dev" ]; then
- NEW_VERSION="v$((CURRENT_DEV_VERSION_INT+1))-$APP_NAME-dev"
- OLD_VERSION=$CURRENT_DEV_VERSION
-else
- NEW_VERSION="v$((CURRENT_VERSION_INT+1))-$APP_NAME"
- OLD_VERSION=$CURRENT_VERSION
-fi
-# Check for uncommited changes and optionally commit them
-if [ "$(git status --untracked-files=no --porcelain)" ]; then
- echo "Unclean git tree! press CTRL+C to exit or press ENTER to commit and push to the default branch"
- read -n 1
-
- read -p "Enter commit message: " COMMIT_MESSAGE
- git add ../..
- git commit --quiet -m "$COMMIT_MESSAGE"
-fi
-
-if [ ${1-prod} == "dev" ]; then
- echo $NEW_VERSION >| .version-dev
- git add .version-dev
-else
- echo $NEW_VERSION >| .version
- git add .version
-fi
-
-echo "Starting build of $APP_NAME@$NEW_VERSION at $(date -u)..."
-echo
-
-git commit --quiet -m "chore(release): Bump version";
-
-read -p "Do you want to tag this build? (y/n) " -n 1 -r
-echo
-if [[ $REPLY =~ ^[Yy]$ ]]
-then
- read -p "Enter tag message (can be empty): " TAG_MESSAGE
- commit_msg="chore(release): Update CHANGELOG.md for $NEW_VERSION"
- git cliff -r ../../ $OLD_VERSION..HEAD --with-commit "$commit_msg" --prepend CHANGELOG.md
- git add CHANGELOG.md
- git commit --quiet -m "$commit_msg";
- git tag -am "$TAG_MESSAGE" $NEW_VERSION
-fi
-
-read -p "Do you want to push the latest commits and tags to origin? (y/n) " -n 1 -r
-echo
-if [[ $REPLY =~ ^[Yy]$ ]]
-then
- echo "Pushing latest changes to remotes..."
- echo
- git push --quiet --follow-tags
-fi
-
-pushd src
-pnpm run build
-
-cd build
-echo "$NEW_VERSION" >version.txt
-
-
-if [ ${1-prod} == "dev" ]; then
- scp -r * contabo-fast-1:services/public/projects.dev.greatoffice.life/www
-else
- echo "Pushing to production in 10 sec, press CTRL+C to cancel"
- sleep 10
- scp -r * contabo-fast-1:services/public/projects.greatoffice.life/www
-fi
-
-popd
diff --git a/apps/projects/cliff.toml b/apps/projects/cliff.toml
deleted file mode 100644
index 7299951..0000000
--- a/apps/projects/cliff.toml
+++ /dev/null
@@ -1,62 +0,0 @@
-# configuration file for git-cliff (0.1.0)
-
-[changelog]
-# changelog header
-header = """
-# Changelog\n
-"""
-# template for the changelog body
-# https://tera.netlify.app/docs/#introduction
-body = """
-{% if version %}\
- ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
-{% else %}\
- ## [unreleased]
-{% endif %}\
-{% for group, commits in commits | group_by(attribute="group") %}
- ### {{ group | upper_first }}
- {% for commit in commits %}
- - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
- {% endfor %}
-{% endfor %}\n
-"""
-# remove the leading and trailing whitespace from the template
-trim = true
-# changelog footer
-footer = """
-<!-- generated by git-cliff -->
-"""
-
-[git]
-# parse the commits based on https://www.conventionalcommits.org
-conventional_commits = true
-# filter out the commits that are not conventional
-filter_unconventional = true
-# regex for preprocessing the commit messages
-commit_preprocessors = [
- { pattern = "([ \\n])(([a-f0-9]{7})[a-f0-9]*)", replace = "${1}commit # [${3}](https://git.ivar.systems/greatoffice/commit/${2})" },
- { pattern = "https://git.ivar.systems/greatoffice/commit/([a-f0-9]{7})[a-f0-9]*", replace = "commit # [${1}](${0})" },
-]
-# regex for parsing and grouping commits
-commit_parsers = [
- { message = "^feat", group = "Features" },
- { message = "^fix", group = "Bug Fixes" },
- { message = "^doc", group = "Documentation" },
- { message = "^perf", group = "Performance" },
- { message = "^refactor", group = "Refactor" },
- { message = "^style", group = "Styling" },
- { message = "^test", group = "Testing" },
- { message = "^chore", group = "Miscellaneous Tasks" },
-]
-# filter out the commits that are not matched by commit parsers
-filter_commits = true
-# glob pattern for matching git tags
-tag_pattern = "v.*"
-# regex for skipping tags
-skip_tags = "v0.1.0-beta.1"
-# regex for ignoring tags
-ignore_tags = ""
-# sort the tags chronologically
-date_order = true
-# sort the commits inside sections by oldest/newest order
-sort_commits = "newest"
diff --git a/apps/projects/src/.typesafe-i18n.json b/apps/projects/src/.typesafe-i18n.json
deleted file mode 100644
index 74cca10..0000000
--- a/apps/projects/src/.typesafe-i18n.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "adapter": "svelte",
- "$schema": "https://unpkg.com/typesafe-i18n@5.11.0/schema/typesafe-i18n.json",
- "outputPath": "app/lib/i18n"
-} \ No newline at end of file
diff --git a/apps/projects/src/_assets/preload.css b/apps/projects/src/_assets/preload.css
deleted file mode 120000
index e248c5b..0000000
--- a/apps/projects/src/_assets/preload.css
+++ /dev/null
@@ -1 +0,0 @@
-/Users/ivarlovlie/i2r/greatoffice/apps/web-shared/src/assets/preload.css \ No newline at end of file
diff --git a/apps/projects/src/_assets/preload.js b/apps/projects/src/_assets/preload.js
deleted file mode 120000
index 3fa1cc7..0000000
--- a/apps/projects/src/_assets/preload.js
+++ /dev/null
@@ -1 +0,0 @@
-/Users/ivarlovlie/i2r/greatoffice/apps/web-shared/src/assets/preload.js \ No newline at end of file
diff --git a/apps/projects/src/_assets/projects.png b/apps/projects/src/_assets/projects.png
deleted file mode 100644
index e49191f..0000000
--- a/apps/projects/src/_assets/projects.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/android-chrome-192x192.png b/apps/projects/src/_assets/pwa/android-chrome-192x192.png
deleted file mode 100644
index 5c098bc..0000000
--- a/apps/projects/src/_assets/pwa/android-chrome-192x192.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/android-chrome-512x512.png b/apps/projects/src/_assets/pwa/android-chrome-512x512.png
deleted file mode 100644
index 973a1c3..0000000
--- a/apps/projects/src/_assets/pwa/android-chrome-512x512.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/apple-touch-icon.png b/apps/projects/src/_assets/pwa/apple-touch-icon.png
deleted file mode 100644
index b4d9773..0000000
--- a/apps/projects/src/_assets/pwa/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/browserconfig.xml b/apps/projects/src/_assets/pwa/browserconfig.xml
deleted file mode 100644
index b3930d0..0000000
--- a/apps/projects/src/_assets/pwa/browserconfig.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
- <msapplication>
- <tile>
- <square150x150logo src="/mstile-150x150.png"/>
- <TileColor>#da532c</TileColor>
- </tile>
- </msapplication>
-</browserconfig>
diff --git a/apps/projects/src/_assets/pwa/favicon-16x16.png b/apps/projects/src/_assets/pwa/favicon-16x16.png
deleted file mode 100644
index 5dde9f9..0000000
--- a/apps/projects/src/_assets/pwa/favicon-16x16.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/favicon-32x32.png b/apps/projects/src/_assets/pwa/favicon-32x32.png
deleted file mode 100644
index 9cef4c4..0000000
--- a/apps/projects/src/_assets/pwa/favicon-32x32.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/favicon.ico b/apps/projects/src/_assets/pwa/favicon.ico
deleted file mode 100644
index 89c7542..0000000
--- a/apps/projects/src/_assets/pwa/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/favicon.svg b/apps/projects/src/_assets/pwa/favicon.svg
deleted file mode 100644
index 964dbb8..0000000
--- a/apps/projects/src/_assets/pwa/favicon.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-stopwatch" viewBox="0 0 16 16">
- <path d="M8.5 5.6a.5.5 0 1 0-1 0v2.9h-3a.5.5 0 0 0 0 1H8a.5.5 0 0 0 .5-.5V5.6z"/>
- <path d="M6.5 1A.5.5 0 0 1 7 .5h2a.5.5 0 0 1 0 1v.57c1.36.196 2.594.78 3.584 1.64a.715.715 0 0 1 .012-.013l.354-.354-.354-.353a.5.5 0 0 1 .707-.708l1.414 1.415a.5.5 0 1 1-.707.707l-.353-.354-.354.354a.512.512 0 0 1-.013.012A7 7 0 1 1 7 2.071V1.5a.5.5 0 0 1-.5-.5zM8 3a6 6 0 1 0 .001 12A6 6 0 0 0 8 3z"/>
-</svg> \ No newline at end of file
diff --git a/apps/projects/src/_assets/pwa/manifest.json b/apps/projects/src/_assets/pwa/manifest.json
deleted file mode 100644
index 4c550fe..0000000
--- a/apps/projects/src/_assets/pwa/manifest.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "manifest_version": 2,
- "version": "0.1",
- "name": "Time Tracker",
- "short_name": "Time Tracker",
- "display": "standalone",
- "background_color": "#fff",
- "theme_color": "#4D3DF7",
- "start_url": ".",
- "orientation": "portrait",
- "icons": [
- {
- "src": "/favicon.svg",
- "purpose": "maskable any",
- "sizes": "any"
- },
- {
- "src": "/pwa/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/pwa/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ]
-}
diff --git a/apps/projects/src/_assets/pwa/mstile-144x144.png b/apps/projects/src/_assets/pwa/mstile-144x144.png
deleted file mode 100644
index 84d94cb..0000000
--- a/apps/projects/src/_assets/pwa/mstile-144x144.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/mstile-150x150.png b/apps/projects/src/_assets/pwa/mstile-150x150.png
deleted file mode 100644
index b1398ae..0000000
--- a/apps/projects/src/_assets/pwa/mstile-150x150.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/mstile-310x150.png b/apps/projects/src/_assets/pwa/mstile-310x150.png
deleted file mode 100644
index 76b16a0..0000000
--- a/apps/projects/src/_assets/pwa/mstile-310x150.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/mstile-310x310.png b/apps/projects/src/_assets/pwa/mstile-310x310.png
deleted file mode 100644
index d8e4097..0000000
--- a/apps/projects/src/_assets/pwa/mstile-310x310.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/mstile-70x70.png b/apps/projects/src/_assets/pwa/mstile-70x70.png
deleted file mode 100644
index 0df1e8c..0000000
--- a/apps/projects/src/_assets/pwa/mstile-70x70.png
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/_assets/pwa/safari-pinned-tab.svg b/apps/projects/src/_assets/pwa/safari-pinned-tab.svg
deleted file mode 100644
index ba2220c..0000000
--- a/apps/projects/src/_assets/pwa/safari-pinned-tab.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.14, written by Peter Selinger 2001-2017
-</metadata>
-<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M3195 6780 c-116 -3 -211 -10 -226 -17 -39 -17 -105 -98 -116 -142
--19 -72 -2 -146 45 -202 26 -31 96 -69 131 -72 25 -2 31 -6 32 -27 1 -27 1
--198 0 -216 -1 -6 -47 -19 -103 -28 -160 -28 -451 -107 -533 -146 -11 -5 -51
--21 -90 -36 -60 -23 -246 -112 -325 -155 -431 -236 -834 -619 -1101 -1045
--207 -328 -364 -733 -423 -1089 -51 -307 -61 -583 -31 -875 26 -261 119 -615
-225 -861 185 -430 432 -773 800 -1108 75 -69 387 -301 405 -301 1 0 33 -18 70
--40 209 -128 602 -288 796 -325 12 -2 29 -7 39 -10 72 -23 273 -56 435 -73
-144 -14 601 -5 658 13 7 2 37 7 67 10 273 33 616 141 904 283 725 357 1275
-982 1542 1754 55 159 113 395 129 523 4 28 8 57 10 65 2 8 7 47 10 85 3 39 8
-93 10 120 6 66 6 327 0 390 -2 28 -7 82 -10 120 -3 39 -11 99 -16 135 -6 36
--13 79 -16 95 -15 98 -61 279 -103 405 -121 372 -298 694 -542 993 -27 32 -48
-61 -48 65 0 4 35 41 78 84 l77 76 90 -90 c53 -54 108 -99 134 -110 62 -28 130
--25 191 8 95 52 135 151 103 257 -13 46 -44 79 -362 397 -322 323 -351 349
--398 363 -148 44 -287 -61 -285 -215 1 -62 35 -118 126 -208 47 -47 86 -87 86
--90 0 -6 -91 -101 -132 -138 l-25 -23 -46 38 c-264 223 -584 405 -924 528 -92
-34 -320 100 -376 109 -15 3 -35 7 -45 10 -9 3 -34 7 -54 10 -86 13 -113 18
--117 22 -2 2 -4 56 -4 121 l0 118 29 9 c66 19 114 47 139 80 72 95 65 215 -18
-296 -58 56 -83 60 -402 63 -159 1 -380 0 -490 -3z m560 -1104 c224 -24 547
--99 670 -156 11 -5 56 -24 100 -41 90 -37 282 -134 306 -155 8 -8 19 -14 23
--14 13 0 192 -124 286 -199 97 -77 297 -270 364 -351 237 -288 405 -598 509
--941 30 -98 44 -157 72 -299 3 -14 8 -47 11 -75 3 -27 7 -56 10 -63 22 -69 21
--519 -1 -642 -1 -8 -6 -40 -10 -70 -4 -30 -9 -64 -11 -75 -2 -11 -7 -33 -10
--50 -3 -16 -14 -66 -26 -110 -11 -44 -21 -84 -22 -90 -18 -79 -93 -275 -154
--408 -39 -83 -158 -296 -171 -307 -3 -3 -26 -34 -50 -70 -116 -169 -312 -384
--466 -508 -38 -32 -78 -65 -89 -74 -25 -22 -229 -160 -281 -189 -177 -99 -405
--197 -570 -244 -126 -36 -305 -74 -375 -81 -19 -2 -48 -5 -65 -8 -121 -22
--509 -22 -618 0 -12 2 -42 6 -67 10 -369 45 -795 215 -1125 448 -192 135 -399
-326 -517 476 -23 30 -48 61 -55 67 -57 60 -227 336 -291 473 -64 135 -150 365
--167 444 -2 12 -6 30 -9 41 -28 120 -36 156 -41 193 -3 24 -7 53 -10 65 -32
-148 -38 552 -10 707 2 14 7 45 10 70 33 274 160 643 313 910 60 106 201 312
-232 340 3 3 23 28 45 55 22 28 85 96 140 151 347 352 768 590 1252 709 56 14
-118 27 137 30 20 2 61 9 93 14 32 6 92 13 133 17 41 3 76 7 77 8 6 5 368 -2
-428 -8z"/>
-<path d="M3423 4754 c-45 -17 -95 -61 -121 -109 -15 -27 -17 -93 -19 -650 -1
--341 -2 -641 -3 -666 l0 -47 -679 0 -679 -1 -49 -24 c-59 -30 -76 -49 -104
--112 -54 -122 23 -270 154 -293 23 -5 400 -8 837 -7 l795 1 42 22 c52 27 98
-82 112 136 8 29 10 273 9 826 -3 854 1 796 -59 867 -53 63 -153 87 -236 57z"/>
-</g>
-</svg>
diff --git a/apps/projects/src/app/index.d.ts b/apps/projects/src/app/index.d.ts
deleted file mode 100644
index c044583..0000000
--- a/apps/projects/src/app/index.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Use this file to declare any custom file extensions for importing */
-/* Use this folder to also add/extend a package d.ts file, if needed. */
-
-/* CSS MODULES */
-declare module "*.module.css" {
- const classes: { [key: string]: string };
- export default classes;
-}
-declare module "*.module.scss" {
- const classes: { [key: string]: string };
- export default classes;
-}
-
-/* CSS */
-declare module "*.css";
-declare module "*.scss";
-
-/* IMAGES */
-declare module "*.svg" {
- const ref: string;
- export default ref;
-}
-declare module "*.bmp" {
- const ref: string;
- export default ref;
-}
-declare module "*.gif" {
- const ref: string;
- export default ref;
-}
-declare module "*.jpg" {
- const ref: string;
- export default ref;
-}
-declare module "*.jpeg" {
- const ref: string;
- export default ref;
-}
-declare module "*.png" {
- const ref: string;
- export default ref;
-}
-
-/* CUSTOM: ADD YOUR OWN HERE */
-declare module "*.svelte" {
- const value: any;
- export default value;
-}
diff --git a/apps/projects/src/app/index.html b/apps/projects/src/app/index.html
deleted file mode 100644
index 7e0b0e1..0000000
--- a/apps/projects/src/app/index.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-<head>
- <meta charset="UTF-8">
- <meta name="viewport"
- content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
- <link rel="apple-touch-icon"
- sizes="180x180"
- href="../_assets/pwa/apple-touch-icon.png">
- <link rel="icon"
- type="image/png"
- sizes="32x32"
- href="../_assets/pwa/favicon-32x32.png">
- <link rel="icon"
- type="image/png"
- sizes="16x16"
- href="../_assets/pwa/favicon-16x16.png">
- <link rel="manifest"
- href="../_assets/pwa/manifest.json">
- <link rel="mask-icon"
- href="../_assets/pwa/safari-pinned-tab.svg"
- color="#5bbad5">
- <meta name="msapplication-TileColor"
- content="#da532c">
- <link rel="icon"
- href="../_assets/pwa/favicon.svg">
- <script>
- const currentTheme = localStorage.getItem("theme");
- if (currentTheme === "light") {
- document.querySelector("html").dataset.theme = "light";
- } else {
- document.querySelector("html").dataset.theme = "dark";
- }
- </script>
- <link rel="stylesheet"
- href="../_assets/pre.css">
- <title>Time Tracker</title>
-</head>
-
-<body>
-
-<noscript>
- This page is built with javascript. Allow it and try again.
-</noscript>
-
-<div class="fill-loader fill-loader--v4"
- id="loader"
- role="alert">
- <p class="fill-loader__label">Loading Time Tracker...</p>
- <div aria-hidden="true">
- <div class="fill-loader__base"></div>
- <div class="fill-loader__fill"></div>
- </div>
-</div>
-
-<div id="root"></div>
-
-<script type="module"
- src="./index.ts"></script>
-</body>
-
-</html>
diff --git a/apps/projects/src/app/index.scss b/apps/projects/src/app/index.scss
deleted file mode 100644
index f83b1a1..0000000
--- a/apps/projects/src/app/index.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-@use '../../web-shared/src/styles/base'as * with ($breakpoints: ('xs': "768px",
- 'sm': "768px",
- 'md': "1200px",
- 'lg': "1200px",
- 'xl': "1600px",
- ),
- $grid-columns: 12);
-
-@use '../../web-shared/src/styles/custom-style/colors';
-@use '../../web-shared/src/styles/custom-style/spacing';
-@use '../../web-shared/src/styles/custom-style/shared-styles';
-@use '../../web-shared/src/styles/custom-style/typography';
-@use '../../web-shared/src/styles/custom-style/icons';
-@use '../../web-shared/src/styles/custom-style/buttons';
-@use '../../web-shared/src/styles/custom-style/forms';
-@use '../../web-shared/src/styles/custom-style/util';
-
-@use '../../web-shared/src/styles/components/radios-checkboxes';
-@use '../../web-shared/src/styles/components/circle-loader';
-@use '../../web-shared/src/styles/components/list';
-@use '../../web-shared/src/styles/components/form-validator';
-@use '../../web-shared/src/styles/components/btn-states';
-@use '../../web-shared/src/styles/components/alert';
-@use '../../web-shared/src/styles/components/details';
-@use '../../web-shared/src/styles/components/tabbed-navigation';
-@use '../../web-shared/src/styles/components/dropdown';
-@use '../../web-shared/src/styles/components/modal';
-@use '../../web-shared/src/styles/components/chip';
-@use '../../web-shared/src/styles/components/autocomplete';
-@use '../../web-shared/src/styles/components/select-autocomplete';
-@use '../../web-shared/src/styles/components/interactive-table';
-@use '../../web-shared/src/styles/components/pagination';
-@use '../../web-shared/src/styles/components/custom-select';
-@use '../../web-shared/src/styles/components/pre-header';
-@use '../../web-shared/src/styles/components/table';
-@use '../../web-shared/src/styles/components/custom-checkbox';
-@use '../../web-shared/src/styles/components/menu';
-@use '../../web-shared/src/styles/components/user-menu';
-@use '../../web-shared/src/styles/components/light-dark-switch';
-@use '../../web-shared/src/styles/components/side-navigation-v4';
diff --git a/apps/projects/src/app/index.svelte b/apps/projects/src/app/index.svelte
deleted file mode 100644
index c121a32..0000000
--- a/apps/projects/src/app/index.svelte
+++ /dev/null
@@ -1,96 +0,0 @@
-<svelte:options immutable={true}/>
-<svelte:window bind:online={online}/>
-
-<script lang="ts">
- import { Locales } from "$app/lib/i18n/i18n-types";
- import { logout_user } from "$app/lib/services/user-service";
- import { currentLocale, preffered_or_default } from "$shared/lib/locale";
- import { CookieNames } from "$shared/lib/configuration";
- import { get_cookie } from "$shared/lib/helpers";
- import { Temporal } from "@js-temporal/polyfill";
- import { onMount } from "svelte";
- import Router from "svelte-spa-router";
- import { wrap } from "svelte-spa-router/wrap";
- import { QueryClient, QueryClientProvider } from "@sveltestack/svelte-query";
- import { is_active } from "$shared/lib/session";
- import UiWorkbench from "$app/pages/ui-workbench.svelte";
- import NotFound from "$app/pages/not-found.svelte";
- import Home from "$app/pages/home.svelte";
- import Settings from "$app/pages/settings.svelte";
- import Data from "$app/pages/data.svelte";
- import PreHeader from "$shared/components/pre-header.svelte";
- import { setLocale } from "$app/lib/i18n/i18n-svelte";
- import { loadLocaleAsync } from "$app/lib/i18n/i18n-util.async";
- import { i18nObject } from "$app/lib/i18n/i18n-util";
-
- let online = true;
- let notOnlineText;
- let LL;
-
- console.log("Projects Startup Report", {
- prefferedLocale: navigator.language,
- timeZone: Temporal.Now.timeZone().id,
- themeCookie: {name: CookieNames.theme, value: get_cookie(CookieNames.theme)},
- localeCookie: {name: CookieNames.locale, value: get_cookie(CookieNames.locale)},
- prefersColorScheme: window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"
- });
-
- currentLocale.subscribe(async locale => {
- if (locale === "preffered") locale = preffered_or_default();
- await loadLocaleAsync(locale as Locales);
- LL = i18nObject(locale as Locales);
- setLocale(locale as Locales);
- });
-
- onMount(async () => {
- await loadLocaleAsync($currentLocale);
- LL = i18nObject($currentLocale);
- setLocale($currentLocale);
- notOnlineText = LL.messages.noInternet();
- });
-
- async function user_is_logged_in() {
- if (!await is_active()) {
- await logout_user("expired");
- }
- return true;
- }
-
- const queryClient = new QueryClient();
-
- const routes = {
- "/home": wrap({
- component: Home,
- conditions: [user_is_logged_in],
- }),
- "/": wrap({
- component: Home,
- conditions: [user_is_logged_in],
- }),
- "/settings": wrap({
- component: Settings,
- conditions: [user_is_logged_in],
- }),
- "/data": wrap({
- component: Data,
- conditions: [user_is_logged_in],
- }),
- "/ui-workbench": UiWorkbench,
- "*": NotFound,
- };
-</script>
-
-<PreHeader show="{!online}">{notOnlineText}</PreHeader>
-
-<QueryClientProvider client={queryClient}>
- <Router
- {routes}
- restoreScrollState={true}
- on:routeLoading={() => {
- document.getElementById("loader").style.display = "inline-block";
- }}
- on:routeLoaded={() => {
- document.getElementById("loader").style.display = "none";
- }}
- />
-</QueryClientProvider>
diff --git a/apps/projects/src/app/index.ts b/apps/projects/src/app/index.ts
deleted file mode 100644
index febb583..0000000
--- a/apps/projects/src/app/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-// @ts-ignore
-import App from "./index.svelte";
-import "./index.scss";
-import {is_debug, is_development} from "$shared/lib/configuration";
-import {noop} from "$shared/lib/helpers";
-
-if (is_development() || is_debug()) {
- console.log("%c Debug", "background-color:yellow;color:black;font-size:18px;");
-} else {
- console.log("%c Production; Suppressing logs", "background-color:yellow;color:black;font-size:18px;");
- console.log = noop;
-}
-
-export default new App({
- target: document.getElementById("root"),
-});
diff --git a/apps/projects/src/app/lib/services/user-service.ts b/apps/projects/src/app/lib/services/user-service.ts
deleted file mode 100644
index 4155819..0000000
--- a/apps/projects/src/app/lib/services/user-service.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {portal_base} from "$shared/lib/configuration";
-import {end_session} from "$shared/lib/session";
-import {clear_categories} from "$app/lib/stores/categories";
-import {clear_entries} from "$app/lib/stores/entries";
-import {clear_labels} from "$app/lib/stores/labels";
-
-export async function logout_user(reason: string = "") {
- await end_session(() => {
- clear_categories();
- clear_labels();
- clear_entries();
- location.replace(portal_base("#/login" + (reason ? "?" + reason : "")));
- });
-}
diff --git a/apps/projects/src/app/lib/stores/categories.ts b/apps/projects/src/app/lib/stores/categories.ts
deleted file mode 100644
index 2a63c42..0000000
--- a/apps/projects/src/app/lib/stores/categories.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import {writable, get} from "svelte/store";
-import {create_time_category, delete_time_category, get_time_categories} from "$shared/lib/api/time-entry";
-import type {TimeCategoryDto} from "$shared/lib/models/TimeCategoryDto";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
-
-const categories = writable<Array<TimeCategoryDto>>([]);
-
-export async function reload_categories() {
- const get_categories_response = await get_time_categories();
- if (!get_categories_response.ok) {
- clear_categories();
- return;
- }
- categories.set(get_categories_response.data ?? []);
-}
-
-export function clear_categories() {
- categories.set([]);
-}
-
-export async function create_category_async(request: TimeCategoryDto): Promise<IInternalFetchResponse> {
- const create_entry_response = await create_time_category(request);
- if (create_entry_response.ok) {
- const stored_entries = get(categories);
- stored_entries.push(create_entry_response.data);
- categories.set(stored_entries);
- }
- return create_entry_response;
-}
-
-export async function edit_category_async(entry: TimeCategoryDto) {
- if (!entry.id) return;
-}
-
-export async function delete_category_async(entry: TimeCategoryDto) {
- if (!entry.id) return;
- const http_request = await delete_time_category(entry.id);
- if (http_request.ok) {
- const stored_entries = get(categories);
- categories.set(stored_entries.filter(e => e.id !== entry.id));
- }
-}
-
-export default categories;
diff --git a/apps/projects/src/app/lib/stores/entries.ts b/apps/projects/src/app/lib/stores/entries.ts
deleted file mode 100644
index e933568..0000000
--- a/apps/projects/src/app/lib/stores/entries.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import {Temporal} from "@js-temporal/polyfill";
-import {writable, get} from "svelte/store";
-import {get_time_entries, create_time_entry, delete_time_entry, update_time_entry} from "$shared/lib/api/time-entry";
-import type {TimeEntryDto} from "$shared/lib/models/TimeEntryDto";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
-import type {TimeEntryQuery} from "$shared/lib/models/TimeEntryQuery";
-
-const entries = writable<Array<TimeEntryDto>>([]);
-
-export function get_time_entry(id: string): TimeEntryDto {
- return get(entries).find(c => c.id === id);
-}
-
-export async function reload_entries(query: TimeEntryQuery): Promise<void> {
- const get_entries_response = await get_time_entries(query);
- if (!get_entries_response.ok) {
- clear_entries();
- return;
- }
- entries.set(get_default_sorted(get_entries_response.data?.results ?? []));
-}
-
-export function clear_entries() {
- entries.set([]);
-}
-
-function get_default_sorted(unsorted: Array<TimeEntryDto>): Array<TimeEntryDto> {
- if (unsorted.length < 1) return unsorted;
- const byStart = unsorted.sort((a, b) => {
- return Temporal.Instant.compare(Temporal.Instant.from(b.start), Temporal.Instant.from(a.start));
- });
-
- return byStart.sort((a, b) => {
- return Temporal.Instant.compare(Temporal.Instant.from(b.stop), Temporal.Instant.from(a.stop));
- });
-}
-
-export async function create_entry_async(request: TimeEntryDto): Promise<IInternalFetchResponse> {
- const create_entry_response = await create_time_entry(request);
- if (create_entry_response.ok) {
- const stored_entries = get(entries) ?? [];
- stored_entries.push(create_entry_response.data);
- entries.set(get_default_sorted(stored_entries));
- }
- return create_entry_response;
-}
-
-export async function edit_entry_async(request: TimeEntryDto): Promise<IInternalFetchResponse> {
- if (!request.id) return;
- const edit_entry_response = await update_time_entry(request);
- if (edit_entry_response.ok) {
- const stored_entries = get(entries) ?? [];
- const index = stored_entries.findIndex(c => c.id === request.id);
- if (index === -1) {
- stored_entries.push(edit_entry_response.data);
- } else {
- stored_entries[index] = edit_entry_response.data;
- }
- entries.set(get_default_sorted(stored_entries));
- }
- return edit_entry_response;
-}
-
-export async function delete_entry_async(entry_id: string): Promise<void> {
- if (!entry_id) throw new Error("No id was supplied when deleting query");
- const delete_entry_response = await delete_time_entry(entry_id);
- if (delete_entry_response.ok) {
- const stored_entries = get(entries) ?? [];
- entries.set(get_default_sorted(stored_entries.filter((e) => e.id !== entry_id) ?? []));
- }
-}
-
-
-export default entries;
diff --git a/apps/projects/src/app/lib/stores/labels.ts b/apps/projects/src/app/lib/stores/labels.ts
deleted file mode 100644
index d5ffaa9..0000000
--- a/apps/projects/src/app/lib/stores/labels.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import {writable, get} from "svelte/store";
-import {create_time_label, delete_time_label, get_time_labels} from "$shared/lib/api/time-entry";
-import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
-import type {TimeLabelDto} from "$shared/lib/models/TimeLabelDto";
-
-const labels = writable<Array<TimeLabelDto>>([]);
-
-export async function reload_labels() {
- const get_labels_response = await get_time_labels();
- if (!get_labels_response.ok) {
- clear_labels();
- return;
- }
- labels.set(get_labels_response.data ?? []);
-}
-
-export function clear_labels() {
- labels.set([]);
-}
-
-export async function create_label_async(request: TimeLabelDto): Promise<IInternalFetchResponse> {
- const create_label_response = await create_time_label(request);
- if (create_label_response.ok) {
- const stored_entries = get(labels) ?? [];
- stored_entries.push(create_label_response.data);
- labels.set(stored_entries);
- }
- return create_label_response;
-}
-
-export async function edit_label_async(entry: TimeLabelDto) {
- if (!entry.id) throw new Error("Label id is required");
-}
-
-export async function delete_label_async(entry: TimeLabelDto) {
- if (!entry.id) return;
- const http_request = await delete_time_label(entry.id);
- if (http_request.ok) {
- const stored_entries = get(labels) ?? [];
- labels.set(stored_entries.filter(e => e.id !== entry.id));
- }
-}
-
-export default labels;
diff --git a/apps/projects/src/app/pages/_layout.svelte b/apps/projects/src/app/pages/_layout.svelte
deleted file mode 100644
index 07a4a25..0000000
--- a/apps/projects/src/app/pages/_layout.svelte
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
- import {onMount} from "svelte";
- import {location, link} from "svelte-spa-router";
- import {logout_user} from "$app/lib/services/user-service";
- import {random_string} from "$shared/lib/helpers";
- import {get_session_data} from "$shared/lib/session";
- import ProfileModal from "$app/pages/views/profile-modal.svelte";
- import {Menu, MenuItem, MenuItemSeparator} from "$shared/components/menu";
- import Button from "$shared/components/button.svelte";
- import {IconNames} from "$shared/lib/configuration";
- import LL from "$app/lib/i18n/i18n-svelte";
- import BlowoutToolbelt from "$shared/components/blowout-toolbelt.svelte";
- import {NavWrapper, NavItem} from "./nav";
-
- let ProfileModalFunctions = {};
- let showUserMenu = false;
- let userMenuTriggerNode;
- const userMenuId = "__menu_" + random_string(3);
- const username = get_session_data()?.profile.username;
-
- onMount(() => {
- userMenuTriggerNode = document.getElementById("open-user-menu");
- });
-</script>
-
-<ProfileModal bind:functions={ProfileModalFunctions}/>
-<BlowoutToolbelt/>
-
-<NavWrapper>
- <ul slot="navigation-items">
- <NavItem to="/home" text="{$LL.nav.home()}"/>
- <NavItem to="/data" text="{$LL.nav.data()}"/>
- <NavItem to="/settings" text="{$LL.nav.settings()}"/>
- </ul>
- <div slot="navigation-footer" class="tabs-nav-v2 justify-between">
- <div class="tab-v2 padding-x-sm">
- <Button class="user-menu-control"
- variant="reset"
- id="open-user-menu"
- on:click={() => showUserMenu = !showUserMenu}
- text={username}
- icon={IconNames.chevronDown}
- icon_width="2rem"
- icon_height="2rem"
- icon_right_aligned="true"
- title="{$LL.nav.usermenu.toggleTitle()}"
- aria-controls="{userMenuId}"
- />
- <Menu bind:show="{showUserMenu}"
- trigger={userMenuTriggerNode}
- id="{userMenuId}">
- <div slot="options">
- <MenuItem on:click={() => ProfileModalFunctions.open()}>
- <span title="{$LL.nav.usermenu.profileTitle()}">{$LL.nav.usermenu.profile()}</span>
- </MenuItem>
- <MenuItemSeparator/>
- <MenuItem danger="true"
- on:click={() => logout_user()}>
- <span title="{$LL.nav.usermenu.logoutTitle()}">{$LL.nav.usermenu.logout()}</span>
- </MenuItem>
- </div>
- </Menu>
- </div>
- </div>
- <slot slot="main-content"/>
-</NavWrapper> \ No newline at end of file
diff --git a/apps/projects/src/app/pages/data.svelte b/apps/projects/src/app/pages/data.svelte
deleted file mode 100644
index 190c641..0000000
--- a/apps/projects/src/app/pages/data.svelte
+++ /dev/null
@@ -1,396 +0,0 @@
-<script>
- import {IconNames} from "$shared/lib/configuration";
- import {onMount} from "svelte";
- import {Temporal} from "@js-temporal/polyfill";
- import Layout from "./_layout.svelte";
- import Modal from "$shared/components/modal.svelte";
- import Tile from "$shared/components/tile.svelte";
- import Icon from "$shared/components/icon.svelte";
- import EntryForm from "$app/pages/views/entry-form/index.svelte";
- import {Table, THead, TBody, TCell, TRow, TablePaginator} from "$shared/components/table";
- import {TimeEntryQueryDuration} from "$shared/lib/models/TimeEntryQuery";
- import {delete_time_entry, get_time_entries, get_time_entry} from "$shared/lib/api/time-entry";
- import {seconds_to_hour_minute_string, is_guid, move_focus, unwrap_date_time_from_entry} from "$shared/lib/helpers";
- import Button from "$shared/components/button.svelte";
- import LL from "$app/lib/i18n/i18n-svelte";
-
- let pageCount = 1;
- let page = 1;
-
- const defaultQuery = {
- duration: TimeEntryQueryDuration.THIS_YEAR,
- categories: [],
- labels: [],
- page: page,
- pageSize: 50,
- };
-
- let isLoading;
- let categories = [];
- let labels = [];
- let entries = [];
- let durationSummary = false;
- let EditEntryModal;
- let EditEntryForm;
- let currentTimespanFilter = TimeEntryQueryDuration.THIS_YEAR;
- let currentSpecificDateFilter = Temporal.Now.plainDateTimeISO().subtract({days: 1}).toString().substring(0, 10);
- let currentDateRangeFilter = {};
- let currentCategoryFilter = "all";
- let currentLabelFilter = "all";
- let showDateFilterOptions = false;
- let secondsLogged = 0;
-
- function set_duration_summary_string() {
- if (entries.length > 0) {
- durationSummary = $LL.data.durationSummary({
- entryCountString: `${entries.length} ${entries.length === 1 ? $LL.data.entry() : $LL.data.entries()}`,
- totalHourMin: seconds_to_hour_minute_string(secondsLogged)
- });
- } else {
- durationSummary = "";
- }
- }
-
- async function load_entries(query = defaultQuery) {
- isLoading = true;
- const response = await get_time_entries(query);
- if (response.status === 200) {
- const responseEntries = [];
- secondsLogged = 0;
- for (const entry of response.data.results) {
- const date_time = unwrap_date_time_from_entry(entry);
- const seconds = (date_time.duration.hours * 60 * 60) + (date_time.duration.minutes * 60);
- responseEntries.push({
- id: entry.id,
- date: date_time.start_date,
- start: date_time.start_time,
- stop: date_time.stop_time,
- durationString: date_time.duration.hours + $LL.data.hourSingleChar() + date_time.duration.minutes + $LL.data.minSingleChar(),
- seconds: seconds,
- category: entry.category,
- labels: entry.labels,
- description: entry.description,
- });
- secondsLogged += seconds;
- }
- entries = responseEntries;
- page = response.data.page;
- pageCount = response.data.totalPageCount;
- } else {
- entries = [];
- page = 0;
- pageCount = 0;
- }
- isLoading = false;
- set_duration_summary_string();
- }
-
- function load_entries_with_filter(page = 1) {
- let query = defaultQuery;
- query.duration = currentTimespanFilter;
- query.labels = [];
- query.categories = [];
- query.page = page;
-
- if (currentTimespanFilter === TimeEntryQueryDuration.SPECIFIC_DATE) {
- query.specificDate = currentSpecificDateFilter;
- } else {
- delete query.specificDate;
- }
-
- if (currentTimespanFilter === TimeEntryQueryDuration.DATE_RANGE) {
- query.dateRange = currentDateRangeFilter;
- } else {
- delete query.dateRange;
- }
-
- if ((currentCategoryFilter !== "all" && currentCategoryFilter?.length > 0) ?? false) {
- for (const chosenCategoryId of currentCategoryFilter) {
- if (chosenCategoryId === "all") {
- continue;
- }
- query.categories.push({
- id: chosenCategoryId,
- });
- }
- }
-
- if ((currentLabelFilter !== "all" && currentLabelFilter?.length > 0) ?? false) {
- for (const chosenLabelId of currentLabelFilter) {
- if (chosenLabelId === "all") {
- continue;
- }
- query.labels.push({
- id: chosenLabelId,
- });
- }
- }
-
- load_entries(query);
- }
-
- async function handle_delete_entry_button_click(e, entryId) {
- if (confirm($LL.data.confirmDeleteEntry())) {
- const response = await delete_time_entry(entryId);
- if (response.ok) {
- const indexOfEntry = entries.findIndex((c) => c.id === entryId);
- if (indexOfEntry !== -1) {
- secondsLogged -= entries[indexOfEntry].seconds;
- entries.splice(indexOfEntry, 1);
- entries = entries;
- set_duration_summary_string();
- }
- }
- }
- }
-
- function handle_edit_entry_form_updated() {
- load_entries_with_filter(page);
- EditEntryModal.close();
- }
-
- async function handle_edit_entry_button_click(event, entryId) {
- const response = await get_time_entry(entryId);
- if (response.status === 200) {
- if (is_guid(response.data.id)) {
- EditEntryForm.set_values(response.data);
- EditEntryModal.open();
- move_focus(document.querySelector("input[id='date']"));
- }
- }
- }
-
- function close_date_filter_box(event) {
- if (!event.target.closest(".date_filter_box_el")) {
- showDateFilterOptions = false;
- window.removeEventListener("click", close_date_filter_box);
- }
- }
-
- function toggle_date_filter_box(event) {
- const box = document.getElementById("date_filter_box");
- const rect = event.target.getBoundingClientRect();
- box.style.top = rect.y + "px";
- box.style.left = rect.x - 50 + "px";
- showDateFilterOptions = true;
- window.addEventListener("click", close_date_filter_box);
- }
-
- onMount(() => {
- isLoading = true;
- Promise.all([load_entries()]).then(() => {
- isLoading = false;
- });
- });
-</script>
-
-<Modal title="{$LL.data.editEntry()}"
- bind:functions={EditEntryModal}
- on:closed={() => EditEntryForm.reset()}>
- <EntryForm bind:functions={EditEntryForm}
- on:updated={handle_edit_entry_form_updated}/>
-</Modal>
-
-<div id="date_filter_box"
- style="margin-top:25px"
- class="padding-xs z-index-overlay bg shadow-sm position-absolute date_filter_box_el border {showDateFilterOptions ? '' : 'hide'}">
- <div class="flex items-baseline margin-bottom-xxxxs">
- <label class="text-sm color-contrast-medium margin-right-xs"
- for="durationSelect">Timespan:</label>
- <div class="select inline-block js-select">
- <select name="durationSelect"
- bind:value={currentTimespanFilter}
- id="durationSelect">
- <option value={TimeEntryQueryDuration.TODAY}
- selected> Today
- </option>
- <option value={TimeEntryQueryDuration.THIS_WEEK}>This week</option>
- <option value={TimeEntryQueryDuration.THIS_MONTH}>This month</option>
- <option value={TimeEntryQueryDuration.THIS_YEAR}>This year</option>
- <option value={TimeEntryQueryDuration.SPECIFIC_DATE}>Spesific date</option>
- <option value={TimeEntryQueryDuration.DATE_RANGE}>Date range</option>
- </select>
-
- <svg class="icon icon--xxxs margin-left-xxs"
- viewBox="0 0 8 8">
- <path d="M7.934,1.251A.5.5,0,0,0,7.5,1H.5a.5.5,0,0,0-.432.752l3.5,6a.5.5,0,0,0,.864,0l3.5-6A.5.5,0,0,0,7.934,1.251Z"/>
- </svg>
- </div>
- </div>
-
- {#if currentTimespanFilter === TimeEntryQueryDuration.SPECIFIC_DATE}
- <div class="flex items-baseline margin-bottom-xxxxs justify-between">
- <span class="text-sm color-contrast-medium margin-right-xs">{$LL.data.date()}:</span>
- <span class="text-sm">
- <input type="date"
- class="border-none padding-0 color-inherit bg-transparent"
- bind:value={currentSpecificDateFilter}/>
- </span>
- </div>
- {/if}
-
- {#if currentTimespanFilter === TimeEntryQueryDuration.DATE_RANGE}
- <div class="flex items-baseline margin-bottom-xxxxs justify-between">
- <span class="text-sm color-contrast-medium margin-right-xs">{$LL.data.from()}:</span>
- <span class="text-sm">
- <input type="date"
- class="border-none padding-0 color-inherit bg-transparent"
- on:change={(e) => (currentDateRangeFilter.from = e.target.value)}/>
- </span>
- </div>
-
- <div class="flex items-baseline margin-bottom-xxxxs justify-between">
- <span class="text-sm color-contrast-medium margin-right-xs">{$LL.data.to()}:</span>
- <span class="text-sm">
- <input type="date"
- class="border-none padding-0 color-inherit bg-transparent"
- on:change={(e) => (currentDateRangeFilter.to = e.target.value)}/>
- </span>
- </div>
- {/if}
-
- <div class="flex items-baseline justify-end">
- <Button variant="subtle"
- on:click={() => load_entries_with_filter(page)}
- class="text-sm"
- text="{$LL.data.use()}"/>
- </div>
-</div>
-
-<Layout>
- <Tile class="{isLoading ? 'c-disabled loading' : ''}">
- <nav class="s-tabs text-sm hide">
- <ul class="s-tabs__list">
- <li><span class="s-tabs__link s-tabs__link--current">All (21)</span></li>
- <li><span class="s-tabs__link">Published (19)</span></li>
- <li><span class="s-tabs__link">Draft (2)</span></li>
- </ul>
- </nav>
- <div class="max-width-100% overflow-auto"
- style="max-height: 82.5vh">
- <Table class="text-sm width-100% int-table--sticky-header">
- <THead>
- <TCell type="th"
- style="width: 30px;">
- <div class="custom-checkbox int-table__checkbox">
- <input class="custom-checkbox__input"
- type="checkbox"
- aria-label="Select all rows"/>
- <div class="custom-checkbox__control"
- aria-hidden="true"></div>
- </div>
- </TCell>
-
- <TCell type="th"
- style="width: 100px">
- <div class="flex items-center justify-between">
- <span>{$LL.data.date()}</span>
- <div class="date_filter_box_el cursor-pointer"
- on:click={toggle_date_filter_box}>
- <Icon name="{IconNames.funnel}"/>
- </div>
- </div>
- </TCell>
-
- <TCell type="th"
- style="width: 100px">
- <div class="flex items-center">
- <span>{$LL.data.duration()}</span>
- </div>
- </TCell>
-
- <TCell type="th"
- style="width: 100px;">
- <div class="flex items-center">
- <span>{$LL.data.category()}</span>
- </div>
- </TCell>
-
- <TCell type="th"
- style="width: 300px;">
- <div class="flex items-center">
- <span>{$LL.data.description()}</span>
- </div>
- </TCell>
- <TCell type="th"
- style="width: 50px"></TCell>
- </THead>
- <TBody>
- {#if entries.length > 0}
- {#each entries as entry}
- <TRow class="text-nowrap"
- data-id={entry.id}>
- <TCell type="th"
- thScope="row">
- <div class="custom-checkbox int-table__checkbox">
- <input class="custom-checkbox__input"
- type="checkbox"
- aria-label="Select this row"/>
- <div class="custom-checkbox__control"
- aria-hidden="true"></div>
- </div>
- </TCell>
- <TCell>
- <pre>{entry.date.toLocaleString()}</pre>
- </TCell>
- <TCell>
- <pre class="flex justify-between">
- <div class="flex justify-between">
- <span>{entry.start.toLocaleString(undefined, {timeStyle: "short"})}</span>
- <span> - </span>
- <span>{entry.stop.toLocaleString(undefined, {timeStyle: "short"})}</span>
- </div>
- </pre>
- </TCell>
- <TCell>
- <span data-id={entry.category.id}>{entry.category.name}</span>
- </TCell>
- <TCell class="text-truncate max-width-xxxxs"
- title="{entry.description}">
- {entry.description ?? ""}
- </TCell>
- <TCell class="flex flex-row justify-end items-center">
- <Button icon="{IconNames.pencilSquare}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={(e) => handle_edit_entry_button_click(e, entry.id)}
- title="Edit entry"/>
- <Button icon="{IconNames.trash}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={(e) => handle_delete_entry_button_click(e, entry.id)}
- title="Delete entry"/>
- </TCell>
- </TRow>
- {/each}
- {:else}
- <TRow class="text-nowrap">
- <TCell type="th"
- thScope="row"
- colspan="7">
- {isLoading ? $LL.data.loading() + "..." : $LL.data.noEntries()}
- </TCell>
- </TRow>
- {/if}
- </TBody>
- </Table>
- </div>
- <div class="flex items-center justify-between">
- <p class="text-sm">
- {#if durationSummary}
- <small class={isLoading ? "c-disabled loading" : ""}>{durationSummary}</small>
- {:else}
- <small class={isLoading ? "c-disabled loading" : ""}>{$LL.data.noEntries()}</small>
- {/if}
- </p>
-
- <nav class="grid padding-y-sm {isLoading ? 'c-disabled loading' : ''}">
- <TablePaginator {page}
- on:value_change={(e) => load_entries_with_filter(e.detail.newValue)}
- {pageCount}/>
- </nav>
- </div>
- </Tile>
-</Layout>
diff --git a/apps/projects/src/app/pages/home.svelte b/apps/projects/src/app/pages/home.svelte
deleted file mode 100644
index 1f398b5..0000000
--- a/apps/projects/src/app/pages/home.svelte
+++ /dev/null
@@ -1,178 +0,0 @@
-<script lang="ts">
- import LL from "$app/lib/i18n/i18n-svelte";
- import { delete_time_entry, get_time_entries, get_time_entry } from "$shared/lib/api/time-entry";
- import { IconNames, QueryKeys } from "$shared/lib/configuration";
- import { TimeEntryDto } from "$shared/lib/models/TimeEntryDto";
- import { Temporal } from "@js-temporal/polyfill";
- import { useMutation, useQuery, useQueryClient } from "@sveltestack/svelte-query";
- import { onMount } from "svelte";
- import Tile from "$shared/components/tile.svelte";
- import Button from "$shared/components/button.svelte";
- import Stopwatch from "$shared/components/stopwatch.svelte";
- import { Table, THead, TBody, TCell, TRow } from "$shared/components/table";
- import Layout from "./_layout.svelte";
- import EntryFrom from "$app/pages/views/entry-form/index.svelte";
- import { seconds_to_hour_minute, unwrap_date_time_from_entry } from "$shared/lib/helpers";
- import { TimeEntryQueryDuration } from "$shared/lib/models/TimeEntryQuery";
-
- let currentTime = "";
- let isLoading = false;
- let EditEntryForm: any;
- let timeEntries = [] as Array<TimeEntryDto>;
- let timeLoggedTodayString = $LL.home.loggedTimeTodayString({hours: 0, minutes: 0});
- let loggedSecondsToday = 0;
-
- const queryClient = useQueryClient();
- const queryResult = useQuery(QueryKeys.entries, async () => await get_time_entries({
- duration: TimeEntryQueryDuration.TODAY,
- page: 1,
- pageSize: 100,
- })?.data ?? []
- );
-
- function set_current_time() {
- currentTime = Temporal.Now.plainTimeISO().toLocaleString(undefined, {
- timeStyle: "short",
- });
- }
-
- const delete_entry_mutation = useMutation(delete_time_entry, {
- onSuccess: (data) => {
- queryClient.invalidateQueries([QueryKeys.entries, data.data.id]);
- },
- });
-
- async function on_edit_entry_button_click(event, entryId: string) {
- const response = useQuery([QueryKeys.entries, entryId], () => {
- return get_time_entry(entryId);
- });
-
- EditEntryForm.set_values(response);
- }
-
- async function on_delete_entry_button_click(event, entryId: string) {
- if (confirm($LL.home.confirmDeleteEntry())) {
- $delete_entry_mutation.mutate(entryId);
- }
- }
-
- function on_create_from_stopwatch(event) {
- EditEntryForm.set_time({to: event.detail.to, from: event.detail.from});
- if (event.detail.description) {
- EditEntryForm.set_description(event.detail.description);
- }
- }
-
- onMount(async () => {
- set_current_time();
- setInterval(() => {
- set_current_time();
- }, 1e4);
- queryResult.subscribe((result) => {
- const newEntries = [];
- loggedSecondsToday = 0;
- for (const entry of result.data?.results ?? []) {
- const date_time = unwrap_date_time_from_entry(entry);
- newEntries.push({
- id: entry.id,
- start: date_time.start_time,
- stop: date_time.stop_time,
- category: entry.category,
- });
- loggedSecondsToday += (date_time.duration.hours * 60 * 60) + (date_time.duration.minutes * 60);
- }
- timeLoggedTodayString = $LL.home.loggedTimeTodayString(seconds_to_hour_minute(loggedSecondsToday));
- timeEntries = newEntries;
- });
- });
-</script>
-
-<Layout>
- <div class="grid gap-md margin-top-xs flex-row@md items-start flex-column-reverse">
- <Tile class="col">
- <h3 class="text-md padding-bottom-xxxs">{$LL.home.newEntry()}</h3>
- <EntryFrom bind:functions={EditEntryForm}/>
- </Tile>
- <div class="col grid gap-sm">
- <Tile class="col-6@md col-12">
- <p class="text-xxl">{timeLoggedTodayString}</p>
- <p class="text-xs margin-bottom-xxs">{$LL.home.loggedTimeToday()}</p>
- <pre class="text-xxl">{currentTime}</pre>
- <p class="text-xs">{$LL.home.currentTime()}</p>
- </Tile>
- <Tile class="col-6@md col-12">
- <Stopwatch on:create={on_create_from_stopwatch}>
- <h3 slot="header"
- class="text-md">{$LL.home.stopwatch()}</h3>
- </Stopwatch>
- </Tile>
- <Tile class="col-12">
- <h3 class="text-md padding-bottom-xxxs">{$LL.home.todayEntries()}</h3>
- <div class="max-width-100% overflow-auto">
- <Table class="width-100% text-sm">
- <THead>
- <TCell type="th"
- class="text-left">
- <span>{$LL.home.category()}</span>
- </TCell>
- <TCell type="th"
- class="text-left">
- <span>{$LL.home.timespan()}</span>
- </TCell>
- <TCell type="th"
- class="text-right">
- <Button icon="{IconNames.refresh}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- title="{$LL.home.refreshTodayEntries()}"
- on:click={() => queryClient.invalidateQueries(QueryKeys.entries)}/>
- </TCell>
- </THead>
- <TBody>
- {#if timeEntries.length > 0}
- {#each timeEntries as entry}
- <TRow class="text-nowrap text-left"
- data-id={entry.id}>
- <TCell>
- <span data-id={entry.category?.id}>
- {entry.category?.name}
- </span>
- </TCell>
- <TCell>
- {entry.start.toLocaleString(undefined, {timeStyle: "short"})}
- <span>-</span>
- {entry.stop.toLocaleString(undefined, {timeStyle: "short"})}
- </TCell>
- <TCell class="flex flex-row justify-end items-center">
- <Button icon="{IconNames.pencilSquare}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={(e) => on_edit_entry_button_click(e, entry.id)}
- title="{$LL.home.editEntry()}"/>
- <Button icon="{IconNames.trash}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={(e) => on_delete_entry_button_click(e, entry.id)}
- title="{$LL.home.deleteEntry()}"/>
- </TCell>
- </TRow>
- {/each}
- {:else}
- <TRow class="text-nowrap">
- <TCell type="th"
- thScope="row"
- colspan="7">
- {isLoading ? $LL.home.loading() + "..." : $LL.home.noEntriesToday()}
- </TCell>
- </TRow>
- {/if}
- </TBody>
- </Table>
- </div>
- </Tile>
- </div>
- </div>
-</Layout>
diff --git a/apps/projects/src/app/pages/nav/css/1_responsive-sidebar.css b/apps/projects/src/app/pages/nav/css/1_responsive-sidebar.css
deleted file mode 100644
index 515a9f2..0000000
--- a/apps/projects/src/app/pages/nav/css/1_responsive-sidebar.css
+++ /dev/null
@@ -1,179 +0,0 @@
-/* --------------------------------
-
-File#: _1_responsive-sidebar
-Title: Responsive Sidebar
-Descr: Responsive sidebar container
-Usage: codyhouse.co/license
-
--------------------------------- */
-/* mobile version only (--default) 👇 */
-.sidebar:not(.sidebar--static) {
- position: fixed;
- top: 0;
- left: 0;
- z-index: var(--z-index-fixed-element, 10);
- width: 100%;
- height: 100%;
- visibility: hidden;
- transition: visibility 0s 0.3s;
-}
-.sidebar:not(.sidebar--static)::after {
- /* overlay layer */
- content: "";
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: hsla(var(--color-black-h), var(--color-black-s), var(--color-black-l), 0);
- transition: background-color 0.3s;
- z-index: 1;
-}
-.sidebar:not(.sidebar--static) .sidebar__panel {
- /* content */
- position: absolute;
- top: 0;
- left: 0;
- z-index: 2;
- width: 100%;
- max-width: 380px;
- height: 100%;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- background-color: var(--color-bg);
- -webkit-transform: translateX(-100%);
- transform: translateX(-100%);
- transition: box-shadow 0.3s, -webkit-transform 0.3s;
- transition: box-shadow 0.3s, transform 0.3s;
- transition: box-shadow 0.3s, transform 0.3s, -webkit-transform 0.3s;
-}
-.sidebar:not(.sidebar--static).sidebar--right-on-mobile .sidebar__panel {
- left: auto;
- right: 0;
- -webkit-transform: translateX(100%);
- transform: translateX(100%);
-}
-.sidebar:not(.sidebar--static).sidebar--is-visible {
- visibility: visible;
- transition: none;
-}
-.sidebar:not(.sidebar--static).sidebar--is-visible::after {
- background-color: hsla(var(--color-black-h), var(--color-black-s), var(--color-black-l), 0.85);
-}
-.sidebar:not(.sidebar--static).sidebar--is-visible .sidebar__panel {
- -webkit-transform: translateX(0);
- transform: translateX(0);
- box-shadow: var(--shadow-md);
-}
-
-/* end mobile version */
-.sidebar__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- position: -webkit-sticky;
- position: sticky;
- top: 0;
-}
-
-.sidebar__close-btn {
- --size: 32px;
- width: var(--size);
- height: var(--size);
- display: flex;
- border-radius: 50%;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
- transition: 0.2s;
- flex-shrink: 0;
-}
-.sidebar__close-btn .icon {
- display: block;
- margin: auto;
-}
-.sidebar__close-btn:hover {
- background-color: var(--color-bg-lighter);
- box-shadow: var(--inner-glow), var(--shadow-md);
-}
-
-/* desktop version only (--static) 👇 */
-.sidebar--static {
- flex-shrink: 0;
- flex-grow: 1;
-}
-.sidebar--static .sidebar__header {
- display: none;
-}
-
-.sidebar--sticky-on-desktop {
- position: -webkit-sticky;
- position: sticky;
- top: var(--space-sm);
- max-height: calc(100vh - var(--space-sm));
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-
-/* end desktop version */
-.sidebar, .sidebar-loaded\:show {
- opacity: 0;
- /* hide sidebar - or other elements using the .sidebar-loaded:show class - while it is initialized in JS */
-}
-
-.sidebar--loaded {
- opacity: 1;
-}
-
-/* detect when the sidebar needs to switch from the mobile layout to a static one - used in JS */
-[class*=sidebar--static]::before {
- display: none;
-}
-
-.sidebar--static::before {
- content: "static";
-}
-
-.sidebar--static\@xs::before {
- content: "mobile";
-}
-@media (min-width: 32rem) {
- .sidebar--static\@xs::before {
- content: "static";
- }
-}
-
-.sidebar--static\@sm::before {
- content: "mobile";
-}
-@media (min-width: 48rem) {
- .sidebar--static\@sm::before {
- content: "static";
- }
-}
-
-.sidebar--static\@md::before {
- content: "mobile";
-}
-@media (min-width: 64rem) {
- .sidebar--static\@md::before {
- content: "static";
- }
-}
-
-.sidebar--static\@lg::before {
- content: "mobile";
-}
-@media (min-width: 80rem) {
- .sidebar--static\@lg::before {
- content: "static";
- }
-}
-
-.sidebar--static\@xl::before {
- content: "mobile";
-}
-@media (min-width: 90rem) {
- .sidebar--static\@xl::before {
- content: "static";
- }
-} \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/css/2_side-navigation-v4.css b/apps/projects/src/app/pages/nav/css/2_side-navigation-v4.css
deleted file mode 100644
index ec5fcdf..0000000
--- a/apps/projects/src/app/pages/nav/css/2_side-navigation-v4.css
+++ /dev/null
@@ -1,213 +0,0 @@
-/* --------------------------------
-
-File#: _2_side-navigation-v4
-Title: Side Navigation v4
-Descr: Main, side navigation
-Usage: codyhouse.co/license
-
--------------------------------- */
-.sidenav-v4 {
- --sidenav-v4-icon-size: 20px;
- --sidenav-v4-icon-margin-right: var(--space-xxs);
-}
-
-.sidenav-v4__item {
- position: relative;
-}
-
-.sidenav-v4__link,
-.sidenav-v4__sub-link,
-.sidenav-v4__separator {
- padding: var(--space-sm);
-}
-
-.sidenav-v4__link, .sidenav-v4__sub-link {
- display: flex;
- align-items: center;
- width: 100%;
- border-radius: var(--radius-md);
- text-decoration: none;
- color: inherit;
- line-height: 1;
- font-size: var(--text-md);
- transition: 0.2s;
-}
-.sidenav-v4__link:hover, .sidenav-v4__sub-link:hover {
- color: var(--color-primary);
- background-color: hsla(var(--color-contrast-higher-h), var(--color-contrast-higher-s), var(--color-contrast-higher-l), 0.075);
-}
-.sidenav-v4__link[aria-current=page], .sidenav-v4__sub-link[aria-current=page] {
- color: var(--color-primary);
-}
-
-.sidenav-v4__sub-link {
- position: relative;
- color: var(--color-contrast-medium);
- /* dot indicator */
-}
-.sidenav-v4__sub-link::before {
- content: "";
- display: block;
- --size: 6px;
- width: var(--size);
- height: var(--size);
- background: currentColor;
- border-radius: 50%;
- margin-left: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2);
- margin-right: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2 + var(--sidenav-v4-icon-margin-right));
- opacity: 0;
- /* visible only if current */
-}
-.sidenav-v4__sub-link[aria-current=page]::before {
- /* show dot indicator */
- opacity: 1;
-}
-
-.sidenav-v4__notification-marker {
- margin-left: auto;
- background-color: var(--color-accent);
- border-radius: var(--radius-md);
- height: 16px;
- line-height: 16px;
- padding: 0 4px;
- color: var(--color-white);
- font-size: 12px;
- /* hide - visible only on desktop */
- display: none;
-}
-
-/* label icon */
-.sidenav-v4__icon {
- --size: var(--sidenav-v4-icon-size);
- margin-right: var(--sidenav-v4-icon-margin-right);
-}
-
-/* arrow icon - visible on mobile if item is expandable */
-.sidenav-v4__arrow-icon {
- --size: 20px;
- /* hide icon for links - show only for buttons created in JS */
-}
-.sidenav-v4__arrow-icon .icon__group {
- will-change: transform;
- -webkit-transform-origin: 50% 50%;
- transform-origin: 50% 50%;
- -webkit-transform: rotate(-90deg);
- transform: rotate(-90deg);
- transition: -webkit-transform 0.3s var(--ease-out);
- transition: transform 0.3s var(--ease-out);
- transition: transform 0.3s var(--ease-out), -webkit-transform 0.3s var(--ease-out);
-}
-.sidenav-v4__arrow-icon .icon__group > * {
- -webkit-transform-origin: 50% 50%;
- transform-origin: 50% 50%;
- stroke-dasharray: 20;
- stroke-dashoffset: 0;
- -webkit-transform: translateY(0px);
- transform: translateY(0px);
- transition: stroke-dashoffset 0.3s, -webkit-transform 0.3s;
- transition: transform 0.3s, stroke-dashoffset 0.3s;
- transition: transform 0.3s, stroke-dashoffset 0.3s, -webkit-transform 0.3s;
- transition-timing-function: var(--ease-out);
-}
-.sidenav-v4__item--collapsed .sidenav-v4__arrow-icon .icon__group {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
-}
-.sidenav-v4__item--collapsed .sidenav-v4__arrow-icon .icon__group > * {
- -webkit-transform: translateY(4px);
- transform: translateY(4px);
-}
-.sidenav-v4__item--collapsed .sidenav-v4__arrow-icon .icon__group > *:first-child {
- stroke-dashoffset: 10.15;
-}
-.sidenav-v4__item--collapsed .sidenav-v4__arrow-icon .icon__group > *:last-child {
- stroke-dashoffset: 10.15;
-}
-.sidenav-v4__link--href .sidenav-v4__arrow-icon {
- display: none;
-}
-
-/* current item */
-.sidenav-v4__item--current .sidenav-v4__sub-list {
- display: block;
- /* show sublist */
-}
-
-/* separator */
-.sidenav-v4__separator span {
- display: block;
- width: var(--sidenav-v4-icon-size);
- height: 1px;
- background-color: var(--color-contrast-lower);
-}
-
-/* mobile only */
-@media not all and (min-width: 64rem) {
- .sidenav-v4__item--collapsed .sidenav-v4__sub-list {
- display: none;
- }
-
- .sidenav-v4__link--href {
- display: none;
- /* hide link -> show button */
- }
-}
-/* desktop */
-@media (min-width: 64rem) {
- .sidenav-v4__sub-list {
- display: none;
- }
-
- .sidenav-v4__link,
-.sidenav-v4__sub-link,
-.sidenav-v4__separator {
- padding: var(--space-xs);
- }
-
- .sidenav-v4__link,
-.sidenav-v4__sub-link {
- font-size: var(--text-sm);
- }
-
- .sidenav-v4__link--btn {
- display: none;
- /* hide button -> show link */
- }
-
- /* tooltip */
- .sidenav-v4__item:not(.sidenav-v4__item--current) .sidenav-v4__sub-list {
- width: 220px;
- position: absolute;
- z-index: var(--z-index-overlay);
- left: 100%;
- top: 0;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-md);
- border-radius: var(--radius-md);
- overflow: hidden;
- }
- .sidenav-v4__item:not(.sidenav-v4__item--current) .sidenav-v4__sub-link {
- border-radius: 0;
- color: var(--color-contrast-high);
- }
- .sidenav-v4__item:not(.sidenav-v4__item--current) .sidenav-v4__sub-link::before {
- display: none;
- /* remove dot indicator */
- }
- .sidenav-v4__item:not(.sidenav-v4__item--current) .sidenav-v4__sub-link:hover {
- color: var(--color-primary);
- }
- .sidenav-v4__item:not(.sidenav-v4__item--current).sidenav-v4__item--hover .sidenav-v4__sub-list, .sidenav-v4__item:not(.sidenav-v4__item--current):focus-within .sidenav-v4__sub-list {
- display: block;
- }
- .sidenav-v4__item:not(.sidenav-v4__item--current):hover .sidenav-v4__link {
- /* highlight main link if tooltip is visible */
- color: var(--color-primary);
- background-color: hsla(var(--color-contrast-higher-h), var(--color-contrast-higher-s), var(--color-contrast-higher-l), 0.075);
- }
-
- /* notification marker */
- .sidenav-v4__notification-marker {
- display: block;
- }
-} \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/html/side-navigation-v4.html b/apps/projects/src/app/pages/nav/html/side-navigation-v4.html
deleted file mode 100644
index 1131b4d..0000000
--- a/apps/projects/src/app/pages/nav/html/side-navigation-v4.html
+++ /dev/null
@@ -1,211 +0,0 @@
-<div class="padding-component hide@md no-js:is-hidden">
- <button class="btn btn--primary" aria-controls="sidenav-v4">Show sidebar</button>
-</div>
-
-<div class="flex@md">
- <aside id="sidenav-v4" class="sidebar sidebar--static@md js-sidebar" data-static-class="position-relative z-index-2 bg width-100% max-width-xxxxs shadow-sm">
- <div class="sidebar__panel">
- <!-- 👇 header visible only on mobile -->
- <header class="sidebar__header bg padding-y-sm padding-left-md padding-right-sm border-bottom z-index-2">
- <h1 class="text-md text-truncate" id="sidebar-title">Menu</h1>
-
- <button class="reset sidebar__close-btn js-sidebar__close-btn js-tab-focus">
- <svg class="icon icon--xs" viewBox="0 0 16 16"><title>Close panel</title><g stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"><line x1="13.5" y1="2.5" x2="2.5" y2="13.5"></line><line x1="2.5" y1="2.5" x2="13.5" y2="13.5"></line></g></svg>
- </button>
- </header>
-
- <div class="position-relative z-index-1">
- <nav class="sidenav-v4 padding-xs js-sidenav-v4">
- <ul>
- <li class="sidenav-v4__item">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 12v7H4v-7"></path>
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 10l9-9 9 9"></path>
- <path d="M10 14a2 2 0 0 1 2 2v2H8v-2a2 2 0 0 1 2-2z"></path>
- </g>
- </svg>
-
- <span>Overview</span>
-
- <svg class="sidenav-v4__arrow-icon icon margin-left-auto" viewBox="0 0 20 20">
- <g class="icon__group" fill="none" stroke="currentColor" stroke-width="2px" stroke-linecap="round" stroke-linejoin="round">
- <line x1="3" y1="3" x2="17" y2="17" />
- <line x1="17" y1="3" x2="3" y2="17" />
- </g>
- </svg>
- </a>
-
- <ul class="sidenav-v4__sub-list">
- <li>
- <a class="sidenav-v4__sub-link" href="#0">All Data</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">Category 1</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">Category 2</a>
- </li>
- </ul>
- </li>
-
- <li class="sidenav-v4__item sidenav-v4__item--current">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <path d="M10 20a2 2 0 0 1-2-2h4a2 2 0 0 1-2 2z"></path>
- <path d="M19 15a3 3 0 0 1-3-3V7a6 6 0 0 0-6-6 6 6 0 0 0-6 6v5a3 3 0 0 1-3 3h18z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></path>
- </g>
- </svg>
-
- <span>Notifications</span>
-
- <span class="sidenav-v4__notification-marker">8 <i class="sr-only">notifications</i></span>
-
- <svg class="sidenav-v4__arrow-icon icon margin-left-auto" viewBox="0 0 20 20">
- <g class="icon__group" fill="none" stroke="currentColor" stroke-width="2px" stroke-linecap="round" stroke-linejoin="round">
- <line x1="3" y1="3" x2="17" y2="17" />
- <line x1="17" y1="3" x2="3" y2="17" />
- </g>
- </svg>
- </a>
-
- <ul class="sidenav-v4__sub-list">
- <li>
- <a class="sidenav-v4__sub-link" href="#0">All Notifications</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0" aria-current="page">Friends</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">Other</a>
- </li>
- </ul>
- </li>
-
- <li class="sidenav-v4__item">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <path d="M17 2H3a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h4l3 4 3-4h4a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></path>
- </g>
- </svg>
-
- <span>Comments</span>
-
- <svg class="sidenav-v4__arrow-icon icon margin-left-auto" viewBox="0 0 20 20">
- <g class="icon__group" fill="none" stroke="currentColor" stroke-width="2px" stroke-linecap="round" stroke-linejoin="round">
- <line x1="3" y1="3" x2="17" y2="17" />
- <line x1="17" y1="3" x2="3" y2="17" />
- </g>
- </svg>
- </a>
-
- <ul class="sidenav-v4__sub-list">
- <li>
- <a class="sidenav-v4__sub-link" href="#0">All Comments</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">+ New Comment</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">Spam</a>
- </li>
- </ul>
- </li>
-
- <li class="sidenav-v4__separator" role="presentation"><span></span></li>
-
- <li class="sidenav-v4__item">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <rect x="2" y="2" width="16" height="16" rx="2" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></rect>
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 14l6-6 2 6H6z"></path><circle cx="6.5" cy="6.5" r="1.5"></circle>
- </g>
- </svg>
-
- <span>Assets</span>
-
- <svg class="sidenav-v4__arrow-icon icon margin-left-auto" viewBox="0 0 20 20">
- <g class="icon__group" fill="none" stroke="currentColor" stroke-width="2px" stroke-linecap="round" stroke-linejoin="round">
- <line x1="3" y1="3" x2="17" y2="17" />
- <line x1="17" y1="3" x2="3" y2="17" />
- </g>
- </svg>
- </a>
-
- <ul class="sidenav-v4__sub-list">
- <li>
- <a class="sidenav-v4__sub-link" href="#0">All Assets</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">Upload</a>
- </li>
- </ul>
- </li>
-
- <li class="sidenav-v4__item">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <circle cx="10" cy="4" r="3" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></circle>
- <path d="M10 11a8 8 0 0 0-7.562 5.383A2 2 0 0 0 4.347 19h11.306a2 2 0 0 0 1.909-2.617A8 8 0 0 0 10 11z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></path>
- </g>
- </svg>
-
- <span>Users</span>
-
- <svg class="sidenav-v4__arrow-icon icon margin-left-auto" viewBox="0 0 20 20">
- <g class="icon__group" fill="none" stroke="currentColor" stroke-width="2px" stroke-linecap="round" stroke-linejoin="round">
- <line x1="3" y1="3" x2="17" y2="17" />
- <line x1="17" y1="3" x2="3" y2="17" />
- </g>
- </svg>
- </a>
-
- <ul class="sidenav-v4__sub-list">
- <li>
- <a class="sidenav-v4__sub-link" href="#0">All Users</a>
- </li>
-
- <li>
- <a class="sidenav-v4__sub-link" href="#0">+ New User</a>
- </li>
- </ul>
- </li>
-
- <li class="sidenav-v4__item">
- <a class="sidenav-v4__link js-sidenav-v4__link" href="#0">
- <svg class="sidenav-v4__icon icon" viewBox="0 0 20 20">
- <g fill="currentColor">
- <path d="M11 16l-1.55 1.55a4.95 4.95 0 0 1-7 0 4.95 4.95 0 0 1 0-7l2.192-2.192a4.95 4.95 0 0 1 7 0A4.907 4.907 0 0 1 12.731 10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></path>
- <path d="M9 4l1.55-1.55a4.95 4.95 0 0 1 7 0 4.95 4.95 0 0 1 0 7l-2.192 2.192a4.95 4.95 0 0 1-7 0A4.907 4.907 0 0 1 7.269 10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></path>
- </g>
- </svg>
-
- <span>Link</span>
- </a>
- </li>
- </ul>
- </nav>
- </div>
- </div>
- </aside>
-
- <main class="position-relative z-index-1 flex-grow height-100vh sidebar-loaded:show">
- <!-- start main content -->
- <div class="text-component padding-md">
- <p>Main content.</p>
- </div>
- <!-- end main content -->
- </main>
-</div> \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/index.ts b/apps/projects/src/app/pages/nav/index.ts
deleted file mode 100644
index ca91c20..0000000
--- a/apps/projects/src/app/pages/nav/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import NavWrapper from "./nav-wrapper.svelte";
-import NavItem from "./nav-item.svelte";
-export {
- NavWrapper,
- NavItem
-} \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/js/_1_diagonal-movement.js b/apps/projects/src/app/pages/nav/js/_1_diagonal-movement.js
deleted file mode 100644
index ed4a47d..0000000
--- a/apps/projects/src/app/pages/nav/js/_1_diagonal-movement.js
+++ /dev/null
@@ -1,296 +0,0 @@
-// File#: _1_diagonal-movement
-// Usage: codyhouse.co/license
-/*
- Modified version of the jQuery-menu-aim plugin
- https://github.com/kamens/jQuery-menu-aim
- - Replaced jQuery with Vanilla JS
- - Minor changes
-*/
-(function() {
- var menuAim = function(opts) {
- init(opts);
- };
-
- window.menuAim = menuAim;
-
- function init(opts) {
- var activeRow = null,
- mouseLocs = [],
- lastDelayLoc = null,
- timeoutId = null,
- options = Util.extend({
- menu: '',
- rows: false, //if false, get direct children - otherwise pass nodes list
- submenuSelector: "*",
- submenuDirection: "right",
- tolerance: 75, // bigger = more forgivey when entering submenu
- enter: function(){},
- exit: function(){},
- activate: function(){},
- deactivate: function(){},
- exitMenu: function(){}
- }, opts),
- menu = options.menu;
-
- var MOUSE_LOCS_TRACKED = 3, // number of past mouse locations to track
- DELAY = 300; // ms delay when user appears to be entering submenu
-
- /**
- * Keep track of the last few locations of the mouse.
- */
- var mouseMoveFallback = function(event) {
- (!window.requestAnimationFrame) ? mousemoveDocument(event) : window.requestAnimationFrame(function(){mousemoveDocument(event);});
- };
-
- var mousemoveDocument = function(e) {
- mouseLocs.push({x: e.pageX, y: e.pageY});
-
- if (mouseLocs.length > MOUSE_LOCS_TRACKED) {
- mouseLocs.shift();
- }
- };
-
- /**
- * Cancel possible row activations when leaving the menu entirely
- */
- var mouseleaveMenu = function() {
- if (timeoutId) {
- clearTimeout(timeoutId);
- }
-
- // If exitMenu is supplied and returns true, deactivate the
- // currently active row on menu exit.
- if (options.exitMenu(this)) {
- if (activeRow) {
- options.deactivate(activeRow);
- }
-
- activeRow = null;
- }
- };
-
- /**
- * Trigger a possible row activation whenever entering a new row.
- */
- var mouseenterRow = function() {
- if (timeoutId) {
- // Cancel any previous activation delays
- clearTimeout(timeoutId);
- }
-
- options.enter(this);
- possiblyActivate(this);
- },
- mouseleaveRow = function() {
- options.exit(this);
- };
-
- /*
- * Immediately activate a row if the user clicks on it.
- */
- var clickRow = function() {
- activate(this);
- };
-
- /**
- * Activate a menu row.
- */
- var activate = function(row) {
- if (row == activeRow) {
- return;
- }
-
- if (activeRow) {
- options.deactivate(activeRow);
- }
-
- options.activate(row);
- activeRow = row;
- };
-
- /**
- * Possibly activate a menu row. If mouse movement indicates that we
- * shouldn't activate yet because user may be trying to enter
- * a submenu's content, then delay and check again later.
- */
- var possiblyActivate = function(row) {
- var delay = activationDelay();
-
- if (delay) {
- timeoutId = setTimeout(function() {
- possiblyActivate(row);
- }, delay);
- } else {
- activate(row);
- }
- };
-
- /**
- * Return the amount of time that should be used as a delay before the
- * currently hovered row is activated.
- *
- * Returns 0 if the activation should happen immediately. Otherwise,
- * returns the number of milliseconds that should be delayed before
- * checking again to see if the row should be activated.
- */
- var activationDelay = function() {
- if (!activeRow || !Util.is(activeRow, options.submenuSelector)) {
- // If there is no other submenu row already active, then
- // go ahead and activate immediately.
- return 0;
- }
-
- function getOffset(element) {
- var rect = element.getBoundingClientRect();
- return { top: rect.top + window.pageYOffset, left: rect.left + window.pageXOffset };
- };
-
- var offset = getOffset(menu),
- upperLeft = {
- x: offset.left,
- y: offset.top - options.tolerance
- },
- upperRight = {
- x: offset.left + menu.offsetWidth,
- y: upperLeft.y
- },
- lowerLeft = {
- x: offset.left,
- y: offset.top + menu.offsetHeight + options.tolerance
- },
- lowerRight = {
- x: offset.left + menu.offsetWidth,
- y: lowerLeft.y
- },
- loc = mouseLocs[mouseLocs.length - 1],
- prevLoc = mouseLocs[0];
-
- if (!loc) {
- return 0;
- }
-
- if (!prevLoc) {
- prevLoc = loc;
- }
-
- if (prevLoc.x < offset.left || prevLoc.x > lowerRight.x || prevLoc.y < offset.top || prevLoc.y > lowerRight.y) {
- // If the previous mouse location was outside of the entire
- // menu's bounds, immediately activate.
- return 0;
- }
-
- if (lastDelayLoc && loc.x == lastDelayLoc.x && loc.y == lastDelayLoc.y) {
- // If the mouse hasn't moved since the last time we checked
- // for activation status, immediately activate.
- return 0;
- }
-
- // Detect if the user is moving towards the currently activated
- // submenu.
- //
- // If the mouse is heading relatively clearly towards
- // the submenu's content, we should wait and give the user more
- // time before activating a new row. If the mouse is heading
- // elsewhere, we can immediately activate a new row.
- //
- // We detect this by calculating the slope formed between the
- // current mouse location and the upper/lower right points of
- // the menu. We do the same for the previous mouse location.
- // If the current mouse location's slopes are
- // increasing/decreasing appropriately compared to the
- // previous's, we know the user is moving toward the submenu.
- //
- // Note that since the y-axis increases as the cursor moves
- // down the screen, we are looking for the slope between the
- // cursor and the upper right corner to decrease over time, not
- // increase (somewhat counterintuitively).
- function slope(a, b) {
- return (b.y - a.y) / (b.x - a.x);
- };
-
- var decreasingCorner = upperRight,
- increasingCorner = lowerRight;
-
- // Our expectations for decreasing or increasing slope values
- // depends on which direction the submenu opens relative to the
- // main menu. By default, if the menu opens on the right, we
- // expect the slope between the cursor and the upper right
- // corner to decrease over time, as explained above. If the
- // submenu opens in a different direction, we change our slope
- // expectations.
- if (options.submenuDirection == "left") {
- decreasingCorner = lowerLeft;
- increasingCorner = upperLeft;
- } else if (options.submenuDirection == "below") {
- decreasingCorner = lowerRight;
- increasingCorner = lowerLeft;
- } else if (options.submenuDirection == "above") {
- decreasingCorner = upperLeft;
- increasingCorner = upperRight;
- }
-
- var decreasingSlope = slope(loc, decreasingCorner),
- increasingSlope = slope(loc, increasingCorner),
- prevDecreasingSlope = slope(prevLoc, decreasingCorner),
- prevIncreasingSlope = slope(prevLoc, increasingCorner);
-
- if (decreasingSlope < prevDecreasingSlope && increasingSlope > prevIncreasingSlope) {
- // Mouse is moving from previous location towards the
- // currently activated submenu. Delay before activating a
- // new menu row, because user may be moving into submenu.
- lastDelayLoc = loc;
- return DELAY;
- }
-
- lastDelayLoc = null;
- return 0;
- };
-
- var reset = function(triggerDeactivate) {
- if (timeoutId) {
- clearTimeout(timeoutId);
- }
-
- if (activeRow && triggerDeactivate) {
- options.deactivate(activeRow);
- }
-
- activeRow = null;
- };
-
- var destroyInstance = function() {
- menu.removeEventListener('mouseleave', mouseleaveMenu);
- document.removeEventListener('mousemove', mouseMoveFallback);
- if(rows.length > 0) {
- for(var i = 0; i < rows.length; i++) {
- rows[i].removeEventListener('mouseenter', mouseenterRow);
- rows[i].removeEventListener('mouseleave', mouseleaveRow);
- rows[i].removeEventListener('click', clickRow);
- }
- }
-
- };
-
- /**
- * Hook up initial menu events
- */
- menu.addEventListener('mouseleave', mouseleaveMenu);
- var rows = (options.rows) ? options.rows : menu.children;
- if(rows.length > 0) {
- for(var i = 0; i < rows.length; i++) {(function(i){
- rows[i].addEventListener('mouseenter', mouseenterRow);
- rows[i].addEventListener('mouseleave', mouseleaveRow);
- rows[i].addEventListener('click', clickRow);
- })(i);}
- }
-
- document.addEventListener('mousemove', mouseMoveFallback);
-
- /* Reset/destroy menu */
- menu.addEventListener('reset', function(event){
- reset(event.detail);
- });
- menu.addEventListener('destroy', destroyInstance);
- };
-}());
-
diff --git a/apps/projects/src/app/pages/nav/js/_1_responsive-sidebar.js b/apps/projects/src/app/pages/nav/js/_1_responsive-sidebar.js
deleted file mode 100644
index f9599d8..0000000
--- a/apps/projects/src/app/pages/nav/js/_1_responsive-sidebar.js
+++ /dev/null
@@ -1,215 +0,0 @@
-// File#: _1_responsive-sidebar
-// Usage: codyhouse.co/license
-(function() {
- var Sidebar = function(element) {
- this.element = element;
- this.triggers = document.querySelectorAll('[aria-controls="'+this.element.getAttribute('id')+'"]');
- this.firstFocusable = null;
- this.lastFocusable = null;
- this.selectedTrigger = null;
- this.showClass = "sidebar--is-visible";
- this.staticClass = "sidebar--static";
- this.customStaticClass = "";
- this.readyClass = "sidebar--loaded";
- this.contentReadyClass = "sidebar-loaded:show";
- this.layout = false; // this will be static or mobile
- this.preventScrollEl = getPreventScrollEl(this);
- getCustomStaticClass(this); // custom classes for static version
- initSidebar(this);
- };
-
- function getPreventScrollEl(element) {
- var scrollEl = false;
- var querySelector = element.element.getAttribute('data-sidebar-prevent-scroll');
- if(querySelector) scrollEl = document.querySelector(querySelector);
- return scrollEl;
- };
-
- function getCustomStaticClass(element) {
- var customClasses = element.element.getAttribute('data-static-class');
- if(customClasses) element.customStaticClass = ' '+customClasses;
- };
-
- function initSidebar(sidebar) {
- initSidebarResize(sidebar); // handle changes in layout -> mobile to static and viceversa
-
- if ( sidebar.triggers ) { // open sidebar when clicking on trigger buttons - mobile layout only
- for(var i = 0; i < sidebar.triggers.length; i++) {
- sidebar.triggers[i].addEventListener('click', function(event) {
- event.preventDefault();
- toggleSidebar(sidebar, event.target);
- });
- }
- }
-
- // use the 'openSidebar' event to trigger the sidebar
- sidebar.element.addEventListener('openSidebar', function(event) {
- toggleSidebar(sidebar, event.detail);
- });
- };
-
- function toggleSidebar(sidebar, target) {
- if(Util.hasClass(sidebar.element, sidebar.showClass)) {
- sidebar.selectedTrigger = target;
- closeSidebar(sidebar);
- return;
- }
- sidebar.selectedTrigger = target;
- showSidebar(sidebar);
- initSidebarEvents(sidebar);
- };
-
- function showSidebar(sidebar) { // mobile layout only
- Util.addClass(sidebar.element, sidebar.showClass);
- getFocusableElements(sidebar);
- Util.moveFocus(sidebar.element);
- // change the overflow of the preventScrollEl
- if(sidebar.preventScrollEl) sidebar.preventScrollEl.style.overflow = 'hidden';
- };
-
- function closeSidebar(sidebar) { // mobile layout only
- Util.removeClass(sidebar.element, sidebar.showClass);
- sidebar.firstFocusable = null;
- sidebar.lastFocusable = null;
- if(sidebar.selectedTrigger) sidebar.selectedTrigger.focus();
- sidebar.element.removeAttribute('tabindex');
- //remove listeners
- cancelSidebarEvents(sidebar);
- // change the overflow of the preventScrollEl
- if(sidebar.preventScrollEl) sidebar.preventScrollEl.style.overflow = '';
- };
-
- function initSidebarEvents(sidebar) { // mobile layout only
- //add event listeners
- sidebar.element.addEventListener('keydown', handleEvent.bind(sidebar));
- sidebar.element.addEventListener('click', handleEvent.bind(sidebar));
- };
-
- function cancelSidebarEvents(sidebar) { // mobile layout only
- //remove event listeners
- sidebar.element.removeEventListener('keydown', handleEvent.bind(sidebar));
- sidebar.element.removeEventListener('click', handleEvent.bind(sidebar));
- };
-
- function handleEvent(event) { // mobile layout only
- switch(event.type) {
- case 'click': {
- initClick(this, event);
- }
- case 'keydown': {
- initKeyDown(this, event);
- }
- }
- };
-
- function initKeyDown(sidebar, event) { // mobile layout only
- if( event.keyCode && event.keyCode == 27 || event.key && event.key == 'Escape' ) {
- //close sidebar window on esc
- closeSidebar(sidebar);
- } else if( event.keyCode && event.keyCode == 9 || event.key && event.key == 'Tab' ) {
- //trap focus inside sidebar
- trapFocus(sidebar, event);
- }
- };
-
- function initClick(sidebar, event) { // mobile layout only
- //close sidebar when clicking on close button or sidebar bg layer
- if( !event.target.closest('.js-sidebar__close-btn') && !Util.hasClass(event.target, 'js-sidebar') ) return;
- event.preventDefault();
- closeSidebar(sidebar);
- };
-
- function trapFocus(sidebar, event) { // mobile layout only
- if( sidebar.firstFocusable == document.activeElement && event.shiftKey) {
- //on Shift+Tab -> focus last focusable element when focus moves out of sidebar
- event.preventDefault();
- sidebar.lastFocusable.focus();
- }
- if( sidebar.lastFocusable == document.activeElement && !event.shiftKey) {
- //on Tab -> focus first focusable element when focus moves out of sidebar
- event.preventDefault();
- sidebar.firstFocusable.focus();
- }
- };
-
- function initSidebarResize(sidebar) {
- // custom event emitted when window is resized - detect only if the sidebar--static@{breakpoint} class was added
- var beforeContent = getComputedStyle(sidebar.element, ':before').getPropertyValue('content');
- if(beforeContent && beforeContent !='' && beforeContent !='none') {
- checkSidebarLayout(sidebar);
-
- sidebar.element.addEventListener('update-sidebar', function(event){
- checkSidebarLayout(sidebar);
- });
- }
- // check if there a main element to show
- var mainContent = document.getElementsByClassName(sidebar.contentReadyClass);
- if(mainContent.length > 0) Util.removeClass(mainContent[0], sidebar.contentReadyClass);
- Util.addClass(sidebar.element, sidebar.readyClass);
- };
-
- function checkSidebarLayout(sidebar) {
- var layout = getComputedStyle(sidebar.element, ':before').getPropertyValue('content').replace(/\'|"/g, '');
- if(layout == sidebar.layout) return;
- sidebar.layout = layout;
- if(layout != 'static') Util.addClass(sidebar.element, 'is-hidden');
- Util.toggleClass(sidebar.element, sidebar.staticClass + sidebar.customStaticClass, layout == 'static');
- if(layout != 'static') setTimeout(function(){Util.removeClass(sidebar.element, 'is-hidden')});
- // reset element role
- (layout == 'static') ? sidebar.element.removeAttribute('role', 'alertdialog') : sidebar.element.setAttribute('role', 'alertdialog');
- // reset mobile behaviour
- if(layout == 'static' && Util.hasClass(sidebar.element, sidebar.showClass)) closeSidebar(sidebar);
- };
-
- function getFocusableElements(sidebar) {
- //get all focusable elements inside the drawer
- var allFocusable = sidebar.element.querySelectorAll('[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex]:not([tabindex="-1"]), [contenteditable], audio[controls], video[controls], summary');
- getFirstVisible(sidebar, allFocusable);
- getLastVisible(sidebar, allFocusable);
- };
-
- function getFirstVisible(sidebar, elements) {
- //get first visible focusable element inside the sidebar
- for(var i = 0; i < elements.length; i++) {
- if( elements[i].offsetWidth || elements[i].offsetHeight || elements[i].getClientRects().length ) {
- sidebar.firstFocusable = elements[i];
- return true;
- }
- }
- };
-
- function getLastVisible(sidebar, elements) {
- //get last visible focusable element inside the sidebar
- for(var i = elements.length - 1; i >= 0; i--) {
- if( elements[i].offsetWidth || elements[i].offsetHeight || elements[i].getClientRects().length ) {
- sidebar.lastFocusable = elements[i];
- return true;
- }
- }
- };
-
- window.Sidebar = Sidebar;
-
- //initialize the Sidebar objects
- var sidebar = document.getElementsByClassName('js-sidebar');
- if( sidebar.length > 0 ) {
- for( var i = 0; i < sidebar.length; i++) {
- (function(i){new Sidebar(sidebar[i]);})(i);
- }
- // switch from mobile to static layout
- var customEvent = new CustomEvent('update-sidebar');
- window.addEventListener('resize', function(event){
- (!window.requestAnimationFrame) ? setTimeout(function(){resetLayout();}, 250) : window.requestAnimationFrame(resetLayout);
- });
-
- (window.requestAnimationFrame) // init sidebar layout
- ? window.requestAnimationFrame(resetLayout)
- : resetLayout();
-
- function resetLayout() {
- for( var i = 0; i < sidebar.length; i++) {
- (function(i){sidebar[i].dispatchEvent(customEvent)})(i);
- };
- };
- }
-}()); \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/js/_2_side-navigation-v4.js b/apps/projects/src/app/pages/nav/js/_2_side-navigation-v4.js
deleted file mode 100644
index 63ef9c4..0000000
--- a/apps/projects/src/app/pages/nav/js/_2_side-navigation-v4.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// File#: _2_side-navigation-v4
-// Usage: codyhouse.co/license
-(function() {
- function initSideNav(nav) {
- // create btns - visible on mobile only
- createBtns(nav);
- // toggle sublists on mobile when clicking on buttons
- toggleSubLists(nav);
- // init diagonal movement
- initDiagonalMove(nav);
- };
-
- function createBtns(nav) {
- // on mobile -> create a <button> element for each link with a submenu
- var expandableLinks = nav.getElementsByClassName('js-sidenav-v4__link');
- for(var i = 0; i < expandableLinks.length; i++) {
- createSingleBtn(expandableLinks[i]);
- }
- };
-
- function createSingleBtn(link) {
- if(!hasSubList(link)) return;
- // create btn and insert it into the DOM
- var btnClasses = link.getAttribute('class').replace('js-sidenav-v4__link', 'js-sidenav-v4__btn');
- btnClasses = btnClasses +' sidenav-v4__link--btn';
- var btnHtml = '<button class="reset '+btnClasses+'">'+link.innerHTML+'</button>';
- link.insertAdjacentHTML('afterend', btnHtml);
- // add class to link element
- Util.addClass(link, 'sidenav-v4__link--href');
- // check if we need to add the collpsed class to the <li> element
- var listItem = link.parentElement;
- if(!Util.hasClass(listItem, 'sidenav-v4__item--current')) Util.addClass(listItem, 'sidenav-v4__item--collapsed');
- };
-
- function hasSubList(link) {
- // check if link has submenu
- var sublist = link.nextElementSibling;
- if(!sublist) return false;
- return Util.hasClass(sublist, 'sidenav-v4__sub-list');
- };
-
- function toggleSubLists(nav) {
- // open/close sublist on mobile
- nav.addEventListener('click', function(event){
- var btn = event.target.closest('.js-sidenav-v4__btn');
- if(!btn) return;
- Util.toggleClass(btn.parentElement, 'sidenav-v4__item--collapsed', !Util.hasClass(btn.parentElement, 'sidenav-v4__item--collapsed'));
- });
- };
-
- function initDiagonalMove(nav) {
- // improve dropdown navigation
- new menuAim({
- menu: nav.querySelector('ul'),
- activate: function(row) {
- Util.addClass(row, 'sidenav-v4__item--hover');
- },
- deactivate: function(row) {
- Util.removeClass(row, 'sidenav-v4__item--hover');
- },
- exitMenu: function() {
- return true;
- },
- });
- };
-
- var sideNavs = document.getElementsByClassName('js-sidenav-v4');
- if( sideNavs.length > 0 ) {
- for( var i = 0; i < sideNavs.length; i++) {
- (function(i){initSideNav(sideNavs[i]);})(i);
- }
- }
-}()); \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/nav-item.svelte b/apps/projects/src/app/pages/nav/nav-item.svelte
deleted file mode 100644
index 335cbbb..0000000
--- a/apps/projects/src/app/pages/nav/nav-item.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-<script lang="ts">
- import {link} from "svelte-spa-router";
- import Icon from "$shared/components/icon.svelte";
-
- export let external = "";
- export let to = "";
- export let text;
- export let icon;
-</script>
-
-<li class="sidenav-v4__item">
- <a class="sidenav-v4__link" href={to ?? external} use:link={external === ""}>
- {#if icon}
- <Icon class="sidenav-v4__icon icon" name="{icon}" />
- {/if}
- <span>{text}</span>
- </a>
-</li>
diff --git a/apps/projects/src/app/pages/nav/nav-wrapper.svelte b/apps/projects/src/app/pages/nav/nav-wrapper.svelte
deleted file mode 100644
index 8321544..0000000
--- a/apps/projects/src/app/pages/nav/nav-wrapper.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-<script lang="ts">
- import {random_string} from "$shared/lib/helpers";
-
- export let id = "nav__" + random_string(4);
- const staticClasses = "position-relative z-index-2 bg width-100% max-width-xxxxs shadow-sm"
-</script>
-<div class="flex@md">
- <aside id="{id}" class="sidebar sidebar--static@md {staticClasses}">
- <div class="sidebar__panel">
- <div class="position-relative z-index-1">
- <nav class="sidenav-v4 padding-xs">
- <slot name="navigation-items"></slot>
- </nav>
- </div>
- </div>
- </aside>
- <main class="container max-width-xl position-relative z-index-1 flex-grow min-height-100vh position-sticky@md top-0@md height-100vh@md overflow-auto@m">
- <slot name="main-content"></slot>
- </main>
-</div> \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/scss/_1_responsive-sidebar.scss b/apps/projects/src/app/pages/nav/scss/_1_responsive-sidebar.scss
deleted file mode 100644
index e4304f1..0000000
--- a/apps/projects/src/app/pages/nav/scss/_1_responsive-sidebar.scss
+++ /dev/null
@@ -1,147 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_responsive-sidebar
-Title: Responsive Sidebar
-Descr: Responsive sidebar container
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-/* mobile version only (--default) 👇 */
-.sidebar:not(.sidebar--static) {
- position: fixed;
- top: 0;
- left: 0;
- z-index: var(--z-index-fixed-element, 10);
- width: 100%;
- height: 100%;
- visibility: hidden;
- transition: visibility 0s 0.3s;
-
- &::after { /* overlay layer */
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: alpha(var(--color-black), 0);
- transition: background-color .3s;
- z-index: 1;
- }
-
- .sidebar__panel { /* content */
- position: absolute;
- top: 0;
- left: 0;
- z-index: 2;
- width: 100%;
- max-width: 380px;
- height: 100%;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- background-color: var(--color-bg);
- transform: translateX(-100%);
- transition: box-shadow 0.3s,transform 0.3s;
- }
-
- &.sidebar--right-on-mobile {
- .sidebar__panel {
- left: auto;
- right: 0;
- transform: translateX(100%);
- }
- }
-
- &.sidebar--is-visible {
- visibility: visible;
- transition: none;
-
- &::after {
- background-color: alpha(var(--color-black), 0.85);
- }
-
- .sidebar__panel {
- transform: translateX(0);
- box-shadow: var(--shadow-md);
- }
- }
-}
-/* end mobile version */
-
-.sidebar__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- position: sticky;
- top: 0;
-}
-
-.sidebar__close-btn {
- --size: 32px;
- width: var(--size);
- height: var(--size);
- display: flex;
- border-radius: 50%;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
- transition: .2s;
- flex-shrink: 0;
-
- .icon {
- display: block;
- margin: auto;
- }
-
- &:hover {
- background-color: var(--color-bg-lighter);
- box-shadow: var(--inner-glow), var(--shadow-md);
- }
-}
-
-/* desktop version only (--static) 👇 */
-.sidebar--static {
- flex-shrink: 0;
- flex-grow: 1;
-
- .sidebar__header {
- display: none;
- }
-}
-
-.sidebar--sticky-on-desktop {
- position: sticky;
- top: var(--space-sm);
- max-height: calc(100vh - var(--space-sm));
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-/* end desktop version */
-
-.sidebar, .sidebar-loaded\:show {
- opacity: 0; /* hide sidebar - or other elements using the .sidebar-loaded:show class - while it is initialized in JS */
-}
-
-.sidebar--loaded {
- opacity: 1;
-}
-
-/* detect when the sidebar needs to switch from the mobile layout to a static one - used in JS */
-[class*="sidebar--static"]::before {
- display: none;
-}
-
-.sidebar--static::before {
- content: 'static';
-}
-
-@each $breakpoint, $value in $breakpoints {
- .sidebar--static\@#{$breakpoint}::before {
- content: 'mobile';
- @include breakpoint(#{$breakpoint}) {
- content: 'static';
- }
- }
-} \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/scss/_2_side-navigation-v4.scss b/apps/projects/src/app/pages/nav/scss/_2_side-navigation-v4.scss
deleted file mode 100644
index 2b421df..0000000
--- a/apps/projects/src/app/pages/nav/scss/_2_side-navigation-v4.scss
+++ /dev/null
@@ -1,237 +0,0 @@
-@use '../base' as *;
-@use '_1_responsive-sidebar.scss' as *;
-
-/* --------------------------------
-
-File#: _2_side-navigation-v4
-Title: Side Navigation v4
-Descr: Main, side navigation
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.sidenav-v4 {
- --sidenav-v4-icon-size: 20px;
- --sidenav-v4-icon-margin-right: var(--space-xxs);
-}
-
-.sidenav-v4__item {
- position: relative;
-}
-
-.sidenav-v4__link,
-.sidenav-v4__sub-link,
-.sidenav-v4__separator {
- padding: var(--space-sm);
-}
-
-.sidenav-v4__link, .sidenav-v4__sub-link {
- display: flex;
- align-items: center;
-
- width: 100%;
- border-radius: var(--radius-md);
-
- text-decoration: none;
- color: inherit;
- line-height: 1;
- font-size: var(--text-md);
-
- transition: .2s;
-
- &:hover {
- color: var(--color-primary);
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &[aria-current="page"] {
- color: var(--color-primary);
- }
-}
-
-.sidenav-v4__sub-link {
- position: relative;
- color: var(--color-contrast-medium);
-
- /* dot indicator */
- &::before {
- content: '';
- display: block;
- --size: 6px;
- width: var(--size);
- height: var(--size);
- background: currentColor;
- border-radius: 50%;
- margin-left: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2);
- margin-right: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2 + var(--sidenav-v4-icon-margin-right));
-
- opacity: 0; /* visible only if current */
- }
-
- &[aria-current="page"] {
- &::before { /* show dot indicator */
- opacity: 1;
- }
- }
-}
-
-.sidenav-v4__notification-marker {
- margin-left: auto;
- background-color: var(--color-accent);
- border-radius: var(--radius-md);
-
- height: 16px;
- line-height: 16px;
- padding: 0 4px;
- color: var(--color-white);
- font-size: 12px;
-
- /* hide - visible only on desktop */
- display: none;
-}
-
-/* label icon */
-.sidenav-v4__icon {
- --size: var(--sidenav-v4-icon-size);
- margin-right: var(--sidenav-v4-icon-margin-right);
-}
-
-/* arrow icon - visible on mobile if item is expandable */
-.sidenav-v4__arrow-icon {
- --size: 20px;
-
- .icon__group {
- will-change: transform;
- transform-origin: 50% 50%;
- transform: rotate(-90deg);
- transition: transform .3s var(--ease-out);
-
- > * {
- transform-origin: 50% 50%;
- stroke-dasharray: 20;
- stroke-dashoffset: 0;
- transform: translateY(0px);
- transition: transform .3s, stroke-dashoffset .3s;
- transition-timing-function: var(--ease-out);
- }
-
- .sidenav-v4__item--collapsed & {
- transform: rotate(0deg);
-
- > * {
- transform: translateY(4px);
- }
-
- > *:first-child {
- stroke-dashoffset: 10.15;
- }
-
- > *:last-child {
- stroke-dashoffset: 10.15;
- }
- }
- }
-
- /* hide icon for links - show only for buttons created in JS */
- .sidenav-v4__link--href & {
- display: none;
- }
-}
-
-/* current item */
-.sidenav-v4__item--current {
- .sidenav-v4__sub-list {
- display: block; /* show sublist */
- }
-}
-
-/* separator */
-.sidenav-v4__separator {
- span {
- display: block;
- width: var(--sidenav-v4-icon-size);
- height: 1px;
- background-color: var(--color-contrast-lower);
- }
-}
-
-/* mobile only */
-@include breakpoint(md, "not all") {
- .sidenav-v4__item--collapsed {
- .sidenav-v4__sub-list {
- display: none;
- }
- }
-
- .sidenav-v4__link--href {
- display: none; /* hide link -> show button */
- }
-}
-
-/* desktop */
-@include breakpoint(md) {
- .sidenav-v4__sub-list {
- display: none;
- }
-
- .sidenav-v4__link,
- .sidenav-v4__sub-link,
- .sidenav-v4__separator {
- padding: var(--space-xs);
- }
-
- .sidenav-v4__link,
- .sidenav-v4__sub-link {
- font-size: var(--text-sm);
- }
-
- .sidenav-v4__link--btn {
- display: none; /* hide button -> show link */
- }
-
- /* tooltip */
- .sidenav-v4__item:not(.sidenav-v4__item--current) {
- .sidenav-v4__sub-list {
- width: 220px;
- position: absolute;
- z-index: var(--z-index-overlay);
- left: 100%;
- top: 0;
-
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-md);
- border-radius: var(--radius-md);
-
- overflow: hidden;
- }
-
- .sidenav-v4__sub-link {
- border-radius: 0;
- color: var(--color-contrast-high);
-
- &::before {
- display: none; /* remove dot indicator */
- }
-
- &:hover {
- color: var(--color-primary);
- }
- }
-
- &.sidenav-v4__item--hover, &:focus-within {
- .sidenav-v4__sub-list {
- display: block;
- }
- }
-
- &:hover .sidenav-v4__link { /* highlight main link if tooltip is visible */
- color: var(--color-primary);
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
- }
-
- /* notification marker */
- .sidenav-v4__notification-marker {
- display: block;
- }
-} \ No newline at end of file
diff --git a/apps/projects/src/app/pages/nav/side-navigation-v4.zip b/apps/projects/src/app/pages/nav/side-navigation-v4.zip
deleted file mode 100644
index d034eaf..0000000
--- a/apps/projects/src/app/pages/nav/side-navigation-v4.zip
+++ /dev/null
Binary files differ
diff --git a/apps/projects/src/app/pages/not-found.svelte b/apps/projects/src/app/pages/not-found.svelte
deleted file mode 100644
index 8822e0e..0000000
--- a/apps/projects/src/app/pages/not-found.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-<script>
- import LL from "$app/lib/i18n/i18n-svelte";
- import {link} from "svelte-spa-router";
-</script>
-
-<style>
- header {
- font-size: 12rem;
- }
-
- main {
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- text-align: center;
- }
-</style>
-
-<main>
- <header>404</header>
- <p>{$LL.messages.pageNotFound()}</p>
- <a use:link
- href="/">{$LL.messages.goToFrontpage()}</a>
-</main>
diff --git a/apps/projects/src/app/pages/settings.svelte b/apps/projects/src/app/pages/settings.svelte
deleted file mode 100644
index ca9fd47..0000000
--- a/apps/projects/src/app/pages/settings.svelte
+++ /dev/null
@@ -1,12 +0,0 @@
-<script>
- import Layout from "./_layout.svelte";
- import CategoriesTile from "$app/pages/views/settings-categories-tile.svelte";
- import LabelsTile from "$app/pages/views/settings-labels-tile.svelte";
-</script>
-
-<Layout>
- <section class="grid gap-md">
- <CategoriesTile/>
- <LabelsTile/>
- </section>
-</Layout>
diff --git a/apps/projects/src/app/pages/ui-workbench.svelte b/apps/projects/src/app/pages/ui-workbench.svelte
deleted file mode 100644
index ff2b058..0000000
--- a/apps/projects/src/app/pages/ui-workbench.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-<script>
- import {NavWrapper} from "./nav/index";
-</script>
-
-<NavWrapper>
-
-</NavWrapper> \ No newline at end of file
diff --git a/apps/projects/src/app/pages/views/category-form/index.svelte b/apps/projects/src/app/pages/views/category-form/index.svelte
deleted file mode 100644
index 21024c3..0000000
--- a/apps/projects/src/app/pages/views/category-form/index.svelte
+++ /dev/null
@@ -1,144 +0,0 @@
-<script lang="ts">
- import Alert from "$shared/components/alert.svelte";
- import Dropdown from "$shared/components/dropdown.svelte";
- import labels, {create_label_async} from "$app/lib/stores/labels";
- import {generate_random_hex_color} from "$shared/lib/colors";
- import LL from "$app/lib/i18n/i18n-svelte";
-
- let LabelsDropdown;
-
- const dough = {
- error: "",
- fields: {
- name: {
- value: "",
- error: "",
- validate() {
- return false;
- }
- },
- color: {
- value: "",
- error: "",
- validate() {
- return true;
- }
- },
- labels: {
- loading: false,
- value: [],
- error: "",
- validate() {
- return true;
- },
- async create({name}) {
- dough.fields.labels.loading = true;
- const response = await create_label_async({
- name: name,
- color: generate_random_hex_color(),
- });
- dough.fields.labels.loading = false;
- if (response.ok) {
- // Small pause to allow loading state to update everywhere.
- setTimeout(() => LabelsDropdown.select_entry(response.data.id), 50);
- }
- }
- },
- archived: {
- value: false,
- error: "",
- validate() {
- return true;
- }
- }
- },
- bake() {
- // labels.filter((c) => Object.hasOwn(c, "selected") && c.selected === true);
- return {
- labels: dough.fields.labels.value,
- name: dough.fields.name.value,
- color: dough.fields.color.value,
- };
- },
- submit(event) {
- const bread = dough.bake();
- console.log(bread);
- console.log("Submitted");
- }
- };
-
- const functions = {
- set(values) {
- functions.set_archived(values.archived);
- functions.set_labels(values.labels);
- functions.set_color(values.color);
- functions.set_name(values.name);
- },
- is_valid() {
- let isValid = true;
- if (!dough.fields.labels.validate()) isValid = false;
- if (!dough.fields.color.validate()) isValid = false;
- if (!dough.fields.name.validate()) isValid = false;
- if (!dough.fields.archived.validate()) isValid = false;
- return isValid;
- },
- set_archived(value) {
- dough.fields.archived.value = value;
- },
- set_labels(value) {
- dough.fields.labels.value = value;
- },
- set_color(value) {
- dough.fields.color.value = value;
- },
- set_name(value) {
- dough.fields.name.value = value;
- },
- };
-</script>
-
-<form on:submit|preventDefault={dough.submit}>
- <div class="margin-y-sm">
- <Alert visible={dough.error !== ""}
- message={dough.error}
- type="error"/>
- </div>
- <div class="grid gap-x-xs margin-bottom-sm">
- <div class="col-10">
- <label for="name"
- class="form-label margin-bottom-xxs">{$LL.views.categoryForm.name()}</label>
- <input type="text"
- class="form-control width-100%"
- id="name"
- bind:value={dough.fields.name.value}/>
- {#if dough.fields.name.error}
- <small class="color-error">{dough.fields.name.error}</small>
- {/if}
- </div>
- <div class="col-2">
- <label for="color"
- class="form-label margin-bottom-xxs">{$LL.views.categoryForm.color()}</label>
- <input type="color"
- class="form-control width-100%"
- id="color"
- style="height: 41px"
- bind:value={dough.fields.color.value}/>
- {#if dough.fields.color.error}
- <small class="color-error">{dough.fields.color.error}</small>
- {/if}
- </div>
- </div>
- <div class="margin-bottom-sm">
- <label for="labels"
- class="form-label margin-bottom-xxs">{$LL.views.categoryForm.defaultLabels()}</label>
- <Dropdown id="labels"
- createable={true}
- placeholder="{$LL.views.categoryForm.labelsPlaceholder()}"
- entries={$labels}
- multiple={true}
- on_create_async={(name) => dough.fields.labels.create({name})}/>
- {#if dough.fields.labels.error}
- <small class="color-error">{dough.fields.labels.error}</small>
- {/if}
- </div>
-</form>
diff --git a/apps/projects/src/app/pages/views/data-table-paginator.svelte b/apps/projects/src/app/pages/views/data-table-paginator.svelte
deleted file mode 100644
index b2649eb..0000000
--- a/apps/projects/src/app/pages/views/data-table-paginator.svelte
+++ /dev/null
@@ -1,101 +0,0 @@
-<script>
- import LL from "$app/lib/i18n/i18n-svelte";
- import {createEventDispatcher, onMount} from "svelte";
- import {restrict_input_to_numbers} from "$shared/lib/helpers";
-
- const dispatch = createEventDispatcher();
- export let page = 1;
- export let pageCount = 1;
- let prevCount = page;
- let canIncrement = false;
- let canDecrement = false;
- $: canIncrement = page < pageCount;
- $: canDecrement = page > 1;
-
- onMount(() => {
- restrict_input_to_numbers(document.querySelector("#curr-page"));
- });
-
- function increment() {
- if (canIncrement) {
- page++;
- }
- }
-
- function decrement() {
- if (canDecrement) {
- page--;
- }
- }
-
- $: if (page) {
- handle_change();
- }
-
- function handle_change() {
- if (page === prevCount) {
- return;
- }
- prevCount = page;
- if (page > pageCount) {
- page = pageCount;
- }
- dispatch("value_change", {
- newValue: page,
- });
- }
-</script>
-
-<nav class="pagination"
- aria-label="Pagination">
- <ul class="pagination__list flex flex-wrap gap-xxxs justify-center justify-end@md">
- <li>
- <button on:click={decrement}
- class="reset pagination__item {canDecrement ? '' : 'c-disabled'}">
- <svg class="icon icon--xs flip-x"
- viewBox="0 0 16 16">
- <title>{$LL.views.dataTablePaginator.goToPrevPage()}</title>
- <polyline
- points="6 2 12 8 6 14"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- />
- </svg>
- </button>
- </li>
-
- <li>
- <span class="pagination__jumper flex items-center">
- <input aria-label="Page number"
- class="form-control"
- id="curr-page"
- type="text"
- on:change={handle_change}
- value={page}
- />
- <em>{$LL.views.dataTablePaginator.of()} {pageCount}</em>
- </span>
- </li>
-
- <li>
- <button on:click={increment}
- class="reset pagination__item {canIncrement ? '' : 'c-disabled'}">
- <svg class="icon icon--xs"
- viewBox="0 0 16 16">
- <title>{$LL.views.dataTablePaginator.goToNextPage()}</title>
- <polyline
- points="6 2 12 8 6 14"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- />
- </svg>
- </button>
- </li>
- </ul>
-</nav>
diff --git a/apps/projects/src/app/pages/views/entry-form/index.svelte b/apps/projects/src/app/pages/views/entry-form/index.svelte
deleted file mode 100644
index e43d2a9..0000000
--- a/apps/projects/src/app/pages/views/entry-form/index.svelte
+++ /dev/null
@@ -1,199 +0,0 @@
-<script lang="ts">
- import LL from "$app/lib/i18n/i18n-svelte";
- import {TimeEntryDto} from "$shared/lib/models/TimeEntryDto";
- import {Temporal} from "@js-temporal/polyfill";
- import {createEventDispatcher, onMount, onDestroy} from "svelte";
- import DateTimePart from "./sections/date-time.svelte";
- import LabelsPart from "./sections/labels.svelte";
- import CategoryPart from "./sections/category.svelte";
- import Button from "$shared/components/button.svelte";
- import {Textarea} from "$shared/components/form";
- import Alert from "$shared/components/alert.svelte";
- import {is_guid} from "$shared/lib/helpers";
- import {create_entry_async, edit_entry_async} from "$app/lib/stores/entries";
-
- const dispatch = createEventDispatcher();
-
- let formError = "";
- let formIsLoading = false;
- let isSubmitting = false;
- let description = "";
- let descriptionError = "";
- let dateTimePart;
- let labelsPart;
- let categoryPart;
- let entryId;
-
- onMount(() => {
- formIsLoading = true;
-
- Promise.all([categoryPart.load_categories(), labelsPart.load_labels()]).then(() => {
- formIsLoading = false;
- });
-
- window.addEventListener("keydown", handle_window_keydown);
- });
-
- onDestroy(() => {
- window.removeEventListener("keydown", handle_window_keydown);
- });
-
- function handle_window_keydown(event) {
- if (event.ctrlKey && event.code === "Enter") {
- submit_form();
- }
- }
-
- function validate_form() {
- return dateTimePart.is_valid() && categoryPart.is_valid() && description_is_valid();
- }
-
- function description_is_valid() {
- if (!description) {
- descriptionError = $LL.views.entryForm.errDescriptionReq();
- } else {
- descriptionError = "";
- }
-
- return description;
- }
-
- function get_payload() {
- const response = {} as TimeEntryDto;
- const values = get_values();
- if (!is_guid(values.id)) {
- delete values.id;
- } else {
- response.id = values.id;
- }
-
- const currentTimeZone = Temporal.Now.zonedDateTimeISO().offset;
- response.start = values.date + "T" + values.fromTimeValue + currentTimeZone.toString();
- response.stop = values.date + "T" + values.toTimeValue + currentTimeZone.toString();
-
- response.category = {
- id: values.category.id,
- };
-
- const selectedLabels = values.labels;
- if (selectedLabels?.length > 0 ?? false) {
- response.labels = selectedLabels;
- }
-
- const descriptionContent = description?.trim();
- if (descriptionContent?.length > 0 ?? false) {
- response.description = descriptionContent;
- }
-
- return response;
- }
-
- async function submit_form() {
- formError = "";
- if (validate_form()) {
- const payload = get_payload() as TimeEntryDto;
- isSubmitting = true;
- if (is_guid(payload.id)) {
- const response = await edit_entry_async(payload);
- if (response.ok) {
- functions.reset();
- dispatch("updated", response.data);
- } else {
- formError = $LL.views.entryForm.entryUpdateError();
- isSubmitting = false;
- }
- } else {
- const response = await create_entry_async(payload);
- if (response.ok) {
- functions.reset();
- dispatch("created");
- } else {
- formError = $LL.views.entryForm.entryCreateError();
- isSubmitting = false;
- }
- }
- }
- }
-
- function get_values() {
- return {
- id: entryId,
- toTimeValue: dateTimePart.get_to_time_value(),
- fromTimeValue: dateTimePart.get_from_time_value(),
- date: dateTimePart.get_date(),
- category: categoryPart.get_selected(),
- labels: labelsPart.get_selected(),
- description: description,
- };
- }
-
- export const functions = {
- set_values(values) {
- entryId = values.id;
- dateTimePart.set_values(values);
- labelsPart.select_labels(values?.labels.map((c) => c.id) ?? []);
- categoryPart.select_category(values?.category?.id);
- description = values.description;
- },
- set_time(value: {to: Temporal.PlainTime, from: Temporal.PlainTime}) {
- dateTimePart.set_times(value);
- },
- set_description(value: string) {
- if (description) description = description + "\n\n" + value;
- else description = value;
- },
- reset() {
- isSubmitting = false;
- formIsLoading = false;
- entryId = "";
- labelsPart.reset();
- categoryPart.reset();
- dateTimePart.reset(true);
- description = "";
- formError = "";
- },
- };
-</script>
-
-<form on:submit|preventDefault={submit_form}
- on:reset={() => functions.reset()}>
- <div class="margin-y-sm">
- <Alert visible={formError !== ""}
- message={formError}
- type="error"/>
- </div>
-
- <div class="margin-bottom-sm">
- <DateTimePart bind:functions={dateTimePart}/>
- </div>
-
- <div class="margin-bottom-sm">
- <CategoryPart bind:functions={categoryPart}/>
- </div>
-
- <div class="margin-bottom-sm">
- <LabelsPart bind:functions={labelsPart}/>
- </div>
-
- <div class="margin-bottom-sm">
- <Textarea class="width-100%"
- id="description"
- label="{$LL.views.entryForm.description()}"
- errorText="{descriptionError}"
- bind:value={description}></Textarea>
- </div>
-
- <div class="flex flex-row justify-end gap-x-xs">
- {#if entryId}
- <Button text="{$LL.views.entryForm.reset()}"
- on:click={() => functions.reset()}
- variant="subtle"
- />
- {/if}
- <Button loading={isSubmitting}
- type="submit"
- variant="primary"
- text={entryId ? $LL.views.entryForm.save() : $LL.views.entryForm.create()}
- />
- </div>
-</form>
diff --git a/apps/projects/src/app/pages/views/entry-form/sections/category.svelte b/apps/projects/src/app/pages/views/entry-form/sections/category.svelte
deleted file mode 100644
index f7af382..0000000
--- a/apps/projects/src/app/pages/views/entry-form/sections/category.svelte
+++ /dev/null
@@ -1,76 +0,0 @@
-<script>
- import {generate_random_hex_color} from "$shared/lib/colors";
- import Dropdown from "$shared/components/dropdown.svelte";
- import {is_guid, move_focus} from "$shared/lib/helpers";
- import categories, {reload_categories, create_category_async} from "$app/lib/stores/categories";
- import LL from "$app/lib/i18n/i18n-svelte"
-
- let categoriesError = "";
- let loading = false;
-
- let DropdownExports;
-
- function reset() {
- DropdownExports.reset();
- categoriesError = "";
- console.log($LL.views.entryForm.category._logReset());
- }
-
- async function on_create({name}) {
- loading = true;
- const response = await create_category_async({
- name: name,
- color: generate_random_hex_color(),
- });
- loading = false;
- if (response.ok) {
- // Small pause to allow loading state to update everywhere.
- setTimeout(() => select_category(response.data.id), 50);
- }
- }
-
- function get_selected() {
- return $categories.find((c) => c.selected === true);
- }
-
- function select_category(id) {
- DropdownExports.select(id);
- }
-
- function is_valid() {
- let isValid = true;
- const category = get_selected();
- if (!is_guid(category?.id)) {
- categoriesError = $LL.views.entryForm.category.errisRequired();
- isValid = false;
- move_focus(document.getElementById("category-dropdown"));
- } else {
- categoriesError = "";
- }
- return isValid;
- }
-
- export const functions = {
- get_selected,
- reset,
- is_valid,
- select_category,
- load_categories: reload_categories,
- };
-</script>
-
-<Dropdown
- entries={$categories}
- label="{$LL.views.entryForm.category.category()}"
- maxlength="50"
- createable={true}
- placeholder="{$LL.views.entryForm.category.placeholder()}"
- id="category-dropdown"
- loading={loading}
- name="category-dropdown"
- on_create_async={on_create}
- noResultsText="{$LL.views.entryForm.category.noResults()}"
- errorText="{categoriesError}"
- bind:this={DropdownExports}
-/>
-
diff --git a/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte b/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
deleted file mode 100644
index b91f1a4..0000000
--- a/apps/projects/src/app/pages/views/entry-form/sections/date-time.svelte
+++ /dev/null
@@ -1,167 +0,0 @@
-<script lang="ts">
- import LL from "$app/lib/i18n/i18n-svelte";
- import { Temporal } from "@js-temporal/polyfill";
-
- // TIME
- let fromTimeValue = "";
- let fromTimeError = "";
- let toTimeValue = "";
- let toTimeError = "";
-
- function handle_from_time_changed(e) {
- fromTimeValue = e.target.value;
- if (fromTimeValue) {
- fromTimeError = "";
- }
- }
-
- function handle_to_time_changed(e) {
- toTimeValue = e.target.value;
- if (toTimeValue) {
- toTimeError = "";
- }
- }
-
- // DATE
- let date = Temporal.Now.plainDateTimeISO().toString().substring(0, 10);
- let dateError = "";
-
- function is_valid() {
- let isValid = true;
- let focusIsSet = false;
- if (!date) {
- dateError = $LL.views.entryForm.dateTime.errDateIsRequired();
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("date")?.focus();
- focusIsSet = true;
- }
- } else {
- dateError = "";
- }
-
- if (!fromTimeValue) {
- fromTimeError = $LL.views.entryForm.dateTime.errFromIsRequired();
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("from")?.focus();
- focusIsSet = true;
- }
- } else if (toTimeValue && fromTimeValue > toTimeValue) {
- fromTimeError = $LL.views.entryForm.dateTime.errFromAfterTo();
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("from")?.focus();
- focusIsSet = true;
- }
- } else if (fromTimeValue === toTimeValue) {
- fromTimeError = $LL.views.entryForm.dateTime.errFromEqTo();
-
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("from")?.focus();
- focusIsSet = true;
- }
- } else {
- fromTimeError = "";
- }
-
- if (!toTimeValue) {
- toTimeError = $LL.views.entryForm.dateTime.errToIsRequired();
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("to")?.focus();
- focusIsSet = true;
- }
- } else if (fromTimeValue && toTimeValue < fromTimeValue) {
- toTimeError = $LL.views.entryForm.dateTime.errToBeforeFrom();
- isValid = false;
- if (!focusIsSet) {
- document.getElementById("to")?.focus();
- focusIsSet = true;
- }
- } else {
- toTimeError = "";
- }
-
- return isValid;
- }
-
- export const functions = {
- get_from_time_value() {
- return fromTimeValue;
- },
- get_to_time_value() {
- return toTimeValue;
- },
- get_date() {
- return date;
- },
- is_valid,
- reset(focusDate = false) {
- fromTimeValue = "";
- toTimeValue = "";
- if (focusDate) {
- document.getElementById("date")?.focus();
- }
- console.log($LL.views.entryForm.dateTime._logReset());
- },
- set_times(value) {
- fromTimeValue = value.from.toPlainTime().toString().substring(0, 5);
- toTimeValue = value.to.toPlainTime().toString().substring(0, 5);
- },
- set_date(new_date: Temporal.PlainDate) {
- date = new_date.toString();
- },
- set_values(values) {
- const currentTimeZone = Temporal.Now.timeZone().id;
- const startDate = Temporal.Instant.from(values.start);
- const stopDate = Temporal.Instant.from(values.stop);
- fromTimeValue = startDate.toZonedDateTimeISO(currentTimeZone).toPlainTime().toString().substring(0, 5);
- toTimeValue = stopDate.toZonedDateTimeISO(currentTimeZone).toPlainTime().toString().substring(0, 5);
- date = startDate.toZonedDateTimeISO(currentTimeZone).toPlainDate().toString();
- }
- };
-</script>
-
-<div class="grid gap-xs">
- <div class="col-4">
- <label for="date"
- class="form-label margin-bottom-xxs">{$LL.views.entryForm.dateTime.date()}</label>
- <input type="date"
- id="date"
- class="form-control width-100%"
- bind:value={date}>
- {#if dateError}
- <small class="color-error">{dateError}</small>
- {/if}
- </div>
- <div class="col-4">
- <label for="from"
- class="form-label margin-bottom-xxs">{$LL.views.entryForm.dateTime.from()}</label>
- <input id="from"
- class="form-control width-100%"
- pattern="[0-9][0-9]:[0-9][0-9]"
- type="time"
- bind:value={fromTimeValue}
- on:input={handle_from_time_changed}
- />
- {#if fromTimeError}
- <small class="color-error">{fromTimeError}</small>
- {/if}
- </div>
- <div class="col-4">
- <label for="to"
- class="form-label margin-bottom-xxs">{$LL.views.entryForm.dateTime.to()}</label>
- <input id="to"
- class="form-control width-100%"
- pattern="[0-9][0-9]:[0-9][0-9]"
- type="time"
- bind:value={toTimeValue}
- on:input={handle_to_time_changed}
- />
- {#if toTimeError}
- <small class="color-error">{toTimeError}</small>
- {/if}
- </div>
-</div>
diff --git a/apps/projects/src/app/pages/views/entry-form/sections/labels.svelte b/apps/projects/src/app/pages/views/entry-form/sections/labels.svelte
deleted file mode 100644
index a6f324b..0000000
--- a/apps/projects/src/app/pages/views/entry-form/sections/labels.svelte
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
- import LL from "$app/lib/i18n/i18n-svelte";
- import {generate_random_hex_color} from "$shared/lib/colors";
- import labels, {reload_labels, create_label_async} from "$app/lib/stores/labels";
- import Dropdown from "$shared/components/dropdown.svelte";
-
- let labelsError = "";
- let loading = false;
- let DropdownExports;
-
- function reset() {
- DropdownExports.reset();
- console.log($LL.views.entryForm.labels._logReset());
- }
-
- function get_selected() {
- return $labels.filter((c) => Object.hasOwn(c, "selected") && c.selected === true);
- }
-
- function select_label(id) {
- DropdownExports.select(id);
- }
-
- function select_labels(ids) {
- for (const id of ids) {
- DropdownExports.select(id);
- }
- }
-
- async function on_create({name}) {
- loading = true;
- const response = await create_label_async({
- name: name,
- color: generate_random_hex_color(),
- });
- loading = false;
- if (response.ok) {
- // Small pause to allow loading state to update everywhere.
- setTimeout(() => select_label(response.data.id), 50);
- }
- }
-
- export const functions = {
- get_selected,
- reset,
- load_labels: reload_labels,
- select_labels,
- select_label,
- };
-</script>
-
-<Dropdown
- entries={$labels}
- label="{$LL.views.entryForm.labels.labels()}"
- maxlength="50"
- createable={true}
- placeholder="{$LL.views.entryForm.labels.placeholder()}"
- multiple="{true}"
- id="labels-search"
- name="labels-search"
- on_create_async={on_create}
- noResultsText="{$LL.views.entryForm.labels.placeholder()}"
- errorText="{labelsError}"
- bind:this={DropdownExports}
- {loading}
-/>
diff --git a/apps/projects/src/app/pages/views/profile-modal.svelte b/apps/projects/src/app/pages/views/profile-modal.svelte
deleted file mode 100644
index 7560175..0000000
--- a/apps/projects/src/app/pages/views/profile-modal.svelte
+++ /dev/null
@@ -1,156 +0,0 @@
-<script>
- import {update_profile} from "$shared/lib/api/user";
- import Modal from "$shared/components/modal.svelte";
- import Alert from "$shared/components/alert.svelte";
- import Button from "$shared/components/button.svelte";
- import {is_email} from "$shared/lib/helpers";
- import {api_base} from "$shared/lib/configuration";
- import {get_session_data} from "$shared/lib/session";
-
- const archiveLink = api_base("_/api/account/archive");
-
- let modal;
- let understands = false;
-
- let formIsLoading = false;
- let formError;
-
- let username = get_session_data()?.profile.username;
- let usernameFieldMessage;
- let usernameFieldMessageClass = "color-error";
-
- let password;
- let passwordFieldMessage;
- let passwordFieldMessageClass = "color-error";
-
- async function submit_form(e) {
- e.preventDefault();
- if (!username && !password) {
- console.error("Not submitting becuase both values is empty");
- return;
- }
-
- usernameFieldMessage = "";
- passwordFieldMessage = "";
-
- if (username && !is_email(username)) {
- usernameFieldMessage = "Username has to be a valid email";
- return;
- }
-
- if (password && password?.length < 6) {
- passwordFieldMessage = "The new password must contain at least 6 characters";
- return;
- }
-
- formIsLoading = true;
-
- const response = await update_profile({
- username,
- password,
- });
-
- formIsLoading = false;
-
- if (response.ok) {
- if (password) {
- passwordFieldMessage = "Successfully updated";
- passwordFieldMessageClass = "color-success";
- password = "";
- }
- if (username) {
- usernameFieldMessage = "Successfully updated";
- usernameFieldMessageClass = "color-success";
- password = "";
- }
- } else {
- formError = response.data.title ?? "An unknown error occured";
- }
- }
-
- async function handle_delete_account_button_click() {
- alert("Not implemented");
- return;
- if (understands && confirm("Are you absolutely sure that you want to delete your account?")) {
- }
- }
-
- export const functions = {
- open() {
- modal.open();
- },
- close() {
- // modal.close();
- },
- };
-</script>
-
-<Modal title="Profile"
- bind:functions={modal}>
- <section class="margin-bottom-md">
- <p class="text-md margin-bottom-sm">Update your information</p>
- <form on:submit={submit_form}
- autocomplete="new-password">
- {#if formError}
- <small class="color-danger">{formError}</small>
- {/if}
- <div class="margin-bottom-sm">
- <label for="email"
- class="form-label margin-bottom-xxs">New username</label>
- <input type="email"
- class="form-control width-100%"
- id="email"
- placeholder={username}
- bind:value={username}/>
- {#if usernameFieldMessage}
- <small class={usernameFieldMessageClass}>{usernameFieldMessage}</small>
- {/if}
- </div>
- <div class="margin-bottom-sm">
- <label for="password"
- class="form-label margin-bottom-xxs">New password</label>
- <input type="password"
- class="form-control width-100%"
- id="password"
- bind:value={password}/>
- {#if passwordFieldMessage}
- <small class={passwordFieldMessageClass}>{passwordFieldMessage}</small>
- {/if}
- </div>
- <div class="flex justify-end">
- <Button text="Save"
- on:click={submit_form}
- variant="primary"
- loading={formIsLoading}/>
- </div>
- </form>
- </section>
- <section class="margin-bottom-md">
- <p class="text-md margin-bottom-sm">Download your data</p>
- <a class="btn btn--subtle"
- href={archiveLink}
- download>Click here to download your data</a>
- </section>
- <section>
- <p class="text-md margin-bottom-sm">Delete account</p>
- <div class="margin-bottom-sm">
- <Alert
- message="Deleting your account and data means that all of your data (entries, categories, etc.) will be unrecoverable forever.<br>You should probably download your data before continuing."
- type="info"
- />
- </div>
- <div class="form-check margin-bottom-sm">
- <input type="checkbox"
- class="checkbox"
- id="the-consequences"
- bind:checked={understands}/>
- <label for="the-consequences">I understand the consequences of deleting my account and data.</label>
- </div>
- <div class="flex justify-end">
- <Button text="Delete everything"
- variant="accent"
- disabled={!understands}
- on:click={handle_delete_account_button_click}/>
- </div>
- </section>
-</Modal>
diff --git a/apps/projects/src/app/pages/views/settings-categories-tile.svelte b/apps/projects/src/app/pages/views/settings-categories-tile.svelte
deleted file mode 100644
index 8d2480f..0000000
--- a/apps/projects/src/app/pages/views/settings-categories-tile.svelte
+++ /dev/null
@@ -1,126 +0,0 @@
-<script>
- import {IconNames} from "$shared/lib/configuration";
- import {onMount} from "svelte";
- import {
- delete_time_category,
- get_time_categories,
- } from "$shared/lib/api/time-entry";
- import Button from "$shared/components/button.svelte";
- import Tile from "$shared/components/tile.svelte";
- import {Table, THead, TBody, TCell, TRow} from "$shared/components/table";
- import LL from "$app/lib/i18n/i18n-svelte";
-
- let is_loading = true;
- let categories = [];
-
- $: active_categories = categories.filter(c => !c.archived);
- $: archived_categories = categories.filter(c => c.archived);
-
- async function load_categories() {
- is_loading = true;
- const response = await get_time_categories();
- if (response.status === 200) {
- categories = response.data;
- } else if (response.status === 204) {
- categories = [];
- console.log("Empty response when getting time categories");
- } else {
- categories = [];
- console.error("Error when getting time categories");
- }
- is_loading = false;
- }
-
- async function handle_edit_category_click(event) {
- }
-
- async function handle_delete_category_click(event) {
- const row = event.target.closest("tr");
- if (
- row &&
- row.dataset.id &&
- confirm($LL.views.settingsCategoriesTile.deleteAllConfirm())
- ) {
- const response = await delete_time_category(row.dataset.id);
- if (response.ok) {
- // svelte errors if we remove the row.
- row.classList.add("d-none");
- }
- }
- }
-
- onMount(() => {
- load_categories();
- });
-</script>
-
-<Tile class="col-6@md col-12 {is_loading ? 'c-disabled loading' : ''}">
- <h2 class="margin-bottom-xxs">{$LL.views.settingsCategoriesTile.categories()}</h2>
- {#if active_categories.length > 0 && archived_categories.length > 0}
- <nav class="s-tabs text-sm">
- <ul class="s-tabs__list">
- <li><a class="s-tabs__link s-tabs__link--current"
- href="#0">{$LL.views.settingsCategoriesTile.active()} ({active_categories.length})</a></li>
- <li><a class="s-tabs__link"
- href="#0">{$LL.views.settingsCategoriesTile.archived()} ({archived_categories.length})</a></li>
- </ul>
- </nav>
- {/if}
- <div class="max-width-100% overflow-auto">
- <Table class="text-sm width-100%">
- <THead class="text-left">
- <TCell type="th"
- thScope="col">
- {$LL.views.settingsCategoriesTile.name()}
- </TCell>
- <TCell type="th"
- thScope="col">
- {$LL.views.settingsCategoriesTile.color()}
- </TCell>
- <TCell type="th"
- thScope="col"
- style="width:50px"></TCell>
- </THead>
- <TBody class="text-left">
- {#if categories.length > 0}
- {#each categories as category}
- <TRow class="text-nowrap"
- data-id={category.id}>
- <TCell>
- {category.name}
- </TCell>
- <TCell>
- <span style="border-left: 3px solid {category.color}; background-color:{category.color}25;">
- {category.color}
- </span>
- </TCell>
- <TCell>
- <Button icon="{IconNames.pencilSquare}"
- variant="reset"
- icon_width="1.2rem"
- class="hide"
- icon_height="1.2rem"
- on:click={handle_edit_category_click}
- title="{$LL.views.settingsCategoriesTile.editEntry()}"/>
- <Button icon="{IconNames.trash}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={handle_delete_category_click}
- title="{$LL.views.settingsCategoriesTile.deleteEntry()}"/>
-
- </TCell>
- </TRow>
- {/each}
- {:else}
- <TRow>
- <TCell type="th"
- thScope="3">
- {$LL.views.settingsCategoriesTile.noCategories()}
- </TCell>
- </TRow>
- {/if}
- </TBody>
- </Table>
- </div>
-</Tile>
diff --git a/apps/projects/src/app/pages/views/settings-labels-tile.svelte b/apps/projects/src/app/pages/views/settings-labels-tile.svelte
deleted file mode 100644
index 3d5a567..0000000
--- a/apps/projects/src/app/pages/views/settings-labels-tile.svelte
+++ /dev/null
@@ -1,111 +0,0 @@
-<script>
- import {IconNames} from "$shared/lib/configuration";
- import {onMount} from "svelte";
- import labels, {reload_labels, delete_label_async} from "$app/lib/stores/labels";
- import Button from "$shared/components/button.svelte";
- import Tile from "$shared/components/tile.svelte";
- import {Table, THead, TBody, TCell, TRow} from "$shared/components/table";
- import LL from "$app/lib/i18n/i18n-svelte";
-
- let isLoadingLabels = true;
-
- $: active_labels = $labels.filter(c => !c.archived);
- $: archived_labels = $labels.filter(c => c.archived);
-
- async function load_labels() {
- isLoadingLabels = true;
- await reload_labels();
- isLoadingLabels = false;
- }
-
- async function handle_edit_label_click(event) {
- }
-
- async function handle_delete_label_click(event) {
- const row = event.target.closest("tr");
- if (
- row &&
- row.dataset.id &&
- confirm($LL.views.settingsLabelsTile.deleteAllConfirm())
- ) {
- await delete_label_async({id: row.dataset.id});
- row.classList.add("d-none");
- }
- }
-
- onMount(() => {
- load_labels();
- });
-</script>
-
-<Tile class="col-6@md col-12 {isLoadingLabels ? 'c-disabled loading' : ''}">
- <h2 class="margin-bottom-xxs">{$LL.views.settingsLabelsTile.labels()}</h2>
- {#if active_labels.length > 0 && archived_labels.length > 0}
- <nav class="s-tabs text-sm">
- <ul class="s-tabs__list">
- <li><a class="s-tabs__link s-tabs__link--current"
- href="#0">{$LL.views.settingsLabelsTile.active()} ({active_labels.length})</a></li>
- <li><a class="s-tabs__link"
- href="#0">{$LL.views.settingsLabelsTile.archived()} ({archived_labels.length})</a></li>
- </ul>
- </nav>
- {/if}
- <div class="max-width-100% overflow-auto">
- <Table class="text-sm width-100%">
- <THead class="text-left">
- <TCell type="th"
- thScope="row">
- {$LL.views.settingsLabelsTile.name()}
- </TCell>
- <TCell type="th"
- thScope="row">
- {$LL.views.settingsLabelsTile.color()}
- </TCell>
- <TCell type="th"
- thScope="row"
- style="width: 50px;">
- </TCell>
- </THead>
- <TBody class="text-left">
- {#if $labels.length > 0}
- {#each $labels as label}
- <TRow class="text-nowrap"
- dataId={label.id}>
- <TCell>
- {label.name}
- </TCell>
- <TCell>
- <span style="border-left: 3px solid {label.color}; background-color:{label.color}25;">
- {label.color}
- </span>
- </TCell>
- <TCell>
- <Button icon="{IconNames.pencilSquare}"
- variant="reset"
- icon_width="1.2rem"
- class="hide"
- icon_height="1.2rem"
- on:click={handle_edit_label_click}
- title="{$LL.views.settingsLabelsTile.editEntry()}"/>
- <Button icon="{IconNames.trash}"
- variant="reset"
- icon_width="1.2rem"
- icon_height="1.2rem"
- on:click={handle_delete_label_click}
- title="{$LL.views.settingsLabelsTile.deleteEntry()}"/>
- </TCell>
- </TRow>
- {/each}
- {:else}
- <TRow>
- <TCell type="th"
- thScope="row"
- colspan="3">
- {$LL.views.settingsLabelsTile.noLabels()}
- </TCell>
- </TRow>
- {/if}
- </TBody>
- </Table>
- </div>
-</Tile>
diff --git a/apps/projects/src/index.html b/apps/projects/src/index.html
deleted file mode 100644
index 80eab63..0000000
--- a/apps/projects/src/index.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-<head>
- <meta charset="UTF-8">
- <meta name="viewport"
- content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
- <link rel="apple-touch-icon"
- sizes="180x180"
- href="./_assets/pwa/apple-touch-icon.png">
- <link rel="icon"
- type="image/png"
- sizes="32x32"
- href="./_assets/pwa/favicon-32x32.png">
- <link rel="icon"
- type="image/png"
- sizes="16x16"
- href="./_assets/pwa/favicon-16x16.png">
- <link rel="manifest"
- href="./_assets/pwa/manifest.json">
- <link rel="mask-icon"
- href="./_assets/pwa/safari-pinned-tab.svg"
- color="#5bbad5">
- <meta name="msapplication-TileColor"
- content="#da532c">
- <link rel="icon"
- href="./_assets/pwa/favicon.svg">
- <link rel="stylesheet" href="./_assets/preload.css">
- <script src="./_assets/preload.js"></script>
- <title>Projects - Greatoffice</title>
-</head>
-
-<body>
-
-<noscript>
- This page is built with javascript. Allow it and try again.
-</noscript>
-
-<div class="fill-loader fill-loader--v4"
- id="loader"
- role="alert">
- <p class="fill-loader__label">Loading Projects...</p>
- <div aria-hidden="true">
- <div class="fill-loader__base"></div>
- <div class="fill-loader__fill"></div>
- </div>
-</div>
-
-<div id="root"></div>
-
-<script type="module"
- src="./app/index.ts"></script>
-</body>
-
-</html>
diff --git a/apps/projects/src/package.json b/apps/projects/src/package.json
deleted file mode 100644
index 839f3ba..0000000
--- a/apps/projects/src/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "greatoffice-projects",
- "version": "0.0.1",
- "private": "true",
- "scripts": {
- "dev": "npm-run-all --parallel vite typesafe-i18n",
- "vite": "vite",
- "typesafe-i18n": "typesafe-i18n",
- "build": "vite build"
- },
- "devDependencies": {
- "@sveltejs/vite-plugin-svelte": "1.0.1",
- "@sveltestack/svelte-query": "^1.6.0",
- "broadcast-channel": "^4.14.0",
- "npm-run-all": "^4.1.5",
- "sass": "^1.54.0",
- "svelte": "^3.49.0",
- "svelte-preprocess": "^4.10.7",
- "svelte-spa-router": "^3.2.0",
- "typescript": "4.7.4",
- "vite": "^3.0.4"
- },
- "dependencies": {
- "@js-temporal/polyfill": "^0.4.2",
- "fuzzysort": "^2.0.1",
- "typesafe-i18n": "^5.11.0"
- }
-}
diff --git a/apps/projects/src/pnpm-lock.yaml b/apps/projects/src/pnpm-lock.yaml
deleted file mode 100644
index bcba63e..0000000
--- a/apps/projects/src/pnpm-lock.yaml
+++ /dev/null
@@ -1,1374 +0,0 @@
-lockfileVersion: 5.4
-
-specifiers:
- '@js-temporal/polyfill': ^0.4.2
- '@sveltejs/vite-plugin-svelte': 1.0.1
- '@sveltestack/svelte-query': ^1.6.0
- broadcast-channel: ^4.14.0
- fuzzysort: ^2.0.1
- npm-run-all: ^4.1.5
- sass: ^1.54.0
- svelte: ^3.49.0
- svelte-preprocess: ^4.10.7
- svelte-spa-router: ^3.2.0
- typesafe-i18n: ^5.11.0
- typescript: 4.7.4
- vite: ^3.0.4
-
-dependencies:
- '@js-temporal/polyfill': 0.4.2
- fuzzysort: 2.0.1
- typesafe-i18n: 5.11.0_typescript@4.7.4
-
-devDependencies:
- '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.4
- '@sveltestack/svelte-query': 1.6.0_broadcast-channel@4.14.0
- broadcast-channel: 4.14.0
- npm-run-all: 4.1.5
- sass: 1.54.0
- svelte: 3.49.0
- svelte-preprocess: 4.10.7_qqyngjnvpp2z5rj6eppfx7s47e
- svelte-spa-router: 3.2.0
- typescript: 4.7.4
- vite: 3.0.4_sass@1.54.0
-
-packages:
-
- /@babel/runtime/7.18.9:
- resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.13.9
- dev: true
-
- /@js-temporal/polyfill/0.4.2:
- resolution: {integrity: sha512-c85vRxyqnJaXKyf4tvYij8jwiVIZhNLYDI9C4LLuOwVEHf4HUqGg07BBn70Le71W193QT/vmKg3jPUyQxJRHKQ==}
- engines: {node: '>=12'}
- dependencies:
- jsbi: 4.3.0
- tslib: 2.4.0
- dev: false
-
- /@rollup/pluginutils/4.2.1:
- resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
- engines: {node: '>= 8.0.0'}
- dependencies:
- estree-walker: 2.0.2
- picomatch: 2.3.1
- dev: true
-
- /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.4:
- resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==}
- engines: {node: ^14.18.0 || >= 16}
- peerDependencies:
- diff-match-patch: ^1.0.5
- svelte: ^3.44.0
- vite: ^3.0.0
- peerDependenciesMeta:
- diff-match-patch:
- optional: true
- dependencies:
- '@rollup/pluginutils': 4.2.1
- debug: 4.3.4
- deepmerge: 4.2.2
- kleur: 4.1.5
- magic-string: 0.26.2
- svelte: 3.49.0
- svelte-hmr: 0.14.12_svelte@3.49.0
- vite: 3.0.4_sass@1.54.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@sveltestack/svelte-query/1.6.0_broadcast-channel@4.14.0:
- resolution: {integrity: sha512-C0wWuh6av1zu3Pzwrg6EQmX3BhDZQ4gMAdYu6Tfv4bjbEZTB00uEDz52z92IZdONh+iUKuyo0xRZ2e16k2Xifg==}
- peerDependencies:
- broadcast-channel: ^4.5.0
- peerDependenciesMeta:
- broadcast-channel:
- optional: true
- dependencies:
- broadcast-channel: 4.14.0
- dev: true
-
- /@types/node/18.6.3:
- resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==}
- dev: true
-
- /@types/pug/2.0.6:
- resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
- dev: true
-
- /@types/sass/1.43.1:
- resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
- dependencies:
- '@types/node': 18.6.3
- dev: true
-
- /ansi-styles/3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
- dev: true
-
- /anymatch/3.1.2:
- resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
- engines: {node: '>= 8'}
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
- dev: true
-
- /balanced-match/1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- dev: true
-
- /binary-extensions/2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
- dev: true
-
- /brace-expansion/1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
- dev: true
-
- /braces/3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
- dependencies:
- fill-range: 7.0.1
- dev: true
-
- /broadcast-channel/4.14.0:
- resolution: {integrity: sha512-uNzxOgBQ+boWCRDESLNg3zZWQ3iz/X7j/uD8pAfr4/S7wQerXVvJI/SBKd9J6ckaPt2jil0gq+7l+3b+kuxJYw==}
- dependencies:
- '@babel/runtime': 7.18.9
- detect-node: 2.1.0
- microtime: 3.1.0
- oblivious-set: 1.1.1
- p-queue: 6.6.2
- rimraf: 3.0.2
- unload: 2.3.1
- dev: true
-
- /buffer-crc32/0.2.13:
- resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
- dev: true
-
- /call-bind/1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
- dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.1.2
- dev: true
-
- /chalk/2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
- dev: true
-
- /chokidar/3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
- dependencies:
- anymatch: 3.1.2
- braces: 3.0.2
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /color-convert/1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
- dependencies:
- color-name: 1.1.3
- dev: true
-
- /color-name/1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
- dev: true
-
- /concat-map/0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- dev: true
-
- /cross-spawn/6.0.5:
- resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
- engines: {node: '>=4.8'}
- dependencies:
- nice-try: 1.0.5
- path-key: 2.0.1
- semver: 5.7.1
- shebang-command: 1.2.0
- which: 1.3.1
- dev: true
-
- /debug/4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.1.2
- dev: true
-
- /deepmerge/4.2.2:
- resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /define-properties/1.1.4:
- resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
- dev: true
-
- /detect-indent/6.1.0:
- resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
- engines: {node: '>=8'}
- dev: true
-
- /detect-node/2.1.0:
- resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
- dev: true
-
- /error-ex/1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
- dependencies:
- is-arrayish: 0.2.1
- dev: true
-
- /es-abstract/1.20.1:
- resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- es-to-primitive: 1.2.1
- function-bind: 1.1.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.1.2
- get-symbol-description: 1.0.0
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-symbols: 1.0.3
- internal-slot: 1.0.3
- is-callable: 1.2.4
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-weakref: 1.0.2
- object-inspect: 1.12.2
- object-keys: 1.1.1
- object.assign: 4.1.2
- regexp.prototype.flags: 1.4.3
- string.prototype.trimend: 1.0.5
- string.prototype.trimstart: 1.0.5
- unbox-primitive: 1.0.2
- dev: true
-
- /es-to-primitive/1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
- dependencies:
- is-callable: 1.2.4
- is-date-object: 1.0.5
- is-symbol: 1.0.4
- dev: true
-
- /es6-promise/3.3.1:
- resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
- dev: true
-
- /esbuild-android-64/0.14.51:
- resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-android-arm64/0.14.51:
- resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-64/0.14.51:
- resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-darwin-arm64/0.14.51:
- resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-64/0.14.51:
- resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-freebsd-arm64/0.14.51:
- resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-32/0.14.51:
- resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-64/0.14.51:
- resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm/0.14.51:
- resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-arm64/0.14.51:
- resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-mips64le/0.14.51:
- resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-ppc64le/0.14.51:
- resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-riscv64/0.14.51:
- resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-linux-s390x/0.14.51:
- resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-netbsd-64/0.14.51:
- resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-openbsd-64/0.14.51:
- resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-sunos-64/0.14.51:
- resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-32/0.14.51:
- resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-64/0.14.51:
- resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild-windows-arm64/0.14.51:
- resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /esbuild/0.14.51:
- resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- esbuild-android-64: 0.14.51
- esbuild-android-arm64: 0.14.51
- esbuild-darwin-64: 0.14.51
- esbuild-darwin-arm64: 0.14.51
- esbuild-freebsd-64: 0.14.51
- esbuild-freebsd-arm64: 0.14.51
- esbuild-linux-32: 0.14.51
- esbuild-linux-64: 0.14.51
- esbuild-linux-arm: 0.14.51
- esbuild-linux-arm64: 0.14.51
- esbuild-linux-mips64le: 0.14.51
- esbuild-linux-ppc64le: 0.14.51
- esbuild-linux-riscv64: 0.14.51
- esbuild-linux-s390x: 0.14.51
- esbuild-netbsd-64: 0.14.51
- esbuild-openbsd-64: 0.14.51
- esbuild-sunos-64: 0.14.51
- esbuild-windows-32: 0.14.51
- esbuild-windows-64: 0.14.51
- esbuild-windows-arm64: 0.14.51
- dev: true
-
- /escape-string-regexp/1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
- dev: true
-
- /estree-walker/2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- dev: true
-
- /eventemitter3/4.0.7:
- resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
- dev: true
-
- /fill-range/7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
- dependencies:
- to-regex-range: 5.0.1
- dev: true
-
- /fs.realpath/1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
- dev: true
-
- /fsevents/2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /function-bind/1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
- dev: true
-
- /function.prototype.name/1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- functions-have-names: 1.2.3
- dev: true
-
- /functions-have-names/1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: true
-
- /fuzzysort/2.0.1:
- resolution: {integrity: sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg==}
- dev: false
-
- /get-intrinsic/1.1.2:
- resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==}
- dependencies:
- function-bind: 1.1.1
- has: 1.0.3
- has-symbols: 1.0.3
- dev: true
-
- /get-symbol-description/1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.1.2
- dev: true
-
- /glob-parent/5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
- dependencies:
- is-glob: 4.0.3
- dev: true
-
- /glob/7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
-
- /graceful-fs/4.2.10:
- resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
- dev: true
-
- /has-bigints/1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: true
-
- /has-flag/3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
- dev: true
-
- /has-property-descriptors/1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
- dependencies:
- get-intrinsic: 1.1.2
- dev: true
-
- /has-symbols/1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /has-tostringtag/1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
- /has/1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
- dependencies:
- function-bind: 1.1.1
- dev: true
-
- /hosted-git-info/2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
- dev: true
-
- /immutable/4.1.0:
- resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==}
- dev: true
-
- /inflight/1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
- dev: true
-
- /inherits/2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- dev: true
-
- /internal-slot/1.0.3:
- resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.1.2
- has: 1.0.3
- side-channel: 1.0.4
- dev: true
-
- /is-arrayish/0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- dev: true
-
- /is-bigint/1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
- dependencies:
- has-bigints: 1.0.2
- dev: true
-
- /is-binary-path/2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
- dependencies:
- binary-extensions: 2.2.0
- dev: true
-
- /is-boolean-object/1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
-
- /is-callable/1.2.4:
- resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /is-core-module/2.9.0:
- resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
- dependencies:
- has: 1.0.3
- dev: true
-
- /is-date-object/1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-extglob/2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /is-glob/4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- is-extglob: 2.1.1
- dev: true
-
- /is-negative-zero/2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /is-number-object/1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-number/7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
- dev: true
-
- /is-regex/1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
-
- /is-shared-array-buffer/1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
- dependencies:
- call-bind: 1.0.2
- dev: true
-
- /is-string/1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-symbol/1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
- /is-weakref/1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
- dependencies:
- call-bind: 1.0.2
- dev: true
-
- /isexe/2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- dev: true
-
- /jsbi/4.3.0:
- resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==}
- dev: false
-
- /json-parse-better-errors/1.0.2:
- resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
- dev: true
-
- /kleur/4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
- dev: true
-
- /load-json-file/4.0.0:
- resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
- engines: {node: '>=4'}
- dependencies:
- graceful-fs: 4.2.10
- parse-json: 4.0.0
- pify: 3.0.0
- strip-bom: 3.0.0
- dev: true
-
- /magic-string/0.25.9:
- resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: true
-
- /magic-string/0.26.2:
- resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==}
- engines: {node: '>=12'}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: true
-
- /memorystream/0.3.1:
- resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
- engines: {node: '>= 0.10.0'}
- dev: true
-
- /microtime/3.1.0:
- resolution: {integrity: sha512-GcjhfC2y/DF2znac8IRwri7+YUIy34QRHz/iZK3bHrh74qrNNOpAJQwiOMnIG+v1J0K4eiqd+RiGzN3F1eofTQ==}
- engines: {node: '>= 14.13.0'}
- requiresBuild: true
- dependencies:
- node-addon-api: 5.0.0
- node-gyp-build: 4.5.0
- dev: true
-
- /min-indent/1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
- dev: true
-
- /minimatch/3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
- dependencies:
- brace-expansion: 1.1.11
- dev: true
-
- /minimist/1.2.6:
- resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
- dev: true
-
- /mkdirp/0.5.6:
- resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
- hasBin: true
- dependencies:
- minimist: 1.2.6
- dev: true
-
- /ms/2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- dev: true
-
- /nanoid/3.3.4:
- resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
- dev: true
-
- /nice-try/1.0.5:
- resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
- dev: true
-
- /node-addon-api/5.0.0:
- resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==}
- dev: true
-
- /node-gyp-build/4.5.0:
- resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==}
- hasBin: true
- dev: true
-
- /normalize-package-data/2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
- dependencies:
- hosted-git-info: 2.8.9
- resolve: 1.22.1
- semver: 5.7.1
- validate-npm-package-license: 3.0.4
- dev: true
-
- /normalize-path/3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /npm-run-all/4.1.5:
- resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
- engines: {node: '>= 4'}
- hasBin: true
- dependencies:
- ansi-styles: 3.2.1
- chalk: 2.4.2
- cross-spawn: 6.0.5
- memorystream: 0.3.1
- minimatch: 3.1.2
- pidtree: 0.3.1
- read-pkg: 3.0.0
- shell-quote: 1.7.3
- string.prototype.padend: 3.1.3
- dev: true
-
- /object-inspect/1.12.2:
- resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
- dev: true
-
- /object-keys/1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /object.assign/4.1.2:
- resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- has-symbols: 1.0.3
- object-keys: 1.1.1
- dev: true
-
- /oblivious-set/1.1.1:
- resolution: {integrity: sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==}
- dev: true
-
- /once/1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- dependencies:
- wrappy: 1.0.2
- dev: true
-
- /p-finally/1.0.0:
- resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
- engines: {node: '>=4'}
- dev: true
-
- /p-queue/6.6.2:
- resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
- engines: {node: '>=8'}
- dependencies:
- eventemitter3: 4.0.7
- p-timeout: 3.2.0
- dev: true
-
- /p-timeout/3.2.0:
- resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
- engines: {node: '>=8'}
- dependencies:
- p-finally: 1.0.0
- dev: true
-
- /parse-json/4.0.0:
- resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
- engines: {node: '>=4'}
- dependencies:
- error-ex: 1.3.2
- json-parse-better-errors: 1.0.2
- dev: true
-
- /path-is-absolute/1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /path-key/2.0.1:
- resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
- engines: {node: '>=4'}
- dev: true
-
- /path-parse/1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- dev: true
-
- /path-type/3.0.0:
- resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
- engines: {node: '>=4'}
- dependencies:
- pify: 3.0.0
- dev: true
-
- /picocolors/1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
- dev: true
-
- /picomatch/2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
- dev: true
-
- /pidtree/0.3.1:
- resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==}
- engines: {node: '>=0.10'}
- hasBin: true
- dev: true
-
- /pify/3.0.0:
- resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
- engines: {node: '>=4'}
- dev: true
-
- /postcss/8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
- engines: {node: ^10 || ^12 || >=14}
- dependencies:
- nanoid: 3.3.4
- picocolors: 1.0.0
- source-map-js: 1.0.2
- dev: true
-
- /read-pkg/3.0.0:
- resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
- engines: {node: '>=4'}
- dependencies:
- load-json-file: 4.0.0
- normalize-package-data: 2.5.0
- path-type: 3.0.0
- dev: true
-
- /readdirp/3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
- dependencies:
- picomatch: 2.3.1
- dev: true
-
- /regenerator-runtime/0.13.9:
- resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
- dev: true
-
- /regexp.prototype.flags/1.4.3:
- resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- functions-have-names: 1.2.3
- dev: true
-
- /regexparam/2.0.0:
- resolution: {integrity: sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==}
- engines: {node: '>=8'}
- dev: true
-
- /resolve/1.22.1:
- resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
- hasBin: true
- dependencies:
- is-core-module: 2.9.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
- dev: true
-
- /rimraf/2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- hasBin: true
- dependencies:
- glob: 7.2.3
- dev: true
-
- /rimraf/3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- hasBin: true
- dependencies:
- glob: 7.2.3
- dev: true
-
- /rollup/2.77.2:
- resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /sander/0.5.1:
- resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
- dependencies:
- es6-promise: 3.3.1
- graceful-fs: 4.2.10
- mkdirp: 0.5.6
- rimraf: 2.7.1
- dev: true
-
- /sass/1.54.0:
- resolution: {integrity: sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==}
- engines: {node: '>=12.0.0'}
- hasBin: true
- dependencies:
- chokidar: 3.5.3
- immutable: 4.1.0
- source-map-js: 1.0.2
- dev: true
-
- /semver/5.7.1:
- resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
- hasBin: true
- dev: true
-
- /shebang-command/1.2.0:
- resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- shebang-regex: 1.0.0
- dev: true
-
- /shebang-regex/1.0.0:
- resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /shell-quote/1.7.3:
- resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
- dev: true
-
- /side-channel/1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.1.2
- object-inspect: 1.12.2
- dev: true
-
- /sorcery/0.10.0:
- resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
- hasBin: true
- dependencies:
- buffer-crc32: 0.2.13
- minimist: 1.2.6
- sander: 0.5.1
- sourcemap-codec: 1.4.8
- dev: true
-
- /source-map-js/1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /sourcemap-codec/1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- dev: true
-
- /spdx-correct/3.1.1:
- resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
- dependencies:
- spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.11
- dev: true
-
- /spdx-exceptions/2.3.0:
- resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
- dev: true
-
- /spdx-expression-parse/3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
- dependencies:
- spdx-exceptions: 2.3.0
- spdx-license-ids: 3.0.11
- dev: true
-
- /spdx-license-ids/3.0.11:
- resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==}
- dev: true
-
- /string.prototype.padend/3.1.3:
- resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /string.prototype.trimend/1.0.5:
- resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /string.prototype.trimstart/1.0.5:
- resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /strip-bom/3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
- dev: true
-
- /strip-indent/3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
- dependencies:
- min-indent: 1.0.1
- dev: true
-
- /supports-color/5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
- dependencies:
- has-flag: 3.0.0
- dev: true
-
- /supports-preserve-symlinks-flag/1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /svelte-hmr/0.14.12_svelte@3.49.0:
- resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==}
- engines: {node: ^12.20 || ^14.13.1 || >= 16}
- peerDependencies:
- svelte: '>=3.19.0'
- dependencies:
- svelte: 3.49.0
- dev: true
-
- /svelte-preprocess/4.10.7_qqyngjnvpp2z5rj6eppfx7s47e:
- resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
- engines: {node: '>= 9.11.2'}
- requiresBuild: true
- peerDependencies:
- '@babel/core': ^7.10.2
- coffeescript: ^2.5.1
- less: ^3.11.3 || ^4.0.0
- node-sass: '*'
- postcss: ^7 || ^8
- postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
- pug: ^3.0.0
- sass: ^1.26.8
- stylus: ^0.55.0
- sugarss: ^2.0.0
- svelte: ^3.23.0
- typescript: ^3.9.5 || ^4.0.0
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- coffeescript:
- optional: true
- less:
- optional: true
- node-sass:
- optional: true
- postcss:
- optional: true
- postcss-load-config:
- optional: true
- pug:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- typescript:
- optional: true
- dependencies:
- '@types/pug': 2.0.6
- '@types/sass': 1.43.1
- detect-indent: 6.1.0
- magic-string: 0.25.9
- sass: 1.54.0
- sorcery: 0.10.0
- strip-indent: 3.0.0
- svelte: 3.49.0
- typescript: 4.7.4
- dev: true
-
- /svelte-spa-router/3.2.0:
- resolution: {integrity: sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==}
- dependencies:
- regexparam: 2.0.0
- dev: true
-
- /svelte/3.49.0:
- resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==}
- engines: {node: '>= 8'}
- dev: true
-
- /to-regex-range/5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
- dependencies:
- is-number: 7.0.0
- dev: true
-
- /tslib/2.4.0:
- resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
- dev: false
-
- /typesafe-i18n/5.11.0_typescript@4.7.4:
- resolution: {integrity: sha512-OVX/6/F834XldHTMdmo3TcMPePcvLXwYrkDgqWYxmuVCTyCrk0aIdUOIWM0RPZEQ2D106+/LcWFCkJiBCuK2pA==}
- hasBin: true
- peerDependencies:
- typescript: '>=3.5.1'
- dependencies:
- typescript: 4.7.4
- dev: false
-
- /typescript/4.7.4:
- resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
- engines: {node: '>=4.2.0'}
- hasBin: true
-
- /unbox-primitive/1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- dependencies:
- call-bind: 1.0.2
- has-bigints: 1.0.2
- has-symbols: 1.0.3
- which-boxed-primitive: 1.0.2
- dev: true
-
- /unload/2.3.1:
- resolution: {integrity: sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==}
- dependencies:
- '@babel/runtime': 7.18.9
- detect-node: 2.1.0
- dev: true
-
- /validate-npm-package-license/3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
- dependencies:
- spdx-correct: 3.1.1
- spdx-expression-parse: 3.0.1
- dev: true
-
- /vite/3.0.4_sass@1.54.0:
- resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- less: '*'
- sass: '*'
- stylus: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- less:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.14.51
- postcss: 8.4.14
- resolve: 1.22.1
- rollup: 2.77.2
- sass: 1.54.0
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
- /which-boxed-primitive/1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
- dependencies:
- is-bigint: 1.0.4
- is-boolean-object: 1.1.2
- is-number-object: 1.0.7
- is-string: 1.0.7
- is-symbol: 1.0.4
- dev: true
-
- /which/1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
- dependencies:
- isexe: 2.0.0
- dev: true
-
- /wrappy/1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- dev: true
diff --git a/apps/projects/src/tsconfig.json b/apps/projects/src/tsconfig.json
deleted file mode 100644
index c60fce6..0000000
--- a/apps/projects/src/tsconfig.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "include": [
- "./**/*.d.ts",
- "./**/*.ts",
- "./**/*.js",
- "./**/*.svelte"
- ],
- "exclude": [
- "./node_modules"
- ],
- "compilerOptions": {
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "allowJs": true,
- "checkJs": false,
- "paths": {
- "$app/*": [
- "./app/*"
- ],
- "$shared/*": [
- "../../web-shared/src/*"
- ]
- }
- }
-}
diff --git a/apps/projects/src/vite.config.ts b/apps/projects/src/vite.config.ts
deleted file mode 100644
index 1686884..0000000
--- a/apps/projects/src/vite.config.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import {defineConfig} from "vite";
-import {svelte} from "@sveltejs/vite-plugin-svelte";
-import sveltePreprocess from "svelte-preprocess";
-// @ts-ignore
-import path from "path";
-
-// https://vitejs.dev/config/
-export default defineConfig({
- resolve: {
- alias: {
- "$shared": path.resolve(__dirname, "../../web-shared/src"),
- "$app": path.resolve(__dirname, "./app")
- }
- },
- build: {
- outDir: "build",
- emptyOutDir: true,
- rollupOptions: {
- input: {
- main: path.resolve(__dirname, "index.html"),
- }
- }
- },
- server: {
- port: 3000
- },
- plugins: [
- svelte({
- preprocess: sveltePreprocess()
- })
- ],
-});
diff --git a/apps/web-shared/.typesafe-i18n.json b/apps/web-shared/.typesafe-i18n.json
deleted file mode 100644
index 574db64..0000000
--- a/apps/web-shared/.typesafe-i18n.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "esmImports": true,
- "outputPath": "./src/lib/i18n",
- "$schema": "https://unpkg.com/typesafe-i18n@5.5.2/schema/typesafe-i18n.json"
-} \ No newline at end of file
diff --git a/apps/web-shared/package.json b/apps/web-shared/package.json
deleted file mode 100644
index 67b1336..0000000
--- a/apps/web-shared/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "greatoffice-web-shared",
- "version": "0.0.1",
- "private": "true",
- "scripts": {
- "dev": "npm-run-all --parallel vite typesafe-i18n",
- "vite": "vite",
- "typesafe-i18n": "typesafe-i18n"
- },
- "devDependencies": {
- "@js-temporal/polyfill": "^0.4.2",
- "fuzzysort": "^2.0.1",
- "npm-run-all": "^4.1.5",
- "svelte": "^3.49.0",
- "svelte-feather-icons": "^4.0.0",
- "svelte-spa-router": "^3.3.0",
- "typesafe-i18n": "^5.11.0",
- "typescript": "4.7.4"
- }
-}
diff --git a/apps/web-shared/pnpm-lock.yaml b/apps/web-shared/pnpm-lock.yaml
deleted file mode 100644
index 628f54b..0000000
--- a/apps/web-shared/pnpm-lock.yaml
+++ /dev/null
@@ -1,628 +0,0 @@
-lockfileVersion: 5.4
-
-specifiers:
- '@js-temporal/polyfill': ^0.4.2
- fuzzysort: ^2.0.1
- npm-run-all: ^4.1.5
- svelte: ^3.49.0
- svelte-feather-icons: ^4.0.0
- svelte-spa-router: ^3.3.0
- typesafe-i18n: ^5.11.0
- typescript: 4.7.4
-
-devDependencies:
- '@js-temporal/polyfill': 0.4.2
- fuzzysort: 2.0.1
- npm-run-all: 4.1.5
- svelte: 3.49.0
- svelte-feather-icons: 4.0.0
- svelte-spa-router: 3.3.0
- typesafe-i18n: 5.11.0_typescript@4.7.4
- typescript: 4.7.4
-
-packages:
-
- /@js-temporal/polyfill/0.4.2:
- resolution: {integrity: sha512-c85vRxyqnJaXKyf4tvYij8jwiVIZhNLYDI9C4LLuOwVEHf4HUqGg07BBn70Le71W193QT/vmKg3jPUyQxJRHKQ==}
- engines: {node: '>=12'}
- dependencies:
- jsbi: 4.3.0
- tslib: 2.4.0
- dev: true
-
- /ansi-styles/3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
- dev: true
-
- /balanced-match/1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- dev: true
-
- /brace-expansion/1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
- dev: true
-
- /call-bind/1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
- dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.1.2
- dev: true
-
- /chalk/2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
- dev: true
-
- /color-convert/1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
- dependencies:
- color-name: 1.1.3
- dev: true
-
- /color-name/1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
- dev: true
-
- /concat-map/0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- dev: true
-
- /cross-spawn/6.0.5:
- resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
- engines: {node: '>=4.8'}
- dependencies:
- nice-try: 1.0.5
- path-key: 2.0.1
- semver: 5.7.1
- shebang-command: 1.2.0
- which: 1.3.1
- dev: true
-
- /define-properties/1.1.4:
- resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
- dev: true
-
- /error-ex/1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
- dependencies:
- is-arrayish: 0.2.1
- dev: true
-
- /es-abstract/1.20.1:
- resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- es-to-primitive: 1.2.1
- function-bind: 1.1.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.1.2
- get-symbol-description: 1.0.0
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-symbols: 1.0.3
- internal-slot: 1.0.3
- is-callable: 1.2.4
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-weakref: 1.0.2
- object-inspect: 1.12.2
- object-keys: 1.1.1
- object.assign: 4.1.3
- regexp.prototype.flags: 1.4.3
- string.prototype.trimend: 1.0.5
- string.prototype.trimstart: 1.0.5
- unbox-primitive: 1.0.2
- dev: true
-
- /es-to-primitive/1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
- dependencies:
- is-callable: 1.2.4
- is-date-object: 1.0.5
- is-symbol: 1.0.4
- dev: true
-
- /escape-string-regexp/1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
- dev: true
-
- /function-bind/1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
- dev: true
-
- /function.prototype.name/1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- functions-have-names: 1.2.3
- dev: true
-
- /functions-have-names/1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: true
-
- /fuzzysort/2.0.1:
- resolution: {integrity: sha512-SlgbPAq0eQ6JQ1h3l4MNeGH/t9DHKH8GGM0RD/6RhmJrNnSoWt3oIVaiQm9g9BPB+wAhRMeMqlUTbhbd7+Ufcg==}
- dev: true
-
- /get-intrinsic/1.1.2:
- resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==}
- dependencies:
- function-bind: 1.1.1
- has: 1.0.3
- has-symbols: 1.0.3
- dev: true
-
- /get-symbol-description/1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.1.2
- dev: true
-
- /graceful-fs/4.2.10:
- resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
- dev: true
-
- /has-bigints/1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: true
-
- /has-flag/3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
- dev: true
-
- /has-property-descriptors/1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
- dependencies:
- get-intrinsic: 1.1.2
- dev: true
-
- /has-symbols/1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /has-tostringtag/1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
- /has/1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
- dependencies:
- function-bind: 1.1.1
- dev: true
-
- /hosted-git-info/2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
- dev: true
-
- /internal-slot/1.0.3:
- resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.1.2
- has: 1.0.3
- side-channel: 1.0.4
- dev: true
-
- /is-arrayish/0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- dev: true
-
- /is-bigint/1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
- dependencies:
- has-bigints: 1.0.2
- dev: true
-
- /is-boolean-object/1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
-
- /is-callable/1.2.4:
- resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /is-core-module/2.10.0:
- resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
- dependencies:
- has: 1.0.3
- dev: true
-
- /is-date-object/1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-negative-zero/2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /is-number-object/1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-regex/1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
-
- /is-shared-array-buffer/1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
- dependencies:
- call-bind: 1.0.2
- dev: true
-
- /is-string/1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-symbol/1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
- /is-weakref/1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
- dependencies:
- call-bind: 1.0.2
- dev: true
-
- /isexe/2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- dev: true
-
- /jsbi/4.3.0:
- resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==}
- dev: true
-
- /json-parse-better-errors/1.0.2:
- resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
- dev: true
-
- /load-json-file/4.0.0:
- resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
- engines: {node: '>=4'}
- dependencies:
- graceful-fs: 4.2.10
- parse-json: 4.0.0
- pify: 3.0.0
- strip-bom: 3.0.0
- dev: true
-
- /memorystream/0.3.1:
- resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
- engines: {node: '>= 0.10.0'}
- dev: true
-
- /minimatch/3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
- dependencies:
- brace-expansion: 1.1.11
- dev: true
-
- /nice-try/1.0.5:
- resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
- dev: true
-
- /normalize-package-data/2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
- dependencies:
- hosted-git-info: 2.8.9
- resolve: 1.22.1
- semver: 5.7.1
- validate-npm-package-license: 3.0.4
- dev: true
-
- /npm-run-all/4.1.5:
- resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
- engines: {node: '>= 4'}
- hasBin: true
- dependencies:
- ansi-styles: 3.2.1
- chalk: 2.4.2
- cross-spawn: 6.0.5
- memorystream: 0.3.1
- minimatch: 3.1.2
- pidtree: 0.3.1
- read-pkg: 3.0.0
- shell-quote: 1.7.3
- string.prototype.padend: 3.1.3
- dev: true
-
- /object-inspect/1.12.2:
- resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
- dev: true
-
- /object-keys/1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /object.assign/4.1.3:
- resolution: {integrity: sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- has-symbols: 1.0.3
- object-keys: 1.1.1
- dev: true
-
- /parse-json/4.0.0:
- resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
- engines: {node: '>=4'}
- dependencies:
- error-ex: 1.3.2
- json-parse-better-errors: 1.0.2
- dev: true
-
- /path-key/2.0.1:
- resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
- engines: {node: '>=4'}
- dev: true
-
- /path-parse/1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- dev: true
-
- /path-type/3.0.0:
- resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
- engines: {node: '>=4'}
- dependencies:
- pify: 3.0.0
- dev: true
-
- /pidtree/0.3.1:
- resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==}
- engines: {node: '>=0.10'}
- hasBin: true
- dev: true
-
- /pify/3.0.0:
- resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
- engines: {node: '>=4'}
- dev: true
-
- /read-pkg/3.0.0:
- resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
- engines: {node: '>=4'}
- dependencies:
- load-json-file: 4.0.0
- normalize-package-data: 2.5.0
- path-type: 3.0.0
- dev: true
-
- /regexp.prototype.flags/1.4.3:
- resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- functions-have-names: 1.2.3
- dev: true
-
- /regexparam/2.0.1:
- resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==}
- engines: {node: '>=8'}
- dev: true
-
- /resolve/1.22.1:
- resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
- hasBin: true
- dependencies:
- is-core-module: 2.10.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
- dev: true
-
- /semver/5.7.1:
- resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
- hasBin: true
- dev: true
-
- /shebang-command/1.2.0:
- resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- shebang-regex: 1.0.0
- dev: true
-
- /shebang-regex/1.0.0:
- resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /shell-quote/1.7.3:
- resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
- dev: true
-
- /side-channel/1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.1.2
- object-inspect: 1.12.2
- dev: true
-
- /spdx-correct/3.1.1:
- resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
- dependencies:
- spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.11
- dev: true
-
- /spdx-exceptions/2.3.0:
- resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
- dev: true
-
- /spdx-expression-parse/3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
- dependencies:
- spdx-exceptions: 2.3.0
- spdx-license-ids: 3.0.11
- dev: true
-
- /spdx-license-ids/3.0.11:
- resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==}
- dev: true
-
- /string.prototype.padend/3.1.3:
- resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /string.prototype.trimend/1.0.5:
- resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /string.prototype.trimstart/1.0.5:
- resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
- es-abstract: 1.20.1
- dev: true
-
- /strip-bom/3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
- dev: true
-
- /supports-color/5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
- dependencies:
- has-flag: 3.0.0
- dev: true
-
- /supports-preserve-symlinks-flag/1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /svelte-feather-icons/4.0.0:
- resolution: {integrity: sha512-4ieUsjp+VYa1r6y80jDt9zRiRUZyJNbESpRdHdJJhiBubyuXX96A7f1UZSK4olxzP6Qsg5ZAuyZlnmvD+/swAA==}
- dependencies:
- svelte: 3.49.0
- dev: true
-
- /svelte-spa-router/3.3.0:
- resolution: {integrity: sha512-cwRNe7cxD43sCvSfEeaKiNZg3FCizGxeMcf7CPiWRP3jKXjEma3vxyyuDtPOam6nWbVxl9TNM3hlE/i87ZlqcQ==}
- dependencies:
- regexparam: 2.0.1
- dev: true
-
- /svelte/3.49.0:
- resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==}
- engines: {node: '>= 8'}
- dev: true
-
- /tslib/2.4.0:
- resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
- dev: true
-
- /typesafe-i18n/5.11.0_typescript@4.7.4:
- resolution: {integrity: sha512-OVX/6/F834XldHTMdmo3TcMPePcvLXwYrkDgqWYxmuVCTyCrk0aIdUOIWM0RPZEQ2D106+/LcWFCkJiBCuK2pA==}
- hasBin: true
- peerDependencies:
- typescript: '>=3.5.1'
- dependencies:
- typescript: 4.7.4
- dev: true
-
- /typescript/4.7.4:
- resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
- engines: {node: '>=4.2.0'}
- hasBin: true
- dev: true
-
- /unbox-primitive/1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- dependencies:
- call-bind: 1.0.2
- has-bigints: 1.0.2
- has-symbols: 1.0.3
- which-boxed-primitive: 1.0.2
- dev: true
-
- /validate-npm-package-license/3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
- dependencies:
- spdx-correct: 3.1.1
- spdx-expression-parse: 3.0.1
- dev: true
-
- /which-boxed-primitive/1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
- dependencies:
- is-bigint: 1.0.4
- is-boolean-object: 1.1.2
- is-number-object: 1.0.7
- is-string: 1.0.7
- is-symbol: 1.0.4
- dev: true
-
- /which/1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
- dependencies:
- isexe: 2.0.0
- dev: true
diff --git a/apps/web-shared/src/assets/logos/projects.png b/apps/web-shared/src/assets/logos/projects.png
deleted file mode 100644
index e49191f..0000000
--- a/apps/web-shared/src/assets/logos/projects.png
+++ /dev/null
Binary files differ
diff --git a/apps/web-shared/src/assets/preload.css b/apps/web-shared/src/assets/preload.css
deleted file mode 100644
index 3ee8bda..0000000
--- a/apps/web-shared/src/assets/preload.css
+++ /dev/null
@@ -1,127 +0,0 @@
-:root {
- --loader-primary: hsl(210, 92%, 44%);
- --loader-accent: hsl(350, 47%, 42%);
- --loader-contrast: hsl(230, 2%, 48%);
- --loader-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
-}
-
-[data-theme="dark"] :root {
- --loader-primary: hsl(250, 100%, 69%);
- --loader-accent: hsl(342, 92%, 47%);
- --loader-contrast: hsl(250, 100%, 69%);
- --loader-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
-}
-
-[data-theme="dark"] {
- background-color: hsl(232, 11%, 15%);
-}
-
-.fill-loader {
- position: relative;
- overflow: hidden;
- display: inline-block;
- margin: 3rem;
-}
-
-.fill-loader__fill {
- position: absolute;
-}
-
-@supports (-webkit-animation-name: this) or (animation-name: this) {
- .fill-loader__label {
- position: absolute;
- clip: rect(1px, 1px, 1px, 1px);
- -webkit-clip-path: inset(50%);
- clip-path: inset(50%);
- }
-}
-
-@supports (-webkit-animation-name: this) or (animation-name: this) {
- .fill-loader--v4 {
- width: 90%;
- max-width: 300px;
- }
-
- .fill-loader--v4 .fill-loader__base {
- height: 4px;
- background-color: var(--loader-contrast);
- }
-
- .fill-loader--v4 .fill-loader__fill {
- top: 0;
- left: 0;
- right: 0;
- height: 100%;
- background-color: var(--loader-primary);
- -webkit-animation: fill-loader-4 1.6s infinite var(--loader-easing);
- animation: fill-loader-4 1.6s infinite var(--loader-easing);
- will-change: left, right;
- }
-}
-
-@-webkit-keyframes fill-loader-4 {
- 0% {
- left: 0;
- right: 100%;
- background-color: var(--loader-primary);
- }
-
- 10%,
- 60% {
- left: 0;
- }
-
- 40%,
- 90% {
- right: 0;
- }
-
- 50% {
- left: 100%;
- background-color: var(--loader-primary);
- }
-
- 51% {
- left: 0;
- right: 100%;
- background-color: var(--loader-accent);
- }
-
- 100% {
- left: 100%;
- background-color: var(--loader-accent);
- }
-}
-@keyframes fill-loader-4 {
- 0% {
- left: 0;
- right: 100%;
- background-color: var(--loader-primary);
- }
-
- 10%,
- 60% {
- left: 0;
- }
-
- 40%,
- 90% {
- right: 0;
- }
-
- 50% {
- left: 100%;
- background-color: var(--loader-primary);
- }
-
- 51% {
- left: 0;
- right: 100%;
- background-color: var(--loader-accent);
- }
-
- 100% {
- left: 100%;
- background-color: var(--loader-accent);
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/components/alert.svelte b/apps/web-shared/src/components/alert.svelte
deleted file mode 100644
index 4119edf..0000000
--- a/apps/web-shared/src/components/alert.svelte
+++ /dev/null
@@ -1,121 +0,0 @@
-<script lang="ts">
- import {random_string} from "$shared/lib/helpers";
- import {afterUpdate, onMount} from "svelte";
- import {Temporal} from "@js-temporal/polyfill";
-
- const noCooldownSetting = "no-cooldown";
- // if no unique id is supplied, cooldown will not work between page loads.
- // Therefore we are disabling it with noCooldownSetting in the fallback id.
- export let id = "alert--" + noCooldownSetting + "--" + random_string(4);
- export let title = "";
- export let message = "";
- export let type = "info";
- export let closeable = false;
- export let closeableCooldown = "-1";
- export let visible = true;
-
- const cooldownStorageKey = "lastseen--" + id;
- $: cooldownEnabled = id.indexOf(noCooldownSetting) === -1 && closeable && (closeableCooldown === "~" || parseInt(closeableCooldown) > 0);
-
- function close() {
- visible = false;
- if (cooldownEnabled) {
- console.log("Cooldown enabled for " + id + ", " + closeableCooldown === "~" ? "with an endless cooldown" : "");
- localStorage.setItem(cooldownStorageKey, String(Temporal.Now.instant().epochSeconds));
- }
- }
-
- // Manages the state of the alert if cooldown is enabled
- function run_cooldown() {
- if (!cooldownEnabled) {
- console.log("Alert cooldown is not enabled for " + id);
- return;
- }
- if (!localStorage.getItem(cooldownStorageKey)) {
- console.log("Alert " + id + " has not been seen yet, displaying");
- visible = true;
- return;
- }
- if (!visible) {
- console.log("Alert " + id + " is not visible, stopping cooldown change")
- return;
- }
- if (closeableCooldown === "~") {
- console.log("Alert " + id + " has an infinite cooldown, hiding");
- visible = false;
- return;
- }
-
- const lastSeen = Temporal.Instant.fromEpochSeconds(localStorage.getItem(cooldownStorageKey) as number);
- if (Temporal.Instant.compare(Temporal.Now.instant(), lastSeen.add({seconds: parseInt(closeableCooldown)})) === 1) {
- console.log("Alert " + id + " has a cooldown of " + closeableCooldown + " and was last seen " + lastSeen.toLocaleString() + " making it due for a showing");
- visible = true;
- } else {
- visible = false;
- }
- }
-
- onMount(() => {
- if (cooldownEnabled) {
- run_cooldown();
- }
- })
-
- afterUpdate(() => {
- if (type === "default") {
- type = "primary";
- }
- });
-</script>
-
-<div class="alert alert--{type} padding-sm radius-md"
- id="{id}"
- class:alert--is-visible={visible}
- role="alert">
- <div class="flex justify-between">
- <div class="flex flex-row items-center">
- <svg class="icon icon--sm alert__icon margin-right-xxs"
- viewBox="0 0 24 24"
- aria-hidden="true">
- <path d="M12,0C5.383,0,0,5.383,0,12s5.383,12,12,12s12-5.383,12-12S18.617,0,12,0z M14.658,18.284 c-0.661,0.26-2.952,1.354-4.272,0.191c-0.394-0.346-0.59-0.785-0.59-1.318c0-0.998,0.328-1.868,0.919-3.957 c0.104-0.395,0.231-0.907,0.231-1.313c0-0.701-0.266-0.887-0.987-0.887c-0.352,0-0.742,0.125-1.095,0.257l0.195-0.799 c0.787-0.32,1.775-0.71,2.621-0.71c1.269,0,2.203,0.633,2.203,1.837c0,0.347-0.06,0.955-0.186,1.375l-0.73,2.582 c-0.151,0.522-0.424,1.673-0.001,2.014c0.416,0.337,1.401,0.158,1.887-0.071L14.658,18.284z M13.452,8c-0.828,0-1.5-0.672-1.5-1.5 s0.672-1.5,1.5-1.5s1.5,0.672,1.5,1.5S14.28,8,13.452,8z"></path>
- </svg>
- {#if title}
- <p class="text-sm">
- <strong class="error-title">{title}</strong>
- </p>
- {:else if message}
- <div class="text-component text-sm break-word">
- {@html message}
- </div>
- {/if}
- </div>
- {#if closeable}
- <button class="reset alert__close-btn"
- on:click={close}>
- <svg class="icon"
- viewBox="0 0 20 20"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2">
- <title>Close alert</title>
- <line x1="3"
- y1="3"
- x2="17"
- y2="17"/>
- <line x1="17"
- y1="3"
- x2="3"
- y2="17"/>
- </svg>
- </button>
- {/if}
- </div>
-
- {#if message && title}
- <div class="text-component text-sm break-word padding-top-xs">
- {@html message}
- </div>
- {/if}
-</div>
diff --git a/apps/web-shared/src/components/blowout-toolbelt.svelte b/apps/web-shared/src/components/blowout-toolbelt.svelte
deleted file mode 100644
index b83048c..0000000
--- a/apps/web-shared/src/components/blowout-toolbelt.svelte
+++ /dev/null
@@ -1,70 +0,0 @@
-<script>
- import { onMount } from "svelte";
- import ThemeSwitcher from "./theme-switcher.svelte";
- import ThemeSwitcherIcon from "./theme-switcher-icon.svelte";
- import LocaleSwitcher from "./locale-switcher.svelte";
- import LocaleSwitcherIcon from "./locale-switcher-icon.svelte";
- import { ChevronsRightIcon, ChevronsLeftIcon } from "svelte-feather-icons";
-
- let expanded = false;
- const localeSwitcher = {
- show: false,
- selection: "preffered"
- };
-
- const themeSwitcher = {
- show: false,
- selection: "system"
- };
-
- onMount(() => {
- document.addEventListener("keydown", (e) => {
- if (e.code === "Escape") {
- expanded = false;
- }
- });
- document.addEventListener("click", (e) => {
- if (e.target.closest("[data-blowout-toolbelt-element]") === null) {
- expanded = false;
- }
- });
- });
-</script>
-<style>
- .blowout {
- right: -80px;
- }
-
- .expanded {
- right: 0 !important;
- }
-</style>
-<aside class="blowout position-fixed bg-light inner-glow shadow-xs padding-xxs bottom-50% right-0 z-index-popover {expanded ? 'expanded' : ''}" data-blowout-toolbelt-element>
- <LocaleSwitcher bind:show="{localeSwitcher.show}"
- glow="{false}"
- data-blowout-toolbelt-element
- bind:selection="{localeSwitcher.selection}"/>
- <ThemeSwitcher bind:show="{themeSwitcher.show}"
- glow="{false}"
- data-blowout-toolbelt-element
- bind:selection="{themeSwitcher.selection}"/>
- <div class="flex flex-row gap-sm justify-end">
- {#if !expanded}
- <div class="flex ld-switch-btn"
- data-blowout-toolbelt-element
- on:click={() => expanded = true}>
- <ChevronsLeftIcon/>
- </div>
- {:else}
- <div class="flex ld-switch-btn"
- data-blowout-toolbelt-element
- on:click={() => expanded = false}>
- <ChevronsRightIcon/>
- </div>
- {/if}
- <LocaleSwitcherIcon bind:show="{localeSwitcher.show}"
- bind:selection="{localeSwitcher.selection}"/>
- <ThemeSwitcherIcon bind:show="{themeSwitcher.show}"
- bind:selection="{themeSwitcher.selection}"/>
- </div>
-</aside>
diff --git a/apps/web-shared/src/components/breadcrumb/bread.svelte b/apps/web-shared/src/components/breadcrumb/bread.svelte
deleted file mode 100644
index 244bb24..0000000
--- a/apps/web-shared/src/components/breadcrumb/bread.svelte
+++ /dev/null
@@ -1,9 +0,0 @@
-<script lang="ts">
- export type sizes = "big"|"small";
- export let size: sizes = "small";
-</script>
-<nav class="breadcrumbs {size === 'small' ? 'text-sm' : 'text-lg'}">
- <ol class="flex flex-wrap items-center gap-xxs">
- <slot></slot>
- </ol>
-</nav>
diff --git a/apps/web-shared/src/components/breadcrumb/crumb.svelte b/apps/web-shared/src/components/breadcrumb/crumb.svelte
deleted file mode 100644
index e540a44..0000000
--- a/apps/web-shared/src/components/breadcrumb/crumb.svelte
+++ /dev/null
@@ -1,27 +0,0 @@
-<script>
- export let name;
- export let withArrow = false;
- export let isLink = false;
-</script>
-<li class="breadcrumbs__item">
- {#if isLink}
- <a class="color-inherit {isLink ? 'cursor-pointer color-primary-light' : ''}"
- on:click>{name}</a>
- {:else}
- <span class="color-inherit {isLink ? 'cursor-pointer color-primary-light' : ''}"
- on:click>{name}</span>
- {/if}
- {#if withArrow}
- <svg class="icon margin-left-xxxs color-contrast-low"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <polyline fill="none"
- stroke="currentColor"
- stroke-width="1"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-miterlimit="10"
- points="6.5,3.5 11,8 6.5,12.5 "></polyline>
- </svg>
- {/if}
-</li>
diff --git a/apps/web-shared/src/components/breadcrumb/index.ts b/apps/web-shared/src/components/breadcrumb/index.ts
deleted file mode 100644
index 485ed7b..0000000
--- a/apps/web-shared/src/components/breadcrumb/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Bread from "./bread.svelte";
-import Crumb from "./crumb.svelte";
-
-export {
- Bread,
- Crumb
-};
diff --git a/apps/web-shared/src/components/button.svelte b/apps/web-shared/src/components/button.svelte
deleted file mode 100644
index 5eaf19f..0000000
--- a/apps/web-shared/src/components/button.svelte
+++ /dev/null
@@ -1,116 +0,0 @@
-<script lang="ts">
- import Icon from "$shared/components/icon.svelte";
-
- export let text = "";
- export let title = "";
- export let href = "";
- export let variant: "primary"|"secondary"|"subtle" = "primary";
- export let type: "button"|"submit"|"reset" = "button";
- export let disabled = false;
- export let loading = false;
- export let icon = "";
- export let icon_right_aligned = false;
- export let icon_width = false;
- export let icon_height = false;
- export let id;
- export let tabindex;
- export let style;
-
- $: shared_props = {
- type: type,
- id: id || null,
- title: title || null,
- disabled: disabled || null,
- tabindex: tabindex || null,
- style: style || null,
- "aria-controls": ($$restProps["aria-controls"] ?? "") || null,
- class: [variant === "reset" ? "reset" : `btn btn--${variant} btn--preserve-width ${loading ? "btn--state-b" : ""}`, $$restProps.class ?? ""].filter(Boolean).join(" "),
- };
-</script>
-
-<template>
- {#if href && !disabled}
- <a {href}
- {...shared_props}
- on:click>
- <span class="btn__content-a">
- {#if icon !== ""}
- {#if icon_right_aligned}
- {text}
- <Icon class="{text ? 'margin-left-xxxs': ''}"
- width={icon_width}
- height={icon_height}
- name={icon}/>
- {:else}
- <Icon class="{text ? 'margin-left-xxxs': ''}"
- width={icon_width}
- height={icon_height}
- name={icon}/>
- {text}
- {/if}
- {:else}
- {text}
- {/if}
- </span>
- {#if variant !== "reset" && loading}
- <span class="btn__content-b">
- <svg class="icon icon--is-spinning"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <title>Loading</title>
- <g stroke-width="1"
- fill="currentColor"
- stroke="currentColor">
- <path d="M.5,8a7.5,7.5,0,1,1,1.91,5"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"/>
- </g>
- </svg>
- </span>
- {/if}
- </a>
- {:else}
- <button {...shared_props}
- on:click>
- <span class="btn__content-a">
- {#if icon !== ""}
- {#if icon_right_aligned}
- {text}
- <Icon class="{text ? 'margin-left-xxxs': ''}"
- width={icon_width}
- height={icon_height}
- name={icon}/>
- {:else}
- <Icon class="{text ? 'margin-left-xxxs': ''}"
- width={icon_width}
- height={icon_height}
- name={icon}/>
- {text}
- {/if}
- {:else}
- {text}
- {/if}
- </span>
- {#if variant !== "reset" && loading}
- <span class="btn__content-b">
- <svg class="icon icon--is-spinning"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <title>Loading</title>
- <g stroke-width="1"
- fill="currentColor"
- stroke="currentColor">
- <path d="M.5,8a7.5,7.5,0,1,1,1.91,5"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"/>
- </g>
- </svg>
- </span>
- {/if}
- </button>
- {/if}
-</template>
diff --git a/apps/web-shared/src/components/chip.svelte b/apps/web-shared/src/components/chip.svelte
deleted file mode 100644
index 7fbb445..0000000
--- a/apps/web-shared/src/components/chip.svelte
+++ /dev/null
@@ -1,50 +0,0 @@
-<script>
- import {IconNames} from "$shared/lib/configuration";
- import {createEventDispatcher} from "svelte";
- import Button from "./button.svelte";
-
- const dispatch = createEventDispatcher();
- export let removable = false;
- export let clickable = false;
- export let text = "";
- export let id = "";
- export let color = "";
- export let tabindex = "";
-
- function handle_remove() {
- if (removable) {
- dispatch("remove", {
- id
- });
- }
- }
-
- function handle_click() {
- if (clickable) {
- dispatch("clicked", {
- id
- });
- }
- }
-</script>
-
-<div class="chip break-word text-sm justify-between justify-start@md {clickable ? 'chip--interactive' : ''}"
- on:click={handle_click}
- id={id}
- style={color !== "" ? `background-color: ${color}15; border: 1px solid ${color}; color: ${color}` : ""}
- {tabindex}
->
- <span class="chip__label">{text}</span>
-
- {#if removable}
- <Button class="chip__btn"
- variant="reset"
- style="{color !== '' ? `background-color: ${color}45;` : ''}"
- {tabindex}
- icon="{IconNames.x}"
- icon_width="initial"
- icon_height="initial"
- on:click={handle_remove}
- />
- {/if}
-</div>
diff --git a/apps/web-shared/src/components/details.svelte b/apps/web-shared/src/components/details.svelte
deleted file mode 100644
index 6ccacb0..0000000
--- a/apps/web-shared/src/components/details.svelte
+++ /dev/null
@@ -1,35 +0,0 @@
-<script>
- import {random_string} from "$shared/lib/helpers";
-
- let open = false;
- export let summary;
- const id = "details-" + random_string(4);
-
- function on_toggle(event) {
- open = event.target.open;
- }
-</script>
-
-<details class="details margin-bottom-sm"
- on:toggle={on_toggle}
- id={id}>
- <summary class="details__summary"
- aria-controls={id}
- aria-expanded={open}>
- <span class="flex items-center">
- <svg
- class="icon icon--xxs margin-right-xxxs"
- aria-hidden="true"
- viewBox="0 0 12 12">
- <path
- d="M2.783.088A.5.5,0,0,0,2,.5v11a.5.5,0,0,0,.268.442A.49.49,0,0,0,2.5,12a.5.5,0,0,0,.283-.088l8-5.5a.5.5,0,0,0,0-.824Z"/>
- </svg>
- <span>{summary}</span>
- </span>
- </summary>
- <div
- class="details__content text-component margin-top-xs"
- aria-hidden={!open}>
- <slot/>
- </div>
-</details>
diff --git a/apps/web-shared/src/components/dropdown.svelte b/apps/web-shared/src/components/dropdown.svelte
deleted file mode 100644
index a28bcd3..0000000
--- a/apps/web-shared/src/components/dropdown.svelte
+++ /dev/null
@@ -1,389 +0,0 @@
-<script lang="ts">
- // @ts-ignore
- import { go, highlight } from "fuzzysort";
- import { element_has_focus, random_string } from "$shared/lib/helpers";
- import Button from "$shared/components/button.svelte";
- import Chip from "$shared/components/chip.svelte";
-
- export let name;
- export let id;
- export let maxlength;
- export let placeholder = "Search";
- export let entries = [];
- export let createable = false;
- export let loading = false;
- export let multiple = false;
- export let noResultsText;
- export let errorText;
- export let label;
- export let on_create_async = ({name: string}) => {
- };
-
- export const reset = () => methods.reset();
- export const select = (id: string) => methods.select_entry(id);
- export const deselect = (id: string) => methods.deselect_entry(id);
-
- const INTERNAL_ID = "__dropdown-" + random_string(5);
-
- let searchInputNode;
- let searchResults = [];
- let searchValue = "";
- let showCreationHint = false;
- let showDropdown = false;
- let lastKeydownCode = "";
- let mouseIsOverDropdown = false;
- let mouseIsOverComponent = false;
-
- $: hasSelection = entries.some((c) => c.selected === true);
- $: if (searchValue.trim()) {
- showCreationHint = createable && entries.every((c) => search.normalise_value(c.name) !== search.normalise_value(searchValue));
- } else {
- showCreationHint = false;
- entries = methods.get_sorted_array(entries);
- }
-
- const search = {
- normalise_value(value: string): string {
- if (!value) {
- return "";
- }
- return value.toString().trim().toLowerCase();
- },
- do() {
- const query = search.normalise_value(searchValue);
- if (!query.trim()) {
- searchResults = [];
- return;
- }
-
- const options = {
- limit: 10,
- allowTypo: true,
- threshold: -10000,
- key: "name",
- };
- searchResults = go(query, entries, options);
- showDropdown = true;
- },
- on_input_focusout() {
- if (lastKeydownCode !== "Tab" && (mouseIsOverDropdown || lastKeydownCode === "ArrowDown")) {
- return;
- }
- const selected = entries.find((c) => c.selected === true);
- if (selected && !multiple) {
- searchValue = selected.name;
- }
- document.querySelector("#" + INTERNAL_ID + " ul li.focus")?.classList.remove("focus");
- showDropdown = false;
- }
- };
-
- const methods = {
- reset(focus_input = false) {
- searchValue = "";
- const copy = entries;
- for (const entry of copy) {
- entry.selected = false;
- }
- entries = methods.get_sorted_array(copy);
- if (focus_input) {
- searchInputNode?.focus();
- showDropdown = true;
- } else {
- showDropdown = false;
- }
- },
- async create_entry(name) {
- if (!name || !createable || loading) {
- console.log("Not sending creation event due to failed preconditions", {name, createable, loading});
- return;
- }
- try {
- await on_create_async({name});
- searchValue = "";
- loading = false;
- } catch (e) {
- console.error(e);
- }
- },
- select_entry(entry_id) {
- if (!entry_id || loading) {
- console.log("Not selecting entry due to failed preconditions", {
- entry_id,
- loading,
- });
- return;
- }
-
- const copy = entries;
- let selected;
- for (const entry of entries) {
- if (entry.id === entry_id) {
- entry.selected = true;
- selected = entry;
- if (multiple) {
- searchValue = "";
- } else {
- searchValue = entry.name;
- }
- } else if (!multiple) {
- entry.selected = false;
- }
- }
- entries = methods.get_sorted_array(copy);
- searchInputNode?.focus();
- searchResults = [];
- },
- deselect_entry(entry_id) {
- if (!entry_id || loading) {
- console.log("Not deselecting entry due to failed preconditions", {
- entry_id,
- loading,
- });
- return;
- }
- console.log("Deselecting entry", entry_id);
-
- const copy = entries;
- let deselected;
-
- for (const entry of copy) {
- if (entry.id === entry_id) {
- entry.selected = false;
- deselected = entry;
- }
- }
-
- entries = methods.get_sorted_array(copy);
- searchInputNode?.focus();
- },
- get_sorted_array(entries: Array<DropdownEntry>): Array<DropdownEntry> {
- if (!entries) {
- return;
- }
- if (entries.length < 1) {
- return [];
- }
- if (searchValue) {
- return entries;
- }
- return (entries as any).sort((a, b) => {
- search.normalise_value(a.name).localeCompare(search.normalise_value(b.name));
- });
- },
- };
-
- const windowEvents = {
- on_mousemove(event) {
- if (!event.target) return;
- mouseIsOverDropdown = (event.target?.closest("#" + INTERNAL_ID + " .autocomplete__results") != null ?? false);
- mouseIsOverComponent = (event.target?.closest("#" + INTERNAL_ID) != null ?? false);
- },
- on_click(event) {
- if (showDropdown && !mouseIsOverDropdown && !mouseIsOverComponent && event.target.id !== id && event.target?.htmlFor !== id) {
- showDropdown = false;
- }
- },
- on_keydown(event) {
- lastKeydownCode = event.code;
- const enterPressed = event.code === "Enter";
- const backspacePressed = event.code === "Backspace";
- const arrowUpPressed = event.code === "ArrowUp";
- const spacePressed = event.code === "Space";
- const arrowDownPressed = event.code === "ArrowDown";
- const searchInputHasFocus = element_has_focus(searchInputNode);
- const focusedEntry = document.querySelector("#" + INTERNAL_ID + " ul .focus");
-
- if (showDropdown && (enterPressed || arrowDownPressed)) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- if (searchInputHasFocus && backspacePressed && !searchValue && entries.length > 0) {
- if (entries.filter(c => c.selected === true).at(-1)?.id ?? false) {
- methods.deselect_entry(entries.filter(c => c.selected === true).at(-1)?.id ?? "");
- }
- return;
- }
- if (searchInputHasFocus && enterPressed && showCreationHint) {
- methods.create_entry(searchValue.trim());
- return;
- }
-
- if (searchInputHasFocus && !focusedEntry && arrowDownPressed) {
- const firstEntry = document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type");
- if (firstEntry) {
- firstEntry.classList.add("focus");
- return;
- }
- }
-
- if (focusedEntry && (arrowUpPressed || arrowDownPressed)) {
- if (arrowDownPressed) {
- if (focusedEntry.nextElementSibling) {
- focusedEntry.nextElementSibling.classList.add("focus");
- focusedEntry.nextElementSibling.scrollIntoView();
- } else {
- document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type").classList.add("focus");
- document.querySelector("#" + INTERNAL_ID + " ul li:first-of-type").scrollIntoView();
- }
- } else if (arrowUpPressed) {
- if (focusedEntry.previousElementSibling) {
- focusedEntry.previousElementSibling.classList.add("focus");
- focusedEntry.previousElementSibling.scrollIntoView();
- } else {
- document.querySelector("#" + INTERNAL_ID + " ul li:last-of-type").classList.add("focus");
- document.querySelector("#" + INTERNAL_ID + " ul li:last-of-type").scrollIntoView();
- }
- }
- focusedEntry.classList.remove("focus");
- return;
- }
-
- if (focusedEntry && (spacePressed || enterPressed)) {
- methods.select_entry(focusedEntry.dataset.id);
- return;
- }
-
- if (lastKeydownCode === "Tab" && !searchInputHasFocus) {
- showDropdown = false;
- }
- },
- on_touchend(event) {
- windowEvents.on_mousemove(event);
- }
- };
-
- interface DropdownEntry {
- name: string,
- id: string,
- }
-</script>
-
-<svelte:window
- on:keydown={windowEvents.on_keydown}
- on:mousemove={windowEvents.on_mousemove}
- on:touchend={windowEvents.on_touchend}
- on:click={windowEvents.on_click}
-/>
-
-{#if label}
- <label for="{id}"
- class="form-label margin-bottom-xxs">{label}</label>
-{/if}
-
-<div class="autocomplete position-relative select-auto"
- class:cursor-wait={loading}
- class:autocomplete--results-visible={showDropdown}
- class:select-auto--selection-done={searchValue}
- id={INTERNAL_ID}
->
- <!-- input -->
- <div class="select-auto__input-wrapper form-control"
- style="cursor: text"
- on:click={() => {
- if (!element_has_focus(searchInputNode)) searchInputNode.focus();
- showDropdown = true;
- }}
- class:multiple={multiple === true}
- class:has-selection={hasSelection}>
- {#if multiple === true && hasSelection}
- {#each entries.filter((c) => c.selected === true) as entry}
- <Chip id={entry.id}
- removable={true}
- tabindex="-1"
- on:remove={() => methods.deselect_entry(entry.id)}
- text={entry.name}/>
- {/each}
- {/if}
- <input
- class="reset width-100%"
- style="outline:none;"
- type="text"
- {name}
- {id}
- {maxlength}
- {placeholder}
- bind:value={searchValue}
- bind:this={searchInputNode}
- on:input={() => search.do()}
- on:click={() => (showDropdown = true)}
- on:focus={() => (showDropdown = true)}
- on:blur={search.on_input_focusout}
- autocomplete="off"
- />
- <div class="select-auto__input-icon-wrapper">
- <!-- arrow icon -->
- <svg class="icon"
- viewBox="0 0 16 16">
- <title>Open selection</title>
- <polyline points="1 5 8 12 15 5"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"/>
- </svg>
-
- <!-- close X icon -->
- <button class="reset select-auto__input-btn"
- type="button"
- on:click={() => reset(true)}>
- <svg class="icon"
- viewBox="0 0 16 16">
- <title>Reset selection</title>
- <path
- d="M8,0a8,8,0,1,0,8,8A8,8,0,0,0,8,0Zm3.707,10.293a1,1,0,1,1-1.414,1.414L8,9.414,5.707,11.707a1,1,0,0,1-1.414-1.414L6.586,8,4.293,5.707A1,1,0,0,1,5.707,4.293L8,6.586l2.293-2.293a1,1,0,1,1,1.414,1.414L9.414,8Z"
- />
- </svg>
- </button>
- </div>
- </div>
-
- {#if errorText}
- <small class="color-error">{errorText}</small>
- {/if}
-
- <!-- dropdown -->
- <div class="autocomplete__results select-auto__results shadow-xs inner-glow">
- <ul on:keydown={(event) => event.code.startsWith("Arrow") && event.preventDefault()}
- tabindex="-1"
- class="autocomplete__list">
- {#if searchResults.length > 0}
- {#each searchResults.filter((c) => !c.selected) as result}
- <li class="select-auto__option padding-y-xs padding-x-sm"
- data-id={result.obj.id}
- on:click={(e) => methods.select_entry(e.target.dataset.id)}
- tabindex="-1">
- {@html highlight(result, (open = '<span class="font-semibold">'), (close = "</span>"))}
- </li>
- {/each}
- {:else if entries.length > 0}
- {#each entries.filter((c) => !c.selected) as entry}
- <li class="select-auto__option padding-y-xs padding-x-sm"
- data-id={entry.id}
- on:click={(e) => methods.select_entry(e.target.dataset.id)}
- tabindex="-1">
- {entry.name}
- </li>
- {/each}
- {:else}
- <li class="select-auto__option text-center padding-y-xs padding-x-sm pointer-events-none"
- tabindex="-1">
- {noResultsText}
- </li>
- {/if}
- </ul>
- {#if showCreationHint}
- <div class="width-100% border-top border-bg-lighter padding-xxxs">
- <Button variant="reset"
- type="button"
- class="width-100%"
- text="Press enter or click to create {searchValue.trim()}"
- title="Press enter or click here to create {searchValue.trim()}"
- loading={loading}
- on:click={() => methods.create_entry(searchValue.trim())}/>
- </div>
- {/if}
- </div>
-</div>
diff --git a/apps/web-shared/src/components/form/index.ts b/apps/web-shared/src/components/form/index.ts
deleted file mode 100644
index 08769bd..0000000
--- a/apps/web-shared/src/components/form/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import Textarea from "./textarea.svelte";
-
-export {
- Textarea
-};
diff --git a/apps/web-shared/src/components/form/textarea.svelte b/apps/web-shared/src/components/form/textarea.svelte
deleted file mode 100644
index b313d2e..0000000
--- a/apps/web-shared/src/components/form/textarea.svelte
+++ /dev/null
@@ -1,48 +0,0 @@
-<script lang="ts">
- export let id;
- export let disabled = false;
- export let loading = false;
- export let rows = 2;
- export let cols = 0;
- export let name;
- export let placeholder;
- export let value;
- export let label;
- export let errorText;
-
- $: shared_props = {
- rows: rows || null,
- cols: cols || null,
- name: name || null,
- id: id || null,
- disabled: disabled || null,
- class: [`form-control ${loading ? "c-disabled loading" : ""}`, $$restProps.class ?? ""].filter(Boolean).join(" "),
- };
-
- let textarea;
- let scrollHeight = 0;
-
- $:if (textarea) {
- scrollHeight = textarea.scrollHeight;
- }
-
- function on_input(event) {
- event.target.style.height = "auto";
- event.target.style.height = (this.scrollHeight) + "px";
- }
-</script>
-
-{#if label}
- <label for="{id}"
- class="form-label margin-bottom-xxs">{label}</label>
-{/if}
-<textarea {...shared_props}
- {placeholder}
- style="overflow-y:hidden;min-height:calc(1.5em + .75rem + 2px);{scrollHeight ? 'height:{scrollHeight}px' : ''};"
- bind:value={value}
- bind:this={textarea}
- on:input={on_input}
-></textarea>
-{#if errorText}
- <small class="color-error">{errorText}</small>
-{/if}
diff --git a/apps/web-shared/src/components/icon.svelte b/apps/web-shared/src/components/icon.svelte
deleted file mode 100644
index 144b45d..0000000
--- a/apps/web-shared/src/components/icon.svelte
+++ /dev/null
@@ -1,87 +0,0 @@
-<script>
- import {IconNames} from "$shared/lib/configuration";
-
- const icons = [
- {
- box: 16,
- name: IconNames.verticalDots,
- svg: `<path d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/>`,
- },
- {
- box: 16,
- name: IconNames.clock,
- svg: `<path d="M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71V3.5z"/><path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0z"/>`,
- },
- {
- box: 21,
- name: IconNames.trash,
- svg: `<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(3 2)"><path d="m2.5 2.5h10v12c0 1.1045695-.8954305 2-2 2h-6c-1.1045695 0-2-.8954305-2-2zm5-2c1.0543618 0 1.91816512.81587779 1.99451426 1.85073766l.00548574.14926234h-4c0-1.1045695.8954305-2 2-2z"/><path d="m.5 2.5h14"/><path d="m5.5 5.5v8"/><path d="m9.5 5.5v8"/></g>`,
- },
- {
- box: 21,
- name: IconNames.pencilSquare,
- svg: `
- <g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(3 3)"><path d="m14 1c.8284271.82842712.8284271 2.17157288 0 3l-9.5 9.5-4 1 1-3.9436508 9.5038371-9.55252193c.7829896-.78700064 2.0312313-.82943964 2.864366-.12506788z"/><path d="m6.5 14.5h8"/><path d="m12.5 3.5 1 1"/></g>
- `,
- },
- {
- box: 16,
- name: IconNames.x,
- svg: `<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/>`,
- },
- {
- box: 16,
- name: IconNames.funnel,
- svg: `<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2h-11z"/>`,
- },
- {
- box: 16,
- name: IconNames.funnelFilled,
- svg: `<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2z"/>`,
- },
- {
- box: 16,
- name: IconNames.github,
- svg: `
- <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/>
- `
- },
- {
- box: 21,
- name: IconNames.refresh,
- svg: `<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(2 2)"><path d="m4.5 1.5c-2.4138473 1.37729434-4 4.02194088-4 7 0 4.418278 3.581722 8 8 8s8-3.581722 8-8-3.581722-8-8-8"/><path d="m4.5 5.5v-4h-4"/></g> `
- },
- {
- box: 21,
- name: IconNames.resetHard,
- svg: `<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="matrix(0 1 1 0 2.5 2.5)"><path d="m13 11 3 3v-6c0-3.36502327-2.0776-6.24479706-5.0200433-7.42656457-.9209869-.36989409-1.92670197-.57343543-2.9799567-.57343543-4.418278 0-8 3.581722-8 8s3.581722 8 8 8c1.48966767 0 3.4724708-.3698516 5.0913668-1.5380762" transform="matrix(-1 0 0 -1 16 16)"/><path d="m5 5 6 6"/><path d="m11 5-6 6"/></g>`
- },
- {
- box: 21,
- name: IconNames.arrowUp,
- svg: `<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(6 3)"><path d="m8.5 4.5-4-4-4.029 4"/><path d="m4.5.5v13"/></g>`
- },
- {
- box: 21,
- name: IconNames.arrowDown,
- svg: `<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(6 4)"><path d="m.5 9.499 4 4.001 4-4.001"/><path d="m4.5.5v13" transform="matrix(-1 0 0 -1 9 14)"/></g>`
- },
- {
- box: 21,
- name: IconNames.chevronDown,
- svg: `<path d="m8.5.5-4 4-4-4" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" transform="translate(6 8)"/>`
- }
- ];
-
- export let name;
- export let fill = false;
- export let width = "1rem";
- export let height = "1rem";
- const displayIcon = icons.find((e) => e.name === name);
-</script>
-
-<svg class="icon {$$restProps.class ?? ''}"
- style="width: {width}; height:{height}; fill: currentColor;"
- viewBox="0 0 {displayIcon.box} {displayIcon.box}">
- {@html displayIcon.svg}
-</svg>
diff --git a/apps/web-shared/src/components/link-card.svelte b/apps/web-shared/src/components/link-card.svelte
deleted file mode 100644
index 85738c7..0000000
--- a/apps/web-shared/src/components/link-card.svelte
+++ /dev/null
@@ -1,47 +0,0 @@
-<script>
- export let text = "View";
- export let name;
- export let description = null;
- export let href = null;
- export let target;
- export let title = null;
-</script>
-
-<a class="link-card flex flex-column bg-light cursor-pointer radius-sm inner-glow {$$restProps.class??''}"
- {href}
- {target}
- {title}
- on:click
- aria-label="Link label">
- <div class="padding-sm">
- <div class="flex flex-wrap gap-xs items-center">
- <slot name="icon"></slot>
- <div class="line-height-xs">
- <p class="text-lg font-semibold color-contrast-higher">{name}</p>
- {#if description}
- <p class="color-contrast-low margin-top-xxxs">{description}</p>
- {/if}
- </div>
- </div>
- </div>
- <div class="link-card__footer margin-top-auto border-top border-contrast-lower">
- <p class="text-sm">{text}</p>
- <div>
- <svg class="icon icon--sm"
- viewBox="0 0 24 24">
- <g fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2">
- <line x1="3"
- y1="12"
- x2="21"
- y2="12"/>
- <polyline points="15 6 21 12 15 18"/>
- </g>
- </svg>
- </div>
- </div>
-</a>
-
diff --git a/apps/web-shared/src/components/locale-switcher-icon.svelte b/apps/web-shared/src/components/locale-switcher-icon.svelte
deleted file mode 100644
index d2776a1..0000000
--- a/apps/web-shared/src/components/locale-switcher-icon.svelte
+++ /dev/null
@@ -1,16 +0,0 @@
-<script>
- import {GlobeIcon} from "svelte-feather-icons";
-
- export let show = false;
- export let selection = "preffered";
-</script>
-<div data-locale-switcher-element
- class="ld-switch flex">
- <button class="reset ld-switch-btn"
- on:click={() => (show = !show)}>
- <div class="ld-switch-btn__icon-wrapper ld-switch-btn__icon-wrapper--in"
- aria-hidden="true">
- <GlobeIcon/>
- </div>
- </button>
-</div>
diff --git a/apps/web-shared/src/components/locale-switcher.svelte b/apps/web-shared/src/components/locale-switcher.svelte
deleted file mode 100644
index 5399247..0000000
--- a/apps/web-shared/src/components/locale-switcher.svelte
+++ /dev/null
@@ -1,62 +0,0 @@
-<script>
- import { CookieNames } from "$shared/lib/configuration";
- import { get_cookie } from "$shared/lib/helpers";
- import { currentLocale } from "$shared/lib/locale";
- import { onMount } from "svelte";
-
- export let glow = false;
- export let show = false;
- export let selection = "preffered";
- export let size;
-
- function change(to) {
- selection = to;
- currentLocale.set(to);
- }
-
- onMount(() => {
- selection = get_cookie(CookieNames.locale);
- document.addEventListener("keydown", (e) => {
- if (e.code === "Escape") {
- show = false;
- }
- });
- document.addEventListener("click", (e) => {
- if (e.target.closest("[data-locale-switcher-element]") === null) {
- show = false;
- }
- });
- });
-</script>
-
-<div class="bg-light padding-x-xs padding-bottom-xs padding-top-xxxs radius-md {glow ? 'inner-glow shadow-xs':''}"
- data-locale-switcher-element
- class:is-hidden={!show}
- role="listbox">
- <div class="flex flex-wrap flex-column"
- role="group">
- <div class="margin-bottom-xs flex-grow">
- <span class="text-xs color-contrast-medium">Language</span>
- </div>
- <div class="flex gap-xs flex-row">
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'en' ? 'true' : 'false'}"
- on:click={() => change("en")}
- role="option">
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">English</div>
- </div>
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'nb' ? 'true' : 'false'}"
- on:click={() => change("nb")}
- role="option">
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">Norsk</div>
- </div>
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'preffered' ? 'true' : 'false'}"
- on:click={() => change("preffered")}
- role="option">
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">Default</div>
- </div>
- </div>
- </div>
-</div>
diff --git a/apps/web-shared/src/components/menu/index.ts b/apps/web-shared/src/components/menu/index.ts
deleted file mode 100644
index 8eb7938..0000000
--- a/apps/web-shared/src/components/menu/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import Menu from "./menu.svelte";
-import MenuItem from "./item.svelte";
-import MenuItemSeparator from "./separator.svelte";
-
-export {
- Menu,
- MenuItem,
- MenuItemSeparator
-};
diff --git a/apps/web-shared/src/components/menu/item.svelte b/apps/web-shared/src/components/menu/item.svelte
deleted file mode 100644
index aeb0f99..0000000
--- a/apps/web-shared/src/components/menu/item.svelte
+++ /dev/null
@@ -1,8 +0,0 @@
-<script lang="ts">
- export let danger = false;
-</script>
-<li role="menuitem" on:click>
- <span class="menu__content {danger ? 'bg-error-lighter@hover color-white@hover' : ''}">
- <slot/>
- </span>
-</li>
diff --git a/apps/web-shared/src/components/menu/menu.svelte b/apps/web-shared/src/components/menu/menu.svelte
deleted file mode 100644
index 33517ab..0000000
--- a/apps/web-shared/src/components/menu/menu.svelte
+++ /dev/null
@@ -1,54 +0,0 @@
-<script lang="ts">
- import {random_string} from "$shared/lib/helpers";
-
- export const id = "__menu_" + random_string(3);
- export let trigger: HTMLElement;
- export let show = false;
-
- let windowInnerWidth = 0;
- let windowInnerHeight = 0;
- let menu: HTMLMenuElement;
-
- $: if (show && menu && trigger) {
- const
- selectedTriggerPosition = trigger.getBoundingClientRect(),
- menuOnTop = (windowInnerHeight - selectedTriggerPosition.bottom) < selectedTriggerPosition.top,
- left = selectedTriggerPosition.left,
- right = (windowInnerWidth - selectedTriggerPosition.right),
- isRight = (windowInnerWidth < selectedTriggerPosition.left + menu.offsetWidth),
- vertical = menuOnTop
- ? "bottom: " + (windowInnerHeight - selectedTriggerPosition.top) + "px;"
- : "top: " + selectedTriggerPosition.bottom + "px;";
-
- let horizontal = isRight ? "right: " + right + "px;" : "left: " + left + "px;";
-
- // check right position is correct -> otherwise set left to 0
- if (isRight && (right + menu.offsetWidth) > windowInnerWidth) horizontal = ("left: " + (windowInnerWidth - menu.offsetWidth) / 2 + "px;");
- const maxHeight = menuOnTop ? selectedTriggerPosition.top - 20 : windowInnerHeight - selectedTriggerPosition.bottom - 20;
- menu.setAttribute("style", horizontal + vertical + "max-height:" + Math.floor(maxHeight) + "px;");
- }
-
- function on_window_click(event) {
- if (!event.target.closest("#" + id) && !event.target.closest("[aria-controls='" + id + "']")) show = false;
- }
-
- function on_window_touchend(event) {
- if (!event.target.closest("#" + id) && !event.target.closest("[aria-controls='" + id + "']")) show = false;
- }
-</script>
-
-<svelte:window
- on:click={on_window_click}
- on:touchend={on_window_touchend}
- bind:innerWidth={windowInnerWidth}
- bind:innerHeight={windowInnerHeight}
-/>
-
-<menu class="menu"
- id="{id}"
- bind:this={menu}
- class:menu--is-visible={show}
- aria-expanded="{show}"
- aria-haspopup="true">
- <slot name="options"/>
-</menu>
diff --git a/apps/web-shared/src/components/menu/separator.svelte b/apps/web-shared/src/components/menu/separator.svelte
deleted file mode 100644
index 798dce0..0000000
--- a/apps/web-shared/src/components/menu/separator.svelte
+++ /dev/null
@@ -1,2 +0,0 @@
-<li class="menu__separator"
- role="separator"></li>
diff --git a/apps/web-shared/src/components/modal.svelte b/apps/web-shared/src/components/modal.svelte
deleted file mode 100644
index f3b633c..0000000
--- a/apps/web-shared/src/components/modal.svelte
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
- import {random_string} from "$shared/lib/helpers";
-
- export let title = "";
- let isVisible = false;
- const modal_id = "modal_" + random_string(5);
-
- function handle_keyup(e) {
- if (e.key === "Escape") {
- isVisible = false;
- }
- }
-
- export const functions = {
- open() {
- isVisible = true;
- window.addEventListener("keyup", handle_keyup);
- },
- close() {
- isVisible = false;
- window.removeEventListener("keyup", handle_keyup);
- },
- };
-</script>
-
-<div class="modal modal--animate-scale flex flex-center padding-md bg-dark bg-opacity-40% {isVisible ? 'modal--is-visible' : ''}"
- id={modal_id}
->
- <div class="modal__content width-100% max-width-xs max-height-100% overflow-auto radius-md shadow-md bg"
- role="alertdialog"
- >
- <header class="padding-y-sm padding-x-md flex items-center justify-between"
- >
- <h4 class="text-truncate">{title}</h4>
-
- <button class="reset modal__close-btn modal__close-btn--inner"
- on:click={functions.close}
- >
- <svg class="icon"
- viewBox="0 0 20 20">
- <title>Close modal window</title>
- <g fill="none"
- stroke="currentColor"
- stroke-miterlimit="10"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <line x1="3"
- y1="3"
- x2="17"
- y2="17"/>
- <line x1="17"
- y1="3"
- x2="3"
- y2="17"/>
- </g>
- </svg>
- </button>
- </header>
-
- <div class="padding-bottom-md padding-x-md">
- <slot/>
- </div>
- </div>
-</div>
diff --git a/apps/web-shared/src/components/pre-header.svelte b/apps/web-shared/src/components/pre-header.svelte
deleted file mode 100644
index 87a19b1..0000000
--- a/apps/web-shared/src/components/pre-header.svelte
+++ /dev/null
@@ -1,37 +0,0 @@
-<script>
- export let closable = true;
- export let show = false;
-</script>
-
-<div class="pre-header padding-y-xs" style="{show ? '' : 'display:none'}">
- <div class="container max-width-lg position-relative">
- <div class="text-component text-sm padding-right-lg">
- <p>
- <slot/>
- </p>
- </div>
- {#if closable}
- <button class="reset pre-header__close-btn"
- on:click={(event) => event.target.closest(".pre-header")?.remove()}>
- <svg class="icon"
- viewBox="0 0 20 20">
- <title>Close header banner</title>
- <g fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2">
- <line x1="4"
- y1="4"
- x2="16"
- y2="16"/>
- <line x1="16"
- y1="4"
- x2="4"
- y2="16"/>
- </g>
- </svg>
- </button>
- {/if}
- </div>
-</div>
diff --git a/apps/web-shared/src/components/screens/GeneralErrorScreen.svelte b/apps/web-shared/src/components/screens/GeneralErrorScreen.svelte
deleted file mode 100644
index dd4b5bd..0000000
--- a/apps/web-shared/src/components/screens/GeneralErrorScreen.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-<script>
- export let message;
- export let status;
-</script>
-
-<h1>{status}</h1>
-<p>{message}</p>
diff --git a/apps/web-shared/src/components/screens/NotFoundScreen.svelte b/apps/web-shared/src/components/screens/NotFoundScreen.svelte
deleted file mode 100644
index 69d55af..0000000
--- a/apps/web-shared/src/components/screens/NotFoundScreen.svelte
+++ /dev/null
@@ -1,161 +0,0 @@
-<style>
- .fof__animation svg {
- display: block;
- max-width: 520px;
- margin-left: auto;
- margin-right: auto;
- }
-
- #i-fof-browser {
- -webkit-transform-origin: 260px 304px;
- transform-origin: 260px 304px;
- -webkit-animation: i-fof-browser 4s infinite;
- animation: i-fof-browser 4s infinite;
- }
-
- #i-fof-shadow {
- -webkit-transform-origin: 282px 410px;
- transform-origin: 282px 410px;
- -webkit-animation: i-fof-shadow 4s infinite;
- animation: i-fof-shadow 4s infinite;
- }
-
- @-webkit-keyframes i-fof-browser {
- 0%, 100% {
- -webkit-transform: translateY(0) scale(1);
- transform: translateY(0) scale(1);
- }
- 50% {
- -webkit-transform: translateY(-10%) scale(0.9);
- transform: translateY(-10%) scale(0.9);
- }
- }
-
- @keyframes i-fof-browser {
- 0%, 100% {
- -webkit-transform: translateY(0) scale(1);
- transform: translateY(0) scale(1);
- }
- 50% {
- -webkit-transform: translateY(-10%) scale(0.9);
- transform: translateY(-10%) scale(0.9);
- }
- }
-
- @-webkit-keyframes i-fof-shadow {
- 0%, 100% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
- 50% {
- -webkit-transform: scale(0.8);
- transform: scale(0.8);
- }
- }
-
- @keyframes i-fof-shadow {
- 0%, 100% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
- 50% {
- -webkit-transform: scale(0.8);
- transform: scale(0.8);
- }
- }
-</style>
-
-<section class="fof">
- <div class="container max-width-sm">
- <div class="text-component text-center margin-bottom-lg">
- <h1>Page not found</h1>
- <p>Sorry, but the page you were looking for could not be found.</p>
- <p><a href="/">Go to homepage</a>.</p>
- </div>
-
- <div class="fof__animation"
- aria-lable="404 animation">
- <svg id="i-fof"
- viewBox="0 0 520 450">
- <g id="i-fof-ship">
- <path id="i-fof-capsule"
- d="M260,9a53,53,0,0,0-53,53H313A53,53,0,0,0,260,9Z"
- fill="var(--color-contrast-lower)"/>
- <path id="i-fof-ship-top"
- d="M448,73H72s78-37,188-37S448,73,448,73Z"
- fill="var(--color-contrast-low)"/>
- <path id="i-fof-ship-bottom"
- d="M448,73A1185.633,1185.633,0,0,0,72,73c80.173,34.484,144.2,37,188,37C370,110,448,73,448,73Z"
- fill="var(--color-contrast-high)"/>
- </g>
- <g id="i-fof-browser">
- <rect id="i-fof-browser-canvas"
- x="179"
- y="243"
- width="160"
- height="109"
- rx="6"
- transform="translate(131.361 -75.723) rotate(22.162)"
- fill="var(--color-contrast-higher)"/>
- <g id="i-fof-browser-dots"
- fill="var(--color-bg)">
- <circle cx="211.713"
- cy="228.029"
- r="3"/>
- <circle cx="221.9"
- cy="232.179"
- r="3"/>
- <circle cx="232.088"
- cy="236.328"
- r="3"/>
- </g>
- <rect id="i-fof-browser-body"
- x="180.737"
- y="258.557"
- width="152"
- height="89"
- rx="2"
- transform="translate(133.29 -74.459) rotate(22.162)"
- fill="var(--color-bg)"/>
- <g id="i-fof-emoji">
- <path d="M248.626,322.968A22,22,0,1,1,277.3,310.893,22,22,0,0,1,248.626,322.968Z"
- fill="#ffd764"/>
- <path d="M264.3,311a7,7,0,1,1,9.124-3.843A7,7,0,0,1,264.3,311Z"
- fill="#fff"/>
- <path d="M245.778,303.452a7,7,0,1,1,9.123-3.842A7,7,0,0,1,245.778,303.452Z"
- fill="#fff"/>
- <path d="M258.5,317.274l-12.966-5.281a1,1,0,0,1,.755-1.853l12.966,5.282a1,1,0,0,1-.755,1.852Z"
- fill="#444"/>
- <path d="M247.287,299.747a3,3,0,1,1,3.91-1.646A3,3,0,0,1,247.287,299.747Z"
- fill="#444"/>
- <path d="M265.809,307.292a3,3,0,1,1,3.91-1.647A3,3,0,0,1,265.809,307.292Z"
- fill="#444"/>
- </g>
- </g>
- <polygon id="i-fof-radar-body"
- points="415 410 105 410 196 106 324 106 415 410"
- fill="#4ad36b"
- opacity="0.5"/>
- <ellipse id="i-fof-radar-bottom"
- cx="260"
- cy="410"
- rx="155"
- ry="28"
- fill="#4ad36b"/>
- <ellipse id="i-fof-shadow"
- cx="282"
- cy="410"
- rx="72"
- ry="10"
- opacity="0.4"
- fill="var(--color-black)"/>
- <ellipse id="i-fof-radar-top"
- cx="260"
- cy="106"
- rx="64"
- ry="6"
- fill="#4ad36b"/>
- </svg>
- </div>
- </div>
-</section>
diff --git a/apps/web-shared/src/components/stopwatch.svelte b/apps/web-shared/src/components/stopwatch.svelte
deleted file mode 100644
index 0e641e8..0000000
--- a/apps/web-shared/src/components/stopwatch.svelte
+++ /dev/null
@@ -1,196 +0,0 @@
-<script lang="ts">
- import Button from "$shared/components/button.svelte";
- import { Textarea } from "$shared/components/form";
- import { StorageKeys } from "$shared/lib/configuration";
- import { loadLocaleAsync } from "$shared/lib/i18n/i18n-util.async";
- import { i18nObject } from "$shared/lib/i18n/i18n-util";
- import { currentLocale, preffered_or_default } from "$shared/lib/locale";
- import { StoreType, writable_persistent } from "$shared/lib/persistent-store";
- import { Temporal } from "@js-temporal/polyfill";
- import { createEventDispatcher, onMount } from "svelte";
-
- const state = writable_persistent({
- initialState: {
- hours: 0,
- minutes: 0,
- seconds: 0,
- startTime: null as Temporal.PlainDateTime,
- lastStep: null as Temporal.PlainDateTime,
- isRunning: false,
- intervalId: 0,
- note: "",
- },
- options: {
- store: StoreType.LOCAL
- },
- name: StorageKeys.stopwatch,
- });
-
- let timeString;
- let LL = i18nObject($currentLocale);
-
- $: if ($state.hours || $state.minutes || $state.seconds) {
- timeString = $state.hours.toLocaleString(undefined, {minimumIntegerDigits: 2})
- + ":" + $state.minutes.toLocaleString(undefined, {minimumIntegerDigits: 2})
- + ":" + $state.seconds.toLocaleString(undefined, {minimumIntegerDigits: 2});
- } else {
- timeString = "--:--:--";
- }
-
- currentLocale.subscribe(async locale => {
- if (locale === "preffered") locale = preffered_or_default();
- await loadLocaleAsync(locale);
- LL = i18nObject(locale);
- });
-
- onMount(async () => {
- start_if_running();
- await loadLocaleAsync($currentLocale);
- LL = i18nObject($currentLocale);
- });
-
- function start_if_running() {
- if ($state.isRunning) {
- if (Temporal.PlainDateTime.compare($state.lastStep, Temporal.Now.plainDateTimeISO()) == -1) {
- const duration = Temporal.Now.plainDateTimeISO().since($state.lastStep, {smallestUnit: "second"});
- console.log("lastStep", $state.lastStep.toString());
- console.log("duration", duration.toString());
- console.log(duration.seconds);
- // for (let i = 0; i < steps; i++) {
- // step();
- // }
- }
- clearInterval($state.intervalId);
- $state.intervalId = setInterval(step, 1000);
- }
- }
-
- window.addEventListener("focus", () => {
- start_if_running();
- });
-
- const dispatch = createEventDispatcher();
-
- function step() {
- $state.seconds = $state.seconds + 1;
-
- if ($state.seconds == 60) {
- $state.minutes = $state.minutes + 1;
- $state.seconds = 0;
- }
-
- if ($state.minutes == 60) {
- $state.hours = $state.hours + 1;
- $state.minutes = 0;
- $state.seconds = 0;
- }
-
- if (!$state.startTime) $state.startTime = Temporal.Now.plainDateTimeISO();
- $state.lastStep = Temporal.Now.plainDateTimeISO();
- }
-
- function reset() {
- clearInterval($state.intervalId);
- $state.isRunning = false;
- $state.hours = 0;
- $state.minutes = 0;
- $state.seconds = 0;
- $state.startTime = null;
- $state.intervalId = 0;
- $state.note = "";
- }
-
- let roundUpToNearest = 30;
- let roundDownToNearest = 30;
-
- function on_round_up() {
- const newTime = Temporal.PlainTime
- .from({hour: $state.hours, minute: $state.minutes, second: $state.seconds})
- .round({
- roundingIncrement: roundUpToNearest,
- smallestUnit: "minute",
- roundingMode: "ceil"
- });
- $state.hours = newTime.hour;
- $state.minutes = newTime.minute;
- $state.seconds = newTime.second;
- }
-
- function on_round_down() {
- const newTime = Temporal.PlainTime
- .from({hour: $state.hours, minute: $state.minutes, second: $state.seconds,})
- .round({
- roundingIncrement: roundDownToNearest,
- smallestUnit: "minute",
- roundingMode: "trunc"
- });
- $state.hours = newTime.hour;
- $state.minutes = newTime.minute;
- $state.seconds = newTime.second;
- }
-
- function on_start_stop() {
- if ($state.isRunning) {
- clearInterval($state.intervalId);
- $state.isRunning = false;
- return;
- }
- step();
- $state.intervalId = setInterval(step, 1000);
- $state.isRunning = true;
- }
-
- function on_create_entry() {
- if (!$state.startTime) return;
- const plainStartTime = Temporal.PlainDateTime.from($state.startTime);
- dispatch("create", {
- from: plainStartTime,
- to: plainStartTime.add({hours: $state.hours, minutes: $state.minutes, seconds: $state.seconds}),
- description: $state.note
- });
- reset();
- }
-</script>
-
-<div class="grid">
- <div class="col-6">
- <slot name="header"></slot>
- <pre class="text-xxl padding-y-sm">{timeString}</pre>
- </div>
- <div class="col-6 flex align-bottom flex-column text-xs">
- <Button title="{$state.isRunning ? LL.stopwatch.stop() : LL.stopwatch.start()}"
- text="{$state.isRunning ? LL.stopwatch.stop() : LL.stopwatch.start()}"
- variant="link"
- on:click={on_start_stop}/>
-
- {#if $state.startTime}
- <Button title="{LL.stopwatch.reset()}"
- text="{LL.stopwatch.reset()}"
- variant="link"
- class="bg-error-lighter@hover color-white@hover"
- on:click={reset}/>
- {#if !$state.isRunning}
- <Button title="{LL.stopwatch.roundUp()}"
- text="{LL.stopwatch.roundUp()}"
- variant="link"
- on:click={on_round_up}/>
- <Button title="{LL.stopwatch.roundDown()}"
- text="{LL.stopwatch.roundDown()}"
- variant="link"
- on:click={on_round_down}/>
- {#if $state.minutes > 0 || $state.hours > 0}
- <Button title="{LL.stopwatch.createEntry()}"
- text="{LL.stopwatch.createEntry()}"
- variant="link"
- on:click={on_create_entry}/>
- {/if}
- {/if}
- {/if}
- </div>
-</div>
-
-<Textarea class="width-100% margin-top-xs"
- placeholder="{LL.stopwatch.whatsYourFocus()}"
- rows="1"
- bind:value={$state.note}
-/>
diff --git a/apps/web-shared/src/components/table/index.ts b/apps/web-shared/src/components/table/index.ts
deleted file mode 100644
index 8390c0e..0000000
--- a/apps/web-shared/src/components/table/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import TablePaginator from "./paginator.svelte";
-import Table from "./table.svelte";
-import THead from "./thead.svelte";
-import TBody from "./tbody.svelte";
-import TCell from "./tcell.svelte";
-import TRow from "./trow.svelte";
-
-export {
- TablePaginator,
- Table,
- THead,
- TBody,
- TCell,
- TRow
-};
diff --git a/apps/web-shared/src/components/table/paginator.svelte b/apps/web-shared/src/components/table/paginator.svelte
deleted file mode 100644
index 53c6392..0000000
--- a/apps/web-shared/src/components/table/paginator.svelte
+++ /dev/null
@@ -1,101 +0,0 @@
-<script>
- import {createEventDispatcher, onMount} from "svelte";
- import {restrict_input_to_numbers} from "$shared/lib/helpers";
-
- const dispatch = createEventDispatcher();
- export let page = 1;
- export let pageCount = 1;
- let prevCount = page;
- let canIncrement = false;
- let canDecrement = false;
- $: canIncrement = page < pageCount;
- $: canDecrement = page > 1;
-
- onMount(() => {
- restrict_input_to_numbers(document.querySelector("#curr-page"));
- });
-
- function increment() {
- if (canIncrement) {
- page++;
- }
- }
-
- function decrement() {
- if (canDecrement) {
- page--;
- }
- }
-
- $: if (page) {
- handle_change();
- }
-
- function handle_change() {
- if (page === prevCount) {
- return;
- }
- prevCount = page;
- if (page > pageCount) {
- page = pageCount;
- }
- dispatch("value_change", {
- newValue: page,
- });
- }
-</script>
-
-<nav class="pagination"
- aria-label="Pagination">
- <ul class="pagination__list flex flex-wrap gap-xxxs justify-center justify-end@md">
- <li>
- <button on:click={decrement}
- class="reset pagination__item {canDecrement ? '' : 'c-disabled'}">
- <svg class="icon icon--xs flip-x"
- viewBox="0 0 16 16"
- ><title>Go to previous page</title>
- <polyline
- points="6 2 12 8 6 14"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- />
- </svg>
- </button>
- </li>
-
- <li>
- <span class="pagination__jumper flex items-center">
- <input
- aria-label="Page number"
- class="form-control"
- id="curr-page"
- type="text"
- on:change={handle_change}
- value={page}
- />
- <em>of {pageCount}</em>
- </span>
- </li>
-
- <li>
- <button on:click={increment}
- class="reset pagination__item {canIncrement ? '' : 'c-disabled'}">
- <svg class="icon icon--xs"
- viewBox="0 0 16 16"
- ><title>Go to next page</title>
- <polyline
- points="6 2 12 8 6 14"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- />
- </svg>
- </button>
- </li>
- </ul>
-</nav>
diff --git a/apps/web-shared/src/components/table/table.svelte b/apps/web-shared/src/components/table/table.svelte
deleted file mode 100644
index 4acbf37..0000000
--- a/apps/web-shared/src/components/table/table.svelte
+++ /dev/null
@@ -1,3 +0,0 @@
-<table class="int-table {$$restProps.class ?? ''}">
- <slot/>
-</table>
diff --git a/apps/web-shared/src/components/table/tbody.svelte b/apps/web-shared/src/components/table/tbody.svelte
deleted file mode 100644
index f0617fa..0000000
--- a/apps/web-shared/src/components/table/tbody.svelte
+++ /dev/null
@@ -1,3 +0,0 @@
-<tbody class="int-table__body {$$restProps.class ?? ''}">
-<slot/>
-</tbody>
diff --git a/apps/web-shared/src/components/table/tcell.svelte b/apps/web-shared/src/components/table/tcell.svelte
deleted file mode 100644
index 76f500f..0000000
--- a/apps/web-shared/src/components/table/tcell.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-<script lang="ts">
- export let thScope: "row"|"col"|"rowgroup"|"colgroup"|"";
- export let colspan = "";
- export let type: "th"|"td" = "td";
- export let style;
-
- $: shared_props = {
- colspan: colspan || null,
- style: style || null,
- class: [type === "th" ? "int-table__cell--th" : "", "int-table__cell", $$restProps.class ?? ""].filter(Boolean).join(" "),
- };
-</script>
-{#if type === "th"}
- <th {thScope}
- {...shared_props}>
- <slot/>
- </th>
-{/if}
-{#if type === "td"}
- <td {...shared_props}>
- <slot/>
- </td>
-{/if}
diff --git a/apps/web-shared/src/components/table/thead.svelte b/apps/web-shared/src/components/table/thead.svelte
deleted file mode 100644
index aa20bf0..0000000
--- a/apps/web-shared/src/components/table/thead.svelte
+++ /dev/null
@@ -1,10 +0,0 @@
-<script lang="ts">
- import TRow from "./trow.svelte";
-</script>
-
-
-<thead class="int-table__header {$$restProps.class ?? ''}">
-<TRow>
- <slot/>
-</TRow>
-</thead>
diff --git a/apps/web-shared/src/components/table/trow.svelte b/apps/web-shared/src/components/table/trow.svelte
deleted file mode 100644
index 35b34bb..0000000
--- a/apps/web-shared/src/components/table/trow.svelte
+++ /dev/null
@@ -1,6 +0,0 @@
-<script>
- export let dataId;
-</script>
-<tr class="int-table__row {$$restProps.class ?? ''}" data-id={dataId}>
- <slot/>
-</tr>
diff --git a/apps/web-shared/src/components/theme-switcher-icon.svelte b/apps/web-shared/src/components/theme-switcher-icon.svelte
deleted file mode 100644
index 1531ab2..0000000
--- a/apps/web-shared/src/components/theme-switcher-icon.svelte
+++ /dev/null
@@ -1,248 +0,0 @@
-<script>
- export let show = false;
- export let selection = "";
-</script>
-
-<div class="ld-switch flex"
- data-theme-switcher-element>
- <button class="reset ld-switch-btn"
- on:click={() => show =!show}>
- <span class="sr-only">{selection}</span>
- <div class="ld-switch-btn__icon-wrapper ld-switch-btn__icon-wrapper--in"
- aria-hidden="true">
- {#if selection === "dark"}
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20">
- <title>dark</title>
- <g fill="currentColor">
- <path d="M11.964 3.284c.021.237.036.474.036.716a8 8 0 0 1-8 8c-.242 0-.479-.015-.716-.036a7 7 0 1 0 8.68-8.68z"
- fill-opacity=".2"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></path>
- <path d="M7 4a.979.979 0 0 1-1-1 1 1 0 0 0-2 0 .979.979 0 0 1-1 1 1 1 0 0 0 0 2 .979.979 0 0 1 1 1 1 1 0 0 0 2 0 .979.979 0 0 1 1-1 1 1 0 0 0 0-2z"></path>
- </g>
- </svg>
- {:else if selection === "light"}
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20"><title>light</title>
- <g fill="currentColor">
- <circle cx="10"
- cy="10"
- r="4"
- fill-opacity=".2"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></circle>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M10 1v1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M16.364 3.636l-1.061 1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M19 10h-1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M16.364 16.364l-1.061-1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M10 19v-1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 16.364l1.061-1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M1 10h1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 3.636l1.061 1.061"></path>
- </g>
- </svg>
- {:else }
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20"><title>light-auto</title>
- <g fill="currentColor">
- <path d="M10 14a4 4 0 1 1 3.465-6"
- fill-opacity=".2"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12 18l2.5-7h1l2.5 7"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12.714 16h4.572"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M10 1v1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M16.364 3.636l-1.061 1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 16.364l1.061-1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M1 10h1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 3.636l1.061 1.061"></path>
- </g>
- </svg>
- {/if}
- </div>
-
- <div class="ld-switch-btn__icon-wrapper js-ld-switch-icon"
- aria-hidden="true">
- {#if selection === "dark"}
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20">
- <title>dark</title>
- <g fill="currentColor">
- <path d="M11.964 3.284c.021.237.036.474.036.716a8 8 0 0 1-8 8c-.242 0-.479-.015-.716-.036a7 7 0 1 0 8.68-8.68z"
- fill-opacity=".2"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></path>
- <path d="M7 4a.979.979 0 0 1-1-1 1 1 0 0 0-2 0 .979.979 0 0 1-1 1 1 1 0 0 0 0 2 .979.979 0 0 1 1 1 1 1 0 0 0 2 0 .979.979 0 0 1 1-1 1 1 0 0 0 0-2z"></path>
- </g>
- </svg>
- {:else if selection === "light"}
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20">
- <title>light-auto</title>
- <g fill="currentColor">
- <path d="M10 14a4 4 0 1 1 3.465-6"
- fill-opacity=".2"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12 18l2.5-7h1l2.5 7"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12.714 16h4.572"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M10 1v1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M16.364 3.636l-1.061 1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 16.364l1.061-1.061"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M1 10h1.5"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M3.636 3.636l1.061 1.061"></path>
- </g>
- </svg>
- {:else }
- <svg class="icon ld-switch-btn__icon"
- viewBox="0 0 20 20">
- <title>dark-auto</title>
- <g fill="currentColor">
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12 18l2.5-7h1l2.5 7"></path>
- <path fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"
- d="M12.714 16h4.572"></path>
- <path d="M12.146 10.159A2.5 2.5 0 0 1 14.5 8.5h1a2.5 2.5 0 0 1 1.412.441 7 7 0 0 0-4.948-5.657c.021.237.036.474.036.716a8 8 0 0 1-8 8c-.242 0-.479-.015-.716-.036a6.99 6.99 0 0 0 6.427 5.012z"
- fill-opacity=".2"></path>
- <path d="M16.71 8a7.015 7.015 0 0 0-4.746-4.716c.021.237.036.474.036.716a8 8 0 0 1-8 8c-.242 0-.479-.015-.716-.036A7.006 7.006 0 0 0 9 16.929"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"></path>
- <path d="M7 4a.979.979 0 0 1-1-1 1 1 0 0 0-2 0 .979.979 0 0 1-1 1 1 1 0 0 0 0 2 .979.979 0 0 1 1 1 1 1 0 0 0 2 0 .979.979 0 0 1 1-1 1 1 0 0 0 0-2z"></path>
- </g>
- </svg>
- {/if}
- </div>
- </button>
-</div>
diff --git a/apps/web-shared/src/components/theme-switcher.svelte b/apps/web-shared/src/components/theme-switcher.svelte
deleted file mode 100644
index 6f86875..0000000
--- a/apps/web-shared/src/components/theme-switcher.svelte
+++ /dev/null
@@ -1,215 +0,0 @@
-<script lang="ts">
- import {base_domain, CookieNames} from "$shared/lib/configuration";
- import {get_cookie, set_cookie} from "$shared/lib/helpers";
- import {onMount} from "svelte";
-
- type theme = "system"|"dark"|"light";
-
- export let show = false;
- export let glow = false;
- export let selection: theme = "system";
- export let size;
- let prefers = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
- onMount(() => {
- selection = get_cookie(CookieNames.theme) as theme;
- document.addEventListener("keydown", (e) => {
- if (e.code === "Escape") show = false;
- });
- document.addEventListener("click", (e: any) => {
- if (e.target.closest("[data-theme-switcher-element]") === null) show = false;
- });
- });
- let html = document.querySelector("html");
-
- window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (event) => {
- prefers = event.matches ? "dark" : "light";
- });
-
- $: switch (selection || prefers) {
- case "system":
- html.dataset.theme = prefers;
- break;
- case "light":
- html.dataset.theme = "light";
- break;
- case "dark":
- html.dataset.theme = "dark";
- break;
- }
-
- function change(to: theme) {
- selection = to;
- set_cookie(CookieNames.theme, selection, base_domain());
- }
-</script>
-
-<div class="bg-light padding-x-xs padding-bottom-xs padding-top-xxxs radius-md {glow ? 'inner-glow shadow-xs' : ''}"
- class:is-hidden={!show}
- data-theme-switcher-element
- role="listbox">
- <div class="flex flex-wrap flex-column"
- role="group">
- <div class="margin-bottom-xs flex-grow">
- <span class="text-xs color-contrast-medium">Appearance</span>
- </div>
- <div class="flex gap-xs flex-row">
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'dark' ? 'true' : 'false'}"
- role="option">
- <figure class="radius-md inner-glow"
- on:click={() => change("dark")}>
- <svg id="Layer_1"
- class="block radius-inherit"
- data-name="Layer 1"
- xmlns="http://www.w3.org/2000/svg"
- width="70"
- height="50"
- viewBox="0 0 70 50">
- <rect width="70"
- height="50"
- fill="#22232a"/>
- <path d="M14,10H70V50H10V14A4,4,0,0,1,14,10Z"
- fill="#5a5c63"/>
- <circle cx="18"
- cy="18"
- r="3"
- fill="#22232a"/>
- <circle cx="27"
- cy="18"
- r="3"
- fill="#22232a"/>
- <circle cx="36"
- cy="18"
- r="3"
- fill="#22232a"/>
- <rect x="17"
- y="28"
- width="46"
- height="3"
- rx="1"
- fill="#fafaff"/>
- <rect x="17"
- y="34"
- width="46"
- height="3"
- rx="1"
- fill="#fafaff"/>
- <rect x="17"
- y="40"
- width="30"
- height="3"
- rx="1"
- fill="#fafaff"/>
- </svg>
- </figure>
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">Dark</div>
- </div>
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'light' ? 'true' : 'false'}"
- role="option">
- <figure class="radius-md inner-glow"
- on:click={() => change("light")}>
- <svg id="Layer_1"
- class="block radius-inherit"
- data-name="Layer 1"
- xmlns="http://www.w3.org/2000/svg"
- width="70"
- height="50"
- viewBox="0 0 70 50">
- <rect width="70"
- height="50"
- fill="#e5e5e6"/>
- <path d="M14,10H70a0,0,0,0,1,0,0V50a0,0,0,0,1,0,0H10a0,0,0,0,1,0,0V14A4,4,0,0,1,14,10Z"
- fill="#fff"/>
- <circle cx="18"
- cy="18"
- r="3"
- fill="#e5e5e6"/>
- <circle cx="27"
- cy="18"
- r="3"
- fill="#e5e5e6"/>
- <circle cx="36"
- cy="18"
- r="3"
- fill="#e5e5e6"/>
- <rect x="17"
- y="28"
- width="46"
- height="3"
- rx="1"
- fill="#38393e"/>
- <rect x="17"
- y="34"
- width="46"
- height="3"
- rx="1"
- fill="#38393e"/>
- <rect x="17"
- y="40"
- width="30"
- height="3"
- rx="1"
- fill="#38393e"/>
- </svg>
- </figure>
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">Light</div>
- </div>
- <div class="ld-switch-popover__option"
- aria-selected="{selection === 'system' ? 'true' : 'false'}"
- role="option">
- <figure class="radius-md inner-glow"
- on:click={() => change("system")}>
- <svg id="Layer_1"
- data-name="Layer 1"
- xmlns="http://www.w3.org/2000/svg"
- class="block radius-inherit"
- width="70"
- height="50"
- viewBox="0 0 70 50">
- <rect width="35"
- height="50"
- fill="#e5e5e6"/>
- <path d="M14,10H35a0,0,0,0,1,0,0V50a0,0,0,0,1,0,0H10a0,0,0,0,1,0,0V14A4,4,0,0,1,14,10Z"
- fill="#fff"/>
- <circle cx="18"
- cy="18"
- r="3"
- fill="#e5e5e6"/>
- <circle cx="27"
- cy="18"
- r="3"
- fill="#e5e5e6"/>
- <path d="M18,28H35a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H18a1,1,0,0,1-1-1V29A1,1,0,0,1,18,28Z"
- fill="#38393e"/>
- <path d="M18,34H35a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H18a1,1,0,0,1-1-1V35A1,1,0,0,1,18,34Z"
- fill="#38393e"/>
- <path d="M18,40H35a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H18a1,1,0,0,1-1-1V41A1,1,0,0,1,18,40Z"
- fill="#38393e"/>
- <rect x="35"
- width="35"
- height="50"
- fill="#22232a"/>
- <path d="M49,10H70V50H45V14A4,4,0,0,1,49,10Z"
- fill="#5a5c63"/>
- <circle cx="53"
- cy="18"
- r="3"
- fill="#22232a"/>
- <circle cx="62"
- cy="18"
- r="3"
- fill="#22232a"/>
- <path d="M53,28H70a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H53a1,1,0,0,1-1-1V29A1,1,0,0,1,53,28Z"
- fill="#fafaff"/>
- <path d="M53,34H70a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H53a1,1,0,0,1-1-1V35A1,1,0,0,1,53,34Z"
- fill="#fafaff"/>
- <path d="M53,40H70a0,0,0,0,1,0,0v3a0,0,0,0,1,0,0H53a1,1,0,0,1-1-1V41A1,1,0,0,1,53,40Z"
- fill="#fafaff"/>
- </svg>
- </figure>
- <div class="text-xs margin-top-xxxs padding-x-xxxxs">System</div>
- </div>
- </div>
- </div>
-</div>
diff --git a/apps/web-shared/src/components/tile.svelte b/apps/web-shared/src/components/tile.svelte
deleted file mode 100644
index b8e9cdf..0000000
--- a/apps/web-shared/src/components/tile.svelte
+++ /dev/null
@@ -1,4 +0,0 @@
-<section class="bg-light radius-sm padding-sm inner-glow shadow-xs {$$restProps.class??''}"
- style="height: fit-content;">
- <slot/>
-</section>
diff --git a/apps/web-shared/src/components/user-menu.svelte b/apps/web-shared/src/components/user-menu.svelte
deleted file mode 100644
index c0195f4..0000000
--- a/apps/web-shared/src/components/user-menu.svelte
+++ /dev/null
@@ -1,99 +0,0 @@
-<script>
- import {onMount} from "svelte";
- import {Menu, MenuItem, MenuItemSeparator} from "./menu";
-
- let userMenuTrigger;
- let showUserMenu = false;
-
- export let avatar = "";
- export let name;
- export let secondary = "";
- let userMenuId;
-
- onMount(() => {
- userMenuTrigger = document.getElementById("open-user-menu");
- });
-</script>
-
-<button class="reset user-menu-control"
- id="open-user-menu"
- aria-controls="{userMenuId}"
- on:click={() => showUserMenu = true}>
- {#if avatar}
- <figure class="user-menu-control__img-wrapper radius-50%">
- <img class="user-menu-control__img"
- src="{avatar}"
- alt="User picture">
- </figure>
- {/if}
-
- <div class="margin-x-xs user-menu__meta">
- <p class="user-menu__meta-title text-sm line-height-1 padding-y-xxxxs font-semibold color-contrast-higher text-truncate">{name}</p>
- {#if secondary}
- <p class="text-xs color-contrast-medium line-height-1 padding-bottom-xxxxs">{secondary}</p>
- {/if}
- </div>
-
- <svg class="icon icon--xxs"
- aria-hidden="true"
- viewBox="0 0 12 12">
- <polyline points="1 4 6 9 11 4"
- fill="none"
- stroke="currentColor"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-width="2"/>
- </svg>
-</button>
-
-<Menu trigger={userMenuTrigger}
- bind:id={userMenuId}
- bind:show="{showUserMenu}">
- <div slot="options">
- <MenuItem>
- <svg class="icon menu__icon"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <circle cx="8"
- cy="3.5"
- r="3.5"/>
- <path d="M14.747,14.15a6.995,6.995,0,0,0-13.494,0A1.428,1.428,0,0,0,1.5,15.4a1.531,1.531,0,0,0,1.209.6H13.288a1.531,1.531,0,0,0,1.209-.6A1.428,1.428,0,0,0,14.747,14.15Z"/>
- </svg>
- <span>Profile</span>
-
- </MenuItem>
-
- <MenuItem>
- <svg class="icon menu__icon"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <g fill="currentColor">
- <path d="M15.135,6.784c-1.303-0.326-1.921-1.818-1.23-2.969c0.322-0.536,0.225-0.998-0.094-1.316l-0.31-0.31 c-0.318-0.318-0.78-0.415-1.316-0.094c-1.152,0.691-2.644,0.073-2.969-1.23C9.065,0.258,8.669,0,8.219,0H7.781 c-0.45,0-0.845,0.258-0.997,0.865c-0.326,1.303-1.818,1.921-2.969,1.23C3.279,1.773,2.816,1.87,2.498,2.188l-0.31,0.31 C1.87,2.816,1.773,3.279,2.095,3.815c0.691,1.152,0.073,2.644-1.23,2.969C0.26,6.935,0,7.33,0,7.781v0.438 c0,0.45,0.258,0.845,0.865,0.997c1.303,0.326,1.921,1.818,1.23,2.969c-0.322,0.536-0.225,0.998,0.094,1.316l0.31,0.31 c0.319,0.319,0.782,0.415,1.316,0.094c1.152-0.691,2.644-0.073,2.969,1.23C6.935,15.742,7.331,16,7.781,16h0.438 c0.45,0,0.845-0.258,0.997-0.865c0.326-1.303,1.818-1.921,2.969-1.23c0.535,0.321,0.997,0.225,1.316-0.094l0.31-0.31 c0.318-0.318,0.415-0.78,0.094-1.316c-0.691-1.152-0.073-2.644,1.23-2.969C15.742,9.065,16,8.669,16,8.219V7.781 C16,7.33,15.74,6.935,15.135,6.784z M8,11c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S9.657,11,8,11z"></path>
- </g>
- </svg>
- <span>Settings</span>
- </MenuItem>
-
- <MenuItem>
- <svg class="icon menu__icon"
- aria-hidden="true"
- viewBox="0 0 16 16">
- <circle cx="10.5"
- cy="2.5"
- r="2.5"/>
- <circle cx="5.5"
- cy="6.5"
- r="2.5"/>
- <path d="M15.826,10.124A5.455,5.455,0,0,0,9.46,6.107,3.932,3.932,0,0,1,9.5,6.5,3.97,3.97,0,0,1,8.452,9.176,6.963,6.963,0,0,1,11.539,12h2.829a1.5,1.5,0,0,0,1.458-1.876Z"/>
- <path d="M10.826,14.124a5.5,5.5,0,0,0-10.652,0A1.5,1.5,0,0,0,1.632,16H9.368a1.5,1.5,0,0,0,1.458-1.876Z"/>
- </svg>
- <span>Team</span>
- </MenuItem>
-
- <MenuItemSeparator/>
-
- <MenuItem danger="true" on:click={() => logout_user()}>
- Logout
- </MenuItem>
- </div>
-</Menu>
diff --git a/apps/web-shared/src/lib/api/root.ts b/apps/web-shared/src/lib/api/root.ts
deleted file mode 100644
index d65efc4..0000000
--- a/apps/web-shared/src/lib/api/root.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import {http_post} from "$shared/lib/api/internal-fetch";
-import {api_base} from "$shared/lib/configuration";
-
-export function server_log(message: string): void {
- http_post(api_base("_/api/log"), message);
-}
diff --git a/apps/web-shared/src/lib/configuration.ts b/apps/web-shared/src/lib/configuration.ts
deleted file mode 100644
index eb38400..0000000
--- a/apps/web-shared/src/lib/configuration.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-export const TOPBASEDOMAIN = "greatoffice.life";
-export const BASE_DOMAIN = "dev.greatoffice.life";
-export const DEV_BASE_DOMAIN = "localhost";
-export const API_ADDRESS = "https://api." + BASE_DOMAIN;
-export const PROJECTS_ADDRESS = "https://projects." + BASE_DOMAIN;
-export const PORTAL_ADDRESS = "https://portal." + BASE_DOMAIN;
-export const FRONTPAGE_ADDRESS = "https://" + BASE_DOMAIN;
-export const DEV_PORTAL_ADDRESS = "http://localhost:3001";
-export const DEV_FRONTPAGE_ADDRESS = "http://localhost:3002";
-export const DEV_API_ADDRESS = "http://localhost:5000";
-export const DEV_PROJECTS_ADDRESS = "http://localhost:3000";
-export const SECONDS_BETWEEN_SESSION_CHECK = 600;
-
-export function projects_base(path: string = ""): string {
- return (is_development() ? DEV_PROJECTS_ADDRESS : PROJECTS_ADDRESS) + (path !== "" ? "/" + path : "");
-}
-
-export function base_domain(path: string = ""): string {
- return (is_development() ? DEV_BASE_DOMAIN : TOPBASEDOMAIN) + (path !== "" ? "/" + path : "");
-}
-
-export function frontpage_base(path: string = ""): string {
- return (is_development() ? DEV_FRONTPAGE_ADDRESS : FRONTPAGE_ADDRESS) + (path !== "" ? "/" + path : "");
-}
-
-export function portal_base(path: string = ""): string {
- return (is_development() ? DEV_PORTAL_ADDRESS : PORTAL_ADDRESS) + (path !== "" ? "/" + path : "");
-}
-
-export function api_base(path: string = ""): string {
- return (is_development() ? DEV_API_ADDRESS : API_ADDRESS) + (path !== "" ? "/" + path : "");
-}
-
-export function is_development(): boolean {
- // @ts-ignore
- return import.meta.env.DEV;
-}
-
-export function is_debug(): boolean {
- return localStorage.getItem(StorageKeys.debug) !== "true";
-}
-
-export const CookieNames = {
- theme: "go_theme",
- locale: "go_locale"
-};
-
-export const QueryKeys = {
- labels: "labels",
- categories: "categories",
- entries: "entries",
-};
-
-export const IconNames = {
- github: "github",
- verticalDots: "verticalDots",
- clock: "clock",
- trash: "trash",
- pencilSquare: "pencilSquare",
- x: "x",
- funnel: "funnel",
- funnelFilled: "funnelFilled",
- refresh: "refresh",
- resetHard: "resetHard",
- arrowUp: "arrowUp",
- arrowDown: "arrowDown",
- chevronDown: "chevronDown"
-};
-
-export const StorageKeys = {
- session: "sessionData",
- theme: "theme",
- debug: "debug",
- categories: "categories",
- labels: "labels",
- entries: "entries",
- stopwatch: "stopwatchState"
-};
diff --git a/apps/web-shared/src/lib/i18n/en/index.ts b/apps/web-shared/src/lib/i18n/en/index.ts
deleted file mode 100644
index 9db1759..0000000
--- a/apps/web-shared/src/lib/i18n/en/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type {BaseTranslation} from "../i18n-types";
-
-const en: BaseTranslation = {
- stopwatch: {
- roundUp: "Round up",
- roundDown: "Round down",
- createEntry: "Create entry",
- whatsYourFocus: "What's your focus?",
- reset: "Reset",
- start: "Start",
- stop: "Stop",
- },
- localeSwitcher: {
- language: "Language"
- }
-};
-
-export default en;
diff --git a/apps/web-shared/src/lib/i18n/formatters.ts b/apps/web-shared/src/lib/i18n/formatters.ts
deleted file mode 100644
index 78734f9..0000000
--- a/apps/web-shared/src/lib/i18n/formatters.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import type { FormattersInitializer } from 'typesafe-i18n'
-import type { Locales, Formatters } from './i18n-types'
-
-export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => {
-
- const formatters: Formatters = {
- // add your formatter functions here
- }
-
- return formatters
-}
diff --git a/apps/web-shared/src/lib/i18n/i18n-types.ts b/apps/web-shared/src/lib/i18n/i18n-types.ts
deleted file mode 100644
index 62a13dd..0000000
--- a/apps/web-shared/src/lib/i18n/i18n-types.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
-/* eslint-disable */
-import type { BaseTranslation as BaseTranslationType, LocalizedString } from 'typesafe-i18n'
-
-export type BaseTranslation = BaseTranslationType
-export type BaseLocale = 'en'
-
-export type Locales =
- | 'en'
- | 'nb'
-
-export type Translation = RootTranslation
-
-export type Translations = RootTranslation
-
-type RootTranslation = {
- stopwatch: {
- /**
- * Round up
- */
- roundUp: string
- /**
- * Round down
- */
- roundDown: string
- /**
- * Create entry
- */
- createEntry: string
- /**
- * What's your focus?
- */
- whatsYourFocus: string
- /**
- * Reset
- */
- reset: string
- /**
- * Start
- */
- start: string
- /**
- * Stop
- */
- stop: string
- }
- localeSwitcher: {
- /**
- * Language
- */
- language: string
- }
-}
-
-export type TranslationFunctions = {
- stopwatch: {
- /**
- * Round up
- */
- roundUp: () => LocalizedString
- /**
- * Round down
- */
- roundDown: () => LocalizedString
- /**
- * Create entry
- */
- createEntry: () => LocalizedString
- /**
- * What's your focus?
- */
- whatsYourFocus: () => LocalizedString
- /**
- * Reset
- */
- reset: () => LocalizedString
- /**
- * Start
- */
- start: () => LocalizedString
- /**
- * Stop
- */
- stop: () => LocalizedString
- }
- localeSwitcher: {
- /**
- * Language
- */
- language: () => LocalizedString
- }
-}
-
-export type Formatters = {}
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.async.ts b/apps/web-shared/src/lib/i18n/i18n-util.async.ts
deleted file mode 100644
index 90e55a7..0000000
--- a/apps/web-shared/src/lib/i18n/i18n-util.async.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
-/* eslint-disable */
-
-import { initFormatters } from './formatters'
-import type { Locales, Translations } from './i18n-types.js'
-import { loadedFormatters, loadedLocales, locales } from './i18n-util'
-
-const localeTranslationLoaders = {
- en: () => import('./en/index.js'),
- nb: () => import('./nb/index.js'),
-}
-
-const updateDictionary = (locale: Locales, dictionary: Partial<Translations>) =>
- loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary }
-
-export const loadLocaleAsync = async (locale: Locales): Promise<void> => {
- updateDictionary(
- locale,
- (await localeTranslationLoaders[locale]()).default as unknown as Translations
- )
- loadFormatters(locale)
-}
-
-export const loadAllLocalesAsync = (): Promise<void[]> => Promise.all(locales.map(loadLocaleAsync))
-
-export const loadFormatters = (locale: Locales): void =>
- void (loadedFormatters[locale] = initFormatters(locale))
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.sync.ts b/apps/web-shared/src/lib/i18n/i18n-util.sync.ts
deleted file mode 100644
index 8909831..0000000
--- a/apps/web-shared/src/lib/i18n/i18n-util.sync.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
-/* eslint-disable */
-
-import { initFormatters } from './formatters'
-import type { Locales, Translations } from './i18n-types.js'
-import { loadedFormatters, loadedLocales, locales } from './i18n-util'
-
-import en from './en/index.js'
-import nb from './nb/index.js'
-
-const localeTranslations = {
- en,
- nb,
-}
-
-export const loadLocale = (locale: Locales): void => {
- if (loadedLocales[locale]) return
-
- loadedLocales[locale] = localeTranslations[locale] as unknown as Translations
- loadFormatters(locale)
-}
-
-export const loadAllLocales = (): void => locales.forEach(loadLocale)
-
-export const loadFormatters = (locale: Locales): void => {
- loadedFormatters[locale] = initFormatters(locale)
-}
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.ts b/apps/web-shared/src/lib/i18n/i18n-util.ts
deleted file mode 100644
index 5a9dd0d..0000000
--- a/apps/web-shared/src/lib/i18n/i18n-util.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
-/* eslint-disable */
-
-import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n'
-import type { LocaleDetector } from 'typesafe-i18n/detectors'
-import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors'
-import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types.js'
-
-export const baseLocale: Locales = 'en'
-
-export const locales: Locales[] = [
- 'en',
- 'nb'
-]
-
-export const loadedLocales = {} as Record<Locales, Translations>
-
-export const loadedFormatters = {} as Record<Locales, Formatters>
-
-export const i18nString = (locale: Locales) => initI18nString<Locales, Formatters>(locale, loadedFormatters[locale])
-
-export const i18nObject = (locale: Locales) =>
- initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(
- locale,
- loadedLocales[locale],
- loadedFormatters[locale]
- )
-
-export const i18n = () => initI18n<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
-
-export const detectLocale = (...detectors: LocaleDetector[]) => detectLocaleFn<Locales>(baseLocale, locales, ...detectors)
diff --git a/apps/web-shared/src/lib/i18n/nb/index.ts b/apps/web-shared/src/lib/i18n/nb/index.ts
deleted file mode 100644
index a1d5f53..0000000
--- a/apps/web-shared/src/lib/i18n/nb/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import type {Translation} from "../i18n-types";
-
-const nb: Translation = {
- stopwatch: {
- roundUp: "Rund opp",
- roundDown: "Rund ned",
- createEntry: "Opprett tidsoppføring",
- whatsYourFocus: "Hva skal du fokusere på?",
- reset: "Tilbakestill",
- start: "Start",
- stop: "Stopp",
- }
-};
-
-export default nb;
diff --git a/apps/web-shared/src/styles/_base.scss b/apps/web-shared/src/styles/_base.scss
deleted file mode 100644
index 414b440..0000000
--- a/apps/web-shared/src/styles/_base.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-// --------------------------------
-
-// Basic Style - Essential CSS rules and utility classes
-
-// --------------------------------
-
-@forward 'base/breakpoints';
-@forward 'base/mixins';
-@forward 'base/grid-layout';
-
-@use 'base/reset';
-@use 'base/colors';
-@use 'base/spacing';
-@use 'base/shared-styles';
-@use 'base/typography';
-@use 'base/icons';
-@use 'base/buttons';
-@use 'base/forms';
-@use 'base/z-index';
-@use 'base/visibility';
-@use 'base/accessibility';
-@use 'base/util';
-
-pre {
- font-family: monospace !important;
-}
-
-*:focus-visible {
- outline: 1px auto;
-}
-
-.c-disabled {
- cursor: not-allowed !important;
- filter: opacity(.45);
- pointer-events: none !important;
-
- &.loading {
- cursor: wait !important;
- }
-}
-
-button.btn--state-b {
- cursor: wait;
-}
-
-button.reset {
- cursor: pointer !important;
-}
diff --git a/apps/web-shared/src/styles/base/_accessibility.scss b/apps/web-shared/src/styles/base/_accessibility.scss
deleted file mode 100644
index 9f71937..0000000
--- a/apps/web-shared/src/styles/base/_accessibility.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-.sr-only { // content made available only to screen readers
- position: absolute;
- clip: rect(1px, 1px, 1px, 1px);
- clip-path: inset(50%);
- width: 1px;
- height: 1px;
- overflow: hidden;
- padding: 0;
- border: 0;
- white-space: nowrap;
-}
-
-.sr-only-focusable { // focusable, visually hidden element
- &:not(:focus):not(:focus-within){
- @extend .sr-only
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_breakpoints.scss b/apps/web-shared/src/styles/base/_breakpoints.scss
deleted file mode 100644
index 9b61af3..0000000
--- a/apps/web-shared/src/styles/base/_breakpoints.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-$breakpoints: (
- xs: "768px",
- sm: "768px",
- md: "1200px",
- lg: "1200px",
- xl: "1600px"
-) !default;
-
-@mixin breakpoint($breakpoint, $logic: false) {
- @if ($logic) {
- @media #{$logic} and (min-width: map-get($map: $breakpoints, $key: $breakpoint)) {
- @content;
- }
- } @else {
- @media (min-width: map-get($map: $breakpoints, $key: $breakpoint)) {
- @content;
- }
- }
-}
diff --git a/apps/web-shared/src/styles/base/_buttons.scss b/apps/web-shared/src/styles/base/_buttons.scss
deleted file mode 100644
index 2a7ff34..0000000
--- a/apps/web-shared/src/styles/base/_buttons.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_buttons.scss to create your custom buttons
-
-.btn { // basic button style
- position: relative;
- display: inline-flex;
- justify-content: center;
- align-items: center;
- white-space: nowrap;
- text-decoration: none;
- font-size: var(--btn-font-size, 1em);
- padding-top: var(--btn-padding-y, 0.5em);
- padding-bottom: var(--btn-padding-y, 0.5em);
- padding-left: var(--btn-padding-x, 0.75em);
- padding-right: var(--btn-padding-x, 0.75em);
- border-radius: var(--btn-radius, 0.25em);
-}
-
-// default size variations
-.btn--sm { font-size: var(--btn-font-size-sm, 0.8em); }
-.btn--md { font-size: var(--btn-font-size-md, 1.2em); }
-.btn--lg { font-size: var(--btn-font-size-lg, 1.4em); }
-
-// button with (only) icon
-.btn--icon { padding: var(--btn-padding-y, 0.5em); } \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_colors.scss b/apps/web-shared/src/styles/base/_colors.scss
deleted file mode 100644
index f061d9a..0000000
--- a/apps/web-shared/src/styles/base/_colors.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_colors.scss to create your color palette
-
-[data-theme] {
- background-color: var(--color-bg, hsl(0, 0%, 100%));
- color: var(--color-contrast-high, hsl(210, 7%, 21%));
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_forms.scss b/apps/web-shared/src/styles/base/_forms.scss
deleted file mode 100644
index faffddd..0000000
--- a/apps/web-shared/src/styles/base/_forms.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_forms.scss to create your custom form elements
-
-.form-control {
- font-size: var(--form-control-font-size, 1em);
- padding-top: var(--form-control-padding-y, 0.5em);
- padding-bottom: var(--form-control-padding-y, 0.5em);
- padding-left: var(--form-control-padding-x, 0.75em);
- padding-right: var(--form-control-padding-x, 0.75em);
- border-radius: var(--form-control-radius, 0.25em);
-}
-
-.form-legend {
- color: var(--color-contrast-higher, hsl(204, 28%, 7%));
- line-height: var(--heading-line-height, 1.2);
- font-size: var(--text-md, 1.125rem);
- margin-bottom: var(--space-sm);
-}
-
-.form-label {
- display: inline-block;
- font-size: var(--text-sm, 0.75rem);
-}
diff --git a/apps/web-shared/src/styles/base/_grid-layout.scss b/apps/web-shared/src/styles/base/_grid-layout.scss
deleted file mode 100644
index bd8b6c9..0000000
--- a/apps/web-shared/src/styles/base/_grid-layout.scss
+++ /dev/null
@@ -1,261 +0,0 @@
-@use 'mixins' as *;
-@use 'breakpoints' as *;
-
-// --------------------------------
-
-// Container - center content on x-axis
-
-// --------------------------------
-
-.container {
- width: calc(100% - 2*var(--component-padding));
- margin-left: auto;
- margin-right: auto;
-}
-
-// --------------------------------
-
-// Grid System
-
-// --------------------------------
-
-$grid-columns: 12 !default;
-
-.grid, .flex, .inline-flex {
- --gap: 0px;
- --gap-x: var(--gap);
- --gap-y: var(--gap);
- gap: var(--gap-y) var(--gap-x);
-
- > * {
- --sub-gap: 0px;
- --sub-gap-x: var(--sub-gap);
- --sub-gap-y: var(--sub-gap);
- }
-}
-
-.grid {
- --grid-columns: 12;
- display: flex;
- flex-wrap: wrap;
-
- > * {
- flex-basis: 100%;
- max-width: 100%;
- min-width: 0;
- }
-}
-
-/* #region (Safari < 14.1 fallback) */
-@media not all and (min-resolution:.001dpcm) {
- @supports (not(translate: none)) {
- .grid, .flex[class*="gap-"], .inline-flex[class*="gap-"] {
- gap: 0; // reset
- margin-bottom: calc(-1 * var(--gap-y));
- margin-left: calc(-1 * var(--gap-x));
-
- > * {
- margin-bottom: var(--sub-gap-y);
- }
- }
-
- .grid {
- --offset: var(--gap-x);
- --gap-modifier: 0;
- --offset-modifier: 1;
-
- > * {
- margin-left: var(--offset);
- }
- }
-
- .flex[class*="gap-"], .inline-flex[class*="gap-"] {
- > * {
- margin-left: var(--sub-gap-x);
- }
- }
- }
-}
-/* #endregion */
-
-.gap-xxxxs { --gap-x: var(--space-xxxxs); --gap-y: var(--space-xxxxs); > * { --sub-gap-x: var(--space-xxxxs); --sub-gap-y: var(--space-xxxxs); }}
-.gap-xxxs { --gap-x: var(--space-xxxs); --gap-y: var(--space-xxxs); > * { --sub-gap-x: var(--space-xxxs); --sub-gap-y: var(--space-xxxs); }}
-.gap-xxs { --gap-x: var(--space-xxs); --gap-y: var(--space-xxs); > * { --sub-gap-x: var(--space-xxs); --sub-gap-y: var(--space-xxs); }}
-.gap-xs { --gap-x: var(--space-xs); --gap-y: var(--space-xs); > * { --sub-gap-x: var(--space-xs); --sub-gap-y: var(--space-xs); }}
-.gap-sm { --gap-x: var(--space-sm); --gap-y: var(--space-sm); > * { --sub-gap-x: var(--space-sm); --sub-gap-y: var(--space-sm); }}
-.gap-md { --gap-x: var(--space-md); --gap-y: var(--space-md); > * { --sub-gap-x: var(--space-md); --sub-gap-y: var(--space-md); }}
-.gap-lg { --gap-x: var(--space-lg); --gap-y: var(--space-lg); > * { --sub-gap-x: var(--space-lg); --sub-gap-y: var(--space-lg); }}
-.gap-xl { --gap-x: var(--space-xl); --gap-y: var(--space-xl); > * { --sub-gap-x: var(--space-xl); --sub-gap-y: var(--space-xl); }}
-.gap-xxl { --gap-x: var(--space-xxl); --gap-y: var(--space-xxl); > * { --sub-gap-x: var(--space-xxl); --sub-gap-y: var(--space-xxl); }}
-.gap-xxxl { --gap-x: var(--space-xxxl); --gap-y: var(--space-xxxl); > * { --sub-gap-x: var(--space-xxxl); --sub-gap-y: var(--space-xxxl); }}
-.gap-xxxxl { --gap-x: var(--space-xxxxl); --gap-y: var(--space-xxxxl); > * { --sub-gap-x: var(--space-xxxxl); --sub-gap-y: var(--space-xxxxl); }}
-.gap-0 { --gap-x: 0; --gap-y: 0; > * { --sub-gap-x: 0; --sub-gap-y: 0; }}
-
-.gap-x-xxxxs { --gap-x: var(--space-xxxxs); > * { --sub-gap-x: var(--space-xxxxs); }}
-.gap-x-xxxs { --gap-x: var(--space-xxxs); > * { --sub-gap-x: var(--space-xxxs); }}
-.gap-x-xxs { --gap-x: var(--space-xxs); > * { --sub-gap-x: var(--space-xxs); }}
-.gap-x-xs { --gap-x: var(--space-xs); > * { --sub-gap-x: var(--space-xs); }}
-.gap-x-sm { --gap-x: var(--space-sm); > * { --sub-gap-x: var(--space-sm); }}
-.gap-x-md { --gap-x: var(--space-md); > * { --sub-gap-x: var(--space-md); }}
-.gap-x-lg { --gap-x: var(--space-lg); > * { --sub-gap-x: var(--space-lg); }}
-.gap-x-xl { --gap-x: var(--space-xl); > * { --sub-gap-x: var(--space-xl); }}
-.gap-x-xxl { --gap-x: var(--space-xxl); > * { --sub-gap-x: var(--space-xxl); }}
-.gap-x-xxxl { --gap-x: var(--space-xxxl); > * { --sub-gap-x: var(--space-xxxl); }}
-.gap-x-xxxxl { --gap-x: var(--space-xxxxl); > * { --sub-gap-x: var(--space-xxxxl); }}
-.gap-x-0 { --gap-x: 0; > * { --sub-gap-x: 0; }}
-
-.gap-y-xxxxs { --gap-y: var(--space-xxxxs); > * { --sub-gap-y: var(--space-xxxxs); }}
-.gap-y-xxxs { --gap-y: var(--space-xxxs); > * { --sub-gap-y: var(--space-xxxs); }}
-.gap-y-xxs { --gap-y: var(--space-xxs); > * { --sub-gap-y: var(--space-xxs); }}
-.gap-y-xs { --gap-y: var(--space-xs); > * { --sub-gap-y: var(--space-xs); }}
-.gap-y-sm { --gap-y: var(--space-sm); > * { --sub-gap-y: var(--space-sm); }}
-.gap-y-md { --gap-y: var(--space-md); > * { --sub-gap-y: var(--space-md); }}
-.gap-y-lg { --gap-y: var(--space-lg); > * { --sub-gap-y: var(--space-lg); }}
-.gap-y-xl { --gap-y: var(--space-xl); > * { --sub-gap-y: var(--space-xl); }}
-.gap-y-xxl { --gap-y: var(--space-xxl); > * { --sub-gap-y: var(--space-xxl); }}
-.gap-y-xxxl { --gap-y: var(--space-xxxl); > * { --sub-gap-y: var(--space-xxxl); }}
-.gap-y-xxxxl { --gap-y: var(--space-xxxxl); > * { --sub-gap-y: var(--space-xxxxl); }}
-.gap-y-0 { --gap-y: 0; > * { --sub-gap-y: 0; }}
-
-$grid-col-class-list: ''; // list of col-{span} classes
-
-@for $i from 1 through $grid-columns {
- $grid-col-class-list: $grid-col-class-list + ".col-#{$i}";
- @if($i < $grid-columns) {
- $grid-col-class-list: $grid-col-class-list + ', ';
- }
- .grid-col-#{$i} { --grid-columns: #{$i}; } // set number of grid columns
- .col-#{$i} { --span: #{$i}; } // set grid item span
-}
-
-#{$grid-col-class-list} {
- flex-basis: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--span) / var(--grid-columns)) + (var(--span) - 1) * var(--sub-gap-x));
- max-width: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--span) / var(--grid-columns)) + (var(--span) - 1) * var(--sub-gap-x));
-}
-
-.col { // auto-expanding column
- flex-grow: 1;
- flex-basis: 0;
- max-width: 100%;
-}
-
-.col-content { // column width depends on its content
- flex-grow: 0;
- flex-basis: initial;
- max-width: initial;
-}
-
-// offset
-$grid-offset-class-list: ''; // list of offset-{span} classes
-
-@for $i from 1 through $grid-columns - 1 {
- $grid-offset-class-list: $grid-offset-class-list + ".offset-#{$i}";
- @if($i < $grid-columns) {
- $grid-offset-class-list: $grid-offset-class-list + ', ';
- }
- .offset-#{$i} { --offset: #{$i}; }
-}
-
-#{$grid-offset-class-list} {
- margin-left: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--offset) / var(--grid-columns)) + (var(--offset) + var(--offset-modifier, 0)) * var(--sub-gap-x));
-}
-
-// responsive variations
-@each $breakpoint, $value in $breakpoints {
- @include breakpoint(#{$breakpoint}) {
- .gap-xxxxs\@#{$breakpoint} { --gap-x: var(--space-xxxxs); --gap-y: var(--space-xxxxs); > * { --sub-gap-x: var(--space-xxxxs); --sub-gap-y: var(--space-xxxxs); }}
- .gap-xxxs\@#{$breakpoint} { --gap-x: var(--space-xxxs); --gap-y: var(--space-xxxs); > * { --sub-gap-x: var(--space-xxxs); --sub-gap-y: var(--space-xxxs); }}
- .gap-xxs\@#{$breakpoint} { --gap-x: var(--space-xxs); --gap-y: var(--space-xxs); > * { --sub-gap-x: var(--space-xxs); --sub-gap-y: var(--space-xxs); }}
- .gap-xs\@#{$breakpoint} { --gap-x: var(--space-xs); --gap-y: var(--space-xs); > * { --sub-gap-x: var(--space-xs); --sub-gap-y: var(--space-xs); }}
- .gap-sm\@#{$breakpoint} { --gap-x: var(--space-sm); --gap-y: var(--space-sm); > * { --sub-gap-x: var(--space-sm); --sub-gap-y: var(--space-sm); }}
- .gap-md\@#{$breakpoint} { --gap-x: var(--space-md); --gap-y: var(--space-md); > * { --sub-gap-x: var(--space-md); --sub-gap-y: var(--space-md); }}
- .gap-lg\@#{$breakpoint} { --gap-x: var(--space-lg); --gap-y: var(--space-lg); > * { --sub-gap-x: var(--space-lg); --sub-gap-y: var(--space-lg); }}
- .gap-xl\@#{$breakpoint} { --gap-x: var(--space-xl); --gap-y: var(--space-xl); > * { --sub-gap-x: var(--space-xl); --sub-gap-y: var(--space-xl); }}
- .gap-xxl\@#{$breakpoint} { --gap-x: var(--space-xxl); --gap-y: var(--space-xxl); > * { --sub-gap-x: var(--space-xxl); --sub-gap-y: var(--space-xxl); }}
- .gap-xxxl\@#{$breakpoint} { --gap-x: var(--space-xxxl); --gap-y: var(--space-xxxl); > * { --sub-gap-x: var(--space-xxxl); --sub-gap-y: var(--space-xxxl); }}
- .gap-xxxxl\@#{$breakpoint} { --gap-x: var(--space-xxxxl); --gap-y: var(--space-xxxxl); > * { --sub-gap-x: var(--space-xxxxl); --sub-gap-y: var(--space-xxxxl); }}
- .gap-0\@#{$breakpoint} { --gap-x: 0; --gap-y: 0; > * { --sub-gap-x: 0; --sub-gap-y: 0; }}
-
- .gap-x-xxxxs\@#{$breakpoint} { --gap-x: var(--space-xxxxs); > * { --sub-gap-x: var(--space-xxxxs); }}
- .gap-x-xxxs\@#{$breakpoint} { --gap-x: var(--space-xxxs); > * { --sub-gap-x: var(--space-xxxs); }}
- .gap-x-xxs\@#{$breakpoint} { --gap-x: var(--space-xxs); > * { --sub-gap-x: var(--space-xxs); }}
- .gap-x-xs\@#{$breakpoint} { --gap-x: var(--space-xs); > * { --sub-gap-x: var(--space-xs); }}
- .gap-x-sm\@#{$breakpoint} { --gap-x: var(--space-sm); > * { --sub-gap-x: var(--space-sm); }}
- .gap-x-md\@#{$breakpoint} { --gap-x: var(--space-md); > * { --sub-gap-x: var(--space-md); }}
- .gap-x-lg\@#{$breakpoint} { --gap-x: var(--space-lg); > * { --sub-gap-x: var(--space-lg); }}
- .gap-x-xl\@#{$breakpoint} { --gap-x: var(--space-xl); > * { --sub-gap-x: var(--space-xl); }}
- .gap-x-xxl\@#{$breakpoint} { --gap-x: var(--space-xxl); > * { --sub-gap-x: var(--space-xxl); }}
- .gap-x-xxxl\@#{$breakpoint} { --gap-x: var(--space-xxxl); > * { --sub-gap-x: var(--space-xxxl); }}
- .gap-x-xxxxl\@#{$breakpoint} { --gap-x: var(--space-xxxxl); > * { --sub-gap-x: var(--space-xxxxl); }}
- .gap-x-0\@#{$breakpoint} { --gap-x: 0; > * { --sub-gap-x: 0; }}
-
- .gap-y-xxxxs\@#{$breakpoint} { --gap-y: var(--space-xxxxs); > * { --sub-gap-y: var(--space-xxxxs); }}
- .gap-y-xxxs\@#{$breakpoint} { --gap-y: var(--space-xxxs); > * { --sub-gap-y: var(--space-xxxs); }}
- .gap-y-xxs\@#{$breakpoint} { --gap-y: var(--space-xxs); > * { --sub-gap-y: var(--space-xxs); }}
- .gap-y-xs\@#{$breakpoint} { --gap-y: var(--space-xs); > * { --sub-gap-y: var(--space-xs); }}
- .gap-y-sm\@#{$breakpoint} { --gap-y: var(--space-sm); > * { --sub-gap-y: var(--space-sm); }}
- .gap-y-md\@#{$breakpoint} { --gap-y: var(--space-md); > * { --sub-gap-y: var(--space-md); }}
- .gap-y-lg\@#{$breakpoint} { --gap-y: var(--space-lg); > * { --sub-gap-y: var(--space-lg); }}
- .gap-y-xl\@#{$breakpoint} { --gap-y: var(--space-xl); > * { --sub-gap-y: var(--space-xl); }}
- .gap-y-xxl\@#{$breakpoint} { --gap-y: var(--space-xxl); > * { --sub-gap-y: var(--space-xxl); }}
- .gap-y-xxxl\@#{$breakpoint} { --gap-y: var(--space-xxxl); > * { --sub-gap-y: var(--space-xxxl); }}
- .gap-y-xxxxl\@#{$breakpoint} { --gap-y: var(--space-xxxxl); > * { --sub-gap-y: var(--space-xxxxl); }}
- .gap-y-0\@#{$breakpoint} { --gap-y: 0; > * { --sub-gap-y: 0; }}
-
- $grid-col-class-list: ''; // list of col-{span} classes
-
- @for $i from 1 through $grid-columns {
- $grid-col-class-list: $grid-col-class-list + ".col-#{$i}\\@#{$breakpoint}";
- @if($i < $grid-columns) {
- $grid-col-class-list: $grid-col-class-list + ', ';
- }
- .grid-col-#{$i}\@#{$breakpoint} { --grid-columns: #{$i}; } // set number of grid columns
- .col-#{$i}\@#{$breakpoint} { --span: #{$i}; } // set grid item span
- }
-
- #{$grid-col-class-list} {
- flex-basis: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--span) / var(--grid-columns)) + (var(--span) - 1) * var(--sub-gap-x));
- max-width: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--span) / var(--grid-columns)) + (var(--span) - 1) * var(--sub-gap-x));
- }
-
- .col\@#{$breakpoint} { // auto-expanding column
- flex-grow: 1;
- flex-basis: 0;
- max-width: 100%;
- }
-
- .col-content\@#{$breakpoint} { // column width depends on its content
- flex-grow: 0;
- flex-basis: initial;
- max-width: initial;
- }
-
- // offset
- $grid-offset-class-list: ''; // list of offset-{span} classes
-
- @for $i from 1 through $grid-columns - 1 {
- $grid-offset-class-list: $grid-offset-class-list + ".offset-#{$i}\\@#{$breakpoint}";
- @if($i < $grid-columns) {
- $grid-offset-class-list: $grid-offset-class-list + ', ';
- }
- .offset-#{$i}\@#{$breakpoint} { --offset: #{$i}; }
- }
-
- #{$grid-offset-class-list} {
- margin-left: calc(((100% - (var(--grid-columns) - var(--gap-modifier, 1)) * var(--sub-gap-x)) * var(--offset) / var(--grid-columns)) + (var(--offset) + var(--offset-modifier, 0)) * var(--sub-gap-x));
- }
-
- .offset-0\@#{$breakpoint} {
- margin-left: 0;
- }
-
- @media not all and (min-resolution:.001dpcm) {
- @supports (not(translate: none)) {
- .offset-0\@#{$breakpoint} {
- margin-left: var(--gap-x);
- }
- }
- }
- }
-}
-
diff --git a/apps/web-shared/src/styles/base/_icons.scss b/apps/web-shared/src/styles/base/_icons.scss
deleted file mode 100644
index 1674a7c..0000000
--- a/apps/web-shared/src/styles/base/_icons.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_icons.scss to set your custom icons style
-
-:root {
- // default icon sizes
- --icon-xxxs: 8px;
- --icon-xxs: 12px;
- --icon-xs: 16px;
- --icon-sm: 24px;
- --icon-md: 32px;
- --icon-lg: 48px;
- --icon-xl: 64px;
- --icon-xxl: 96px;
- --icon-xxxl: 128px;
-}
-
-.icon {
- --size: 1em;
- height: var(--size);
- width: var(--size);
- display: inline-block;
- color: inherit;
- fill: currentColor;
- line-height: 1;
- flex-shrink: 0;
- max-width: initial;
-}
-
-// icon size
-.icon--xxxs { --size: var(--icon-xxxs); }
-.icon--xxs { --size: var(--icon-xxs); }
-.icon--xs { --size: var(--icon-xs); }
-.icon--sm { --size: var(--icon-sm); }
-.icon--md { --size: var(--icon-md); }
-.icon--lg { --size: var(--icon-lg); }
-.icon--xl { --size: var(--icon-xl); }
-.icon--xxl { --size: var(--icon-xxl); }
-.icon--xxxl { --size: var(--icon-xxxl); }
-
-.icon--is-spinning { // rotate the icon infinitely
- animation: icon-spin 1s infinite linear;
-}
-
-@keyframes icon-spin {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
-
-// --------------------------------
-
-// SVG <symbol>
-
-// --------------------------------
-
-// enable icon color corrections
-.icon use {
- color: inherit;
- fill: currentColor;
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_mixins.scss b/apps/web-shared/src/styles/base/_mixins.scss
deleted file mode 100644
index 8fe82f6..0000000
--- a/apps/web-shared/src/styles/base/_mixins.scss
+++ /dev/null
@@ -1,151 +0,0 @@
-@use 'sass:math';
-
-// --------------------------------
-
-// Typography
-
-// --------------------------------
-
-// edit font rendering -> tip: use for light text on dark backgrounds
-@mixin fontSmooth {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-// crop top space on text elements - caused by line height
-@mixin lhCrop($line-height, $capital-letter: 1) {
- &::before {
- content: '';
- display: block;
- height: 0;
- width: 0;
- margin-top: calc((#{$capital-letter} - #{$line-height}) * 0.5em);
- }
-}
-
-// edit text unit on a component level
-@mixin textUnit($text-unit) {
- --text-unit: #{$text-unit};
- font-size: var(--text-unit);
-}
-
-// --------------------------------
-
-// Spacing
-
-// --------------------------------
-
-// edit space unit on a component level
-@mixin spaceUnit($space-unit) {
- --space-unit: #{$space-unit};
-}
-
-// --------------------------------
-
-// Reset
-
-// --------------------------------
-
-// reset user agent style
-@mixin reset {
- background-color: transparent;
- padding: 0;
- border: 0;
- border-radius: 0;
- color: inherit;
- line-height: inherit;
- appearance: none;
-}
-
-// --------------------------------
-
-// Colors
-
-// --------------------------------
-
-// define HSL color variable
-@mixin defineColorHSL($color, $hue, $saturation, $lightness) {
- #{$color}: unquote("hsl(#{$hue}, #{$saturation}, #{$lightness})");#{$color}-h: #{$hue};#{$color}-s: #{$saturation};#{$color}-l: #{$lightness};
-}
-
-// return color with different opacity value
-@function alpha($color, $opacity) {
- $color: str-replace($color, 'var(');
- $color: str-replace($color, ')');
- $color-h: var(#{$color+'-h'});
- $color-s: var(#{$color+'-s'});
- $color-l: var(#{$color+'-l'});
- @return hsla($color-h, $color-s, $color-l, $opacity);
-}
-
-// return color with different lightness value
-@function lightness($color, $lightnessMultiplier) {
- $color: str-replace($color, 'var(');
- $color: str-replace($color, ')');
- $color-h: var(#{$color+'-h'});
- $color-s: var(#{$color+'-s'});
- $color-l: var(#{$color+'-l'});
- @return hsl($color-h, $color-s, calc(#{$color-l} * #{$lightnessMultiplier}));
-}
-
-// modify color HSLA values
-@function adjustHSLA($color, $hueMultiplier: 1, $saturationMultiplier: 1, $lightnessMultiplier: 1, $opacity: 1) {
- $color: str-replace($color, 'var(');
- $color: str-replace($color, ')');
- $color-h: var(#{$color+'-h'});
- $color-s: var(#{$color+'-s'});
- $color-l: var(#{$color+'-l'});
- @return hsla(calc(#{$color-h} * #{$hueMultiplier}), calc(#{$color-s} * #{$saturationMultiplier}), calc(#{$color-l} * #{$lightnessMultiplier}), $opacity);
-}
-
-// replace substring with another string
-// credits: https://css-tricks.com/snippets/sass/str-replace-function/
-@function str-replace($string, $search, $replace: '') {
- $index: str-index($string, $search);
- @if $index {
- @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
- }
- @return $string;
-}
-
-// --------------------------------
-
-// Accessibility
-
-// --------------------------------
-
-// hide - content made available only to screen readers
-@mixin srHide {
- position: absolute;
- clip: rect(1px, 1px, 1px, 1px);
- clip-path: inset(50%);
-}
-
-// show
-@mixin srShow {
- position: static;
- clip: auto;
- clip-path: none;
-}
-
-// --------------------------------
-
-// CSS Triangle
-
-// --------------------------------
-
-@mixin triangle ($direction: up, $width: 12px, $color: red) {
- width: 0;
- height: 0;
- border: $width solid transparent;
-
- @if( $direction == left ) {
- border-right-color: $color;
- } @else if( $direction == right ) {
- border-left-color: $color;
- } @else if( $direction == down ) {
- border-top-color: $color;
- } @else {
- border-bottom-color: $color;
- }
-}
diff --git a/apps/web-shared/src/styles/base/_reset.scss b/apps/web-shared/src/styles/base/_reset.scss
deleted file mode 100644
index 5ba4534..0000000
--- a/apps/web-shared/src/styles/base/_reset.scss
+++ /dev/null
@@ -1,83 +0,0 @@
-*, *::after, *::before {
- box-sizing: inherit;
-}
-
-* {
- font: inherit;
-}
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed,
-figure, figcaption, footer, header, hgroup,
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video, hr {
- margin: 0;
- padding: 0;
- border: 0;
-}
-
-html {
- box-sizing: border-box;
-}
-
-body {
- background-color: var(--color-bg, white);
-}
-
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section, main, form legend {
- display: block;
-}
-
-ol, ul, menu {
- list-style: none;
-}
-
-blockquote, q {
- quotes: none;
-}
-
-button, input, textarea, select {
- margin: 0;
-}
-
-.btn, .form-control, .link, .reset { // reset style of buttons + form controls
- background-color: transparent;
- padding: 0;
- border: 0;
- border-radius: 0;
- color: inherit;
- line-height: inherit;
- appearance: none;
-}
-
-select.form-control::-ms-expand {
- display: none; // hide Select default icon on IE
-}
-
-textarea {
- resize: vertical;
- overflow: auto;
- vertical-align: top;
-}
-
-input::-ms-clear {
- display: none; // hide X icon in IE and Edge
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-img, video, svg {
- max-width: 100%;
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_shared-styles.scss b/apps/web-shared/src/styles/base/_shared-styles.scss
deleted file mode 100644
index dae02fe..0000000
--- a/apps/web-shared/src/styles/base/_shared-styles.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_shared-style.scss to set your custom shared styles
-
-:root {
- // radius
- --radius-sm: calc(var(--radius, 0.25em)/2);
- --radius-md: var(--radius, 0.25em);
- --radius-lg: calc(var(--radius, 0.25em)*2);
-
- // box shadow
- --shadow-xs: 0 0.1px 0.3px rgba(0, 0, 0, 0.06),
- 0 1px 2px rgba(0, 0, 0, 0.12);
- --shadow-sm: 0 0.3px 0.4px rgba(0, 0, 0, 0.025),
- 0 0.9px 1.5px rgba(0, 0, 0, 0.05),
- 0 3.5px 6px rgba(0, 0, 0, 0.1);
- --shadow-md: 0 0.9px 1.5px rgba(0, 0, 0, 0.03),
- 0 3.1px 5.5px rgba(0, 0, 0, 0.08),
- 0 14px 25px rgba(0, 0, 0, 0.12);
- --shadow-lg: 0 1.2px 1.9px -1px rgba(0, 0, 0, 0.014),
- 0 3.3px 5.3px -1px rgba(0, 0, 0, 0.038),
- 0 8.5px 12.7px -1px rgba(0, 0, 0, 0.085),
- 0 30px 42px -1px rgba(0, 0, 0, 0.15);
- --shadow-xl: 0 1.5px 2.1px -6px rgba(0, 0, 0, 0.012),
- 0 3.6px 5.2px -6px rgba(0, 0, 0, 0.035),
- 0 7.3px 10.6px -6px rgba(0, 0, 0, 0.07),
- 0 16.2px 21.9px -6px rgba(0, 0, 0, 0.117),
- 0 46px 60px -6px rgba(0, 0, 0, 0.2);
-
- // timing functions
- // credits: https://github.com/ai/easings.net
- --ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
- --ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);
- --ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
- --ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_spacing.scss b/apps/web-shared/src/styles/base/_spacing.scss
deleted file mode 100644
index 24e6645..0000000
--- a/apps/web-shared/src/styles/base/_spacing.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_spacing.scss to set your custom spacing scale
-
-:root {
- --space-unit: 1rem;
-}
-
-:root, * {
- --space-xxxxs: calc(0.125 * var(--space-unit));
- --space-xxxs: calc(0.25 * var(--space-unit));
- --space-xxs: calc(0.375 * var(--space-unit));
- --space-xs: calc(0.5 * var(--space-unit));
- --space-sm: calc(0.75 * var(--space-unit));
- --space-md: calc(1.25 * var(--space-unit));
- --space-lg: calc(2 * var(--space-unit));
- --space-xl: calc(3.25 * var(--space-unit));
- --space-xxl: calc(5.25 * var(--space-unit));
- --space-xxxl: calc(8.5 * var(--space-unit));
- --space-xxxxl: calc(13.75 * var(--space-unit));
- --component-padding: var(--space-md);
-}
diff --git a/apps/web-shared/src/styles/base/_typography.scss b/apps/web-shared/src/styles/base/_typography.scss
deleted file mode 100644
index 85b974a..0000000
--- a/apps/web-shared/src/styles/base/_typography.scss
+++ /dev/null
@@ -1,185 +0,0 @@
-// don't modify this file -> edit 📁 custom-style/_typography.scss to set your custom typography
-
-@use 'breakpoints' as *;
-
-:root {
- --heading-line-height: 1.2;
- --body-line-height: 1.4;
-}
-
-body {
- font-size: var(--text-base-size, 1rem);
- font-family: var(--font-primary, sans-serif);
- color: var(--color-contrast-high, hsl(210, 7%, 21%));
- font-weight: var(--body-font-weight, normal);
-}
-
-h1, h2, h3, h4 {
- color: var(--color-contrast-higher, hsl(204, 28%, 7%));
- line-height: var(--heading-line-height, 1.2);
- font-weight: var(--heading-font-weight, 700);
-}
-
-h1 {
- font-size: var(--text-xxl, 2rem);
-}
-
-h2 {
- font-size: var(--text-xl, 1.75rem);
-}
-
-h3 {
- font-size: var(--text-lg, 1.375rem);
-}
-
-h4 {
- font-size: var(--text-md, 1.125rem);
-}
-
-small {
- font-size: var(--text-sm, 0.75rem);
-}
-
-// --------------------------------
-
-// Inline Text
-
-// --------------------------------
-
-a, .link {
- color: var(--color-primary, hsl(250, 84%, 54%));
- text-decoration: underline;
-}
-
-strong {
- font-weight: bold;
-}
-
-s {
- text-decoration: line-through;
-}
-
-u {
- text-decoration: underline;
-}
-
-// --------------------------------
-
-// Text Component - Class used to stylize text blocks
-
-// --------------------------------
-
-.text-component {
- h1, h2, h3, h4 {
- line-height: calc(var(--heading-line-height) * var(--line-height-multiplier, 1));
- margin-bottom: calc(var(--space-unit) * 0.3125 * var(--text-space-y-multiplier, 1));
- }
-
- h2, h3, h4 {
- margin-top: calc(var(--space-unit) * 0.9375 * var(--text-space-y-multiplier, 1));
- }
-
- p, blockquote, ul li, ol li {
- line-height: calc(var(--body-line-height) * var(--line-height-multiplier, 1));
- }
-
- ul, ol, p, blockquote, .text-component__block {
- margin-bottom: calc(var(--space-unit) * 0.9375 * var(--text-space-y-multiplier, 1));
- }
-
- ul, ol {
- list-style-position: inside;
-
- ul, ol {
- padding-left: 1em;
- margin-bottom: 0;
- }
- }
-
- ul {
- list-style-type: disc;
- }
-
- ol {
- list-style-type: decimal;
- }
-
- img {
- display: block;
- margin: 0 auto;
- }
-
- figcaption {
- text-align: center;
- margin-top: calc(var(--space-unit) * 0.5);
- }
-
- em {
- font-style: italic;
- }
-
- hr {
- margin-top: calc(var(--space-unit) * 1.875 * var(--text-space-y-multiplier, 1));
- margin-bottom: calc(var(--space-unit) * 1.875 * var(--text-space-y-multiplier, 1));
- margin-left: auto;
- margin-right: auto;
- }
-
- > *:first-child {
- margin-top: 0;
- }
-
- > *:last-child {
- margin-bottom: 0;
- }
-}
-
-// text block container
-.text-component__block--full-width {
- width: 100vw;
- margin-left: calc(50% - 50vw);
-}
-
-@include breakpoint(sm) {
- .text-component__block--left,
- .text-component__block--right {
- width: 45%;
-
- img {
- width: 100%;
- }
- }
-
- .text-component__block--left {
- float: left;
- margin-right: calc(var(--space-unit) * 0.9375 * var(--text-space-y-multiplier, 1));
- }
-
- .text-component__block--right {
- float: right;
- margin-left: calc(var(--space-unit) * 0.9375 * var(--text-space-y-multiplier, 1));
- }
-}
-
-// outset content
-@include breakpoint(xl) {
- .text-component__block--outset {
- width: calc(100% + 10.5 * var(--space-unit));
-
- img {
- width: 100%;
- }
- }
-
- .text-component__block--outset:not(.text-component__block--right) {
- margin-left: calc(-5.25 * var(--space-unit));
- }
-
- .text-component__block--left, .text-component__block--right {
- width: 50%;
- }
-
- .text-component__block--right.text-component__block--outset {
- margin-right: calc(-5.25 * var(--space-unit));
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_util.scss b/apps/web-shared/src/styles/base/_util.scss
deleted file mode 100644
index c384c2c..0000000
--- a/apps/web-shared/src/styles/base/_util.scss
+++ /dev/null
@@ -1,1738 +0,0 @@
-@use 'mixins' as *;
-@use 'breakpoints' as *;
-
-// --------------------------------
-
-// Flexbox
-
-// --------------------------------
-
-.flex { display: flex; }
-.inline-flex { display: inline-flex; }
-.flex-wrap { flex-wrap: wrap; }
-.flex-nowrap { flex-wrap: nowrap; }
-.flex-column { flex-direction: column; }
-.flex-column-reverse { flex-direction: column-reverse; }
-.flex-row { flex-direction: row; }
-.flex-row-reverse { flex-direction: row-reverse; }
-.flex-center { justify-content: center; align-items: center; }
-
-
-// flex items
-.flex-grow { flex-grow: 1; }
-.flex-grow-0 { flex-grow: 0; }
-.flex-shrink { flex-shrink: 1; }
-.flex-shrink-0 { flex-shrink: 0; }
-.flex-basis-0 { flex-basis: 0; }
-
-// --------------------------------
-
-// Justify Content
-
-// --------------------------------
-
-.justify-start { justify-content: flex-start; }
-.justify-end { justify-content: flex-end; }
-.justify-center { justify-content: center; }
-.justify-between { justify-content: space-between; }
-
-// --------------------------------
-
-// Align Items
-
-// --------------------------------
-
-.items-center { align-items: center; }
-.items-start { align-items: flex-start; }
-.items-end { align-items: flex-end; }
-.items-baseline { align-items: baseline; }
-
-// --------------------------------
-
-// Order
-
-// --------------------------------
-
-.order-1 { order: 1; }
-.order-2 { order: 2; }
-.order-3 { order: 3; }
-
-// --------------------------------
-
-// Aspect Ratio
-
-// --------------------------------
-
-[class^="aspect-ratio"], [class*=" aspect-ratio"] {
- --aspect-ratio: calc(16/9);
- position: relative;
- height: 0;
- padding-bottom: calc(100%/(var(--aspect-ratio)));
-
- > * {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-
- &:not(iframe) {
- object-fit: cover;
- }
- }
-}
-
-.aspect-ratio-16\:9 { --aspect-ratio: calc(16/9); }
-.aspect-ratio-3\:2 { --aspect-ratio: calc(3/2); }
-.aspect-ratio-4\:3 { --aspect-ratio: calc(4/3); }
-.aspect-ratio-5\:4 { --aspect-ratio: calc(5/4); }
-.aspect-ratio-1\:1 { --aspect-ratio: calc(1/1); }
-.aspect-ratio-4\:5 { --aspect-ratio: calc(4/5); }
-.aspect-ratio-3\:4 { --aspect-ratio: calc(3/4); }
-.aspect-ratio-2\:3 { --aspect-ratio: calc(2/3); }
-.aspect-ratio-9\:16 { --aspect-ratio: calc(9/16); }
-
-// --------------------------------
-
-// Display
-
-// --------------------------------
-
-.block { display: block; }
-.inline-block { display: inline-block; }
-.inline { display: inline; }
-.contents { display: contents; }
-.hide { display: none; }
-
-// --------------------------------
-
-// Space unit
-
-// --------------------------------
-
-.space-unit-rem { --space-unit: 1rem; }
-.space-unit-em { --space-unit: 1em; }
-.space-unit-px { --space-unit: 16px; }
-
-// --------------------------------
-
-// Margin
-
-// --------------------------------
-
-.margin-xxxxs { margin: var(--space-xxxxs); }
-.margin-xxxs { margin: var(--space-xxxs); }
-.margin-xxs { margin: var(--space-xxs); }
-.margin-xs { margin: var(--space-xs); }
-.margin-sm { margin: var(--space-sm); }
-.margin-md { margin: var(--space-md); }
-.margin-lg { margin: var(--space-lg); }
-.margin-xl { margin: var(--space-xl); }
-.margin-xxl { margin: var(--space-xxl); }
-.margin-xxxl { margin: var(--space-xxxl); }
-.margin-xxxxl { margin: var(--space-xxxxl); }
-.margin-auto { margin: auto; }
-.margin-0 { margin: 0; }
-
-.margin-top-xxxxs { margin-top: var(--space-xxxxs); }
-.margin-top-xxxs { margin-top: var(--space-xxxs); }
-.margin-top-xxs { margin-top: var(--space-xxs); }
-.margin-top-xs { margin-top: var(--space-xs); }
-.margin-top-sm { margin-top: var(--space-sm); }
-.margin-top-md { margin-top: var(--space-md); }
-.margin-top-lg { margin-top: var(--space-lg); }
-.margin-top-xl { margin-top: var(--space-xl); }
-.margin-top-xxl { margin-top: var(--space-xxl); }
-.margin-top-xxxl { margin-top: var(--space-xxxl); }
-.margin-top-xxxxl { margin-top: var(--space-xxxxl); }
-.margin-top-auto { margin-top: auto; }
-.margin-top-0 { margin-top: 0; }
-
-.margin-bottom-xxxxs { margin-bottom: var(--space-xxxxs); }
-.margin-bottom-xxxs { margin-bottom: var(--space-xxxs); }
-.margin-bottom-xxs { margin-bottom: var(--space-xxs); }
-.margin-bottom-xs { margin-bottom: var(--space-xs); }
-.margin-bottom-sm { margin-bottom: var(--space-sm); }
-.margin-bottom-md { margin-bottom: var(--space-md); }
-.margin-bottom-lg { margin-bottom: var(--space-lg); }
-.margin-bottom-xl { margin-bottom: var(--space-xl); }
-.margin-bottom-xxl { margin-bottom: var(--space-xxl); }
-.margin-bottom-xxxl { margin-bottom: var(--space-xxxl); }
-.margin-bottom-xxxxl { margin-bottom: var(--space-xxxxl); }
-.margin-bottom-auto { margin-bottom: auto; }
-.margin-bottom-0 { margin-bottom: 0; }
-
-.margin-right-xxxxs { margin-right: var(--space-xxxxs); }
-.margin-right-xxxs { margin-right: var(--space-xxxs); }
-.margin-right-xxs { margin-right: var(--space-xxs); }
-.margin-right-xs { margin-right: var(--space-xs); }
-.margin-right-sm { margin-right: var(--space-sm); }
-.margin-right-md { margin-right: var(--space-md); }
-.margin-right-lg { margin-right: var(--space-lg); }
-.margin-right-xl { margin-right: var(--space-xl); }
-.margin-right-xxl { margin-right: var(--space-xxl); }
-.margin-right-xxxl { margin-right: var(--space-xxxl); }
-.margin-right-xxxxl { margin-right: var(--space-xxxxl); }
-.margin-right-auto { margin-right: auto; }
-.margin-right-0 { margin-right: 0; }
-
-.margin-left-xxxxs { margin-left: var(--space-xxxxs); }
-.margin-left-xxxs { margin-left: var(--space-xxxs); }
-.margin-left-xxs { margin-left: var(--space-xxs); }
-.margin-left-xs { margin-left: var(--space-xs); }
-.margin-left-sm { margin-left: var(--space-sm); }
-.margin-left-md { margin-left: var(--space-md); }
-.margin-left-lg { margin-left: var(--space-lg); }
-.margin-left-xl { margin-left: var(--space-xl); }
-.margin-left-xxl { margin-left: var(--space-xxl); }
-.margin-left-xxxl { margin-left: var(--space-xxxl); }
-.margin-left-xxxxl { margin-left: var(--space-xxxxl); }
-.margin-left-auto { margin-left: auto; }
-.margin-left-0 { margin-left: 0; }
-
-.margin-x-xxxxs { margin-left: var(--space-xxxxs); margin-right: var(--space-xxxxs); }
-.margin-x-xxxs { margin-left: var(--space-xxxs); margin-right: var(--space-xxxs); }
-.margin-x-xxs { margin-left: var(--space-xxs); margin-right: var(--space-xxs); }
-.margin-x-xs { margin-left: var(--space-xs); margin-right: var(--space-xs); }
-.margin-x-sm { margin-left: var(--space-sm); margin-right: var(--space-sm); }
-.margin-x-md { margin-left: var(--space-md); margin-right: var(--space-md); }
-.margin-x-lg { margin-left: var(--space-lg); margin-right: var(--space-lg); }
-.margin-x-xl { margin-left: var(--space-xl); margin-right: var(--space-xl); }
-.margin-x-xxl { margin-left: var(--space-xxl); margin-right: var(--space-xxl); }
-.margin-x-xxxl { margin-left: var(--space-xxxl); margin-right: var(--space-xxxl); }
-.margin-x-xxxxl { margin-left: var(--space-xxxxl); margin-right: var(--space-xxxxl); }
-.margin-x-auto { margin-left: auto; margin-right: auto; }
-.margin-x-0 { margin-left: 0; margin-right: 0; }
-
-.margin-y-xxxxs { margin-top: var(--space-xxxxs); margin-bottom: var(--space-xxxxs); }
-.margin-y-xxxs { margin-top: var(--space-xxxs); margin-bottom: var(--space-xxxs); }
-.margin-y-xxs { margin-top: var(--space-xxs); margin-bottom: var(--space-xxs); }
-.margin-y-xs { margin-top: var(--space-xs); margin-bottom: var(--space-xs); }
-.margin-y-sm { margin-top: var(--space-sm); margin-bottom: var(--space-sm); }
-.margin-y-md { margin-top: var(--space-md); margin-bottom: var(--space-md); }
-.margin-y-lg { margin-top: var(--space-lg); margin-bottom: var(--space-lg); }
-.margin-y-xl { margin-top: var(--space-xl); margin-bottom: var(--space-xl); }
-.margin-y-xxl { margin-top: var(--space-xxl); margin-bottom: var(--space-xxl); }
-.margin-y-xxxl { margin-top: var(--space-xxxl); margin-bottom: var(--space-xxxl); }
-.margin-y-xxxxl { margin-top: var(--space-xxxxl); margin-bottom: var(--space-xxxxl); }
-.margin-y-auto { margin-top: auto; margin-bottom: auto; }
-.margin-y-0 { margin-top: 0; margin-bottom: 0; }
-
-// --------------------------------
-
-// Padding
-
-// --------------------------------
-
-.padding-xxxxs { padding: var(--space-xxxxs); }
-.padding-xxxs { padding: var(--space-xxxs); }
-.padding-xxs { padding: var(--space-xxs); }
-.padding-xs { padding: var(--space-xs); }
-.padding-sm { padding: var(--space-sm); }
-.padding-md { padding: var(--space-md); }
-.padding-lg { padding: var(--space-lg); }
-.padding-xl { padding: var(--space-xl); }
-.padding-xxl { padding: var(--space-xxl); }
-.padding-xxxl { padding: var(--space-xxxl); }
-.padding-xxxxl { padding: var(--space-xxxxl); }
-.padding-0 { padding: 0; }
-.padding-component { padding: var(--component-padding); }
-
-.padding-top-xxxxs { padding-top: var(--space-xxxxs); }
-.padding-top-xxxs { padding-top: var(--space-xxxs); }
-.padding-top-xxs { padding-top: var(--space-xxs); }
-.padding-top-xs { padding-top: var(--space-xs); }
-.padding-top-sm { padding-top: var(--space-sm); }
-.padding-top-md { padding-top: var(--space-md); }
-.padding-top-lg { padding-top: var(--space-lg); }
-.padding-top-xl { padding-top: var(--space-xl); }
-.padding-top-xxl { padding-top: var(--space-xxl); }
-.padding-top-xxxl { padding-top: var(--space-xxxl); }
-.padding-top-xxxxl { padding-top: var(--space-xxxxl); }
-.padding-top-0 { padding-top: 0; }
-.padding-top-component { padding-top: var(--component-padding); }
-
-.padding-bottom-xxxxs { padding-bottom: var(--space-xxxxs); }
-.padding-bottom-xxxs { padding-bottom: var(--space-xxxs); }
-.padding-bottom-xxs { padding-bottom: var(--space-xxs); }
-.padding-bottom-xs { padding-bottom: var(--space-xs); }
-.padding-bottom-sm { padding-bottom: var(--space-sm); }
-.padding-bottom-md { padding-bottom: var(--space-md); }
-.padding-bottom-lg { padding-bottom: var(--space-lg); }
-.padding-bottom-xl { padding-bottom: var(--space-xl); }
-.padding-bottom-xxl { padding-bottom: var(--space-xxl); }
-.padding-bottom-xxxl { padding-bottom: var(--space-xxxl); }
-.padding-bottom-xxxxl { padding-bottom: var(--space-xxxxl); }
-.padding-bottom-0 { padding-bottom: 0; }
-.padding-bottom-component { padding-bottom: var(--component-padding); }
-
-.padding-right-xxxxs { padding-right: var(--space-xxxxs); }
-.padding-right-xxxs { padding-right: var(--space-xxxs); }
-.padding-right-xxs { padding-right: var(--space-xxs); }
-.padding-right-xs { padding-right: var(--space-xs); }
-.padding-right-sm { padding-right: var(--space-sm); }
-.padding-right-md { padding-right: var(--space-md); }
-.padding-right-lg { padding-right: var(--space-lg); }
-.padding-right-xl { padding-right: var(--space-xl); }
-.padding-right-xxl { padding-right: var(--space-xxl); }
-.padding-right-xxxl { padding-right: var(--space-xxxl); }
-.padding-right-xxxxl { padding-right: var(--space-xxxxl); }
-.padding-right-0 { padding-right: 0; }
-.padding-right-component { padding-right: var(--component-padding); }
-
-.padding-left-xxxxs { padding-left: var(--space-xxxxs); }
-.padding-left-xxxs { padding-left: var(--space-xxxs); }
-.padding-left-xxs { padding-left: var(--space-xxs); }
-.padding-left-xs { padding-left: var(--space-xs); }
-.padding-left-sm { padding-left: var(--space-sm); }
-.padding-left-md { padding-left: var(--space-md); }
-.padding-left-lg { padding-left: var(--space-lg); }
-.padding-left-xl { padding-left: var(--space-xl); }
-.padding-left-xxl { padding-left: var(--space-xxl); }
-.padding-left-xxxl { padding-left: var(--space-xxxl); }
-.padding-left-xxxxl { padding-left: var(--space-xxxxl); }
-.padding-left-0 { padding-left: 0; }
-.padding-left-component { padding-left: var(--component-padding); }
-
-.padding-x-xxxxs { padding-left: var(--space-xxxxs); padding-right: var(--space-xxxxs); }
-.padding-x-xxxs { padding-left: var(--space-xxxs); padding-right: var(--space-xxxs); }
-.padding-x-xxs { padding-left: var(--space-xxs); padding-right: var(--space-xxs); }
-.padding-x-xs { padding-left: var(--space-xs); padding-right: var(--space-xs); }
-.padding-x-sm { padding-left: var(--space-sm); padding-right: var(--space-sm); }
-.padding-x-md { padding-left: var(--space-md); padding-right: var(--space-md); }
-.padding-x-lg { padding-left: var(--space-lg); padding-right: var(--space-lg); }
-.padding-x-xl { padding-left: var(--space-xl); padding-right: var(--space-xl); }
-.padding-x-xxl { padding-left: var(--space-xxl); padding-right: var(--space-xxl); }
-.padding-x-xxxl { padding-left: var(--space-xxxl); padding-right: var(--space-xxxl); }
-.padding-x-xxxxl { padding-left: var(--space-xxxxl); padding-right: var(--space-xxxxl); }
-.padding-x-0 { padding-left: 0; padding-right: 0; }
-.padding-x-component { padding-left: var(--component-padding); padding-right: var(--component-padding); }
-
-.padding-y-xxxxs { padding-top: var(--space-xxxxs); padding-bottom: var(--space-xxxxs); }
-.padding-y-xxxs { padding-top: var(--space-xxxs); padding-bottom: var(--space-xxxs); }
-.padding-y-xxs { padding-top: var(--space-xxs); padding-bottom: var(--space-xxs); }
-.padding-y-xs { padding-top: var(--space-xs); padding-bottom: var(--space-xs); }
-.padding-y-sm { padding-top: var(--space-sm); padding-bottom: var(--space-sm); }
-.padding-y-md { padding-top: var(--space-md); padding-bottom: var(--space-md); }
-.padding-y-lg { padding-top: var(--space-lg); padding-bottom: var(--space-lg); }
-.padding-y-xl { padding-top: var(--space-xl); padding-bottom: var(--space-xl); }
-.padding-y-xxl { padding-top: var(--space-xxl); padding-bottom: var(--space-xxl); }
-.padding-y-xxxl { padding-top: var(--space-xxxl); padding-bottom: var(--space-xxxl); }
-.padding-y-xxxxl { padding-top: var(--space-xxxxl); padding-bottom: var(--space-xxxxl); }
-.padding-y-0 { padding-top: 0; padding-bottom: 0; }
-.padding-y-component { padding-top: var(--component-padding); padding-bottom: var(--component-padding); }
-
-// --------------------------------
-
-// Vertical Align
-
-// --------------------------------
-
-.align-baseline { vertical-align: baseline; }
-.align-top { vertical-align: top; }
-.align-middle { vertical-align: middle; }
-.align-bottom { vertical-align: bottom; }
-
-// --------------------------------
-
-// Typography
-
-// --------------------------------
-
-.truncate, .text-truncate { // truncate text if it exceeds its parent
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.text-replace { // replace text with bg img
- overflow: hidden;
- color: transparent;
- text-indent: 100%;
- white-space: nowrap;
-}
-
-.break-word {
- overflow-wrap: break-word;
- min-width: 0;
-}
-
-// --------------------------------
-
-// Font Size
-
-// --------------------------------
-
-.text-unit-rem, .text-unit-em, .text-unit-px {
- font-size: var(--text-unit);
-}
-
-.text-unit-rem { --text-unit: 1rem; }
-.text-unit-em { --text-unit: 1em; }
-.text-unit-px { --text-unit: 16px; }
-
-.text-xs { font-size: var(--text-xs, 0.6875rem); }
-.text-sm { font-size: var(--text-sm, 0.75rem); }
-.text-base { font-size: var(--text-unit, 1rem); }
-.text-md { font-size: var(--text-md, 1.125rem); }
-.text-lg { font-size: var(--text-lg, 1.375rem); }
-.text-xl { font-size: var(--text-xl, 1.75rem); }
-.text-xxl { font-size: var(--text-xxl, 2rem); }
-.text-xxxl { font-size: var(--text-xxxl, 2.5rem); }
-.text-xxxxl { font-size: var(--text-xxxxl, 3rem); }
-
-// --------------------------------
-
-// Text Transform
-
-// --------------------------------
-
-.text-uppercase { text-transform: uppercase; }
-.text-capitalize { text-transform: capitalize; }
-
-// --------------------------------
-
-// Letter Spacing
-
-// --------------------------------
-
-.letter-spacing-xs { letter-spacing: -0.1em; }
-.letter-spacing-sm { letter-spacing: -0.05em; }
-.letter-spacing-md { letter-spacing: 0.05em; }
-.letter-spacing-lg { letter-spacing: 0.1em; }
-.letter-spacing-xl { letter-spacing: 0.2em; }
-
-// --------------------------------
-
-// Font Weight
-
-// --------------------------------
-
-.font-light { font-weight: 300; }
-.font-normal { font-weight: 400; }
-.font-medium { font-weight: 500; }
-.font-semibold { font-weight: 600; }
-.font-bold, .text-bold { font-weight: 700; }
-
-// --------------------------------
-
-// Font Style
-
-// --------------------------------
-
-.font-italic { font-style: italic; }
-
-// --------------------------------
-
-// Font Smooth
-
-// --------------------------------
-
-.font-smooth {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-// --------------------------------
-
-// Font Family
-
-// --------------------------------
-
-.font-primary { font-family: var(--font-primary); }
-
-// --------------------------------
-
-// Text Align
-
-// --------------------------------
-
-.text-center { text-align: center; }
-.text-left { text-align: left; }
-.text-right { text-align: right; }
-.text-justify { text-align: justify; }
-
-// --------------------------------
-
-// Text Decoration
-
-// --------------------------------
-
-.text-line-through { text-decoration: line-through; }
-.text-underline { text-decoration: underline; }
-.text-decoration-none { text-decoration: none; }
-
-// --------------------------------
-
-// Text Shadow
-
-// --------------------------------
-
-.text-shadow-xs { text-shadow: 0 1px 1px rgba(#000, 0.15); }
-.text-shadow-sm { text-shadow: 0 1px 2px rgba(#000, 0.25); }
-.text-shadow-md { text-shadow: 0 1px 2px rgba(#000, 0.1), 0 2px 4px rgba(#000, 0.2); }
-.text-shadow-lg { text-shadow: 0 1px 4px rgba(#000, 0.1), 0 2px 8px rgba(#000, 0.15), 0 4px 16px rgba(#000, 0.2); }
-.text-shadow-xl { text-shadow: 0 1px 4px rgba(#000, 0.1), 0 2px 8px rgba(#000, 0.15), 0 4px 16px rgba(#000, 0.2), 0 6px 24px rgba(#000, 0.25); }
-.text-shadow-none { text-shadow: none; }
-
-// --------------------------------
-
-// .text-component vertical spacing
-
-// --------------------------------
-
-.text-space-y-xxs { --text-space-y-multiplier: 0.25 !important; }
-.text-space-y-xs { --text-space-y-multiplier: 0.5 !important; }
-.text-space-y-sm { --text-space-y-multiplier: 0.75 !important; }
-.text-space-y-md { --text-space-y-multiplier: 1.25 !important; }
-.text-space-y-lg { --text-space-y-multiplier: 1.5 !important; }
-.text-space-y-xl { --text-space-y-multiplier: 1.75 !important; }
-.text-space-y-xxl { --text-space-y-multiplier: 2 !important; }
-
-// --------------------------------
-
-// Line Height
-
-// --------------------------------
-
-.line-height-xs {
- --heading-line-height: 1;
- --body-line-height: 1.1;
-
- &:not(.text-component) {
- line-height: 1.1;
- }
-}
-
-.line-height-sm {
- --heading-line-height: 1.1;
- --body-line-height: 1.2;
-
- &:not(.text-component) {
- line-height: 1.2;
- }
-}
-
-.line-height-md {
- --heading-line-height: 1.15;
- --body-line-height: 1.4;
-
- &:not(.text-component) {
- line-height: 1.4;
- }
-}
-
-.line-height-lg {
- --heading-line-height: 1.22;
- --body-line-height: 1.58;
-
- &:not(.text-component) {
- line-height: 1.58;
- }
-}
-
-.line-height-xl {
- --heading-line-height: 1.3;
- --body-line-height: 1.72;
-
- &:not(.text-component) {
- line-height: 1.72;
- }
-}
-
-.line-height-body { line-height: var(--body-line-height); }
-.line-height-heading { line-height: var(--heading-line-height); }
-.line-height-normal { line-height: normal !important; }
-.line-height-1 { line-height: 1 !important; }
-
-// --------------------------------
-
-// White Space
-
-// --------------------------------
-
-.ws-nowrap, .text-nowrap { white-space: nowrap; }
-
-// --------------------------------
-
-// Cursor
-
-// --------------------------------
-
-.cursor-pointer { cursor: pointer; }
-.cursor-default { cursor: default; }
-
-// --------------------------------
-
-// Pointer Events
-
-// --------------------------------
-
-.pointer-events-auto { pointer-events: auto; }
-.pointer-events-none { pointer-events: none; }
-
-// --------------------------------
-
-// User Select
-
-// --------------------------------
-
-.user-select-none { user-select: none; }
-.user-select-all { user-select: all; }
-
-// --------------------------------
-
-// Color
-
-// --------------------------------
-
-[class^="color-"], [class*=" color-"] { --color-o: 1; }
-
-.color-inherit { color: inherit; }
-
-.color-bg-darker { color: alpha(var(--color-bg-darker), var(--color-o, 1)); }
-.color-bg-dark { color: alpha(var(--color-bg-dark), var(--color-o, 1)); }
-.color-bg { color: alpha(var(--color-bg), var(--color-o, 1)); }
-.color-bg-light { color: alpha(var(--color-bg-light), var(--color-o, 1)); }
-.color-bg-lighter { color: alpha(var(--color-bg-lighter), var(--color-o, 1)); }
-
-.color-contrast-lower { color: alpha(var(--color-contrast-lower), var(--color-o, 1)); }
-.color-contrast-low { color: alpha(var(--color-contrast-low), var(--color-o, 1)); }
-.color-contrast-medium { color: alpha(var(--color-contrast-medium), var(--color-o, 1)); }
-.color-contrast-high { color: alpha(var(--color-contrast-high), var(--color-o, 1)); }
-.color-contrast-higher { color: alpha(var(--color-contrast-higher), var(--color-o, 1)); }
-
-.color-primary-darker { color: alpha(var(--color-primary-darker), var(--color-o, 1)); }
-.color-primary-dark { color: alpha(var(--color-primary-dark), var(--color-o, 1)); }
-.color-primary { color: alpha(var(--color-primary), var(--color-o, 1)); }
-.color-primary-light { color: alpha(var(--color-primary-light), var(--color-o, 1)); }
-.color-primary-lighter { color: alpha(var(--color-primary-lighter), var(--color-o, 1)); }
-
-.color-accent-darker { color: alpha(var(--color-accent-darker), var(--color-o, 1)); }
-.color-accent-dark { color: alpha(var(--color-accent-dark), var(--color-o, 1)); }
-.color-accent { color: alpha(var(--color-accent), var(--color-o, 1)); }
-.color-accent-light { color: alpha(var(--color-accent-light), var(--color-o, 1)); }
-.color-accent-lighter { color: alpha(var(--color-accent-lighter), var(--color-o, 1)); }
-
-.color-success-darker { color: alpha(var(--color-success-darker), var(--color-o, 1)); }
-.color-success-dark { color: alpha(var(--color-success-dark), var(--color-o, 1)); }
-.color-success { color: alpha(var(--color-success), var(--color-o, 1)); }
-.color-success-light { color: alpha(var(--color-success-light), var(--color-o, 1)); }
-.color-success-lighter { color: alpha(var(--color-success-lighter), var(--color-o, 1)); }
-
-.color-warning-darker { color: alpha(var(--color-warning-darker), var(--color-o, 1)); }
-.color-warning-dark { color: alpha(var(--color-warning-dark), var(--color-o, 1)); }
-.color-warning { color: alpha(var(--color-warning), var(--color-o, 1)); }
-.color-warning-light { color: alpha(var(--color-warning-light), var(--color-o, 1)); }
-.color-warning-lighter { color: alpha(var(--color-warning-lighter), var(--color-o, 1)); }
-
-.color-error-darker { color: alpha(var(--color-error-darker), var(--color-o, 1)); }
-.color-error-dark { color: alpha(var(--color-error-dark), var(--color-o, 1)); }
-.color-error { color: alpha(var(--color-error), var(--color-o, 1)); }
-.color-error-light { color: alpha(var(--color-error-light), var(--color-o, 1)); }
-.color-error-lighter { color: alpha(var(--color-error-lighter), var(--color-o, 1)); }
-
-.color-white { color: alpha(var(--color-white), var(--color-o, 1)); }
-.color-black { color: alpha(var(--color-black), var(--color-o, 1)); }
-
-.color-opacity-0 { --color-o: 0; }
-.color-opacity-10\% { --color-o: 0.1; }
-.color-opacity-20\% { --color-o: 0.2; }
-.color-opacity-30\% { --color-o: 0.3; }
-.color-opacity-40\% { --color-o: 0.4; }
-.color-opacity-50\% { --color-o: 0.5; }
-.color-opacity-60\% { --color-o: 0.6; }
-.color-opacity-70\% { --color-o: 0.7; }
-.color-opacity-80\% { --color-o: 0.8; }
-.color-opacity-90\% { --color-o: 0.9; }
-
-// --------------------------------
-
-// Gradients
-
-// --------------------------------
-
-[class^="color-gradient"], [class*=" color-gradient"] {
- color: transparent !important;
- background-clip: text;
-}
-
-// --------------------------------
-
-// Width
-
-// --------------------------------
-
-.width-xxxxs { width: var(--size-xxxxs, 0.25rem); }
-.width-xxxs { width: var(--size-xxxs, 0.5rem); }
-.width-xxs { width: var(--size-xxs, 0.75rem); }
-.width-xs { width: var(--size-xs, 1rem); }
-.width-sm { width: var(--size-sm, 1.5rem); }
-.width-md { width: var(--size-md, 2rem); }
-.width-lg { width: var(--size-lg, 3rem); }
-.width-xl { width: var(--size-xl, 4rem); }
-.width-xxl { width: var(--size-xxl, 6rem); }
-.width-xxxl { width: var(--size-xxxl, 8rem); }
-.width-xxxxl { width: var(--size-xxxxl, 16rem); }
-.width-0 { width: 0; }
-.width-10\% { width: 10%; }
-.width-20\% { width: 20%; }
-.width-25\% { width: 25%; }
-.width-30\% { width: 30%; }
-.width-33\% { width: calc(100% / 3); }
-.width-40\% { width: 40%; }
-.width-50\% { width: 50%; }
-.width-60\% { width: 60%; }
-.width-66\% { width: calc(100% / 1.5); }
-.width-70\% { width: 70%; }
-.width-75\% { width: 75%; }
-.width-80\% { width: 80%; }
-.width-90\% { width: 90%; }
-.width-100\% { width: 100%; }
-.width-100vw { width: 100vw; }
-.width-auto { width: auto; }
-.width-fit-content { width: fit-content; }
-.width-max-content { width: max-content; }
-
-// --------------------------------
-
-// Height
-
-// --------------------------------
-
-.height-xxxxs { height: var(--size-xxxxs, 0.25rem); }
-.height-xxxs { height: var(--size-xxxs, 0.5rem); }
-.height-xxs { height: var(--size-xxs, 0.75rem); }
-.height-xs { height: var(--size-xs, 1rem); }
-.height-sm { height: var(--size-sm, 1.5rem); }
-.height-md { height: var(--size-md, 2rem); }
-.height-lg { height: var(--size-lg, 3rem); }
-.height-xl { height: var(--size-xl, 4rem); }
-.height-xxl { height: var(--size-xxl, 6rem); }
-.height-xxxl { height: var(--size-xxxl, 8rem); }
-.height-xxxxl { height: var(--size-xxxxl, 16rem); }
-.height-0 { height: 0; }
-.height-10\% { height: 10%; }
-.height-20\% { height: 20%; }
-.height-25\% { height: 25%; }
-.height-30\% { height: 30%; }
-.height-33\% { height: calc(100% / 3); }
-.height-40\% { height: 40%; }
-.height-50\% { height: 50%; }
-.height-60\% { height: 60%; }
-.height-66\% { height: calc(100% / 1.5); }
-.height-70\% { height: 70%; }
-.height-75\% { height: 75%; }
-.height-80\% { height: 80%; }
-.height-90\% { height: 90%; }
-.height-100\% { height: 100%; }
-.height-100vh { height: 100vh; }
-.height-auto { height: auto; }
-.height-fit-content { height: fit-content; }
-.height-max-content { height: max-content; }
-
-// --------------------------------
-
-// Min-Width
-
-// --------------------------------
-
-.min-width-0 { min-width: 0; }
-.min-width-25\% { min-width: 25%; }
-.min-width-33\% { min-width: calc(100% / 3); }
-.min-width-50\% { min-width: 50%; }
-.min-width-66\% { min-width: calc(100% / 1.5); }
-.min-width-75\% { min-width: 75%; }
-.min-width-100\% { min-width: 100%; }
-.min-width-100vw { min-width: 100vw; }
-.min-width-fit-content { min-width: fit-content; }
-.min-width-max-content { min-width: max-content; }
-
-// --------------------------------
-
-// Min-Height
-
-// --------------------------------
-
-.min-height-100\% { min-height: 100%; }
-.min-height-100vh { min-height: 100vh; }
-.min-height-fit-content { min-height: fit-content; }
-.min-height-max-content { min-height: max-content; }
-
-// --------------------------------
-
-// Max-Width
-
-// --------------------------------
-
-:root {
- --max-width-xxxxs: 20rem; // ~320px
- --max-width-xxxs: 26rem; // ~416px
- --max-width-xxs: 32rem; // ~512px
- --max-width-xs: 38rem; // ~608px
- --max-width-sm: 48rem; // ~768px
- --max-width-md: 64rem; // ~1024px
- --max-width-lg: 80rem; // ~1280px
- --max-width-xl: 90rem; // ~1440px
- --max-width-xxl: 100rem; // ~1600px
- --max-width-xxxl: 120rem; // ~1920px
- --max-width-xxxxl: 150rem; // ~2400px
-}
-
-.max-width-xxxxs { max-width: var(--max-width-xxxxs); }
-.max-width-xxxs { max-width: var(--max-width-xxxs); }
-.max-width-xxs { max-width: var(--max-width-xxs); }
-.max-width-xs { max-width: var(--max-width-xs); }
-.max-width-sm { max-width: var(--max-width-sm); }
-.max-width-md { max-width: var(--max-width-md); }
-.max-width-lg { max-width: var(--max-width-lg); }
-.max-width-xl { max-width: var(--max-width-xl); }
-.max-width-xxl { max-width: var(--max-width-xxl); }
-.max-width-xxxl { max-width: var(--max-width-xxxl); }
-.max-width-xxxxl { max-width: var(--max-width-xxxxl); }
-.max-width-100\% { max-width: 100%; }
-.max-width-none { max-width: none; }
-.max-width-fit-content { max-width: fit-content; }
-.max-width-max-content { max-width: max-content; }
-
-// alt approach - max-width is equal to current breakpoint
-$breakpointsNr: length($breakpoints);
-@each $breakpoint, $value in $breakpoints {
- $i: index($breakpoints, $breakpoint $value);
- @if $i == 1 {
- [class^="max-width-adaptive"], [class*=" max-width-adaptive"] {
- max-width: map-get($map: $breakpoints, $key: #{$breakpoint});
- }
- } @else {
- $classList : '';
- @each $subBreakpoint, $subValue in $breakpoints {
- $j: index($breakpoints, $subBreakpoint $subValue);
- @if $j == $i {
- $classList: '.max-width-adaptive-#{$subBreakpoint}';
- } @else if $j > $i {
- $classList: $classList+', .max-width-adaptive-#{$subBreakpoint}';
- }
- }
- @if $i < $breakpointsNr {
- $classList: $classList+', .max-width-adaptive';
- }
- @include breakpoint(#{$breakpoint}) {
- #{$classList} {
- max-width: map-get($map: $breakpoints, $key: #{$breakpoint});
- }
- }
- }
-}
-
-// --------------------------------
-
-// Max-Height
-
-// --------------------------------
-
-.max-height-100\% { max-height: 100%; }
-.max-height-100vh { max-height: 100vh; }
-
-// --------------------------------
-
-// Box-Shadow
-
-// --------------------------------
-
-.shadow-xs { box-shadow: var(--shadow-xs); }
-.shadow-sm { box-shadow: var(--shadow-sm); }
-.shadow-md { box-shadow: var(--shadow-md); }
-.shadow-lg { box-shadow: var(--shadow-lg); }
-.shadow-xl { box-shadow: var(--shadow-xl); }
-.shadow-none { box-shadow: none; }
-
-:root {
- --inner-glow: inset 0 0 0.5px 1px hsla(0, 0%, 100%, 0.075);
- --inner-glow-top: inset 0 1px 0.5px hsla(0, 0%, 100%, 0.075);
-}
-
-.inner-glow, .inner-glow-top {
- position: relative;
-
- &::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border-radius: inherit;
- pointer-events: none;
- }
-}
-
-.inner-glow::after { box-shadow: var(--inner-glow); }
-.inner-glow-top::after { box-shadow: var(--inner-glow-top); }
-
-// --------------------------------
-
-// Position
-
-// --------------------------------
-
-.position-relative { position: relative; }
-.position-absolute { position: absolute; }
-.position-fixed { position: fixed; }
-.position-sticky { position: sticky; }
-
-.inset-0 { top: 0; right: 0; bottom: 0; left: 0; }
-
-.top-0 { top: 0; }
-.top-50\% { top: 50%; }
-.top-xxxxs { top: var(--space-xxxxs); }
-.top-xxxs { top: var(--space-xxxs); }
-.top-xxs { top: var(--space-xxs); }
-.top-xs { top: var(--space-xs); }
-.top-sm { top: var(--space-sm); }
-.top-md { top: var(--space-md); }
-.top-lg { top: var(--space-lg); }
-.top-xl { top: var(--space-xl); }
-.top-xxl { top: var(--space-xxl); }
-.top-xxxl { top: var(--space-xxxl); }
-.top-xxxxl { top: var(--space-xxxxl); }
-
-.bottom-0 { bottom: 0; }
-.bottom-unset { bottom: unset; }
-.bottom-50\% { bottom: 50%; }
-.bottom-xxxxs { bottom: var(--space-xxxxs); }
-.bottom-xxxs { bottom: var(--space-xxxs); }
-.bottom-xxs { bottom: var(--space-xxs); }
-.bottom-xs { bottom: var(--space-xs); }
-.bottom-sm { bottom: var(--space-sm); }
-.bottom-md { bottom: var(--space-md); }
-.bottom-lg { bottom: var(--space-lg); }
-.bottom-xl { bottom: var(--space-xl); }
-.bottom-xxl { bottom: var(--space-xxl); }
-.bottom-xxxl { bottom: var(--space-xxxl); }
-.bottom-xxxxl { bottom: var(--space-xxxxl); }
-
-.right-0 { right: 0; }
-.right-50\% { right: 50%; }
-.right-xxxxs { right: var(--space-xxxxs); }
-.right-xxxs { right: var(--space-xxxs); }
-.right-xxs { right: var(--space-xxs); }
-.right-xs { right: var(--space-xs); }
-.right-sm { right: var(--space-sm); }
-.right-md { right: var(--space-md); }
-.right-lg { right: var(--space-lg); }
-.right-xl { right: var(--space-xl); }
-.right-xxl { right: var(--space-xxl); }
-.right-xxxl { right: var(--space-xxxl); }
-.right-xxxxl { right: var(--space-xxxxl); }
-
-.left-0 { left: 0; }
-.left-50\% { left: 50%; }
-.left-xxxxs { left: var(--space-xxxxs); }
-.left-xxxs { left: var(--space-xxxs); }
-.left-xxs { left: var(--space-xxs); }
-.left-xs { left: var(--space-xs); }
-.left-sm { left: var(--space-sm); }
-.left-md { left: var(--space-md); }
-.left-lg { left: var(--space-lg); }
-.left-xl { left: var(--space-xl); }
-.left-xxl { left: var(--space-xxl); }
-.left-xxxl { left: var(--space-xxxl); }
-.left-xxxxl { left: var(--space-xxxxl); }
-
-// --------------------------------
-
-// Z-Index
-
-// --------------------------------
-
-.z-index-header { z-index: var(--z-index-header); }
-.z-index-popover { z-index: var(--z-index-popover); }
-.z-index-fixed-element { z-index: var(--z-index-fixed-element); }
-.z-index-overlay { z-index: var(--z-index-overlay); }
-
-.z-index-1 { z-index: 1; }
-.z-index-2 { z-index: 2; }
-.z-index-3 { z-index: 3; }
-
-// --------------------------------
-
-// Overflow
-
-// --------------------------------
-
-.overflow-hidden { overflow: hidden; }
-.overflow-auto { overflow: auto; }
-.momentum-scrolling { -webkit-overflow-scrolling: touch; }
-
-// overscroll-behavior
-.overscroll-contain { overscroll-behavior: contain; }
-
-// --------------------------------
-
-// Scroll Behavior
-
-// --------------------------------
-
-.scroll-smooth { scroll-behavior: smooth; }
-
-.scroll-padding-xxxxs { scroll-padding: var(--space-xxxxs); }
-.scroll-padding-xxxs { scroll-padding: var(--space-xxxs); }
-.scroll-padding-xxs { scroll-padding: var(--space-xxs); }
-.scroll-padding-xs { scroll-padding: var(--space-xs); }
-.scroll-padding-sm { scroll-padding: var(--space-sm); }
-.scroll-padding-md { scroll-padding: var(--space-md); }
-.scroll-padding-lg { scroll-padding: var(--space-lg); }
-.scroll-padding-xl { scroll-padding: var(--space-xl); }
-.scroll-padding-xxl { scroll-padding: var(--space-xxl); }
-.scroll-padding-xxxl { scroll-padding: var(--space-xxxl); }
-.scroll-padding-xxxxl { scroll-padding: var(--space-xxxxl); }
-
-
-// --------------------------------
-
-// Opacity
-
-// --------------------------------
-
-.opacity-0 { opacity: 0; }
-.opacity-10\% { opacity: 0.1; }
-.opacity-20\% { opacity: 0.2; }
-.opacity-30\% { opacity: 0.3; }
-.opacity-40\% { opacity: 0.4; }
-.opacity-50\% { opacity: 0.5; }
-.opacity-60\% { opacity: 0.6; }
-.opacity-70\% { opacity: 0.7; }
-.opacity-80\% { opacity: 0.8; }
-.opacity-90\% { opacity: 0.9; }
-
-// --------------------------------
-
-// Float
-
-// --------------------------------
-
-.float-left { float: left; }
-.float-right { float: right; }
-
-.clearfix::after {
- content: "";
- display: table;
- clear: both;
-}
-
-// --------------------------------
-
-// Border
-
-// --------------------------------
-
-[class^="border-"], [class*=" border-"] {
- --border-o: 1;
-}
-
-.border { border: var(--border-width, 1px) var(--border-style, solid) alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-.border-top { border-top: var(--border-width, 1px) var(--border-style, solid) alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-.border-bottom { border-bottom: var(--border-width, 1px) var(--border-style, solid) alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-.border-left { border-left: var(--border-width, 1px) var(--border-style, solid) alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-.border-right { border-right: var(--border-width, 1px) var(--border-style, solid) alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-
-.border-2 { --border-width: 2px; }
-.border-3 { --border-width: 3px; }
-.border-4 { --border-width: 4px; }
-.border-dotted { --border-style: dotted; }
-.border-dashed { --border-style: dashed; }
-
-.border-bg-darker { border-color: alpha(var(--color-bg-darker), var(--border-o, 1)); }
-.border-bg-dark { border-color: alpha(var(--color-bg-dark), var(--border-o, 1)); }
-.border-bg { border-color: alpha(var(--color-bg), var(--border-o, 1)); }
-.border-bg-light { border-color: alpha(var(--color-bg-light), var(--border-o, 1)); }
-.border-bg-lighter { border-color: alpha(var(--color-bg-lighter), var(--border-o, 1)); }
-
-.border-contrast-lower { border-color: alpha(var(--color-contrast-lower), var(--border-o, 1)); }
-.border-contrast-low { border-color: alpha(var(--color-contrast-low), var(--border-o, 1)); }
-.border-contrast-medium { border-color: alpha(var(--color-contrast-medium), var(--border-o, 1)); }
-.border-contrast-high { border-color: alpha(var(--color-contrast-high), var(--border-o, 1)); }
-.border-contrast-higher { border-color: alpha(var(--color-contrast-higher), var(--border-o, 1)); }
-
-.border-primary-darker { border-color: alpha(var(--color-primary-darker), var(--border-o, 1)); }
-.border-primary-dark { border-color: alpha(var(--color-primary-dark), var(--border-o, 1)); }
-.border-primary { border-color: alpha(var(--color-primary), var(--border-o, 1)); }
-.border-primary-light { border-color: alpha(var(--color-primary-light), var(--border-o, 1)); }
-.border-primary-lighter { border-color: alpha(var(--color-primary-lighter), var(--border-o, 1)); }
-
-.border-accent-darker { border-color: alpha(var(--color-accent-darker), var(--border-o, 1)); }
-.border-accent-dark { border-color: alpha(var(--color-accent-dark), var(--border-o, 1)); }
-.border-accent { border-color: alpha(var(--color-accent), var(--border-o, 1)); }
-.border-accent-light { border-color: alpha(var(--color-accent-light), var(--border-o, 1)); }
-.border-accent-lighter { border-color: alpha(var(--color-accent-lighter), var(--border-o, 1)); }
-
-.border-success-darker { border-color: alpha(var(--color-success-darker), var(--border-o, 1)); }
-.border-success-dark { border-color: alpha(var(--color-success-dark), var(--border-o, 1)); }
-.border-success { border-color: alpha(var(--color-success), var(--border-o, 1)); }
-.border-success-light { border-color: alpha(var(--color-success-light), var(--border-o, 1)); }
-.border-success-lighter { border-color: alpha(var(--color-success-lighter), var(--border-o, 1)); }
-
-.border-warning-darker { border-color: alpha(var(--color-warning-darker), var(--border-o, 1)); }
-.border-warning-dark { border-color: alpha(var(--color-warning-dark), var(--border-o, 1)); }
-.border-warning { border-color: alpha(var(--color-warning), var(--border-o, 1)); }
-.border-warning-light { border-color: alpha(var(--color-warning-light), var(--border-o, 1)); }
-.border-warning-lighter { border-color: alpha(var(--color-warning-lighter), var(--border-o, 1)); }
-
-.border-error-darker { border-color: alpha(var(--color-error-darker), var(--border-o, 1)); }
-.border-error-dark { border-color: alpha(var(--color-error-dark), var(--border-o, 1)); }
-.border-error { border-color: alpha(var(--color-error), var(--border-o, 1)); }
-.border-error-light { border-color: alpha(var(--color-error-light), var(--border-o, 1)); }
-.border-error-lighter { border-color: alpha(var(--color-error-lighter), var(--border-o, 1)); }
-
-.border-white { border-color: alpha(var(--color-white), var(--border-o, 1)); }
-.border-black { border-color: alpha(var(--color-black), var(--border-o, 1)); }
-
-.border-opacity-0 { --border-o: 0; }
-.border-opacity-10\% { --border-o: 0.1; }
-.border-opacity-20\% { --border-o: 0.2; }
-.border-opacity-30\% { --border-o: 0.3; }
-.border-opacity-40\% { --border-o: 0.4; }
-.border-opacity-50\% { --border-o: 0.5; }
-.border-opacity-60\% { --border-o: 0.6; }
-.border-opacity-70\% { --border-o: 0.7; }
-.border-opacity-80\% { --border-o: 0.8; }
-.border-opacity-90\% { --border-o: 0.9; }
-
-// --------------------------------
-
-// Border Radius
-
-// --------------------------------
-
-.radius-sm { border-radius: var(--radius-sm); }
-.radius-md { border-radius: var(--radius-md); }
-.radius-lg { border-radius: var(--radius-lg); }
-.radius-50\% { border-radius: 50%; }
-.radius-full { border-radius: 50em; }
-.radius-0 { border-radius: 0; }
-.radius-inherit { border-radius: inherit; }
-.radius-top-left-0 { border-top-left-radius: 0; }
-.radius-top-right-0 { border-top-right-radius: 0; }
-.radius-bottom-right-0 { border-bottom-right-radius: 0; }
-.radius-bottom-left-0 { border-bottom-left-radius: 0; }
-
-// --------------------------------
-
-// Background
-
-// --------------------------------
-
-.bg, [class^="bg-"], [class*=" bg-"] { --bg-o: 1; }
-
-.bg-transparent { background-color: transparent; }
-.bg-inherit { background-color: inherit; }
-
-.bg-darker { background-color: alpha(var(--color-bg-darker), var(--bg-o)); }
-.bg-dark { background-color: alpha(var(--color-bg-dark), var(--bg-o)); }
-.bg { background-color: alpha(var(--color-bg), var(--bg-o)); }
-.bg-light { background-color: alpha(var(--color-bg-light), var(--bg-o)); }
-.bg-lighter { background-color: alpha(var(--color-bg-lighter), var(--bg-o)); }
-
-.bg-contrast-lower { background-color: alpha(var(--color-contrast-lower), var(--bg-o, 1)); }
-.bg-contrast-low { background-color: alpha(var(--color-contrast-low), var(--bg-o, 1)); }
-.bg-contrast-medium { background-color: alpha(var(--color-contrast-medium), var(--bg-o, 1)); }
-.bg-contrast-high { background-color: alpha(var(--color-contrast-high), var(--bg-o, 1)); }
-.bg-contrast-higher { background-color: alpha(var(--color-contrast-higher), var(--bg-o, 1)); }
-
-.bg-primary-darker { background-color: alpha(var(--color-primary-darker), var(--bg-o, 1)); }
-.bg-primary-dark { background-color: alpha(var(--color-primary-dark), var(--bg-o, 1)); }
-.bg-primary { background-color: alpha(var(--color-primary), var(--bg-o, 1)); }
-.bg-primary-light { background-color: alpha(var(--color-primary-light), var(--bg-o, 1)); }
-.bg-primary-lighter { background-color: alpha(var(--color-primary-lighter), var(--bg-o, 1)); }
-
-.bg-accent-darker { background-color: alpha(var(--color-accent-darker), var(--bg-o, 1)); }
-.bg-accent-dark { background-color: alpha(var(--color-accent-dark), var(--bg-o, 1)); }
-.bg-accent { background-color: alpha(var(--color-accent), var(--bg-o, 1)); }
-.bg-accent-light { background-color: alpha(var(--color-accent-light), var(--bg-o, 1)); }
-.bg-accent-lighter { background-color: alpha(var(--color-accent-lighter), var(--bg-o, 1)); }
-
-.bg-success-darker { background-color: alpha(var(--color-success-darker), var(--bg-o, 1)); }
-.bg-success-dark { background-color: alpha(var(--color-success-dark), var(--bg-o, 1)); }
-.bg-success { background-color: alpha(var(--color-success), var(--bg-o, 1)); }
-.bg-success-light { background-color: alpha(var(--color-success-light), var(--bg-o, 1)); }
-.bg-success-lighter { background-color: alpha(var(--color-success-lighter), var(--bg-o, 1)); }
-
-.bg-warning-darker { background-color: alpha(var(--color-warning-darker), var(--bg-o, 1)); }
-.bg-warning-dark { background-color: alpha(var(--color-warning-dark), var(--bg-o, 1)); }
-.bg-warning { background-color: alpha(var(--color-warning), var(--bg-o, 1)); }
-.bg-warning-light { background-color: alpha(var(--color-warning-light), var(--bg-o, 1)); }
-.bg-warning-lighter { background-color: alpha(var(--color-warning-lighter), var(--bg-o, 1)); }
-
-.bg-error-darker { background-color: alpha(var(--color-error-darker), var(--bg-o, 1)); }
-.bg-error-dark { background-color: alpha(var(--color-error-dark), var(--bg-o, 1)); }
-.bg-error { background-color: alpha(var(--color-error), var(--bg-o, 1)); }
-.bg-error-light { background-color: alpha(var(--color-error-light), var(--bg-o, 1)); }
-.bg-error-lighter { background-color: alpha(var(--color-error-lighter), var(--bg-o, 1)); }
-
-.bg-white { background-color: alpha(var(--color-white), var(--bg-o, 1)); }
-.bg-black { background-color: alpha(var(--color-black), var(--bg-o, 1)); }
-
-.bg-opacity-0 { --bg-o: 0; }
-.bg-opacity-10\% { --bg-o: 0.1; }
-.bg-opacity-20\% { --bg-o: 0.2; }
-.bg-opacity-30\% { --bg-o: 0.3; }
-.bg-opacity-40\% { --bg-o: 0.4; }
-.bg-opacity-50\% { --bg-o: 0.5; }
-.bg-opacity-60\% { --bg-o: 0.6; }
-.bg-opacity-70\% { --bg-o: 0.7; }
-.bg-opacity-80\% { --bg-o: 0.8; }
-.bg-opacity-90\% { --bg-o: 0.9; }
-
-.bg-center { background-position: center; }
-.bg-top { background-position: center top; }
-.bg-right { background-position: right center; }
-.bg-bottom { background-position: center bottom; }
-.bg-left { background-position: left center; }
-.bg-top-left { background-position: left top; }
-.bg-top-right { background-position: right top; }
-.bg-bottom-left { background-position: left bottom; }
-.bg-bottom-right { background-position: right bottom; }
-
-.bg-cover { background-size: cover; }
-.bg-no-repeat { background-repeat: no-repeat; }
-
-// --------------------------------
-
-// Backdrop Filter
-
-// --------------------------------
-
-.backdrop-blur-10 { backdrop-filter: blur(10px); }
-.backdrop-blur-20 { backdrop-filter: blur(20px); }
-
-// --------------------------------
-
-// Mix-Blend Mode
-
-// --------------------------------
-
-.isolate { isolation: isolate; }
-.blend-multiply { mix-blend-mode: multiply; }
-.blend-overlay { mix-blend-mode: overlay; }
-.blend-difference { mix-blend-mode: difference; }
-
-// --------------------------------
-
-// Object-Fit
-
-// --------------------------------
-
-.object-contain { object-fit: contain; }
-.object-cover { object-fit: cover; }
-
-// --------------------------------
-
-// Perspective
-
-// --------------------------------
-
-.perspective-xs { perspective: 250px; }
-.perspective-sm { perspective: 500px; }
-.perspective-md { perspective: 1000px; }
-.perspective-lg { perspective: 1500px; }
-.perspective-xl { perspective: 3000px; }
-
-// --------------------------------
-
-// Transform
-
-// --------------------------------
-
-[class^="flip"], [class*=" flip"],
-[class^="-rotate"], [class*=" -rotate"],
-[class^="rotate"], [class*=" rotate"],
-[class^="-translate"], [class*=" -translate"],
-[class^="translate"], [class*=" translate"],
-[class^="-scale"], [class*=" -scale"],
-[class^="scale"], [class*=" scale"],
-[class^="-skew"], [class*=" -skew"],
-[class^="skew"], [class*=" skew"] {
- --translate: 0;
- --rotate: 0;
- --skew: 0;
- --scale: 1;
-
- transform: translate3d(var(--translate-x, var(--translate)), var(--translate-y, var(--translate)), var(--translate-z, 0)) rotateX(var(--rotate-x, 0)) rotateY(var(--rotate-y, 0)) rotateZ(var(--rotate-z, var(--rotate))) skewX(var(--skew-x, var(--skew))) skewY(var(--skew-y, 0)) scaleX(var(--scale-x, var(--scale))) scaleY(var(--scale-y, var(--scale)));
-}
-
-.flip { --scale: -1; }
-.flip-x { --scale-x: -1; }
-.flip-y { --scale-y: -1; }
-
-.rotate-90 { --rotate: 90deg; }
-.rotate-180 { --rotate: 180deg; }
-.rotate-270 { --rotate: 270deg; }
-
-.-translate-50\% { --translate: -50%; }
-.-translate-x-50\% { --translate-x: -50%; }
-.-translate-y-50\% { --translate-y: -50%; }
-
-.translate-50\% { --translate: 50%; }
-.translate-x-50\% { --translate-x: 50%; }
-.translate-y-50\% { --translate-y: 50%; }
-
-// --------------------------------
-
-// Transform Origin
-
-// --------------------------------
-
-.origin-center { transform-origin: center; }
-.origin-top { transform-origin: center top; }
-.origin-right { transform-origin: right center; }
-.origin-bottom { transform-origin: center bottom; }
-.origin-left { transform-origin: left center; }
-.origin-top-left { transform-origin: left top; }
-.origin-top-right { transform-origin: right top; }
-.origin-bottom-left { transform-origin: left bottom; }
-.origin-bottom-right { transform-origin: right bottom; }
-
-// --------------------------------
-
-// SVG
-
-// --------------------------------
-
-.fill-current { fill: currentColor; }
-
-.stroke-current { stroke: currentColor; }
-
-.stroke-1 { stroke-width: 1px; }
-.stroke-2 { stroke-width: 2px; }
-.stroke-3 { stroke-width: 3px; }
-.stroke-4 { stroke-width: 4px; }
-
-// --------------------------------
-
-// Visibility
-
-// --------------------------------
-
-.visible { visibility: visible; }
-.invisible { visibility: hidden; }
-
-// --------------------------------
-
-// Responsive Variations
-
-// --------------------------------
-
-@each $breakpoint, $value in $breakpoints {
- @include breakpoint(#{$breakpoint}) {
- // flexbox
- .flex\@#{$breakpoint} { display: flex; }
- .inline-flex\@#{$breakpoint} { display: inline-flex; }
- .flex-wrap\@#{$breakpoint} { flex-wrap: wrap; }
- .flex-nowrap\@#{$breakpoint} { flex-wrap:nowrap; }
- .flex-column\@#{$breakpoint} { flex-direction: column; }
- .flex-column-reverse\@#{$breakpoint} { flex-direction: column-reverse; }
- .flex-row\@#{$breakpoint} { flex-direction: row; }
- .flex-row-reverse\@#{$breakpoint} { flex-direction: row-reverse; }
- .flex-center\@#{$breakpoint} { justify-content: center; align-items: center; }
-
- .flex-grow\@#{$breakpoint} { flex-grow: 1; }
- .flex-grow-0\@#{$breakpoint} { flex-grow: 0; }
- .flex-shrink\@#{$breakpoint} { flex-shrink: 1; }
- .flex-shrink-0\@#{$breakpoint} { flex-shrink: 0; }
- .flex-basis-0\@#{$breakpoint} { flex-basis: 0; }
-
- // justify-content
- .justify-start\@#{$breakpoint} { justify-content: flex-start; }
- .justify-end\@#{$breakpoint} { justify-content: flex-end; }
- .justify-center\@#{$breakpoint} { justify-content: center; }
- .justify-between\@#{$breakpoint} { justify-content: space-between; }
-
- // align-items
- .items-center\@#{$breakpoint} { align-items: center; }
- .items-start\@#{$breakpoint} { align-items: flex-start; }
- .items-end\@#{$breakpoint} { align-items: flex-end; }
- .items-baseline\@#{$breakpoint} { align-items: baseline; }
-
- // order
- .order-1\@#{$breakpoint} { order: 1; }
- .order-2\@#{$breakpoint} { order: 2; }
- .order-3\@#{$breakpoint} { order: 3; }
-
- // display
- .block\@#{$breakpoint} { display: block; }
- .inline-block\@#{$breakpoint} { display: inline-block; }
- .inline\@#{$breakpoint} { display: inline; }
- .contents\@#{$breakpoint} { display: contents; }
- .hide\@#{$breakpoint} { display: none !important; }
-
- // margin
- .margin-xxxxs\@#{$breakpoint} { margin: var(--space-xxxxs); }
- .margin-xxxs\@#{$breakpoint} { margin: var(--space-xxxs); }
- .margin-xxs\@#{$breakpoint} { margin: var(--space-xxs); }
- .margin-xs\@#{$breakpoint} { margin: var(--space-xs); }
- .margin-sm\@#{$breakpoint} { margin: var(--space-sm); }
- .margin-md\@#{$breakpoint} { margin: var(--space-md); }
- .margin-lg\@#{$breakpoint} { margin: var(--space-lg); }
- .margin-xl\@#{$breakpoint} { margin: var(--space-xl); }
- .margin-xxl\@#{$breakpoint} { margin: var(--space-xxl); }
- .margin-xxxl\@#{$breakpoint} { margin: var(--space-xxxl); }
- .margin-xxxxl\@#{$breakpoint} { margin: var(--space-xxxxl); }
- .margin-auto\@#{$breakpoint} { margin: auto; }
- .margin-0\@#{$breakpoint} { margin: 0; }
-
- .margin-top-xxxxs\@#{$breakpoint} { margin-top: var(--space-xxxxs); }
- .margin-top-xxxs\@#{$breakpoint} { margin-top: var(--space-xxxs); }
- .margin-top-xxs\@#{$breakpoint} { margin-top: var(--space-xxs); }
- .margin-top-xs\@#{$breakpoint} { margin-top: var(--space-xs); }
- .margin-top-sm\@#{$breakpoint} { margin-top: var(--space-sm); }
- .margin-top-md\@#{$breakpoint} { margin-top: var(--space-md); }
- .margin-top-lg\@#{$breakpoint} { margin-top: var(--space-lg); }
- .margin-top-xl\@#{$breakpoint} { margin-top: var(--space-xl); }
- .margin-top-xxl\@#{$breakpoint} { margin-top: var(--space-xxl); }
- .margin-top-xxxl\@#{$breakpoint} { margin-top: var(--space-xxxl); }
- .margin-top-xxxxl\@#{$breakpoint} { margin-top: var(--space-xxxxl); }
- .margin-top-auto\@#{$breakpoint} { margin-top: auto; }
- .margin-top-0\@#{$breakpoint} { margin-top: 0; }
-
- .margin-bottom-xxxxs\@#{$breakpoint} { margin-bottom: var(--space-xxxxs); }
- .margin-bottom-xxxs\@#{$breakpoint} { margin-bottom: var(--space-xxxs); }
- .margin-bottom-xxs\@#{$breakpoint} { margin-bottom: var(--space-xxs); }
- .margin-bottom-xs\@#{$breakpoint} { margin-bottom: var(--space-xs); }
- .margin-bottom-sm\@#{$breakpoint} { margin-bottom: var(--space-sm); }
- .margin-bottom-md\@#{$breakpoint} { margin-bottom: var(--space-md); }
- .margin-bottom-lg\@#{$breakpoint} { margin-bottom: var(--space-lg); }
- .margin-bottom-xl\@#{$breakpoint} { margin-bottom: var(--space-xl); }
- .margin-bottom-xxl\@#{$breakpoint} { margin-bottom: var(--space-xxl); }
- .margin-bottom-xxxl\@#{$breakpoint} { margin-bottom: var(--space-xxxl); }
- .margin-bottom-xxxxl\@#{$breakpoint} { margin-bottom: var(--space-xxxxl); }
- .margin-bottom-auto\@#{$breakpoint} { margin-bottom: auto; }
- .margin-bottom-0\@#{$breakpoint} { margin-bottom: 0; }
-
- .margin-right-xxxxs\@#{$breakpoint} { margin-right: var(--space-xxxxs); }
- .margin-right-xxxs\@#{$breakpoint} { margin-right: var(--space-xxxs); }
- .margin-right-xxs\@#{$breakpoint} { margin-right: var(--space-xxs); }
- .margin-right-xs\@#{$breakpoint} { margin-right: var(--space-xs); }
- .margin-right-sm\@#{$breakpoint} { margin-right: var(--space-sm); }
- .margin-right-md\@#{$breakpoint} { margin-right: var(--space-md); }
- .margin-right-lg\@#{$breakpoint} { margin-right: var(--space-lg); }
- .margin-right-xl\@#{$breakpoint} { margin-right: var(--space-xl); }
- .margin-right-xxl\@#{$breakpoint} { margin-right: var(--space-xxl); }
- .margin-right-xxxl\@#{$breakpoint} { margin-right: var(--space-xxxl); }
- .margin-right-xxxxl\@#{$breakpoint} { margin-right: var(--space-xxxxl); }
- .margin-right-auto\@#{$breakpoint} { margin-right: auto; }
- .margin-right-0\@#{$breakpoint} { margin-right: 0; }
-
- .margin-left-xxxxs\@#{$breakpoint} { margin-left: var(--space-xxxxs); }
- .margin-left-xxxs\@#{$breakpoint} { margin-left: var(--space-xxxs); }
- .margin-left-xxs\@#{$breakpoint} { margin-left: var(--space-xxs); }
- .margin-left-xs\@#{$breakpoint} { margin-left: var(--space-xs); }
- .margin-left-sm\@#{$breakpoint} { margin-left: var(--space-sm); }
- .margin-left-md\@#{$breakpoint} { margin-left: var(--space-md); }
- .margin-left-lg\@#{$breakpoint} { margin-left: var(--space-lg); }
- .margin-left-xl\@#{$breakpoint} { margin-left: var(--space-xl); }
- .margin-left-xxl\@#{$breakpoint} { margin-left: var(--space-xxl); }
- .margin-left-xxxl\@#{$breakpoint} { margin-left: var(--space-xxxl); }
- .margin-left-xxxxl\@#{$breakpoint} { margin-left: var(--space-xxxxl); }
- .margin-left-auto\@#{$breakpoint} { margin-left: auto; }
- .margin-left-0\@#{$breakpoint} { margin-left: 0; }
-
- .margin-x-xxxxs\@#{$breakpoint} { margin-left: var(--space-xxxxs); margin-right: var(--space-xxxxs); }
- .margin-x-xxxs\@#{$breakpoint} { margin-left: var(--space-xxxs); margin-right: var(--space-xxxs); }
- .margin-x-xxs\@#{$breakpoint} { margin-left: var(--space-xxs); margin-right: var(--space-xxs); }
- .margin-x-xs\@#{$breakpoint} { margin-left: var(--space-xs); margin-right: var(--space-xs); }
- .margin-x-sm\@#{$breakpoint} { margin-left: var(--space-sm); margin-right: var(--space-sm); }
- .margin-x-md\@#{$breakpoint} { margin-left: var(--space-md); margin-right: var(--space-md); }
- .margin-x-lg\@#{$breakpoint} { margin-left: var(--space-lg); margin-right: var(--space-lg); }
- .margin-x-xl\@#{$breakpoint} { margin-left: var(--space-xl); margin-right: var(--space-xl); }
- .margin-x-xxl\@#{$breakpoint} { margin-left: var(--space-xxl); margin-right: var(--space-xxl); }
- .margin-x-xxxl\@#{$breakpoint} { margin-left: var(--space-xxxl); margin-right: var(--space-xxxl); }
- .margin-x-xxxxl\@#{$breakpoint} { margin-left: var(--space-xxxxl); margin-right: var(--space-xxxxl); }
- .margin-x-auto\@#{$breakpoint} { margin-left: auto; margin-right: auto; }
- .margin-x-0\@#{$breakpoint} { margin-left: 0; margin-right: 0; }
-
- .margin-y-xxxxs\@#{$breakpoint} { margin-top: var(--space-xxxxs); margin-bottom: var(--space-xxxxs); }
- .margin-y-xxxs\@#{$breakpoint} { margin-top: var(--space-xxxs); margin-bottom: var(--space-xxxs); }
- .margin-y-xxs\@#{$breakpoint} { margin-top: var(--space-xxs); margin-bottom: var(--space-xxs); }
- .margin-y-xs\@#{$breakpoint} { margin-top: var(--space-xs); margin-bottom: var(--space-xs); }
- .margin-y-sm\@#{$breakpoint} { margin-top: var(--space-sm); margin-bottom: var(--space-sm); }
- .margin-y-md\@#{$breakpoint} { margin-top: var(--space-md); margin-bottom: var(--space-md); }
- .margin-y-lg\@#{$breakpoint} { margin-top: var(--space-lg); margin-bottom: var(--space-lg); }
- .margin-y-xl\@#{$breakpoint} { margin-top: var(--space-xl); margin-bottom: var(--space-xl); }
- .margin-y-xxl\@#{$breakpoint} { margin-top: var(--space-xxl); margin-bottom: var(--space-xxl); }
- .margin-y-xxxl\@#{$breakpoint} { margin-top: var(--space-xxxl); margin-bottom: var(--space-xxxl); }
- .margin-y-xxxxl\@#{$breakpoint} { margin-top: var(--space-xxxxl); margin-bottom: var(--space-xxxxl); }
- .margin-y-auto\@#{$breakpoint} { margin-top: auto; margin-bottom: auto; }
- .margin-y-0\@#{$breakpoint} { margin-top: 0; margin-bottom: 0; }
-
- // padding
- .padding-xxxxs\@#{$breakpoint} { padding: var(--space-xxxxs); }
- .padding-xxxs\@#{$breakpoint} { padding: var(--space-xxxs); }
- .padding-xxs\@#{$breakpoint} { padding: var(--space-xxs); }
- .padding-xs\@#{$breakpoint} { padding: var(--space-xs); }
- .padding-sm\@#{$breakpoint} { padding: var(--space-sm); }
- .padding-md\@#{$breakpoint} { padding: var(--space-md); }
- .padding-lg\@#{$breakpoint} { padding: var(--space-lg); }
- .padding-xl\@#{$breakpoint} { padding: var(--space-xl); }
- .padding-xxl\@#{$breakpoint} { padding: var(--space-xxl); }
- .padding-xxxl\@#{$breakpoint} { padding: var(--space-xxxl); }
- .padding-xxxxl\@#{$breakpoint} { padding: var(--space-xxxxl); }
- .padding-0\@#{$breakpoint} { padding: 0; }
- .padding-component\@#{$breakpoint} { padding: var(--component-padding); }
-
- .padding-top-xxxxs\@#{$breakpoint} { padding-top: var(--space-xxxxs); }
- .padding-top-xxxs\@#{$breakpoint} { padding-top: var(--space-xxxs); }
- .padding-top-xxs\@#{$breakpoint} { padding-top: var(--space-xxs); }
- .padding-top-xs\@#{$breakpoint} { padding-top: var(--space-xs); }
- .padding-top-sm\@#{$breakpoint} { padding-top: var(--space-sm); }
- .padding-top-md\@#{$breakpoint} { padding-top: var(--space-md); }
- .padding-top-lg\@#{$breakpoint} { padding-top: var(--space-lg); }
- .padding-top-xl\@#{$breakpoint} { padding-top: var(--space-xl); }
- .padding-top-xxl\@#{$breakpoint} { padding-top: var(--space-xxl); }
- .padding-top-xxxl\@#{$breakpoint} { padding-top: var(--space-xxxl); }
- .padding-top-xxxxl\@#{$breakpoint} { padding-top: var(--space-xxxxl); }
- .padding-top-0\@#{$breakpoint} { padding-top: 0; }
- .padding-top-component\@#{$breakpoint} { padding-top: var(--component-padding); }
-
- .padding-bottom-xxxxs\@#{$breakpoint} { padding-bottom: var(--space-xxxxs); }
- .padding-bottom-xxxs\@#{$breakpoint} { padding-bottom: var(--space-xxxs); }
- .padding-bottom-xxs\@#{$breakpoint} { padding-bottom: var(--space-xxs); }
- .padding-bottom-xs\@#{$breakpoint} { padding-bottom: var(--space-xs); }
- .padding-bottom-sm\@#{$breakpoint} { padding-bottom: var(--space-sm); }
- .padding-bottom-md\@#{$breakpoint} { padding-bottom: var(--space-md); }
- .padding-bottom-lg\@#{$breakpoint} { padding-bottom: var(--space-lg); }
- .padding-bottom-xl\@#{$breakpoint} { padding-bottom: var(--space-xl); }
- .padding-bottom-xxl\@#{$breakpoint} { padding-bottom: var(--space-xxl); }
- .padding-bottom-xxxl\@#{$breakpoint} { padding-bottom: var(--space-xxxl); }
- .padding-bottom-xxxxl\@#{$breakpoint} { padding-bottom: var(--space-xxxxl); }
- .padding-bottom-0\@#{$breakpoint} { padding-bottom: 0; }
- .padding-bottom-component\@#{$breakpoint} { padding-bottom: var(--component-padding); }
-
- .padding-right-xxxxs\@#{$breakpoint} { padding-right: var(--space-xxxxs); }
- .padding-right-xxxs\@#{$breakpoint} { padding-right: var(--space-xxxs); }
- .padding-right-xxs\@#{$breakpoint} { padding-right: var(--space-xxs); }
- .padding-right-xs\@#{$breakpoint} { padding-right: var(--space-xs); }
- .padding-right-sm\@#{$breakpoint} { padding-right: var(--space-sm); }
- .padding-right-md\@#{$breakpoint} { padding-right: var(--space-md); }
- .padding-right-lg\@#{$breakpoint} { padding-right: var(--space-lg); }
- .padding-right-xl\@#{$breakpoint} { padding-right: var(--space-xl); }
- .padding-right-xxl\@#{$breakpoint} { padding-right: var(--space-xxl); }
- .padding-right-xxxl\@#{$breakpoint} { padding-right: var(--space-xxxl); }
- .padding-right-xxxxl\@#{$breakpoint} { padding-right: var(--space-xxxxl); }
- .padding-right-0\@#{$breakpoint} { padding-right: 0; }
- .padding-right-component\@#{$breakpoint} { padding-right: var(--component-padding); }
-
- .padding-left-xxxxs\@#{$breakpoint} { padding-left: var(--space-xxxxs); }
- .padding-left-xxxs\@#{$breakpoint} { padding-left: var(--space-xxxs); }
- .padding-left-xxs\@#{$breakpoint} { padding-left: var(--space-xxs); }
- .padding-left-xs\@#{$breakpoint} { padding-left: var(--space-xs); }
- .padding-left-sm\@#{$breakpoint} { padding-left: var(--space-sm); }
- .padding-left-md\@#{$breakpoint} { padding-left: var(--space-md); }
- .padding-left-lg\@#{$breakpoint} { padding-left: var(--space-lg); }
- .padding-left-xl\@#{$breakpoint} { padding-left: var(--space-xl); }
- .padding-left-xxl\@#{$breakpoint} { padding-left: var(--space-xxl); }
- .padding-left-xxxl\@#{$breakpoint} { padding-left: var(--space-xxxl); }
- .padding-left-xxxxl\@#{$breakpoint} { padding-left: var(--space-xxxxl); }
- .padding-left-0\@#{$breakpoint} { padding-left: 0; }
- .padding-left-component\@#{$breakpoint} { padding-left: var(--component-padding); }
-
- .padding-x-xxxxs\@#{$breakpoint} { padding-left: var(--space-xxxxs); padding-right: var(--space-xxxxs); }
- .padding-x-xxxs\@#{$breakpoint} { padding-left: var(--space-xxxs); padding-right: var(--space-xxxs); }
- .padding-x-xxs\@#{$breakpoint} { padding-left: var(--space-xxs); padding-right: var(--space-xxs); }
- .padding-x-xs\@#{$breakpoint} { padding-left: var(--space-xs); padding-right: var(--space-xs); }
- .padding-x-sm\@#{$breakpoint} { padding-left: var(--space-sm); padding-right: var(--space-sm); }
- .padding-x-md\@#{$breakpoint} { padding-left: var(--space-md); padding-right: var(--space-md); }
- .padding-x-lg\@#{$breakpoint} { padding-left: var(--space-lg); padding-right: var(--space-lg); }
- .padding-x-xl\@#{$breakpoint} { padding-left: var(--space-xl); padding-right: var(--space-xl); }
- .padding-x-xxl\@#{$breakpoint} { padding-left: var(--space-xxl); padding-right: var(--space-xxl); }
- .padding-x-xxxl\@#{$breakpoint} { padding-left: var(--space-xxxl); padding-right: var(--space-xxxl); }
- .padding-x-xxxxl\@#{$breakpoint} { padding-left: var(--space-xxxxl); padding-right: var(--space-xxxxl); }
- .padding-x-0\@#{$breakpoint} { padding-left: 0; padding-right: 0; }
- .padding-x-component\@#{$breakpoint} { padding-left: var(--component-padding); padding-right: var(--component-padding); }
-
- .padding-y-xxxxs\@#{$breakpoint} { padding-top: var(--space-xxxxs); padding-bottom: var(--space-xxxxs); }
- .padding-y-xxxs\@#{$breakpoint} { padding-top: var(--space-xxxs); padding-bottom: var(--space-xxxs); }
- .padding-y-xxs\@#{$breakpoint} { padding-top: var(--space-xxs); padding-bottom: var(--space-xxs); }
- .padding-y-xs\@#{$breakpoint} { padding-top: var(--space-xs); padding-bottom: var(--space-xs); }
- .padding-y-sm\@#{$breakpoint} { padding-top: var(--space-sm); padding-bottom: var(--space-sm); }
- .padding-y-md\@#{$breakpoint} { padding-top: var(--space-md); padding-bottom: var(--space-md); }
- .padding-y-lg\@#{$breakpoint} { padding-top: var(--space-lg); padding-bottom: var(--space-lg); }
- .padding-y-xl\@#{$breakpoint} { padding-top: var(--space-xl); padding-bottom: var(--space-xl); }
- .padding-y-xxl\@#{$breakpoint} { padding-top: var(--space-xxl); padding-bottom: var(--space-xxl); }
- .padding-y-xxxl\@#{$breakpoint} { padding-top: var(--space-xxxl); padding-bottom: var(--space-xxxl); }
- .padding-y-xxxxl\@#{$breakpoint} { padding-top: var(--space-xxxxl); padding-bottom: var(--space-xxxxl); }
- .padding-y-0\@#{$breakpoint} { padding-top: 0; padding-bottom: 0; }
- .padding-y-component\@#{$breakpoint} { padding-top: var(--component-padding); padding-bottom: var(--component-padding); }
-
- // text-align
- .text-center\@#{$breakpoint} { text-align: center; }
- .text-left\@#{$breakpoint} { text-align: left; }
- .text-right\@#{$breakpoint} { text-align: right; }
- .text-justify\@#{$breakpoint} { text-align: justify; }
-
- // font-size
- .text-xs\@#{$breakpoint} { font-size: var(--text-xs, 0.6875rem); }
- .text-sm\@#{$breakpoint} { font-size: var(--text-sm, 0.75rem); }
- .text-base\@#{$breakpoint} { font-size: var(--text-unit, 1rem); }
- .text-md\@#{$breakpoint} { font-size: var(--text-md, 1.125rem); }
- .text-lg\@#{$breakpoint} { font-size: var(--text-lg, 1.375rem); }
- .text-xl\@#{$breakpoint} { font-size: var(--text-xl, 1.75rem); }
- .text-xxl\@#{$breakpoint} { font-size: var(--text-xxl, 2rem); }
- .text-xxxl\@#{$breakpoint} { font-size: var(--text-xxxl, 2.5rem); }
- .text-xxxxl\@#{$breakpoint} { font-size: var(--text-xxxxl, 3rem); }
-
- // width
- .width-xxxxs\@#{$breakpoint} { width: var(--size-xxxxs, 0.25rem); }
- .width-xxxs\@#{$breakpoint} { width: var(--size-xxxs, 0.5rem); }
- .width-xxs\@#{$breakpoint} { width: var(--size-xxs, 0.75rem); }
- .width-xs\@#{$breakpoint} { width: var(--size-xs, 1rem); }
- .width-sm\@#{$breakpoint} { width: var(--size-sm, 1.5rem); }
- .width-md\@#{$breakpoint} { width: var(--size-md, 2rem); }
- .width-lg\@#{$breakpoint} { width: var(--size-lg, 3rem); }
- .width-xl\@#{$breakpoint} { width: var(--size-xl, 4rem); }
- .width-xxl\@#{$breakpoint} { width: var(--size-xxl, 6rem); }
- .width-xxxl\@#{$breakpoint} { width: var(--size-xxxl, 8rem); }
- .width-xxxxl\@#{$breakpoint} { width: var(--size-xxxxl, 16rem); }
- .width-0\@#{$breakpoint} { width: 0; }
- .width-10\%\@#{$breakpoint} { width: 10%; }
- .width-20\%\@#{$breakpoint} { width: 20%; }
- .width-25\%\@#{$breakpoint} { width: 25%; }
- .width-30\%\@#{$breakpoint} { width: 30%; }
- .width-33\%\@#{$breakpoint} { width: calc(100% / 3); }
- .width-40\%\@#{$breakpoint} { width: 40%; }
- .width-50\%\@#{$breakpoint} { width: 50%; }
- .width-60\%\@#{$breakpoint} { width: 60%; }
- .width-66\%\@#{$breakpoint} { width: calc(100% / 1.5); }
- .width-70\%\@#{$breakpoint} { width: 70%; }
- .width-75\%\@#{$breakpoint} { width: 75%; }
- .width-80\%\@#{$breakpoint} { width: 80%; }
- .width-90\%\@#{$breakpoint} { width: 90%; }
- .width-100\%\@#{$breakpoint} { width: 100%; }
- .width-100vw\@#{$breakpoint} { width: 100vw; }
- .width-auto\@#{$breakpoint} { width: auto; }
-
- // height
- .height-xxxxs\@#{$breakpoint} { height: var(--size-xxxxs, 0.25rem); }
- .height-xxxs\@#{$breakpoint} { height: var(--size-xxxs, 0.5rem); }
- .height-xxs\@#{$breakpoint} { height: var(--size-xxs, 0.75rem); }
- .height-xs\@#{$breakpoint} { height: var(--size-xs, 1rem); }
- .height-sm\@#{$breakpoint} { height: var(--size-sm, 1.5rem); }
- .height-md\@#{$breakpoint} { height: var(--size-md, 2rem); }
- .height-lg\@#{$breakpoint} { height: var(--size-lg, 3rem); }
- .height-xl\@#{$breakpoint} { height: var(--size-xl, 4rem); }
- .height-xxl\@#{$breakpoint} { height: var(--size-xxl, 6rem); }
- .height-xxxl\@#{$breakpoint} { height: var(--size-xxxl, 8rem); }
- .height-xxxxl\@#{$breakpoint} { height: var(--size-xxxxl, 16rem); }
- .height-0\@#{$breakpoint} { height: 0; }
- .height-10\%\@#{$breakpoint} { height: 10%; }
- .height-20\%\@#{$breakpoint} { height: 20%; }
- .height-25\%\@#{$breakpoint} { height: 25%; }
- .height-30\%\@#{$breakpoint} { height: 30%; }
- .height-33\%\@#{$breakpoint} { height: calc(100% / 3); }
- .height-40\%\@#{$breakpoint} { height: 40%; }
- .height-50\%\@#{$breakpoint} { height: 50%; }
- .height-60\%\@#{$breakpoint} { height: 60%; }
- .height-66\%\@#{$breakpoint} { height: calc(100% / 1.5); }
- .height-70\%\@#{$breakpoint} { height: 70%; }
- .height-75\%\@#{$breakpoint} { height: 75%; }
- .height-80\%\@#{$breakpoint} { height: 80%; }
- .height-90\%\@#{$breakpoint} { height: 90%; }
- .height-100\%\@#{$breakpoint} { height: 100%; }
- .height-100vh\@#{$breakpoint} { height: 100vh; }
- .height-auto\@#{$breakpoint} { height: auto; }
-
- // max-width
- .max-width-xxxxs\@#{$breakpoint} { max-width: var(--max-width-xxxxs); }
- .max-width-xxxs\@#{$breakpoint} { max-width: var(--max-width-xxxs); }
- .max-width-xxs\@#{$breakpoint} { max-width: var(--max-width-xxs); }
- .max-width-xs\@#{$breakpoint} { max-width: var(--max-width-xs); }
- .max-width-sm\@#{$breakpoint} { max-width: var(--max-width-sm); }
- .max-width-md\@#{$breakpoint} { max-width: var(--max-width-md); }
- .max-width-lg\@#{$breakpoint} { max-width: var(--max-width-lg); }
- .max-width-xl\@#{$breakpoint} { max-width: var(--max-width-xl); }
- .max-width-xxl\@#{$breakpoint} { max-width: var(--max-width-xxl); }
- .max-width-xxxl\@#{$breakpoint} { max-width: var(--max-width-xxxl); }
- .max-width-xxxxl\@#{$breakpoint} { max-width: var(--max-width-xxxxl); }
- .max-width-100\%\@#{$breakpoint} { max-width: 100%; }
- .max-width-none\@#{$breakpoint} { max-width: none; }
-
- // position
- .position-relative\@#{$breakpoint} { position: relative; }
- .position-absolute\@#{$breakpoint} { position: absolute; }
- .position-fixed\@#{$breakpoint} { position: fixed; }
- .position-sticky\@#{$breakpoint} { position: sticky; }
- .position-static\@#{$breakpoint} { position: static; }
-
- .inset-0\@#{$breakpoint} { top: 0; right: 0; bottom: 0; left: 0; }
-
- .top-0\@#{$breakpoint} { top: 0; }
- .top-50\%\@#{$breakpoint} { top: 50%; }
- .top-xxxxs\@#{$breakpoint} { top: var(--space-xxxxs); }
- .top-xxxs\@#{$breakpoint} { top: var(--space-xxxs); }
- .top-xxs\@#{$breakpoint} { top: var(--space-xxs); }
- .top-xs\@#{$breakpoint} { top: var(--space-xs); }
- .top-sm\@#{$breakpoint} { top: var(--space-sm); }
- .top-md\@#{$breakpoint} { top: var(--space-md); }
- .top-lg\@#{$breakpoint} { top: var(--space-lg); }
- .top-xl\@#{$breakpoint} { top: var(--space-xl); }
- .top-xxl\@#{$breakpoint} { top: var(--space-xxl); }
- .top-xxxl\@#{$breakpoint} { top: var(--space-xxxl); }
- .top-xxxxl\@#{$breakpoint} { top: var(--space-xxxxl); }
-
- .bottom-0\@#{$breakpoint} { bottom: 0; }
- .bottom-unset\@#{$breakpoint} { bottom: unset; }
- .bottom-50\%\@#{$breakpoint} { bottom: 50%; }
- .bottom-xxxxs\@#{$breakpoint} { bottom: var(--space-xxxxs); }
- .bottom-xxxs\@#{$breakpoint} { bottom: var(--space-xxxs); }
- .bottom-xxs\@#{$breakpoint} { bottom: var(--space-xxs); }
- .bottom-xs\@#{$breakpoint} { bottom: var(--space-xs); }
- .bottom-sm\@#{$breakpoint} { bottom: var(--space-sm); }
- .bottom-md\@#{$breakpoint} { bottom: var(--space-md); }
- .bottom-lg\@#{$breakpoint} { bottom: var(--space-lg); }
- .bottom-xl\@#{$breakpoint} { bottom: var(--space-xl); }
- .bottom-xxl\@#{$breakpoint} { bottom: var(--space-xxl); }
- .bottom-xxxl\@#{$breakpoint} { bottom: var(--space-xxxl); }
- .bottom-xxxxl\@#{$breakpoint} { bottom: var(--space-xxxxl); }
-
- .right-0\@#{$breakpoint} { right: 0; }
- .right-50\%\@#{$breakpoint} { right: 50%; }
- .right-xxxxs\@#{$breakpoint} { right: var(--space-xxxxs); }
- .right-xxxs\@#{$breakpoint} { right: var(--space-xxxs); }
- .right-xxs\@#{$breakpoint} { right: var(--space-xxs); }
- .right-xs\@#{$breakpoint} { right: var(--space-xs); }
- .right-sm\@#{$breakpoint} { right: var(--space-sm); }
- .right-md\@#{$breakpoint} { right: var(--space-md); }
- .right-lg\@#{$breakpoint} { right: var(--space-lg); }
- .right-xl\@#{$breakpoint} { right: var(--space-xl); }
- .right-xxl\@#{$breakpoint} { right: var(--space-xxl); }
- .right-xxxl\@#{$breakpoint} { right: var(--space-xxxl); }
- .right-xxxxl\@#{$breakpoint} { right: var(--space-xxxxl); }
-
- .left-0\@#{$breakpoint} { left: 0; }
- .left-50\%\@#{$breakpoint} { left: 50%; }
- .left-xxxxs\@#{$breakpoint} { left: var(--space-xxxxs); }
- .left-xxxs\@#{$breakpoint} { left: var(--space-xxxs); }
- .left-xxs\@#{$breakpoint} { left: var(--space-xxs); }
- .left-xs\@#{$breakpoint} { left: var(--space-xs); }
- .left-sm\@#{$breakpoint} { left: var(--space-sm); }
- .left-md\@#{$breakpoint} { left: var(--space-md); }
- .left-lg\@#{$breakpoint} { left: var(--space-lg); }
- .left-xl\@#{$breakpoint} { left: var(--space-xl); }
- .left-xxl\@#{$breakpoint} { left: var(--space-xxl); }
- .left-xxxl\@#{$breakpoint} { left: var(--space-xxxl); }
- .left-xxxxl\@#{$breakpoint} { left: var(--space-xxxxl); }
-
- // overflow
- .overflow-hidden\@#{$breakpoint} { overflow: hidden; }
- .overflow-auto\@#{$breakpoint} { overflow: auto; }
- .momentum-scrolling\@#{$breakpoint} { -webkit-overflow-scrolling: touch; }
- .overscroll-contain\@#{$breakpoint} { overscroll-behavior: contain; }
-
- // visibility
- .visible\@#{$breakpoint} { visibility: visible; }
- .invisible\@#{$breakpoint} { visibility: hidden; }
- }
-
- @include breakpoint(#{$breakpoint}, "not all") {
- .display\@#{$breakpoint} { display: none !important; }
- }
-}
diff --git a/apps/web-shared/src/styles/base/_visibility.scss b/apps/web-shared/src/styles/base/_visibility.scss
deleted file mode 100644
index ab6a516..0000000
--- a/apps/web-shared/src/styles/base/_visibility.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-:root {
- --display: block;
-}
-
-.is-visible {
- display: var(--display) !important;
-}
-
-.is-hidden {
- display: none !important;
-}
-
-html:not(.js) {
- .no-js\:is-hidden {
- display: none !important;
- }
-}
-
-@media print {
- .print\:is-hidden {
- display: none !important;
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/base/_z-index.scss b/apps/web-shared/src/styles/base/_z-index.scss
deleted file mode 100644
index 5af9ff3..0000000
--- a/apps/web-shared/src/styles/base/_z-index.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-:root {
- --z-index-header: 3; // e.g., main header
- --z-index-popover: 5; // e.g., tooltips and dropdown
- --z-index-fixed-element: 10; // e.g., 'back to top' button
- --z-index-overlay: 15; // e.g., modals and dialogs
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/components/404.scss b/apps/web-shared/src/styles/components/404.scss
deleted file mode 100644
index 1a0267a..0000000
--- a/apps/web-shared/src/styles/components/404.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-@use '../base' as *;
-
-.fof {
-}
-
-.fof__animation {
- svg {
- display: block;
- max-width: 520px;
- margin-left: auto;
- margin-right: auto;
- }
-}
-
-#i-fof-browser {
- transform-origin: 260px 304px;
- animation: i-fof-browser 4s infinite;
-}
-
-#i-fof-shadow {
- transform-origin: 282px 410px;
- animation: i-fof-shadow 4s infinite;
-}
-
-@keyframes i-fof-browser {
- 0%, 100% {
- transform: translateY(0) scale(1);
- }
-
- 50% {
- transform: translateY(-10%) scale(0.9);
- }
-}
-
-@keyframes i-fof-shadow {
- 0%, 100% {
- transform: scale(1);
- }
-
- 50% {
- transform: scale(0.8);
- }
-}
diff --git a/apps/web-shared/src/styles/components/adv-custom-select.scss b/apps/web-shared/src/styles/components/adv-custom-select.scss
deleted file mode 100644
index bd28247..0000000
--- a/apps/web-shared/src/styles/components/adv-custom-select.scss
+++ /dev/null
@@ -1,79 +0,0 @@
-@use '../base' as *;
-@use 'popover.scss' as *;
-
-/* --------------------------------
-
-File#: _2_adv-custom-select
-Title: Advanced Custom Select
-Descr: Custom select with advanced structure options
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.adv-select {
-}
-
-.adv-select__control {
-}
-
-.adv-select-popover {
- // use rem units
- @include spaceUnit(1rem);
- @include textUnit(1rem);
-
- &.popover { // popover component - dependency
- --popover-width: 250px;
- --popover-control-gap: 4px; // ⚠️ use px units - vertical gap between the popover and its control
- --popover-viewport-gap: 20px; // ⚠️ use px units - vertical gap between the popover and the viewport - visible if popover height > viewport height
- --popover-transition-duration: 0.2s;
-
- @include breakpoint(md) {
- --popover-width: 320px;
- }
- }
-}
-
-.adv-select-popover__optgroup:not(:first-of-type) { // custom <optgroup>
- padding-top: var(--space-xxs);
-}
-
-.adv-select-popover__optgroup:not(:last-of-type) {
- border-bottom: 1px solid alpha(var(--color-contrast-higher), 0.1);
- padding-bottom: var(--space-xxs);
-}
-
-.adv-select-popover__check {
- display: none;
-}
-
-.adv-select-popover__label {
-}
-
-.adv-select-popover__option {
- position: relative;
- cursor: pointer;
- @include fontSmooth;
- transition: .2s;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &:focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.15);
- }
-
- &[aria-selected=true] { // selected option
- background-color: var(--color-primary);
- color: var(--color-white);
-
- .adv-select-popover__check {
- display: block;
- }
-
- &:focus {
- box-shadow: inset 0 0 0 2px var(--color-primary-dark);
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/alert.scss b/apps/web-shared/src/styles/components/alert.scss
deleted file mode 100644
index 9d9008d..0000000
--- a/apps/web-shared/src/styles/components/alert.scss
+++ /dev/null
@@ -1,69 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_alert
-Title: Alert
-Descr: Feedback message
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.alert {
- background-color: alpha(var(--color-primary), 0.2);
- color: var(--color-contrast-higher);
-
- // hide element
- position: absolute;
- clip: rect(1px, 1px, 1px, 1px);
- clip-path: inset(50%);
-}
-
-.alert__icon {
- color: var(--color-primary);
-}
-
-.alert__close-btn {
- display: inline-block;
-
- .icon {
- display: block;
- }
-
- &:hover {
- opacity: 0.7;
- }
-}
-
-// themes
-.alert--success {
- background-color: alpha(var(--color-success), 0.2);
-
- .alert__icon {
- color: var(--color-success);
- }
-}
-
-.alert--error {
- background-color: alpha(var(--color-error), 0.2);
-
- .alert__icon {
- color: var(--color-error);
- }
-}
-
-.alert--warning {
- background-color: alpha(var(--color-warning), 0.2);
-
- .alert__icon {
- color: var(--color-warning);
- }
-}
-
-// toggle visibility
-.alert--is-visible {
- position: static;
- clip: auto;
- clip-path: none;
-}
-
diff --git a/apps/web-shared/src/styles/components/auto-sized-grid.scss b/apps/web-shared/src/styles/components/auto-sized-grid.scss
deleted file mode 100644
index a3b1be5..0000000
--- a/apps/web-shared/src/styles/components/auto-sized-grid.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_auto-sized-grid
-Title: Auto Sized Grid
-Descr: A grid layout based on CSS Grid where the columns are automatically created according to a min-width value
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.grid-auto-xs, .grid-auto-sm, .grid-auto-md, .grid-auto-lg, .grid-auto-xl {
- display: grid;
- gap: var(--gap-y, 0px) var(--gap-x, 0px);
- grid-template-columns: repeat(auto-fit, minmax(var(--col-min-width), 1fr)); // auto add new cols
-}
-
-.grid-auto-xs {
- --col-min-width: 8rem;
-}
-
-.grid-auto-sm {
- --col-min-width: 10rem;
-}
-
-.grid-auto-md {
- --col-min-width: 15rem;
-}
-
-.grid-auto-lg {
- --col-min-width: 20rem;
-}
-
-.grid-auto-xl {
- --col-min-width: 25rem;
-}
-
-@each $breakpoint, $value in $breakpoints {
- @include breakpoint(#{$breakpoint}) {
- .grid-auto-xs\@#{$breakpoint} {
- --col-min-width: 8rem;
- }
- .grid-auto-sm\@#{$breakpoint} {
- --col-min-width: 10rem;
- }
- .grid-auto-md\@#{$breakpoint} {
- --col-min-width: 15rem;
- }
- .grid-auto-lg\@#{$breakpoint} {
- --col-min-width: 20rem;
- }
- .grid-auto-xl\@#{$breakpoint} {
- --col-min-width: 25rem;
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/autocomplete.scss b/apps/web-shared/src/styles/components/autocomplete.scss
deleted file mode 100644
index c20d508..0000000
--- a/apps/web-shared/src/styles/components/autocomplete.scss
+++ /dev/null
@@ -1,76 +0,0 @@
-@use '../base' as *;
-@use 'circle-loader.scss' as *;
-
-/* --------------------------------
-
-File#: _2_autocomplete
-Title: Autocomplete
-Descr: Autocomplete plugin for input elements
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- --autocomplete-dropdown-vertical-gap: 4px; // gap between input and results list
- --autocomplete-dropdown-max-height: 150px;
- --autocomplete-dropdown-scrollbar-width: 6px; // custom scrollbar width - webkit browsers
-}
-
-// results dropdown
-.autocomplete__results {
- position: absolute;
- z-index: var(--z-index-popover, 5);
- width: 100%;
- left: 0;
- top: calc(100% + var(--autocomplete-dropdown-vertical-gap));
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-xs);
- border-radius: var(--radius-md);
- opacity: 0;
- visibility: hidden;
- overflow: hidden;
-
- .autocomplete--results-visible & {
- opacity: 1;
- visibility: visible;
- }
-}
-
-.autocomplete__list {
- max-height: var(--autocomplete-dropdown-max-height);
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-
- // custom scrollbar
- &::-webkit-scrollbar { // scrollbar width
- width: var(--autocomplete-dropdown-scrollbar-width);
- }
-
- &::-webkit-scrollbar-track { // progress bar
- background-color: alpha(var(--color-contrast-higher), 0.08);
- border-radius: 0;
- }
-
- &::-webkit-scrollbar-thumb { // handle
- background-color: alpha(var(--color-contrast-higher), 0.12);
- border-radius: 0;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.2);
- }
- }
-}
-
-// single result item
-.autocomplete__item {
- cursor: pointer;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &:focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.15);
- }
-}
diff --git a/apps/web-shared/src/styles/components/breadcrumbs.scss b/apps/web-shared/src/styles/components/breadcrumbs.scss
deleted file mode 100644
index 45bf7c6..0000000
--- a/apps/web-shared/src/styles/components/breadcrumbs.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_breadcrumbs
-Title: Breadcrumbs
-Descr: List of links to help the user move within website structure
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.breadcrumbs {}
-
-.breadcrumbs__item {
- display: inline-block; // flex fallback
- display: inline-flex;
- align-items: center;
-}
diff --git a/apps/web-shared/src/styles/components/btn-states.scss b/apps/web-shared/src/styles/components/btn-states.scss
deleted file mode 100644
index a2fc6c5..0000000
--- a/apps/web-shared/src/styles/components/btn-states.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_btn-states
-Title: Buttons states
-Descr: Multi-state button elements
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.btn__content-a {
- display: inline-flex;
-}
-
-.btn__content-b {
- display: none;
-}
-
-.btn__content-a, .btn__content-b {
- align-items: center;
-}
-
-.btn--state-b {
- .btn__content-a {
- display: none;
- }
-
- .btn__content-b {
- display: inline-block; // fallback
- display: inline-flex;
- }
-}
-
-/* preserve button width when switching from state A to state B */
-.btn--preserve-width {
- .btn__content-b {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- justify-content: center;
- }
-
- &.btn--state-b .btn__content-a {
- display: inline-block; // fallback
- display: inline-flex;
- visibility: hidden;
- }
-}
diff --git a/apps/web-shared/src/styles/components/chip.scss b/apps/web-shared/src/styles/components/chip.scss
deleted file mode 100644
index 1bb93db..0000000
--- a/apps/web-shared/src/styles/components/chip.scss
+++ /dev/null
@@ -1,117 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_chips
-Title: Chips
-Descr: A list of compact pieces of information
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.chip {
- /* reset - in case the class is applied to a <button> or an <a> */
- border: 0;
- color: inherit;
- line-height: 1;
- appearance: none;
-
- display: inline-flex;
- align-items: center;
- border-radius: var(--radius-sm);
-
- background-color: alpha(var(--color-contrast-higher), 0.1);
- padding: var(--space-xxxs) 0;
-}
-
-.chip--outline {
- background-color: transparent;
- box-shadow: inset 0 0 0 1px alpha(var(--color-contrast-higher), 0.25);
-}
-
-.chip--error {
- background-color: alpha(var(--color-error), 0.2);
- color: var(--color-contrast-higher);
-}
-
-.chip--success {
- background-color: alpha(var(--color-success), 0.2);
- color: var(--color-contrast-higher);
-}
-
-.chip--warning {
- background-color: alpha(var(--color-warning), 0.2);
- color: var(--color-contrast-higher);
-}
-
-.chip--interactive {
- cursor: pointer;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.2);
- }
-
- &:focus {
- outline: none;
- box-shadow: 0 0 0 3px alpha(var(--color-contrast-higher), 0.3);
- }
-
- &:focus:not(:focus-visible) {
- box-shadow: none;
- }
-}
-
-.chip__label {
- padding: 0 var(--space-xxs);
-}
-
-.chip__img {
- display: block;
- width: 1.5em;
- height: 1.5em;
- border-radius: 50%;
- object-fit: cover;
-}
-
-.chip__icon-wrapper {
- display: flex;
- width: 1.5em;
- height: 1.5em;
- border-radius: 50%;
- background-color: alpha(var(--color-contrast-higher), 0.95);
- color: var(--color-bg); /* icon color */
-
- .icon {
- display: block;
- margin: auto;
- }
-}
-
-.chip__btn {
- @include reset;
- display: flex;
- width: 1em;
- height: 1em;
- background-color: alpha(var(--color-contrast-higher), 0.2);
- border-radius: 50%;
- cursor: pointer;
- margin-right: 7px;
-
- .icon {
- display: block;
- margin: 0 auto;
- }
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.3);
- }
-
- &:focus {
- outline: none;
- box-shadow: 0 0 0 2px alpha(var(--color-contrast-higher), 0.5);
- }
-
- &:focus:not(:focus-visible) {
- box-shadow: none;
- }
-}
diff --git a/apps/web-shared/src/styles/components/circle-loader.scss b/apps/web-shared/src/styles/components/circle-loader.scss
deleted file mode 100644
index 5116d39..0000000
--- a/apps/web-shared/src/styles/components/circle-loader.scss
+++ /dev/null
@@ -1,315 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_circle-loader
-Title: Circle Loader
-Descr: A collection of animated circle loaders
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- // v1
- --circle-loader-v1-size: 48px;
- --circle-loader-v1-stroke-width: 4px;
-
- // v2
- --circle-loader-v2-size: 64px;
- --circle-loader-v2-stroke-width: 2;
-
- // v3
- --circle-loader-v3-size: 64px;
-
- // v4
- --circle-loader-v4-size: 48px;
-
- // v5
- --circle-loader-v5-size: 64px;
-
- // v6
- --circle-loader-v6-size: 48px;
-}
-
-.circle-loader {
- position: relative;
- display: inline-block;
-}
-
-@supports (animation-name: this) {
- .circle-loader__label {
- @include srHide; // show label only to screen readers if animations are supported
- }
-}
-
-// loader v1 - rotation
-@supports (animation-name: this) {
- .circle-loader--v1 {
- transform: rotate(45deg);
- will-change: transform;
- animation: circle-loader-1 0.75s infinite var(--ease-in-out);
-
- .circle-loader__circle {
- width: var(--circle-loader-v1-size); // loader width
- height: var(--circle-loader-v1-size); // loader height
- border-width: var(--circle-loader-v1-stroke-width); // loader stroke width
- border-style: solid;
- border-color: alpha(var(--color-primary), 0.2); // loader base color
- border-radius: 50%;
-
- &::after {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border-width: inherit;
- border-style: inherit;
- border-color: transparent;
- border-top-color: var(--color-primary); // loader fill color
- border-radius: inherit;
- }
- }
- }
-}
-
-@keyframes circle-loader-1 {
- 0% {
- transform: rotate(45deg);
- }
-
- 100% {
- transform: rotate(405deg);
- }
-}
-
-// loader v2 - filling
-@supports (animation-name: this) {
- .circle-loader--v2 {
- will-change: transform;
- animation: circle-loader-spinning-main 1.4s infinite linear;
-
- .circle-loader__svg {
- display: block;
- width: var(--circle-loader-v2-size);
- height: var(--circle-loader-v2-size);
- color: var(--color-primary); // loader color
-
- > * {
- stroke-width: var(--circle-loader-v2-stroke-width); // loader stroke width
- }
- }
-
- .circle-loader__base {
- opacity: 0.2;
- }
-
- .circle-loader__fill {
- stroke-linecap: round; // optional - remove if you prefer butt caps
- stroke-dashoffset: 0;
- stroke-dasharray: 90 120;
- transform-origin: 50% 50%;
- transform: rotate(45deg);
- animation: circle-loader-dash 1.4s infinite;
- }
- }
-}
-
-@keyframes circle-loader-dash {
- 0%, 20% {
- stroke-dashoffset: 0;
- transform: rotate(0);
- }
-
- 50%, 70% {
- stroke-dashoffset: 80;
- transform: rotate(270deg);
- }
-
- 100% {
- stroke-dashoffset: 0;
- transform: rotate(360deg);
- }
-}
-
-@keyframes circle-loader-spinning-main {
- to {
- transform: rotate(360deg);
- }
-}
-
-// loader v3 - drop
-@supports (animation-name: this) {
- .circle-loader--v3 {
- width: var(--circle-loader-v3-size); // loader width
- height: var(--circle-loader-v3-size); // loader height
-
- .circle-loader__circle {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border-radius: 50%;
- background-color: var(--color-primary); // loader color
- transform: scale(0);
- opacity: 0.8;
- will-change: transform, opacity;
- animation: circle-loader-3 1.2s infinite;
- }
-
- .circle-loader__circle--2nd {
- animation-delay: 0.6s; // this should be half the duration of animation
- }
- }
-}
-
-@keyframes circle-loader-3 {
- to {
- transform: scale(1);
- opacity: 0;
- }
-}
-
-// loader v4 - eclipse
-@supports (animation-name: this) {
- .circle-loader--v4 {
- width: var(--circle-loader-v4-size); // loader width
- height: var(--circle-loader-v4-size); // loader height
- border-radius: 50%;
- overflow: hidden;
-
- .circle-loader__mask,
- .circle-loader__circle {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border-radius: inherit;
- }
-
- .circle-loader__mask {
- clip-path: circle(calc(0.5 * var(--circle-loader-v4-size))); // fix iOS issue - it needs to be = half size of loader
- }
-
- .circle-loader__circle--1st {
- background-color: var(--color-contrast-low); // loader base color
- }
-
- .circle-loader__circle--2nd {
- background-color: var(--color-primary); // loader fill color
- will-change: transform;
- transform-origin: 50% 100%;
- animation: circle-loader-4 1.2s infinite cubic-bezier(.23, .9, .75, .1);
- transform: translateX(-100%);
- }
- }
-}
-
-@keyframes circle-loader-4 {
- to {
- transform: translateX(100%);
- }
-}
-
-// loader v5 - bounce
-@supports (animation-name: this) {
- .circle-loader--v5 {
- font-size: var(--circle-loader-v5-size); // loader size - if you edit this value all elements scale accordingly
- width: 1em;
- height: 1em;
-
- .circle-loader__label {
- font-size: 1rem;
- }
-
- .circle-loader__ball {
- position: absolute;
- top: 0;
- left: calc(50% - 0.140625em);
- width: 0.28125em;
- height: 0.28125em;
- background-color: var(--color-primary);
- border-radius: 50%;
- animation: circle-loader-5-ball 0.8s infinite;
- }
-
- .circle-loader__shadow {
- position: absolute;
- bottom: 0;
- left: calc(50% - 0.15625em);
- width: 0.3125em;
- height: 0.3125em;
- background-color: var(--color-contrast-lower);
- border-radius: 50%;
- transform: scaleY(0.4) scaleX(1.2);
- animation: circle-loader-5-shadow 0.8s infinite;
- }
- }
-}
-
-@keyframes circle-loader-5-ball {
- 0% {
- transform: translateY(0);
- animation-timing-function: cubic-bezier(.61, .12, .85, .4);
- }
-
- 50% {
- transform: translateY(0.5625em);
- animation-timing-function: cubic-bezier(.12, .59, .46, .95);
- }
-
- 100% {
- transform: translateY(0);
- }
-}
-
-@keyframes circle-loader-5-shadow {
- 0% {
- transform: scaleY(0.4) scaleX(1.2);
- background-color: var(--color-contrast-lower);
- animation-timing-function: cubic-bezier(.61, .12, .85, .4);
- }
-
- 50% {
- transform: scaleY(0.2) scaleX(0.6);
- background-color: var(--color-contrast-low);
- animation-timing-function: cubic-bezier(.12, .59, .46, .95);
- }
-
- 100% {
- transform: scaleY(0.4) scaleX(1.2);
- background-color: var(--color-contrast-lower);
- }
-}
-
-// loader v6 - worm
-@supports (animation-name: this) {
- .circle-loader--v6 {
- .circle-loader__svg {
- display: block;
- width: var(--circle-loader-v6-size);
- height: var(--circle-loader-v6-size);
- color: var(--color-primary); // loader color
- }
-
- .circle-loader__fill {
- stroke-width: 8px; // loader stroke width
- stroke-dashoffset: 35;
- stroke-dasharray: 36 36;
- animation: circle-loader-6 1.5s infinite;
- }
- }
-}
-
-@keyframes circle-loader-6 {
- 0%, 100% {
- stroke-dashoffset: 35;
- }
-
- 50% {
- stroke-dashoffset: -35;
- }
-}
diff --git a/apps/web-shared/src/styles/components/custom-checkbox.scss b/apps/web-shared/src/styles/components/custom-checkbox.scss
deleted file mode 100644
index 5722ee0..0000000
--- a/apps/web-shared/src/styles/components/custom-checkbox.scss
+++ /dev/null
@@ -1,131 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_custom-checkbox
-Title: Custom Checkbox
-Descr: Replace the native checkbox button with a custom element (e.g., an icon)
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- --custom-checkbox-size: 20px;
- --custom-checkbox-radius: 4px;
- --custom-checkbox-border-width: 1px;
- --custom-checkbox-marker-size: 18px;
-}
-
-.custom-checkbox {
- position: relative;
- z-index: 1;
- display: inline-block;
- font-size: var(--custom-checkbox-size);
-}
-
-.custom-checkbox__input {
- position: relative;
- /* hide native input */
- margin: 0;
- padding: 0;
- opacity: 0;
- height: 1em;
- width: 1em;
- display: block;
- z-index: 1;
-}
-
-.custom-checkbox__control {
- position: absolute;
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- z-index: -1;
- pointer-events: none;
- color: alpha(var(--color-contrast-low), 0.65); /* unchecked color */
-
- &::before, &::after {
- content: '';
- position: absolute;
- }
-
- &::before { /* focus circle */
- width: 160%;
- height: 160%;
- background-color: currentColor;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%) scale(0);
- opacity: 0;
- border-radius: 50%;
- will-change: transform;
- }
-
- &::after { /* custom checkbox */
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-
- /* custom checkbox style */
- background-color: var(--color-bg);
- border-radius: var(--custom-checkbox-radius);
- box-shadow: inset 0 0 0 var(--custom-checkbox-border-width) currentColor, var(--shadow-xs); /* border */
- }
-}
-
-.custom-checkbox__input:checked ~ .custom-checkbox__control,
-.custom-checkbox__input:indeterminate ~ .custom-checkbox__control {
- &::after {
- background-color: currentColor;
- background-repeat: no-repeat;
- background-position: center;
- background-size: var(--custom-checkbox-marker-size);
- box-shadow: none;
- }
-}
-
-.custom-checkbox__input:checked ~ .custom-checkbox__control {
- color: var(--color-primary); /* checked color */
-
- &::after {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpolyline points='2.5 8 6.5 12 13.5 3' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5'/%3E%3C/svg%3E");
- }
-}
-
-.custom-checkbox__input:indeterminate ~ .custom-checkbox__control {
- &::after {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cline x1='2' y1='8' x2='14' y2='8' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'/%3E%3C/svg%3E");
- }
-}
-
-.custom-checkbox__input:active ~ .custom-checkbox__control {
- transform: scale(0.9);
-}
-
-.custom-checkbox__input:checked:active ~ .custom-checkbox__control,
-.custom-checkbox__input:indeterminate:active ~ .custom-checkbox__control {
- transform: scale(1);
-}
-
-.custom-checkbox__input:focus ~ .custom-checkbox__control::before {
- opacity: 0.2;
- transform: translate(-50%, -50%) scale(1);
-}
-
-/* --icon */
-.custom-checkbox--icon {
- --custom-checkbox-size: 32px;
-
- .custom-checkbox__control::after {
- display: none;
- }
-
- .icon {
- display: block;
- color: inherit;
- position: relative;
- z-index: 1;
- }
-}
diff --git a/apps/web-shared/src/styles/components/custom-select.scss b/apps/web-shared/src/styles/components/custom-select.scss
deleted file mode 100644
index 9cd3b5e..0000000
--- a/apps/web-shared/src/styles/components/custom-select.scss
+++ /dev/null
@@ -1,158 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_custom-select
-Title: Custom Select
-Descr: Custom Select Control
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- // --default variation only 👇
- --select-icon-size: 16px;
- --select-icon-right-margin: var(--space-sm); // icon margin right
- --select-text-icon-gap: var(--space-xxxs); // gap between text and icon
-}
-
-.select {
- position: relative;
-}
-
-.select__input {
- width: 100%;
- height: 100%;
- padding-right: calc(var(--select-icon-size) + var(--select-icon-right-margin) + var(--select-text-icon-gap)) !important;
-}
-
-.select__icon {
- width: var(--select-icon-size);
- height: var(--select-icon-size);
- pointer-events: none;
- position: absolute;
- right: var(--select-icon-right-margin);
- top: 50%;
- transform: translateY(-50%);
-}
-
-// --custom-dropdown
-:root {
- --select-dropdown-gap: 4px; // distance between select control and custom dropdown
-}
-
-.select__button { // created in JS - custom select control
- width: 100%;
-}
-
-.select__button[aria-expanded="true"] {
- // custom select control if dropdown = visible
-}
-
-.select__dropdown { // created in JS - custom select dropdown
- position: absolute;
- left: 0;
- top: 100%;
- min-width: 200px;
- max-height: 1px; // updated in JS
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-md);
- padding: var(--space-xxxs) 0;
- border-radius: var(--radius-md);
- z-index: var(--z-index-popover, 5);
- margin-top: var(--select-dropdown-gap);
- margin-bottom: var(--select-dropdown-gap);
- overflow: auto;
-
- // use rem units
- @include spaceUnit(1rem);
- @include textUnit(1rem);
-
- visibility: hidden;
- opacity: 0;
-}
-
-.select__dropdown--right { // change dropdown position based on the available space
- right: 0;
- left: auto;
-}
-
-.select__dropdown--up {
- bottom: 100%;
- top: auto;
-}
-
-.select__button[aria-expanded="true"] + .select__dropdown {
- visibility: visible;
- opacity: 1;
-}
-
-// custom <optgroup> list - include all <option>s if no <optgroup> available
-.select__list {
- list-style: none !important;
-}
-
-.select__list:not(:first-of-type) {
- padding-top: var(--space-xxs);
-}
-
-.select__list:not(:last-of-type) {
- border-bottom: 1px solid alpha(var(--color-contrast-higher), 0.1);
- padding-bottom: var(--space-xxs);
-}
-
-.select__item { // single item inside .select__list
- display: flex;
- align-items: center;
- padding: var(--space-xxs) var(--space-sm);
- color: var(--color-contrast-high);
- width: 100%;
- text-align: left;
- // truncate text
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.select__item--optgroup { // custom <optgroup> label
- font-size: var(--text-sm);
- color: var(--color-contrast-medium);
-}
-
-.select__item--option { // custom <option> label
- cursor: pointer;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &:focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.15);
- }
-
- &[aria-selected=true] { // selected option
- background-color: var(--color-primary);
- color: var(--color-white);
- position: relative;
- @include fontSmooth;
-
- &::after { // check icon next to the selected language
- content: '';
- display: block;
- height: 1em;
- width: 1em;
- margin-left: auto;
- background-color: currentColor;
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpolyline stroke-width='2' stroke='%23ffffff' fill='none' stroke-linecap='round' stroke-linejoin='round' points='1,9 5,13 15,3 '/%3E%3C/svg%3E");
- }
-
- &:focus {
- box-shadow: inset 0 0 0 2px var(--color-primary-dark);
- }
- }
-}
-
-html:not(.js ) .select .icon { // hide icon if JS = disabled
- display: none;
-}
diff --git a/apps/web-shared/src/styles/components/details.scss b/apps/web-shared/src/styles/components/details.scss
deleted file mode 100644
index b4c122d..0000000
--- a/apps/web-shared/src/styles/components/details.scss
+++ /dev/null
@@ -1,57 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_details
-Title: Details
-Descr: A button that toggles the visibility of additional information
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.details {}
-
-.details__summary {
- display: inline-block;
- cursor: pointer;
- user-select: none;
-
- &:hover {
- color: var(--color-primary);
- }
-
- &:focus {
- outline: 2px solid alpha(var(--color-primary), 0.2);
- outline-offset: 4px;
- }
-
- .icon {
- flex-shrink: 0;
- }
-}
-
-// if JS = enabled
-.js {
- .details__summary {
- list-style: none; // remove summary default icon
- }
-
- .details__summary::-webkit-details-marker {
- display: none; // remove default icon in webkit browsers
- }
-
- .details__summary[aria-expanded="true"] .icon {
- transform: rotate(90deg); // rotate icon when content is visible
- }
-
- .details__content[aria-hidden="true"] {
- display: none;
- }
-}
-
-// if JS = disabled
-html:not(.js) .details__summary {
- .icon {
- display: none;
- }
-}
diff --git a/apps/web-shared/src/styles/components/dropdown.scss b/apps/web-shared/src/styles/components/dropdown.scss
deleted file mode 100644
index c5ded33..0000000
--- a/apps/web-shared/src/styles/components/dropdown.scss
+++ /dev/null
@@ -1,98 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _2_dropdown
-Title: Dropdown
-Descr: A hoverable link that toggles the visibility of a dropdown list
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- --dropdown-item-padding: var(--space-xxs) var(--space-sm);
-}
-
-.dropdown {
- position: relative;
-}
-
-.dropdown__menu {
- border-radius: var(--radius-md);
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
- z-index: var(--z-index-popover, 5);
- position: absolute;
- left: 0;
- top: 100%;
- opacity: 0;
- visibility: hidden;
-}
-
-.dropdown__wrapper {
- max-height: 24px;
-}
-
-@media (pointer: fine) { // user has pointing device (e.g., mouse)
- .dropdown__wrapper,
- .open-dropdown {
- &:hover .dropdown__menu,
- &:focus .dropdown__menu {
- opacity: 1;
- visibility: visible;
- }
- }
-
- .dropdown__sub-wrapper:hover > .dropdown__menu {
- left: 100%;
- }
-}
-
-@media not all and (pointer: fine) {
- .dropdown__trigger-icon {
- display: none;
- }
-}
-
-.dropdown__item {
- display: block;
- text-decoration: none;
- color: var(--color-contrast-high);
- padding: var(--dropdown-item-padding);
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- &:hover, &.dropdown__item--hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-}
-
-.dropdown__separator { // h line divider
- height: 1px;
- background-color: var(--color-contrast-lower);
- margin: var(--dropdown-item-padding);
-}
-
-.dropdown__sub-wrapper {
- position: relative;
-
- > .dropdown__item { // item w/ right arrow
- position: relative;
- padding-right: calc(var(--space-sm) + 12px);
-
- .icon { // right arrow
- position: absolute;
- display: block;
- width: 12px;
- height: 12px;
- right: var(--space-xxs);
- top: calc(50% - 6px);
- }
- }
-
- > .dropdown__menu { // sub menu
- top: calc(var(--space-xxs) * -1);
- box-shadow: var(--inner-glow), var(--shadow-md);
- }
-}
diff --git a/apps/web-shared/src/styles/components/form-validator.scss b/apps/web-shared/src/styles/components/form-validator.scss
deleted file mode 100644
index cc9f9a3..0000000
--- a/apps/web-shared/src/styles/components/form-validator.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_form-validator
-Title: Form Validator
-Descr: A plugin to validate form fields
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.form-validate__error-msg {
- display: none; // hide error message by default
-
- .form-validate__input-wrapper--error & {
- display: block; // show error message
- }
-}
diff --git a/apps/web-shared/src/styles/components/interactive-table.scss b/apps/web-shared/src/styles/components/interactive-table.scss
deleted file mode 100644
index f239c62..0000000
--- a/apps/web-shared/src/styles/components/interactive-table.scss
+++ /dev/null
@@ -1,156 +0,0 @@
-@use '../base' as *;
-@use 'menu.scss' as *;
-@use 'menu-bar.scss' as *;
-
-/* --------------------------------
-
-File#: _3_interactive-table
-Title: Interactive Table
-Descr: Table with the option of sorting data and selecting rows to perform specific actions
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.int-table {
- overflow: hidden;
- border-bottom: 2px solid var(--color-contrast-lower);
-}
-
-.int-table__inner {
- position: relative;
- overflow: auto;
-
- &::-webkit-scrollbar { // custom scrollbar style
- height: 8px;
- width: 8px;
- }
-
- &::-webkit-scrollbar-track { // progress bar
- background-color: var(--color-contrast-lower);
- }
-
- &::-webkit-scrollbar-thumb { // handle
- background-color: alpha(var(--color-contrast-higher), 0.9);
- border-radius: 50em;
- }
-
- &::-webkit-scrollbar-thumb:hover {
- background-color: var(--color-contrast-higher);
- }
-}
-
-.int-table__table {
- width: 100%;
-}
-
-.int-table__header {
- .int-table__cell {
- background-color: var(--color-bg);
- box-shadow: 0 2px 0 var(--color-contrast-lower);
- }
-}
-
-.int-table__body {
- .int-table__row {
- border-bottom: 1px solid var(--color-contrast-lower);
-
- &:last-child {
- border-bottom: none;
- }
- }
-
- .int-table__row--checked {
- background-color: alpha(var(--color-primary), 0.1);
- border-color: alpha(var(--color-primary), 0.25);
- }
-}
-
-.int-table__cell { // standard cell
- padding: var(--space-xxxs);
-}
-
-.int-table__cell--th { // header cell
- font-weight: 600;
-}
-
-.int-table__cell--sort { // header cell with sorting option
- user-select: none;
-
- &:hover, &:focus-within {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &:hover {
- cursor: pointer;
- }
-}
-
-.int-table__cell--focus {
- background-color: alpha(var(--color-primary), 0.15);
-}
-
-.int-table__sort-icon { // sorting icon indicator
- .arrow-up, .arrow-down {
- fill: alpha(var(--color-contrast-higher), 0.3);
- }
-}
-
-.int-table__cell--asc .int-table__sort-icon .arrow-up,
-.int-table__cell--desc .int-table__sort-icon .arrow-down {
- fill: var(--color-contrast-higher);
-}
-
-.int-table__checkbox {
- --custom-checkbox-size: 18px;
- --custom-checkbox-marker-size: 16px;
- display: block;
- width: var(--custom-checkbox-size);
- height: var(--custom-checkbox-size);
-}
-
-.int-table__menu-btn {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 2em;
- cursor: pointer;
-
- .icon {
- display: block;
- width: 16px;
- height: 16px;
- }
-}
-
-// --sticky-header
-.int-table--sticky-header {
- position: relative;
- z-index: 1;
-
- .int-table__inner {
- max-height: 605px;
- }
-
- .int-table__header {
- .int-table__cell {
- position: sticky;
- top: 0;
- z-index: 2;
- }
- }
-}
-
-// actions
-.int-table-actions {
- .menu-bar {
- --menu-bar-button-size: 38px; // size of the menu buttons
- --menu-bar-icon-size: 16px; // size of the icons inside the buttons
- --menu-bar-horizontal-gap: var(--space-xxxxs); // horizontal gap between buttons
- --menu-bar-vertical-gap: 4px; // vertical gap between buttons and labels (tooltips)
- --menu-bar-label-size: var(--text-xs); // label font size
- }
-
- .menu-bar__icon {
- color: alpha(var(--color-contrast-higher), 0.5);
- }
-}
diff --git a/apps/web-shared/src/styles/components/light-dark-switch.scss b/apps/web-shared/src/styles/components/light-dark-switch.scss
deleted file mode 100644
index 23dc03a..0000000
--- a/apps/web-shared/src/styles/components/light-dark-switch.scss
+++ /dev/null
@@ -1,96 +0,0 @@
-@use '../base' as *;
-@use 'popover.scss' as *;
-@use 'adv-custom-select.scss' as *;
-
-/* --------------------------------
-
-File#: _3_light-dark-switch
-Title: Light/Dark Switch
-Descr: Color theme switcher
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.ld-switch {}
-
-.ld-switch-btn {
- position: relative;
- width: 24px;
- height: 24px;
- overflow: hidden;
- display: inline-block;
-
-
- &:hover {
- cursor: pointer;
- opacity: 0.8;
- }
-
- &:focus {
- outline: none;
- color: var(--color-primary);
- }
-}
-
-.ld-switch-btn.popover-control--active {
- /* class added to the control button when the dropdown is visible */
- color: var(--color-primary);
-}
-
-.ld-switch-btn__icon-wrapper {
- position: absolute;
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- opacity: 0;
- transform: translateY(100%) rotate(35deg) scale(0.5);
-}
-
-.ld-switch-btn__icon-wrapper--in {
- opacity: 1;
- transform: translateY(0) rotate(0) scale(1);
-}
-
-.ld-switch-btn__icon-wrapper--out {
- opacity: 0;
- transform: translateY(-100%) rotate(-35deg) scale(0.5);
-}
-
-
-.ld-switch-btn__icon {
- margin: auto;
- --size: 20px; /* icon size */
-}
-
-.popover.ld-switch-popover {
- --popover-width: 250px;
-}
-
-.ld-switch-popover__option {
- user-select: none;
-
- &:hover {
- cursor: pointer;
- opacity: 0.85;
- }
-
- &:focus {
- outline: none;
-
- figure {
- box-shadow: 0 0 0 1px var(--color-bg-light), 0 0 0 3px var(--color-contrast-higher);
- }
- }
-
- &[aria-selected=true] {
- color: var(--color-primary);
-
- figure {
- box-shadow: 0 0 0 1px var(--color-bg-light), 0 0 0 3px currentColor;
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/link-card.scss b/apps/web-shared/src/styles/components/link-card.scss
deleted file mode 100644
index dad4f98..0000000
--- a/apps/web-shared/src/styles/components/link-card.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_link-card
-Title: Link Card
-Descr: Link card for app UI
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.link-card {
- text-decoration: none;
- color: inherit;
- box-shadow: var(--inner-glow), var(--shadow-xs);
-
- &:hover {
- box-shadow: var(--inner-glow), var(--shadow-sm);
- }
-}
-
-.link-card__footer {
- position: relative;
- overflow: hidden;
- height: 60px;
-
- > * {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- }
-
- > *:last-child {
- transform: translateY(100%);
- opacity: 0;
- }
-}
-
-.link-card:hover {
- .link-card__footer {
- > *:first-child {
- transform: translateY(-100%);
- opacity: 0;
- }
-
- > *:last-child {
- transform: translateY(0);
- opacity: 1;
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/list.scss b/apps/web-shared/src/styles/components/list.scss
deleted file mode 100644
index df600a3..0000000
--- a/apps/web-shared/src/styles/components/list.scss
+++ /dev/null
@@ -1,195 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_list
-Title: List
-Descr: Custom list component
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- --list-space-y: 0.375em; // vertical gaps
- --list-offset: 1em; // sublist horizontal offset
- --list-line-height-multiplier: 1; // line-height multiplier
-}
-
-.list, .text-component .list {
- padding-left: 0;
- list-style: none;
-
- ul, ol {
- list-style: none;
- margin: 0; // reset
- margin-top: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
- padding-top: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
- padding-left: var(--list-offset);
- }
-
- li {
- padding-bottom: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
- margin-bottom: calc((var(--list-space-y) / 2) * var(--text-space-y-multiplier, 1));
- line-height: calc(var(--body-line-height) * var(--list-line-height-multiplier));
- }
-
- > li:last-child, ul > li:last-child, ol > li:last-child {
- margin-bottom: 0;
- }
-
- &:not(.list--border) > li:last-child, ul > li:last-child, ol > li:last-child {
- padding-bottom: 0;
- }
-}
-
-/* #region (ul + ol) */
-.list--ul, .text-component .list--ul,
-.list--ol, .text-component .list--ol {
- --list-offset: calc(var(--list-bullet-size) + var(--list-bullet-margin-right));
-
- ul, ol {
- padding-left: 0;
- }
-
- li {
- @supports (--css: variables) {
- padding-left: var(--list-offset) !important;
- }
- }
-
- li::before {
- display: inline-flex;
- justify-content: center;
- align-items: center;
- vertical-align: middle;
- position: relative;
- top: -0.1em;
-
- @supports (--css: variables) {
- width: var(--list-bullet-size) !important;
- height: var(--list-bullet-size) !important;
- margin-left: calc(var(--list-bullet-size) * -1) !important;
- left: calc(var(--list-bullet-margin-right) * -1) !important;
- }
- }
-}
-
-// unordered list
-.list--ul, .text-component .list--ul {
- --list-bullet-size: 7px; // dot width and height
- --list-bullet-margin-right: 12px; // gap between bullet and content
-
- > li {
- padding-left: 19px; // IE fallback
- }
-
- > li::before { // bullet
- content: '';
- border-radius: 50%;
- color: var(--color-contrast-lower); // bullet color
- background-color: currentColor;
-
- // IE fallback
- width: 7px;
- height: 7px;
- margin-left: -7px;
- left: -12px;
- // end - IE fallback
- }
-
- ul li::before {
- background-color: transparent;
- box-shadow: inset 0 0 0 2px currentColor;
- }
-}
-
-// ordered list
-.list--ol, .text-component .list--ol {
- --list-bullet-size: 26px; // ⚠️ use px or rem units - circle width and height
- --list-bullet-margin-right: 6px; // ⚠️ use px or rem units - gap between circle and content
- --list-bullet-font-size: 14px; // ⚠️ use px or rem units - bullet font size
- counter-reset: list-items;
-
- > li {
- counter-increment: list-items;
- padding-left: 32px; // IE fallback
- }
-
- ol {
- counter-reset: list-items;
- }
-
- > li::before {
- content: counter(list-items);
- font-size: var(--list-bullet-font-size, 14px);
- background-color: var(--color-contrast-lower);
- color: var(--color-contrast-high);
- line-height: 1;
- border-radius: 50%;
-
- // IE fallback
- width: 26px;
- height: 26px;
- margin-left: -26px;
- left: -6px;
- // end - IE fallback
- }
-
- ol > li::before {
- background-color: transparent;
- box-shadow: inset 0 0 0 2px var(--color-contrast-lower);
- }
-}
-/* #endregion */
-
-/* #region (border) */
-.list--border, .text-component .list--border { // show border divider among list items
- li:not(:last-child) {
- border-bottom: 1px solid var(--color-contrast-lower);
- }
-
- ul, ol {
- border-top: 1px solid var(--color-contrast-lower);
- }
-}
-/* #endregion */
-
-/* #region (icons) */
-.list--icons, .text-component .list--icons { // use icons as bullet points
- --list-bullet-size: 24px;
- --list-bullet-margin-right: 8px; // gap between icon and text
- --list-offset: calc(var(--list-bullet-size) + var(--list-bullet-margin-right));
-
- ul, ol {
- padding-left: 32px; // IE fallback
-
- @supports (--css: variables) {
- padding-left: var(--list-offset);
- }
- }
-}
-
-.list__icon {
- position: relative;
-
- // IE fallback
- width: 24px;
- height: 24px;
- margin-right: 8px;
-
- &:not(.top-0) {
- top: calc((1em * var(--body-line-height) - 24px) / 2);
- }
- // end - IE fallback
-
- @supports (--css: variables) {
- width: var(--list-bullet-size);
- height: var(--list-bullet-size);
- margin-right: var(--list-bullet-margin-right);
-
- &:not(.top-0) {
- top: calc((1em * var(--body-line-height) * var(--list-line-height-multiplier) - var(--list-bullet-size)) / 2);
- }
- }
-}
-/* #endregion */
diff --git a/apps/web-shared/src/styles/components/menu-bar.scss b/apps/web-shared/src/styles/components/menu-bar.scss
deleted file mode 100644
index 3f70fbe..0000000
--- a/apps/web-shared/src/styles/components/menu-bar.scss
+++ /dev/null
@@ -1,139 +0,0 @@
-@use '../base' as *;
-@use 'menu.scss' as *;
-
-/* --------------------------------
-
-File#: _2_menu-bar
-Title: Menu Bar
-Descr: Application menu with a list of common actions that users can perform
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- --menu-bar-button-size: 2.5em; // size of the menu buttons
- --menu-bar-icon-size: 1em; // size of the icons inside the buttons
- --menu-bar-horizontal-gap: var(--space-xxs); // horizontal gap between buttons
- --menu-bar-vertical-gap: 4px; // vertical gap between buttons and labels (tooltips)
- --menu-bar-label-size: var(--text-xs); // label font size
-}
-
-.menu-bar {
- list-style: none;
- display: inline-flex;
- align-items: center;
-}
-
-.menu-bar__item { // menu button
- position: relative;
- display: inline-block; // flex fallback
- display: flex;
- align-items: center;
- justify-content: center;
- height: var(--menu-bar-button-size);
- width: var(--menu-bar-button-size);
- border-radius: 50%;
- cursor: pointer;
-
- &:not(:last-child) {
- margin-right: var(--menu-bar-horizontal-gap);
- }
-
- &:hover,
- &.menu-control--active {
- background-color: alpha(var(--color-contrast-higher), 0.1);
-
- > .menu-bar__icon {
- color: var(--color-contrast-higher);
- }
-
- > .menu-bar__label { // show label
- clip: auto;
- clip-path: none;
- height: auto;
- width: auto;
- }
- }
-
- &:focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.1);
- }
-
- &:active {
- background-color: var(--color-contrast-low);
- }
-
- &:focus:active {
- background-color: alpha(var(--color-primary), 0.2);
- }
-}
-
-.menu-bar__item--trigger { // button used to show hidden actions - visibile only if menu = collapsed
- display: none;
-}
-
-.menu-bar__icon {
- display: block;
- color: var(--color-contrast-high);
- font-size: var(--menu-bar-icon-size); // set icon size
-}
-
-.menu-bar__label { // label visible on :hover
- // hide
- position: absolute;
- z-index: var(--z-index-popover, 5);
- clip: rect(1px, 1px, 1px, 1px);
- clip-path: inset(50%);
- width: 1px;
- height: 1px;
- overflow: hidden;
- white-space: nowrap;
- // style
- top: 100%;
- left: 50%;
- transform: translateX(-50%) translateY(var(--menu-bar-vertical-gap));
- padding: var(--space-xxs) var(--space-xs);
- color: var(--color-bg);
- background-color: alpha(var(--color-contrast-higher), 0.95);
- border-radius: var(--radius-md);
- font-size: var(--menu-bar-label-size);
- @include fontSmooth;
- pointer-events: none;
- user-select: none;
-}
-
-.menu-bar--collapsed { // mobile layout style
- .menu-bar__item--hide { // hide buttons
- display: none;
- }
-
- .menu-bar__item--trigger { // show submenu trigger
- display: inline-block; // flex fallback
- display: flex;
- }
-}
-
-// detect when the menu needs to switch from the mobile layout to an expanded one - used in JS
-.js {
- .menu-bar {
- opacity: 0; // hide menu bar while it is initialized in JS
-
- &::before {
- display: none;
- content: 'collapsed';
- }
- }
-
- .menu-bar--loaded {
- opacity: 1;
- }
-
- @each $breakpoint, $value in $breakpoints {
- .menu-bar--expanded\@#{$breakpoint}::before {
- @include breakpoint(#{$breakpoint}) {
- content: 'expanded';
- }
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/menu.scss b/apps/web-shared/src/styles/components/menu.scss
deleted file mode 100644
index 8e211a5..0000000
--- a/apps/web-shared/src/styles/components/menu.scss
+++ /dev/null
@@ -1,81 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_menu
-Title: Menu
-Descr: Application menu that provides access to a set of functionalities
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.menu {
- --menu-vertical-gap: 5px; // vertical gap between the Menu element and its control
- --menu-item-padding: var(--space-xxxs) var(--space-xs);
- list-style: none;
- position: fixed; // top/left position set in JS
- background-color: var(--color-bg-light);
- //padding: var(--space-xxs) 0;
- border-radius: var(--radius-md);
- z-index: var(--z-index-popover, 5);
- user-select: none;
- margin-top: var(--menu-vertical-gap);
- margin-bottom: var(--menu-vertical-gap);
- overflow: auto;
-
-
- // use rem units
- @include spaceUnit(1rem);
- @include textUnit(1rem);
-
- visibility: hidden;
- opacity: 0;
-}
-
-.menu--is-visible {
- visibility: visible;
- opacity: 1;
-}
-
-.menu--overlay {
- z-index: var(--z-index-overlay, 15);
-}
-
-.menu__content {
- display: block; // fallback
- display: flex;
- align-items: center;
- text-decoration: none; // reset link style
- padding: var(--menu-item-padding);
- color: var(--color-contrast-high);
- cursor: pointer;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &:focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.15);
- }
-}
-
-.menu__label {
- padding: var(--menu-item-padding);
- font-size: var(--text-sm);
- color: var(--color-contrast-medium);
-}
-
-.menu__separator {
- height: 1px;
- background-color: var(--color-contrast-lower);
- margin: var(--menu-item-padding);
-}
-
-.menu__icon {
- color: alpha(var(--color-contrast-higher), 0.5);
- margin-right: var(--space-xxs);
-}
diff --git a/apps/web-shared/src/styles/components/modal.scss b/apps/web-shared/src/styles/components/modal.scss
deleted file mode 100644
index 1beec76..0000000
--- a/apps/web-shared/src/styles/components/modal.scss
+++ /dev/null
@@ -1,105 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_modal-window
-Title: Modal Window
-Descr: A modal dialog used to display critical information
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.modal {
- position: fixed;
- z-index: var(--z-index-overlay, 15);
- width: 100%;
- height: 100%;
- left: 0;
- top: 0;
- opacity: 0;
- visibility: hidden;
-
- &:not(.modal--is-visible) {
- pointer-events: none;
- background-color: transparent;
- }
-}
-
-.modal--is-visible {
- opacity: 1;
- visibility: visible;
-}
-
-// close button
-.modal__close-btn {
- display: flex;
- flex-shrink: 0;
- border-radius: 50%;
- cursor: pointer;
-
- .icon {
- display: block;
- margin: auto;
- }
-}
-
-.modal__close-btn--outer { // close button - outside the modal__content
- width: 48px;
- height: 48px;
- position: fixed;
- top: var(--space-sm);
- right: var(--space-sm);
- z-index: var(--z-index-fixed-element, 10);
- background-color: alpha(var(--color-black), 0.9);
-
- .icon {
- color: var(--color-white); // icon color
- }
-
- &:hover {
- background-color: alpha(var(--color-black), 1);
-
- .icon {
- transform: scale(1.1);
- }
- }
-}
-
-.modal__close-btn--inner { // close button - inside the modal__content
- width: 2em;
- height: 2em;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
-
- .icon {
- color: inherit; // icon color
- }
-
- &:hover {
- background-color: var(--color-bg-lighter);
- box-shadow: var(--inner-glow), var(--shadow-md);
- }
-}
-
-// load content - optional
-.modal--is-loading {
- .modal__content {
- visibility: hidden;
- }
-
- .modal__loader {
- display: flex;
- }
-}
-
-.modal__loader { // loader icon
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- justify-content: center;
- align-items: center;
- display: none;
- pointer-events: none;
-}
diff --git a/apps/web-shared/src/styles/components/pagination.scss b/apps/web-shared/src/styles/components/pagination.scss
deleted file mode 100644
index 0a09210..0000000
--- a/apps/web-shared/src/styles/components/pagination.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_pagination
-Title: Pagination
-Descr: Component used to navigate through pages of related content
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.pagination {}
-
-.pagination__list > li {
- display: inline-block; // flex fallback
-}
-
-// --split - push first + last item to sides
-.pagination--split {
- .pagination__list {
- width: 100%;
-
- > *:first-child {
- margin-right: auto;
- }
-
- > *:last-child {
- margin-left: auto;
- }
- }
-}
-
-.pagination__item {
- display: inline-block; // flex fallback
- display: inline-flex;
- height: 100%;
- align-items: center;
- padding: var(--space-xs) calc(1.355 * var(--space-xs));
-
- white-space: nowrap;
- line-height: 1;
- border-radius: var(--radius-md);
-
- text-decoration: none;
- color: var(--color-contrast-high);
- @include fontSmooth;
-
- will-change: transform;
-
- &:hover:not(.pagination__item--selected):not(.pagination__item--ellipsis) {
- background-color: alpha(var(--color-contrast-higher), 0.1);
- }
-}
-
-.pagination__item--selected {
- background-color: var(--color-contrast-higher);
- color: var(--color-bg);
- box-shadow: var(--shadow-sm);
-}
-
-.pagination__item--disabled {
- opacity: 0.5;
- pointer-events: none;
-}
-
-// --jumper
-.pagination__jumper {
- .form-control {
- width: 3em;
- margin-right: var(--space-xs);
- }
-
- em {
- flex-shrink: 0;
- white-space: nowrap;
- }
-}
diff --git a/apps/web-shared/src/styles/components/popover.scss b/apps/web-shared/src/styles/components/popover.scss
deleted file mode 100644
index 7f423a0..0000000
--- a/apps/web-shared/src/styles/components/popover.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-@use '../base'as *;
-
-/* --------------------------------
-
-File#: _1_popover
-Title: Popover
-Descr: A pop-up box controlled by a trigger element
-Usage: codyhouse.co/license
-
--------------------------------- */
-:root {
- --popover-width: 250px;
- --popover-control-gap: 4px; // ⚠️ use px units - vertical gap between the popover and its control
- --popover-viewport-gap: 20px; // ⚠️ use px units - vertical gap between the popover and the viewport - visible if popover height > viewport height
- --popover-transition-duration: 0.2s;
-}
-
-.popover {
- position: fixed; // top/left position set in JS
- width: var(--popover-width);
- z-index: var(--z-index-popover, 5);
- margin-top: var(--popover-control-gap);
- margin-bottom: var(--popover-control-gap);
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-
- visibility: hidden;
- opacity: 0;
-}
-
-.popover--is-visible {
- visibility: visible;
- opacity: 1;
-}
-
-.popover-control--active {
- // class added to the trigger when popover is visible
-}
diff --git a/apps/web-shared/src/styles/components/pre-header.scss b/apps/web-shared/src/styles/components/pre-header.scss
deleted file mode 100644
index 1e803e7..0000000
--- a/apps/web-shared/src/styles/components/pre-header.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_pre-header
-Title: Pre-header
-Descr: Pre-header (top) banner
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.pre-header {
- display: block;
- background-color: var(--color-contrast-higher);
- color: var(--color-bg);
- @include fontSmooth;
-}
-
-.pre-header--is-hidden {
- display: none;
-}
-
-.pre-header__close-btn {
- position: absolute;
- right: 0;
- top: calc(50% - 0.5em);
- will-change: transform;
-
- &:hover {
- transform: scale(1.1);
- }
-
- .icon {
- display: block;
- }
-}
-
-// --link
-a.pre-header {
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- background-color: var(--color-contrast-high);
- }
-}
diff --git a/apps/web-shared/src/styles/components/radios-checkboxes.scss b/apps/web-shared/src/styles/components/radios-checkboxes.scss
deleted file mode 100644
index c4009f9..0000000
--- a/apps/web-shared/src/styles/components/radios-checkboxes.scss
+++ /dev/null
@@ -1,134 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_radios-checkboxes
-Title: Radios and Checkboxes
-Descr: Custom radio and checkbox buttons
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-:root {
- // radios and checkboxes
- --checkbox-radio-size: 18px;
- --checkbox-radio-gap: var(--space-xxs); // gap between button and label
- --checkbox-radio-border-width: 1px;
- --checkbox-radio-line-height: var(--body-line-height);
-
- // radio buttons
- --radio-marker-size: 8px;
-
- // checkboxes
- --checkbox-marker-size: 12px;
- --checkbox-radius: 4px;
-}
-
-// hide native buttons
-.radio,
-.checkbox {
- position: absolute;
- padding: 0;
- margin: 0;
- margin-top: calc((1em * var(--checkbox-radio-line-height) - var(--checkbox-radio-size)) / 2);
- opacity: 0;
- height: var(--checkbox-radio-size);
- width: var(--checkbox-radio-size);
- pointer-events: none;
-}
-
-// label
-.radio + label,
-.checkbox + label {
- display: inline-block;
- line-height: var(--checkbox-radio-line-height);
- user-select: none;
- cursor: pointer;
- padding-left: calc(var(--checkbox-radio-size) + var(--checkbox-radio-gap));
-}
-
-// custom inputs - basic style
-.radio + label::before,
-.checkbox + label::before {
- content: '';
- box-sizing: border-box;
- display: inline-block;
- position: relative;
- vertical-align: middle;
- top: -0.1em;
- margin-left: calc(-1 * (var(--checkbox-radio-size) + var(--checkbox-radio-gap)));
- flex-shrink: 0;
- width: var(--checkbox-radio-size);
- height: var(--checkbox-radio-size);
- background-color: var(--color-bg);
- border-width: var(--checkbox-radio-border-width);
- border-color: alpha(var(--color-contrast-low), 0.65);
- border-style: solid;
- box-shadow: var(--shadow-xs);
- background-repeat: no-repeat;
- background-position: center;
- margin-right: var(--checkbox-radio-gap);
-}
-
-// :hover
-.radio:not(:checked):not(:focus) + label:hover::before,
-.checkbox:not(:checked):not(:focus) + label:hover::before {
- border-color: alpha(var(--color-contrast-low), 1);
-}
-
-// radio only style
-.radio + label::before {
- border-radius: 50%;
-}
-
-// checkbox only style
-.checkbox + label::before {
- border-radius: var(--checkbox-radius);
-}
-
-// :checked
-.radio:checked + label::before,
-.checkbox:checked + label::before {
- background-color: var(--color-primary);
- box-shadow: var(--shadow-xs);
- border-color: var(--color-primary);
-}
-
-// radio button icon
-.radio:checked + label::before {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cg class='nc-icon-wrapper' fill='%23ffffff'%3E%3Ccircle cx='8' cy='8' r='8' fill='%23ffffff'%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");
- background-size: var(--radio-marker-size);
-}
-
-// checkbox button icon
-.checkbox:checked + label::before {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpolyline points='1 6.5 4 9.5 11 2.5' fill='none' stroke='%23FFFFFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'/%3E%3C/svg%3E");
- background-size: var(--checkbox-marker-size);
-}
-
-// :focus
-.radio:checked:active + label::before,
-.checkbox:checked:active + label::before,
-.radio:focus + label::before,
-.checkbox:focus + label::before {
- border-color: var(--color-primary);
- box-shadow: 0 0 0 3px alpha(var(--color-primary), 0.2);
-}
-
-// --radio--bg, --checkbox--bg -> variation with background color
-.radio--bg + label, .checkbox--bg + label {
- padding: var(--space-xxxxs) var(--space-xxxs);
- padding-left: calc(var(--checkbox-radio-size) + var(--checkbox-radio-gap) + var(--space-xxxs));
- border-radius: var(--radius-md);
-}
-
-.radio--bg + label:hover, .checkbox--bg + label:hover {
- background-color: alpha(var(--color-contrast-higher), 0.075);
-}
-
-.radio--bg:active + label,
-.checkbox--bg:active + label,
-.radio--bg:focus + label,
-.checkbox--bg:focus + label {
- background-color: alpha(var(--color-primary), 0.1);
-}
diff --git a/apps/web-shared/src/styles/components/responsive-sidebar.scss b/apps/web-shared/src/styles/components/responsive-sidebar.scss
deleted file mode 100644
index 71c86da..0000000
--- a/apps/web-shared/src/styles/components/responsive-sidebar.scss
+++ /dev/null
@@ -1,139 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_responsive-sidebar
-Title: Responsive Sidebar
-Descr: Responsive sidebar container
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-/* mobile version only (--default) 👇 */
-.sidebar:not(.sidebar--static) {
- position: fixed;
- top: 0;
- left: 0;
- z-index: var(--z-index-fixed-element, 10);
- width: 100%;
- height: 100%;
- visibility: hidden;
- transition: visibility 0s 0.3s;
-
- &::after { /* overlay layer */
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: alpha(var(--color-black), 0);
- transition: background-color .3s;
- z-index: 1;
- }
-
- .sidebar__panel { /* content */
- position: absolute;
- top: 0;
- left: 0;
- z-index: 2;
- width: 100%;
- max-width: 380px;
- height: 100%;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- background-color: var(--color-bg);
- transform: translateX(-100%);
- transition: box-shadow 0.3s,transform 0.3s;
- }
-
- &.sidebar--right-on-mobile {
- .sidebar__panel {
- left: auto;
- right: 0;
- transform: translateX(100%);
- }
- }
-
- &.sidebar--is-visible {
- visibility: visible;
- transition: none;
-
- &::after {
- background-color: alpha(var(--color-black), 0.85);
- }
-
- .sidebar__panel {
- transform: translateX(0);
- box-shadow: var(--shadow-md);
- }
- }
-}
-/* end mobile version */
-
-.sidebar__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- position: sticky;
- top: 0;
-}
-
-.sidebar__close-btn {
- --size: 32px;
- width: var(--size);
- height: var(--size);
- display: flex;
- border-radius: 50%;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
- transition: .2s;
- flex-shrink: 0;
-
- .icon {
- display: block;
- margin: auto;
- }
-
- &:hover {
- background-color: var(--color-bg-lighter);
- box-shadow: var(--inner-glow), var(--shadow-md);
- }
-}
-
-/* desktop version only (--static) 👇 */
-.sidebar--static {
- flex-shrink: 0;
- flex-grow: 1;
-
- .sidebar__header {
- display: none;
- }
-}
-
-.sidebar--sticky-on-desktop {
- position: sticky;
- top: var(--space-sm);
- max-height: calc(100vh - var(--space-sm));
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-/* end desktop version */
-
-.sidebar--loaded {
- opacity: 1;
-}
-
-
-.sidebar--static::before {
- content: 'static';
-}
-
-@each $breakpoint, $value in $breakpoints {
- .sidebar--static\@#{$breakpoint}::before {
- content: 'mobile';
- @include breakpoint(#{$breakpoint}) {
- content: 'static';
- }
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/components/select-autocomplete.scss b/apps/web-shared/src/styles/components/select-autocomplete.scss
deleted file mode 100644
index d5360ff..0000000
--- a/apps/web-shared/src/styles/components/select-autocomplete.scss
+++ /dev/null
@@ -1,176 +0,0 @@
-@use '../base' as *;
-@use 'autocomplete.scss' as *;
-
-/* --------------------------------
-
-File#: _3_select-autocomplete
-Title: Select Autocomplete
-Descr: Selection dropdown with autocomplete
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.select-auto {
- &.autocomplete {
- --autocomplete-dropdown-vertical-gap: 4px; // gap between input and results list
- --autocomplete-dropdown-max-height: 250px;
- --autocomplete-dropdown-scrollbar-width: 6px; // custom scrollbar - webkit browsers
- }
-}
-
-// input
-.select-auto__input-wrapper {
- --input-btn-size: 1.25em; // btn/icon size
- --input-btn-icon-size: 16px; // btn/icon size
- --input-btn-text-gap: var(--space-xxs); // gap between button/icon and text
-
- position: relative;
- background: var(--color-bg-dark);
- line-height: 1.2;
- box-shadow: inset 0 0 0 1px var(--color-contrast-lower);
-
- &.multiple {
- display: flex;
- flex-direction: row;
- flex-flow: wrap;
-
- .chip {
- white-space: nowrap;
- margin-right: 1px;
- }
-
- input[type="text"] {
- width: auto;
- }
-
- @media (max-width: 756px) {
- flex-flow: column !important;
-
- &.has-selection {
- input[type="text"] {
- margin-top: 5px;
- }
-
- .chip {
- justify-content: space-between;
-
- .chip__btn {
- margin-right: 0 !important;;
- }
- }
- }
- }
- }
-
- &::placeholder {
- opacity: 1;
- color: var(--color-contrast-low);
- }
-
- &:focus-within,
- .focus {
- background: var(--color-bg);
- box-shadow: inset 0 0 0 1px alpha(var(--color-contrast-lower), 0), 0px 0px 0px 1px var(--color-primary);
- outline: none;
- }
-
- .form-control {
- width: 100%;
- height: 100%;
- padding-right: calc(var(--form-control-padding-x) + var(--input-btn-size) + var(--input-btn-text-gap));
- }
-}
-
-
-.select-auto__input-icon-wrapper {
- width: var(--input-btn-size);
- height: var(--input-btn-size);
-
- position: absolute;
- bottom: calc(var(--input-btn-size) / 3);
- right: var(--form-control-padding-x);
- display: flex;
- pointer-events: none;
-
- .icon {
- display: block;
- margin: auto;
- width: var(--input-btn-icon-size, 16px);
- height: var(--input-btn-icon-size, 16px);
- }
-}
-
-.select-auto__input-btn {
- display: none;
- justify-content: center;
- align-items: center;
- width: inherit;
- height: inherit;
- pointer-events: auto;
- cursor: pointer;
- color: var(--color-contrast-medium); // icon color
-
- &:hover {
- color: var(--color-contrast-high);
- }
-}
-
-.select-auto--selection-done {
- .select-auto__input-icon-wrapper > .icon {
- display: none;
- }
-
- .select-auto__input-btn {
- display: flex;
- }
-}
-
-// dropdown
-.select-auto__results {
- // reset spacing and typography
- @include spaceUnit(1rem);
- @include textUnit(1rem);
-}
-
-// single result item
-.select-auto__option {
- position: relative;
- cursor: pointer;
-
- &:hover {
- background-color: alpha(var(--color-contrast-higher), 0.05);
- }
-
- &:focus,
- &.focus {
- outline: none;
- background-color: alpha(var(--color-primary), 0.12);
- }
-
- &.select-auto__option--selected {
- background-color: var(--color-primary);
- color: var(--color-white);
- padding-right: calc(1em + var(--space-sm));
- @include fontSmooth;
-
- &:focus,
- .focus {
- background-color: var(--color-primary-dark);
- }
-
- &::after {
- content: '';
- position: absolute;
- right: var(--space-sm);
- top: calc(50% - 0.5em);
- height: 1em;
- width: 1em;
- background-color: currentColor;
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpolyline stroke-width='2' stroke='%23ffffff' fill='none' stroke-linecap='round' stroke-linejoin='round' points='1,9 5,13 15,3 '/%3E%3C/svg%3E");
- }
- }
-}
-
-.select-auto__group-title, .select-auto__no-results-msg {
- outline: none;
-}
diff --git a/apps/web-shared/src/styles/components/side-navigation-v4.scss b/apps/web-shared/src/styles/components/side-navigation-v4.scss
deleted file mode 100644
index c2c13d2..0000000
--- a/apps/web-shared/src/styles/components/side-navigation-v4.scss
+++ /dev/null
@@ -1,237 +0,0 @@
-@use '../base' as *;
-@use 'responsive-sidebar.scss' as *;
-
-/* --------------------------------
-
-File#: _2_side-navigation-v4
-Title: Side Navigation v4
-Descr: Main, side navigation
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.sidenav-v4 {
- --sidenav-v4-icon-size: 20px;
- --sidenav-v4-icon-margin-right: var(--space-xxs);
-}
-
-.sidenav-v4__item {
- position: relative;
-}
-
-.sidenav-v4__link,
-.sidenav-v4__sub-link,
-.sidenav-v4__separator {
- padding: var(--space-sm);
-}
-
-.sidenav-v4__link, .sidenav-v4__sub-link {
- display: flex;
- align-items: center;
-
- width: 100%;
- border-radius: var(--radius-md);
-
- text-decoration: none;
- color: inherit;
- line-height: 1;
- font-size: var(--text-md);
-
- transition: .2s;
-
- &:hover {
- color: var(--color-primary);
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
-
- &[aria-current="page"] {
- color: var(--color-primary);
- }
-}
-
-.sidenav-v4__sub-link {
- position: relative;
- color: var(--color-contrast-medium);
-
- /* dot indicator */
- &::before {
- content: '';
- display: block;
- --size: 6px;
- width: var(--size);
- height: var(--size);
- background: currentColor;
- border-radius: 50%;
- margin-left: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2);
- margin-right: calc(var(--sidenav-v4-icon-size)/2 - var(--size)/2 + var(--sidenav-v4-icon-margin-right));
-
- opacity: 0; /* visible only if current */
- }
-
- &[aria-current="page"] {
- &::before { /* show dot indicator */
- opacity: 1;
- }
- }
-}
-
-.sidenav-v4__notification-marker {
- margin-left: auto;
- background-color: var(--color-accent);
- border-radius: var(--radius-md);
-
- height: 16px;
- line-height: 16px;
- padding: 0 4px;
- color: var(--color-white);
- font-size: 12px;
-
- /* hide - visible only on desktop */
- display: none;
-}
-
-/* label icon */
-.sidenav-v4__icon {
- --size: var(--sidenav-v4-icon-size);
- margin-right: var(--sidenav-v4-icon-margin-right);
-}
-
-/* arrow icon - visible on mobile if item is expandable */
-.sidenav-v4__arrow-icon {
- --size: 20px;
-
- .icon__group {
- will-change: transform;
- transform-origin: 50% 50%;
- transform: rotate(-90deg);
- transition: transform .3s var(--ease-out);
-
- > * {
- transform-origin: 50% 50%;
- stroke-dasharray: 20;
- stroke-dashoffset: 0;
- transform: translateY(0px);
- transition: transform .3s, stroke-dashoffset .3s;
- transition-timing-function: var(--ease-out);
- }
-
- .sidenav-v4__item--collapsed & {
- transform: rotate(0deg);
-
- > * {
- transform: translateY(4px);
- }
-
- > *:first-child {
- stroke-dashoffset: 10.15;
- }
-
- > *:last-child {
- stroke-dashoffset: 10.15;
- }
- }
- }
-
- /* hide icon for links - show only for buttons created in JS */
- .sidenav-v4__link--href & {
- display: none;
- }
-}
-
-/* current item */
-.sidenav-v4__item--current {
- .sidenav-v4__sub-list {
- display: block; /* show sublist */
- }
-}
-
-/* separator */
-.sidenav-v4__separator {
- span {
- display: block;
- width: var(--sidenav-v4-icon-size);
- height: 1px;
- background-color: var(--color-contrast-lower);
- }
-}
-
-/* mobile only */
-@include breakpoint(md, "not all") {
- .sidenav-v4__item--collapsed {
- .sidenav-v4__sub-list {
- display: none;
- }
- }
-
- .sidenav-v4__link--href {
- display: none; /* hide link -> show button */
- }
-}
-
-/* desktop */
-@include breakpoint(md) {
- .sidenav-v4__sub-list {
- display: none;
- }
-
- .sidenav-v4__link,
- .sidenav-v4__sub-link,
- .sidenav-v4__separator {
- padding: var(--space-xs);
- }
-
- .sidenav-v4__link,
- .sidenav-v4__sub-link {
- font-size: var(--text-sm);
- }
-
- .sidenav-v4__link--btn {
- display: none; /* hide button -> show link */
- }
-
- /* tooltip */
- .sidenav-v4__item:not(.sidenav-v4__item--current) {
- .sidenav-v4__sub-list {
- width: 220px;
- position: absolute;
- z-index: var(--z-index-overlay);
- left: 100%;
- top: 0;
-
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-md);
- border-radius: var(--radius-md);
-
- overflow: hidden;
- }
-
- .sidenav-v4__sub-link {
- border-radius: 0;
- color: var(--color-contrast-high);
-
- &::before {
- display: none; /* remove dot indicator */
- }
-
- &:hover {
- color: var(--color-primary);
- }
- }
-
- &.sidenav-v4__item--hover, &:focus-within {
- .sidenav-v4__sub-list {
- display: block;
- }
- }
-
- &:hover .sidenav-v4__link { /* highlight main link if tooltip is visible */
- color: var(--color-primary);
- background-color: alpha(var(--color-contrast-higher), 0.075);
- }
- }
-
- /* notification marker */
- .sidenav-v4__notification-marker {
- display: block;
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/components/tabbed-navigation.scss b/apps/web-shared/src/styles/components/tabbed-navigation.scss
deleted file mode 100644
index 4090fca..0000000
--- a/apps/web-shared/src/styles/components/tabbed-navigation.scss
+++ /dev/null
@@ -1,133 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_tabbed-navigation-v2
-Title: Tabbed Navigation v2
-Descr: Tabbed (secondary) navigation
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.tabs-nav-v2 {
- display: flex;
- flex-wrap: wrap;
-
- .tab-v2 {
- display: inline-block; // flexbox fallback
- display: inline-flex;
- align-items: center;
- }
-}
-
-.tabs-nav-v2__item {
- display: inline-block;
- padding: var(--space-xxs) var(--space-sm);
- color: inherit;
- white-space: nowrap;
- text-decoration: none;
-}
-
-.tabs-nav-v2__item--selected,
-.tabs-nav-v2__item[aria-selected="true"] {
- color: var(--color-bg);
- background-color: var(--color-contrast-higher);
-}
-
-@include breakpoint(md) {
- .tabs-nav-v2 {
- .tab-v2 {
- margin: 0;
- }
- }
-
- .tabs-nav-v2__item {
- background-color: transparent;
- margin: var(--space-xxs) var(--space-sm);
- padding: var(--space-xxxs) var(--space-xxs) !important;
- border-radius: var(--radius-md);
-
- &:hover {
- background-color: alpha(var(--color-primary), 0.035);
- color: var(--color-primary);
- }
- }
-
- .tabs-nav-v2__item--selected,
- .tabs-nav-v2__item[aria-selected="true"] {
-
- background-color: alpha(var(--color-primary), 0.075);
- color: var(--color-primary);
- position: relative;
-
- &::after {
- content: '';
- position: absolute;
- bottom: calc(var(--tabs-nav-border-width) * -1);
- left: 0;
- width: 100%;
- height: var(--tabs-nav-border-width);
- background-color: var(--color-bg);
- }
-
- &:hover {
- background-color: alpha(var(--color-primary), 0.075);
- }
- }
-}
-
-:root {
- --s-tabs-border-bottom-width: 1px;
- --s-tabs-selected-item-border-bottom-width: 1px;
-}
-
-.s-tabs {
- position: relative;
-
- &::after { /* gradient - truncate text */
- content: '';
- position: absolute;
- right: -1px;
- top: 0;
- height: calc(100% - var(--s-tabs-border-bottom-width));
- width: 2em;
- pointer-events: none;
- z-index: 1;
- }
-}
-
-.s-tabs__list {
- display: flex;
- overflow: auto;
- -webkit-overflow-scrolling: auto;
-
- &::after { /* border bottom */
- content: '';
- position: absolute;
- width: 100%;
- height: var(--s-tabs-border-bottom-width);
- left: 0;
- bottom: 0;
- background-color: var(--color-contrast-lower);
- }
-}
-
-.s-tabs__link {
- color: var(--color-contrast-medium);
- text-decoration: none;
- display: inline-block;
- padding: var(--space-xs) var(--space-sm);
- white-space: nowrap;
- border-bottom: var(--s-tabs-selected-item-border-bottom-width) solid transparent;
- z-index: 1;
-
- &:hover:not(.s-tabs__link--current) {
- color: var(--color-contrast-high);
- }
-}
-
-.s-tabs__link--current {
- position: relative;
- color: var(--color-primary);
- border-bottom-color: var(--color-primary);
-}
diff --git a/apps/web-shared/src/styles/components/table.scss b/apps/web-shared/src/styles/components/table.scss
deleted file mode 100644
index af8207f..0000000
--- a/apps/web-shared/src/styles/components/table.scss
+++ /dev/null
@@ -1,147 +0,0 @@
-@use '../base'as *;
-
-/* --------------------------------
-
-File#: _1_table
-Title: Table
-Descr: Data tables used to organize and display information in rows and columns
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-// >>> style affecting all (block + expanded) versions 👇
-.table {
- position: relative;
- z-index: 1;
-}
-
-// <<< end style affecting all versions
-
-// >>> block version only (mobile) 👇
-.table:not(.table--expanded) {
- border-collapse: separate;
- border-spacing: 0 var(--space-md); // row gap
- margin-top: calc(-2 * var(--space-md)); // set spacing variable = row gap ☝️
-
- .table__header {
- // hide table header - but keep it accessible to SR
- @include srHide;
- }
-
- .table__row {
- .table__cell:first-child {
- border-radius: var(--radius-md) var(--radius-md) 0 0;
- }
-
- .table__cell:last-child {
- border-radius: 0 0 var(--radius-md) var(--radius-md);
-
- &::after {
- // hide border bottom
- display: none;
- }
- }
- }
-
- .table__cell {
- position: relative;
- display: flex;
- justify-content: space-between;
- width: 100%;
- text-align: right;
- padding: var(--space-md);
- background-color: var(--color-bg-light);
-
- &::after {
- // border bottom
- content: '';
- position: absolute;
- bottom: 0;
- left: var(--space-md);
- width: calc(100% - (2 * var(--space-md)));
- height: 1px;
- background-color: var(--color-contrast-lower);
- }
- }
-
- .table__label {
- // inline labels -> visible when table header is hidden
- font-weight: bold;
- text-align: left;
- color: var(--color-contrast-higher);
- margin-right: var(--space-md);
- }
-}
-
-// <<< end block version
-
-// >>> expanded version only (desktop) 👇 -> show standard rows and cols
-.table--expanded {
- border-bottom: 1px solid var(--color-contrast-lower); // table border bottom
-
- .table__header {
- .table__cell {
- // header cell style
- position: relative;
- z-index: 10;
- background-color: var(--color-bg);
- border-bottom: 1px solid var(--color-contrast-lower); // header border bottom
- font-weight: bold;
- color: var(--color-contrast-higher);
- }
- }
-
- .table__body {
- .table__row {
- &:nth-child(odd) {
- background-color: alpha(var(--color-bg-dark), 0.85);
- }
- }
- }
-
- .table__cell {
- padding: var(--space-xxxs);
- }
-
- .table__label {
- // hide inline labels
- display: none;
- }
-
- // --header-sticky
- .table__header--sticky {
- .table__cell {
- // header cell style
- position: sticky;
- top: 0;
- }
- }
-}
-
-// <<< end expanded version
-
-.js {
- .table {
- opacity: 0; // hide table while it is initialized in JS
- }
-
- .table--loaded {
- opacity: 1;
- }
-}
-
-// detect when the table needs to switch from the mobile layout to an expanded one - used in JS
-[class*="table--expanded"]::before {
- display: none;
-}
-
-@each $breakpoint,
-$value in $breakpoints {
- .table--expanded\@#{$breakpoint}::before {
- content: 'collapsed';
-
- @include breakpoint(#{$breakpoint}) {
- content: 'expanded';
- }
- }
-}
diff --git a/apps/web-shared/src/styles/components/user-menu.scss b/apps/web-shared/src/styles/components/user-menu.scss
deleted file mode 100644
index 416655f..0000000
--- a/apps/web-shared/src/styles/components/user-menu.scss
+++ /dev/null
@@ -1,81 +0,0 @@
-@use '../base' as *;
-@use 'menu.scss' as *;
-
-/* --------------------------------
-
-File#: _2_user-menu
-Title: User Menu
-Descr: A menu controlled by the user profile image
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-.user-menu-control {
- --profile-figure-size: 40px;
-
- cursor: pointer;
- display: inline-flex;
- align-items: center;
- text-align: left;
-
- &:hover {
- .user-menu-control__img-wrapper {
- opacity: 0.8;
- }
-
- .user-menu__meta-title {
- color: var(--color-primary);
- }
- }
-
- &:focus, &.menu-control--active {
- outline: none;
-
- .user-menu-control__img-wrapper::after {
- opacity: 1;
- transform: scale(1);
- }
- }
-}
-
-.user-menu-control__img-wrapper {
- width: var(--profile-figure-size);
- height: var(--profile-figure-size);
- position: relative;
- //transition: opacity 0.2s;
-
- &::after {
- content: '';
- position: absolute;
- z-index: -1;
- left: -4px;
- top: -4px;
- width: 100%;
- height: 100%;
- border-radius: inherit;
- width: calc(var(--profile-figure-size) + 8px);
- height: calc(var(--profile-figure-size) + 8px);
- border: 2px solid var(--color-primary);
- pointer-events: none;
-
- opacity: 0;
- transform: scale(0.8);
-
- //transition: all 0.2s;
- }
-}
-
-.user-menu-control__img {
- display: block;
- width: 100%;
- object-fit: cover;
- border-radius: inherit;
-}
-
-.user-menu__meta {
- //max-width: 100px;
-}
-
-.user-menu__meta-title {
- //transition: color 0.2s;
-}
diff --git a/apps/web-shared/src/styles/components/vanilla-responsive-sidebar.scss b/apps/web-shared/src/styles/components/vanilla-responsive-sidebar.scss
deleted file mode 100644
index 735cc1e..0000000
--- a/apps/web-shared/src/styles/components/vanilla-responsive-sidebar.scss
+++ /dev/null
@@ -1,146 +0,0 @@
-@use '../base' as *;
-
-/* --------------------------------
-
-File#: _1_responsive-sidebar
-Title: Responsive Sidebar
-Descr: Responsive sidebar container
-Usage: codyhouse.co/license
-
--------------------------------- */
-
-/* mobile version only (--default) 👇 */
-.sidebar:not(.sidebar--static) {
- position: fixed;
- top: 0;
- left: 0;
- z-index: var(--z-index-fixed-element, 10);
- width: 100%;
- height: 100%;
- visibility: hidden;
- transition: visibility 0s 0.3s;
-
- &::after { /* overlay layer */
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: alpha(var(--color-black), 0);
- transition: background-color .3s;
- z-index: 1;
- }
-
- .sidebar__panel { /* content */
- position: absolute;
- top: 0;
- left: 0;
- z-index: 2;
- width: 100%;
- max-width: 380px;
- height: 100%;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- background-color: var(--color-bg);
- transform: translateX(-100%);
- transition: box-shadow 0.3s, transform 0.3s;
- }
-
- &.sidebar--right-on-mobile {
- .sidebar__panel {
- left: auto;
- right: 0;
- transform: translateX(100%);
- }
- }
-
- &.sidebar--is-visible {
- visibility: visible;
- transition: none;
-
- &::after {
- background-color: alpha(var(--color-black), 0.85);
- }
-
- .sidebar__panel {
- transform: translateX(0);
- box-shadow: var(--shadow-md);
- }
- }
-}
-
-/* end mobile version */
-
-.sidebar__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- position: sticky;
- top: 0;
-}
-
-.sidebar__close-btn {
- --size: 32px;
- width: var(--size);
- height: var(--size);
- display: flex;
- border-radius: 50%;
- background-color: var(--color-bg-light);
- box-shadow: var(--inner-glow), var(--shadow-sm);
- transition: .2s;
- flex-shrink: 0;
-
- .icon {
- display: block;
- margin: auto;
- }
-
- &:hover {
- background-color: var(--color-bg-lighter);
- box-shadow: var(--inner-glow), var(--shadow-md);
- }
-}
-
-.sidebar__footer {
- background-color: var(--color-bg);
-}
-
-/* desktop version only (--static) 👇 */
-.sidebar--static {
- flex-shrink: 0;
- flex-grow: 1;
- width: 100%;
- max-width: 320px;
-
- .sidebar__header {
- display: none;
- }
-
- .sidebar__footer {
- background-color: var(--color-bg-dark);
- }
-}
-
-.sidebar--sticky-on-desktop {
- position: sticky;
- top: var(--space-sm);
- max-height: calc(100vh - var(--space-sm));
- overflow: auto;
- -webkit-overflow-scrolling: touch;
-}
-
-/* end desktop version */
-
-.sidebar--static::before {
- content: 'static';
-}
-
-@each $breakpoint, $value in $breakpoints {
- .sidebar--static\@#{$breakpoint}::before {
- content: 'mobile';
- @include breakpoint(#{$breakpoint}) {
- content: 'static';
- }
- }
-}
diff --git a/apps/web-shared/src/styles/custom-style/_buttons.scss b/apps/web-shared/src/styles/custom-style/_buttons.scss
deleted file mode 100644
index 2145acc..0000000
--- a/apps/web-shared/src/styles/custom-style/_buttons.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-@use '../base' as *;
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/buttons
-
-// --------------------------------
-
-:root {
- --btn-font-size: 1rem;
- --btn-padding-x: var(--space-xs);
- --btn-padding-y: var(--space-xxxs);
- --btn-radius: 5px;
-}
-
-.btn {
- background: var(--color-bg-dark);
- color: var(--color-contrast-higher);
- cursor: pointer;
- font-family: var(--font-primary);
- font-weight: 400;
- text-decoration: none;
- line-height: 0.8;
- @include fontSmooth;
- outline: none;
-
- &:hover {
- background: var(--color-bg-darker);
- }
-
- &:focus {
- outline: 1px solid var(--color-contrast-lower);
- }
-}
-
-// themes
-.btn--primary {
- background: var(--color-primary);
- color: var(--color-white);
-
- &:hover {
- background: var(--color-primary-light);
- box-shadow: inset 0px 1px 0px alpha(var(--color-white), 0.15), 0px 1px 2px alpha(var(--color-primary-darker), 0.25), 0px 1px 4px alpha(var(--color-primary-darker), 0.1), 0px 3px 6px -2px alpha(var(--color-primary-darker), 0.25);
- }
-}
-
-.btn--subtle {
- background: var(--color-bg-lighter);
- color: var(--color-contrast-higher);
-
- &:hover {
- background: var(--color-bg-light);
- }
-}
-
-.btn--accent {
- background: var(--color-accent);
- color: var(--color-white);
-
- &:hover {
- background: var(--color-accent-light);
- box-shadow: inset 0px 1px 0px alpha(var(--color-white), 0.15), 0px 1px 2px alpha(var(--color-accent-darker), 0.25), 0px 1px 4px alpha(var(--color-accent-darker), 0.1), 0px 3px 6px -2px alpha(var(--color-accent-darker), 0.1);
- }
-}
-
-// feedback
-.btn--disabled, .btn[disabled], .btn[readonly] {
- opacity: 0.6;
- cursor: not-allowed;
-}
-
-// size
-.btn--sm {
- font-size: 0.8rem;
-}
-
-.btn--md {
- font-size: 1.2rem;
-}
-
-.btn--lg {
- font-size: 1.4rem;
-}
-
-// --------------------------------
-
-// (END) Global editor code
-
-// -------------------------------- \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_colors.scss b/apps/web-shared/src/styles/custom-style/_colors.scss
deleted file mode 100644
index 97b620f..0000000
--- a/apps/web-shared/src/styles/custom-style/_colors.scss
+++ /dev/null
@@ -1,119 +0,0 @@
-@use '../base' as *;
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/colors
-
-// --------------------------------
-
-:root, [data-theme="default"] {
- // main
- @include defineColorHSL(--color-primary-darker, 210, 92%, 32%);
- @include defineColorHSL(--color-primary-dark, 210, 92%, 38%);
- @include defineColorHSL(--color-primary, 210, 92%, 44%);
- @include defineColorHSL(--color-primary-light, 210, 92%, 50%);
- @include defineColorHSL(--color-primary-lighter, 210, 92%, 56%);
-
- @include defineColorHSL(--color-accent-darker, 350, 47%, 30%);
- @include defineColorHSL(--color-accent-dark, 350, 47%, 36%);
- @include defineColorHSL(--color-accent, 350, 47%, 42%);
- @include defineColorHSL(--color-accent-light, 350, 47%, 48%);
- @include defineColorHSL(--color-accent-lighter, 350, 47%, 54%);
-
- @include defineColorHSL(--color-black, 0, 0%, 10%);
- @include defineColorHSL(--color-white, 0, 0%, 100%);
-
- // feedback
- @include defineColorHSL(--color-warning-darker, 25, 75%, 60%);
- @include defineColorHSL(--color-warning-dark, 25, 75%, 66%);
- @include defineColorHSL(--color-warning, 25, 75%, 72%);
- @include defineColorHSL(--color-warning-light, 25, 75%, 78%);
- @include defineColorHSL(--color-warning-lighter, 25, 75%, 84%);
-
- @include defineColorHSL(--color-success-darker, 143, 45%, 59%);
- @include defineColorHSL(--color-success-dark, 143, 45%, 65%);
- @include defineColorHSL(--color-success, 143, 45%, 71%);
- @include defineColorHSL(--color-success-light, 143, 45%, 77%);
- @include defineColorHSL(--color-success-lighter, 143, 45%, 83%);
-
- @include defineColorHSL(--color-error-darker, 342, 89%, 38%);
- @include defineColorHSL(--color-error-dark, 342, 89%, 43%);
- @include defineColorHSL(--color-error, 342, 89%, 48%);
- @include defineColorHSL(--color-error-light, 342, 89%, 56%);
- @include defineColorHSL(--color-error-lighter, 342, 89%, 62%);
-
- // background
- @include defineColorHSL(--color-bg-darker, 240, 2%, 90%);
- @include defineColorHSL(--color-bg-dark, 240, 3%, 94%);
- @include defineColorHSL(--color-bg, 0, 0%, 100%);
- @include defineColorHSL(--color-bg-light, 240, 3%, 100%);
- @include defineColorHSL(--color-bg-lighter, 240, 2%, 100%);
-
- // color contrasts
- @include defineColorHSL(--color-contrast-lower, 240, 1%, 85%);
- @include defineColorHSL(--color-contrast-low, 240, 2%, 66%);
- @include defineColorHSL(--color-contrast-medium, 230, 2%, 48%);
- @include defineColorHSL(--color-contrast-high, 223, 6%, 25%);
- @include defineColorHSL(--color-contrast-higher, 225, 14%, 11%);
-}
-
-[data-theme="dark"] {
- // main
- @include defineColorHSL(--color-primary-darker, 250, 100%, 60%);
- @include defineColorHSL(--color-primary-dark, 250, 100%, 64%);
- @include defineColorHSL(--color-primary, 250, 100%, 69%);
- @include defineColorHSL(--color-primary-light, 250, 100%, 72%);
- @include defineColorHSL(--color-primary-lighter, 250, 100%, 76%);
-
- @include defineColorHSL(--color-accent-darker, 342, 92%, 41%);
- @include defineColorHSL(--color-accent-dark, 342, 92%, 47%);
- @include defineColorHSL(--color-accent, 342, 92%, 54%);
- @include defineColorHSL(--color-accent-light, 342, 92%, 60%);
- @include defineColorHSL(--color-accent-lighter, 342, 92%, 65%);
-
- @include defineColorHSL(--color-black, 230, 13%, 9%);
- @include defineColorHSL(--color-white, 0, 0%, 100%);
-
- // feedback
- @include defineColorHSL(--color-warning-darker, 35, 79%, 48%);
- @include defineColorHSL(--color-warning-dark, 35, 79%, 56%);
- @include defineColorHSL(--color-warning, 35, 79%, 66%);
- @include defineColorHSL(--color-warning-light, 35, 79%, 74%);
- @include defineColorHSL(--color-warning-lighter, 35, 79%, 82%);
-
- @include defineColorHSL(--color-success-darker, 170, 78%, 26%);
- @include defineColorHSL(--color-success-dark, 170, 78%, 31%);
- @include defineColorHSL(--color-success, 170, 78%, 36%);
- @include defineColorHSL(--color-success-light, 170, 78%, 42%);
- @include defineColorHSL(--color-success-lighter, 170, 78%, 47%);
-
- @include defineColorHSL(--color-error-darker, 342, 92%, 41%);
- @include defineColorHSL(--color-error-dark, 342, 92%, 47%);
- @include defineColorHSL(--color-error, 342, 92%, 54%);
- @include defineColorHSL(--color-error-light, 342, 92%, 60%);
- @include defineColorHSL(--color-error-lighter, 342, 92%, 65%);
-
- // background
- @include defineColorHSL(--color-bg-darker, 232, 7%, 8%);
- @include defineColorHSL(--color-bg-dark, 233, 8%, 11%);
- @include defineColorHSL(--color-bg, 232, 11%, 15%);
- @include defineColorHSL(--color-bg-light, 233, 8%, 19%);
- @include defineColorHSL(--color-bg-lighter, 232, 7%, 22%);
-
- // color contrasts
- @include defineColorHSL(--color-contrast-lower, 240, 6%, 26%);
- @include defineColorHSL(--color-contrast-low, 240, 3%, 41%);
- @include defineColorHSL(--color-contrast-medium, 213, 3%, 57%);
- @include defineColorHSL(--color-contrast-high, 240, 5%, 82%);
- @include defineColorHSL(--color-contrast-higher, 240, 100%, 99%);
-
- // font rendering
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-// --------------------------------
-
-// (END) Global editor code
-
-// -------------------------------- \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_forms.scss b/apps/web-shared/src/styles/custom-style/_forms.scss
deleted file mode 100644
index 871e405..0000000
--- a/apps/web-shared/src/styles/custom-style/_forms.scss
+++ /dev/null
@@ -1,58 +0,0 @@
-@use '../base' as *;
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/forms
-
-// --------------------------------
-
-:root {
- --form-control-font-size: 1rem;
- --form-control-padding-x: var(--space-xs);
- --form-control-padding-y: var(--space-xxs);
- --form-control-radius: 3px;
-}
-
-.form-control {
- background: var(--color-bg-dark);
- cursor: auto;
- font-family: var(--font-primary);
- font-weight: 400;
- line-height: 1;
- @include fontSmooth;
- outline: 1px solid var(--color-contrast-high);
-
- &::placeholder {
- opacity: 1;
- color: var(--color-contrast-low);
- }
-
- &:focus, &:focus-within {
- background: var(--color-bg);
- box-shadow: inset 0px 0px 0px 1px alpha(var(--color-contrast-lower), 0), 0px 0px 0px 2px var(--color-primary), 0px 1px 3px alpha(var(--color-black), 0.2);
- outline: none;
- }
-}
-
-.form-control--disabled, .form-control[disabled], .form-control[readonly] {
- opacity: 0.3;
- cursor: not-allowed;
-}
-
-.form-control[aria-invalid="true"], .form-control.form-control--error {
- outline: 1px solid var(--color-error-dark);
-
- &:focus, &:focus-within {
- box-shadow: inset 0px 0px 0px 1px alpha(var(--color-contrast-lower), 0), 0px 0px 0px 2px var(--color-error), 0px 1px 3px var(--color-error);
- }
-}
-
-.form-legend {}
-
-.form-label {}
-
-// --------------------------------
-
-// (END) Global editor code
-
-// -------------------------------- \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_icons.scss b/apps/web-shared/src/styles/custom-style/_icons.scss
deleted file mode 100644
index a9fcb46..0000000
--- a/apps/web-shared/src/styles/custom-style/_icons.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-@use '../base' as *;
-
-:root {
- // size - 👇 uncomment to modify default icon sizes
- // --icon-xxxs: 8px;
- // --icon-xxs: 12px;
- // --icon-xs: 16px;
- // --icon-sm: 24px;
- // --icon-md: 32px;
- // --icon-lg: 48px;
- // --icon-xl: 64px;
- // --icon-xxl: 96px;
- // --icon-xxxl: 128px;
-}
-
-.icon {
- // 👇 include the font-family declaration here if you are using an icon font
- // font-family: 'fontName';
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_shared-styles.scss b/apps/web-shared/src/styles/custom-style/_shared-styles.scss
deleted file mode 100644
index 313fc69..0000000
--- a/apps/web-shared/src/styles/custom-style/_shared-styles.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-@use '../base' as *;
-
-:root {
- // radius
- --radius: 0.375em; // border radius base size
- // 👇 uncomment to modify default radius values
- // --radius-sm: calc(var(--radius)/2);
- // --radius-md: var(--radius);
- // --radius-lg: calc(var(--radius)*2);
-
- // box shadow - 👇 uncomment to modify default shadow values
- // --shadow-xs: 0 0.1px 0.3px rgba(0, 0, 0, 0.06),
- // 0 1px 2px rgba(0, 0, 0, 0.12);
- // --shadow-sm: 0 0.3px 0.4px rgba(0, 0, 0, 0.025),
- // 0 0.9px 1.5px rgba(0, 0, 0, 0.05),
- // 0 3.5px 6px rgba(0, 0, 0, 0.1);
- // --shadow-md: 0 0.9px 1.5px rgba(0, 0, 0, 0.03),
- // 0 3.1px 5.5px rgba(0, 0, 0, 0.08),
- // 0 14px 25px rgba(0, 0, 0, 0.12);
- // --shadow-lg: 0 1.2px 1.9px -1px rgba(0, 0, 0, 0.014),
- // 0 3.3px 5.3px -1px rgba(0, 0, 0, 0.038),
- // 0 8.5px 12.7px -1px rgba(0, 0, 0, 0.085),
- // 0 30px 42px -1px rgba(0, 0, 0, 0.15);
- // --shadow-xl: 0 1.5px 2.1px -6px rgba(0, 0, 0, 0.012),
- // 0 3.6px 5.2px -6px rgba(0, 0, 0, 0.035),
- // 0 7.3px 10.6px -6px rgba(0, 0, 0, 0.07),
- // 0 16.2px 21.9px -6px rgba(0, 0, 0, 0.117),
- // 0 46px 60px -6px rgba(0, 0, 0, 0.2);
- // --inner-glow: inset 0 0 0.5px 1px hsla(0, 0%, 100%, 0.075);
- // --inner-glow-top: inset 0 1px 0.5px hsla(0, 0%, 100%, 0.075);
-}
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/shared-styles
-
-// --------------------------------
-
-.hover\:reduce-opacity {
- opacity: 1;
-
- &:hover {
- opacity: 0.8;
- }
-}
-
-.hover\:elevate {
- box-shadow: var(--shadow-sm);
-
- &:hover {
- box-shadow: var(--shadow-md);
- }
-}
-
-// text styles
-.link-subtle {
- color: inherit;
- cursor: pointer;
- text-decoration: none;
-
- &:hover {
- color: var(--color-primary);
- }
-}
-
-// --------------------------------
-
-// (END) Global editor code
-
-// -------------------------------- \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_spacing.scss b/apps/web-shared/src/styles/custom-style/_spacing.scss
deleted file mode 100644
index d78d897..0000000
--- a/apps/web-shared/src/styles/custom-style/_spacing.scss
+++ /dev/null
@@ -1,49 +0,0 @@
-@use '../base' as *;
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/spacing
-
-// --------------------------------
-
-// 👇 uncomment to modify default spacing scale
-// :root {
-// --space-unit: 1rem;
-// }
-
-// :root, * {
-// --space-xxxxs: calc(0.125 * var(--space-unit));
-// --space-xxxs: calc(0.25 * var(--space-unit));
-// --space-xxs: calc(0.375 * var(--space-unit));
-// --space-xs: calc(0.5 * var(--space-unit));
-// --space-sm: calc(0.75 * var(--space-unit));
-// --space-md: calc(1.25 * var(--space-unit));
-// --space-lg: calc(2 * var(--space-unit));
-// --space-xl: calc(3.25 * var(--space-unit));
-// --space-xxl: calc(5.25 * var(--space-unit));
-// --space-xxxl: calc(8.5 * var(--space-unit));
-// --space-xxxxl: calc(13.75 * var(--space-unit));
-// --component-padding: var(--space-md);
-// }
-
-@include breakpoint(md) {
- :root, * {
- --space-xxxxs: calc(0.1875 * var(--space-unit));
- --space-xxxs: calc(0.375 * var(--space-unit));
- --space-xxs: calc(0.5625 * var(--space-unit));
- --space-xs: calc(0.75 * var(--space-unit));
- --space-sm: calc(1.125 * var(--space-unit));
- --space-md: calc(2 * var(--space-unit));
- --space-lg: calc(3.125 * var(--space-unit));
- --space-xl: calc(5.125 * var(--space-unit));
- --space-xxl: calc(8.25 * var(--space-unit));
- --space-xxxl: calc(13.25 * var(--space-unit));
- --space-xxxxl: calc(21.5 * var(--space-unit));
- }
-}
-
-// --------------------------------
-
-// (END) Global editor code
-
-// -------------------------------- \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_typography.scss b/apps/web-shared/src/styles/custom-style/_typography.scss
deleted file mode 100644
index 7fa98c5..0000000
--- a/apps/web-shared/src/styles/custom-style/_typography.scss
+++ /dev/null
@@ -1,95 +0,0 @@
-@use '../base' as *;
-
-// --------------------------------
-
-// (START) Global editor code https://codyhouse.co/ds/globals/typography
-
-// --------------------------------
-
-:root {
- // font family
- --font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-
- // font size
- --text-base-size: 1rem; // body font-size
- --text-scale-ratio: 1.2; // multiplier used to generate the type scale values 👇
-
- // line-height
- --body-line-height: 1;
- --heading-line-height: 1;
-
- // capital letters - used in combo with the lhCrop mixin
- --font-primary-capital-letter: 1;
-
- // unit - don't modify unless you want to change the typography unit (e.g., from Rem to Em units)
- --text-unit: var(--text-base-size); // if Em units → --text-unit: 1em;
-}
-
-:root, * {
- // type scale
- --text-xs: calc((var(--text-unit) / var(--text-scale-ratio)) / var(--text-scale-ratio));
- --text-sm: calc(var(--text-xs) * var(--text-scale-ratio));
- --text-md: calc(var(--text-sm) * var(--text-scale-ratio) * var(--text-scale-ratio));
- --text-lg: calc(var(--text-md) * var(--text-scale-ratio));
- --text-xl: calc(var(--text-lg) * var(--text-scale-ratio));
- --text-xxl: calc(var(--text-xl) * var(--text-scale-ratio));
- --text-xxxl: calc(var(--text-xxl) * var(--text-scale-ratio));
- --text-xxxxl: calc(var(--text-xxxl) * var(--text-scale-ratio));
-}
-
-body {
- font-family: var(--font-primary);
-}
-
-h1, h2, h3, h4 {
- font-family: var(--font-primary);
- --heading-font-weight: 600;
-}
-
-// font family
-.font-primary { font-family: var(--font-primary); }
-
-// --------------------------------
-
-// (END) Global editor code
-
-// --------------------------------
-
-// link style
-a, .link {}
-
-mark {
- background-color: alpha(var(--color-accent), 0.2);
- color: inherit;
-}
-
-.text-component {
- --line-height-multiplier: 1;
- --text-space-y-multiplier: 1;
-
- > * { // use Em units
- --text-unit: 1em;
- --space-unit: 1em;
- }
-
- blockquote {
- padding-left: 1em;
- border-left: 4px solid var(--color-contrast-lower);
- font-style: italic;
- }
-
- hr {
- background: var(--color-contrast-lower);
- height: 1px;
- }
-
- figcaption {
- font-size: var(--text-sm);
- color: var(--color-contrast-low);
- }
-}
-
-.article { // e.g., blog posts
- --body-line-height: 1.58; // set body line-height
- --text-space-y-multiplier: 1.2; // control vertical spacing
-} \ No newline at end of file
diff --git a/apps/web-shared/src/styles/custom-style/_util.scss b/apps/web-shared/src/styles/custom-style/_util.scss
deleted file mode 100644
index 4b86e73..0000000
--- a/apps/web-shared/src/styles/custom-style/_util.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-@use '../base' as *;
-
-.border-none {
- border: none !important;
-}
-
-// 👇 (optional) create responsive variations - edit only [my-util-class, property, value]
-// @each $breakpoint, $value in $breakpoints {
-// @include breakpoint(#{$breakpoint}) {
-// .my-util-class\@#{$breakpoint} {
-// property: value;
-// }
-// }
-.left-unset {
- left: unset !important;
-}
-
-.cursor-wait {
- cursor: wait !important;
-}
-
-.bg-error-lighter\@hover {
- &:hover,
- &:active {
- background-color: var(--color-error-lighter) !important;
- }
-}
-
-.color-white\@hover {
- &:hover,
- &:active {
- color: var(--color-white) !important;
- }
-} \ No newline at end of file
diff --git a/apps/web-shared/tsconfig.json b/apps/web-shared/tsconfig.json
deleted file mode 100644
index 7716e44..0000000
--- a/apps/web-shared/tsconfig.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "include": [
- "./src/**/*.d.ts",
- "./src/**/*.ts",
- "./src/**/*.js",
- "./src/**/*.svelte"
- ],
- "exclude": [
- "./node_modules"
- ],
- "compilerOptions": {
- "target": "esnext",
- "useDefineForClassFields": true,
- "module": "esnext",
- "moduleResolution": "node",
- "allowJs": true,
- "checkJs": false,
- "paths": {
- "$shared/*": [
- "./src/*"
- ]
- }
- }
-}