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.
Files changed (433) hide show
  1. package/.gitignore +12 -0
  2. package/README.md +3 -3
  3. package/deno.json +50 -0
  4. package/justfile +5 -0
  5. package/package.json +2 -79
  6. package/scripts/build_pkg.ts +51 -0
  7. package/scripts/ci.just +26 -0
  8. package/scripts/deploy.just +21 -0
  9. package/scripts/dev.just +4 -0
  10. package/scripts/inject.just +72 -0
  11. package/src/RuneProvider.svelte +105 -0
  12. package/src/i18n/message-resolver.test.ts +103 -0
  13. package/src/i18n/message-resolver.ts +89 -0
  14. package/src/i18n/project.inlang/settings.json +26 -0
  15. package/src/i18n/translations/ar.json +89 -0
  16. package/src/i18n/translations/de.json +89 -0
  17. package/src/i18n/translations/en.json +89 -0
  18. package/src/i18n/translations/es.json +89 -0
  19. package/src/i18n/translations/fr.json +89 -0
  20. package/src/i18n/translations/hi.json +89 -0
  21. package/src/i18n/translations/it.json +89 -0
  22. package/src/i18n/translations/ja.json +89 -0
  23. package/src/i18n/translations/ko.json +89 -0
  24. package/src/i18n/translations/pt.json +89 -0
  25. package/src/i18n/translations/ru.json +89 -0
  26. package/src/i18n/translations/vi.json +89 -0
  27. package/src/i18n/translations/zh.json +89 -0
  28. package/src/kernel/deno.json +5 -0
  29. package/src/kernel/src/actions/portal.ts +41 -0
  30. package/src/kernel/src/actions/shortcut-listener.ts +50 -0
  31. package/src/kernel/src/context/app.svelte.ts +98 -0
  32. package/src/kernel/src/context/context.ts +31 -0
  33. package/src/kernel/src/context/stores.svelte.ts +96 -0
  34. package/src/kernel/src/context/types.ts +110 -0
  35. package/src/kernel/src/context/useRuneLab.ts +38 -0
  36. package/src/kernel/src/mod.ts +13 -0
  37. package/src/kernel/src/persistence/createConfigStore.svelte.ts +120 -0
  38. package/src/kernel/src/persistence/drivers.test.ts +95 -0
  39. package/src/kernel/src/persistence/drivers.ts +77 -0
  40. package/src/kernel/src/persistence/provider.test.ts +58 -0
  41. package/{dist/state/persistence/provider.js → src/kernel/src/persistence/provider.ts} +29 -14
  42. package/src/kernel/src/persistence/types.ts +19 -0
  43. package/src/kernel/src/persistence/usePersistence.ts +9 -0
  44. package/src/kernel/src/registry/mod.ts +221 -0
  45. package/src/kernel/src/registry/registry.test.ts +162 -0
  46. package/src/kernel/src/tokens/props.ts +94 -0
  47. package/src/mod.ts +10 -0
  48. package/src/runes/layout/deno.json +5 -0
  49. package/src/runes/layout/src/APP_CONFIGURATIONS.ts +56 -0
  50. package/{dist/ui/features/config → src/runes/layout/src}/AppSettingSelector.svelte +1 -1
  51. package/{dist/ui/layout → src/runes/layout/src}/ConnectedNavigationPanel.svelte +1 -1
  52. package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +1 -1
  53. package/src/runes/layout/src/Icon.svelte +7 -0
  54. package/{dist/ui/features/config → src/runes/layout/src}/LanguageSelector.svelte +7 -5
  55. package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
  56. package/{dist/ui/features/config → src/runes/layout/src}/ResourceSelector.svelte +3 -5
  57. package/{dist/ui/features/config → src/runes/layout/src}/ThemeSelector.svelte +2 -2
  58. package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +6 -4
  59. package/{dist/ui/layout → src/runes/layout/src}/WorkspaceStrip.svelte +1 -1
  60. package/src/runes/layout/src/connection-factory.ts +95 -0
  61. package/src/runes/layout/src/language.svelte.ts +44 -0
  62. package/src/runes/layout/src/mod.ts +71 -0
  63. package/src/runes/layout/src/store.svelte.ts +142 -0
  64. package/src/runes/layout/src/theme.svelte.ts +73 -0
  65. package/src/runes/layout/src/types.ts +11 -0
  66. package/src/runes/palettes/deno.json +8 -0
  67. package/{dist/ui/features/command-palette → src/runes/palettes/src/commands}/CommandPalette.svelte +4 -4
  68. package/src/runes/palettes/src/commands/mod.ts +2 -0
  69. package/src/runes/palettes/src/commands/store.svelte.ts +80 -0
  70. package/src/runes/palettes/src/mod.ts +51 -0
  71. package/{dist/ui/components → src/runes/palettes/src/notifications}/Toaster.svelte +1 -2
  72. package/src/runes/palettes/src/notifications/bridge.ts +56 -0
  73. package/src/runes/palettes/src/notifications/mod.ts +4 -0
  74. package/src/runes/palettes/src/notifications/store.svelte.ts +58 -0
  75. package/{dist/ui/features → src/runes/palettes/src}/shortcuts/ShortcutPalette.svelte +4 -4
  76. package/src/runes/palettes/src/shortcuts/mod.ts +4 -0
  77. package/src/runes/palettes/src/shortcuts/store.svelte.ts +85 -0
  78. package/src/runes/palettes/src/shortcuts/types.ts +4 -0
  79. package/src/runes/palettes/src/shortcuts/useShortcuts.ts +85 -0
  80. package/src/runes/plugins/money/deno.json +8 -0
  81. package/{dist/ui/features/config → src/runes/plugins/money/src}/CurrencySelector.svelte +2 -2
  82. package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyDisplay.svelte +2 -2
  83. package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyInput.svelte +4 -8
  84. package/src/runes/plugins/money/src/currency.svelte.ts +95 -0
  85. package/src/runes/plugins/money/src/currency.test.ts +40 -0
  86. package/src/runes/plugins/money/src/exchange-rate.svelte.ts +176 -0
  87. package/src/runes/plugins/money/src/exchange-rate.test.ts +95 -0
  88. package/src/runes/plugins/money/src/mod.ts +79 -0
  89. package/src/runes/plugins/money/src/money-primitive.test.ts +217 -0
  90. package/src/runes/plugins/money/src/money-primitive.ts +220 -0
  91. package/src/runes/plugins/money/src/money.test.ts +183 -0
  92. package/src/runes/plugins/money/src/money.ts +382 -0
  93. package/src/runes/plugins/money/src/strategies.test.ts +143 -0
  94. package/{dist/core/exchange-rate/strategies.js → src/runes/plugins/money/src/strategies.ts} +45 -22
  95. package/src/runes/plugins/money/src/types.ts +27 -0
  96. package/src/runes/plugins/money/src/useMoney.ts +261 -0
  97. package/src/runes/plugins/money/src/useMoneyFilter.ts +132 -0
  98. package/tsconfig.json +41 -0
  99. package/vite.config.ts +44 -0
  100. package/dist/core/design-tokens/props.d.ts +0 -52
  101. package/dist/core/design-tokens/props.d.ts.map +0 -1
  102. package/dist/core/design-tokens/props.js +0 -34
  103. package/dist/core/exchange-rate/strategies.d.ts +0 -52
  104. package/dist/core/exchange-rate/strategies.d.ts.map +0 -1
  105. package/dist/core/index.d.ts +0 -9
  106. package/dist/core/index.d.ts.map +0 -1
  107. package/dist/core/index.js +0 -8
  108. package/dist/core/internal/message-resolver.d.ts +0 -42
  109. package/dist/core/internal/message-resolver.d.ts.map +0 -1
  110. package/dist/core/internal/message-resolver.js +0 -47
  111. package/dist/core/layout/types.d.ts +0 -60
  112. package/dist/core/layout/types.d.ts.map +0 -1
  113. package/dist/core/layout/types.js +0 -4
  114. package/dist/core/money/index.d.ts +0 -2
  115. package/dist/core/money/index.d.ts.map +0 -1
  116. package/dist/core/money/index.js +0 -2
  117. package/dist/core/money/money-primitive.d.ts +0 -101
  118. package/dist/core/money/money-primitive.d.ts.map +0 -1
  119. package/dist/core/money/money-primitive.js +0 -161
  120. package/dist/core/money/money.d.ts +0 -129
  121. package/dist/core/money/money.d.ts.map +0 -1
  122. package/dist/core/money/money.js +0 -250
  123. package/dist/core/persistence/types.d.ts +0 -18
  124. package/dist/core/persistence/types.d.ts.map +0 -1
  125. package/dist/core/persistence/types.js +0 -2
  126. package/dist/core/shortcuts/types.d.ts +0 -60
  127. package/dist/core/shortcuts/types.d.ts.map +0 -1
  128. package/dist/core/shortcuts/types.js +0 -4
  129. package/dist/index.d.ts +0 -6
  130. package/dist/index.js +0 -7
  131. package/dist/state/api.svelte.d.ts +0 -26
  132. package/dist/state/api.svelte.js +0 -65
  133. package/dist/state/app.svelte.d.ts +0 -48
  134. package/dist/state/app.svelte.js +0 -82
  135. package/dist/state/auth/index.d.ts +0 -2
  136. package/dist/state/auth/index.js +0 -2
  137. package/dist/state/auth/session.svelte.d.ts +0 -40
  138. package/dist/state/auth/session.svelte.js +0 -59
  139. package/dist/state/auth/types.d.ts +0 -30
  140. package/dist/state/auth/types.js +0 -3
  141. package/dist/state/cart.svelte.d.ts +0 -64
  142. package/dist/state/cart.svelte.js +0 -122
  143. package/dist/state/commands.svelte.d.ts +0 -46
  144. package/dist/state/commands.svelte.js +0 -62
  145. package/dist/state/composables/useMoney.d.ts +0 -31
  146. package/dist/state/composables/useMoney.js +0 -126
  147. package/dist/state/composables/useMoneyFilter.d.ts +0 -20
  148. package/dist/state/composables/useMoneyFilter.js +0 -81
  149. package/dist/state/composables/usePersistence.d.ts +0 -2
  150. package/dist/state/composables/usePersistence.js +0 -5
  151. package/dist/state/composables/useRuneLab.d.ts +0 -19
  152. package/dist/state/composables/useRuneLab.js +0 -30
  153. package/dist/state/composables/useShortcuts.d.ts +0 -33
  154. package/dist/state/composables/useShortcuts.js +0 -75
  155. package/dist/state/context.d.ts +0 -15
  156. package/dist/state/context.js +0 -16
  157. package/dist/state/createConfigStore.svelte.d.ts +0 -28
  158. package/dist/state/createConfigStore.svelte.js +0 -72
  159. package/dist/state/currency.svelte.d.ts +0 -32
  160. package/dist/state/currency.svelte.js +0 -96
  161. package/dist/state/currency.test.d.ts +0 -1
  162. package/dist/state/currency.test.js +0 -35
  163. package/dist/state/exchange-rate.svelte.d.ts +0 -43
  164. package/dist/state/exchange-rate.svelte.js +0 -145
  165. package/dist/state/exchange-rate.test.d.ts +0 -1
  166. package/dist/state/exchange-rate.test.js +0 -75
  167. package/dist/state/index.d.ts +0 -26
  168. package/dist/state/index.js +0 -32
  169. package/dist/state/language.svelte.d.ts +0 -57
  170. package/dist/state/language.svelte.js +0 -43
  171. package/dist/state/layout.svelte.d.ts +0 -49
  172. package/dist/state/layout.svelte.js +0 -108
  173. package/dist/state/persistence/drivers.d.ts +0 -12
  174. package/dist/state/persistence/drivers.js +0 -75
  175. package/dist/state/persistence/drivers.test.d.ts +0 -1
  176. package/dist/state/persistence/drivers.test.js +0 -79
  177. package/dist/state/persistence/provider.d.ts +0 -23
  178. package/dist/state/persistence/provider.test.d.ts +0 -1
  179. package/dist/state/persistence/provider.test.js +0 -51
  180. package/dist/state/registry/index.d.ts +0 -44
  181. package/dist/state/registry/index.js +0 -58
  182. package/dist/state/registry/registry.test.d.ts +0 -1
  183. package/dist/state/registry/registry.test.js +0 -112
  184. package/dist/state/registry/types.d.ts +0 -20
  185. package/dist/state/registry/types.js +0 -3
  186. package/dist/state/shortcuts.svelte.d.ts +0 -121
  187. package/dist/state/shortcuts.svelte.js +0 -222
  188. package/dist/state/theme.svelte.d.ts +0 -15
  189. package/dist/state/theme.svelte.js +0 -92
  190. package/dist/state/toast-bridge.d.ts +0 -29
  191. package/dist/state/toast-bridge.js +0 -43
  192. package/dist/state/toast.svelte.d.ts +0 -27
  193. package/dist/state/toast.svelte.js +0 -43
  194. package/dist/ui/actions/portal.d.ts +0 -7
  195. package/dist/ui/actions/portal.js +0 -32
  196. package/dist/ui/components/ApiMonitor.svelte +0 -162
  197. package/dist/ui/components/ApiMonitor.svelte.d.ts +0 -3
  198. package/dist/ui/components/Icon.svelte +0 -108
  199. package/dist/ui/components/Icon.svelte.d.ts +0 -14
  200. package/dist/ui/components/Kyntharil.svelte +0 -48
  201. package/dist/ui/components/Kyntharil.svelte.d.ts +0 -6
  202. package/dist/ui/components/RuneProvider.svelte +0 -218
  203. package/dist/ui/components/RuneProvider.svelte.d.ts +0 -49
  204. package/dist/ui/components/Toaster.svelte.d.ts +0 -18
  205. package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -33
  206. package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
  207. package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -117
  208. package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -34
  209. package/dist/ui/components/money/index.d.ts +0 -2
  210. package/dist/ui/components/money/index.js +0 -3
  211. package/dist/ui/components/user/UserAvatar.svelte +0 -66
  212. package/dist/ui/components/user/UserAvatar.svelte.d.ts +0 -13
  213. package/dist/ui/components/user/UserProfile.svelte +0 -79
  214. package/dist/ui/components/user/UserProfile.svelte.d.ts +0 -17
  215. package/dist/ui/components/user/index.d.ts +0 -2
  216. package/dist/ui/components/user/index.js +0 -3
  217. package/dist/ui/features/command-palette/CommandPalette.svelte.d.ts +0 -6
  218. package/dist/ui/features/config/APP_CONFIGURATIONS.d.ts +0 -29
  219. package/dist/ui/features/config/APP_CONFIGURATIONS.js +0 -38
  220. package/dist/ui/features/config/AppSettingSelector.svelte.d.ts +0 -13
  221. package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
  222. package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
  223. package/dist/ui/features/config/ResourceSelector.svelte.d.ts +0 -25
  224. package/dist/ui/features/config/ThemeSelector.svelte.d.ts +0 -8
  225. package/dist/ui/features/notifications/NotificationBell.svelte.d.ts +0 -11
  226. package/dist/ui/features/notifications/index.d.ts +0 -1
  227. package/dist/ui/features/notifications/index.js +0 -2
  228. package/dist/ui/features/shortcuts/ShortcutBinder.svelte +0 -17
  229. package/dist/ui/features/shortcuts/ShortcutBinder.svelte.d.ts +0 -7
  230. package/dist/ui/features/shortcuts/ShortcutPalette.svelte.d.ts +0 -6
  231. package/dist/ui/index.d.ts +0 -30
  232. package/dist/ui/index.js +0 -46
  233. package/dist/ui/layout/ConnectedNavigationPanel.svelte.d.ts +0 -10
  234. package/dist/ui/layout/ConnectedWorkspaceStrip.svelte.d.ts +0 -9
  235. package/dist/ui/layout/ContentArea.svelte.d.ts +0 -8
  236. package/dist/ui/layout/DetailPanel.svelte.d.ts +0 -7
  237. package/dist/ui/layout/NavigationPanel.svelte.d.ts +0 -14
  238. package/dist/ui/layout/WorkspaceLayout.svelte.d.ts +0 -32
  239. package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
  240. package/dist/ui/layout/connection-factory.d.ts +0 -50
  241. package/dist/ui/layout/connection-factory.js +0 -58
  242. package/dist/ui/layout/index.d.ts +0 -7
  243. package/dist/ui/layout/index.js +0 -7
  244. package/dist/ui/paraglide/README.md +0 -147
  245. package/dist/ui/paraglide/messages/_index.d.ts +0 -87
  246. package/dist/ui/paraglide/messages/_index.js +0 -88
  247. package/dist/ui/paraglide/messages/abyss.d.ts +0 -16
  248. package/dist/ui/paraglide/messages/abyss.js +0 -84
  249. package/dist/ui/paraglide/messages/acid.d.ts +0 -16
  250. package/dist/ui/paraglide/messages/acid.js +0 -84
  251. package/dist/ui/paraglide/messages/active_toasts.d.ts +0 -16
  252. package/dist/ui/paraglide/messages/active_toasts.js +0 -84
  253. package/dist/ui/paraglide/messages/aed3.d.ts +0 -17
  254. package/dist/ui/paraglide/messages/aed3.js +0 -85
  255. package/dist/ui/paraglide/messages/all_currencies.d.ts +0 -16
  256. package/dist/ui/paraglide/messages/all_currencies.js +0 -84
  257. package/dist/ui/paraglide/messages/all_languages.d.ts +0 -16
  258. package/dist/ui/paraglide/messages/all_languages.js +0 -84
  259. package/dist/ui/paraglide/messages/all_themes.d.ts +0 -16
  260. package/dist/ui/paraglide/messages/all_themes.js +0 -84
  261. package/dist/ui/paraglide/messages/api_status.d.ts +0 -16
  262. package/dist/ui/paraglide/messages/api_status.js +0 -84
  263. package/dist/ui/paraglide/messages/app_info.d.ts +0 -16
  264. package/dist/ui/paraglide/messages/app_info.js +0 -84
  265. package/dist/ui/paraglide/messages/appearance.d.ts +0 -16
  266. package/dist/ui/paraglide/messages/appearance.js +0 -84
  267. package/dist/ui/paraglide/messages/aqua.d.ts +0 -16
  268. package/dist/ui/paraglide/messages/aqua.js +0 -84
  269. package/dist/ui/paraglide/messages/ar.d.ts +0 -16
  270. package/dist/ui/paraglide/messages/ar.js +0 -84
  271. package/dist/ui/paraglide/messages/autumn.d.ts +0 -16
  272. package/dist/ui/paraglide/messages/autumn.js +0 -84
  273. package/dist/ui/paraglide/messages/black.d.ts +0 -16
  274. package/dist/ui/paraglide/messages/black.js +0 -84
  275. package/dist/ui/paraglide/messages/brl3.d.ts +0 -17
  276. package/dist/ui/paraglide/messages/brl3.js +0 -85
  277. package/dist/ui/paraglide/messages/bumblebee.d.ts +0 -16
  278. package/dist/ui/paraglide/messages/bumblebee.js +0 -84
  279. package/dist/ui/paraglide/messages/business.d.ts +0 -16
  280. package/dist/ui/paraglide/messages/business.js +0 -84
  281. package/dist/ui/paraglide/messages/cad3.d.ts +0 -17
  282. package/dist/ui/paraglide/messages/cad3.js +0 -85
  283. package/dist/ui/paraglide/messages/caramellatte.d.ts +0 -16
  284. package/dist/ui/paraglide/messages/caramellatte.js +0 -84
  285. package/dist/ui/paraglide/messages/cmyk.d.ts +0 -16
  286. package/dist/ui/paraglide/messages/cmyk.js +0 -84
  287. package/dist/ui/paraglide/messages/cny3.d.ts +0 -17
  288. package/dist/ui/paraglide/messages/cny3.js +0 -85
  289. package/dist/ui/paraglide/messages/coffee.d.ts +0 -16
  290. package/dist/ui/paraglide/messages/coffee.js +0 -84
  291. package/dist/ui/paraglide/messages/commands_label.d.ts +0 -16
  292. package/dist/ui/paraglide/messages/commands_label.js +0 -84
  293. package/dist/ui/paraglide/messages/corporate.d.ts +0 -16
  294. package/dist/ui/paraglide/messages/corporate.js +0 -84
  295. package/dist/ui/paraglide/messages/cupcake.d.ts +0 -16
  296. package/dist/ui/paraglide/messages/cupcake.js +0 -84
  297. package/dist/ui/paraglide/messages/currency.d.ts +0 -16
  298. package/dist/ui/paraglide/messages/currency.js +0 -84
  299. package/dist/ui/paraglide/messages/current_currency.d.ts +0 -16
  300. package/dist/ui/paraglide/messages/current_currency.js +0 -84
  301. package/dist/ui/paraglide/messages/current_language.d.ts +0 -16
  302. package/dist/ui/paraglide/messages/current_language.js +0 -84
  303. package/dist/ui/paraglide/messages/current_theme.d.ts +0 -16
  304. package/dist/ui/paraglide/messages/current_theme.js +0 -84
  305. package/dist/ui/paraglide/messages/currently_in_queue.d.ts +0 -16
  306. package/dist/ui/paraglide/messages/currently_in_queue.js +0 -84
  307. package/dist/ui/paraglide/messages/cyberpunk.d.ts +0 -16
  308. package/dist/ui/paraglide/messages/cyberpunk.js +0 -84
  309. package/dist/ui/paraglide/messages/dark.d.ts +0 -16
  310. package/dist/ui/paraglide/messages/dark.js +0 -84
  311. package/dist/ui/paraglide/messages/de.d.ts +0 -16
  312. package/dist/ui/paraglide/messages/de.js +0 -84
  313. package/dist/ui/paraglide/messages/dim.d.ts +0 -16
  314. package/dist/ui/paraglide/messages/dim.js +0 -84
  315. package/dist/ui/paraglide/messages/dracula.d.ts +0 -16
  316. package/dist/ui/paraglide/messages/dracula.js +0 -84
  317. package/dist/ui/paraglide/messages/emerald.d.ts +0 -16
  318. package/dist/ui/paraglide/messages/emerald.js +0 -84
  319. package/dist/ui/paraglide/messages/en.d.ts +0 -16
  320. package/dist/ui/paraglide/messages/en.js +0 -84
  321. package/dist/ui/paraglide/messages/es.d.ts +0 -16
  322. package/dist/ui/paraglide/messages/es.js +0 -84
  323. package/dist/ui/paraglide/messages/eur3.d.ts +0 -17
  324. package/dist/ui/paraglide/messages/eur3.js +0 -85
  325. package/dist/ui/paraglide/messages/extended_controls.d.ts +0 -16
  326. package/dist/ui/paraglide/messages/extended_controls.js +0 -84
  327. package/dist/ui/paraglide/messages/fantasy.d.ts +0 -16
  328. package/dist/ui/paraglide/messages/fantasy.js +0 -84
  329. package/dist/ui/paraglide/messages/forest.d.ts +0 -16
  330. package/dist/ui/paraglide/messages/forest.js +0 -84
  331. package/dist/ui/paraglide/messages/fr.d.ts +0 -16
  332. package/dist/ui/paraglide/messages/fr.js +0 -84
  333. package/dist/ui/paraglide/messages/garden.d.ts +0 -16
  334. package/dist/ui/paraglide/messages/garden.js +0 -84
  335. package/dist/ui/paraglide/messages/gbp3.d.ts +0 -17
  336. package/dist/ui/paraglide/messages/gbp3.js +0 -85
  337. package/dist/ui/paraglide/messages/halloween.d.ts +0 -16
  338. package/dist/ui/paraglide/messages/halloween.js +0 -84
  339. package/dist/ui/paraglide/messages/hello_world.d.ts +0 -18
  340. package/dist/ui/paraglide/messages/hello_world.js +0 -84
  341. package/dist/ui/paraglide/messages/hi.d.ts +0 -16
  342. package/dist/ui/paraglide/messages/hi.js +0 -84
  343. package/dist/ui/paraglide/messages/inr3.d.ts +0 -17
  344. package/dist/ui/paraglide/messages/inr3.js +0 -85
  345. package/dist/ui/paraglide/messages/it.d.ts +0 -16
  346. package/dist/ui/paraglide/messages/it.js +0 -84
  347. package/dist/ui/paraglide/messages/ja.d.ts +0 -16
  348. package/dist/ui/paraglide/messages/ja.js +0 -84
  349. package/dist/ui/paraglide/messages/jpy3.d.ts +0 -17
  350. package/dist/ui/paraglide/messages/jpy3.js +0 -85
  351. package/dist/ui/paraglide/messages/ko.d.ts +0 -16
  352. package/dist/ui/paraglide/messages/ko.js +0 -84
  353. package/dist/ui/paraglide/messages/krw3.d.ts +0 -17
  354. package/dist/ui/paraglide/messages/krw3.js +0 -85
  355. package/dist/ui/paraglide/messages/languages.d.ts +0 -16
  356. package/dist/ui/paraglide/messages/languages.js +0 -84
  357. package/dist/ui/paraglide/messages/lemonade.d.ts +0 -16
  358. package/dist/ui/paraglide/messages/lemonade.js +0 -84
  359. package/dist/ui/paraglide/messages/light.d.ts +0 -16
  360. package/dist/ui/paraglide/messages/light.js +0 -84
  361. package/dist/ui/paraglide/messages/live_store_dashboard.d.ts +0 -16
  362. package/dist/ui/paraglide/messages/live_store_dashboard.js +0 -84
  363. package/dist/ui/paraglide/messages/localization.d.ts +0 -16
  364. package/dist/ui/paraglide/messages/localization.js +0 -84
  365. package/dist/ui/paraglide/messages/lofi.d.ts +0 -16
  366. package/dist/ui/paraglide/messages/lofi.js +0 -84
  367. package/dist/ui/paraglide/messages/luxury.d.ts +0 -16
  368. package/dist/ui/paraglide/messages/luxury.js +0 -84
  369. package/dist/ui/paraglide/messages/mxn3.d.ts +0 -17
  370. package/dist/ui/paraglide/messages/mxn3.js +0 -85
  371. package/dist/ui/paraglide/messages/name_label.d.ts +0 -16
  372. package/dist/ui/paraglide/messages/name_label.js +0 -84
  373. package/dist/ui/paraglide/messages/night.d.ts +0 -16
  374. package/dist/ui/paraglide/messages/night.js +0 -84
  375. package/dist/ui/paraglide/messages/nord.d.ts +0 -16
  376. package/dist/ui/paraglide/messages/nord.js +0 -84
  377. package/dist/ui/paraglide/messages/pastel.d.ts +0 -16
  378. package/dist/ui/paraglide/messages/pastel.js +0 -84
  379. package/dist/ui/paraglide/messages/pt.d.ts +0 -16
  380. package/dist/ui/paraglide/messages/pt.js +0 -84
  381. package/dist/ui/paraglide/messages/real_time_monitor_desc.d.ts +0 -16
  382. package/dist/ui/paraglide/messages/real_time_monitor_desc.js +0 -84
  383. package/dist/ui/paraglide/messages/registered_in_registry.d.ts +0 -16
  384. package/dist/ui/paraglide/messages/registered_in_registry.js +0 -84
  385. package/dist/ui/paraglide/messages/retro.d.ts +0 -16
  386. package/dist/ui/paraglide/messages/retro.js +0 -84
  387. package/dist/ui/paraglide/messages/ru.d.ts +0 -16
  388. package/dist/ui/paraglide/messages/ru.js +0 -84
  389. package/dist/ui/paraglide/messages/silk.d.ts +0 -16
  390. package/dist/ui/paraglide/messages/silk.js +0 -84
  391. package/dist/ui/paraglide/messages/state_label.d.ts +0 -16
  392. package/dist/ui/paraglide/messages/state_label.js +0 -84
  393. package/dist/ui/paraglide/messages/sunset.d.ts +0 -16
  394. package/dist/ui/paraglide/messages/sunset.js +0 -84
  395. package/dist/ui/paraglide/messages/synthwave.d.ts +0 -16
  396. package/dist/ui/paraglide/messages/synthwave.js +0 -84
  397. package/dist/ui/paraglide/messages/system.d.ts +0 -16
  398. package/dist/ui/paraglide/messages/system.js +0 -84
  399. package/dist/ui/paraglide/messages/theme.d.ts +0 -16
  400. package/dist/ui/paraglide/messages/theme.js +0 -84
  401. package/dist/ui/paraglide/messages/themes.d.ts +0 -16
  402. package/dist/ui/paraglide/messages/themes.js +0 -84
  403. package/dist/ui/paraglide/messages/url_label.d.ts +0 -16
  404. package/dist/ui/paraglide/messages/url_label.js +0 -84
  405. package/dist/ui/paraglide/messages/usd3.d.ts +0 -17
  406. package/dist/ui/paraglide/messages/usd3.js +0 -85
  407. package/dist/ui/paraglide/messages/valentine.d.ts +0 -16
  408. package/dist/ui/paraglide/messages/valentine.js +0 -84
  409. package/dist/ui/paraglide/messages/version_label.d.ts +0 -16
  410. package/dist/ui/paraglide/messages/version_label.js +0 -84
  411. package/dist/ui/paraglide/messages/vi.d.ts +0 -16
  412. package/dist/ui/paraglide/messages/vi.js +0 -84
  413. package/dist/ui/paraglide/messages/winter.d.ts +0 -16
  414. package/dist/ui/paraglide/messages/winter.js +0 -84
  415. package/dist/ui/paraglide/messages/wireframe.d.ts +0 -16
  416. package/dist/ui/paraglide/messages/wireframe.js +0 -84
  417. package/dist/ui/paraglide/messages/zh.d.ts +0 -16
  418. package/dist/ui/paraglide/messages/zh.js +0 -84
  419. package/dist/ui/paraglide/messages.d.ts +0 -2
  420. package/dist/ui/paraglide/messages.js +0 -4
  421. package/dist/ui/paraglide/registry.d.ts +0 -21
  422. package/dist/ui/paraglide/registry.js +0 -31
  423. package/dist/ui/paraglide/runtime.d.ts +0 -730
  424. package/dist/ui/paraglide/runtime.js +0 -1812
  425. package/dist/ui/paraglide/server.d.ts +0 -92
  426. package/dist/ui/paraglide/server.js +0 -239
  427. package/dist/ui/primitives/DatePicker.svelte +0 -257
  428. package/dist/ui/primitives/DatePicker.svelte.d.ts +0 -17
  429. package/dist/ui/primitives/index.d.ts +0 -1
  430. package/dist/ui/primitives/index.js +0 -3
  431. /package/{dist/ui/layout → src/runes/layout/src}/ContentArea.svelte +0 -0
  432. /package/{dist/ui/layout → src/runes/layout/src}/DetailPanel.svelte +0 -0
  433. /package/{dist/ui/features → src/runes/palettes/src}/notifications/NotificationBell.svelte +0 -0
package/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ # all that start with a dot except .gitignore
2
+ .*
3
+ !.gitignore
4
+
5
+ # lock files (from various package managers)
6
+ *.lock
7
+
8
+ # web-generated files
9
+ node_modules
10
+ dist
11
+ lab
12
+ build
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
@@ -0,0 +1,5 @@
1
+ set shell := ["bash", "-cu"]
2
+
3
+ import 'scripts/dev.just'
4
+ import 'scripts/ci.just'
5
+ import 'scripts/deploy.just'
package/package.json CHANGED
@@ -1,82 +1,5 @@
1
1
  {
2
2
  "name": "rune-lab",
3
- "version": "0.4.0",
4
- "description": "Modern toolkit for Svelte 5 Runes applications.",
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})`);
@@ -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"
@@ -0,0 +1,4 @@
1
+ [doc('Test the client (runs once)')]
2
+ [group('Dev')]
3
+ test *args:
4
+ vp test
@@ -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
+ }