rune-lab 0.4.2-beta.1 → 0.4.2-beta.10

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 (297) hide show
  1. package/dist/RuneProvider.svelte +105 -0
  2. package/dist/RuneProvider.svelte.d.ts +30 -0
  3. package/dist/i18n/message-resolver.d.ts +41 -0
  4. package/dist/i18n/message-resolver.js +47 -0
  5. package/dist/i18n/message-resolver.test.js +77 -0
  6. package/dist/i18n/project.inlang/settings.json +26 -0
  7. package/dist/i18n/translations/ar.json +89 -0
  8. package/dist/i18n/translations/de.json +89 -0
  9. package/dist/i18n/translations/en.json +89 -0
  10. package/dist/i18n/translations/es.json +89 -0
  11. package/dist/i18n/translations/fr.json +89 -0
  12. package/dist/i18n/translations/hi.json +89 -0
  13. package/dist/i18n/translations/it.json +89 -0
  14. package/dist/i18n/translations/ja.json +89 -0
  15. package/dist/i18n/translations/ko.json +89 -0
  16. package/dist/i18n/translations/pt.json +89 -0
  17. package/dist/i18n/translations/ru.json +89 -0
  18. package/dist/i18n/translations/vi.json +89 -0
  19. package/dist/i18n/translations/zh.json +89 -0
  20. package/dist/kernel/src/actions/portal.d.ts +7 -0
  21. package/dist/kernel/src/actions/portal.js +32 -0
  22. package/dist/kernel/src/actions/shortcut-listener.d.ts +15 -0
  23. package/dist/kernel/src/actions/shortcut-listener.js +34 -0
  24. package/dist/kernel/src/context/app.svelte.d.ts +45 -0
  25. package/dist/kernel/src/context/app.svelte.js +78 -0
  26. package/dist/kernel/src/context/context.d.ts +15 -0
  27. package/dist/kernel/src/context/context.js +16 -0
  28. package/dist/kernel/src/context/stores.svelte.d.ts +60 -0
  29. package/dist/kernel/src/context/stores.svelte.js +49 -0
  30. package/dist/kernel/src/context/types.d.ts +98 -0
  31. package/dist/kernel/src/context/types.js +1 -0
  32. package/dist/kernel/src/context/useRuneLab.d.ts +16 -0
  33. package/dist/kernel/src/context/useRuneLab.js +17 -0
  34. package/dist/kernel/src/mod.d.ts +13 -0
  35. package/dist/kernel/src/mod.js +13 -0
  36. package/dist/kernel/src/persistence/createConfigStore.svelte.d.ts +28 -0
  37. package/dist/kernel/src/persistence/createConfigStore.svelte.js +72 -0
  38. package/dist/kernel/src/persistence/drivers.d.ts +12 -0
  39. package/dist/kernel/src/persistence/drivers.js +75 -0
  40. package/dist/kernel/src/persistence/drivers.test.js +79 -0
  41. package/dist/kernel/src/persistence/provider.d.ts +23 -0
  42. package/dist/kernel/src/persistence/provider.js +43 -0
  43. package/dist/kernel/src/persistence/provider.test.js +51 -0
  44. package/dist/kernel/src/persistence/types.d.ts +17 -0
  45. package/dist/kernel/src/persistence/types.js +2 -0
  46. package/dist/kernel/src/persistence/usePersistence.d.ts +2 -0
  47. package/dist/kernel/src/persistence/usePersistence.js +5 -0
  48. package/dist/kernel/src/registry/mod.d.ts +105 -0
  49. package/dist/kernel/src/registry/mod.js +131 -0
  50. package/dist/kernel/src/registry/registry.test.js +114 -0
  51. package/dist/kernel/src/tokens/props.d.ts +51 -0
  52. package/dist/kernel/src/tokens/props.js +34 -0
  53. package/dist/mod.d.ts +6 -0
  54. package/dist/mod.js +8 -0
  55. package/dist/runes/layout/src/APP_CONFIGURATIONS.d.ts +29 -0
  56. package/dist/runes/layout/src/APP_CONFIGURATIONS.js +38 -0
  57. package/dist/runes/layout/src/AppSettingSelector.svelte +177 -0
  58. package/dist/runes/layout/src/AppSettingSelector.svelte.d.ts +16 -0
  59. package/dist/runes/layout/src/ConnectedNavigationPanel.svelte +26 -0
  60. package/dist/runes/layout/src/ConnectedNavigationPanel.svelte.d.ts +16 -0
  61. package/dist/runes/layout/src/ConnectedWorkspaceStrip.svelte +22 -0
  62. package/dist/runes/layout/src/ConnectedWorkspaceStrip.svelte.d.ts +16 -0
  63. package/dist/runes/layout/src/ContentArea.svelte +19 -0
  64. package/dist/runes/layout/src/ContentArea.svelte.d.ts +16 -0
  65. package/dist/runes/layout/src/DetailPanel.svelte +12 -0
  66. package/dist/runes/layout/src/DetailPanel.svelte.d.ts +16 -0
  67. package/dist/runes/layout/src/Icon.svelte +7 -0
  68. package/dist/runes/layout/src/Icon.svelte.d.ts +16 -0
  69. package/dist/runes/layout/src/LanguageSelector.svelte +45 -0
  70. package/dist/runes/layout/src/LanguageSelector.svelte.d.ts +16 -0
  71. package/dist/runes/layout/src/NavigationPanel.svelte +117 -0
  72. package/dist/runes/layout/src/NavigationPanel.svelte.d.ts +16 -0
  73. package/dist/runes/layout/src/ResourceSelector.svelte +90 -0
  74. package/dist/runes/layout/src/ResourceSelector.svelte.d.ts +19 -0
  75. package/dist/runes/layout/src/ThemeSelector.svelte +50 -0
  76. package/dist/runes/layout/src/ThemeSelector.svelte.d.ts +16 -0
  77. package/dist/runes/layout/src/WorkspaceLayout.svelte +252 -0
  78. package/dist/runes/layout/src/WorkspaceLayout.svelte.d.ts +45 -0
  79. package/dist/runes/layout/src/WorkspaceStrip.svelte +72 -0
  80. package/dist/runes/layout/src/WorkspaceStrip.svelte.d.ts +16 -0
  81. package/dist/runes/layout/src/connection-factory.d.ts +50 -0
  82. package/dist/runes/layout/src/connection-factory.js +58 -0
  83. package/dist/runes/layout/src/language.svelte.d.ts +46 -0
  84. package/dist/runes/layout/src/language.svelte.js +30 -0
  85. package/dist/runes/layout/src/mod.d.ts +22 -0
  86. package/dist/runes/layout/src/mod.js +63 -0
  87. package/dist/runes/layout/src/store.svelte.d.ts +28 -0
  88. package/dist/runes/layout/src/store.svelte.js +105 -0
  89. package/dist/runes/layout/src/theme.svelte.d.ts +6 -0
  90. package/dist/runes/layout/src/theme.svelte.js +62 -0
  91. package/dist/runes/layout/src/types.d.ts +6 -0
  92. package/dist/runes/layout/src/types.js +8 -0
  93. package/dist/runes/palettes/src/commands/CommandPalette.svelte +227 -0
  94. package/dist/runes/palettes/src/commands/CommandPalette.svelte.d.ts +16 -0
  95. package/dist/runes/palettes/src/commands/mod.d.ts +2 -0
  96. package/dist/runes/palettes/src/commands/mod.js +2 -0
  97. package/dist/runes/palettes/src/commands/store.svelte.d.ts +31 -0
  98. package/dist/runes/palettes/src/commands/store.svelte.js +57 -0
  99. package/dist/runes/palettes/src/mod.d.ts +9 -0
  100. package/dist/runes/palettes/src/mod.js +46 -0
  101. package/dist/runes/palettes/src/notifications/NotificationBell.svelte +89 -0
  102. package/dist/runes/palettes/src/notifications/NotificationBell.svelte.d.ts +24 -0
  103. package/dist/runes/palettes/src/notifications/Toaster.svelte +100 -0
  104. package/dist/runes/palettes/src/notifications/Toaster.svelte.d.ts +16 -0
  105. package/dist/runes/palettes/src/notifications/bridge.d.ts +29 -0
  106. package/dist/runes/palettes/src/notifications/bridge.js +43 -0
  107. package/dist/runes/palettes/src/notifications/mod.d.ts +4 -0
  108. package/dist/runes/palettes/src/notifications/mod.js +4 -0
  109. package/dist/runes/palettes/src/notifications/store.svelte.d.ts +23 -0
  110. package/dist/runes/palettes/src/notifications/store.svelte.js +43 -0
  111. package/dist/runes/palettes/src/shortcuts/ShortcutPalette.svelte +243 -0
  112. package/dist/runes/palettes/src/shortcuts/ShortcutPalette.svelte.d.ts +21 -0
  113. package/dist/runes/palettes/src/shortcuts/mod.d.ts +4 -0
  114. package/dist/runes/palettes/src/shortcuts/mod.js +4 -0
  115. package/dist/runes/palettes/src/shortcuts/store.svelte.d.ts +37 -0
  116. package/dist/runes/palettes/src/shortcuts/store.svelte.js +76 -0
  117. package/dist/runes/palettes/src/shortcuts/types.d.ts +1 -0
  118. package/dist/runes/palettes/src/shortcuts/types.js +3 -0
  119. package/dist/runes/palettes/src/shortcuts/useShortcuts.d.ts +32 -0
  120. package/dist/runes/palettes/src/shortcuts/useShortcuts.js +75 -0
  121. package/dist/runes/plugins/money/src/CurrencySelector.svelte +41 -0
  122. package/dist/runes/plugins/money/src/CurrencySelector.svelte.d.ts +16 -0
  123. package/dist/runes/plugins/money/src/MoneyDisplay.svelte +142 -0
  124. package/dist/runes/plugins/money/src/MoneyDisplay.svelte.d.ts +16 -0
  125. package/dist/runes/plugins/money/src/MoneyInput.svelte +208 -0
  126. package/dist/runes/plugins/money/src/MoneyInput.svelte.d.ts +47 -0
  127. package/dist/runes/plugins/money/src/currency.svelte.d.ts +25 -0
  128. package/dist/runes/plugins/money/src/currency.svelte.js +70 -0
  129. package/dist/runes/plugins/money/src/currency.test.js +32 -0
  130. package/dist/runes/plugins/money/src/exchange-rate.svelte.d.ts +44 -0
  131. package/dist/runes/plugins/money/src/exchange-rate.svelte.js +146 -0
  132. package/dist/runes/plugins/money/src/exchange-rate.test.js +74 -0
  133. package/dist/runes/plugins/money/src/mod.d.ts +13 -0
  134. package/dist/runes/plugins/money/src/mod.js +53 -0
  135. package/dist/runes/plugins/money/src/money-primitive.d.ts +100 -0
  136. package/dist/runes/plugins/money/src/money-primitive.js +161 -0
  137. package/dist/runes/plugins/money/src/money-primitive.test.js +175 -0
  138. package/dist/runes/plugins/money/src/money.d.ts +128 -0
  139. package/dist/runes/plugins/money/src/money.js +250 -0
  140. package/dist/runes/plugins/money/src/money.test.js +139 -0
  141. package/dist/runes/plugins/money/src/strategies.d.ts +51 -0
  142. package/dist/runes/plugins/money/src/strategies.js +72 -0
  143. package/dist/runes/plugins/money/src/strategies.test.js +100 -0
  144. package/dist/runes/plugins/money/src/types.d.ts +1 -0
  145. package/dist/runes/plugins/money/src/types.js +1 -0
  146. package/dist/runes/plugins/money/src/useMoney.d.ts +32 -0
  147. package/dist/runes/plugins/money/src/useMoney.js +126 -0
  148. package/dist/runes/plugins/money/src/useMoneyFilter.d.ts +21 -0
  149. package/dist/runes/plugins/money/src/useMoneyFilter.js +84 -0
  150. package/package.json +39 -7
  151. package/deno.json +0 -13
  152. package/src/RuneProvider.ts +0 -104
  153. package/src/_virtual/_rolldown/runtime.ts +0 -14
  154. package/src/i18n/paraglide/messages/_index.ts +0 -178
  155. package/src/i18n/paraglide/messages/abyss.ts +0 -45
  156. package/src/i18n/paraglide/messages/acid.ts +0 -45
  157. package/src/i18n/paraglide/messages/active_toasts.ts +0 -45
  158. package/src/i18n/paraglide/messages/aed3.ts +0 -45
  159. package/src/i18n/paraglide/messages/all_currencies.ts +0 -45
  160. package/src/i18n/paraglide/messages/all_languages.ts +0 -45
  161. package/src/i18n/paraglide/messages/all_themes.ts +0 -45
  162. package/src/i18n/paraglide/messages/api_status.ts +0 -45
  163. package/src/i18n/paraglide/messages/app_info.ts +0 -45
  164. package/src/i18n/paraglide/messages/appearance.ts +0 -45
  165. package/src/i18n/paraglide/messages/aqua.ts +0 -45
  166. package/src/i18n/paraglide/messages/ar.ts +0 -45
  167. package/src/i18n/paraglide/messages/autumn.ts +0 -45
  168. package/src/i18n/paraglide/messages/black.ts +0 -45
  169. package/src/i18n/paraglide/messages/brl3.ts +0 -45
  170. package/src/i18n/paraglide/messages/bumblebee.ts +0 -45
  171. package/src/i18n/paraglide/messages/business.ts +0 -45
  172. package/src/i18n/paraglide/messages/cad3.ts +0 -45
  173. package/src/i18n/paraglide/messages/caramellatte.ts +0 -45
  174. package/src/i18n/paraglide/messages/cmyk.ts +0 -45
  175. package/src/i18n/paraglide/messages/cny3.ts +0 -45
  176. package/src/i18n/paraglide/messages/coffee.ts +0 -45
  177. package/src/i18n/paraglide/messages/commands_label.ts +0 -45
  178. package/src/i18n/paraglide/messages/corporate.ts +0 -45
  179. package/src/i18n/paraglide/messages/cupcake.ts +0 -45
  180. package/src/i18n/paraglide/messages/currency.ts +0 -45
  181. package/src/i18n/paraglide/messages/current_currency.ts +0 -45
  182. package/src/i18n/paraglide/messages/current_language.ts +0 -45
  183. package/src/i18n/paraglide/messages/current_theme.ts +0 -45
  184. package/src/i18n/paraglide/messages/currently_in_queue.ts +0 -45
  185. package/src/i18n/paraglide/messages/cyberpunk.ts +0 -45
  186. package/src/i18n/paraglide/messages/dark.ts +0 -45
  187. package/src/i18n/paraglide/messages/de.ts +0 -45
  188. package/src/i18n/paraglide/messages/dim.ts +0 -45
  189. package/src/i18n/paraglide/messages/dracula.ts +0 -45
  190. package/src/i18n/paraglide/messages/emerald.ts +0 -45
  191. package/src/i18n/paraglide/messages/en.ts +0 -45
  192. package/src/i18n/paraglide/messages/es.ts +0 -45
  193. package/src/i18n/paraglide/messages/eur3.ts +0 -45
  194. package/src/i18n/paraglide/messages/extended_controls.ts +0 -45
  195. package/src/i18n/paraglide/messages/fantasy.ts +0 -45
  196. package/src/i18n/paraglide/messages/forest.ts +0 -45
  197. package/src/i18n/paraglide/messages/fr.ts +0 -45
  198. package/src/i18n/paraglide/messages/garden.ts +0 -45
  199. package/src/i18n/paraglide/messages/gbp3.ts +0 -45
  200. package/src/i18n/paraglide/messages/halloween.ts +0 -45
  201. package/src/i18n/paraglide/messages/hello_world.ts +0 -45
  202. package/src/i18n/paraglide/messages/hi.ts +0 -45
  203. package/src/i18n/paraglide/messages/inr3.ts +0 -45
  204. package/src/i18n/paraglide/messages/it.ts +0 -45
  205. package/src/i18n/paraglide/messages/ja.ts +0 -45
  206. package/src/i18n/paraglide/messages/jpy3.ts +0 -45
  207. package/src/i18n/paraglide/messages/ko.ts +0 -45
  208. package/src/i18n/paraglide/messages/krw3.ts +0 -45
  209. package/src/i18n/paraglide/messages/languages.ts +0 -45
  210. package/src/i18n/paraglide/messages/lemonade.ts +0 -45
  211. package/src/i18n/paraglide/messages/light.ts +0 -45
  212. package/src/i18n/paraglide/messages/live_store_dashboard.ts +0 -45
  213. package/src/i18n/paraglide/messages/localization.ts +0 -45
  214. package/src/i18n/paraglide/messages/lofi.ts +0 -45
  215. package/src/i18n/paraglide/messages/luxury.ts +0 -45
  216. package/src/i18n/paraglide/messages/mxn3.ts +0 -45
  217. package/src/i18n/paraglide/messages/name_label.ts +0 -45
  218. package/src/i18n/paraglide/messages/night.ts +0 -45
  219. package/src/i18n/paraglide/messages/nord.ts +0 -45
  220. package/src/i18n/paraglide/messages/pastel.ts +0 -45
  221. package/src/i18n/paraglide/messages/pt.ts +0 -45
  222. package/src/i18n/paraglide/messages/real_time_monitor_desc.ts +0 -47
  223. package/src/i18n/paraglide/messages/registered_in_registry.ts +0 -45
  224. package/src/i18n/paraglide/messages/retro.ts +0 -45
  225. package/src/i18n/paraglide/messages/ru.ts +0 -45
  226. package/src/i18n/paraglide/messages/silk.ts +0 -45
  227. package/src/i18n/paraglide/messages/state_label.ts +0 -45
  228. package/src/i18n/paraglide/messages/sunset.ts +0 -45
  229. package/src/i18n/paraglide/messages/synthwave.ts +0 -45
  230. package/src/i18n/paraglide/messages/system.ts +0 -45
  231. package/src/i18n/paraglide/messages/theme.ts +0 -45
  232. package/src/i18n/paraglide/messages/themes.ts +0 -45
  233. package/src/i18n/paraglide/messages/url_label.ts +0 -45
  234. package/src/i18n/paraglide/messages/usd3.ts +0 -45
  235. package/src/i18n/paraglide/messages/valentine.ts +0 -45
  236. package/src/i18n/paraglide/messages/version_label.ts +0 -45
  237. package/src/i18n/paraglide/messages/vi.ts +0 -45
  238. package/src/i18n/paraglide/messages/winter.ts +0 -45
  239. package/src/i18n/paraglide/messages/wireframe.ts +0 -45
  240. package/src/i18n/paraglide/messages/zh.ts +0 -45
  241. package/src/i18n/paraglide/messages.ts +0 -180
  242. package/src/i18n/paraglide/runtime.ts +0 -147
  243. package/src/kernel/src/actions/portal.ts +0 -20
  244. package/src/kernel/src/actions/shortcut-listener.ts +0 -22
  245. package/src/kernel/src/context/app.svelte.ts +0 -111
  246. package/src/kernel/src/context/context.ts +0 -18
  247. package/src/kernel/src/context/stores.svelte.ts +0 -56
  248. package/src/kernel/src/mod.ts +0 -11
  249. package/src/kernel/src/persistence/createConfigStore.svelte.ts +0 -57
  250. package/src/kernel/src/persistence/drivers.ts +0 -59
  251. package/src/kernel/src/persistence/provider.ts +0 -22
  252. package/src/kernel/src/persistence/usePersistence.ts +0 -9
  253. package/src/kernel/src/registry/mod.ts +0 -68
  254. package/src/kernel/src/tokens/props.ts +0 -9
  255. package/src/mod.ts +0 -243
  256. package/src/node_modules/.deno/dinero.js@2.0.2/node_modules/dinero.js/dist/esm/currencies/index.ts +0 -48
  257. package/src/node_modules/.deno/dinero.js@2.0.2/node_modules/dinero.js/dist/esm/index.ts +0 -26
  258. package/src/node_modules/.deno/dinero.js@2.0.2/node_modules/dinero.js/dist/esm/trimScale-C3-DjbPM.ts +0 -246
  259. package/src/rune-lab.css +0 -44
  260. package/src/runes/layout/src/APP_CONFIGURATIONS.ts +0 -26
  261. package/src/runes/layout/src/AppSettingSelector.ts +0 -151
  262. package/src/runes/layout/src/ContentArea.ts +0 -22
  263. package/src/runes/layout/src/DetailPanel.ts +0 -10
  264. package/src/runes/layout/src/Icon.ts +0 -16
  265. package/src/runes/layout/src/LanguageSelector.ts +0 -67
  266. package/src/runes/layout/src/NavigationPanel.ts +0 -162
  267. package/src/runes/layout/src/ResourceSelector.ts +0 -63
  268. package/src/runes/layout/src/ThemeSelector.ts +0 -63
  269. package/src/runes/layout/src/WorkspaceLayout.ts +0 -210
  270. package/src/runes/layout/src/WorkspaceStrip.ts +0 -107
  271. package/src/runes/layout/src/connection-factory.ts +0 -29
  272. package/src/runes/layout/src/language.svelte.ts +0 -68
  273. package/src/runes/layout/src/mod.ts +0 -56
  274. package/src/runes/layout/src/store.svelte.ts +0 -133
  275. package/src/runes/layout/src/theme.svelte.ts +0 -61
  276. package/src/runes/layout/src/types.ts +0 -2
  277. package/src/runes/palettes/src/commands/CommandPalette.ts +0 -241
  278. package/src/runes/palettes/src/commands/mod.ts +0 -3
  279. package/src/runes/palettes/src/commands/store.svelte.ts +0 -48
  280. package/src/runes/palettes/src/mod.ts +0 -64
  281. package/src/runes/palettes/src/notifications/NotificationBell.ts +0 -51
  282. package/src/runes/palettes/src/notifications/Toaster.ts +0 -82
  283. package/src/runes/palettes/src/notifications/bridge.ts +0 -21
  284. package/src/runes/palettes/src/notifications/mod.ts +0 -5
  285. package/src/runes/palettes/src/notifications/store.svelte.ts +0 -46
  286. package/src/runes/palettes/src/shortcuts/ShortcutPalette.ts +0 -208
  287. package/src/runes/palettes/src/shortcuts/mod.ts +0 -5
  288. package/src/runes/palettes/src/shortcuts/store.svelte.ts +0 -83
  289. package/src/runes/palettes/src/shortcuts/useShortcuts.ts +0 -32
  290. package/src/runes/plugins/money/src/currency.svelte.ts +0 -98
  291. package/src/runes/plugins/money/src/exchange-rate.svelte.ts +0 -97
  292. package/src/runes/plugins/money/src/mod.ts +0 -46
  293. package/src/runes/plugins/money/src/money-primitive.ts +0 -83
  294. package/src/runes/plugins/money/src/money.ts +0 -202
  295. package/src/runes/plugins/money/src/strategies.ts +0 -35
  296. package/src/runes/plugins/money/src/useMoney.ts +0 -80
  297. package/src/runes/plugins/money/src/useMoneyFilter.ts +0 -66
