rune-lab 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +12 -0
- package/README.md +3 -3
- package/deno.json +50 -0
- package/justfile +5 -0
- package/package.json +2 -79
- package/scripts/build_pkg.ts +51 -0
- package/scripts/ci.just +26 -0
- package/scripts/deploy.just +21 -0
- package/scripts/dev.just +4 -0
- package/scripts/inject.just +72 -0
- package/src/RuneProvider.svelte +105 -0
- package/src/i18n/message-resolver.test.ts +103 -0
- package/src/i18n/message-resolver.ts +89 -0
- package/src/i18n/project.inlang/settings.json +26 -0
- package/src/i18n/translations/ar.json +89 -0
- package/src/i18n/translations/de.json +89 -0
- package/src/i18n/translations/en.json +89 -0
- package/src/i18n/translations/es.json +89 -0
- package/src/i18n/translations/fr.json +89 -0
- package/src/i18n/translations/hi.json +89 -0
- package/src/i18n/translations/it.json +89 -0
- package/src/i18n/translations/ja.json +89 -0
- package/src/i18n/translations/ko.json +89 -0
- package/src/i18n/translations/pt.json +89 -0
- package/src/i18n/translations/ru.json +89 -0
- package/src/i18n/translations/vi.json +89 -0
- package/src/i18n/translations/zh.json +89 -0
- package/src/kernel/deno.json +5 -0
- package/src/kernel/src/actions/portal.ts +41 -0
- package/src/kernel/src/actions/shortcut-listener.ts +50 -0
- package/src/kernel/src/context/app.svelte.ts +98 -0
- package/src/kernel/src/context/context.ts +31 -0
- package/src/kernel/src/context/stores.svelte.ts +96 -0
- package/src/kernel/src/context/types.ts +110 -0
- package/src/kernel/src/context/useRuneLab.ts +38 -0
- package/src/kernel/src/mod.ts +13 -0
- package/src/kernel/src/persistence/createConfigStore.svelte.ts +120 -0
- package/src/kernel/src/persistence/drivers.test.ts +95 -0
- package/src/kernel/src/persistence/drivers.ts +77 -0
- package/src/kernel/src/persistence/provider.test.ts +58 -0
- package/{dist/state/persistence/provider.js → src/kernel/src/persistence/provider.ts} +29 -14
- package/src/kernel/src/persistence/types.ts +19 -0
- package/src/kernel/src/persistence/usePersistence.ts +9 -0
- package/src/kernel/src/registry/mod.ts +221 -0
- package/src/kernel/src/registry/registry.test.ts +162 -0
- package/src/kernel/src/tokens/props.ts +94 -0
- package/src/mod.ts +10 -0
- package/src/runes/layout/deno.json +5 -0
- package/src/runes/layout/src/APP_CONFIGURATIONS.ts +56 -0
- package/{dist/ui/features/config → src/runes/layout/src}/AppSettingSelector.svelte +1 -1
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedNavigationPanel.svelte +1 -1
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +1 -1
- package/src/runes/layout/src/Icon.svelte +7 -0
- package/{dist/ui/features/config → src/runes/layout/src}/LanguageSelector.svelte +7 -5
- package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
- package/{dist/ui/features/config → src/runes/layout/src}/ResourceSelector.svelte +3 -5
- package/{dist/ui/features/config → src/runes/layout/src}/ThemeSelector.svelte +2 -2
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +6 -4
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceStrip.svelte +1 -1
- package/src/runes/layout/src/connection-factory.ts +95 -0
- package/src/runes/layout/src/language.svelte.ts +44 -0
- package/src/runes/layout/src/mod.ts +71 -0
- package/src/runes/layout/src/store.svelte.ts +142 -0
- package/src/runes/layout/src/theme.svelte.ts +73 -0
- package/src/runes/layout/src/types.ts +11 -0
- package/src/runes/palettes/deno.json +8 -0
- package/{dist/ui/features/command-palette → src/runes/palettes/src/commands}/CommandPalette.svelte +4 -4
- package/src/runes/palettes/src/commands/mod.ts +2 -0
- package/src/runes/palettes/src/commands/store.svelte.ts +80 -0
- package/src/runes/palettes/src/mod.ts +51 -0
- package/{dist/ui/components → src/runes/palettes/src/notifications}/Toaster.svelte +1 -2
- package/src/runes/palettes/src/notifications/bridge.ts +56 -0
- package/src/runes/palettes/src/notifications/mod.ts +4 -0
- package/src/runes/palettes/src/notifications/store.svelte.ts +58 -0
- package/{dist/ui/features → src/runes/palettes/src}/shortcuts/ShortcutPalette.svelte +4 -4
- package/src/runes/palettes/src/shortcuts/mod.ts +4 -0
- package/src/runes/palettes/src/shortcuts/store.svelte.ts +85 -0
- package/src/runes/palettes/src/shortcuts/types.ts +4 -0
- package/src/runes/palettes/src/shortcuts/useShortcuts.ts +85 -0
- package/src/runes/plugins/money/deno.json +8 -0
- package/{dist/ui/features/config → src/runes/plugins/money/src}/CurrencySelector.svelte +2 -2
- package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyDisplay.svelte +2 -2
- package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyInput.svelte +4 -8
- package/src/runes/plugins/money/src/currency.svelte.ts +95 -0
- package/src/runes/plugins/money/src/currency.test.ts +40 -0
- package/src/runes/plugins/money/src/exchange-rate.svelte.ts +176 -0
- package/src/runes/plugins/money/src/exchange-rate.test.ts +95 -0
- package/src/runes/plugins/money/src/mod.ts +79 -0
- package/src/runes/plugins/money/src/money-primitive.test.ts +217 -0
- package/src/runes/plugins/money/src/money-primitive.ts +220 -0
- package/src/runes/plugins/money/src/money.test.ts +183 -0
- package/src/runes/plugins/money/src/money.ts +382 -0
- package/src/runes/plugins/money/src/strategies.test.ts +143 -0
- package/{dist/core/exchange-rate/strategies.js → src/runes/plugins/money/src/strategies.ts} +45 -22
- package/src/runes/plugins/money/src/types.ts +27 -0
- package/src/runes/plugins/money/src/useMoney.ts +261 -0
- package/src/runes/plugins/money/src/useMoneyFilter.ts +132 -0
- package/tsconfig.json +41 -0
- package/vite.config.ts +44 -0
- package/dist/core/design-tokens/props.d.ts +0 -52
- package/dist/core/design-tokens/props.d.ts.map +0 -1
- package/dist/core/design-tokens/props.js +0 -34
- package/dist/core/exchange-rate/strategies.d.ts +0 -52
- package/dist/core/exchange-rate/strategies.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -9
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -8
- package/dist/core/internal/message-resolver.d.ts +0 -42
- package/dist/core/internal/message-resolver.d.ts.map +0 -1
- package/dist/core/internal/message-resolver.js +0 -47
- package/dist/core/layout/types.d.ts +0 -60
- package/dist/core/layout/types.d.ts.map +0 -1
- package/dist/core/layout/types.js +0 -4
- package/dist/core/money/index.d.ts +0 -2
- package/dist/core/money/index.d.ts.map +0 -1
- package/dist/core/money/index.js +0 -2
- package/dist/core/money/money-primitive.d.ts +0 -101
- package/dist/core/money/money-primitive.d.ts.map +0 -1
- package/dist/core/money/money-primitive.js +0 -161
- package/dist/core/money/money.d.ts +0 -129
- package/dist/core/money/money.d.ts.map +0 -1
- package/dist/core/money/money.js +0 -250
- package/dist/core/persistence/types.d.ts +0 -18
- package/dist/core/persistence/types.d.ts.map +0 -1
- package/dist/core/persistence/types.js +0 -2
- package/dist/core/shortcuts/types.d.ts +0 -60
- package/dist/core/shortcuts/types.d.ts.map +0 -1
- package/dist/core/shortcuts/types.js +0 -4
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -7
- package/dist/state/api.svelte.d.ts +0 -26
- package/dist/state/api.svelte.js +0 -65
- package/dist/state/app.svelte.d.ts +0 -48
- package/dist/state/app.svelte.js +0 -82
- package/dist/state/auth/index.d.ts +0 -2
- package/dist/state/auth/index.js +0 -2
- package/dist/state/auth/session.svelte.d.ts +0 -40
- package/dist/state/auth/session.svelte.js +0 -59
- package/dist/state/auth/types.d.ts +0 -30
- package/dist/state/auth/types.js +0 -3
- package/dist/state/cart.svelte.d.ts +0 -64
- package/dist/state/cart.svelte.js +0 -122
- package/dist/state/commands.svelte.d.ts +0 -46
- package/dist/state/commands.svelte.js +0 -62
- package/dist/state/composables/useMoney.d.ts +0 -31
- package/dist/state/composables/useMoney.js +0 -126
- package/dist/state/composables/useMoneyFilter.d.ts +0 -20
- package/dist/state/composables/useMoneyFilter.js +0 -81
- package/dist/state/composables/usePersistence.d.ts +0 -2
- package/dist/state/composables/usePersistence.js +0 -5
- package/dist/state/composables/useRuneLab.d.ts +0 -19
- package/dist/state/composables/useRuneLab.js +0 -30
- package/dist/state/composables/useShortcuts.d.ts +0 -33
- package/dist/state/composables/useShortcuts.js +0 -75
- package/dist/state/context.d.ts +0 -15
- package/dist/state/context.js +0 -16
- package/dist/state/createConfigStore.svelte.d.ts +0 -28
- package/dist/state/createConfigStore.svelte.js +0 -72
- package/dist/state/currency.svelte.d.ts +0 -32
- package/dist/state/currency.svelte.js +0 -96
- package/dist/state/currency.test.d.ts +0 -1
- package/dist/state/currency.test.js +0 -35
- package/dist/state/exchange-rate.svelte.d.ts +0 -43
- package/dist/state/exchange-rate.svelte.js +0 -145
- package/dist/state/exchange-rate.test.d.ts +0 -1
- package/dist/state/exchange-rate.test.js +0 -75
- package/dist/state/index.d.ts +0 -26
- package/dist/state/index.js +0 -32
- package/dist/state/language.svelte.d.ts +0 -57
- package/dist/state/language.svelte.js +0 -43
- package/dist/state/layout.svelte.d.ts +0 -49
- package/dist/state/layout.svelte.js +0 -108
- package/dist/state/persistence/drivers.d.ts +0 -12
- package/dist/state/persistence/drivers.js +0 -75
- package/dist/state/persistence/drivers.test.d.ts +0 -1
- package/dist/state/persistence/drivers.test.js +0 -79
- package/dist/state/persistence/provider.d.ts +0 -23
- package/dist/state/persistence/provider.test.d.ts +0 -1
- package/dist/state/persistence/provider.test.js +0 -51
- package/dist/state/registry/index.d.ts +0 -44
- package/dist/state/registry/index.js +0 -58
- package/dist/state/registry/registry.test.d.ts +0 -1
- package/dist/state/registry/registry.test.js +0 -112
- package/dist/state/registry/types.d.ts +0 -20
- package/dist/state/registry/types.js +0 -3
- package/dist/state/shortcuts.svelte.d.ts +0 -121
- package/dist/state/shortcuts.svelte.js +0 -222
- package/dist/state/theme.svelte.d.ts +0 -15
- package/dist/state/theme.svelte.js +0 -92
- package/dist/state/toast-bridge.d.ts +0 -29
- package/dist/state/toast-bridge.js +0 -43
- package/dist/state/toast.svelte.d.ts +0 -27
- package/dist/state/toast.svelte.js +0 -43
- package/dist/ui/actions/portal.d.ts +0 -7
- package/dist/ui/actions/portal.js +0 -32
- package/dist/ui/components/ApiMonitor.svelte +0 -162
- package/dist/ui/components/ApiMonitor.svelte.d.ts +0 -3
- package/dist/ui/components/Icon.svelte +0 -108
- package/dist/ui/components/Icon.svelte.d.ts +0 -14
- package/dist/ui/components/Kyntharil.svelte +0 -48
- package/dist/ui/components/Kyntharil.svelte.d.ts +0 -6
- package/dist/ui/components/RuneProvider.svelte +0 -218
- package/dist/ui/components/RuneProvider.svelte.d.ts +0 -49
- package/dist/ui/components/Toaster.svelte.d.ts +0 -18
- package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -33
- package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
- package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -117
- package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -34
- package/dist/ui/components/money/index.d.ts +0 -2
- package/dist/ui/components/money/index.js +0 -3
- package/dist/ui/components/user/UserAvatar.svelte +0 -66
- package/dist/ui/components/user/UserAvatar.svelte.d.ts +0 -13
- package/dist/ui/components/user/UserProfile.svelte +0 -79
- package/dist/ui/components/user/UserProfile.svelte.d.ts +0 -17
- package/dist/ui/components/user/index.d.ts +0 -2
- package/dist/ui/components/user/index.js +0 -3
- package/dist/ui/features/command-palette/CommandPalette.svelte.d.ts +0 -6
- package/dist/ui/features/config/APP_CONFIGURATIONS.d.ts +0 -29
- package/dist/ui/features/config/APP_CONFIGURATIONS.js +0 -38
- package/dist/ui/features/config/AppSettingSelector.svelte.d.ts +0 -13
- package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/ResourceSelector.svelte.d.ts +0 -25
- package/dist/ui/features/config/ThemeSelector.svelte.d.ts +0 -8
- package/dist/ui/features/notifications/NotificationBell.svelte.d.ts +0 -11
- package/dist/ui/features/notifications/index.d.ts +0 -1
- package/dist/ui/features/notifications/index.js +0 -2
- package/dist/ui/features/shortcuts/ShortcutBinder.svelte +0 -17
- package/dist/ui/features/shortcuts/ShortcutBinder.svelte.d.ts +0 -7
- package/dist/ui/features/shortcuts/ShortcutPalette.svelte.d.ts +0 -6
- package/dist/ui/index.d.ts +0 -30
- package/dist/ui/index.js +0 -46
- package/dist/ui/layout/ConnectedNavigationPanel.svelte.d.ts +0 -10
- package/dist/ui/layout/ConnectedWorkspaceStrip.svelte.d.ts +0 -9
- package/dist/ui/layout/ContentArea.svelte.d.ts +0 -8
- package/dist/ui/layout/DetailPanel.svelte.d.ts +0 -7
- package/dist/ui/layout/NavigationPanel.svelte.d.ts +0 -14
- package/dist/ui/layout/WorkspaceLayout.svelte.d.ts +0 -32
- package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
- package/dist/ui/layout/connection-factory.d.ts +0 -50
- package/dist/ui/layout/connection-factory.js +0 -58
- package/dist/ui/layout/index.d.ts +0 -7
- package/dist/ui/layout/index.js +0 -7
- package/dist/ui/paraglide/README.md +0 -147
- package/dist/ui/paraglide/messages/_index.d.ts +0 -87
- package/dist/ui/paraglide/messages/_index.js +0 -88
- package/dist/ui/paraglide/messages/abyss.d.ts +0 -16
- package/dist/ui/paraglide/messages/abyss.js +0 -84
- package/dist/ui/paraglide/messages/acid.d.ts +0 -16
- package/dist/ui/paraglide/messages/acid.js +0 -84
- package/dist/ui/paraglide/messages/active_toasts.d.ts +0 -16
- package/dist/ui/paraglide/messages/active_toasts.js +0 -84
- package/dist/ui/paraglide/messages/aed3.d.ts +0 -17
- package/dist/ui/paraglide/messages/aed3.js +0 -85
- package/dist/ui/paraglide/messages/all_currencies.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_currencies.js +0 -84
- package/dist/ui/paraglide/messages/all_languages.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_languages.js +0 -84
- package/dist/ui/paraglide/messages/all_themes.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_themes.js +0 -84
- package/dist/ui/paraglide/messages/api_status.d.ts +0 -16
- package/dist/ui/paraglide/messages/api_status.js +0 -84
- package/dist/ui/paraglide/messages/app_info.d.ts +0 -16
- package/dist/ui/paraglide/messages/app_info.js +0 -84
- package/dist/ui/paraglide/messages/appearance.d.ts +0 -16
- package/dist/ui/paraglide/messages/appearance.js +0 -84
- package/dist/ui/paraglide/messages/aqua.d.ts +0 -16
- package/dist/ui/paraglide/messages/aqua.js +0 -84
- package/dist/ui/paraglide/messages/ar.d.ts +0 -16
- package/dist/ui/paraglide/messages/ar.js +0 -84
- package/dist/ui/paraglide/messages/autumn.d.ts +0 -16
- package/dist/ui/paraglide/messages/autumn.js +0 -84
- package/dist/ui/paraglide/messages/black.d.ts +0 -16
- package/dist/ui/paraglide/messages/black.js +0 -84
- package/dist/ui/paraglide/messages/brl3.d.ts +0 -17
- package/dist/ui/paraglide/messages/brl3.js +0 -85
- package/dist/ui/paraglide/messages/bumblebee.d.ts +0 -16
- package/dist/ui/paraglide/messages/bumblebee.js +0 -84
- package/dist/ui/paraglide/messages/business.d.ts +0 -16
- package/dist/ui/paraglide/messages/business.js +0 -84
- package/dist/ui/paraglide/messages/cad3.d.ts +0 -17
- package/dist/ui/paraglide/messages/cad3.js +0 -85
- package/dist/ui/paraglide/messages/caramellatte.d.ts +0 -16
- package/dist/ui/paraglide/messages/caramellatte.js +0 -84
- package/dist/ui/paraglide/messages/cmyk.d.ts +0 -16
- package/dist/ui/paraglide/messages/cmyk.js +0 -84
- package/dist/ui/paraglide/messages/cny3.d.ts +0 -17
- package/dist/ui/paraglide/messages/cny3.js +0 -85
- package/dist/ui/paraglide/messages/coffee.d.ts +0 -16
- package/dist/ui/paraglide/messages/coffee.js +0 -84
- package/dist/ui/paraglide/messages/commands_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/commands_label.js +0 -84
- package/dist/ui/paraglide/messages/corporate.d.ts +0 -16
- package/dist/ui/paraglide/messages/corporate.js +0 -84
- package/dist/ui/paraglide/messages/cupcake.d.ts +0 -16
- package/dist/ui/paraglide/messages/cupcake.js +0 -84
- package/dist/ui/paraglide/messages/currency.d.ts +0 -16
- package/dist/ui/paraglide/messages/currency.js +0 -84
- package/dist/ui/paraglide/messages/current_currency.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_currency.js +0 -84
- package/dist/ui/paraglide/messages/current_language.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_language.js +0 -84
- package/dist/ui/paraglide/messages/current_theme.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_theme.js +0 -84
- package/dist/ui/paraglide/messages/currently_in_queue.d.ts +0 -16
- package/dist/ui/paraglide/messages/currently_in_queue.js +0 -84
- package/dist/ui/paraglide/messages/cyberpunk.d.ts +0 -16
- package/dist/ui/paraglide/messages/cyberpunk.js +0 -84
- package/dist/ui/paraglide/messages/dark.d.ts +0 -16
- package/dist/ui/paraglide/messages/dark.js +0 -84
- package/dist/ui/paraglide/messages/de.d.ts +0 -16
- package/dist/ui/paraglide/messages/de.js +0 -84
- package/dist/ui/paraglide/messages/dim.d.ts +0 -16
- package/dist/ui/paraglide/messages/dim.js +0 -84
- package/dist/ui/paraglide/messages/dracula.d.ts +0 -16
- package/dist/ui/paraglide/messages/dracula.js +0 -84
- package/dist/ui/paraglide/messages/emerald.d.ts +0 -16
- package/dist/ui/paraglide/messages/emerald.js +0 -84
- package/dist/ui/paraglide/messages/en.d.ts +0 -16
- package/dist/ui/paraglide/messages/en.js +0 -84
- package/dist/ui/paraglide/messages/es.d.ts +0 -16
- package/dist/ui/paraglide/messages/es.js +0 -84
- package/dist/ui/paraglide/messages/eur3.d.ts +0 -17
- package/dist/ui/paraglide/messages/eur3.js +0 -85
- package/dist/ui/paraglide/messages/extended_controls.d.ts +0 -16
- package/dist/ui/paraglide/messages/extended_controls.js +0 -84
- package/dist/ui/paraglide/messages/fantasy.d.ts +0 -16
- package/dist/ui/paraglide/messages/fantasy.js +0 -84
- package/dist/ui/paraglide/messages/forest.d.ts +0 -16
- package/dist/ui/paraglide/messages/forest.js +0 -84
- package/dist/ui/paraglide/messages/fr.d.ts +0 -16
- package/dist/ui/paraglide/messages/fr.js +0 -84
- package/dist/ui/paraglide/messages/garden.d.ts +0 -16
- package/dist/ui/paraglide/messages/garden.js +0 -84
- package/dist/ui/paraglide/messages/gbp3.d.ts +0 -17
- package/dist/ui/paraglide/messages/gbp3.js +0 -85
- package/dist/ui/paraglide/messages/halloween.d.ts +0 -16
- package/dist/ui/paraglide/messages/halloween.js +0 -84
- package/dist/ui/paraglide/messages/hello_world.d.ts +0 -18
- package/dist/ui/paraglide/messages/hello_world.js +0 -84
- package/dist/ui/paraglide/messages/hi.d.ts +0 -16
- package/dist/ui/paraglide/messages/hi.js +0 -84
- package/dist/ui/paraglide/messages/inr3.d.ts +0 -17
- package/dist/ui/paraglide/messages/inr3.js +0 -85
- package/dist/ui/paraglide/messages/it.d.ts +0 -16
- package/dist/ui/paraglide/messages/it.js +0 -84
- package/dist/ui/paraglide/messages/ja.d.ts +0 -16
- package/dist/ui/paraglide/messages/ja.js +0 -84
- package/dist/ui/paraglide/messages/jpy3.d.ts +0 -17
- package/dist/ui/paraglide/messages/jpy3.js +0 -85
- package/dist/ui/paraglide/messages/ko.d.ts +0 -16
- package/dist/ui/paraglide/messages/ko.js +0 -84
- package/dist/ui/paraglide/messages/krw3.d.ts +0 -17
- package/dist/ui/paraglide/messages/krw3.js +0 -85
- package/dist/ui/paraglide/messages/languages.d.ts +0 -16
- package/dist/ui/paraglide/messages/languages.js +0 -84
- package/dist/ui/paraglide/messages/lemonade.d.ts +0 -16
- package/dist/ui/paraglide/messages/lemonade.js +0 -84
- package/dist/ui/paraglide/messages/light.d.ts +0 -16
- package/dist/ui/paraglide/messages/light.js +0 -84
- package/dist/ui/paraglide/messages/live_store_dashboard.d.ts +0 -16
- package/dist/ui/paraglide/messages/live_store_dashboard.js +0 -84
- package/dist/ui/paraglide/messages/localization.d.ts +0 -16
- package/dist/ui/paraglide/messages/localization.js +0 -84
- package/dist/ui/paraglide/messages/lofi.d.ts +0 -16
- package/dist/ui/paraglide/messages/lofi.js +0 -84
- package/dist/ui/paraglide/messages/luxury.d.ts +0 -16
- package/dist/ui/paraglide/messages/luxury.js +0 -84
- package/dist/ui/paraglide/messages/mxn3.d.ts +0 -17
- package/dist/ui/paraglide/messages/mxn3.js +0 -85
- package/dist/ui/paraglide/messages/name_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/name_label.js +0 -84
- package/dist/ui/paraglide/messages/night.d.ts +0 -16
- package/dist/ui/paraglide/messages/night.js +0 -84
- package/dist/ui/paraglide/messages/nord.d.ts +0 -16
- package/dist/ui/paraglide/messages/nord.js +0 -84
- package/dist/ui/paraglide/messages/pastel.d.ts +0 -16
- package/dist/ui/paraglide/messages/pastel.js +0 -84
- package/dist/ui/paraglide/messages/pt.d.ts +0 -16
- package/dist/ui/paraglide/messages/pt.js +0 -84
- package/dist/ui/paraglide/messages/real_time_monitor_desc.d.ts +0 -16
- package/dist/ui/paraglide/messages/real_time_monitor_desc.js +0 -84
- package/dist/ui/paraglide/messages/registered_in_registry.d.ts +0 -16
- package/dist/ui/paraglide/messages/registered_in_registry.js +0 -84
- package/dist/ui/paraglide/messages/retro.d.ts +0 -16
- package/dist/ui/paraglide/messages/retro.js +0 -84
- package/dist/ui/paraglide/messages/ru.d.ts +0 -16
- package/dist/ui/paraglide/messages/ru.js +0 -84
- package/dist/ui/paraglide/messages/silk.d.ts +0 -16
- package/dist/ui/paraglide/messages/silk.js +0 -84
- package/dist/ui/paraglide/messages/state_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/state_label.js +0 -84
- package/dist/ui/paraglide/messages/sunset.d.ts +0 -16
- package/dist/ui/paraglide/messages/sunset.js +0 -84
- package/dist/ui/paraglide/messages/synthwave.d.ts +0 -16
- package/dist/ui/paraglide/messages/synthwave.js +0 -84
- package/dist/ui/paraglide/messages/system.d.ts +0 -16
- package/dist/ui/paraglide/messages/system.js +0 -84
- package/dist/ui/paraglide/messages/theme.d.ts +0 -16
- package/dist/ui/paraglide/messages/theme.js +0 -84
- package/dist/ui/paraglide/messages/themes.d.ts +0 -16
- package/dist/ui/paraglide/messages/themes.js +0 -84
- package/dist/ui/paraglide/messages/url_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/url_label.js +0 -84
- package/dist/ui/paraglide/messages/usd3.d.ts +0 -17
- package/dist/ui/paraglide/messages/usd3.js +0 -85
- package/dist/ui/paraglide/messages/valentine.d.ts +0 -16
- package/dist/ui/paraglide/messages/valentine.js +0 -84
- package/dist/ui/paraglide/messages/version_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/version_label.js +0 -84
- package/dist/ui/paraglide/messages/vi.d.ts +0 -16
- package/dist/ui/paraglide/messages/vi.js +0 -84
- package/dist/ui/paraglide/messages/winter.d.ts +0 -16
- package/dist/ui/paraglide/messages/winter.js +0 -84
- package/dist/ui/paraglide/messages/wireframe.d.ts +0 -16
- package/dist/ui/paraglide/messages/wireframe.js +0 -84
- package/dist/ui/paraglide/messages/zh.d.ts +0 -16
- package/dist/ui/paraglide/messages/zh.js +0 -84
- package/dist/ui/paraglide/messages.d.ts +0 -2
- package/dist/ui/paraglide/messages.js +0 -4
- package/dist/ui/paraglide/registry.d.ts +0 -21
- package/dist/ui/paraglide/registry.js +0 -31
- package/dist/ui/paraglide/runtime.d.ts +0 -730
- package/dist/ui/paraglide/runtime.js +0 -1812
- package/dist/ui/paraglide/server.d.ts +0 -92
- package/dist/ui/paraglide/server.js +0 -239
- package/dist/ui/primitives/DatePicker.svelte +0 -257
- package/dist/ui/primitives/DatePicker.svelte.d.ts +0 -17
- package/dist/ui/primitives/index.d.ts +0 -1
- package/dist/ui/primitives/index.js +0 -3
- /package/{dist/ui/layout → src/runes/layout/src}/ContentArea.svelte +0 -0
- /package/{dist/ui/layout → src/runes/layout/src}/DetailPanel.svelte +0 -0
- /package/{dist/ui/features → src/runes/palettes/src}/notifications/NotificationBell.svelte +0 -0
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { setContext, untrack, type Snippet, onMount } from "svelte";
|
|
3
|
-
import {
|
|
4
|
-
createAppStore,
|
|
5
|
-
createLayoutStore,
|
|
6
|
-
createCommandStore,
|
|
7
|
-
createApiStore,
|
|
8
|
-
createToastStore,
|
|
9
|
-
createThemeStore,
|
|
10
|
-
createLanguageStore,
|
|
11
|
-
createCurrencyStore,
|
|
12
|
-
createShortcutStore,
|
|
13
|
-
createCartStore,
|
|
14
|
-
createSessionStore,
|
|
15
|
-
createExchangeRateStore,
|
|
16
|
-
type CartStoreConfig,
|
|
17
|
-
type ExchangeRateStore,
|
|
18
|
-
} from "@internal/state";
|
|
19
|
-
import type { PersistenceDriver } from "@internal/core";
|
|
20
|
-
import { localStorageDriver } from "@internal/state";
|
|
21
|
-
import { RUNE_LAB_CONTEXT } from "@internal/state";
|
|
22
|
-
import type { AppData } from "@internal/state";
|
|
23
|
-
import type { Theme } from "@internal/state";
|
|
24
|
-
import type { Currency } from "@internal/state";
|
|
25
|
-
import { CommandPalette, ShortcutPalette, Toaster } from "../../mod";
|
|
26
|
-
|
|
27
|
-
export interface RuneLabConfig {
|
|
28
|
-
persistence?: PersistenceDriver;
|
|
29
|
-
app?: Partial<AppData>;
|
|
30
|
-
apiUrl?: string;
|
|
31
|
-
apiHealthCheck?: () => Promise<boolean>;
|
|
32
|
-
favicon?: string;
|
|
33
|
-
manageHead?: boolean;
|
|
34
|
-
dictionary?: Record<string, any>;
|
|
35
|
-
locales?: readonly string[];
|
|
36
|
-
onLanguageChange?: (code: string) => void;
|
|
37
|
-
/** Icon provider to use. 'material' injects Google Material Symbols font link. */
|
|
38
|
-
icons?: 'material' | 'none';
|
|
39
|
-
|
|
40
|
-
// Theming (DaisyUI)
|
|
41
|
-
/** Additional custom themes to register alongside the built-in DaisyUI set */
|
|
42
|
-
customThemes?: Theme[];
|
|
43
|
-
/** Theme to use when no persisted value exists (after system preference detection) */
|
|
44
|
-
defaultTheme?: string;
|
|
45
|
-
|
|
46
|
-
// Currencies (Dinero.js)
|
|
47
|
-
/** Additional custom currencies to register */
|
|
48
|
-
currencies?: Currency[];
|
|
49
|
-
/** Default currency code when no persisted value exists */
|
|
50
|
-
defaultCurrency?: string;
|
|
51
|
-
/** Bootstrap-time exchange rates */
|
|
52
|
-
exchangeRates?: {
|
|
53
|
-
base: string;
|
|
54
|
-
rates: Record<string, number>;
|
|
55
|
-
};
|
|
56
|
-
/** Callback when rates are initialized/updated */
|
|
57
|
-
onRatesUpdate?: (store: ExchangeRateStore) => void;
|
|
58
|
-
|
|
59
|
-
// Cart (opt-in)
|
|
60
|
-
/** CartStore configuration — when provided, a CartStore is created and registered in context */
|
|
61
|
-
cart?: CartStoreConfig<any>;
|
|
62
|
-
|
|
63
|
-
// Auth (opt-in)
|
|
64
|
-
/** When true, creates and registers a SessionStore in context */
|
|
65
|
-
auth?: {
|
|
66
|
-
enabled?: boolean;
|
|
67
|
-
/** Callback when session changes (login, logout, expiry) */
|
|
68
|
-
onSessionChange?: (session: any) => void;
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
let { children, config = {} } = $props<{
|
|
73
|
-
children: Snippet;
|
|
74
|
-
config?: RuneLabConfig;
|
|
75
|
-
}>();
|
|
76
|
-
|
|
77
|
-
// 1. Initialize Base Configuration Stores
|
|
78
|
-
const appStore = createAppStore();
|
|
79
|
-
const apiStore = createApiStore();
|
|
80
|
-
const toastStore = createToastStore();
|
|
81
|
-
|
|
82
|
-
// Capture the initial persistence prop to avoid Svelte 5 reactive capture warnings
|
|
83
|
-
// Default to localStorageDriver to ensure UI selectors persist across browser page reloads
|
|
84
|
-
const initialPersistence = untrack(
|
|
85
|
-
() => config.persistence ?? localStorageDriver,
|
|
86
|
-
);
|
|
87
|
-
const initialLocales = untrack(() => config.locales);
|
|
88
|
-
const initialCustomThemes = untrack(() => config.customThemes);
|
|
89
|
-
const initialDefaultTheme = untrack(() => config.defaultTheme);
|
|
90
|
-
const initialCustomCurrencies = untrack(() => config.currencies);
|
|
91
|
-
const initialDefaultCurrency = untrack(() => config.defaultCurrency);
|
|
92
|
-
const initialExchangeRates = untrack(() => config.exchangeRates);
|
|
93
|
-
const initialCartConfig = untrack(() => config.cart);
|
|
94
|
-
const initialAuthConfig = untrack(() => config.auth);
|
|
95
|
-
|
|
96
|
-
const exchangeRateStore = createExchangeRateStore();
|
|
97
|
-
if (initialExchangeRates) {
|
|
98
|
-
exchangeRateStore.setRates(initialExchangeRates.base, initialExchangeRates.rates);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const themeStore = createThemeStore({
|
|
102
|
-
driver: initialPersistence,
|
|
103
|
-
customThemes: initialCustomThemes,
|
|
104
|
-
defaultTheme: initialDefaultTheme,
|
|
105
|
-
});
|
|
106
|
-
const languageStore = createLanguageStore({
|
|
107
|
-
driver: initialPersistence,
|
|
108
|
-
locales: initialLocales,
|
|
109
|
-
});
|
|
110
|
-
const currencyStore = createCurrencyStore({
|
|
111
|
-
driver: initialPersistence,
|
|
112
|
-
customCurrencies: initialCustomCurrencies,
|
|
113
|
-
defaultCurrency: initialDefaultCurrency,
|
|
114
|
-
exchangeRateStore,
|
|
115
|
-
});
|
|
116
|
-
const shortcutStore = createShortcutStore();
|
|
117
|
-
|
|
118
|
-
// 2. Initialize Complex Stores (Dependency Injection)
|
|
119
|
-
const layoutStore = createLayoutStore(initialPersistence);
|
|
120
|
-
const commandStore = createCommandStore({
|
|
121
|
-
appStore,
|
|
122
|
-
apiStore,
|
|
123
|
-
toastStore,
|
|
124
|
-
themeStore,
|
|
125
|
-
languageStore,
|
|
126
|
-
currencyStore,
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// 3. Provide Core Contexts
|
|
130
|
-
setContext(RUNE_LAB_CONTEXT.app, appStore);
|
|
131
|
-
setContext(RUNE_LAB_CONTEXT.api, apiStore);
|
|
132
|
-
setContext(RUNE_LAB_CONTEXT.toast, toastStore);
|
|
133
|
-
setContext(RUNE_LAB_CONTEXT.theme, themeStore);
|
|
134
|
-
setContext(RUNE_LAB_CONTEXT.language, languageStore);
|
|
135
|
-
setContext(RUNE_LAB_CONTEXT.currency, currencyStore);
|
|
136
|
-
setContext(RUNE_LAB_CONTEXT.exchangeRate, exchangeRateStore);
|
|
137
|
-
setContext(RUNE_LAB_CONTEXT.shortcut, shortcutStore);
|
|
138
|
-
setContext(RUNE_LAB_CONTEXT.layout, layoutStore);
|
|
139
|
-
setContext(RUNE_LAB_CONTEXT.commands, commandStore);
|
|
140
|
-
setContext(RUNE_LAB_CONTEXT.persistence, initialPersistence);
|
|
141
|
-
|
|
142
|
-
// 4. Opt-in: CartStore (C-01 FIX)
|
|
143
|
-
if (initialCartConfig) {
|
|
144
|
-
const cartStore = createCartStore(initialCartConfig);
|
|
145
|
-
setContext(RUNE_LAB_CONTEXT.cart, cartStore);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// 5. Opt-in: SessionStore (C-02 FIX)
|
|
149
|
-
if (initialAuthConfig && initialAuthConfig.enabled !== false) {
|
|
150
|
-
const sessionStore = createSessionStore();
|
|
151
|
-
setContext(RUNE_LAB_CONTEXT.session, sessionStore);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const initialDictionary = untrack(() => config.dictionary);
|
|
155
|
-
if (initialDictionary) {
|
|
156
|
-
setContext("rl:dictionary", initialDictionary);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Track config changes dynamically
|
|
160
|
-
$effect(() => {
|
|
161
|
-
if (config.app) appStore.init(config.app);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
$effect(() => {
|
|
165
|
-
if (config.apiUrl)
|
|
166
|
-
apiStore.init(config.apiUrl, "v1", config.apiHealthCheck);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
$effect(() => {
|
|
170
|
-
const code = languageStore.current as string;
|
|
171
|
-
if (config.onLanguageChange) {
|
|
172
|
-
config.onLanguageChange(code);
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
$effect(() => {
|
|
177
|
-
const name = themeStore.current as string;
|
|
178
|
-
if (config.onThemeChange) {
|
|
179
|
-
config.onThemeChange(name);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
onMount(() => {
|
|
184
|
-
layoutStore.init();
|
|
185
|
-
if (config.onRatesUpdate) {
|
|
186
|
-
config.onRatesUpdate(exchangeRateStore);
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// Meta tags derived from app store state
|
|
191
|
-
const metaTags = $derived([
|
|
192
|
-
{ name: "description", content: appStore.description },
|
|
193
|
-
{ name: "author", content: appStore.author },
|
|
194
|
-
]);
|
|
195
|
-
</script>
|
|
196
|
-
|
|
197
|
-
<svelte:head>
|
|
198
|
-
{#if config.manageHead !== false}
|
|
199
|
-
<title>{appStore.name}</title>
|
|
200
|
-
{#if config.favicon}
|
|
201
|
-
<link rel="icon" href={config.favicon} />
|
|
202
|
-
{/if}
|
|
203
|
-
{#each metaTags as meta}
|
|
204
|
-
<meta name={meta.name} content={meta.content} />
|
|
205
|
-
{/each}
|
|
206
|
-
{#if config.icons === "material"}
|
|
207
|
-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
|
|
208
|
-
{/if}
|
|
209
|
-
{/if}
|
|
210
|
-
</svelte:head>
|
|
211
|
-
|
|
212
|
-
<!-- Global Overlays -->
|
|
213
|
-
<Toaster />
|
|
214
|
-
<CommandPalette />
|
|
215
|
-
<ShortcutPalette />
|
|
216
|
-
|
|
217
|
-
<!-- Render Children -->
|
|
218
|
-
{@render children()}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { type Snippet } from "svelte";
|
|
2
|
-
import { type CartStoreConfig, type ExchangeRateStore } from "@internal/state";
|
|
3
|
-
import type { PersistenceDriver } from "@internal/core";
|
|
4
|
-
import type { AppData } from "@internal/state";
|
|
5
|
-
import type { Theme } from "@internal/state";
|
|
6
|
-
import type { Currency } from "@internal/state";
|
|
7
|
-
export interface RuneLabConfig {
|
|
8
|
-
persistence?: PersistenceDriver;
|
|
9
|
-
app?: Partial<AppData>;
|
|
10
|
-
apiUrl?: string;
|
|
11
|
-
apiHealthCheck?: () => Promise<boolean>;
|
|
12
|
-
favicon?: string;
|
|
13
|
-
manageHead?: boolean;
|
|
14
|
-
dictionary?: Record<string, any>;
|
|
15
|
-
locales?: readonly string[];
|
|
16
|
-
onLanguageChange?: (code: string) => void;
|
|
17
|
-
/** Icon provider to use. 'material' injects Google Material Symbols font link. */
|
|
18
|
-
icons?: 'material' | 'none';
|
|
19
|
-
/** Additional custom themes to register alongside the built-in DaisyUI set */
|
|
20
|
-
customThemes?: Theme[];
|
|
21
|
-
/** Theme to use when no persisted value exists (after system preference detection) */
|
|
22
|
-
defaultTheme?: string;
|
|
23
|
-
/** Additional custom currencies to register */
|
|
24
|
-
currencies?: Currency[];
|
|
25
|
-
/** Default currency code when no persisted value exists */
|
|
26
|
-
defaultCurrency?: string;
|
|
27
|
-
/** Bootstrap-time exchange rates */
|
|
28
|
-
exchangeRates?: {
|
|
29
|
-
base: string;
|
|
30
|
-
rates: Record<string, number>;
|
|
31
|
-
};
|
|
32
|
-
/** Callback when rates are initialized/updated */
|
|
33
|
-
onRatesUpdate?: (store: ExchangeRateStore) => void;
|
|
34
|
-
/** CartStore configuration — when provided, a CartStore is created and registered in context */
|
|
35
|
-
cart?: CartStoreConfig<any>;
|
|
36
|
-
/** When true, creates and registers a SessionStore in context */
|
|
37
|
-
auth?: {
|
|
38
|
-
enabled?: boolean;
|
|
39
|
-
/** Callback when session changes (login, logout, expiry) */
|
|
40
|
-
onSessionChange?: (session: any) => void;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
type $$ComponentProps = {
|
|
44
|
-
children: Snippet;
|
|
45
|
-
config?: RuneLabConfig;
|
|
46
|
-
};
|
|
47
|
-
declare const RuneProvider: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
48
|
-
type RuneProvider = ReturnType<typeof RuneProvider>;
|
|
49
|
-
export default RuneProvider;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
-
$$bindings?: Bindings;
|
|
4
|
-
} & Exports;
|
|
5
|
-
(internal: unknown, props: {
|
|
6
|
-
$$events?: Events;
|
|
7
|
-
$$slots?: Slots;
|
|
8
|
-
}): Exports & {
|
|
9
|
-
$set?: any;
|
|
10
|
-
$on?: any;
|
|
11
|
-
};
|
|
12
|
-
z_$$bindings?: Bindings;
|
|
13
|
-
}
|
|
14
|
-
declare const Toaster: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
-
[evt: string]: CustomEvent<any>;
|
|
16
|
-
}, {}, {}, string>;
|
|
17
|
-
type Toaster = InstanceType<typeof Toaster>;
|
|
18
|
-
export default Toaster;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { type ISO4217Code, MoneyPrimitive } from "@internal/core";
|
|
2
|
-
type $$ComponentProps = {
|
|
3
|
-
/** Amount in minor or major units (see unit prop) */
|
|
4
|
-
amount?: number | null | undefined;
|
|
5
|
-
/**
|
|
6
|
-
* MoneyPrimitive instance. When provided, amount, currency, and unit
|
|
7
|
-
* are derived from the primitive. Takes precedence over raw amount.
|
|
8
|
-
*/
|
|
9
|
-
money?: MoneyPrimitive;
|
|
10
|
-
/**
|
|
11
|
-
* Whether the amount is in 'major' (e.g., pesos) or 'minor' (e.g., centavos) units.
|
|
12
|
-
* @deprecated Use `money` prop with MoneyPrimitive instead.
|
|
13
|
-
* Defaults to 'minor' for backward compatibility.
|
|
14
|
-
*/
|
|
15
|
-
unit?: "major" | "minor";
|
|
16
|
-
/** String to display if amount is null, undefined, or NaN. Defaults to "—" */
|
|
17
|
-
fallback?: string;
|
|
18
|
-
/** Override currency code (defaults to CurrencyStore.current) */
|
|
19
|
-
currency?: ISO4217Code | string;
|
|
20
|
-
/** The currency the amount is stored in (e.g. MXN) */
|
|
21
|
-
sourceCurrency?: ISO4217Code | string;
|
|
22
|
-
/** Show the original currency as a label */
|
|
23
|
-
showSourceCurrency?: boolean;
|
|
24
|
-
/** Fallback text if conversion is needed but rates are missing */
|
|
25
|
-
noRatesFallback?: string;
|
|
26
|
-
/** Override locale (defaults to LanguageStore.current) */
|
|
27
|
-
locale?: string;
|
|
28
|
-
/** Use compact notation (e.g., $1.2M) */
|
|
29
|
-
compact?: boolean;
|
|
30
|
-
};
|
|
31
|
-
declare const MoneyDisplay: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
32
|
-
type MoneyDisplay = ReturnType<typeof MoneyDisplay>;
|
|
33
|
-
export default MoneyDisplay;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "@testing-library/jest-dom/vitest";
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { render, screen } from "@testing-library/svelte";
|
|
2
|
-
import "@testing-library/jest-dom/vitest";
|
|
3
|
-
import { describe, expect, it } from "vitest";
|
|
4
|
-
import MoneyDisplay from "./MoneyDisplay.svelte";
|
|
5
|
-
import { RUNE_LAB_CONTEXT } from "@internal/state";
|
|
6
|
-
// Mock stores for context
|
|
7
|
-
const mockCurrencyStore = {
|
|
8
|
-
current: "USD",
|
|
9
|
-
get: (code) => {
|
|
10
|
-
if (code === "JPY")
|
|
11
|
-
return { symbol: "¥", decimals: 0 };
|
|
12
|
-
if (code === "MXN")
|
|
13
|
-
return { symbol: "$", decimals: 2 };
|
|
14
|
-
return { symbol: "$", decimals: 2 };
|
|
15
|
-
},
|
|
16
|
-
canConvert: true,
|
|
17
|
-
convertAmount: (amount, from, to) => {
|
|
18
|
-
if (from === "USD" && to === "MXN")
|
|
19
|
-
return amount * 20;
|
|
20
|
-
if (from === "MXN" && to === "USD")
|
|
21
|
-
return amount / 20;
|
|
22
|
-
return amount;
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
const mockLanguageStore = {
|
|
26
|
-
current: "en-US",
|
|
27
|
-
};
|
|
28
|
-
const context = new Map([
|
|
29
|
-
[RUNE_LAB_CONTEXT.currency, mockCurrencyStore],
|
|
30
|
-
[RUNE_LAB_CONTEXT.language, mockLanguageStore],
|
|
31
|
-
]);
|
|
32
|
-
describe("MoneyDisplay.svelte", () => {
|
|
33
|
-
it("renders fallback when amount is null", () => {
|
|
34
|
-
render(MoneyDisplay, {
|
|
35
|
-
props: { amount: null, fallback: "N/A" },
|
|
36
|
-
context,
|
|
37
|
-
});
|
|
38
|
-
expect(screen.getByText("N/A")).toBeInTheDocument();
|
|
39
|
-
});
|
|
40
|
-
it("renders fallback when amount is undefined", () => {
|
|
41
|
-
render(MoneyDisplay, {
|
|
42
|
-
props: { amount: undefined, fallback: "N/A" },
|
|
43
|
-
context,
|
|
44
|
-
});
|
|
45
|
-
expect(screen.getByText("N/A")).toBeInTheDocument();
|
|
46
|
-
});
|
|
47
|
-
it("renders fallback when amount is NaN", () => {
|
|
48
|
-
render(MoneyDisplay, {
|
|
49
|
-
props: { amount: NaN, fallback: "N/A" },
|
|
50
|
-
context,
|
|
51
|
-
});
|
|
52
|
-
expect(screen.getByText("N/A")).toBeInTheDocument();
|
|
53
|
-
});
|
|
54
|
-
it("renders default fallback when amount is NaN and no fallback prop provided", () => {
|
|
55
|
-
render(MoneyDisplay, {
|
|
56
|
-
props: { amount: NaN },
|
|
57
|
-
context,
|
|
58
|
-
});
|
|
59
|
-
expect(screen.getByText("—")).toBeInTheDocument();
|
|
60
|
-
});
|
|
61
|
-
it("renders zero correctly when passed literal 0", () => {
|
|
62
|
-
render(MoneyDisplay, {
|
|
63
|
-
props: { amount: 0 },
|
|
64
|
-
context,
|
|
65
|
-
});
|
|
66
|
-
expect(screen.getByText(/\$0\.00/)).toBeInTheDocument();
|
|
67
|
-
});
|
|
68
|
-
it('handles unit="major"', () => {
|
|
69
|
-
render(MoneyDisplay, {
|
|
70
|
-
props: { amount: 125.50, unit: "major", currency: "USD" },
|
|
71
|
-
context,
|
|
72
|
-
});
|
|
73
|
-
expect(screen.getByText(/\$125\.50/)).toBeInTheDocument();
|
|
74
|
-
});
|
|
75
|
-
it('handles unit="minor" (default)', () => {
|
|
76
|
-
render(MoneyDisplay, {
|
|
77
|
-
props: { amount: 12550, unit: "minor", currency: "USD" },
|
|
78
|
-
context,
|
|
79
|
-
});
|
|
80
|
-
expect(screen.getByText(/\$125\.50/)).toBeInTheDocument();
|
|
81
|
-
});
|
|
82
|
-
it("supports compact notation", () => {
|
|
83
|
-
render(MoneyDisplay, {
|
|
84
|
-
props: { amount: 1200000, unit: "major", currency: "USD", compact: true },
|
|
85
|
-
context,
|
|
86
|
-
});
|
|
87
|
-
expect(screen.getByText(/\$1\.2M/)).toBeInTheDocument();
|
|
88
|
-
});
|
|
89
|
-
it("converts from sourceCurrency to current display currency", () => {
|
|
90
|
-
// 2000 MXN -> 100 USD
|
|
91
|
-
render(MoneyDisplay, {
|
|
92
|
-
props: { amount: 2000, unit: "major", sourceCurrency: "MXN" },
|
|
93
|
-
context,
|
|
94
|
-
});
|
|
95
|
-
expect(screen.getByText(/\$100\.00/)).toBeInTheDocument();
|
|
96
|
-
});
|
|
97
|
-
it("shows source currency label when showSourceCurrency is true", () => {
|
|
98
|
-
render(MoneyDisplay, {
|
|
99
|
-
props: { amount: 2000, unit: "major", sourceCurrency: "MXN", showSourceCurrency: true },
|
|
100
|
-
context,
|
|
101
|
-
});
|
|
102
|
-
expect(screen.getByText("(MXN)")).toBeInTheDocument();
|
|
103
|
-
});
|
|
104
|
-
it("falls back to source currency when conversion is impossible", () => {
|
|
105
|
-
const contextNoConvert = new Map(context);
|
|
106
|
-
contextNoConvert.set(RUNE_LAB_CONTEXT.currency, {
|
|
107
|
-
...mockCurrencyStore,
|
|
108
|
-
canConvert: false
|
|
109
|
-
});
|
|
110
|
-
render(MoneyDisplay, {
|
|
111
|
-
props: { amount: 2000, unit: "major", sourceCurrency: "MXN" },
|
|
112
|
-
context: contextNoConvert,
|
|
113
|
-
});
|
|
114
|
-
// Should show $2,000.00 (MXN)
|
|
115
|
-
expect(screen.getByText(/\$2,000\.00/)).toBeInTheDocument();
|
|
116
|
-
});
|
|
117
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { ISO4217Code } from "@internal/core";
|
|
2
|
-
import { MoneyPrimitive } from "@internal/core";
|
|
3
|
-
export interface MoneyInputProps {
|
|
4
|
-
/** Current value in minor or major units (see unit prop) */
|
|
5
|
-
amount?: number | null | undefined;
|
|
6
|
-
/**
|
|
7
|
-
* MoneyPrimitive instance. When provided, initial amount and currency
|
|
8
|
-
* are derived from the primitive. Read-only input — output still fires oninput().
|
|
9
|
-
*/
|
|
10
|
-
money?: MoneyPrimitive;
|
|
11
|
-
/**
|
|
12
|
-
* Whether the amount is in 'major' (e.g., pesos) or 'minor' (e.g., centavos) units.
|
|
13
|
-
* @deprecated Use `money` prop with MoneyPrimitive instead.
|
|
14
|
-
* Defaults to 'minor' for backward compatibility.
|
|
15
|
-
*/
|
|
16
|
-
unit?: "major" | "minor";
|
|
17
|
-
/** Override currency code (defaults to CurrencyStore.current) */
|
|
18
|
-
currency?: ISO4217Code | string;
|
|
19
|
-
/** The currency the amount is stored in (e.g. MXN) */
|
|
20
|
-
storageCurrency?: ISO4217Code | string;
|
|
21
|
-
/** Minimum value in same units as amount (in storageCurrency) */
|
|
22
|
-
min?: number;
|
|
23
|
-
/** Maximum value in same units as amount (in storageCurrency) */
|
|
24
|
-
max?: number;
|
|
25
|
-
/** Placeholder text */
|
|
26
|
-
placeholder?: string;
|
|
27
|
-
/** Fired when the value changes (unit matches the unit prop, in storageCurrency) */
|
|
28
|
-
oninput?: (val: number) => void;
|
|
29
|
-
/** Input disabled state */
|
|
30
|
-
disabled?: boolean;
|
|
31
|
-
}
|
|
32
|
-
declare const MoneyInput: import("svelte").Component<MoneyInputProps, {}, "amount">;
|
|
33
|
-
type MoneyInput = ReturnType<typeof MoneyInput>;
|
|
34
|
-
export default MoneyInput;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
UserAvatar — Universal user identity primitive.
|
|
3
|
-
Renders avatar image or falls back to generated initials.
|
|
4
|
-
Zero domain knowledge.
|
|
5
|
-
-->
|
|
6
|
-
<script module lang="ts">
|
|
7
|
-
export interface UserAvatarProps {
|
|
8
|
-
/** User's display name (used for initials fallback) */
|
|
9
|
-
name: string;
|
|
10
|
-
/** URL to avatar image */
|
|
11
|
-
avatar_url?: string;
|
|
12
|
-
/** Size variant */
|
|
13
|
-
size?: "xs" | "sm" | "md" | "lg";
|
|
14
|
-
/** Show online indicator */
|
|
15
|
-
online?: boolean;
|
|
16
|
-
}
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<script lang="ts">
|
|
20
|
-
let { name, avatar_url, size = "md", online }: UserAvatarProps = $props();
|
|
21
|
-
|
|
22
|
-
const sizeClasses: Record<string, string> = {
|
|
23
|
-
xs: "w-6 h-6 text-[10px]",
|
|
24
|
-
sm: "w-8 h-8 text-xs",
|
|
25
|
-
md: "w-10 h-10 text-sm",
|
|
26
|
-
lg: "w-14 h-14 text-lg",
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const initials = $derived(
|
|
30
|
-
name
|
|
31
|
-
.split(/\s+/)
|
|
32
|
-
.filter(Boolean)
|
|
33
|
-
.slice(0, 2)
|
|
34
|
-
.map((word) => word[0].toUpperCase())
|
|
35
|
-
.join(""),
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Deterministic color from name — generates a consistent hue
|
|
40
|
-
* so the same user always gets the same color
|
|
41
|
-
*/
|
|
42
|
-
const bgHue = $derived(
|
|
43
|
-
name.split("").reduce((hash, char) => {
|
|
44
|
-
return char.charCodeAt(0) + ((hash << 5) - hash);
|
|
45
|
-
}, 0) % 360,
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
const bgColor = $derived(`hsl(${Math.abs(bgHue)}, 60%, 45%)`);
|
|
49
|
-
</script>
|
|
50
|
-
|
|
51
|
-
<div class="avatar placeholder" class:online>
|
|
52
|
-
<div
|
|
53
|
-
class="rounded-full {sizeClasses[size]}"
|
|
54
|
-
style={avatar_url ? undefined : `background-color: ${bgColor}`}
|
|
55
|
-
>
|
|
56
|
-
{#if avatar_url}
|
|
57
|
-
<img
|
|
58
|
-
src={avatar_url}
|
|
59
|
-
alt={`${name}'s avatar`}
|
|
60
|
-
class="rounded-full object-cover"
|
|
61
|
-
/>
|
|
62
|
-
{:else}
|
|
63
|
-
<span class="text-white font-semibold select-none">{initials}</span>
|
|
64
|
-
{/if}
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface UserAvatarProps {
|
|
2
|
-
/** User's display name (used for initials fallback) */
|
|
3
|
-
name: string;
|
|
4
|
-
/** URL to avatar image */
|
|
5
|
-
avatar_url?: string;
|
|
6
|
-
/** Size variant */
|
|
7
|
-
size?: "xs" | "sm" | "md" | "lg";
|
|
8
|
-
/** Show online indicator */
|
|
9
|
-
online?: boolean;
|
|
10
|
-
}
|
|
11
|
-
declare const UserAvatar: import("svelte").Component<UserAvatarProps, {}, "">;
|
|
12
|
-
type UserAvatar = ReturnType<typeof UserAvatar>;
|
|
13
|
-
export default UserAvatar;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
UserProfile — Richer user identity card.
|
|
3
|
-
Composes UserAvatar + name/role/email.
|
|
4
|
-
Zero domain knowledge.
|
|
5
|
-
-->
|
|
6
|
-
<script module lang="ts">
|
|
7
|
-
export interface UserProfileProps {
|
|
8
|
-
/** User's display name */
|
|
9
|
-
name: string;
|
|
10
|
-
/** User's email address */
|
|
11
|
-
email?: string;
|
|
12
|
-
/** User's role or title */
|
|
13
|
-
role?: string;
|
|
14
|
-
/** URL to avatar image */
|
|
15
|
-
avatar_url?: string;
|
|
16
|
-
/** Size variant */
|
|
17
|
-
size?: "sm" | "md" | "lg";
|
|
18
|
-
/** Display variant */
|
|
19
|
-
variant?: "card" | "trigger";
|
|
20
|
-
}
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
<script lang="ts">
|
|
24
|
-
import UserAvatar from "./UserAvatar.svelte";
|
|
25
|
-
|
|
26
|
-
let {
|
|
27
|
-
name,
|
|
28
|
-
email,
|
|
29
|
-
role,
|
|
30
|
-
avatar_url,
|
|
31
|
-
size = "md",
|
|
32
|
-
variant = "card",
|
|
33
|
-
}: UserProfileProps = $props();
|
|
34
|
-
|
|
35
|
-
const avatarSize = $derived(
|
|
36
|
-
size === "sm" ? "sm" : size === "lg" ? "lg" : "md",
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
const textSizes = $derived({
|
|
40
|
-
name:
|
|
41
|
-
size === "sm" ? "text-sm" : size === "lg" ? "text-lg" : "text-base",
|
|
42
|
-
meta: size === "sm" ? "text-xs" : size === "lg" ? "text-sm" : "text-xs",
|
|
43
|
-
});
|
|
44
|
-
</script>
|
|
45
|
-
|
|
46
|
-
{#if variant === "trigger"}
|
|
47
|
-
<!-- Compact trigger variant — for navbar dropdowns -->
|
|
48
|
-
<div
|
|
49
|
-
class="flex items-center gap-2 cursor-pointer hover:opacity-80 transition-opacity"
|
|
50
|
-
>
|
|
51
|
-
<UserAvatar {name} {avatar_url} size={avatarSize} />
|
|
52
|
-
<div class="flex flex-col leading-tight min-w-0">
|
|
53
|
-
<span class="{textSizes.name} font-medium truncate">{name}</span>
|
|
54
|
-
{#if role}
|
|
55
|
-
<span class="{textSizes.meta} text-base-content/60 truncate"
|
|
56
|
-
>{role}</span
|
|
57
|
-
>
|
|
58
|
-
{/if}
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
{:else}
|
|
62
|
-
<!-- Card variant — for profile pages / settings -->
|
|
63
|
-
<div class="flex items-center gap-3 p-3 rounded-box bg-base-200/50">
|
|
64
|
-
<UserAvatar {name} {avatar_url} size={avatarSize} />
|
|
65
|
-
<div class="flex flex-col leading-tight min-w-0">
|
|
66
|
-
<span class="{textSizes.name} font-semibold truncate">{name}</span>
|
|
67
|
-
{#if role}
|
|
68
|
-
<span class="{textSizes.meta} text-base-content/60 truncate"
|
|
69
|
-
>{role}</span
|
|
70
|
-
>
|
|
71
|
-
{/if}
|
|
72
|
-
{#if email}
|
|
73
|
-
<span class="{textSizes.meta} text-base-content/40 truncate"
|
|
74
|
-
>{email}</span
|
|
75
|
-
>
|
|
76
|
-
{/if}
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
{/if}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export interface UserProfileProps {
|
|
2
|
-
/** User's display name */
|
|
3
|
-
name: string;
|
|
4
|
-
/** User's email address */
|
|
5
|
-
email?: string;
|
|
6
|
-
/** User's role or title */
|
|
7
|
-
role?: string;
|
|
8
|
-
/** URL to avatar image */
|
|
9
|
-
avatar_url?: string;
|
|
10
|
-
/** Size variant */
|
|
11
|
-
size?: "sm" | "md" | "lg";
|
|
12
|
-
/** Display variant */
|
|
13
|
-
variant?: "card" | "trigger";
|
|
14
|
-
}
|
|
15
|
-
declare const UserProfile: import("svelte").Component<UserProfileProps, {}, "">;
|
|
16
|
-
type UserProfile = ReturnType<typeof UserProfile>;
|
|
17
|
-
export default UserProfile;
|