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
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { portal } from "../../actions/portal";
2
+ import { portal } from "@rune-lab/kernel";
3
3
  import { type Snippet } from "svelte";
4
4
 
5
5
  let {
@@ -1,7 +1,8 @@
1
1
  <!-- src/lib/features/layout/smart/ConnectedNavigationPanel.svelte -->
2
2
  <script lang="ts">
3
- import { getLayoutStore, type NavigationSection } from "rune-lab/state";
3
+ import { getLayoutStore, type NavigationSection } from "@rune-lab/kernel";
4
4
  import NavigationPanel from "./NavigationPanel.svelte";
5
+ import { createNavigationConnection } from "./connection-factory.ts";
5
6
  import type { Snippet } from "svelte";
6
7
 
7
8
  let { sections, header, footer } = $props<{
@@ -11,17 +12,15 @@
11
12
  }>();
12
13
 
13
14
  const layoutStore = getLayoutStore();
15
+ const connection = createNavigationConnection(layoutStore);
14
16
  </script>
15
17
 
16
18
  <NavigationPanel
17
19
  {sections}
18
20
  {header}
19
21
  {footer}
20
- activeId={layoutStore.activeNavItemId}
21
- collapsedIds={layoutStore.collapsedSections}
22
- onSelect={(item) => layoutStore.navigate(item.id!)}
23
- onToggle={(id, isOpen) =>
24
- isOpen
25
- ? layoutStore.expandSection(id)
26
- : layoutStore.collapseSection(id)}
22
+ activeId={connection.activeId}
23
+ collapsedIds={connection.collapsedIds}
24
+ onSelect={connection.onSelect}
25
+ onToggle={connection.onToggle}
27
26
  />
@@ -1,7 +1,8 @@
1
1
  <!-- src/lib/features/layout/smart/ConnectedWorkspaceStrip.svelte -->
2
2
  <script lang="ts">
3
- import { getLayoutStore, type WorkspaceItem } from "rune-lab/state";
3
+ import { getLayoutStore, type WorkspaceItem } from "@rune-lab/kernel";
4
4
  import WorkspaceStrip from "./WorkspaceStrip.svelte";
5
+ import { createWorkspaceConnection } from "./connection-factory.ts";
5
6
  import type { Snippet } from "svelte";
6
7
 
7
8
  let { items, globalActions } = $props<{
@@ -10,11 +11,12 @@
10
11
  }>();
11
12
 
12
13
  const layoutStore = getLayoutStore();
14
+ const connection = createWorkspaceConnection(layoutStore);
13
15
  </script>
14
16
 
15
17
  <WorkspaceStrip
16
18
  {items}
17
19
  {globalActions}
18
- activeId={layoutStore.activeWorkspaceId}
19
- onSelect={(id) => layoutStore.activateWorkspace(id)}
20
+ activeId={connection.activeId}
21
+ onSelect={connection.onSelect}
20
22
  />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ let { name, class: className = "" } = $props<{ name: string; class?: string }>();
3
+ </script>
4
+
5
+ <span class="material-symbols-outlined {className}">
6
+ {name}
7
+ </span>
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import ResourceSelector from "./ResourceSelector.svelte";
3
+ import { getLanguageStore } from "@rune-lab/kernel";
4
+ import { setLocale } from "@rune-lab/i18n/paraglide/runtime.js";
5
+
6
+ const languageStore = getLanguageStore();
7
+
8
+ let {
9
+ languages: allowedLocales = languageStore.available.map((l) =>
10
+ String(l.code),
11
+ ),
12
+ current = $bindable(String(languageStore.current)),
13
+ onchange,
14
+ }: {
15
+ languages?: string[];
16
+ current?: string;
17
+ onchange?: (value: string) => void;
18
+ } = $props();
19
+ </script>
20
+
21
+ <ResourceSelector
22
+ store={languageStore}
23
+ idKey="code"
24
+ filterKeys={[...allowedLocales]}
25
+ {onchange}
26
+ >
27
+ {#snippet triggerLabel(active)}
28
+ <span class="text-lg">{active.flag}</span>
29
+ {/snippet}
30
+
31
+ {#snippet item(l)}
32
+ <button
33
+ class="flex items-center gap-3 w-full"
34
+ onclick={() => {
35
+ languageStore.set(l.code);
36
+ setLocale(l.code as any);
37
+ current = l.code;
38
+ onchange?.(l.code);
39
+ }}
40
+ >
41
+ <span class="text-lg">{l.flag}</span>
42
+ <span>{l.code.toUpperCase()}</span>
43
+ </button>
44
+ {/snippet}
45
+ </ResourceSelector>
@@ -1,10 +1,7 @@
1
1
  <!-- src/lib/layout/NavigationPanel.svelte -->
2
2
  <script lang="ts">
3
3
  import type { Snippet } from "svelte";
4
- import type {
5
- NavigationItem,
6
- NavigationSection,
7
- } from "rune-lab/state";
4
+ import type { NavigationItem, NavigationSection } from "@rune-lab/kernel";
8
5
 
9
6
  let {
10
7
  header,
@@ -0,0 +1,90 @@
1
+ <script lang="ts">
2
+ import AppSettingSelector from "./AppSettingSelector.svelte";
3
+ import type { ConfigStore } from "@rune-lab/kernel";
4
+ import * as rlMessages from "@rune-lab/i18n/paraglide/messages.js";
5
+ import { getContext, type Snippet } from "svelte";
6
+
7
+ /**
8
+ * ResourceSelector — Generic configuration picker.
9
+ * Wraps AppSettingSelector with automatic label resolution and store binding.
10
+ *
11
+ * @example
12
+ * ```svelte
13
+ * <ResourceSelector store={themeStore} idKey="name">
14
+ * {#snippet triggerLabel(item)}<span>{item.icon}</span>{/snippet}
15
+ * {#snippet item(t)}<button onclick={() => store.set(t.name)}>{t.name}</button>{/snippet}
16
+ * </ResourceSelector>
17
+ * ```
18
+ */
19
+ let {
20
+ store,
21
+ idKey,
22
+ filterKeys = [],
23
+ triggerLabel,
24
+ item,
25
+ onchange,
26
+ direction = "bottom",
27
+ responsive = true,
28
+ }: {
29
+ /** ConfigStore instance to bind to */
30
+ store: ConfigStore<any>;
31
+ /** Key to use as identifier (e.g., "name", "code") */
32
+ idKey: string;
33
+ /** Optional subset of IDs to show */
34
+ filterKeys?: string[];
35
+ /** Snippet to render the trigger button content */
36
+ triggerLabel: Snippet<[any]>;
37
+ /** Snippet to render each option in the dropdown */
38
+ item: Snippet<[any]>;
39
+ /** Callback when selection changes */
40
+ onchange?: (value: string) => void;
41
+ /** Dropdown direction */
42
+ direction?: "top" | "bottom" | "left" | "right" | "end" | "auto";
43
+ /** Whether to show responsive mobile modal */
44
+ responsive?: boolean;
45
+ } = $props();
46
+
47
+ const userDictionary =
48
+ getContext<Record<string, any>>("rl:dictionary") ?? {};
49
+
50
+ /**
51
+ * Resolve a label for an item through the message chain:
52
+ * 1. User-provided dictionary
53
+ * 2. Paraglide messages
54
+ * 3. Raw key fallback
55
+ */
56
+ export function resolveLabel(item: any): string {
57
+ const key = String(item[idKey]);
58
+ if (typeof userDictionary[key] === "function")
59
+ return userDictionary[key]();
60
+ if (typeof (rlMessages as any)[key] === "function")
61
+ return (rlMessages as any)[key]();
62
+ return key;
63
+ }
64
+
65
+ let active = $derived(store.get(store.current) ?? store.available[0]);
66
+
67
+ let available = $derived(
68
+ filterKeys.length > 0
69
+ ? store.available.filter((item: any) =>
70
+ filterKeys.includes(String(item[idKey])),
71
+ )
72
+ : store.available,
73
+ );
74
+ </script>
75
+
76
+ <AppSettingSelector
77
+ value={active}
78
+ options={available}
79
+ tooltip={resolveLabel(active)}
80
+ {direction}
81
+ {responsive}
82
+ >
83
+ {#snippet triggerLabel(value)}
84
+ {@render triggerLabel(value)}
85
+ {/snippet}
86
+
87
+ {#snippet item(option)}
88
+ {@render item(option)}
89
+ {/snippet}
90
+ </AppSettingSelector>
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import ResourceSelector from "./ResourceSelector.svelte";
3
+ import { getThemeStore, type Theme } from "@rune-lab/kernel";
4
+
5
+ const themeStore = getThemeStore();
6
+
7
+ let {
8
+ themes = [],
9
+ current = $bindable(String(themeStore.current)),
10
+ onchange,
11
+ }: {
12
+ themes?: string[];
13
+ current?: string;
14
+ onchange?: (value: string) => void;
15
+ } = $props();
16
+ </script>
17
+
18
+ <ResourceSelector
19
+ store={themeStore}
20
+ idKey="name"
21
+ filterKeys={themes}
22
+ {onchange}
23
+ >
24
+ {#snippet triggerLabel(active)}
25
+ <span class="text-lg">{active.icon}</span>
26
+ {/snippet}
27
+
28
+ {#snippet item(t)}
29
+ <button
30
+ class="flex items-center gap-3 w-full"
31
+ onclick={() => {
32
+ themeStore.set(t.name);
33
+ current = t.name;
34
+ onchange?.(t.name);
35
+ }}
36
+ >
37
+ <input
38
+ type="radio"
39
+ name="theme-{t.name}"
40
+ class="theme-controller radio radio-xs"
41
+ value={t.name}
42
+ bind:group={themeStore.current}
43
+ />
44
+ <span class="text-lg">{t.icon}</span>
45
+ <span class="capitalize">
46
+ {t.name}
47
+ </span>
48
+ </button>
49
+ {/snippet}
50
+ </ResourceSelector>
@@ -1,6 +1,7 @@
1
1
  <!-- src/lib/layout/WorkspaceLayout.svelte -->
2
2
  <script module lang="ts">
3
3
  import type { Snippet } from "svelte";
4
+ import type { LayoutConfig } from "./types.ts";
4
5
 
5
6
  export interface WorkspaceLayoutProps {
6
7
  /** Content for the far-left vertical strip */
@@ -13,6 +14,13 @@
13
14
  detailPanel?: Snippet;
14
15
  namespace?: string;
15
16
 
17
+ /**
18
+ * Declarative layout configuration.
19
+ * When provided, zones can be rendered from config entries.
20
+ * Snippet props take priority when both are provided.
21
+ */
22
+ config?: LayoutConfig;
23
+
16
24
  /** Width of the left workspace strip */
17
25
  stripWidth?: string;
18
26
  /** Width of the navigation tree panel */
@@ -30,11 +38,13 @@
30
38
  <script lang="ts">
31
39
  import {
32
40
  getLayoutStore,
33
- getShortcutStore,
34
41
  getLanguageStore,
42
+ } from "./mod.ts";
43
+ import { LAYOUT_SHORTCUTS } from "./types.ts";
44
+ import {
45
+ getShortcutStore,
35
46
  shortcutListener,
36
- LAYOUT_SHORTCUTS,
37
- } from "rune-lab/state";
47
+ } from "@rune-lab/palettes";
38
48
  import { onMount } from "svelte";
39
49
 
40
50
  /**
@@ -1,7 +1,7 @@
1
1
  <!-- src/lib/layout/WorkspaceStrip.svelte -->
2
2
  <script lang="ts">
3
3
  import type { Snippet } from "svelte";
4
- import type { WorkspaceItem } from "rune-lab/state";
4
+ import type { WorkspaceItem } from "@rune-lab/kernel";
5
5
 
6
6
  let {
7
7
  items = [],
@@ -0,0 +1,95 @@
1
+ // sdk/ui/src/lib/layout/connection-factory.ts
2
+ // Connection functions that generate reactive prop bindings from LayoutStore.
3
+ // Svelte 5 doesn't support React-style HOCs — this is the idiomatic alternative.
4
+
5
+ import type { LayoutStore } from "./store.svelte.ts";
6
+
7
+ /**
8
+ * Reactive prop binding for the NavigationPanel component.
9
+ */
10
+ export interface NavigationConnection {
11
+ /** Currently active navigation item ID */
12
+ readonly activeId: string | null;
13
+ /** Set of collapsed section IDs */
14
+ readonly collapsedIds: Set<string>;
15
+ /** Handler for when a navigation item is selected */
16
+ onSelect: (item: { id?: string }) => void;
17
+ /** Handler for when a section is toggled */
18
+ onToggle: (id: string, isOpen: boolean) => void;
19
+ }
20
+
21
+ /**
22
+ * Reactive prop binding for the WorkspaceStrip component.
23
+ */
24
+ export interface WorkspaceConnection {
25
+ /** Currently active workspace ID */
26
+ readonly activeId: string | null;
27
+ /** Handler for when a workspace is selected */
28
+ onSelect: (id: string) => void;
29
+ }
30
+
31
+ /**
32
+ * Creates reactive prop bindings for connecting NavigationPanel to LayoutStore.
33
+ * Returns an object with getter properties that track LayoutStore state.
34
+ *
35
+ * @param layoutStore - The LayoutStore instance from context
36
+ * @returns Prop bindings compatible with NavigationPanel
37
+ *
38
+ * @example
39
+ * ```svelte
40
+ * <script>
41
+ * const layoutStore = getLayoutStore();
42
+ * const nav = createNavigationConnection(layoutStore);
43
+ * </script>
44
+ * <NavigationPanel {sections} activeId={nav.activeId} collapsedIds={nav.collapsedIds}
45
+ * onSelect={nav.onSelect} onToggle={nav.onToggle} />
46
+ * ```
47
+ */
48
+ export function createNavigationConnection(
49
+ layoutStore: Pick<
50
+ LayoutStore,
51
+ | "activeNavItemId"
52
+ | "collapsedSections"
53
+ | "navigate"
54
+ | "expandSection"
55
+ | "collapseSection"
56
+ >,
57
+ ): NavigationConnection {
58
+ return {
59
+ get activeId() {
60
+ return layoutStore.activeNavItemId;
61
+ },
62
+ get collapsedIds() {
63
+ return layoutStore.collapsedSections;
64
+ },
65
+ onSelect(item: { id?: string }) {
66
+ if (item.id) layoutStore.navigate(item.id);
67
+ },
68
+ onToggle(id: string, isOpen: boolean) {
69
+ if (isOpen) {
70
+ layoutStore.expandSection(id);
71
+ } else {
72
+ layoutStore.collapseSection(id);
73
+ }
74
+ },
75
+ };
76
+ }
77
+
78
+ /**
79
+ * Creates reactive prop bindings for connecting WorkspaceStrip to LayoutStore.
80
+ *
81
+ * @param layoutStore - The LayoutStore instance from context
82
+ * @returns Prop bindings compatible with WorkspaceStrip
83
+ */
84
+ export function createWorkspaceConnection(
85
+ layoutStore: Pick<LayoutStore, "activeWorkspaceId" | "activateWorkspace">,
86
+ ): WorkspaceConnection {
87
+ return {
88
+ get activeId() {
89
+ return layoutStore.activeWorkspaceId;
90
+ },
91
+ onSelect(id: string) {
92
+ layoutStore.activateWorkspace(id);
93
+ },
94
+ };
95
+ }
@@ -0,0 +1,44 @@
1
+ // sdk/state/src/language.svelte.ts
2
+
3
+ import {
4
+ type ConfigStore,
5
+ createConfigStore,
6
+ getLanguageStore,
7
+ } from "@rune-lab/kernel";
8
+ import type { Language } from "@rune-lab/kernel";
9
+
10
+ export type { Language };
11
+
12
+ export const LANGUAGES = [
13
+ // --- INDOEUROPEAS (Rama Romance / Latín) ---
14
+ { code: "es", flag: "🇲🇽" },
15
+ { code: "fr", flag: "🇫🇷" },
16
+ { code: "it", flag: "🇮🇹" },
17
+ { code: "pt", flag: "🇧🇷" },
18
+ // --- INDOEUROPEAS (Rama Germánica) ---
19
+ { code: "en", flag: "🇺🇸" },
20
+ { code: "de", flag: "🇩🇪" },
21
+ // --- INDOEUROPEAS (Otras Ramas) ---
22
+ { code: "ru", flag: "🇷🇺" },
23
+ { code: "hi", flag: "🇮🇳" },
24
+ // --- AFROASIÁTICAS ---
25
+ { code: "ar", flag: "🇸🇦" },
26
+ // --- FAMILIAS ASIÁTICAS INDEPENDIENTES ---
27
+ { code: "zh", flag: "🇨🇳" },
28
+ { code: "ja", flag: "🇯🇵" },
29
+ { code: "ko", flag: "🇰🇷" },
30
+ { code: "vi", flag: "🇻🇳" },
31
+ ] as const;
32
+
33
+ export const languageStore: ConfigStore<Language> = createConfigStore<Language>(
34
+ {
35
+ items: LANGUAGES,
36
+ storageKey: "language",
37
+ displayName: "Language",
38
+ idKey: "code",
39
+ icon: "🌍",
40
+ },
41
+ );
42
+
43
+ export type LanguageStore = ReturnType<typeof createConfigStore<Language>>;
44
+ export { getLanguageStore };
@@ -0,0 +1,71 @@
1
+ import { defineRune, RUNE_LAB_CONTEXT } from "@rune-lab/kernel";
2
+ import type { PersistenceDriver, RunePlugin } from "@rune-lab/kernel";
3
+ import { createLayoutStore } from "./store.svelte.ts";
4
+ import { type Theme, themeStore } from "./theme.svelte.ts";
5
+ import { languageStore } from "./language.svelte.ts";
6
+
7
+ export * from "./store.svelte.ts";
8
+ export * from "./types.ts";
9
+ export { default as WorkspaceLayout } from "./WorkspaceLayout.svelte";
10
+ export * from "./language.svelte.ts";
11
+ export * from "./theme.svelte.ts";
12
+ export * from "./APP_CONFIGURATIONS.ts";
13
+ export * from "./connection-factory.ts";
14
+ export { default as LanguageSelector } from "./LanguageSelector.svelte";
15
+ export { default as ThemeSelector } from "./ThemeSelector.svelte";
16
+ export { default as ResourceSelector } from "./ResourceSelector.svelte";
17
+ export { default as AppSettingSelector } from "./AppSettingSelector.svelte";
18
+ export { default as NavigationPanel } from "./NavigationPanel.svelte";
19
+ export { default as WorkspaceStrip } from "./WorkspaceStrip.svelte";
20
+ export { default as ContentArea } from "./ContentArea.svelte";
21
+ export { default as DetailPanel } from "./DetailPanel.svelte";
22
+ export { default as Icon } from "./Icon.svelte";
23
+
24
+ /**
25
+ * Layout Plugin — manages the primary workspace layout, theme, and language.
26
+ * Always included by default in RuneProvider.
27
+ */
28
+ export const LayoutPlugin: RunePlugin = defineRune({
29
+ id: "rune-lab.layout",
30
+ stores: [
31
+ {
32
+ id: "layout",
33
+ contextKey: RUNE_LAB_CONTEXT.layout,
34
+ factory: (_config: unknown, driver: PersistenceDriver) =>
35
+ createLayoutStore(driver),
36
+ },
37
+ {
38
+ id: "theme",
39
+ contextKey: RUNE_LAB_CONTEXT.theme,
40
+ factory: (config: unknown, _driver: PersistenceDriver) => {
41
+ const c = config as Record<string, unknown>;
42
+ if (c.customThemes) {
43
+ themeStore.addItems(c.customThemes as Theme[]);
44
+ }
45
+ if (
46
+ c.defaultTheme &&
47
+ !(themeStore as unknown as { current: unknown }).current
48
+ ) {
49
+ if (themeStore.get(c.defaultTheme as never)) {
50
+ themeStore.set(c.defaultTheme as never);
51
+ }
52
+ }
53
+ return themeStore;
54
+ },
55
+ },
56
+ {
57
+ id: "language",
58
+ contextKey: RUNE_LAB_CONTEXT.language,
59
+ factory: (config: unknown, _driver: PersistenceDriver) => {
60
+ const c = config as Record<string, unknown>;
61
+ if (c.locales) {
62
+ const localesToKeep = c.locales as string[];
63
+ languageStore.available = languageStore.available.filter(
64
+ (l) => localesToKeep.includes(l.code),
65
+ );
66
+ }
67
+ return languageStore;
68
+ },
69
+ },
70
+ ],
71
+ });
@@ -0,0 +1,142 @@
1
+ // src/lib/state/layout.svelte.ts
2
+ import { getLayoutStore } from "@rune-lab/kernel";
3
+ import type {
4
+ NavigationItem,
5
+ NavigationSection,
6
+ PersistenceDriver,
7
+ WorkspaceItem,
8
+ } from "@rune-lab/kernel";
9
+ import { resolveDriver } from "@rune-lab/kernel";
10
+
11
+ export type { NavigationItem, NavigationSection, WorkspaceItem };
12
+
13
+ export class LayoutStore {
14
+ workspaces: WorkspaceItem[] = $state<WorkspaceItem[]>([]);
15
+ activeWorkspaceId: string | null = $state<string | null>(null);
16
+ activeNavItemId: string | null = $state<string | null>(null);
17
+ navOpen: boolean = $state(true);
18
+ detailOpen: boolean = $state(false);
19
+ collapsedSections: Set<string> = $state<Set<string>>(new Set());
20
+
21
+ #storageNamespace = "default";
22
+ #initialized = false;
23
+ #driver: PersistenceDriver | undefined;
24
+
25
+ constructor(
26
+ driver?: PersistenceDriver | (() => PersistenceDriver | undefined),
27
+ ) {
28
+ // Use resolveDriver but allow undefined result for SSR/no-driver scenarios
29
+ this.#driver = driver ? resolveDriver(driver) : undefined;
30
+ }
31
+
32
+ init(options?: { namespace?: string; driver?: PersistenceDriver }) {
33
+ if (this.#initialized) return;
34
+ if (options?.namespace) this.#storageNamespace = options.namespace;
35
+ if (options?.driver) this.#driver = options.driver;
36
+
37
+ // If no driver was injected and no window (SSR), we just do nothing
38
+ if (!this.#driver && typeof window !== "undefined") {
39
+ this.#driver = {
40
+ get: (key: string) => localStorage.getItem(key),
41
+ set: (key: string, val: string) => localStorage.setItem(key, val),
42
+ remove: (key: string) => localStorage.removeItem(key),
43
+ };
44
+ }
45
+
46
+ if (this.#driver) {
47
+ const savedWorkspace = this.#driver.get(
48
+ `rl:layout:${this.#storageNamespace}:workspace`,
49
+ );
50
+ if (savedWorkspace) this.activeWorkspaceId = savedWorkspace;
51
+
52
+ const savedSections = this.#driver.get(
53
+ `rl:layout:${this.#storageNamespace}:sections`,
54
+ );
55
+ if (savedSections) {
56
+ try {
57
+ this.collapsedSections = new Set(JSON.parse(savedSections));
58
+ } catch (e) {
59
+ console.error("Failed to parse collapsed sections", e);
60
+ }
61
+ }
62
+ }
63
+
64
+ this.#initialized = true;
65
+
66
+ // Set up persistence effects
67
+ if (this.#driver) {
68
+ $effect.root(() => {
69
+ $effect(() => {
70
+ if (this.activeWorkspaceId) {
71
+ this.#driver?.set(
72
+ `rl:layout:${this.#storageNamespace}:workspace`,
73
+ this.activeWorkspaceId,
74
+ );
75
+ }
76
+ });
77
+
78
+ $effect(() => {
79
+ this.#driver?.set(
80
+ `rl:layout:${this.#storageNamespace}:sections`,
81
+ JSON.stringify([...this.collapsedSections]),
82
+ );
83
+ });
84
+ });
85
+ }
86
+ }
87
+
88
+ setWorkspaces(items: WorkspaceItem[]) {
89
+ this.workspaces = items;
90
+ if (items.length > 0 && !this.activeWorkspaceId) {
91
+ this.activeWorkspaceId = items[0].id;
92
+ }
93
+ }
94
+
95
+ activateWorkspace(id: string) {
96
+ this.activeWorkspaceId = id;
97
+ }
98
+
99
+ activateWorkspaceByIndex(index: number) {
100
+ const ws = this.workspaces[index];
101
+ if (ws) {
102
+ this.activateWorkspace(ws.id);
103
+ ws.onClick?.();
104
+ }
105
+ }
106
+
107
+ navigate(id: string) {
108
+ this.activeNavItemId = id;
109
+ }
110
+
111
+ toggleNav() {
112
+ this.navOpen = !this.navOpen;
113
+ }
114
+
115
+ toggleDetail() {
116
+ this.detailOpen = !this.detailOpen;
117
+ }
118
+
119
+ toggleSection(id: string) {
120
+ if (this.collapsedSections.has(id)) {
121
+ this.collapsedSections.delete(id);
122
+ } else {
123
+ this.collapsedSections.add(id);
124
+ }
125
+ }
126
+
127
+ collapseSection(id: string) {
128
+ this.collapsedSections.add(id);
129
+ }
130
+
131
+ expandSection(id: string) {
132
+ this.collapsedSections.delete(id);
133
+ }
134
+ }
135
+
136
+ export function createLayoutStore(
137
+ driver?: PersistenceDriver | (() => PersistenceDriver | undefined),
138
+ ): LayoutStore {
139
+ return new LayoutStore(driver);
140
+ }
141
+
142
+ export { getLayoutStore };