rune-lab 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/.gitignore +12 -0
  2. package/README.md +4 -4
  3. package/deno.json +50 -0
  4. package/justfile +5 -0
  5. package/package.json +3 -80
  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/src/kernel/src/persistence/provider.ts +58 -0
  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 +7 -8
  52. package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +5 -3
  53. package/src/runes/layout/src/Icon.svelte +7 -0
  54. package/src/runes/layout/src/LanguageSelector.svelte +45 -0
  55. package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
  56. package/src/runes/layout/src/ResourceSelector.svelte +90 -0
  57. package/src/runes/layout/src/ThemeSelector.svelte +50 -0
  58. package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +13 -3
  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/src/runes/plugins/money/src/CurrencySelector.svelte +41 -0
  82. package/src/runes/plugins/money/src/MoneyDisplay.svelte +142 -0
  83. package/src/runes/plugins/money/src/MoneyInput.svelte +208 -0
  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/src/runes/plugins/money/src/strategies.ts +95 -0
  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/index.d.ts +0 -4
  101. package/dist/core/index.d.ts.map +0 -1
  102. package/dist/core/index.js +0 -3
  103. package/dist/core/internal/message-resolver.d.ts +0 -42
  104. package/dist/core/internal/message-resolver.d.ts.map +0 -1
  105. package/dist/core/internal/message-resolver.js +0 -47
  106. package/dist/core/money/index.d.ts +0 -2
  107. package/dist/core/money/index.d.ts.map +0 -1
  108. package/dist/core/money/index.js +0 -2
  109. package/dist/core/money/money.d.ts +0 -57
  110. package/dist/core/money/money.d.ts.map +0 -1
  111. package/dist/core/money/money.js +0 -132
  112. package/dist/core/persistence/types.d.ts +0 -18
  113. package/dist/core/persistence/types.d.ts.map +0 -1
  114. package/dist/core/persistence/types.js +0 -2
  115. package/dist/index.d.ts +0 -5
  116. package/dist/index.js +0 -5
  117. package/dist/state/api.svelte.d.ts +0 -26
  118. package/dist/state/api.svelte.js +0 -65
  119. package/dist/state/app.svelte.d.ts +0 -48
  120. package/dist/state/app.svelte.js +0 -82
  121. package/dist/state/auth/index.d.ts +0 -2
  122. package/dist/state/auth/index.js +0 -2
  123. package/dist/state/auth/session.svelte.d.ts +0 -40
  124. package/dist/state/auth/session.svelte.js +0 -57
  125. package/dist/state/auth/types.d.ts +0 -30
  126. package/dist/state/auth/types.js +0 -3
  127. package/dist/state/cart.svelte.d.ts +0 -64
  128. package/dist/state/cart.svelte.js +0 -122
  129. package/dist/state/commands.svelte.d.ts +0 -46
  130. package/dist/state/commands.svelte.js +0 -62
  131. package/dist/state/composables/useMoney.d.ts +0 -15
  132. package/dist/state/composables/useMoney.js +0 -62
  133. package/dist/state/composables/usePersistence.d.ts +0 -2
  134. package/dist/state/composables/usePersistence.js +0 -5
  135. package/dist/state/composables/useRuneLab.d.ts +0 -19
  136. package/dist/state/composables/useRuneLab.js +0 -30
  137. package/dist/state/context.d.ts +0 -14
  138. package/dist/state/context.js +0 -15
  139. package/dist/state/createConfigStore.svelte.d.ts +0 -55
  140. package/dist/state/createConfigStore.svelte.js +0 -61
  141. package/dist/state/currency.svelte.d.ts +0 -28
  142. package/dist/state/currency.svelte.js +0 -80
  143. package/dist/state/daisyui.d.ts +0 -4
  144. package/dist/state/index.d.ts +0 -19
  145. package/dist/state/index.js +0 -25
  146. package/dist/state/language.svelte.d.ts +0 -64
  147. package/dist/state/language.svelte.js +0 -44
  148. package/dist/state/layout.svelte.d.ts +0 -49
  149. package/dist/state/layout.svelte.js +0 -108
  150. package/dist/state/persistence/drivers.d.ts +0 -12
  151. package/dist/state/persistence/drivers.js +0 -73
  152. package/dist/state/shortcuts.svelte.d.ts +0 -121
  153. package/dist/state/shortcuts.svelte.js +0 -222
  154. package/dist/state/theme.svelte.d.ts +0 -22
  155. package/dist/state/theme.svelte.js +0 -92
  156. package/dist/state/toast-bridge.d.ts +0 -29
  157. package/dist/state/toast-bridge.js +0 -43
  158. package/dist/state/toast.svelte.d.ts +0 -27
  159. package/dist/state/toast.svelte.js +0 -43
  160. package/dist/ui/actions/portal.d.ts +0 -7
  161. package/dist/ui/actions/portal.js +0 -32
  162. package/dist/ui/components/ApiMonitor.svelte +0 -162
  163. package/dist/ui/components/ApiMonitor.svelte.d.ts +0 -3
  164. package/dist/ui/components/Icon.svelte +0 -108
  165. package/dist/ui/components/Icon.svelte.d.ts +0 -14
  166. package/dist/ui/components/Kyntharil.svelte +0 -48
  167. package/dist/ui/components/Kyntharil.svelte.d.ts +0 -6
  168. package/dist/ui/components/RuneProvider.svelte +0 -198
  169. package/dist/ui/components/RuneProvider.svelte.d.ts +0 -42
  170. package/dist/ui/components/Toaster.svelte.d.ts +0 -18
  171. package/dist/ui/components/money/MoneyDisplay.svelte +0 -69
  172. package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -21
  173. package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
  174. package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -74
  175. package/dist/ui/components/money/MoneyInput.svelte +0 -131
  176. package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -25
  177. package/dist/ui/components/money/index.d.ts +0 -2
  178. package/dist/ui/components/money/index.js +0 -3
  179. package/dist/ui/components/user/UserAvatar.svelte +0 -66
  180. package/dist/ui/components/user/UserAvatar.svelte.d.ts +0 -13
  181. package/dist/ui/components/user/UserProfile.svelte +0 -79
  182. package/dist/ui/components/user/UserProfile.svelte.d.ts +0 -17
  183. package/dist/ui/components/user/index.d.ts +0 -2
  184. package/dist/ui/components/user/index.js +0 -3
  185. package/dist/ui/features/command-palette/CommandPalette.svelte.d.ts +0 -6
  186. package/dist/ui/features/config/AppSettingSelector.svelte.d.ts +0 -13
  187. package/dist/ui/features/config/CurrencySelector.svelte +0 -67
  188. package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
  189. package/dist/ui/features/config/LanguageSelector.svelte +0 -66
  190. package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
  191. package/dist/ui/features/config/ThemeSelector.svelte +0 -73
  192. package/dist/ui/features/config/ThemeSelector.svelte.d.ts +0 -8
  193. package/dist/ui/features/notifications/NotificationBell.svelte.d.ts +0 -11
  194. package/dist/ui/features/notifications/index.d.ts +0 -1
  195. package/dist/ui/features/notifications/index.js +0 -2
  196. package/dist/ui/features/shortcuts/ShortcutPalette.svelte.d.ts +0 -6
  197. package/dist/ui/index.d.ts +0 -26
  198. package/dist/ui/index.js +0 -41
  199. package/dist/ui/layout/ConnectedNavigationPanel.svelte.d.ts +0 -10
  200. package/dist/ui/layout/ConnectedWorkspaceStrip.svelte.d.ts +0 -9
  201. package/dist/ui/layout/ContentArea.svelte.d.ts +0 -8
  202. package/dist/ui/layout/DetailPanel.svelte.d.ts +0 -7
  203. package/dist/ui/layout/NavigationPanel.svelte.d.ts +0 -14
  204. package/dist/ui/layout/WorkspaceLayout.svelte.d.ts +0 -25
  205. package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
  206. package/dist/ui/layout/index.d.ts +0 -7
  207. package/dist/ui/layout/index.js +0 -7
  208. package/dist/ui/paraglide/README.md +0 -94
  209. package/dist/ui/paraglide/messages/_index.d.ts +0 -87
  210. package/dist/ui/paraglide/messages/_index.js +0 -88
  211. package/dist/ui/paraglide/messages/abyss.d.ts +0 -16
  212. package/dist/ui/paraglide/messages/abyss.js +0 -84
  213. package/dist/ui/paraglide/messages/acid.d.ts +0 -16
  214. package/dist/ui/paraglide/messages/acid.js +0 -84
  215. package/dist/ui/paraglide/messages/active_toasts.d.ts +0 -16
  216. package/dist/ui/paraglide/messages/active_toasts.js +0 -84
  217. package/dist/ui/paraglide/messages/aed3.d.ts +0 -17
  218. package/dist/ui/paraglide/messages/aed3.js +0 -85
  219. package/dist/ui/paraglide/messages/all_currencies.d.ts +0 -16
  220. package/dist/ui/paraglide/messages/all_currencies.js +0 -84
  221. package/dist/ui/paraglide/messages/all_languages.d.ts +0 -16
  222. package/dist/ui/paraglide/messages/all_languages.js +0 -84
  223. package/dist/ui/paraglide/messages/all_themes.d.ts +0 -16
  224. package/dist/ui/paraglide/messages/all_themes.js +0 -84
  225. package/dist/ui/paraglide/messages/api_status.d.ts +0 -16
  226. package/dist/ui/paraglide/messages/api_status.js +0 -84
  227. package/dist/ui/paraglide/messages/app_info.d.ts +0 -16
  228. package/dist/ui/paraglide/messages/app_info.js +0 -84
  229. package/dist/ui/paraglide/messages/appearance.d.ts +0 -16
  230. package/dist/ui/paraglide/messages/appearance.js +0 -84
  231. package/dist/ui/paraglide/messages/aqua.d.ts +0 -16
  232. package/dist/ui/paraglide/messages/aqua.js +0 -84
  233. package/dist/ui/paraglide/messages/ar.d.ts +0 -16
  234. package/dist/ui/paraglide/messages/ar.js +0 -84
  235. package/dist/ui/paraglide/messages/autumn.d.ts +0 -16
  236. package/dist/ui/paraglide/messages/autumn.js +0 -84
  237. package/dist/ui/paraglide/messages/black.d.ts +0 -16
  238. package/dist/ui/paraglide/messages/black.js +0 -84
  239. package/dist/ui/paraglide/messages/brl3.d.ts +0 -17
  240. package/dist/ui/paraglide/messages/brl3.js +0 -85
  241. package/dist/ui/paraglide/messages/bumblebee.d.ts +0 -16
  242. package/dist/ui/paraglide/messages/bumblebee.js +0 -84
  243. package/dist/ui/paraglide/messages/business.d.ts +0 -16
  244. package/dist/ui/paraglide/messages/business.js +0 -84
  245. package/dist/ui/paraglide/messages/cad3.d.ts +0 -17
  246. package/dist/ui/paraglide/messages/cad3.js +0 -85
  247. package/dist/ui/paraglide/messages/caramellatte.d.ts +0 -16
  248. package/dist/ui/paraglide/messages/caramellatte.js +0 -84
  249. package/dist/ui/paraglide/messages/cmyk.d.ts +0 -16
  250. package/dist/ui/paraglide/messages/cmyk.js +0 -84
  251. package/dist/ui/paraglide/messages/cny3.d.ts +0 -17
  252. package/dist/ui/paraglide/messages/cny3.js +0 -85
  253. package/dist/ui/paraglide/messages/coffee.d.ts +0 -16
  254. package/dist/ui/paraglide/messages/coffee.js +0 -84
  255. package/dist/ui/paraglide/messages/commands_label.d.ts +0 -16
  256. package/dist/ui/paraglide/messages/commands_label.js +0 -84
  257. package/dist/ui/paraglide/messages/corporate.d.ts +0 -16
  258. package/dist/ui/paraglide/messages/corporate.js +0 -84
  259. package/dist/ui/paraglide/messages/cupcake.d.ts +0 -16
  260. package/dist/ui/paraglide/messages/cupcake.js +0 -84
  261. package/dist/ui/paraglide/messages/currency.d.ts +0 -16
  262. package/dist/ui/paraglide/messages/currency.js +0 -84
  263. package/dist/ui/paraglide/messages/current_currency.d.ts +0 -16
  264. package/dist/ui/paraglide/messages/current_currency.js +0 -84
  265. package/dist/ui/paraglide/messages/current_language.d.ts +0 -16
  266. package/dist/ui/paraglide/messages/current_language.js +0 -84
  267. package/dist/ui/paraglide/messages/current_theme.d.ts +0 -16
  268. package/dist/ui/paraglide/messages/current_theme.js +0 -84
  269. package/dist/ui/paraglide/messages/currently_in_queue.d.ts +0 -16
  270. package/dist/ui/paraglide/messages/currently_in_queue.js +0 -84
  271. package/dist/ui/paraglide/messages/cyberpunk.d.ts +0 -16
  272. package/dist/ui/paraglide/messages/cyberpunk.js +0 -84
  273. package/dist/ui/paraglide/messages/dark.d.ts +0 -16
  274. package/dist/ui/paraglide/messages/dark.js +0 -84
  275. package/dist/ui/paraglide/messages/de.d.ts +0 -16
  276. package/dist/ui/paraglide/messages/de.js +0 -84
  277. package/dist/ui/paraglide/messages/dim.d.ts +0 -16
  278. package/dist/ui/paraglide/messages/dim.js +0 -84
  279. package/dist/ui/paraglide/messages/dracula.d.ts +0 -16
  280. package/dist/ui/paraglide/messages/dracula.js +0 -84
  281. package/dist/ui/paraglide/messages/emerald.d.ts +0 -16
  282. package/dist/ui/paraglide/messages/emerald.js +0 -84
  283. package/dist/ui/paraglide/messages/en.d.ts +0 -16
  284. package/dist/ui/paraglide/messages/en.js +0 -84
  285. package/dist/ui/paraglide/messages/es.d.ts +0 -16
  286. package/dist/ui/paraglide/messages/es.js +0 -84
  287. package/dist/ui/paraglide/messages/eur3.d.ts +0 -17
  288. package/dist/ui/paraglide/messages/eur3.js +0 -85
  289. package/dist/ui/paraglide/messages/extended_controls.d.ts +0 -16
  290. package/dist/ui/paraglide/messages/extended_controls.js +0 -84
  291. package/dist/ui/paraglide/messages/fantasy.d.ts +0 -16
  292. package/dist/ui/paraglide/messages/fantasy.js +0 -84
  293. package/dist/ui/paraglide/messages/forest.d.ts +0 -16
  294. package/dist/ui/paraglide/messages/forest.js +0 -84
  295. package/dist/ui/paraglide/messages/fr.d.ts +0 -16
  296. package/dist/ui/paraglide/messages/fr.js +0 -84
  297. package/dist/ui/paraglide/messages/garden.d.ts +0 -16
  298. package/dist/ui/paraglide/messages/garden.js +0 -84
  299. package/dist/ui/paraglide/messages/gbp3.d.ts +0 -17
  300. package/dist/ui/paraglide/messages/gbp3.js +0 -85
  301. package/dist/ui/paraglide/messages/halloween.d.ts +0 -16
  302. package/dist/ui/paraglide/messages/halloween.js +0 -84
  303. package/dist/ui/paraglide/messages/hello_world.d.ts +0 -18
  304. package/dist/ui/paraglide/messages/hello_world.js +0 -84
  305. package/dist/ui/paraglide/messages/hi.d.ts +0 -16
  306. package/dist/ui/paraglide/messages/hi.js +0 -84
  307. package/dist/ui/paraglide/messages/inr3.d.ts +0 -17
  308. package/dist/ui/paraglide/messages/inr3.js +0 -85
  309. package/dist/ui/paraglide/messages/it.d.ts +0 -16
  310. package/dist/ui/paraglide/messages/it.js +0 -84
  311. package/dist/ui/paraglide/messages/ja.d.ts +0 -16
  312. package/dist/ui/paraglide/messages/ja.js +0 -84
  313. package/dist/ui/paraglide/messages/jpy3.d.ts +0 -17
  314. package/dist/ui/paraglide/messages/jpy3.js +0 -85
  315. package/dist/ui/paraglide/messages/ko.d.ts +0 -16
  316. package/dist/ui/paraglide/messages/ko.js +0 -84
  317. package/dist/ui/paraglide/messages/krw3.d.ts +0 -17
  318. package/dist/ui/paraglide/messages/krw3.js +0 -85
  319. package/dist/ui/paraglide/messages/languages.d.ts +0 -16
  320. package/dist/ui/paraglide/messages/languages.js +0 -84
  321. package/dist/ui/paraglide/messages/lemonade.d.ts +0 -16
  322. package/dist/ui/paraglide/messages/lemonade.js +0 -84
  323. package/dist/ui/paraglide/messages/light.d.ts +0 -16
  324. package/dist/ui/paraglide/messages/light.js +0 -84
  325. package/dist/ui/paraglide/messages/live_store_dashboard.d.ts +0 -16
  326. package/dist/ui/paraglide/messages/live_store_dashboard.js +0 -84
  327. package/dist/ui/paraglide/messages/localization.d.ts +0 -16
  328. package/dist/ui/paraglide/messages/localization.js +0 -84
  329. package/dist/ui/paraglide/messages/lofi.d.ts +0 -16
  330. package/dist/ui/paraglide/messages/lofi.js +0 -84
  331. package/dist/ui/paraglide/messages/luxury.d.ts +0 -16
  332. package/dist/ui/paraglide/messages/luxury.js +0 -84
  333. package/dist/ui/paraglide/messages/mxn3.d.ts +0 -17
  334. package/dist/ui/paraglide/messages/mxn3.js +0 -85
  335. package/dist/ui/paraglide/messages/name_label.d.ts +0 -16
  336. package/dist/ui/paraglide/messages/name_label.js +0 -84
  337. package/dist/ui/paraglide/messages/night.d.ts +0 -16
  338. package/dist/ui/paraglide/messages/night.js +0 -84
  339. package/dist/ui/paraglide/messages/nord.d.ts +0 -16
  340. package/dist/ui/paraglide/messages/nord.js +0 -84
  341. package/dist/ui/paraglide/messages/pastel.d.ts +0 -16
  342. package/dist/ui/paraglide/messages/pastel.js +0 -84
  343. package/dist/ui/paraglide/messages/pt.d.ts +0 -16
  344. package/dist/ui/paraglide/messages/pt.js +0 -84
  345. package/dist/ui/paraglide/messages/real_time_monitor_desc.d.ts +0 -16
  346. package/dist/ui/paraglide/messages/real_time_monitor_desc.js +0 -84
  347. package/dist/ui/paraglide/messages/registered_in_registry.d.ts +0 -16
  348. package/dist/ui/paraglide/messages/registered_in_registry.js +0 -84
  349. package/dist/ui/paraglide/messages/retro.d.ts +0 -16
  350. package/dist/ui/paraglide/messages/retro.js +0 -84
  351. package/dist/ui/paraglide/messages/ru.d.ts +0 -16
  352. package/dist/ui/paraglide/messages/ru.js +0 -84
  353. package/dist/ui/paraglide/messages/silk.d.ts +0 -16
  354. package/dist/ui/paraglide/messages/silk.js +0 -84
  355. package/dist/ui/paraglide/messages/state_label.d.ts +0 -16
  356. package/dist/ui/paraglide/messages/state_label.js +0 -84
  357. package/dist/ui/paraglide/messages/sunset.d.ts +0 -16
  358. package/dist/ui/paraglide/messages/sunset.js +0 -84
  359. package/dist/ui/paraglide/messages/synthwave.d.ts +0 -16
  360. package/dist/ui/paraglide/messages/synthwave.js +0 -84
  361. package/dist/ui/paraglide/messages/system.d.ts +0 -16
  362. package/dist/ui/paraglide/messages/system.js +0 -84
  363. package/dist/ui/paraglide/messages/theme.d.ts +0 -16
  364. package/dist/ui/paraglide/messages/theme.js +0 -84
  365. package/dist/ui/paraglide/messages/themes.d.ts +0 -16
  366. package/dist/ui/paraglide/messages/themes.js +0 -84
  367. package/dist/ui/paraglide/messages/url_label.d.ts +0 -16
  368. package/dist/ui/paraglide/messages/url_label.js +0 -84
  369. package/dist/ui/paraglide/messages/usd3.d.ts +0 -17
  370. package/dist/ui/paraglide/messages/usd3.js +0 -85
  371. package/dist/ui/paraglide/messages/valentine.d.ts +0 -16
  372. package/dist/ui/paraglide/messages/valentine.js +0 -84
  373. package/dist/ui/paraglide/messages/version_label.d.ts +0 -16
  374. package/dist/ui/paraglide/messages/version_label.js +0 -84
  375. package/dist/ui/paraglide/messages/vi.d.ts +0 -16
  376. package/dist/ui/paraglide/messages/vi.js +0 -84
  377. package/dist/ui/paraglide/messages/winter.d.ts +0 -16
  378. package/dist/ui/paraglide/messages/winter.js +0 -84
  379. package/dist/ui/paraglide/messages/wireframe.d.ts +0 -16
  380. package/dist/ui/paraglide/messages/wireframe.js +0 -84
  381. package/dist/ui/paraglide/messages/zh.d.ts +0 -16
  382. package/dist/ui/paraglide/messages/zh.js +0 -84
  383. package/dist/ui/paraglide/messages.d.ts +0 -2
  384. package/dist/ui/paraglide/messages.js +0 -4
  385. package/dist/ui/paraglide/registry.d.ts +0 -21
  386. package/dist/ui/paraglide/registry.js +0 -31
  387. package/dist/ui/paraglide/runtime.d.ts +0 -749
  388. package/dist/ui/paraglide/runtime.js +0 -1777
  389. package/dist/ui/paraglide/server.d.ts +0 -103
  390. package/dist/ui/paraglide/server.js +0 -248
  391. package/dist/ui/primitives/DatePicker.svelte +0 -257
  392. package/dist/ui/primitives/DatePicker.svelte.d.ts +0 -17
  393. package/dist/ui/primitives/index.d.ts +0 -1
  394. package/dist/ui/primitives/index.js +0 -3
  395. /package/{dist/ui/layout → src/runes/layout/src}/ContentArea.svelte +0 -0
  396. /package/{dist/ui/layout → src/runes/layout/src}/DetailPanel.svelte +0 -0
  397. /package/{dist/ui/features → src/runes/palettes/src}/notifications/NotificationBell.svelte +0 -0
