rune-lab 0.3.1 → 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 +4 -4
- package/deno.json +50 -0
- package/justfile +5 -0
- package/package.json +3 -80
- 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/src/kernel/src/persistence/provider.ts +58 -0
- 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 +7 -8
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +5 -3
- package/src/runes/layout/src/Icon.svelte +7 -0
- package/src/runes/layout/src/LanguageSelector.svelte +45 -0
- package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
- package/src/runes/layout/src/ResourceSelector.svelte +90 -0
- package/src/runes/layout/src/ThemeSelector.svelte +50 -0
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +13 -3
- 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/src/runes/plugins/money/src/CurrencySelector.svelte +41 -0
- package/src/runes/plugins/money/src/MoneyDisplay.svelte +142 -0
- package/src/runes/plugins/money/src/MoneyInput.svelte +208 -0
- 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/src/runes/plugins/money/src/strategies.ts +95 -0
- 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/index.d.ts +0 -4
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -3
- 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/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.d.ts +0 -57
- package/dist/core/money/money.d.ts.map +0 -1
- package/dist/core/money/money.js +0 -132
- 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/index.d.ts +0 -5
- package/dist/index.js +0 -5
- 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 -57
- 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 -15
- package/dist/state/composables/useMoney.js +0 -62
- 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/context.d.ts +0 -14
- package/dist/state/context.js +0 -15
- package/dist/state/createConfigStore.svelte.d.ts +0 -55
- package/dist/state/createConfigStore.svelte.js +0 -61
- package/dist/state/currency.svelte.d.ts +0 -28
- package/dist/state/currency.svelte.js +0 -80
- package/dist/state/daisyui.d.ts +0 -4
- package/dist/state/index.d.ts +0 -19
- package/dist/state/index.js +0 -25
- package/dist/state/language.svelte.d.ts +0 -64
- package/dist/state/language.svelte.js +0 -44
- 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 -73
- 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 -22
- 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 -198
- package/dist/ui/components/RuneProvider.svelte.d.ts +0 -42
- package/dist/ui/components/Toaster.svelte.d.ts +0 -18
- package/dist/ui/components/money/MoneyDisplay.svelte +0 -69
- package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -21
- package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
- package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -74
- package/dist/ui/components/money/MoneyInput.svelte +0 -131
- package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -25
- 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/AppSettingSelector.svelte.d.ts +0 -13
- package/dist/ui/features/config/CurrencySelector.svelte +0 -67
- package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/LanguageSelector.svelte +0 -66
- package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/ThemeSelector.svelte +0 -73
- 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/ShortcutPalette.svelte.d.ts +0 -6
- package/dist/ui/index.d.ts +0 -26
- package/dist/ui/index.js +0 -41
- 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 -25
- package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
- package/dist/ui/layout/index.d.ts +0 -7
- package/dist/ui/layout/index.js +0 -7
- package/dist/ui/paraglide/README.md +0 -94
- 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 -749
- package/dist/ui/paraglide/runtime.js +0 -1777
- package/dist/ui/paraglide/server.d.ts +0 -103
- package/dist/ui/paraglide/server.js +0 -248
- 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,73 @@
|
|
|
1
|
+
// @ts-nocheck: legacy daisyui imports and complex ConfigStore typing
|
|
2
|
+
// client/packages/ui/src/state/theme-config.svelte.ts
|
|
3
|
+
|
|
4
|
+
import { createConfigStore, getThemeStore } from "@rune-lab/kernel";
|
|
5
|
+
import type { Theme } from "@rune-lab/kernel";
|
|
6
|
+
import { BROWSER } from "esm-env";
|
|
7
|
+
|
|
8
|
+
export type { Theme };
|
|
9
|
+
|
|
10
|
+
// Icon map for known themes - unknown ones fall back to 🎨
|
|
11
|
+
const THEME_ICONS: Record<string, string> = {
|
|
12
|
+
light: "🌞",
|
|
13
|
+
dark: "🌙",
|
|
14
|
+
cupcake: "🧁",
|
|
15
|
+
bumblebee: "🐝",
|
|
16
|
+
emerald: "💚",
|
|
17
|
+
corporate: "🏢",
|
|
18
|
+
synthwave: "🌆",
|
|
19
|
+
retro: "📺",
|
|
20
|
+
cyberpunk: "🤖",
|
|
21
|
+
valentine: "💝",
|
|
22
|
+
halloween: "🎃",
|
|
23
|
+
garden: "🌷",
|
|
24
|
+
forest: "🌲",
|
|
25
|
+
aqua: "💧",
|
|
26
|
+
lofi: "🎵",
|
|
27
|
+
pastel: "🎨",
|
|
28
|
+
fantasy: "🔮",
|
|
29
|
+
wireframe: "📝",
|
|
30
|
+
black: "⚫",
|
|
31
|
+
luxury: "👑",
|
|
32
|
+
dracula: "🧛",
|
|
33
|
+
cmyk: "🖨️",
|
|
34
|
+
autumn: "🍂",
|
|
35
|
+
business: "💼",
|
|
36
|
+
acid: "🧪",
|
|
37
|
+
lemonade: "🍋",
|
|
38
|
+
night: "🌃",
|
|
39
|
+
coffee: "☕",
|
|
40
|
+
winter: "❄️",
|
|
41
|
+
dim: "🔅",
|
|
42
|
+
nord: "🧊",
|
|
43
|
+
sunset: "🌅",
|
|
44
|
+
caramellatte: "🍮",
|
|
45
|
+
abyss: "🌌",
|
|
46
|
+
silk: "🎀",
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const THEMES: Theme[] = Object.keys(THEME_ICONS).map((name: string) => ({
|
|
50
|
+
name,
|
|
51
|
+
icon: THEME_ICONS[name] ?? "🎨",
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
export const themeStore: ConfigStore<Theme> = createConfigStore<Theme>({
|
|
55
|
+
items: THEMES,
|
|
56
|
+
storageKey: "theme",
|
|
57
|
+
displayName: "Theme",
|
|
58
|
+
idKey: "name",
|
|
59
|
+
icon: "🎨",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// System preference detection — only if no persisted value was loaded
|
|
63
|
+
if (!themeStore.current && BROWSER) {
|
|
64
|
+
const prefersDark =
|
|
65
|
+
globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
66
|
+
const systemDefault = prefersDark ? "dark" : "light";
|
|
67
|
+
if (themeStore.get(systemDefault as never)) {
|
|
68
|
+
themeStore.set(systemDefault as never);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type ThemeStore = ReturnType<typeof createConfigStore<Theme>>;
|
|
73
|
+
export { getThemeStore };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// sdk/core/src/layout/types.ts
|
|
2
|
+
// Framework-agnostic layout configuration types.
|
|
3
|
+
// No Svelte dependency — `component` is typed as `unknown` (resolved by sdk/ui).
|
|
4
|
+
|
|
5
|
+
export type { LayoutConfig, LayoutZone } from "@rune-lab/kernel";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Standard layout shortcuts
|
|
9
|
+
* Re-exported from kernel
|
|
10
|
+
*/
|
|
11
|
+
export { LAYOUT_SHORTCUTS } from "@rune-lab/kernel";
|
package/{dist/ui/features/command-palette → src/runes/palettes/src/commands}/CommandPalette.svelte
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<!-- src/client/sdk/ui/src/features/config/CommandPalette.svelte -->
|
|
2
2
|
<script lang="ts">
|
|
3
|
-
import {
|
|
4
|
-
import { getCommandStore, type Command } from "rune-lab/
|
|
5
|
-
import { getShortcutStore } from "rune-lab/
|
|
6
|
-
import { Icon } from "
|
|
3
|
+
import { tick } from "svelte";
|
|
4
|
+
import { getCommandStore, type Command } from "@rune-lab/kernel";
|
|
5
|
+
import { getShortcutStore } from "@rune-lab/kernel";
|
|
6
|
+
import { Icon } from "../../../layout/src/mod.ts";
|
|
7
7
|
|
|
8
8
|
let { shortcutKey = "shift+k" } = $props<{ shortcutKey?: string }>();
|
|
9
9
|
|
|
@@ -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 "rune-lab/
|
|
4
|
+
import type { ShortcutEntry } from "@rune-lab/kernel";
|
|
5
5
|
import {
|
|
6
6
|
getAppStore,
|
|
7
7
|
getShortcutStore,
|
|
8
8
|
LAYOUT_SHORTCUTS,
|
|
9
|
-
} from "rune-lab/
|
|
10
|
-
import { Icon } from "rune-lab/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
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { ResourceSelector } from "@rune-lab/layout";
|
|
3
|
+
import { getCurrencyStore } from "@rune-lab/kernel";
|
|
4
|
+
|
|
5
|
+
const currencyStore = getCurrencyStore();
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
codes = [],
|
|
9
|
+
current = $bindable(String(currencyStore.current)),
|
|
10
|
+
onchange,
|
|
11
|
+
}: {
|
|
12
|
+
codes?: string[];
|
|
13
|
+
current?: string;
|
|
14
|
+
onchange?: (value: string) => void;
|
|
15
|
+
} = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<ResourceSelector
|
|
19
|
+
store={currencyStore}
|
|
20
|
+
idKey="code"
|
|
21
|
+
filterKeys={codes}
|
|
22
|
+
{onchange}
|
|
23
|
+
>
|
|
24
|
+
{#snippet triggerLabel(active)}
|
|
25
|
+
<span class="font-bold">{active.symbol}</span>
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
{#snippet item(c)}
|
|
29
|
+
<button
|
|
30
|
+
class="flex items-center gap-3 w-full"
|
|
31
|
+
onclick={() => {
|
|
32
|
+
currencyStore.set(c.code);
|
|
33
|
+
current = c.code;
|
|
34
|
+
onchange?.(c.code);
|
|
35
|
+
}}
|
|
36
|
+
>
|
|
37
|
+
<span class="badge badge-sm badge-ghost w-8">{c.symbol}</span>
|
|
38
|
+
<span>{c.code}</span>
|
|
39
|
+
</button>
|
|
40
|
+
{/snippet}
|
|
41
|
+
</ResourceSelector>
|