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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getCommandStore } from "@rune-lab/kernel";
|
|
2
|
+
import type { Command, ConfigStore, IToastStore } from "@rune-lab/kernel";
|
|
3
|
+
|
|
4
|
+
export type { Command };
|
|
5
|
+
|
|
6
|
+
export interface CommandServices {
|
|
7
|
+
appStore: unknown;
|
|
8
|
+
apiStore: unknown;
|
|
9
|
+
toastStore: IToastStore;
|
|
10
|
+
themeStore: ConfigStore<unknown>;
|
|
11
|
+
languageStore: ConfigStore<unknown>;
|
|
12
|
+
currencyStore: ConfigStore<unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class CommandStore {
|
|
16
|
+
// Dependency Injection
|
|
17
|
+
#services: CommandServices;
|
|
18
|
+
|
|
19
|
+
constructor(services: CommandServices) {
|
|
20
|
+
this.#services = services;
|
|
21
|
+
this.refreshDefaultCommands();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
commands: Command[] = $state<Command[]>([]);
|
|
25
|
+
|
|
26
|
+
refreshDefaultCommands(): void {
|
|
27
|
+
// Intentionally empty.
|
|
28
|
+
this.commands = [];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Register a new command
|
|
33
|
+
*/
|
|
34
|
+
register(command: Command): void {
|
|
35
|
+
if (this.commands.find((c) => c.id === command.id)) return;
|
|
36
|
+
this.commands.push(command);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Remove a command by id
|
|
41
|
+
*/
|
|
42
|
+
unregister(id: string): void {
|
|
43
|
+
this.commands = this.commands.filter((c) => c.id !== id);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Search commands, optionally scoped to a parent's children
|
|
48
|
+
*/
|
|
49
|
+
search(query: string, parentId?: string): Command[] {
|
|
50
|
+
const targetList = parentId
|
|
51
|
+
? (this.#findById(parentId, this.commands)?.children ?? [])
|
|
52
|
+
: this.commands;
|
|
53
|
+
|
|
54
|
+
if (!query) return targetList;
|
|
55
|
+
|
|
56
|
+
const q = query.toLowerCase();
|
|
57
|
+
return targetList.filter(
|
|
58
|
+
(c) =>
|
|
59
|
+
c.label.toLowerCase().includes(q) ||
|
|
60
|
+
c.category?.toLowerCase().includes(q),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#findById(id: string, list: Command[]): Command | undefined {
|
|
65
|
+
for (const cmd of list) {
|
|
66
|
+
if (cmd.id === id) return cmd;
|
|
67
|
+
if (cmd.children) {
|
|
68
|
+
const found = this.#findById(id, cmd.children);
|
|
69
|
+
if (found) return found;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function createCommandStore(services: CommandServices): CommandStore {
|
|
77
|
+
return new CommandStore(services);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { getCommandStore };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { defineRune, RUNE_LAB_CONTEXT } from "@rune-lab/kernel";
|
|
2
|
+
import type { ConfigStore, RunePlugin } from "@rune-lab/kernel";
|
|
3
|
+
import { createCommandStore } from "./commands/store.svelte.ts";
|
|
4
|
+
import { createShortcutStore } from "./shortcuts/store.svelte.ts";
|
|
5
|
+
import { createToastStore } from "./notifications/store.svelte.ts";
|
|
6
|
+
import type { ToastStore } from "./notifications/store.svelte.ts";
|
|
7
|
+
import CommandPalette from "./commands/CommandPalette.svelte";
|
|
8
|
+
import ShortcutPalette from "./shortcuts/ShortcutPalette.svelte";
|
|
9
|
+
import Toaster from "./notifications/Toaster.svelte";
|
|
10
|
+
|
|
11
|
+
export * from "./commands/mod.ts";
|
|
12
|
+
export * from "./shortcuts/mod.ts";
|
|
13
|
+
export * from "./notifications/mod.ts";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Palettes Plugin — provides the command palette, shortcut manager, and toast system.
|
|
17
|
+
* Always included by default in RuneProvider.
|
|
18
|
+
*/
|
|
19
|
+
export const PalettesPlugin: RunePlugin = defineRune({
|
|
20
|
+
id: "rune-lab.palettes",
|
|
21
|
+
stores: [
|
|
22
|
+
{
|
|
23
|
+
id: "commands",
|
|
24
|
+
contextKey: RUNE_LAB_CONTEXT.commands,
|
|
25
|
+
factory: (_config, _driver, stores) =>
|
|
26
|
+
createCommandStore({
|
|
27
|
+
appStore: stores.get("app"),
|
|
28
|
+
apiStore: stores.get("api"),
|
|
29
|
+
toastStore: stores.get("toast") as ToastStore,
|
|
30
|
+
themeStore: stores.get("theme") as ConfigStore<unknown>,
|
|
31
|
+
languageStore: stores.get("language") as ConfigStore<unknown>,
|
|
32
|
+
currencyStore: stores.get("currency") as ConfigStore<unknown>,
|
|
33
|
+
}),
|
|
34
|
+
dependsOn: ["app", "api", "toast", "theme", "language", "currency"],
|
|
35
|
+
noPersistence: true,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "shortcut",
|
|
39
|
+
contextKey: RUNE_LAB_CONTEXT.shortcut,
|
|
40
|
+
factory: () => createShortcutStore(),
|
|
41
|
+
noPersistence: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "toast",
|
|
45
|
+
contextKey: RUNE_LAB_CONTEXT.toast,
|
|
46
|
+
factory: () => createToastStore(),
|
|
47
|
+
noPersistence: true,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
overlays: [CommandPalette, ShortcutPalette, Toaster],
|
|
51
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ToastStore, ToastType } from "./store.svelte.ts";
|
|
2
|
+
|
|
3
|
+
interface QueuedToast {
|
|
4
|
+
message: string;
|
|
5
|
+
type: ToastType;
|
|
6
|
+
duration?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const queue: QueuedToast[] = [];
|
|
10
|
+
let activeStore: ToastStore | null = null;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Notifies the global toast system.
|
|
14
|
+
* If called before the ToastStore is initialized (e.g., in a module-level store),
|
|
15
|
+
* it queues the toast and flushes it once wired.
|
|
16
|
+
*
|
|
17
|
+
* @clientOnly — Not safe for use in SSR contexts. Module-level state persists across requests.
|
|
18
|
+
*/
|
|
19
|
+
export function notify(
|
|
20
|
+
message: string,
|
|
21
|
+
type: ToastType = "info",
|
|
22
|
+
duration?: number,
|
|
23
|
+
) {
|
|
24
|
+
if (typeof window === "undefined") return; // No-op on server
|
|
25
|
+
|
|
26
|
+
if (activeStore) {
|
|
27
|
+
activeStore.send(message, type, duration ?? 3000);
|
|
28
|
+
} else {
|
|
29
|
+
queue.push({ message, type, duration });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Wires the global `notify` function to an active ToastStore instance.
|
|
35
|
+
* Automatically flushes any queued toasts.
|
|
36
|
+
*/
|
|
37
|
+
export function wire(store: ToastStore) {
|
|
38
|
+
activeStore = store;
|
|
39
|
+
while (queue.length > 0) {
|
|
40
|
+
const next = queue.shift();
|
|
41
|
+
if (next) store.send(next.message, next.type, next.duration ?? 3000);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Escape hatch for module-level stores to send toasts without Svelte context.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { createToastBridge } from "rune-lab";
|
|
51
|
+
* const { notify } = createToastBridge();
|
|
52
|
+
*
|
|
53
|
+
* notify("Logged in successfully", "success");
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export const createToastBridge = () => ({ notify, wire });
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast notification store
|
|
3
|
+
*/
|
|
4
|
+
import { getToastStore } from "@rune-lab/kernel";
|
|
5
|
+
import type { Toast, ToastType } from "@rune-lab/kernel";
|
|
6
|
+
|
|
7
|
+
export type { Toast, ToastType };
|
|
8
|
+
|
|
9
|
+
export class ToastStore {
|
|
10
|
+
toasts: Toast[] = $state<Toast[]>([]);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Add a new toast
|
|
14
|
+
*/
|
|
15
|
+
send(
|
|
16
|
+
message: string,
|
|
17
|
+
type: ToastType = "info",
|
|
18
|
+
duration: number = 3000,
|
|
19
|
+
): void {
|
|
20
|
+
const id = crypto.randomUUID();
|
|
21
|
+
const toast: Toast = { id, message, type, duration };
|
|
22
|
+
|
|
23
|
+
this.toasts.push(toast);
|
|
24
|
+
|
|
25
|
+
if (duration > 0) {
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
this.dismiss(id);
|
|
28
|
+
}, duration);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Remove a toast by id
|
|
34
|
+
*/
|
|
35
|
+
dismiss(id: string): void {
|
|
36
|
+
this.toasts = this.toasts.filter((t) => t.id !== id);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Helper methods
|
|
40
|
+
success(msg: string): void {
|
|
41
|
+
this.send(msg, "success");
|
|
42
|
+
}
|
|
43
|
+
error(msg: string): void {
|
|
44
|
+
this.send(msg, "error");
|
|
45
|
+
}
|
|
46
|
+
warn(msg: string): void {
|
|
47
|
+
this.send(msg, "warning");
|
|
48
|
+
}
|
|
49
|
+
info(msg: string): void {
|
|
50
|
+
this.send(msg, "info");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function createToastStore(): ToastStore {
|
|
55
|
+
return new ToastStore();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { getToastStore };
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
<!-- src/lib/features/shortcuts/ShortcutPalette.svelte -->
|
|
2
2
|
<script lang="ts">
|
|
3
3
|
import { tick } from "svelte";
|
|
4
|
-
import type { ShortcutEntry } from "@
|
|
4
|
+
import type { ShortcutEntry } from "@rune-lab/kernel";
|
|
5
5
|
import {
|
|
6
6
|
getAppStore,
|
|
7
7
|
getShortcutStore,
|
|
8
8
|
LAYOUT_SHORTCUTS,
|
|
9
|
-
} from "@
|
|
10
|
-
import { Icon } from "@internal/ui";
|
|
9
|
+
} from "@rune-lab/kernel";
|
|
11
10
|
|
|
12
11
|
const appStore = getAppStore();
|
|
13
12
|
const shortcutStore = getShortcutStore();
|
|
@@ -119,7 +118,8 @@
|
|
|
119
118
|
class="border-b border-base-200 p-6 flex items-center gap-4 bg-base-200/30"
|
|
120
119
|
>
|
|
121
120
|
<div class="p-2 bg-primary/10 rounded-lg text-primary">
|
|
122
|
-
<Icon name="shortcut" class="w-6 h-6" />
|
|
121
|
+
<!-- <Icon name="shortcut" class="w-6 h-6" /> -->
|
|
122
|
+
<!-- todo: Add Shortcut Icon -->
|
|
123
123
|
</div>
|
|
124
124
|
<div class="flex-1">
|
|
125
125
|
<h2 class="text-xl font-bold tracking-tight">
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { untrack } from "svelte";
|
|
2
|
+
import { getShortcutStore, shortcutListener } from "@rune-lab/kernel";
|
|
3
|
+
import type { ShortcutConfig, ShortcutEntry } from "@rune-lab/kernel";
|
|
4
|
+
|
|
5
|
+
export type { ShortcutConfig, ShortcutEntry };
|
|
6
|
+
|
|
7
|
+
export class ShortcutStore {
|
|
8
|
+
entries: ShortcutEntry[] = $state<ShortcutEntry[]>([]);
|
|
9
|
+
showPalette: boolean = $state(false);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Filtered list of entries active in the current scope
|
|
13
|
+
*/
|
|
14
|
+
active: ShortcutEntry[] = $derived(
|
|
15
|
+
this.entries.filter((e) => e.enabled !== false),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Grouped view for documentation/palette
|
|
20
|
+
*/
|
|
21
|
+
byScopeAndCategory: Record<string, Record<string, ShortcutEntry[]>> = $derived
|
|
22
|
+
.by(() => {
|
|
23
|
+
const groups: Record<string, Record<string, ShortcutEntry[]>> = {};
|
|
24
|
+
for (const entry of this.entries) {
|
|
25
|
+
const scope = entry.scope ?? "global";
|
|
26
|
+
const category = entry.category ?? "General";
|
|
27
|
+
if (!groups[scope]) groups[scope] = {};
|
|
28
|
+
if (!groups[scope][category]) groups[scope][category] = [];
|
|
29
|
+
groups[scope][category].push(entry);
|
|
30
|
+
}
|
|
31
|
+
return groups;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Scopes sorted for palette display
|
|
36
|
+
*/
|
|
37
|
+
sortedScopes: string[] = $derived.by(() => {
|
|
38
|
+
const scopes = Object.keys(this.byScopeAndCategory).sort((a, b) => {
|
|
39
|
+
if (a === "global") return -1;
|
|
40
|
+
if (b === "global") return 1;
|
|
41
|
+
if (a === "layout") return -1;
|
|
42
|
+
if (b === "layout") return 1;
|
|
43
|
+
return a.localeCompare(b);
|
|
44
|
+
});
|
|
45
|
+
return scopes;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Register a single shortcut or an array
|
|
50
|
+
*/
|
|
51
|
+
register(entry: ShortcutEntry): void {
|
|
52
|
+
if (this.entries.find((e) => e.id === entry.id)) return;
|
|
53
|
+
this.entries.push({ ...entry, enabled: true });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Remove shortcut by ID
|
|
58
|
+
*/
|
|
59
|
+
unregister(id: string): void {
|
|
60
|
+
this.entries = this.entries.filter((e) => e.id !== id);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Enable/Disable a shortcut
|
|
65
|
+
*/
|
|
66
|
+
setEnabled(id: string, enabled: boolean): void {
|
|
67
|
+
const entry = this.entries.find((e) => e.id === id);
|
|
68
|
+
if (entry) entry.enabled = enabled;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Find conflicts for a given key combo and scope
|
|
73
|
+
*/
|
|
74
|
+
findConflicts(keys: string, scope: string): ShortcutEntry[] {
|
|
75
|
+
return untrack(() =>
|
|
76
|
+
this.entries.filter((e) => e.keys === keys && e.scope === scope)
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function createShortcutStore(): ShortcutStore {
|
|
82
|
+
return new ShortcutStore();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { getShortcutStore, shortcutListener };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// sdk/state/src/composables/useShortcuts.ts
|
|
2
|
+
// Declarative shortcut registration with automatic lifecycle cleanup.
|
|
3
|
+
// Bridges ShortcutConfig (sdk/core) → ShortcutStore (sdk/state).
|
|
4
|
+
|
|
5
|
+
import { getShortcutStore } from "./store.svelte.ts";
|
|
6
|
+
import type { ShortcutEntry } from "./store.svelte.ts";
|
|
7
|
+
import type { ShortcutConfig } from "./types.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Declarative shortcut registration composable.
|
|
11
|
+
* Registers all shortcuts via ShortcutStore in a single `$effect` and
|
|
12
|
+
* automatically unregisters them when the component is destroyed.
|
|
13
|
+
*
|
|
14
|
+
* Must be called at component initialization time (top-level in `<script>`),
|
|
15
|
+
* not inside event handlers.
|
|
16
|
+
*
|
|
17
|
+
* @param configs - Array of ShortcutConfig
|
|
18
|
+
* @returns Object with `registered` getter for the list of registered IDs
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```svelte
|
|
22
|
+
* <script>
|
|
23
|
+
* import { useShortcuts } from '@rune-lab/palettes';
|
|
24
|
+
*
|
|
25
|
+
* useShortcuts([
|
|
26
|
+
* {
|
|
27
|
+
* id: "save:document",
|
|
28
|
+
* keys: "ctrl+s",
|
|
29
|
+
* handler: (e) => { e.preventDefault(); save(); },
|
|
30
|
+
* label: "Save document",
|
|
31
|
+
* category: "Editing",
|
|
32
|
+
* },
|
|
33
|
+
* ]);
|
|
34
|
+
* </script>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function useShortcuts(
|
|
38
|
+
configs: ShortcutConfig[],
|
|
39
|
+
): { readonly registered: string[] } {
|
|
40
|
+
const shortcutStore = getShortcutStore();
|
|
41
|
+
|
|
42
|
+
// Convert ShortcutConfig[] to ShortcutEntry[] respecting the `when` predicate
|
|
43
|
+
function toEntries(configs: ShortcutConfig[]): ShortcutEntry[] {
|
|
44
|
+
return configs.map((config) => ({
|
|
45
|
+
id: config.id,
|
|
46
|
+
keys: config.keys,
|
|
47
|
+
handler: (event: KeyboardEvent) => {
|
|
48
|
+
// Check `when` predicate before firing
|
|
49
|
+
if (config.when && !config.when()) return;
|
|
50
|
+
config.handler(event);
|
|
51
|
+
},
|
|
52
|
+
label: config.label ?? config.id,
|
|
53
|
+
category: config.category ?? "General",
|
|
54
|
+
scope: config.scope ?? "global",
|
|
55
|
+
enabled: true,
|
|
56
|
+
hidden: !config.label, // Hide from palette if no label
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Register all shortcuts
|
|
61
|
+
const entries = toEntries(configs);
|
|
62
|
+
const ids = entries.map((e) => e.id);
|
|
63
|
+
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
shortcutStore.register(entry);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Auto-cleanup using $effect.root for lifecycle management
|
|
69
|
+
$effect(() => {
|
|
70
|
+
// This effect runs on mount — shortcuts are already registered above.
|
|
71
|
+
// Return cleanup that unregisters all shortcuts on destroy.
|
|
72
|
+
return () => {
|
|
73
|
+
for (const id of ids) {
|
|
74
|
+
shortcutStore.unregister(id);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
/** IDs of all shortcuts registered by this composable */
|
|
81
|
+
get registered(): string[] {
|
|
82
|
+
return ids;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import ResourceSelector from "
|
|
3
|
-
import { getCurrencyStore } from "@
|
|
2
|
+
import { ResourceSelector } from "@rune-lab/layout";
|
|
3
|
+
import { getCurrencyStore } from "@rune-lab/kernel";
|
|
4
4
|
|
|
5
5
|
const currencyStore = getCurrencyStore();
|
|
6
6
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { getLanguageStore, getCurrencyStore } from "@
|
|
2
|
+
import { getLanguageStore, getCurrencyStore } from "@rune-lab/kernel";
|
|
3
3
|
import {
|
|
4
4
|
formatAmount,
|
|
5
5
|
toMinorUnit,
|
|
6
6
|
type ISO4217Code,
|
|
7
7
|
MoneyPrimitive,
|
|
8
|
-
} from "@
|
|
8
|
+
} from "@rune-lab/money";
|
|
9
9
|
import { DEV } from "esm-env";
|
|
10
10
|
|
|
11
11
|
let {
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
MoneyInput — Monetary value input that works in minor units (cents).
|
|
3
|
-
No floats cross the boundary — values are always integer minor units.
|
|
4
|
-
-->
|
|
5
1
|
<script module lang="ts">
|
|
6
|
-
import type { ISO4217Code } from "@
|
|
7
|
-
import { MoneyPrimitive } from "@
|
|
2
|
+
import type { ISO4217Code } from "@rune-lab/money";
|
|
3
|
+
import { MoneyPrimitive } from "@rune-lab/money";
|
|
8
4
|
|
|
9
5
|
export interface MoneyInputProps {
|
|
10
6
|
/** Current value in minor or major units (see unit prop) */
|
|
@@ -38,8 +34,8 @@
|
|
|
38
34
|
</script>
|
|
39
35
|
|
|
40
36
|
<script lang="ts">
|
|
41
|
-
import { getCurrencyStore } from "@
|
|
42
|
-
import { toMinorUnit } from "@
|
|
37
|
+
import { getCurrencyStore } from "@rune-lab/kernel";
|
|
38
|
+
import { toMinorUnit } from "@rune-lab/money";
|
|
43
39
|
import { DEV } from "esm-env";
|
|
44
40
|
|
|
45
41
|
let {
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ConfigStore,
|
|
3
|
+
createConfigStore,
|
|
4
|
+
getCurrencyStore,
|
|
5
|
+
} from "@rune-lab/kernel";
|
|
6
|
+
import type { Currency } from "@rune-lab/kernel";
|
|
7
|
+
import { type DineroCurrency, registerCurrency } from "@rune-lab/money";
|
|
8
|
+
import type { ExchangeRateStore } from "./exchange-rate.svelte.ts";
|
|
9
|
+
|
|
10
|
+
export type { Currency };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Helper to build a minimal Dinero definition from Currency metadata.
|
|
14
|
+
* Assumes base 10 (standard decimal) for auto-registration.
|
|
15
|
+
*/
|
|
16
|
+
function buildDineroDef(meta: Currency) {
|
|
17
|
+
return {
|
|
18
|
+
code: meta.code,
|
|
19
|
+
base: 10,
|
|
20
|
+
exponent: meta.decimals,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const CURRENCIES: Currency[] = [
|
|
25
|
+
{ code: "USD", symbol: "$", decimals: 2 },
|
|
26
|
+
{ code: "EUR", symbol: "€", decimals: 2 },
|
|
27
|
+
{ code: "GBP", symbol: "£", decimals: 2 },
|
|
28
|
+
{ code: "MXN", symbol: "$", decimals: 2 },
|
|
29
|
+
{ code: "CAD", symbol: "C$", decimals: 2 },
|
|
30
|
+
{ code: "BRL", symbol: "R$", decimals: 2 },
|
|
31
|
+
{ code: "INR", symbol: "₹", decimals: 2 },
|
|
32
|
+
{ code: "CNY", symbol: "¥", decimals: 2 },
|
|
33
|
+
{ code: "JPY", symbol: "¥", decimals: 0 },
|
|
34
|
+
{ code: "KRW", symbol: "₩", decimals: 0 },
|
|
35
|
+
{ code: "AED", symbol: "د.إ", decimals: 2 },
|
|
36
|
+
] as const;
|
|
37
|
+
|
|
38
|
+
const baseStore: ConfigStore<Currency> = createConfigStore<Currency>({
|
|
39
|
+
items: CURRENCIES,
|
|
40
|
+
storageKey: "currency",
|
|
41
|
+
displayName: "Currency",
|
|
42
|
+
idKey: "code",
|
|
43
|
+
icon: "💰",
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// We hold a reference to exchangeRateStore if configured later
|
|
47
|
+
let _exchangeRateStore: ExchangeRateStore | undefined;
|
|
48
|
+
export function setExchangeRateStore(store: ExchangeRateStore) {
|
|
49
|
+
_exchangeRateStore = store;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Extension: Atomic currency registration.
|
|
54
|
+
* Updates both the Dinero registry (core) and the reactive store (UI).
|
|
55
|
+
*
|
|
56
|
+
* @remarks Custom currencies with non-decimal base systems must use
|
|
57
|
+
* registerCurrency() from @rune-lab/kernel explicitly before addItems().
|
|
58
|
+
*/
|
|
59
|
+
function addCurrency(meta: Currency, dineroDef?: unknown) {
|
|
60
|
+
const def = dineroDef || buildDineroDef(meta);
|
|
61
|
+
registerCurrency(meta.code, def as DineroCurrency<number>);
|
|
62
|
+
baseStore.addItems([meta]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Converts an amount from one currency to another.
|
|
67
|
+
* Defaults to converting to the current store currency.
|
|
68
|
+
*/
|
|
69
|
+
function convertAmount(
|
|
70
|
+
amount: number,
|
|
71
|
+
fromCode: string,
|
|
72
|
+
toCode?: string,
|
|
73
|
+
): number {
|
|
74
|
+
const target = toCode ?? String((baseStore as ConfigStore<Currency>).current);
|
|
75
|
+
if (fromCode === target) return amount;
|
|
76
|
+
if (!_exchangeRateStore || !_exchangeRateStore.hasRates) return amount;
|
|
77
|
+
|
|
78
|
+
return _exchangeRateStore.convertAmount(amount, fromCode, target);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const currencyStore: ConfigStore<Currency> & {
|
|
82
|
+
addCurrency: typeof addCurrency;
|
|
83
|
+
convertAmount: typeof convertAmount;
|
|
84
|
+
readonly canConvert: boolean;
|
|
85
|
+
} = Object.assign(baseStore, {
|
|
86
|
+
addCurrency,
|
|
87
|
+
convertAmount,
|
|
88
|
+
get canConvert() {
|
|
89
|
+
return !!_exchangeRateStore?.hasRates;
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
export type CurrencyStore = typeof currencyStore;
|
|
94
|
+
|
|
95
|
+
export { getCurrencyStore };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { currencyStore } from "./currency.svelte.ts";
|
|
3
|
+
|
|
4
|
+
describe("Currency Store", () => {
|
|
5
|
+
it("should have prototype methods from ConfigStore", () => {
|
|
6
|
+
// These come from the ConfigStore class prototype
|
|
7
|
+
expect(typeof currencyStore.get).toBe("function");
|
|
8
|
+
expect(typeof currencyStore.set).toBe("function");
|
|
9
|
+
expect(typeof currencyStore.getProp).toBe("function");
|
|
10
|
+
expect(typeof currencyStore.addItems).toBe("function");
|
|
11
|
+
|
|
12
|
+
// These are instance properties
|
|
13
|
+
expect(currencyStore.current).toBeDefined();
|
|
14
|
+
expect(Array.isArray(currencyStore.available)).toBe(true);
|
|
15
|
+
|
|
16
|
+
// This is the extension method
|
|
17
|
+
expect(typeof currencyStore.addCurrency).toBe("function");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should correctly use prototype methods", () => {
|
|
21
|
+
const usd = currencyStore.get("USD" as never);
|
|
22
|
+
|
|
23
|
+
expect(usd).toBeDefined();
|
|
24
|
+
expect(usd?.code).toBe("USD");
|
|
25
|
+
expect(usd?.symbol).toBe("$");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should add a new currency and keep methods", () => {
|
|
29
|
+
currencyStore.addCurrency({ code: "BTC", symbol: "₿", decimals: 8 });
|
|
30
|
+
|
|
31
|
+
const btc = currencyStore.get("BTC" as never);
|
|
32
|
+
expect(btc).toBeDefined();
|
|
33
|
+
expect(btc?.code).toBe("BTC");
|
|
34
|
+
expect(btc?.decimals).toBe(8);
|
|
35
|
+
|
|
36
|
+
// Methods still exist after interaction
|
|
37
|
+
expect(typeof currencyStore.get).toBe("function");
|
|
38
|
+
expect(typeof currencyStore.set).toBe("function");
|
|
39
|
+
});
|
|
40
|
+
});
|