@@ -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,30 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { PersistenceDriver } from "@rune-lab/kernel";
3
+ /**
4
+ * Namespaced configuration for Rune Lab plugins.
5
+ * Keyed by plugin.id.
6
+ */
7
+ export interface RuneLabConfig {
8
+ persistence?: PersistenceDriver;
9
+ /** Optional head management properties */
10
+ favicon?: string;
11
+ manageHead?: boolean;
12
+ icons?: "material" | "none";
13
+ /** Namespaced config for plugins */
14
+ [pluginId: string]: unknown;
15
+ }
16
+ declare const __propDef: {
17
+ props: Record<string, never>;
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ exports?: {};
23
+ bindings?: string;
24
+ };
25
+ export type RuneProviderProps = typeof __propDef.props;
26
+ export type RuneProviderEvents = typeof __propDef.events;
27
+ export type RuneProviderSlots = typeof __propDef.slots;
28
+ export default class RuneProvider extends SvelteComponentTyped<RuneProviderProps, RuneProviderEvents, RuneProviderSlots> {
29
+ }
30
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Dynamic i18n Message Resolver Pattern
3
+ *
4
+ * Enables dynamic message function calls for config selectors.
5
+ * Creates a resolver that dynamically looks up and calls message functions.
6
+ */
7
+ type MessageBundle = Record<string, (...args: unknown[]) => string>;
8
+ interface MessageResolverConfig<T> {
9
+ /**
10
+ * Function to extract the message key from an option
11
+ * @example (currency) => currency.code // "USD"
12
+ */
13
+ keyExtractor: (option: T) => string;
14
+ /**
15
+ * Optional transformer for the key before message lookup
16
+ * @example (key) => key.toLowerCase() // "USD" -> "usd"
17
+ */
18
+ keyTransformer?: (key: string) => string;
19
+ }
20
+ /**
21
+ * Creates a message resolver function for dynamic i18n lookups
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const getCurrencyLabel = createMessageResolver<Currency>(m, {
26
+ * keyExtractor: (currency) => currency.code
27
+ * });
28
+ *
29
+ * getCurrencyLabel({ code: "EUR", symbol: "€" }); // "Euro"
30
+ * ```
31
+ */
32
+ export declare function createMessageResolver<T>(messages: MessageBundle, config: MessageResolverConfig<T>): (option: T) => string;
33
+ /**
34
+ * Type guard to check if a message key exists
35
+ */
36
+ export declare function hasMessage(messages: MessageBundle, key: string): boolean;
37
+ /**
38
+ * Batch resolver for multiple options at once
39
+ */
40
+ export declare function batchResolveMessages<T>(messages: MessageBundle, options: T[], config: MessageResolverConfig<T>): Record<string, string>;
41
+ export {};
@@ -0,0 +1,47 @@
1
+ // sdk/devtools/src/patterns/message-resolver.ts
2
+ import { DEV } from "esm-env";
3
+ /**
4
+ * Creates a message resolver function for dynamic i18n lookups
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const getCurrencyLabel = createMessageResolver<Currency>(m, {
9
+ * keyExtractor: (currency) => currency.code
10
+ * });
11
+ *
12
+ * getCurrencyLabel({ code: "EUR", symbol: "€" }); // "Euro"
13
+ * ```
14
+ */
15
+ export function createMessageResolver(messages, config) {
16
+ return (option) => {
17
+ const key = config.keyExtractor(option);
18
+ const transformedKey = config.keyTransformer
19
+ ? config.keyTransformer(key)
20
+ : key;
21
+ const messageFn = messages[transformedKey];
22
+ if (!messageFn || typeof messageFn !== "function") {
23
+ if (DEV) {
24
+ console.warn(`[MessageResolver] Missing translation for key: "${transformedKey}"`);
25
+ }
26
+ return key; // Fallback to key
27
+ }
28
+ return messageFn();
29
+ };
30
+ }
31
+ /**
32
+ * Type guard to check if a message key exists
33
+ */
34
+ export function hasMessage(messages, key) {
35
+ return key in messages && typeof messages[key] === "function";
36
+ }
37
+ /**
38
+ * Batch resolver for multiple options at once
39
+ */
40
+ export function batchResolveMessages(messages, options, config) {
41
+ const resolver = createMessageResolver(messages, config);
42
+ return options.reduce((acc, option) => {
43
+ const key = config.keyExtractor(option);
44
+ acc[key] = resolver(option);
45
+ return acc;
46
+ }, {});
47
+ }
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it, vi } from "vite-plus/test";
2
+ // Mock esm-env before importing the module
3
+ vi.mock("esm-env", () => ({ DEV: true }));
4
+ import { batchResolveMessages, createMessageResolver, hasMessage, } from "./message-resolver.ts";
5
+ describe("MessageResolver", () => {
6
+ const mockMessages = {
7
+ usd: () => "US Dollar",
8
+ eur: () => "Euro",
9
+ mxn: () => "Mexican Peso",
10
+ jpy: () => "Japanese Yen",
11
+ };
12
+ describe("createMessageResolver", () => {
13
+ it("should resolve a key via keyExtractor", () => {
14
+ const resolver = createMessageResolver(mockMessages, {
15
+ keyExtractor: (opt) => opt.code,
16
+ keyTransformer: (key) => key.toLowerCase(),
17
+ });
18
+ expect(resolver({ code: "USD" })).toBe("US Dollar");
19
+ expect(resolver({ code: "EUR" })).toBe("Euro");
20
+ });
21
+ it("should use untransformed key when no transformer provided", () => {
22
+ const resolver = createMessageResolver(mockMessages, {
23
+ keyExtractor: (opt) => opt.code,
24
+ });
25
+ // Without transformer, keys must match exactly
26
+ expect(resolver({ code: "usd" })).toBe("US Dollar");
27
+ });
28
+ it("should fall back to the raw key for missing translations", () => {
29
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
30
+ const resolver = createMessageResolver(mockMessages, {
31
+ keyExtractor: (opt) => opt.code,
32
+ keyTransformer: (key) => key.toLowerCase(),
33
+ });
34
+ const result = resolver({ code: "UNKNOWN" });
35
+ expect(result).toBe("UNKNOWN"); // falls back to original key
36
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("Missing translation"));
37
+ warnSpy.mockRestore();
38
+ });
39
+ });
40
+ describe("hasMessage", () => {
41
+ it("should return true for existing keys", () => {
42
+ expect(hasMessage(mockMessages, "usd")).toBe(true);
43
+ expect(hasMessage(mockMessages, "eur")).toBe(true);
44
+ });
45
+ it("should return false for missing keys", () => {
46
+ expect(hasMessage(mockMessages, "UNKNOWN")).toBe(false);
47
+ expect(hasMessage(mockMessages, "")).toBe(false);
48
+ });
49
+ });
50
+ describe("batchResolveMessages", () => {
51
+ it("should resolve all options at once", () => {
52
+ const options = [{ code: "USD" }, { code: "EUR" }, { code: "MXN" }];
53
+ const result = batchResolveMessages(mockMessages, options, {
54
+ keyExtractor: (opt) => opt.code,
55
+ keyTransformer: (key) => key.toLowerCase(),
56
+ });
57
+ expect(result).toEqual({
58
+ USD: "US Dollar",
59
+ EUR: "Euro",
60
+ MXN: "Mexican Peso",
61
+ });
62
+ });
63
+ it("should include fallback values for missing keys", () => {
64
+ vi.spyOn(console, "warn").mockImplementation(() => { });
65
+ const options = [{ code: "USD" }, { code: "XYZ" }];
66
+ const result = batchResolveMessages(mockMessages, options, {
67
+ keyExtractor: (opt) => opt.code,
68
+ keyTransformer: (key) => key.toLowerCase(),
69
+ });
70
+ expect(result).toEqual({
71
+ USD: "US Dollar",
72
+ XYZ: "XYZ", // fallback
73
+ });
74
+ vi.restoreAllMocks();
75
+ });
76
+ });
77
+ });
@@ -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
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "$schema": "https://inlang.com/schema/inlang-message-format",
3
+ "hello_world": "مرحبا {name} بالعربية",
4
+ "languages": "اللغات",
5
+ "de": "الألمانية",
6
+ "en": "الإنجليزية",
7
+ "es": "الإسبانية",
8
+ "fr": "الفرنسية",
9
+ "it": "الإيطالية",
10
+ "pt": "البرتغالية",
11
+ "ru": "الروسية",
12
+ "hi": "الهندية",
13
+ "ar": "العربية",
14
+ "zh": "الصينية",
15
+ "ja": "اليابانية",
16
+ "ko": "الكورية",
17
+ "vi": "الفيتنامية",
18
+ "currency": "العملة",
19
+ "USD": "دولار أمريكي",
20
+ "EUR": "يورو",
21
+ "MXN": "بيزو مكسيكي",
22
+ "CNY": "يوان صيني",
23
+ "JPY": "ين ياباني",
24
+ "KRW": "وون كوري جنوبي",
25
+ "AED": "درهم إماراتي",
26
+ "GBP": "جنيه إسترليني",
27
+ "CAD": "دولار كندي",
28
+ "BRL": "ريال برازيلي",
29
+ "INR": "روبية هندية",
30
+ "theme": "السمة",
31
+ "themes": "السمات",
32
+ "all_themes": "جميع السمات",
33
+ "all_currencies": "جميع العملات",
34
+ "all_languages": "جميع اللغات",
35
+ "extended_controls": "ضوابط المختبر الممتدة",
36
+ "light": "فاتح",
37
+ "dark": "داكن",
38
+ "system": "النظام",
39
+ "cupcake": "كاب كيك",
40
+ "bumblebee": "نحلة",
41
+ "emerald": "زمرد",
42
+ "corporate": "شركات",
43
+ "synthwave": "سينثويف",
44
+ "retro": "ريترو",
45
+ "cyberpunk": "سايبربانك",
46
+ "valentine": "عيد الحب",
47
+ "halloween": "الهالوين",
48
+ "garden": "حديقة",
49
+ "forest": "غابة",
50
+ "aqua": "أكوا",
51
+ "lofi": "لوفي",
52
+ "pastel": "باستيل",
53
+ "fantasy": "خيال",
54
+ "wireframe": "إطار سلكي",
55
+ "black": "أسود",
56
+ "luxury": "فخامة",
57
+ "dracula": "دراكولا",
58
+ "cmyk": "سماوي قرمزي أصفر أسود",
59
+ "autumn": "خريف",
60
+ "business": "أعمال",
61
+ "acid": "حمضي",
62
+ "lemonade": "ليمونادة",
63
+ "night": "ليل",
64
+ "coffee": "قهوة",
65
+ "winter": "شتاء",
66
+ "dim": "خافت",
67
+ "nord": "نورد",
68
+ "sunset": "غروب",
69
+ "caramellatte": "كراميل لاتيه",
70
+ "abyss": "هاوية",
71
+ "silk": "حرير",
72
+ "live_store_dashboard": "لوحة تحكم المتجر المباشر",
73
+ "real_time_monitor_desc": "مراقب الحالة التفاعلية في الوقت الفعلي لمتاجر Rune Lab",
74
+ "api_status": "حالة API",
75
+ "active_toasts": "الإشعارات النشطة",
76
+ "commands_label": "الأوامر",
77
+ "app_info": "معلومات التطبيق",
78
+ "appearance": "المظهر",
79
+ "localization": "التوطين",
80
+ "name_label": "الاسم",
81
+ "version_label": "الإصدار",
82
+ "current_theme": "السمة",
83
+ "current_language": "اللغة",
84
+ "current_currency": "العملة",
85
+ "state_label": "الحالة",
86
+ "url_label": "عنوان URL",
87
+ "currently_in_queue": "حاليا في قائمة الانتظار",
88
+ "registered_in_registry": "مسجل في السجل"
89
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "$schema": "https://inlang.com/schema/inlang-message-format",
3
+ "hello_world": "Hallo {name} auf Deutsch",
4
+ "languages": "Sprachen",
5
+ "de": "Deutsch",
6
+ "en": "Englisch",
7
+ "es": "Spanisch",
8
+ "fr": "Französisch",
9
+ "it": "Italienisch",
10
+ "pt": "Portugiesisch",
11
+ "ru": "Russisch",
12
+ "hi": "Hindi",
13
+ "ar": "Arabisch",
14
+ "zh": "Chinesisch",
15
+ "ja": "Japanisch",
16
+ "ko": "Koreanisch",
17
+ "vi": "Vietnamesisch",
18
+ "currency": "Währung",
19
+ "USD": "US-Dollar",
20
+ "EUR": "Euro",
21
+ "MXN": "Mexikanischer Peso",
22
+ "CNY": "Chinesischer Yuan",
23
+ "JPY": "Japanischer Yen",
24
+ "KRW": "Südkoreanischer Won",
25
+ "AED": "VAE-Dirham",
26
+ "GBP": "Britisches Pfund",
27
+ "CAD": "Kanadischer Dollar",
28
+ "BRL": "Brasilianischer Real",
29
+ "INR": "Indische Rupie",
30
+ "theme": "Thema",
31
+ "themes": "Themen",
32
+ "all_themes": "Alle Themen",
33
+ "all_currencies": "Alle Währungen",
34
+ "all_languages": "Alle Sprachen",
35
+ "extended_controls": "Erweiterte Laborkontrollen",
36
+ "light": "Hell",
37
+ "dark": "Dunkel",
38
+ "system": "System",
39
+ "cupcake": "Cupcake",
40
+ "bumblebee": "Hummel",
41
+ "emerald": "Smaragd",
42
+ "corporate": "Corporate",
43
+ "synthwave": "Synthwave",
44
+ "retro": "Retro",
45
+ "cyberpunk": "Cyberpunk",
46
+ "valentine": "Valentinstag",
47
+ "halloween": "Halloween",
48
+ "garden": "Garten",
49
+ "forest": "Wald",
50
+ "aqua": "Aqua",
51
+ "lofi": "Lofi",
52
+ "pastel": "Pastell",
53
+ "fantasy": "Fantasie",
54
+ "wireframe": "Drahtmodell",
55
+ "black": "Schwarz",
56
+ "luxury": "Luxus",
57
+ "dracula": "Dracula",
58
+ "cmyk": "CMYK",
59
+ "autumn": "Herbst",
60
+ "business": "Geschäft",
61
+ "acid": "Säure",
62
+ "lemonade": "Limonade",
63
+ "night": "Nacht",
64
+ "coffee": "Kaffee",
65
+ "winter": "Winter",
66
+ "dim": "Gedimmt",
67
+ "nord": "Nord",
68
+ "sunset": "Sonnenuntergang",
69
+ "caramellatte": "Karamell-Latte",
70
+ "abyss": "Abgrund",
71
+ "silk": "Seide",
72
+ "live_store_dashboard": "Live-Store-Dashboard",
73
+ "real_time_monitor_desc": "Reaktiver Echtzeit-Statusmonitor für Rune Lab Stores",
74
+ "api_status": "API-Status",
75
+ "active_toasts": "Aktive Benachrichtigungen",
76
+ "commands_label": "Befehle",
77
+ "app_info": "App-Informationen",
78
+ "appearance": "Aussehen",
79
+ "localization": "Lokalisierung",
80
+ "name_label": "Name",
81
+ "version_label": "Version",
82
+ "current_theme": "Design",
83
+ "current_language": "Sprache",
84
+ "current_currency": "Währung",
85
+ "state_label": "Status",
86
+ "url_label": "URL",
87
+ "currently_in_queue": "Derzeit in der Warteschlange",
88
+ "registered_in_registry": "Im Register eingetragen"
89
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "$schema": "https://inlang.com/schema/inlang-message-format",
3
+ "hello_world": "Hello {name} in English",
4
+ "languages": "Languages",
5
+ "de": "Deutsch",
6
+ "en": "English",
7
+ "es": "Spanish",
8
+ "fr": "French",
9
+ "it": "Italian",
10
+ "pt": "Portuguese",
11
+ "ru": "Russian",
12
+ "hi": "Hindi",
13
+ "ar": "Arabic",
14
+ "zh": "Chinese",
15
+ "ja": "Japanese",
16
+ "ko": "Korean",
17
+ "vi": "Vietnamese",
18
+ "currency": "Currency",
19
+ "USD": "US Dollar",
20
+ "EUR": "Euro",
21
+ "MXN": "Mexican Peso",
22
+ "CNY": "Chinese Yuan",
23
+ "JPY": "Japanese Yen",
24
+ "KRW": "Korean Won",
25
+ "AED": "United Arab Emirates Dirham",
26
+ "GBP": "British Pound",
27
+ "CAD": "Canadian Dollar",
28
+ "BRL": "Brazilian Real",
29
+ "INR": "Indian Rupee",
30
+ "theme": "Theme",
31
+ "themes": "Themes",
32
+ "all_themes": "All Themes",
33
+ "all_currencies": "All Currencies",
34
+ "all_languages": "All Languages",
35
+ "extended_controls": "Extended Laboratory Controls",
36
+ "light": "Light",
37
+ "dark": "Dark",
38
+ "system": "System",
39
+ "cupcake": "Cupcake",
40
+ "bumblebee": "Bumblebee",
41
+ "emerald": "Emerald",
42
+ "corporate": "Corporate",
43
+ "synthwave": "Synthwave",
44
+ "retro": "Retro",
45
+ "cyberpunk": "Cyberpunk",
46
+ "valentine": "Valentine",
47
+ "halloween": "Halloween",
48
+ "garden": "Garden",
49
+ "forest": "Forest",
50
+ "aqua": "Aqua",
51
+ "lofi": "Lofi",
52
+ "pastel": "Pastel",
53
+ "fantasy": "Fantasy",
54
+ "wireframe": "Wireframe",
55
+ "black": "Black",
56
+ "luxury": "Luxury",
57
+ "dracula": "Dracula",
58
+ "cmyk": "CMYK",
59
+ "autumn": "Autumn",
60
+ "business": "Business",
61
+ "acid": "Acid",
62
+ "lemonade": "Lemonade",
63
+ "night": "Night",
64
+ "coffee": "Coffee",
65
+ "winter": "Winter",
66
+ "dim": "Dim",
67
+ "nord": "Nord",
68
+ "sunset": "Sunset",
69
+ "caramellatte": "Caramel Latte",
70
+ "abyss": "Abyss",
71
+ "silk": "Silk",
72
+ "live_store_dashboard": "Live Store Dashboard",
73
+ "real_time_monitor_desc": "Real-time reactive state monitor for Rune Lab stores",
74
+ "api_status": "API Status",
75
+ "active_toasts": "Active Toasts",
76
+ "commands_label": "Commands",
77
+ "app_info": "App Info",
78
+ "appearance": "Appearance",
79
+ "localization": "Localization",
80
+ "name_label": "Name",
81
+ "version_label": "Version",
82
+ "current_theme": "Theme",
83
+ "current_language": "Language",
84
+ "current_currency": "Currency",
85
+ "state_label": "State",
86
+ "url_label": "URL",
87
+ "currently_in_queue": "Currently in queue",
88
+ "registered_in_registry": "Registered in registry"
89
+ }