@@ -0,0 +1,73 @@
1
+ // @ts-nocheck: legacy daisyui imports and complex ConfigStore typing
2
+ // client/packages/ui/src/state/theme-config.svelte.ts
3
+
4
+ import { createConfigStore, getThemeStore } from "@rune-lab/kernel";
5
+ import type { Theme } from "@rune-lab/kernel";
6
+ import { BROWSER } from "esm-env";
7
+
8
+ export type { Theme };
9
+
10
+ // Icon map for known themes - unknown ones fall back to 🎨
11
+ const THEME_ICONS: Record<string, string> = {
12
+ light: "🌞",
13
+ dark: "🌙",
14
+ cupcake: "🧁",
15
+ bumblebee: "🐝",
16
+ emerald: "💚",
17
+ corporate: "🏢",
18
+ synthwave: "🌆",
19
+ retro: "📺",
20
+ cyberpunk: "🤖",
21
+ valentine: "💝",
22
+ halloween: "🎃",
23
+ garden: "🌷",
24
+ forest: "🌲",
25
+ aqua: "💧",
26
+ lofi: "🎵",
27
+ pastel: "🎨",
28
+ fantasy: "🔮",
29
+ wireframe: "📝",
30
+ black: "⚫",
31
+ luxury: "👑",
32
+ dracula: "🧛",
33
+ cmyk: "🖨️",
34
+ autumn: "🍂",
35
+ business: "💼",
36
+ acid: "🧪",
37
+ lemonade: "🍋",
38
+ night: "🌃",
39
+ coffee: "☕",
40
+ winter: "❄️",
41
+ dim: "🔅",
42
+ nord: "🧊",
43
+ sunset: "🌅",
44
+ caramellatte: "🍮",
45
+ abyss: "🌌",
46
+ silk: "🎀",
47
+ };
48
+
49
+ const THEMES: Theme[] = Object.keys(THEME_ICONS).map((name: string) => ({
50
+ name,
51
+ icon: THEME_ICONS[name] ?? "🎨",
52
+ }));
53
+
54
+ export const themeStore: ConfigStore<Theme> = createConfigStore<Theme>({
55
+ items: THEMES,
56
+ storageKey: "theme",
57
+ displayName: "Theme",
58
+ idKey: "name",
59
+ icon: "🎨",
60
+ });
61
+
62
+ // System preference detection — only if no persisted value was loaded
63
+ if (!themeStore.current && BROWSER) {
64
+ const prefersDark =
65
+ globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
66
+ const systemDefault = prefersDark ? "dark" : "light";
67
+ if (themeStore.get(systemDefault as never)) {
68
+ themeStore.set(systemDefault as never);
69
+ }
70
+ }
71
+
72
+ export type ThemeStore = ReturnType<typeof createConfigStore<Theme>>;
73
+ export { getThemeStore };
@@ -0,0 +1,11 @@
1
+ // sdk/core/src/layout/types.ts
2
+ // Framework-agnostic layout configuration types.
3
+ // No Svelte dependency — `component` is typed as `unknown` (resolved by sdk/ui).
4
+
5
+ export type { LayoutConfig, LayoutZone } from "@rune-lab/kernel";
6
+
7
+ /**
8
+ * Standard layout shortcuts
9
+ * Re-exported from kernel
10
+ */
11
+ export { LAYOUT_SHORTCUTS } from "@rune-lab/kernel";
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "@rune-lab/palettes",
3
+ "version": "0.1.0",
4
+ "exports": "./mod.ts",
5
+ "imports": {
6
+ "hotkeys-js": "npm:hotkeys-js"
7
+ }
8
+ }
@@ -1,9 +1,9 @@
1
1
  <!-- src/client/sdk/ui/src/features/config/CommandPalette.svelte -->
