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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<!-- src/lib/features/layout/smart/ConnectedNavigationPanel.svelte -->
|
|
2
2
|
<script lang="ts">
|
|
3
|
-
import { getLayoutStore, type NavigationSection } from "rune-lab/
|
|
3
|
+
import { getLayoutStore, type NavigationSection } from "@rune-lab/kernel";
|
|
4
4
|
import NavigationPanel from "./NavigationPanel.svelte";
|
|
5
|
+
import { createNavigationConnection } from "./connection-factory.ts";
|
|
5
6
|
import type { Snippet } from "svelte";
|
|
6
7
|
|
|
7
8
|
let { sections, header, footer } = $props<{
|
|
@@ -11,17 +12,15 @@
|
|
|
11
12
|
}>();
|
|
12
13
|
|
|
13
14
|
const layoutStore = getLayoutStore();
|
|
15
|
+
const connection = createNavigationConnection(layoutStore);
|
|
14
16
|
</script>
|
|
15
17
|
|
|
16
18
|
<NavigationPanel
|
|
17
19
|
{sections}
|
|
18
20
|
{header}
|
|
19
21
|
{footer}
|
|
20
|
-
activeId={
|
|
21
|
-
collapsedIds={
|
|
22
|
-
onSelect={
|
|
23
|
-
onToggle={
|
|
24
|
-
isOpen
|
|
25
|
-
? layoutStore.expandSection(id)
|
|
26
|
-
: layoutStore.collapseSection(id)}
|
|
22
|
+
activeId={connection.activeId}
|
|
23
|
+
collapsedIds={connection.collapsedIds}
|
|
24
|
+
onSelect={connection.onSelect}
|
|
25
|
+
onToggle={connection.onToggle}
|
|
27
26
|
/>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<!-- src/lib/features/layout/smart/ConnectedWorkspaceStrip.svelte -->
|
|
2
2
|
<script lang="ts">
|
|
3
|
-
import { getLayoutStore, type WorkspaceItem } from "rune-lab/
|
|
3
|
+
import { getLayoutStore, type WorkspaceItem } from "@rune-lab/kernel";
|
|
4
4
|
import WorkspaceStrip from "./WorkspaceStrip.svelte";
|
|
5
|
+
import { createWorkspaceConnection } from "./connection-factory.ts";
|
|
5
6
|
import type { Snippet } from "svelte";
|
|
6
7
|
|
|
7
8
|
let { items, globalActions } = $props<{
|
|
@@ -10,11 +11,12 @@
|
|
|
10
11
|
}>();
|
|
11
12
|
|
|
12
13
|
const layoutStore = getLayoutStore();
|
|
14
|
+
const connection = createWorkspaceConnection(layoutStore);
|
|
13
15
|
</script>
|
|
14
16
|
|
|
15
17
|
<WorkspaceStrip
|
|
16
18
|
{items}
|
|
17
19
|
{globalActions}
|
|
18
|
-
activeId={
|
|
19
|
-
onSelect={
|
|
20
|
+
activeId={connection.activeId}
|
|
21
|
+
onSelect={connection.onSelect}
|
|
20
22
|
/>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ResourceSelector from "./ResourceSelector.svelte";
|
|
3
|
+
import { getLanguageStore } from "@rune-lab/kernel";
|
|
4
|
+
import { setLocale } from "@rune-lab/i18n/paraglide/runtime.js";
|
|
5
|
+
|
|
6
|
+
const languageStore = getLanguageStore();
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
languages: allowedLocales = languageStore.available.map((l) =>
|
|
10
|
+
String(l.code),
|
|
11
|
+
),
|
|
12
|
+
current = $bindable(String(languageStore.current)),
|
|
13
|
+
onchange,
|
|
14
|
+
}: {
|
|
15
|
+
languages?: string[];
|
|
16
|
+
current?: string;
|
|
17
|
+
onchange?: (value: string) => void;
|
|
18
|
+
} = $props();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<ResourceSelector
|
|
22
|
+
store={languageStore}
|
|
23
|
+
idKey="code"
|
|
24
|
+
filterKeys={[...allowedLocales]}
|
|
25
|
+
{onchange}
|
|
26
|
+
>
|
|
27
|
+
{#snippet triggerLabel(active)}
|
|
28
|
+
<span class="text-lg">{active.flag}</span>
|
|
29
|
+
{/snippet}
|
|
30
|
+
|
|
31
|
+
{#snippet item(l)}
|
|
32
|
+
<button
|
|
33
|
+
class="flex items-center gap-3 w-full"
|
|
34
|
+
onclick={() => {
|
|
35
|
+
languageStore.set(l.code);
|
|
36
|
+
setLocale(l.code as any);
|
|
37
|
+
current = l.code;
|
|
38
|
+
onchange?.(l.code);
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
<span class="text-lg">{l.flag}</span>
|
|
42
|
+
<span>{l.code.toUpperCase()}</span>
|
|
43
|
+
</button>
|
|
44
|
+
{/snippet}
|
|
45
|
+
</ResourceSelector>
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
<!-- src/lib/layout/NavigationPanel.svelte -->
|
|
2
2
|
<script lang="ts">
|
|
3
3
|
import type { Snippet } from "svelte";
|
|
4
|
-
import type {
|
|
5
|
-
NavigationItem,
|
|
6
|
-
NavigationSection,
|
|
7
|
-
} from "rune-lab/state";
|
|
4
|
+
import type { NavigationItem, NavigationSection } from "@rune-lab/kernel";
|
|
8
5
|
|
|
9
6
|
let {
|
|
10
7
|
header,
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import AppSettingSelector from "./AppSettingSelector.svelte";
|
|
3
|
+
import type { ConfigStore } from "@rune-lab/kernel";
|
|
4
|
+
import * as rlMessages from "@rune-lab/i18n/paraglide/messages.js";
|
|
5
|
+
import { getContext, type Snippet } from "svelte";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ResourceSelector — Generic configuration picker.
|
|
9
|
+
* Wraps AppSettingSelector with automatic label resolution and store binding.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```svelte
|
|
13
|
+
* <ResourceSelector store={themeStore} idKey="name">
|
|
14
|
+
* {#snippet triggerLabel(item)}<span>{item.icon}</span>{/snippet}
|
|
15
|
+
* {#snippet item(t)}<button onclick={() => store.set(t.name)}>{t.name}</button>{/snippet}
|
|
16
|
+
* </ResourceSelector>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
let {
|
|
20
|
+
store,
|
|
21
|
+
idKey,
|
|
22
|
+
filterKeys = [],
|
|
23
|
+
triggerLabel,
|
|
24
|
+
item,
|
|
25
|
+
onchange,
|
|
26
|
+
direction = "bottom",
|
|
27
|
+
responsive = true,
|
|
28
|
+
}: {
|
|
29
|
+
/** ConfigStore instance to bind to */
|
|
30
|
+
store: ConfigStore<any>;
|
|
31
|
+
/** Key to use as identifier (e.g., "name", "code") */
|
|
32
|
+
idKey: string;
|
|
33
|
+
/** Optional subset of IDs to show */
|
|
34
|
+
filterKeys?: string[];
|
|
35
|
+
/** Snippet to render the trigger button content */
|
|
36
|
+
triggerLabel: Snippet<[any]>;
|
|
37
|
+
/** Snippet to render each option in the dropdown */
|
|
38
|
+
item: Snippet<[any]>;
|
|
39
|
+
/** Callback when selection changes */
|
|
40
|
+
onchange?: (value: string) => void;
|
|
41
|
+
/** Dropdown direction */
|
|
42
|
+
direction?: "top" | "bottom" | "left" | "right" | "end" | "auto";
|
|
43
|
+
/** Whether to show responsive mobile modal */
|
|
44
|
+
responsive?: boolean;
|
|
45
|
+
} = $props();
|
|
46
|
+
|
|
47
|
+
const userDictionary =
|
|
48
|
+
getContext<Record<string, any>>("rl:dictionary") ?? {};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a label for an item through the message chain:
|
|
52
|
+
* 1. User-provided dictionary
|
|
53
|
+
* 2. Paraglide messages
|
|
54
|
+
* 3. Raw key fallback
|
|
55
|
+
*/
|
|
56
|
+
export function resolveLabel(item: any): string {
|
|
57
|
+
const key = String(item[idKey]);
|
|
58
|
+
if (typeof userDictionary[key] === "function")
|
|
59
|
+
return userDictionary[key]();
|
|
60
|
+
if (typeof (rlMessages as any)[key] === "function")
|
|
61
|
+
return (rlMessages as any)[key]();
|
|
62
|
+
return key;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let active = $derived(store.get(store.current) ?? store.available[0]);
|
|
66
|
+
|
|
67
|
+
let available = $derived(
|
|
68
|
+
filterKeys.length > 0
|
|
69
|
+
? store.available.filter((item: any) =>
|
|
70
|
+
filterKeys.includes(String(item[idKey])),
|
|
71
|
+
)
|
|
72
|
+
: store.available,
|
|
73
|
+
);
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<AppSettingSelector
|
|
77
|
+
value={active}
|
|
78
|
+
options={available}
|
|
79
|
+
tooltip={resolveLabel(active)}
|
|
80
|
+
{direction}
|
|
81
|
+
{responsive}
|
|
82
|
+
>
|
|
83
|
+
{#snippet triggerLabel(value)}
|
|
84
|
+
{@render triggerLabel(value)}
|
|
85
|
+
{/snippet}
|
|
86
|
+
|
|
87
|
+
{#snippet item(option)}
|
|
88
|
+
{@render item(option)}
|
|
89
|
+
{/snippet}
|
|
90
|
+
</AppSettingSelector>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ResourceSelector from "./ResourceSelector.svelte";
|
|
3
|
+
import { getThemeStore, type Theme } from "@rune-lab/kernel";
|
|
4
|
+
|
|
5
|
+
const themeStore = getThemeStore();
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
themes = [],
|
|
9
|
+
current = $bindable(String(themeStore.current)),
|
|
10
|
+
onchange,
|
|
11
|
+
}: {
|
|
12
|
+
themes?: string[];
|
|
13
|
+
current?: string;
|
|
14
|
+
onchange?: (value: string) => void;
|
|
15
|
+
} = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<ResourceSelector
|
|
19
|
+
store={themeStore}
|
|
20
|
+
idKey="name"
|
|
21
|
+
filterKeys={themes}
|
|
22
|
+
{onchange}
|
|
23
|
+
>
|
|
24
|
+
{#snippet triggerLabel(active)}
|
|
25
|
+
<span class="text-lg">{active.icon}</span>
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
{#snippet item(t)}
|
|
29
|
+
<button
|
|
30
|
+
class="flex items-center gap-3 w-full"
|
|
31
|
+
onclick={() => {
|
|
32
|
+
themeStore.set(t.name);
|
|
33
|
+
current = t.name;
|
|
34
|
+
onchange?.(t.name);
|
|
35
|
+
}}
|
|
36
|
+
>
|
|
37
|
+
<input
|
|
38
|
+
type="radio"
|
|
39
|
+
name="theme-{t.name}"
|
|
40
|
+
class="theme-controller radio radio-xs"
|
|
41
|
+
value={t.name}
|
|
42
|
+
bind:group={themeStore.current}
|
|
43
|
+
/>
|
|
44
|
+
<span class="text-lg">{t.icon}</span>
|
|
45
|
+
<span class="capitalize">
|
|
46
|
+
{t.name}
|
|
47
|
+
</span>
|
|
48
|
+
</button>
|
|
49
|
+
{/snippet}
|
|
50
|
+
</ResourceSelector>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<!-- src/lib/layout/WorkspaceLayout.svelte -->
|
|
2
2
|
<script module lang="ts">
|
|
3
3
|
import type { Snippet } from "svelte";
|
|
4
|
+
import type { LayoutConfig } from "./types.ts";
|
|
4
5
|
|
|
5
6
|
export interface WorkspaceLayoutProps {
|
|
6
7
|
/** Content for the far-left vertical strip */
|
|
@@ -13,6 +14,13 @@
|
|
|
13
14
|
detailPanel?: Snippet;
|
|
14
15
|
namespace?: string;
|
|
15
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Declarative layout configuration.
|
|
19
|
+
* When provided, zones can be rendered from config entries.
|
|
20
|
+
* Snippet props take priority when both are provided.
|
|
21
|
+
*/
|
|
22
|
+
config?: LayoutConfig;
|
|
23
|
+
|
|
16
24
|
/** Width of the left workspace strip */
|
|
17
25
|
stripWidth?: string;
|
|
18
26
|
/** Width of the navigation tree panel */
|
|
@@ -30,11 +38,13 @@
|
|
|
30
38
|
<script lang="ts">
|
|
31
39
|
import {
|
|
32
40
|
getLayoutStore,
|
|
33
|
-
getShortcutStore,
|
|
34
41
|
getLanguageStore,
|
|
42
|
+
} from "./mod.ts";
|
|
43
|
+
import { LAYOUT_SHORTCUTS } from "./types.ts";
|
|
44
|
+
import {
|
|
45
|
+
getShortcutStore,
|
|
35
46
|
shortcutListener,
|
|
36
|
-
|
|
37
|
-
} from "rune-lab/state";
|
|
47
|
+
} from "@rune-lab/palettes";
|
|
38
48
|
import { onMount } from "svelte";
|
|
39
49
|
|
|
40
50
|
/**
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// sdk/ui/src/lib/layout/connection-factory.ts
|
|
2
|
+
// Connection functions that generate reactive prop bindings from LayoutStore.
|
|
3
|
+
// Svelte 5 doesn't support React-style HOCs — this is the idiomatic alternative.
|
|
4
|
+
|
|
5
|
+
import type { LayoutStore } from "./store.svelte.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Reactive prop binding for the NavigationPanel component.
|
|
9
|
+
*/
|
|
10
|
+
export interface NavigationConnection {
|
|
11
|
+
/** Currently active navigation item ID */
|
|
12
|
+
readonly activeId: string | null;
|
|
13
|
+
/** Set of collapsed section IDs */
|
|
14
|
+
readonly collapsedIds: Set<string>;
|
|
15
|
+
/** Handler for when a navigation item is selected */
|
|
16
|
+
onSelect: (item: { id?: string }) => void;
|
|
17
|
+
/** Handler for when a section is toggled */
|
|
18
|
+
onToggle: (id: string, isOpen: boolean) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Reactive prop binding for the WorkspaceStrip component.
|
|
23
|
+
*/
|
|
24
|
+
export interface WorkspaceConnection {
|
|
25
|
+
/** Currently active workspace ID */
|
|
26
|
+
readonly activeId: string | null;
|
|
27
|
+
/** Handler for when a workspace is selected */
|
|
28
|
+
onSelect: (id: string) => void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates reactive prop bindings for connecting NavigationPanel to LayoutStore.
|
|
33
|
+
* Returns an object with getter properties that track LayoutStore state.
|
|
34
|
+
*
|
|
35
|
+
* @param layoutStore - The LayoutStore instance from context
|
|
36
|
+
* @returns Prop bindings compatible with NavigationPanel
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```svelte
|
|
40
|
+
* <script>
|
|
41
|
+
* const layoutStore = getLayoutStore();
|
|
42
|
+
* const nav = createNavigationConnection(layoutStore);
|
|
43
|
+
* </script>
|
|
44
|
+
* <NavigationPanel {sections} activeId={nav.activeId} collapsedIds={nav.collapsedIds}
|
|
45
|
+
* onSelect={nav.onSelect} onToggle={nav.onToggle} />
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function createNavigationConnection(
|
|
49
|
+
layoutStore: Pick<
|
|
50
|
+
LayoutStore,
|
|
51
|
+
| "activeNavItemId"
|
|
52
|
+
| "collapsedSections"
|
|
53
|
+
| "navigate"
|
|
54
|
+
| "expandSection"
|
|
55
|
+
| "collapseSection"
|
|
56
|
+
>,
|
|
57
|
+
): NavigationConnection {
|
|
58
|
+
return {
|
|
59
|
+
get activeId() {
|
|
60
|
+
return layoutStore.activeNavItemId;
|
|
61
|
+
},
|
|
62
|
+
get collapsedIds() {
|
|
63
|
+
return layoutStore.collapsedSections;
|
|
64
|
+
},
|
|
65
|
+
onSelect(item: { id?: string }) {
|
|
66
|
+
if (item.id) layoutStore.navigate(item.id);
|
|
67
|
+
},
|
|
68
|
+
onToggle(id: string, isOpen: boolean) {
|
|
69
|
+
if (isOpen) {
|
|
70
|
+
layoutStore.expandSection(id);
|
|
71
|
+
} else {
|
|
72
|
+
layoutStore.collapseSection(id);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates reactive prop bindings for connecting WorkspaceStrip to LayoutStore.
|
|
80
|
+
*
|
|
81
|
+
* @param layoutStore - The LayoutStore instance from context
|
|
82
|
+
* @returns Prop bindings compatible with WorkspaceStrip
|
|
83
|
+
*/
|
|
84
|
+
export function createWorkspaceConnection(
|
|
85
|
+
layoutStore: Pick<LayoutStore, "activeWorkspaceId" | "activateWorkspace">,
|
|
86
|
+
): WorkspaceConnection {
|
|
87
|
+
return {
|
|
88
|
+
get activeId() {
|
|
89
|
+
return layoutStore.activeWorkspaceId;
|
|
90
|
+
},
|
|
91
|
+
onSelect(id: string) {
|
|
92
|
+
layoutStore.activateWorkspace(id);
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// sdk/state/src/language.svelte.ts
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
type ConfigStore,
|
|
5
|
+
createConfigStore,
|
|
6
|
+
getLanguageStore,
|
|
7
|
+
} from "@rune-lab/kernel";
|
|
8
|
+
import type { Language } from "@rune-lab/kernel";
|
|
9
|
+
|
|
10
|
+
export type { Language };
|
|
11
|
+
|
|
12
|
+
export const LANGUAGES = [
|
|
13
|
+
// --- INDOEUROPEAS (Rama Romance / Latín) ---
|
|
14
|
+
{ code: "es", flag: "🇲🇽" },
|
|
15
|
+
{ code: "fr", flag: "🇫🇷" },
|
|
16
|
+
{ code: "it", flag: "🇮🇹" },
|
|
17
|
+
{ code: "pt", flag: "🇧🇷" },
|
|
18
|
+
// --- INDOEUROPEAS (Rama Germánica) ---
|
|
19
|
+
{ code: "en", flag: "🇺🇸" },
|
|
20
|
+
{ code: "de", flag: "🇩🇪" },
|
|
21
|
+
// --- INDOEUROPEAS (Otras Ramas) ---
|
|
22
|
+
{ code: "ru", flag: "🇷🇺" },
|
|
23
|
+
{ code: "hi", flag: "🇮🇳" },
|
|
24
|
+
// --- AFROASIÁTICAS ---
|
|
25
|
+
{ code: "ar", flag: "🇸🇦" },
|
|
26
|
+
// --- FAMILIAS ASIÁTICAS INDEPENDIENTES ---
|
|
27
|
+
{ code: "zh", flag: "🇨🇳" },
|
|
28
|
+
{ code: "ja", flag: "🇯🇵" },
|
|
29
|
+
{ code: "ko", flag: "🇰🇷" },
|
|
30
|
+
{ code: "vi", flag: "🇻🇳" },
|
|
31
|
+
] as const;
|
|
32
|
+
|
|
33
|
+
export const languageStore: ConfigStore<Language> = createConfigStore<Language>(
|
|
34
|
+
{
|
|
35
|
+
items: LANGUAGES,
|
|
36
|
+
storageKey: "language",
|
|
37
|
+
displayName: "Language",
|
|
38
|
+
idKey: "code",
|
|
39
|
+
icon: "🌍",
|
|
40
|
+
},
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export type LanguageStore = ReturnType<typeof createConfigStore<Language>>;
|
|
44
|
+
export { getLanguageStore };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { defineRune, RUNE_LAB_CONTEXT } from "@rune-lab/kernel";
|
|
2
|
+
import type { PersistenceDriver, RunePlugin } from "@rune-lab/kernel";
|
|
3
|
+
import { createLayoutStore } from "./store.svelte.ts";
|
|
4
|
+
import { type Theme, themeStore } from "./theme.svelte.ts";
|
|
5
|
+
import { languageStore } from "./language.svelte.ts";
|
|
6
|
+
|
|
7
|
+
export * from "./store.svelte.ts";
|
|
8
|
+
export * from "./types.ts";
|
|
9
|
+
export { default as WorkspaceLayout } from "./WorkspaceLayout.svelte";
|
|
10
|
+
export * from "./language.svelte.ts";
|
|
11
|
+
export * from "./theme.svelte.ts";
|
|
12
|
+
export * from "./APP_CONFIGURATIONS.ts";
|
|
13
|
+
export * from "./connection-factory.ts";
|
|
14
|
+
export { default as LanguageSelector } from "./LanguageSelector.svelte";
|
|
15
|
+
export { default as ThemeSelector } from "./ThemeSelector.svelte";
|
|
16
|
+
export { default as ResourceSelector } from "./ResourceSelector.svelte";
|
|
17
|
+
export { default as AppSettingSelector } from "./AppSettingSelector.svelte";
|
|
18
|
+
export { default as NavigationPanel } from "./NavigationPanel.svelte";
|
|
19
|
+
export { default as WorkspaceStrip } from "./WorkspaceStrip.svelte";
|
|
20
|
+
export { default as ContentArea } from "./ContentArea.svelte";
|
|
21
|
+
export { default as DetailPanel } from "./DetailPanel.svelte";
|
|
22
|
+
export { default as Icon } from "./Icon.svelte";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Layout Plugin — manages the primary workspace layout, theme, and language.
|
|
26
|
+
* Always included by default in RuneProvider.
|
|
27
|
+
*/
|
|
28
|
+
export const LayoutPlugin: RunePlugin = defineRune({
|
|
29
|
+
id: "rune-lab.layout",
|
|
30
|
+
stores: [
|
|
31
|
+
{
|
|
32
|
+
id: "layout",
|
|
33
|
+
contextKey: RUNE_LAB_CONTEXT.layout,
|
|
34
|
+
factory: (_config: unknown, driver: PersistenceDriver) =>
|
|
35
|
+
createLayoutStore(driver),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "theme",
|
|
39
|
+
contextKey: RUNE_LAB_CONTEXT.theme,
|
|
40
|
+
factory: (config: unknown, _driver: PersistenceDriver) => {
|
|
41
|
+
const c = config as Record<string, unknown>;
|
|
42
|
+
if (c.customThemes) {
|
|
43
|
+
themeStore.addItems(c.customThemes as Theme[]);
|
|
44
|
+
}
|
|
45
|
+
if (
|
|
46
|
+
c.defaultTheme &&
|
|
47
|
+
!(themeStore as unknown as { current: unknown }).current
|
|
48
|
+
) {
|
|
49
|
+
if (themeStore.get(c.defaultTheme as never)) {
|
|
50
|
+
themeStore.set(c.defaultTheme as never);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return themeStore;
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "language",
|
|
58
|
+
contextKey: RUNE_LAB_CONTEXT.language,
|
|
59
|
+
factory: (config: unknown, _driver: PersistenceDriver) => {
|
|
60
|
+
const c = config as Record<string, unknown>;
|
|
61
|
+
if (c.locales) {
|
|
62
|
+
const localesToKeep = c.locales as string[];
|
|
63
|
+
languageStore.available = languageStore.available.filter(
|
|
64
|
+
(l) => localesToKeep.includes(l.code),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
return languageStore;
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
});
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// src/lib/state/layout.svelte.ts
|
|
2
|
+
import { getLayoutStore } from "@rune-lab/kernel";
|
|
3
|
+
import type {
|
|
4
|
+
NavigationItem,
|
|
5
|
+
NavigationSection,
|
|
6
|
+
PersistenceDriver,
|
|
7
|
+
WorkspaceItem,
|
|
8
|
+
} from "@rune-lab/kernel";
|
|
9
|
+
import { resolveDriver } from "@rune-lab/kernel";
|
|
10
|
+
|
|
11
|
+
export type { NavigationItem, NavigationSection, WorkspaceItem };
|
|
12
|
+
|
|
13
|
+
export class LayoutStore {
|
|
14
|
+
workspaces: WorkspaceItem[] = $state<WorkspaceItem[]>([]);
|
|
15
|
+
activeWorkspaceId: string | null = $state<string | null>(null);
|
|
16
|
+
activeNavItemId: string | null = $state<string | null>(null);
|
|
17
|
+
navOpen: boolean = $state(true);
|
|
18
|
+
detailOpen: boolean = $state(false);
|
|
19
|
+
collapsedSections: Set<string> = $state<Set<string>>(new Set());
|
|
20
|
+
|
|
21
|
+
#storageNamespace = "default";
|
|
22
|
+
#initialized = false;
|
|
23
|
+
#driver: PersistenceDriver | undefined;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
driver?: PersistenceDriver | (() => PersistenceDriver | undefined),
|
|
27
|
+
) {
|
|
28
|
+
// Use resolveDriver but allow undefined result for SSR/no-driver scenarios
|
|
29
|
+
this.#driver = driver ? resolveDriver(driver) : undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
init(options?: { namespace?: string; driver?: PersistenceDriver }) {
|
|
33
|
+
if (this.#initialized) return;
|
|
34
|
+
if (options?.namespace) this.#storageNamespace = options.namespace;
|
|
35
|
+
if (options?.driver) this.#driver = options.driver;
|
|
36
|
+
|
|
37
|
+
// If no driver was injected and no window (SSR), we just do nothing
|
|
38
|
+
if (!this.#driver && typeof window !== "undefined") {
|
|
39
|
+
this.#driver = {
|
|
40
|
+
get: (key: string) => localStorage.getItem(key),
|
|
41
|
+
set: (key: string, val: string) => localStorage.setItem(key, val),
|
|
42
|
+
remove: (key: string) => localStorage.removeItem(key),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (this.#driver) {
|
|
47
|
+
const savedWorkspace = this.#driver.get(
|
|
48
|
+
`rl:layout:${this.#storageNamespace}:workspace`,
|
|
49
|
+
);
|
|
50
|
+
if (savedWorkspace) this.activeWorkspaceId = savedWorkspace;
|
|
51
|
+
|
|
52
|
+
const savedSections = this.#driver.get(
|
|
53
|
+
`rl:layout:${this.#storageNamespace}:sections`,
|
|
54
|
+
);
|
|
55
|
+
if (savedSections) {
|
|
56
|
+
try {
|
|
57
|
+
this.collapsedSections = new Set(JSON.parse(savedSections));
|
|
58
|
+
} catch (e) {
|
|
59
|
+
console.error("Failed to parse collapsed sections", e);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.#initialized = true;
|
|
65
|
+
|
|
66
|
+
// Set up persistence effects
|
|
67
|
+
if (this.#driver) {
|
|
68
|
+
$effect.root(() => {
|
|
69
|
+
$effect(() => {
|
|
70
|
+
if (this.activeWorkspaceId) {
|
|
71
|
+
this.#driver?.set(
|
|
72
|
+
`rl:layout:${this.#storageNamespace}:workspace`,
|
|
73
|
+
this.activeWorkspaceId,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
$effect(() => {
|
|
79
|
+
this.#driver?.set(
|
|
80
|
+
`rl:layout:${this.#storageNamespace}:sections`,
|
|
81
|
+
JSON.stringify([...this.collapsedSections]),
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
setWorkspaces(items: WorkspaceItem[]) {
|
|
89
|
+
this.workspaces = items;
|
|
90
|
+
if (items.length > 0 && !this.activeWorkspaceId) {
|
|
91
|
+
this.activeWorkspaceId = items[0].id;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
activateWorkspace(id: string) {
|
|
96
|
+
this.activeWorkspaceId = id;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
activateWorkspaceByIndex(index: number) {
|
|
100
|
+
const ws = this.workspaces[index];
|
|
101
|
+
if (ws) {
|
|
102
|
+
this.activateWorkspace(ws.id);
|
|
103
|
+
ws.onClick?.();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
navigate(id: string) {
|
|
108
|
+
this.activeNavItemId = id;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
toggleNav() {
|
|
112
|
+
this.navOpen = !this.navOpen;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
toggleDetail() {
|
|
116
|
+
this.detailOpen = !this.detailOpen;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
toggleSection(id: string) {
|
|
120
|
+
if (this.collapsedSections.has(id)) {
|
|
121
|
+
this.collapsedSections.delete(id);
|
|
122
|
+
} else {
|
|
123
|
+
this.collapsedSections.add(id);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
collapseSection(id: string) {
|
|
128
|
+
this.collapsedSections.add(id);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
expandSection(id: string) {
|
|
132
|
+
this.collapsedSections.delete(id);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function createLayoutStore(
|
|
137
|
+
driver?: PersistenceDriver | (() => PersistenceDriver | undefined),
|
|
138
|
+
): LayoutStore {
|
|
139
|
+
return new LayoutStore(driver);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { getLayoutStore };
|