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
@@ -0,0 +1,80 @@
1
+ import { getCommandStore } from "@rune-lab/kernel";
2
+ import type { Command, ConfigStore, IToastStore } from "@rune-lab/kernel";
3
+
4
+ export type { Command };
5
+
6
+ export interface CommandServices {
7
+ appStore: unknown;
8
+ apiStore: unknown;
9
+ toastStore: IToastStore;
10
+ themeStore: ConfigStore<unknown>;
11
+ languageStore: ConfigStore<unknown>;
12
+ currencyStore: ConfigStore<unknown>;
13
+ }
14
+
15
+ export class CommandStore {
16
+ // Dependency Injection
17
+ #services: CommandServices;
18
+
19
+ constructor(services: CommandServices) {
20
+ this.#services = services;
21
+ this.refreshDefaultCommands();
22
+ }
23
+
24
+ commands: Command[] = $state<Command[]>([]);
25
+
26
+ refreshDefaultCommands(): void {
27
+ // Intentionally empty.
28
+ this.commands = [];
29
+ }
30
+
31
+ /**
32
+ * Register a new command
33
+ */
34
+ register(command: Command): void {
35
+ if (this.commands.find((c) => c.id === command.id)) return;
36
+ this.commands.push(command);
37
+ }
38
+
39
+ /**
40
+ * Remove a command by id
41
+ */
42
+ unregister(id: string): void {
43
+ this.commands = this.commands.filter((c) => c.id !== id);
44
+ }
45
+
46
+ /**
47
+ * Search commands, optionally scoped to a parent's children
48
+ */
49
+ search(query: string, parentId?: string): Command[] {
50
+ const targetList = parentId
51
+ ? (this.#findById(parentId, this.commands)?.children ?? [])
52
+ : this.commands;
53
+
54
+ if (!query) return targetList;
55
+
56
+ const q = query.toLowerCase();
57
+ return targetList.filter(
58
+ (c) =>
59
+ c.label.toLowerCase().includes(q) ||
60
+ c.category?.toLowerCase().includes(q),
61
+ );
62
+ }
63
+
64
+ #findById(id: string, list: Command[]): Command | undefined {
65
+ for (const cmd of list) {
66
+ if (cmd.id === id) return cmd;
67
+ if (cmd.children) {
68
+ const found = this.#findById(id, cmd.children);
69
+ if (found) return found;
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ }
75
+
76
+ export function createCommandStore(services: CommandServices): CommandStore {
77
+ return new CommandStore(services);
78
+ }
79
+
80
+ export { getCommandStore };
@@ -0,0 +1,51 @@
1
+ import { defineRune, RUNE_LAB_CONTEXT } from "@rune-lab/kernel";
2
+ import type { ConfigStore, RunePlugin } from "@rune-lab/kernel";
3
+ import { createCommandStore } from "./commands/store.svelte.ts";
4
+ import { createShortcutStore } from "./shortcuts/store.svelte.ts";
5
+ import { createToastStore } from "./notifications/store.svelte.ts";
6
+ import type { ToastStore } from "./notifications/store.svelte.ts";
7
+ import CommandPalette from "./commands/CommandPalette.svelte";
8
+ import ShortcutPalette from "./shortcuts/ShortcutPalette.svelte";
9
+ import Toaster from "./notifications/Toaster.svelte";
10
+
11
+ export * from "./commands/mod.ts";
12
+ export * from "./shortcuts/mod.ts";
13
+ export * from "./notifications/mod.ts";
14
+
15
+ /**
16
+ * Palettes Plugin — provides the command palette, shortcut manager, and toast system.
17
+ * Always included by default in RuneProvider.
18
+ */
19
+ export const PalettesPlugin: RunePlugin = defineRune({
20
+ id: "rune-lab.palettes",
21
+ stores: [
22
+ {
23
+ id: "commands",
24
+ contextKey: RUNE_LAB_CONTEXT.commands,
25
+ factory: (_config, _driver, stores) =>
26
+ createCommandStore({
27
+ appStore: stores.get("app"),
28
+ apiStore: stores.get("api"),
29
+ toastStore: stores.get("toast") as ToastStore,
30
+ themeStore: stores.get("theme") as ConfigStore<unknown>,
31
+ languageStore: stores.get("language") as ConfigStore<unknown>,
32
+ currencyStore: stores.get("currency") as ConfigStore<unknown>,
33
+ }),
34
+ dependsOn: ["app", "api", "toast", "theme", "language", "currency"],
35
+ noPersistence: true,
36
+ },
37
+ {
38
+ id: "shortcut",
39
+ contextKey: RUNE_LAB_CONTEXT.shortcut,
40
+ factory: () => createShortcutStore(),
41
+ noPersistence: true,
42
+ },
43
+ {
44
+ id: "toast",
45
+ contextKey: RUNE_LAB_CONTEXT.toast,
46
+ factory: () => createToastStore(),
47
+ noPersistence: true,
48
+ },
49
+ ],
50
+ overlays: [CommandPalette, ShortcutPalette, Toaster],
51
+ });
@@ -1,6 +1,5 @@
1
1
  <script lang="ts">
2
- import { getToastStore } from "@internal/state";
3
- import { portal } from "../actions/portal";
2
+ import { getToastStore, portal } from "@rune-lab/kernel";
4
3
  import { flip } from "svelte/animate";
5
4
  import { fade, fly } from "svelte/transition";
6
5
 
@@ -0,0 +1,56 @@
1
+ import type { ToastStore, ToastType } from "./store.svelte.ts";
2
+
3
+ interface QueuedToast {
4
+ message: string;
5
+ type: ToastType;
6
+ duration?: number;
7
+ }
8
+
9
+ const queue: QueuedToast[] = [];
10
+ let activeStore: ToastStore | null = null;
11
+
12
+ /**
13
+ * Notifies the global toast system.
14
+ * If called before the ToastStore is initialized (e.g., in a module-level store),
15
+ * it queues the toast and flushes it once wired.
16
+ *
17
+ * @clientOnly — Not safe for use in SSR contexts. Module-level state persists across requests.
18
+ */
19
+ export function notify(
20
+ message: string,
21
+ type: ToastType = "info",
22
+ duration?: number,
23
+ ) {
24
+ if (typeof window === "undefined") return; // No-op on server
25
+
26
+ if (activeStore) {
27
+ activeStore.send(message, type, duration ?? 3000);
28
+ } else {
29
+ queue.push({ message, type, duration });
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Wires the global `notify` function to an active ToastStore instance.
35
+ * Automatically flushes any queued toasts.
36
+ */
37
+ export function wire(store: ToastStore) {
38
+ activeStore = store;
39
+ while (queue.length > 0) {
40
+ const next = queue.shift();
41
+ if (next) store.send(next.message, next.type, next.duration ?? 3000);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Escape hatch for module-level stores to send toasts without Svelte context.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { createToastBridge } from "rune-lab";
51
+ * const { notify } = createToastBridge();
52
+ *
53
+ * notify("Logged in successfully", "success");
54
+ * ```
55
+ */
56
+ export const createToastBridge = () => ({ notify, wire });
@@ -0,0 +1,4 @@
1
+ export * from "./store.svelte.ts";
2
+ export * from "./bridge.ts";
3
+ export { default as Toaster } from "./Toaster.svelte";
4
+ export { default as NotificationBell } from "./NotificationBell.svelte";
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Toast notification store
3
+ */
4
+ import { getToastStore } from "@rune-lab/kernel";
5
+ import type { Toast, ToastType } from "@rune-lab/kernel";
6
+
7
+ export type { Toast, ToastType };
8
+
9
+ export class ToastStore {
10
+ toasts: Toast[] = $state<Toast[]>([]);
11
+
12
+ /**
13
+ * Add a new toast
14
+ */
15
+ send(
16
+ message: string,
17
+ type: ToastType = "info",
18
+ duration: number = 3000,
19
+ ): void {
20
+ const id = crypto.randomUUID();
21
+ const toast: Toast = { id, message, type, duration };
22
+
23
+ this.toasts.push(toast);
24
+
25
+ if (duration > 0) {
26
+ setTimeout(() => {
27
+ this.dismiss(id);
28
+ }, duration);
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Remove a toast by id
34
+ */
35
+ dismiss(id: string): void {
36
+ this.toasts = this.toasts.filter((t) => t.id !== id);
37
+ }
38
+
39
+ // Helper methods
40
+ success(msg: string): void {
41
+ this.send(msg, "success");
42
+ }
43
+ error(msg: string): void {
44
+ this.send(msg, "error");
45
+ }
46
+ warn(msg: string): void {
47
+ this.send(msg, "warning");
48
+ }
49
+ info(msg: string): void {
50
+ this.send(msg, "info");
51
+ }
52
+ }
53
+
54
+ export function createToastStore(): ToastStore {
55
+ return new ToastStore();
56
+ }
57
+
58
+ export { getToastStore };
@@ -1,13 +1,12 @@
1
1
  <!-- src/lib/features/shortcuts/ShortcutPalette.svelte -->
2
2
  <script lang="ts">
3
3
  import { tick } from "svelte";
4
- import type { ShortcutEntry } from "@internal/state";
4
+ import type { ShortcutEntry } from "@rune-lab/kernel";
5
5
  import {
6
6
  getAppStore,
7
7
  getShortcutStore,
8
8
  LAYOUT_SHORTCUTS,
9
- } from "@internal/state";
10
- import { Icon } from "@internal/ui";
9
+ } from "@rune-lab/kernel";
11
10
 
12
11
  const appStore = getAppStore();
13
12
  const shortcutStore = getShortcutStore();
@@ -119,7 +118,8 @@
119
118
  class="border-b border-base-200 p-6 flex items-center gap-4 bg-base-200/30"
120
119
  >
121
120
  <div class="p-2 bg-primary/10 rounded-lg text-primary">
122
- <Icon name="shortcut" class="w-6 h-6" />
121
+ <!-- <Icon name="shortcut" class="w-6 h-6" /> -->
122
+ <!-- todo: Add Shortcut Icon -->
123
123
  </div>
124
124
  <div class="flex-1">
125
125
  <h2 class="text-xl font-bold tracking-tight">
@@ -0,0 +1,4 @@
1
+ export * from "./types.ts";
2
+ export * from "./store.svelte.ts";
3
+ export * from "./useShortcuts.ts";
4
+ export { default as ShortcutPalette } from "./ShortcutPalette.svelte";
@@ -0,0 +1,85 @@
1
+ import { untrack } from "svelte";
2
+ import { getShortcutStore, shortcutListener } from "@rune-lab/kernel";
3
+ import type { ShortcutConfig, ShortcutEntry } from "@rune-lab/kernel";
4
+
5
+ export type { ShortcutConfig, ShortcutEntry };
6
+
7
+ export class ShortcutStore {
8
+ entries: ShortcutEntry[] = $state<ShortcutEntry[]>([]);
9
+ showPalette: boolean = $state(false);
10
+
11
+ /**
12
+ * Filtered list of entries active in the current scope
13
+ */
14
+ active: ShortcutEntry[] = $derived(
15
+ this.entries.filter((e) => e.enabled !== false),
16
+ );
17
+
18
+ /**
19
+ * Grouped view for documentation/palette
20
+ */
21
+ byScopeAndCategory: Record<string, Record<string, ShortcutEntry[]>> = $derived
22
+ .by(() => {
23
+ const groups: Record<string, Record<string, ShortcutEntry[]>> = {};
24
+ for (const entry of this.entries) {
25
+ const scope = entry.scope ?? "global";
26
+ const category = entry.category ?? "General";
27
+ if (!groups[scope]) groups[scope] = {};
28
+ if (!groups[scope][category]) groups[scope][category] = [];
29
+ groups[scope][category].push(entry);
30
+ }
31
+ return groups;
32
+ });
33
+
34
+ /**
35
+ * Scopes sorted for palette display
36
+ */
37
+ sortedScopes: string[] = $derived.by(() => {
38
+ const scopes = Object.keys(this.byScopeAndCategory).sort((a, b) => {
39
+ if (a === "global") return -1;
40
+ if (b === "global") return 1;
41
+ if (a === "layout") return -1;
42
+ if (b === "layout") return 1;
43
+ return a.localeCompare(b);
44
+ });
45
+ return scopes;
46
+ });
47
+
48
+ /**
49
+ * Register a single shortcut or an array
50
+ */
51
+ register(entry: ShortcutEntry): void {
52
+ if (this.entries.find((e) => e.id === entry.id)) return;
53
+ this.entries.push({ ...entry, enabled: true });
54
+ }
55
+
56
+ /**
57
+ * Remove shortcut by ID
58
+ */
59
+ unregister(id: string): void {
60
+ this.entries = this.entries.filter((e) => e.id !== id);
61
+ }
62
+
63
+ /**
64
+ * Enable/Disable a shortcut
65
+ */
66
+ setEnabled(id: string, enabled: boolean): void {
67
+ const entry = this.entries.find((e) => e.id === id);
68
+ if (entry) entry.enabled = enabled;
69
+ }
70
+
71
+ /**
72
+ * Find conflicts for a given key combo and scope
73
+ */
74
+ findConflicts(keys: string, scope: string): ShortcutEntry[] {
75
+ return untrack(() =>
76
+ this.entries.filter((e) => e.keys === keys && e.scope === scope)
77
+ );
78
+ }
79
+ }
80
+
81
+ export function createShortcutStore(): ShortcutStore {
82
+ return new ShortcutStore();
83
+ }
84
+
85
+ export { getShortcutStore, shortcutListener };
@@ -0,0 +1,4 @@
1
+ // sdk/core/src/shortcuts/types.ts
2
+ // Framework-agnostic shortcut configuration types.
3
+
4
+ export type { ShortcutConfig } from "@rune-lab/kernel";
@@ -0,0 +1,85 @@
1
+ // sdk/state/src/composables/useShortcuts.ts
2
+ // Declarative shortcut registration with automatic lifecycle cleanup.
3
+ // Bridges ShortcutConfig (sdk/core) → ShortcutStore (sdk/state).
4
+
5
+ import { getShortcutStore } from "./store.svelte.ts";
6
+ import type { ShortcutEntry } from "./store.svelte.ts";
7
+ import type { ShortcutConfig } from "./types.ts";
8
+
9
+ /**
10
+ * Declarative shortcut registration composable.
11
+ * Registers all shortcuts via ShortcutStore in a single `$effect` and
12
+ * automatically unregisters them when the component is destroyed.
13
+ *
14
+ * Must be called at component initialization time (top-level in `<script>`),
15
+ * not inside event handlers.
16
+ *
17
+ * @param configs - Array of ShortcutConfig
18
+ * @returns Object with `registered` getter for the list of registered IDs
19
+ *
20
+ * @example
21
+ * ```svelte
22
+ * <script>
23
+ * import { useShortcuts } from '@rune-lab/palettes';
24
+ *
25
+ * useShortcuts([
26
+ * {
27
+ * id: "save:document",
28
+ * keys: "ctrl+s",
29
+ * handler: (e) => { e.preventDefault(); save(); },
30
+ * label: "Save document",
31
+ * category: "Editing",
32
+ * },
33
+ * ]);
34
+ * </script>
35
+ * ```
36
+ */
37
+ export function useShortcuts(
38
+ configs: ShortcutConfig[],
39
+ ): { readonly registered: string[] } {
40
+ const shortcutStore = getShortcutStore();
41
+
42
+ // Convert ShortcutConfig[] to ShortcutEntry[] respecting the `when` predicate
43
+ function toEntries(configs: ShortcutConfig[]): ShortcutEntry[] {
44
+ return configs.map((config) => ({
45
+ id: config.id,
46
+ keys: config.keys,
47
+ handler: (event: KeyboardEvent) => {
48
+ // Check `when` predicate before firing
49
+ if (config.when && !config.when()) return;
50
+ config.handler(event);
51
+ },
52
+ label: config.label ?? config.id,
53
+ category: config.category ?? "General",
54
+ scope: config.scope ?? "global",
55
+ enabled: true,
56
+ hidden: !config.label, // Hide from palette if no label
57
+ }));
58
+ }
59
+
60
+ // Register all shortcuts
61
+ const entries = toEntries(configs);
62
+ const ids = entries.map((e) => e.id);
63
+
64
+ for (const entry of entries) {
65
+ shortcutStore.register(entry);
66
+ }
67
+
68
+ // Auto-cleanup using $effect.root for lifecycle management
69
+ $effect(() => {
70
+ // This effect runs on mount — shortcuts are already registered above.
71
+ // Return cleanup that unregisters all shortcuts on destroy.
72
+ return () => {
73
+ for (const id of ids) {
74
+ shortcutStore.unregister(id);
75
+ }
76
+ };
77
+ });
78
+
79
+ return {
80
+ /** IDs of all shortcuts registered by this composable */
81
+ get registered(): string[] {
82
+ return ids;
83
+ },
84
+ };
85
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "@rune-lab/money",
3
+ "version": "0.1.0",
4
+ "exports": "./src/mod.ts",
5
+ "imports": {
6
+ "dinero.js": "npm:dinero.js"
7
+ }
8
+ }
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
- import ResourceSelector from "./ResourceSelector.svelte";
3
- import { getCurrencyStore } from "@internal/state";
2
+ import { ResourceSelector } from "@rune-lab/layout";
3
+ import { getCurrencyStore } from "@rune-lab/kernel";
4
4
 
5
5
  const currencyStore = getCurrencyStore();
6
6
 
@@ -1,11 +1,11 @@
1
1
  <script lang="ts">
2
- import { getLanguageStore, getCurrencyStore } from "@internal/state";
2
+ import { getLanguageStore, getCurrencyStore } from "@rune-lab/kernel";
3
3
  import {
4
4
  formatAmount,
5
5
  toMinorUnit,
6
6
  type ISO4217Code,
7
7
  MoneyPrimitive,
8
- } from "@internal/core";
8
+ } from "@rune-lab/money";
9
9
  import { DEV } from "esm-env";
10
10
 
11
11
  let {
@@ -1,10 +1,6 @@
1
- <!--
2
- MoneyInput — Monetary value input that works in minor units (cents).
3
- No floats cross the boundary — values are always integer minor units.
4
- -->
5
1
  <script module lang="ts">
6
- import type { ISO4217Code } from "@internal/core";
7
- import { MoneyPrimitive } from "@internal/core";
2
+ import type { ISO4217Code } from "@rune-lab/money";
3
+ import { MoneyPrimitive } from "@rune-lab/money";
8
4
 
9
5
  export interface MoneyInputProps {
10
6
  /** Current value in minor or major units (see unit prop) */
@@ -38,8 +34,8 @@
38
34
  </script>
39
35
 
40
36
  <script lang="ts">
41
- import { getCurrencyStore } from "@internal/state";
42
- import { toMinorUnit } from "@internal/core";
37
+ import { getCurrencyStore } from "@rune-lab/kernel";
38
+ import { toMinorUnit } from "@rune-lab/money";
43
39
  import { DEV } from "esm-env";
44
40
 
45
41
  let {
@@ -0,0 +1,95 @@
1
+ import {
2
+ type ConfigStore,
3
+ createConfigStore,
4
+ getCurrencyStore,
5
+ } from "@rune-lab/kernel";
6
+ import type { Currency } from "@rune-lab/kernel";
7
+ import { type DineroCurrency, registerCurrency } from "@rune-lab/money";
8
+ import type { ExchangeRateStore } from "./exchange-rate.svelte.ts";
9
+
10
+ export type { Currency };
11
+
12
+ /**
13
+ * Helper to build a minimal Dinero definition from Currency metadata.
14
+ * Assumes base 10 (standard decimal) for auto-registration.
15
+ */
16
+ function buildDineroDef(meta: Currency) {
17
+ return {
18
+ code: meta.code,
19
+ base: 10,
20
+ exponent: meta.decimals,
21
+ };
22
+ }
23
+
24
+ const CURRENCIES: Currency[] = [
25
+ { code: "USD", symbol: "$", decimals: 2 },
26
+ { code: "EUR", symbol: "€", decimals: 2 },
27
+ { code: "GBP", symbol: "£", decimals: 2 },
28
+ { code: "MXN", symbol: "$", decimals: 2 },
29
+ { code: "CAD", symbol: "C$", decimals: 2 },
30
+ { code: "BRL", symbol: "R$", decimals: 2 },
31
+ { code: "INR", symbol: "₹", decimals: 2 },
32
+ { code: "CNY", symbol: "¥", decimals: 2 },
33
+ { code: "JPY", symbol: "¥", decimals: 0 },
34
+ { code: "KRW", symbol: "₩", decimals: 0 },
35
+ { code: "AED", symbol: "د.إ", decimals: 2 },
36
+ ] as const;
37
+
38
+ const baseStore: ConfigStore<Currency> = createConfigStore<Currency>({
39
+ items: CURRENCIES,
40
+ storageKey: "currency",
41
+ displayName: "Currency",
42
+ idKey: "code",
43
+ icon: "💰",
44
+ });
45
+
46
+ // We hold a reference to exchangeRateStore if configured later
47
+ let _exchangeRateStore: ExchangeRateStore | undefined;
48
+ export function setExchangeRateStore(store: ExchangeRateStore) {
49
+ _exchangeRateStore = store;
50
+ }
51
+
52
+ /**
53
+ * Extension: Atomic currency registration.
54
+ * Updates both the Dinero registry (core) and the reactive store (UI).
55
+ *
56
+ * @remarks Custom currencies with non-decimal base systems must use
57
+ * registerCurrency() from @rune-lab/kernel explicitly before addItems().
58
+ */
59
+ function addCurrency(meta: Currency, dineroDef?: unknown) {
60
+ const def = dineroDef || buildDineroDef(meta);
61
+ registerCurrency(meta.code, def as DineroCurrency<number>);
62
+ baseStore.addItems([meta]);
63
+ }
64
+
65
+ /**
66
+ * Converts an amount from one currency to another.
67
+ * Defaults to converting to the current store currency.
68
+ */
69
+ function convertAmount(
70
+ amount: number,
71
+ fromCode: string,
72
+ toCode?: string,
73
+ ): number {
74
+ const target = toCode ?? String((baseStore as ConfigStore<Currency>).current);
75
+ if (fromCode === target) return amount;
76
+ if (!_exchangeRateStore || !_exchangeRateStore.hasRates) return amount;
77
+
78
+ return _exchangeRateStore.convertAmount(amount, fromCode, target);
79
+ }
80
+
81
+ export const currencyStore: ConfigStore<Currency> & {
82
+ addCurrency: typeof addCurrency;
83
+ convertAmount: typeof convertAmount;
84
+ readonly canConvert: boolean;
85
+ } = Object.assign(baseStore, {
86
+ addCurrency,
87
+ convertAmount,
88
+ get canConvert() {
89
+ return !!_exchangeRateStore?.hasRates;
90
+ },
91
+ });
92
+
93
+ export type CurrencyStore = typeof currencyStore;
94
+
95
+ export { getCurrencyStore };
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from "vite-plus/test";
2
+ import { currencyStore } from "./currency.svelte.ts";
3
+
4
+ describe("Currency Store", () => {
5
+ it("should have prototype methods from ConfigStore", () => {
6
+ // These come from the ConfigStore class prototype
7
+ expect(typeof currencyStore.get).toBe("function");
8
+ expect(typeof currencyStore.set).toBe("function");
9
+ expect(typeof currencyStore.getProp).toBe("function");
10
+ expect(typeof currencyStore.addItems).toBe("function");
11
+
12
+ // These are instance properties
13
+ expect(currencyStore.current).toBeDefined();
14
+ expect(Array.isArray(currencyStore.available)).toBe(true);
15
+
16
+ // This is the extension method
17
+ expect(typeof currencyStore.addCurrency).toBe("function");
18
+ });
19
+
20
+ it("should correctly use prototype methods", () => {
21
+ const usd = currencyStore.get("USD" as never);
22
+
23
+ expect(usd).toBeDefined();
24
+ expect(usd?.code).toBe("USD");
25
+ expect(usd?.symbol).toBe("$");
26
+ });
27
+
28
+ it("should add a new currency and keep methods", () => {
29
+ currencyStore.addCurrency({ code: "BTC", symbol: "₿", decimals: 8 });
30
+
31
+ const btc = currencyStore.get("BTC" as never);
32
+ expect(btc).toBeDefined();
33
+ expect(btc?.code).toBe("BTC");
34
+ expect(btc?.decimals).toBe(8);
35
+
36
+ // Methods still exist after interaction
37
+ expect(typeof currencyStore.get).toBe("function");
38
+ expect(typeof currencyStore.set).toBe("function");
39
+ });
40
+ });