2
2
  <script lang="ts">
3
- import { onMount, tick } from "svelte";
4
- import { getCommandStore, type Command } from "rune-lab/state";
5
- import { getShortcutStore } from "rune-lab/state";
6
- import { Icon } from "rune-lab/ui";
3
+ import { tick } from "svelte";
4
+ import { getCommandStore, type Command } from "@rune-lab/kernel";
5
+ import { getShortcutStore } from "@rune-lab/kernel";
6
+ import { Icon } from "../../../layout/src/mod.ts";
7
7
 
8
8
  let { shortcutKey = "shift+k" } = $props<{ shortcutKey?: string }>();
9
9
 
@@ -0,0 +1,2 @@
1
+ export * from "./store.svelte.ts";
2
+ export { default as CommandPalette } from "./CommandPalette.svelte";
@@ -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 "rune-lab/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 "rune-lab/state";
4
+ import type { ShortcutEntry } from "@rune-lab/kernel";
5
5
  import {
6
6
  getAppStore,
7
7
  getShortcutStore,
8
8
  LAYOUT_SHORTCUTS,
9
- } from "rune-lab/state";
10
- import { Icon } from "rune-lab/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
+ }
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import { ResourceSelector } from "@rune-lab/layout";
3
+ import { getCurrencyStore } from "@rune-lab/kernel";
4
+
5
+ const currencyStore = getCurrencyStore();
6
+
7
+ let {
8
+ codes = [],
9
+ current = $bindable(String(currencyStore.current)),
10
+ onchange,
11
+ }: {
12
+ codes?: string[];
13
+ current?: string;
14
+ onchange?: (value: string) => void;
15
+ } = $props();
16
+ </script>
17
+
18
+ <ResourceSelector
19
+ store={currencyStore}
20
+ idKey="code"
21
+ filterKeys={codes}
22
+ {onchange}
23
+ >
24
+ {#snippet triggerLabel(active)}
25
+ <span class="font-bold">{active.symbol}</span>
26
+ {/snippet}
27
+
28
+ {#snippet item(c)}
29
+ <button
30
+ class="flex items-center gap-3 w-full"
31
+ onclick={() => {
32
+ currencyStore.set(c.code);
33
+ current = c.code;
34
+ onchange?.(c.code);
35
+ }}
36
+ >
37
+ <span class="badge badge-sm badge-ghost w-8">{c.symbol}</span>
38
+ <span>{c.code}</span>
39
+ </button>
40
+ {/snippet}
41
+ </ResourceSelector>