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
package/.gitignore
ADDED
package/README.md
CHANGED
|
@@ -69,12 +69,12 @@ Get your application shell running in less than 20 lines. Inside your
|
|
|
69
69
|
import { cookieDriver } from "rune-lab";
|
|
70
70
|
|
|
71
71
|
let { children } = $props();
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
// Example navigation
|
|
74
74
|
const sections = [{ id: "main", title: "Main", items: [{ id: "home", label: "Home" }] }];
|
|
75
75
|
</script>
|
|
76
76
|
|
|
77
|
-
<RuneProvider
|
|
77
|
+
<RuneProvider
|
|
78
78
|
app={{ name: "My App", version: "1.0.0" }}
|
|
79
79
|
persistence={cookieDriver}
|
|
80
80
|
>
|
|
@@ -232,7 +232,7 @@ register them inside an `$effect` returning a cleanup function**:
|
|
|
232
232
|
```svelte
|
|
233
233
|
<script lang="ts">
|
|
234
234
|
import { getShortcutStore, getToastStore } from "rune-lab";
|
|
235
|
-
|
|
235
|
+
|
|
236
236
|
const shortcuts = getShortcutStore();
|
|
237
237
|
const toasts = getToastStore();
|
|
238
238
|
|
package/deno.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yrrrrrf/rune-lab",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Modern toolkit for Svelte 5 Runes applications.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"readme": "./README.md",
|
|
8
|
+
"author": "Fernando Bryan Reza Campos",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Yrrrrrf/rune-lab.git"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": "./src/mod.ts"
|
|
15
|
+
},
|
|
16
|
+
"nodeModulesDir": "manual",
|
|
17
|
+
"workspace": [
|
|
18
|
+
"./src/kernel",
|
|
19
|
+
"./src/runes/layout",
|
|
20
|
+
"./src/runes/palettes",
|
|
21
|
+
"./src/runes/plugins/money"
|
|
22
|
+
],
|
|
23
|
+
"tasks": {
|
|
24
|
+
"i18n": "paraglide-js compile --project ./src/i18n/project.inlang --outdir ./src/i18n/paraglide"
|
|
25
|
+
},
|
|
26
|
+
"imports": {
|
|
27
|
+
"@rune-lab/core": "./src/mod.ts",
|
|
28
|
+
"@rune-lab/i18n/": "./src/i18n/",
|
|
29
|
+
"typescript": "npm:typescript@5.9.3",
|
|
30
|
+
"@tailwindcss/vite": "npm:@tailwindcss/vite",
|
|
31
|
+
"esm-env": "npm:esm-env",
|
|
32
|
+
"vite": "npm:vite",
|
|
33
|
+
"vite-plus": "npm:vite-plus",
|
|
34
|
+
"daisyui/": "npm:daisyui/",
|
|
35
|
+
"hotkeys-js": "npm:hotkeys-js",
|
|
36
|
+
"@inlang/paraglide-js": "npm:@inlang/paraglide-js",
|
|
37
|
+
"svelte": "npm:svelte",
|
|
38
|
+
"@sveltejs/kit": "npm:@sveltejs/kit",
|
|
39
|
+
"@sveltejs/vite-plugin-svelte": "npm:@sveltejs/vite-plugin-svelte",
|
|
40
|
+
"@sveltejs/adapter-static": "npm:@sveltejs/adapter-static",
|
|
41
|
+
"jsdom": "npm:jsdom",
|
|
42
|
+
"@testing-library/jest-dom": "npm:@testing-library/jest-dom"
|
|
43
|
+
},
|
|
44
|
+
"exclude": [
|
|
45
|
+
"scripts/**",
|
|
46
|
+
"dist/**",
|
|
47
|
+
".old/**",
|
|
48
|
+
"**/*.test.ts"
|
|
49
|
+
]
|
|
50
|
+
}
|
package/justfile
ADDED
package/package.json
CHANGED
|
@@ -1,82 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rune-lab",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"
|
|
5
|
-
"type": "module",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"author": "Fernando Bryan Reza Campos",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/Yrrrrrf/rune-lab.git"
|
|
11
|
-
},
|
|
12
|
-
"scripts": {
|
|
13
|
-
"dev:ui": "bun run --cwd src/sdk/ui dev",
|
|
14
|
-
"build:ui": "bun run --cwd src/sdk/ui build",
|
|
15
|
-
"compile:i18n": "paraglide-js compile --project ./src/sdk/ui/src/i18n/project.inlang --outdir ./src/sdk/ui/src/lib/paraglide",
|
|
16
|
-
"build:index": "bun run scripts/build-index.ts"
|
|
17
|
-
},
|
|
18
|
-
"workspaces": [
|
|
19
|
-
"src/sdk/*"
|
|
20
|
-
],
|
|
21
|
-
"files": [
|
|
22
|
-
"dist"
|
|
23
|
-
],
|
|
24
|
-
"exports": {
|
|
25
|
-
".": {
|
|
26
|
-
"types": "./dist/index.d.ts",
|
|
27
|
-
"svelte": "./dist/index.js",
|
|
28
|
-
"default": "./dist/index.js"
|
|
29
|
-
},
|
|
30
|
-
"./ui": {
|
|
31
|
-
"types": "./dist/ui/index.d.ts",
|
|
32
|
-
"svelte": "./dist/ui/index.js",
|
|
33
|
-
"default": "./dist/ui/index.js"
|
|
34
|
-
},
|
|
35
|
-
"./core": {
|
|
36
|
-
"types": "./dist/core/index.d.ts",
|
|
37
|
-
"default": "./dist/core/index.js"
|
|
38
|
-
},
|
|
39
|
-
"./state": {
|
|
40
|
-
"types": "./dist/state/index.d.ts",
|
|
41
|
-
"default": "./dist/state/index.js"
|
|
42
|
-
},
|
|
43
|
-
"./package.json": "./package.json"
|
|
44
|
-
},
|
|
45
|
-
"peerDependencies": {
|
|
46
|
-
"svelte": "^5.55.0",
|
|
47
|
-
"tailwindcss": "^4.2.2",
|
|
48
|
-
"daisyui": "^5.5.19",
|
|
49
|
-
"dinero.js": "npm:dinero.js@^2.0.2",
|
|
50
|
-
"better-auth": "^1.5.6"
|
|
51
|
-
},
|
|
52
|
-
"peerDependenciesMeta": {
|
|
53
|
-
"better-auth": {
|
|
54
|
-
"optional": true
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
"dependencies": {
|
|
58
|
-
"gwa": "^0.0.1",
|
|
59
|
-
"hotkeys-js": "npm:hotkeys-js@^4.0.2"
|
|
60
|
-
},
|
|
61
|
-
"devDependencies": {
|
|
62
|
-
"@inlang/paraglide-js": "npm:@inlang/paraglide-js@^2.15.1",
|
|
63
|
-
"@internal/core": "0.2.0",
|
|
64
|
-
"@internal/state": "0.2.0",
|
|
65
|
-
"@internal/ui": "0.2.0",
|
|
66
|
-
"@sveltejs/adapter-static": "npm:@sveltejs/adapter-static@^3.0.10",
|
|
67
|
-
"@sveltejs/kit": "npm:@sveltejs/kit@^2.55.0",
|
|
68
|
-
"@sveltejs/package": "^2.5.7",
|
|
69
|
-
"@sveltejs/vite-plugin-svelte": "npm:@sveltejs/vite-plugin-svelte@^7.0.0",
|
|
70
|
-
"@tailwindcss/forms": "npm:@tailwindcss/forms@^0.5.11",
|
|
71
|
-
"@tailwindcss/typography": "npm:@tailwindcss/typography@^0.5.19",
|
|
72
|
-
"@tailwindcss/vite": "npm:@tailwindcss/vite@^4.2.2",
|
|
73
|
-
"@testing-library/jest-dom": "^6.9.1",
|
|
74
|
-
"@testing-library/svelte": "^5.3.1",
|
|
75
|
-
"jsdom": "^29.0.1",
|
|
76
|
-
"publint": "^0.3.18",
|
|
77
|
-
"svelte-check": "npm:svelte-check@^4.4.5",
|
|
78
|
-
"typescript": "npm:typescript@^6.0.2",
|
|
79
|
-
"vite": "npm:vite@^8.0.2",
|
|
80
|
-
"vitest": "^4.1.1"
|
|
81
|
-
}
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"packageManager": "pnpm@10.33.0"
|
|
82
5
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// scripts/build_pkg.ts
|
|
2
|
+
import denoConfig from "../deno.json" with { type: "json" };
|
|
3
|
+
|
|
4
|
+
// ── 1. Restructure: move dist/* → dist/src/ ──────────────────────────────────
|
|
5
|
+
await Deno.mkdir("./dist/src", { recursive: true });
|
|
6
|
+
for await (const entry of Deno.readDir("./dist")) {
|
|
7
|
+
if (entry.name === "src") continue;
|
|
8
|
+
await Deno.rename(`./dist/${entry.name}`, `./dist/src/${entry.name}`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Clean up any stray deno.ts artifact
|
|
12
|
+
try {
|
|
13
|
+
await Deno.remove("./dist/src/deno.ts");
|
|
14
|
+
} catch { /* already gone */ }
|
|
15
|
+
|
|
16
|
+
// ── 2. Generate dist/deno.json (standalone — no workspace members) ────────────
|
|
17
|
+
const denoDistConfig = {
|
|
18
|
+
name: denoConfig.name,
|
|
19
|
+
version: denoConfig.version,
|
|
20
|
+
description: denoConfig.description,
|
|
21
|
+
license: denoConfig.license,
|
|
22
|
+
exports: { ".": "./src/mod.ts" },
|
|
23
|
+
repository: denoConfig.repository,
|
|
24
|
+
};
|
|
25
|
+
await Deno.writeTextFile(
|
|
26
|
+
"./dist/deno.json",
|
|
27
|
+
JSON.stringify(denoDistConfig, null, 2),
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// ── 3. Generate dist/package.json (derived from deno.json) ───────────────────
|
|
31
|
+
const pkg = {
|
|
32
|
+
name: "rune-lab",
|
|
33
|
+
version: denoConfig.version,
|
|
34
|
+
description: denoConfig.description,
|
|
35
|
+
type: "module",
|
|
36
|
+
exports: { ".": "./src/mod.ts" },
|
|
37
|
+
license: denoConfig.license,
|
|
38
|
+
repository: denoConfig.repository,
|
|
39
|
+
peerDependencies: {
|
|
40
|
+
"svelte": "^5.0.0",
|
|
41
|
+
"@inlang/paraglide-js": "^2.0.0",
|
|
42
|
+
},
|
|
43
|
+
keywords: ["svelte", "svelte-5", "runes", "ui", "components"],
|
|
44
|
+
};
|
|
45
|
+
await Deno.writeTextFile("./dist/package.json", JSON.stringify(pkg, null, 2));
|
|
46
|
+
|
|
47
|
+
// ── 4. Copy metadata ──────────────────────────────────────────────────────────
|
|
48
|
+
await Deno.copyFile("README.md", "./dist/README.md");
|
|
49
|
+
await Deno.copyFile("LICENSE", "./dist/LICENSE");
|
|
50
|
+
|
|
51
|
+
console.log(`dist/ (v${denoConfig.version})`);
|
package/scripts/ci.just
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[doc('Format Client code')]
|
|
2
|
+
[group('CI')]
|
|
3
|
+
fmt:
|
|
4
|
+
deno fmt .
|
|
5
|
+
@echo "✓ Client code formatted"
|
|
6
|
+
|
|
7
|
+
[doc('Lint Client code')]
|
|
8
|
+
[group('CI')]
|
|
9
|
+
lint:
|
|
10
|
+
deno lint .
|
|
11
|
+
@echo "✓ Client code linted"
|
|
12
|
+
|
|
13
|
+
[doc('Type-check Client workspace')]
|
|
14
|
+
[group('CI')]
|
|
15
|
+
typecheck:
|
|
16
|
+
# check ts types with strict deno.ns
|
|
17
|
+
deno check .
|
|
18
|
+
# check svelte types
|
|
19
|
+
deno run -A npm:svelte-check
|
|
20
|
+
# todo: Maybe change this to a vp command
|
|
21
|
+
@echo "✓ Client type-checked"
|
|
22
|
+
|
|
23
|
+
[doc('Full client quality gate')]
|
|
24
|
+
[group('CI')]
|
|
25
|
+
quality: fmt lint typecheck
|
|
26
|
+
@echo "✓ Client quality checks passed"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[doc('Build Client')]
|
|
2
|
+
[group('Build')]
|
|
3
|
+
build:
|
|
4
|
+
# * Clean up previous build
|
|
5
|
+
rm -rf dist/
|
|
6
|
+
# * Build library using vite-plus
|
|
7
|
+
vp build
|
|
8
|
+
# * Build ESM package
|
|
9
|
+
deno run -A scripts/build_pkg.ts
|
|
10
|
+
@echo "✓ build done"
|
|
11
|
+
|
|
12
|
+
[doc('Publish to jsr')]
|
|
13
|
+
[group('Deploy')]
|
|
14
|
+
deploy: build
|
|
15
|
+
# * Format build output
|
|
16
|
+
deno fmt --no-config dist
|
|
17
|
+
# # * Build npm package
|
|
18
|
+
# deno task build:npm
|
|
19
|
+
# # * Publish to jsr
|
|
20
|
+
# deno publish
|
|
21
|
+
@echo "✓ deploy done"
|
package/scripts/dev.just
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# inject.just — surgical local rune-lab injection
|
|
2
|
+
#
|
|
3
|
+
# ⚠ IMPORTANT: `just -f` changes cwd to the justfile's directory.
|
|
4
|
+
# Never pass `.` as dest — pass $PWD or an absolute path instead.
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# just -f ~/rune-lab/scripts/inject.just inject $PWD
|
|
8
|
+
# just -f ~/rune-lab/scripts/inject.just inject /absolute/path/to/project
|
|
9
|
+
# just -f ~/rune-lab/scripts/inject.just inject-clean $PWD
|
|
10
|
+
#
|
|
11
|
+
# Recipes:
|
|
12
|
+
# inject — build rune-lab, then hot-swap node_modules/rune-lab
|
|
13
|
+
# inject-clean — full dep reset (yog reborn --deep), then inject
|
|
14
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
# Hot-swap: rebuild rune-lab and inject into <dest>/node_modules/rune-lab
|
|
17
|
+
inject dest: _build-for-inject
|
|
18
|
+
#!/usr/bin/env bash
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
dest_abs="{{ dest }}"
|
|
22
|
+
|
|
23
|
+
# Reject relative paths — they resolve to rune-lab's own dir, not the caller's
|
|
24
|
+
if [[ "$dest_abs" != /* ]]; then
|
|
25
|
+
echo "❌ dest must be an absolute path."
|
|
26
|
+
echo " Call with: just -f ... inject \$PWD"
|
|
27
|
+
echo " Got: $dest_abs"
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
if [ ! -d "$dest_abs/node_modules" ]; then
|
|
32
|
+
echo "❌ No node_modules/ found in $dest_abs"
|
|
33
|
+
echo " Run your package manager's install first, then retry."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
echo "🗑 Removing stale $dest_abs/node_modules/rune-lab..."
|
|
38
|
+
rm -rf "$dest_abs/node_modules/rune-lab"
|
|
39
|
+
|
|
40
|
+
echo "📦 Copying local dist into $dest_abs/node_modules/rune-lab..."
|
|
41
|
+
mkdir -p "$dest_abs/node_modules/rune-lab"
|
|
42
|
+
cp -r "{{ justfile_directory() }}/../dist" "$dest_abs/node_modules/rune-lab/dist"
|
|
43
|
+
cp "{{ justfile_directory() }}/../package.json" "$dest_abs/node_modules/rune-lab/package.json"
|
|
44
|
+
|
|
45
|
+
echo "✅ Done! node_modules/rune-lab → $(du -sh $dest_abs/node_modules/rune-lab | cut -f1)"
|
|
46
|
+
echo " Source: {{ justfile_directory() }}/../dist"
|
|
47
|
+
echo " Target: $dest_abs/node_modules/rune-lab"
|
|
48
|
+
|
|
49
|
+
# Full reset: nuke deps in <dest>, reinstall, then hot-swap rune-lab
|
|
50
|
+
inject-clean dest: _build-for-inject
|
|
51
|
+
#!/usr/bin/env bash
|
|
52
|
+
set -euo pipefail
|
|
53
|
+
|
|
54
|
+
dest_abs="{{ dest }}"
|
|
55
|
+
|
|
56
|
+
if [[ "$dest_abs" != /* ]]; then
|
|
57
|
+
echo "❌ dest must be an absolute path. Call with: just -f ... inject-clean \$PWD"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
echo "💀 Running yog reborn --deep in $dest_abs..."
|
|
62
|
+
(cd "$dest_abs" && yog reborn --deep)
|
|
63
|
+
|
|
64
|
+
just -f "{{ justfile_directory() }}/inject.just" inject "$dest_abs"
|
|
65
|
+
|
|
66
|
+
# ── Internal ──────────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
[private]
|
|
69
|
+
_build-for-inject:
|
|
70
|
+
@echo "🔨 Building rune-lab from {{ justfile_directory() }}/.."
|
|
71
|
+
just --justfile "{{ justfile_directory() }}/../justfile" --working-directory "{{ justfile_directory() }}/.." build
|
|
72
|
+
@echo "✅ rune-lab built."
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { setContext, untrack, type Snippet, onMount, type Component } from "svelte";
|
|
3
|
+
import {
|
|
4
|
+
RUNE_LAB_CONTEXT,
|
|
5
|
+
localStorageDriver,
|
|
6
|
+
initializeStores,
|
|
7
|
+
defineRune,
|
|
8
|
+
} from "@rune-lab/kernel";
|
|
9
|
+
import type { PersistenceDriver, RunePlugin } from "@rune-lab/kernel";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Namespaced configuration for Rune Lab plugins.
|
|
13
|
+
* Keyed by plugin.id.
|
|
14
|
+
*/
|
|
15
|
+
export interface RuneLabConfig {
|
|
16
|
+
persistence?: PersistenceDriver;
|
|
17
|
+
/** Optional head management properties */
|
|
18
|
+
favicon?: string;
|
|
19
|
+
manageHead?: boolean;
|
|
20
|
+
icons?: "material" | "none";
|
|
21
|
+
/** Namespaced config for plugins */
|
|
22
|
+
[pluginId: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { children, config = {}, plugins = [] } = $props<{
|
|
26
|
+
children: Snippet;
|
|
27
|
+
config?: RuneLabConfig;
|
|
28
|
+
plugins?: RunePlugin[];
|
|
29
|
+
}>();
|
|
30
|
+
|
|
31
|
+
const initialPlugins = untrack(() => plugins);
|
|
32
|
+
const initialPersistence = untrack(() => config.persistence ?? localStorageDriver);
|
|
33
|
+
|
|
34
|
+
// 1. Register all plugins
|
|
35
|
+
// Note: defineRune maps each slot into the STORE_REGISTRY
|
|
36
|
+
untrack(() => {
|
|
37
|
+
for (const plugin of initialPlugins) {
|
|
38
|
+
defineRune(plugin);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// 2. Initialize all stores via the registry's topological sort
|
|
43
|
+
const stores = initializeStores(
|
|
44
|
+
initialPlugins,
|
|
45
|
+
untrack(() => config as Record<string, unknown>),
|
|
46
|
+
initialPersistence
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// 3. Provide all stores as context
|
|
50
|
+
// We iterate ALL registered plugins to find the context keys for their slots
|
|
51
|
+
for (const plugin of initialPlugins) {
|
|
52
|
+
for (const slot of plugin.stores) {
|
|
53
|
+
const store = stores.get(slot.id);
|
|
54
|
+
if (store) {
|
|
55
|
+
setContext(slot.contextKey, store);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Also provide the persistence driver itself
|
|
61
|
+
setContext(RUNE_LAB_CONTEXT.persistence, initialPersistence);
|
|
62
|
+
|
|
63
|
+
// 4. Collect all overlays
|
|
64
|
+
const allOverlays = $derived(plugins.flatMap(p => p.overlays ?? []) as Component<Record<never, never>>[]);
|
|
65
|
+
|
|
66
|
+
// ── Initialization for layout ──────────────────────────
|
|
67
|
+
const appStore = stores.get("app") as any;
|
|
68
|
+
const layoutStore = stores.get("layout") as any;
|
|
69
|
+
|
|
70
|
+
onMount(() => {
|
|
71
|
+
if (layoutStore) layoutStore.init();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Meta tags derived from app store state
|
|
75
|
+
const metaTags = $derived(appStore ? [
|
|
76
|
+
{ name: "description", content: appStore.description },
|
|
77
|
+
{ name: "author", content: appStore.author },
|
|
78
|
+
] : []);
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<svelte:head>
|
|
82
|
+
{#if config.manageHead !== false && appStore}
|
|
83
|
+
<title>{appStore.name}</title>
|
|
84
|
+
{#if config.favicon}
|
|
85
|
+
<link rel="icon" href={config.favicon} />
|
|
86
|
+
{/if}
|
|
87
|
+
{#each metaTags as meta}
|
|
88
|
+
<meta name={meta.name} content={meta.content} />
|
|
89
|
+
{/each}
|
|
90
|
+
{#if config.icons === "material"}
|
|
91
|
+
<link
|
|
92
|
+
rel="stylesheet"
|
|
93
|
+
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"
|
|
94
|
+
/>
|
|
95
|
+
{/if}
|
|
96
|
+
{/if}
|
|
97
|
+
</svelte:head>
|
|
98
|
+
|
|
99
|
+
<!-- Plugin Overlays -->
|
|
100
|
+
{#each allOverlays as Overlay}
|
|
101
|
+
<Overlay />
|
|
102
|
+
{/each}
|
|
103
|
+
|
|
104
|
+
<!-- Render Children -->
|
|
105
|
+
{@render children()}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vite-plus/test";
|
|
2
|
+
|
|
3
|
+
// Mock esm-env before importing the module
|
|
4
|
+
vi.mock("esm-env", () => ({ DEV: true }));
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
batchResolveMessages,
|
|
8
|
+
createMessageResolver,
|
|
9
|
+
hasMessage,
|
|
10
|
+
} from "./message-resolver.ts";
|
|
11
|
+
|
|
12
|
+
describe("MessageResolver", () => {
|
|
13
|
+
const mockMessages = {
|
|
14
|
+
usd: () => "US Dollar",
|
|
15
|
+
eur: () => "Euro",
|
|
16
|
+
mxn: () => "Mexican Peso",
|
|
17
|
+
jpy: () => "Japanese Yen",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
describe("createMessageResolver", () => {
|
|
21
|
+
it("should resolve a key via keyExtractor", () => {
|
|
22
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
23
|
+
keyExtractor: (opt) => opt.code,
|
|
24
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(resolver({ code: "USD" })).toBe("US Dollar");
|
|
28
|
+
expect(resolver({ code: "EUR" })).toBe("Euro");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should use untransformed key when no transformer provided", () => {
|
|
32
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
33
|
+
keyExtractor: (opt) => opt.code,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Without transformer, keys must match exactly
|
|
37
|
+
expect(resolver({ code: "usd" })).toBe("US Dollar");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("should fall back to the raw key for missing translations", () => {
|
|
41
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
42
|
+
|
|
43
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
44
|
+
keyExtractor: (opt) => opt.code,
|
|
45
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const result = resolver({ code: "UNKNOWN" });
|
|
49
|
+
expect(result).toBe("UNKNOWN"); // falls back to original key
|
|
50
|
+
expect(warnSpy).toHaveBeenCalledWith(
|
|
51
|
+
expect.stringContaining("Missing translation"),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
warnSpy.mockRestore();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("hasMessage", () => {
|
|
59
|
+
it("should return true for existing keys", () => {
|
|
60
|
+
expect(hasMessage(mockMessages, "usd")).toBe(true);
|
|
61
|
+
expect(hasMessage(mockMessages, "eur")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("should return false for missing keys", () => {
|
|
65
|
+
expect(hasMessage(mockMessages, "UNKNOWN")).toBe(false);
|
|
66
|
+
expect(hasMessage(mockMessages, "")).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe("batchResolveMessages", () => {
|
|
71
|
+
it("should resolve all options at once", () => {
|
|
72
|
+
const options = [{ code: "USD" }, { code: "EUR" }, { code: "MXN" }];
|
|
73
|
+
|
|
74
|
+
const result = batchResolveMessages(mockMessages, options, {
|
|
75
|
+
keyExtractor: (opt) => opt.code,
|
|
76
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
expect(result).toEqual({
|
|
80
|
+
USD: "US Dollar",
|
|
81
|
+
EUR: "Euro",
|
|
82
|
+
MXN: "Mexican Peso",
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should include fallback values for missing keys", () => {
|
|
87
|
+
vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
88
|
+
|
|
89
|
+
const options = [{ code: "USD" }, { code: "XYZ" }];
|
|
90
|
+
const result = batchResolveMessages(mockMessages, options, {
|
|
91
|
+
keyExtractor: (opt) => opt.code,
|
|
92
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(result).toEqual({
|
|
96
|
+
USD: "US Dollar",
|
|
97
|
+
XYZ: "XYZ", // fallback
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
vi.restoreAllMocks();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// sdk/devtools/src/patterns/message-resolver.ts
|
|
2
|
+
import { DEV } from "esm-env";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Dynamic i18n Message Resolver Pattern
|
|
6
|
+
*
|
|
7
|
+
* Enables dynamic message function calls for config selectors.
|
|
8
|
+
* Creates a resolver that dynamically looks up and calls message functions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
type MessageBundle = Record<string, (...args: unknown[]) => string>;
|
|
12
|
+
|
|
13
|
+
interface MessageResolverConfig<T> {
|
|
14
|
+
/**
|
|
15
|
+
* Function to extract the message key from an option
|
|
16
|
+
* @example (currency) => currency.code // "USD"
|
|
17
|
+
*/
|
|
18
|
+
keyExtractor: (option: T) => string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Optional transformer for the key before message lookup
|
|
22
|
+
* @example (key) => key.toLowerCase() // "USD" -> "usd"
|
|
23
|
+
*/
|
|
24
|
+
keyTransformer?: (key: string) => string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a message resolver function for dynamic i18n lookups
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const getCurrencyLabel = createMessageResolver<Currency>(m, {
|
|
33
|
+
* keyExtractor: (currency) => currency.code
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* getCurrencyLabel({ code: "EUR", symbol: "€" }); // "Euro"
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function createMessageResolver<T>(
|
|
40
|
+
messages: MessageBundle,
|
|
41
|
+
config: MessageResolverConfig<T>,
|
|
42
|
+
) {
|
|
43
|
+
return (option: T): string => {
|
|
44
|
+
const key = config.keyExtractor(option);
|
|
45
|
+
const transformedKey = config.keyTransformer
|
|
46
|
+
? config.keyTransformer(key)
|
|
47
|
+
: key;
|
|
48
|
+
|
|
49
|
+
const messageFn = messages[transformedKey];
|
|
50
|
+
|
|
51
|
+
if (!messageFn || typeof messageFn !== "function") {
|
|
52
|
+
if (DEV) {
|
|
53
|
+
console.warn(
|
|
54
|
+
`[MessageResolver] Missing translation for key: "${transformedKey}"`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return key; // Fallback to key
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return messageFn();
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Type guard to check if a message key exists
|
|
66
|
+
*/
|
|
67
|
+
export function hasMessage(messages: MessageBundle, key: string): boolean {
|
|
68
|
+
return key in messages && typeof messages[key] === "function";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Batch resolver for multiple options at once
|
|
73
|
+
*/
|
|
74
|
+
export function batchResolveMessages<T>(
|
|
75
|
+
messages: MessageBundle,
|
|
76
|
+
options: T[],
|
|
77
|
+
config: MessageResolverConfig<T>,
|
|
78
|
+
): Record<string, string> {
|
|
79
|
+
const resolver = createMessageResolver(messages, config);
|
|
80
|
+
|
|
81
|
+
return options.reduce(
|
|
82
|
+
(acc, option) => {
|
|
83
|
+
const key = config.keyExtractor(option);
|
|
84
|
+
acc[key] = resolver(option);
|
|
85
|
+
return acc;
|
|
86
|
+
},
|
|
87
|
+
{} as Record<string, string>,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://inlang.com/schema/project-settings",
|
|
3
|
+
"baseLocale": "en",
|
|
4
|
+
"locales": [
|
|
5
|
+
"es",
|
|
6
|
+
"fr",
|
|
7
|
+
"it",
|
|
8
|
+
"pt",
|
|
9
|
+
"en",
|
|
10
|
+
"de",
|
|
11
|
+
"ru",
|
|
12
|
+
"hi",
|
|
13
|
+
"ar",
|
|
14
|
+
"zh",
|
|
15
|
+
"ja",
|
|
16
|
+
"ko",
|
|
17
|
+
"vi"
|
|
18
|
+
],
|
|
19
|
+
"modules": [
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
|
|
22
|
+
],
|
|
23
|
+
"plugin.inlang.messageFormat": {
|
|
24
|
+
"pathPattern": "./translations/{locale}.json"
|
|
25
|
+
}
|
|
26
|
+
}
|