@cosmicdrift/kumiko-renderer 0.374.0 → 0.377.0

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 (455) hide show
  1. package/README.md +2 -2
  2. package/dist/app/action-form-support.d.ts +9 -2
  3. package/dist/app/action-form-support.js +24 -2
  4. package/dist/app/client-actions.d.ts +2 -2
  5. package/dist/app/column-renderers.js +1 -1
  6. package/dist/app/config-edit-shim.js +1 -1
  7. package/dist/app/content-preview.js +1 -6
  8. package/dist/app/custom-screens.js +1 -1
  9. package/dist/app/dashboard-body.d.ts +1 -1
  10. package/dist/app/entity-list-expanded-row.d.ts +1 -1
  11. package/dist/app/form-schema.d.ts +1 -1
  12. package/dist/app/form-schema.js +2 -2
  13. package/dist/app/kumiko-screen.d.ts +1 -1
  14. package/dist/app/kumiko-screen.js +7 -6
  15. package/dist/app/list-empty-content.d.ts +1 -1
  16. package/dist/app/list-facets.d.ts +1 -1
  17. package/dist/app/nav.js +2 -2
  18. package/dist/app/query-state-banners.d.ts +1 -1
  19. package/dist/app/reference-link.d.ts +1 -1
  20. package/dist/app/row-actions.d.ts +1 -1
  21. package/dist/app/secret-mint-body.d.ts +1 -1
  22. package/dist/app/secrets-edit-body.d.ts +1 -1
  23. package/dist/app/use-record-actions.d.ts +1 -1
  24. package/dist/app/write-failed-error.d.ts +1 -1
  25. package/dist/components/availability-options-select.d.ts +1 -1
  26. package/dist/components/embedded-list-field.d.ts +1 -1
  27. package/dist/components/embedded-list-field.js +1 -1
  28. package/dist/components/file-list-field.d.ts +1 -1
  29. package/dist/components/grid-cell-for-field.d.ts +1 -1
  30. package/dist/components/multi-select-checkboxes.d.ts +1 -1
  31. package/dist/components/multi-select-checkboxes.js +1 -1
  32. package/dist/components/query-options-select.d.ts +1 -1
  33. package/dist/components/related-list-section.d.ts +1 -1
  34. package/dist/components/render-edit-logic.d.ts +1 -1
  35. package/dist/components/render-edit-types.d.ts +2 -2
  36. package/dist/components/render-edit.d.ts +1 -1
  37. package/dist/components/render-edit.js +4 -2
  38. package/dist/components/render-field.d.ts +1 -1
  39. package/dist/components/render-field.js +4 -1
  40. package/dist/components/render-list.d.ts +1 -1
  41. package/dist/components/render-list.js +20 -4
  42. package/dist/components/write-form-section.d.ts +1 -1
  43. package/dist/components/write-form-section.js +1 -1
  44. package/dist/context/dispatcher-context.d.ts +1 -1
  45. package/dist/format-when.js +1 -1
  46. package/dist/headless/apex/css.d.ts +3 -0
  47. package/dist/headless/apex/css.js +298 -0
  48. package/dist/headless/apex/index.d.ts +236 -0
  49. package/dist/headless/apex/index.js +377 -0
  50. package/dist/headless/apex/lightbox.d.ts +4 -0
  51. package/dist/headless/apex/lightbox.js +81 -0
  52. package/dist/headless/contracts/asset.d.ts +15 -0
  53. package/dist/headless/contracts/asset.js +17 -0
  54. package/dist/headless/contracts/index.d.ts +3 -0
  55. package/dist/headless/contracts/index.js +1 -0
  56. package/dist/headless/contracts/locale.d.ts +7 -0
  57. package/dist/headless/contracts/locale.js +11 -0
  58. package/dist/headless/contracts/primitives.d.ts +93 -0
  59. package/dist/headless/contracts/primitives.js +21 -0
  60. package/dist/headless/dispatcher/index.d.ts +2 -0
  61. package/dist/headless/dispatcher/index.js +1 -0
  62. package/dist/headless/dispatcher/types.d.ts +86 -0
  63. package/dist/headless/dispatcher/types.js +34 -0
  64. package/dist/headless/form/form-controller.d.ts +2 -0
  65. package/dist/headless/form/form-controller.js +409 -0
  66. package/dist/headless/form/index.d.ts +3 -0
  67. package/dist/headless/form/index.js +2 -0
  68. package/dist/headless/form/types.d.ts +76 -0
  69. package/dist/headless/form/types.js +1 -0
  70. package/dist/headless/form/zod-bridge.d.ts +10 -0
  71. package/dist/headless/form/zod-bridge.js +103 -0
  72. package/dist/headless/format/document-values.d.ts +12 -0
  73. package/dist/headless/format/document-values.js +70 -0
  74. package/dist/headless/format/escape.d.ts +5 -0
  75. package/dist/headless/format/escape.js +75 -0
  76. package/dist/headless/format/html-template.d.ts +9 -0
  77. package/dist/headless/format/html-template.js +39 -0
  78. package/dist/headless/format/index.d.ts +12 -0
  79. package/dist/headless/format/index.js +237 -0
  80. package/dist/headless/format/money.d.ts +3 -0
  81. package/dist/headless/format/money.js +39 -0
  82. package/dist/headless/index.d.ts +14 -0
  83. package/dist/headless/index.js +9 -0
  84. package/dist/headless/locale-routing/index.d.ts +41 -0
  85. package/dist/headless/locale-routing/index.js +145 -0
  86. package/dist/headless/nav/index.d.ts +2 -0
  87. package/dist/headless/nav/index.js +1 -0
  88. package/dist/headless/nav/resolve.d.ts +2 -0
  89. package/dist/headless/nav/resolve.js +71 -0
  90. package/dist/headless/nav/types.d.ts +26 -0
  91. package/dist/headless/nav/types.js +1 -0
  92. package/dist/headless/store/create-store.d.ts +2 -0
  93. package/dist/headless/store/create-store.js +43 -0
  94. package/dist/headless/store/equality.d.ts +1 -0
  95. package/dist/headless/store/equality.js +34 -0
  96. package/dist/headless/store/index.d.ts +3 -0
  97. package/dist/headless/store/index.js +2 -0
  98. package/dist/headless/store/types.d.ts +7 -0
  99. package/dist/headless/store/types.js +10 -0
  100. package/dist/headless/view-model/edit.d.ts +18 -0
  101. package/dist/headless/view-model/edit.js +501 -0
  102. package/dist/headless/view-model/embedded-list.d.ts +27 -0
  103. package/dist/headless/view-model/embedded-list.js +63 -0
  104. package/dist/headless/view-model/index.d.ts +7 -0
  105. package/dist/headless/view-model/index.js +3 -0
  106. package/dist/headless/view-model/list-file-display.d.ts +3 -0
  107. package/dist/headless/view-model/list-file-display.js +27 -0
  108. package/dist/headless/view-model/list.d.ts +16 -0
  109. package/dist/headless/view-model/list.js +229 -0
  110. package/dist/headless/view-model/types.d.ts +382 -0
  111. package/dist/headless/view-model/types.js +1 -0
  112. package/dist/hooks/use-ai-text.d.ts +1 -1
  113. package/dist/hooks/use-form.d.ts +1 -1
  114. package/dist/hooks/use-form.js +1 -1
  115. package/dist/hooks/use-mutation.d.ts +1 -1
  116. package/dist/hooks/use-query.d.ts +1 -1
  117. package/dist/hooks/use-store.d.ts +1 -1
  118. package/dist/hooks/use-store.js +7 -7
  119. package/dist/hooks/use-stream-handler.d.ts +1 -1
  120. package/dist/i18n.d.ts +1 -1
  121. package/dist/i18n.js +1 -1
  122. package/dist/index.js +4 -4
  123. package/dist/live/csrf.d.ts +2 -0
  124. package/dist/live/csrf.js +60 -0
  125. package/dist/live/dispatcher-live.d.ts +7 -0
  126. package/dist/live/dispatcher-live.js +286 -0
  127. package/dist/live/envelopes.d.ts +101 -0
  128. package/dist/live/envelopes.js +35 -0
  129. package/dist/live/error-mapping.d.ts +16 -0
  130. package/dist/live/error-mapping.js +82 -0
  131. package/dist/live/index.d.ts +7 -0
  132. package/dist/live/index.js +5 -0
  133. package/dist/live/locale.d.ts +2 -0
  134. package/dist/live/locale.js +25 -0
  135. package/dist/live/sse-stream.d.ts +14 -0
  136. package/dist/live/sse-stream.js +128 -0
  137. package/dist/primitives.d.ts +35 -36
  138. package/dist/primitives.js +1 -1
  139. package/dist/session/session-ended.d.ts +1 -1
  140. package/dist/tokens.d.ts +3 -4
  141. package/dist/tokens.js +4 -5
  142. package/dist/web/app/app-schema-boot.d.ts +19 -0
  143. package/dist/web/app/app-schema-boot.js +124 -0
  144. package/dist/web/app/browser-locale.d.ts +22 -0
  145. package/dist/web/app/browser-locale.js +78 -0
  146. package/dist/web/app/client-plugin.d.ts +106 -0
  147. package/dist/web/app/client-plugin.js +12 -0
  148. package/dist/web/app/create-app.d.ts +104 -0
  149. package/dist/web/app/create-app.js +498 -0
  150. package/dist/web/app/create-public-surface.d.ts +36 -0
  151. package/dist/web/app/create-public-surface.js +40 -0
  152. package/dist/web/app/dashboard-body.d.ts +3 -0
  153. package/dist/web/app/dashboard-body.js +865 -0
  154. package/dist/web/app/dashboard-refresh.d.ts +6 -0
  155. package/dist/web/app/dashboard-refresh.js +15 -0
  156. package/dist/web/app/document-lang-sync.d.ts +4 -0
  157. package/dist/web/app/document-lang-sync.js +27 -0
  158. package/dist/web/app/draft-storage.d.ts +11 -0
  159. package/dist/web/app/draft-storage.js +53 -0
  160. package/dist/web/app/nav-providers-context.d.ts +13 -0
  161. package/dist/web/app/nav-providers-context.js +18 -0
  162. package/dist/web/app/nav.d.ts +40 -0
  163. package/dist/web/app/nav.js +231 -0
  164. package/dist/web/app/plain-content-editor.d.ts +3 -0
  165. package/dist/web/app/plain-content-editor.js +30 -0
  166. package/dist/web/app/relative-time.d.ts +10 -0
  167. package/dist/web/app/relative-time.js +56 -0
  168. package/dist/web/app/resolvers-context.d.ts +12 -0
  169. package/dist/web/app/resolvers-context.js +10 -0
  170. package/dist/web/app/rich-content-editor.d.ts +3 -0
  171. package/dist/web/app/rich-content-editor.js +15 -0
  172. package/dist/web/app/root-error-fallback.d.ts +2 -0
  173. package/dist/web/app/root-error-fallback.js +21 -0
  174. package/dist/web/app/screen-error-fallback.d.ts +6 -0
  175. package/dist/web/app/screen-error-fallback.js +17 -0
  176. package/dist/web/app/tiptap-editor.d.ts +3 -0
  177. package/dist/web/app/tiptap-editor.js +120 -0
  178. package/dist/web/app/toast-action-notifier.d.ts +5 -0
  179. package/dist/web/app/toast-action-notifier.js +17 -0
  180. package/dist/web/components/config-cascade.d.ts +13 -0
  181. package/dist/web/components/config-cascade.js +155 -0
  182. package/dist/web/components/config-source-badge.d.ts +6 -0
  183. package/dist/web/components/config-source-badge.js +55 -0
  184. package/dist/web/default-color-scheme.d.ts +2 -0
  185. package/dist/web/default-color-scheme.js +3 -0
  186. package/dist/web/icons.d.ts +94 -0
  187. package/dist/web/icons.js +100 -0
  188. package/dist/web/index.d.ts +78 -0
  189. package/dist/web/index.js +53 -0
  190. package/dist/web/layout/app-layout.d.ts +21 -0
  191. package/dist/web/layout/app-layout.js +8 -0
  192. package/dist/web/layout/avatar.d.ts +12 -0
  193. package/dist/web/layout/avatar.js +63 -0
  194. package/dist/web/layout/default-app-shell.d.ts +41 -0
  195. package/dist/web/layout/default-app-shell.js +16 -0
  196. package/dist/web/layout/editor-panel.d.ts +10 -0
  197. package/dist/web/layout/editor-panel.js +29 -0
  198. package/dist/web/layout/fill-classes.d.ts +9 -0
  199. package/dist/web/layout/fill-classes.js +15 -0
  200. package/dist/web/layout/filter-app-schema-navs.d.ts +7 -0
  201. package/dist/web/layout/filter-app-schema-navs.js +68 -0
  202. package/dist/web/layout/header-action-group.d.ts +6 -0
  203. package/dist/web/layout/header-action-group.js +8 -0
  204. package/dist/web/layout/header-overflow-menu.d.ts +4 -0
  205. package/dist/web/layout/header-overflow-menu.js +8 -0
  206. package/dist/web/layout/language-menu-items.d.ts +8 -0
  207. package/dist/web/layout/language-menu-items.js +16 -0
  208. package/dist/web/layout/language-switcher.d.ts +25 -0
  209. package/dist/web/layout/language-switcher.js +46 -0
  210. package/dist/web/layout/nav-tree.d.ts +19 -0
  211. package/dist/web/layout/nav-tree.js +536 -0
  212. package/dist/web/layout/page-header-slot.d.ts +25 -0
  213. package/dist/web/layout/page-header-slot.js +50 -0
  214. package/dist/web/layout/profile-menu.d.ts +13 -0
  215. package/dist/web/layout/profile-menu.js +6 -0
  216. package/dist/web/layout/shell-breadcrumb.d.ts +11 -0
  217. package/dist/web/layout/shell-breadcrumb.js +34 -0
  218. package/dist/web/layout/shell-header.d.ts +12 -0
  219. package/dist/web/layout/shell-header.js +159 -0
  220. package/dist/web/layout/sidebar-brand.d.ts +15 -0
  221. package/dist/web/layout/sidebar-brand.js +9 -0
  222. package/dist/web/layout/sidebar-panel.d.ts +41 -0
  223. package/dist/web/layout/sidebar-panel.js +107 -0
  224. package/dist/web/layout/sidebar-user.d.ts +8 -0
  225. package/dist/web/layout/sidebar-user.js +17 -0
  226. package/dist/web/layout/sidebar.d.ts +17 -0
  227. package/dist/web/layout/sidebar.js +11 -0
  228. package/dist/web/layout/target-resolver-stub.d.ts +13 -0
  229. package/dist/web/layout/target-resolver-stub.js +61 -0
  230. package/dist/web/layout/target-url.d.ts +12 -0
  231. package/dist/web/layout/target-url.js +77 -0
  232. package/dist/web/layout/theme-label.d.ts +15 -0
  233. package/dist/web/layout/theme-label.js +35 -0
  234. package/dist/web/layout/theme-menu-item.d.ts +12 -0
  235. package/dist/web/layout/theme-menu-item.js +16 -0
  236. package/dist/web/layout/theme-toggle.d.ts +17 -0
  237. package/dist/web/layout/theme-toggle.js +22 -0
  238. package/dist/web/layout/topbar.d.ts +8 -0
  239. package/dist/web/layout/topbar.js +4 -0
  240. package/dist/web/layout/workspace-shell.d.ts +63 -0
  241. package/dist/web/layout/workspace-shell.js +220 -0
  242. package/dist/web/layout/workspace-switcher.d.ts +15 -0
  243. package/dist/web/layout/workspace-switcher.js +36 -0
  244. package/dist/web/lib/accept-attr.d.ts +1 -0
  245. package/dist/web/lib/accept-attr.js +6 -0
  246. package/dist/web/lib/clamp.d.ts +1 -0
  247. package/dist/web/lib/clamp.js +3 -0
  248. package/dist/web/lib/cn.d.ts +6 -0
  249. package/dist/web/lib/cn.js +9 -0
  250. package/dist/web/lib/download.d.ts +2 -0
  251. package/dist/web/lib/download.js +24 -0
  252. package/dist/web/lib/file-ref-download.d.ts +15 -0
  253. package/dist/web/lib/file-ref-download.js +62 -0
  254. package/dist/web/lib/file-upload-form-data.d.ts +7 -0
  255. package/dist/web/lib/file-upload-form-data.js +11 -0
  256. package/dist/web/lib/resize-image.d.ts +1 -0
  257. package/dist/web/lib/resize-image.js +66 -0
  258. package/dist/web/lib/upload-file-ref.d.ts +9 -0
  259. package/dist/web/lib/upload-file-ref.js +29 -0
  260. package/dist/web/primitives/action-menu.d.ts +34 -0
  261. package/dist/web/primitives/action-menu.js +30 -0
  262. package/dist/web/primitives/calendar-popover.d.ts +13 -0
  263. package/dist/web/primitives/calendar-popover.js +76 -0
  264. package/dist/web/primitives/combobox.d.ts +56 -0
  265. package/dist/web/primitives/combobox.js +127 -0
  266. package/dist/web/primitives/date-field.d.ts +18 -0
  267. package/dist/web/primitives/date-field.js +74 -0
  268. package/dist/web/primitives/date-input.d.ts +1 -0
  269. package/dist/web/primitives/date-input.js +5 -0
  270. package/dist/web/primitives/date-parse.d.ts +11 -0
  271. package/dist/web/primitives/date-parse.js +159 -0
  272. package/dist/web/primitives/dialog.d.ts +3 -0
  273. package/dist/web/primitives/dialog.js +42 -0
  274. package/dist/web/primitives/drawer.d.ts +3 -0
  275. package/dist/web/primitives/drawer.js +17 -0
  276. package/dist/web/primitives/dropdown-menu.d.ts +15 -0
  277. package/dist/web/primitives/dropdown-menu.js +56 -0
  278. package/dist/web/primitives/embedded-list-input.d.ts +9 -0
  279. package/dist/web/primitives/embedded-list-input.js +382 -0
  280. package/dist/web/primitives/file-thumbnail.d.ts +25 -0
  281. package/dist/web/primitives/file-thumbnail.js +90 -0
  282. package/dist/web/primitives/file-upload.d.ts +21 -0
  283. package/dist/web/primitives/file-upload.js +56 -0
  284. package/dist/web/primitives/index.d.ts +34 -0
  285. package/dist/web/primitives/index.js +2021 -0
  286. package/dist/web/primitives/json-view.d.ts +7 -0
  287. package/dist/web/primitives/json-view.js +84 -0
  288. package/dist/web/primitives/layout.d.ts +27 -0
  289. package/dist/web/primitives/layout.js +30 -0
  290. package/dist/web/primitives/lightbox.d.ts +3 -0
  291. package/dist/web/primitives/lightbox.js +36 -0
  292. package/dist/web/primitives/locale-number.d.ts +2 -0
  293. package/dist/web/primitives/locale-number.js +54 -0
  294. package/dist/web/primitives/located-timestamp-input.d.ts +22 -0
  295. package/dist/web/primitives/located-timestamp-input.js +22 -0
  296. package/dist/web/primitives/metric.d.ts +5 -0
  297. package/dist/web/primitives/metric.js +18 -0
  298. package/dist/web/primitives/modal-shell.d.ts +17 -0
  299. package/dist/web/primitives/modal-shell.js +9 -0
  300. package/dist/web/primitives/modal.d.ts +3 -0
  301. package/dist/web/primitives/modal.js +13 -0
  302. package/dist/web/primitives/money-input.d.ts +18 -0
  303. package/dist/web/primitives/money-input.js +122 -0
  304. package/dist/web/primitives/narrow-pinned-footer.d.ts +12 -0
  305. package/dist/web/primitives/narrow-pinned-footer.js +153 -0
  306. package/dist/web/primitives/number-input.d.ts +18 -0
  307. package/dist/web/primitives/number-input.js +53 -0
  308. package/dist/web/primitives/option-groups.d.ts +11 -0
  309. package/dist/web/primitives/option-groups.js +27 -0
  310. package/dist/web/primitives/page-header.d.ts +3 -0
  311. package/dist/web/primitives/page-header.js +52 -0
  312. package/dist/web/primitives/promo-panel.d.ts +3 -0
  313. package/dist/web/primitives/promo-panel.js +11 -0
  314. package/dist/web/primitives/segmented-select.d.ts +21 -0
  315. package/dist/web/primitives/segmented-select.js +62 -0
  316. package/dist/web/primitives/share-actions.d.ts +4 -0
  317. package/dist/web/primitives/share-actions.js +56 -0
  318. package/dist/web/primitives/status-badge.d.ts +3 -0
  319. package/dist/web/primitives/status-badge.js +5 -0
  320. package/dist/web/primitives/sticky-action-bar.d.ts +5 -0
  321. package/dist/web/primitives/sticky-action-bar.js +15 -0
  322. package/dist/web/primitives/tabs.d.ts +3 -0
  323. package/dist/web/primitives/tabs.js +107 -0
  324. package/dist/web/primitives/timestamp-input.d.ts +27 -0
  325. package/dist/web/primitives/timestamp-input.js +87 -0
  326. package/dist/web/primitives/toast.d.ts +19 -0
  327. package/dist/web/primitives/toast.js +63 -0
  328. package/dist/web/primitives/tz-input.d.ts +11 -0
  329. package/dist/web/primitives/tz-input.js +8 -0
  330. package/dist/web/primitives/tz-options.d.ts +4 -0
  331. package/dist/web/primitives/tz-options.js +17 -0
  332. package/dist/web/primitives/use-keyboard-inset.d.ts +1 -0
  333. package/dist/web/primitives/use-keyboard-inset.js +28 -0
  334. package/dist/web/primitives/use-narrow-viewport.d.ts +4 -0
  335. package/dist/web/primitives/use-narrow-viewport.js +46 -0
  336. package/dist/web/react-css-custom-properties.d.ts +6 -0
  337. package/dist/web/react-css-custom-properties.js +1 -0
  338. package/dist/web/sse/live-events.d.ts +15 -0
  339. package/dist/web/sse/live-events.js +148 -0
  340. package/dist/web/theme-plugin.d.ts +41 -0
  341. package/dist/web/theme-plugin.js +123 -0
  342. package/dist/web/tokens.d.ts +24 -0
  343. package/dist/web/tokens.js +203 -0
  344. package/dist/web/ui/avatar.d.ts +11 -0
  345. package/dist/web/ui/avatar.js +25 -0
  346. package/dist/web/ui/badge.d.ts +9 -0
  347. package/dist/web/ui/badge.js +26 -0
  348. package/dist/web/ui/breadcrumb.d.ts +11 -0
  349. package/dist/web/ui/breadcrumb.js +29 -0
  350. package/dist/web/ui/button.d.ts +10 -0
  351. package/dist/web/ui/button.js +37 -0
  352. package/dist/web/ui/checkbox.d.ts +4 -0
  353. package/dist/web/ui/checkbox.js +11 -0
  354. package/dist/web/ui/input.d.ts +3 -0
  355. package/dist/web/ui/input.js +8 -0
  356. package/dist/web/ui/label.d.ts +4 -0
  357. package/dist/web/ui/label.js +10 -0
  358. package/dist/web/ui/resizable.d.ts +7 -0
  359. package/dist/web/ui/resizable.js +16 -0
  360. package/dist/web/ui/separator.d.ts +4 -0
  361. package/dist/web/ui/separator.js +10 -0
  362. package/dist/web/ui/sheet.d.ts +14 -0
  363. package/dist/web/ui/sheet.js +42 -0
  364. package/dist/web/ui/sidebar.d.ts +73 -0
  365. package/dist/web/ui/sidebar.js +211 -0
  366. package/dist/web/ui/skeleton.d.ts +2 -0
  367. package/dist/web/ui/skeleton.js +7 -0
  368. package/dist/web/ui/switch.d.ts +6 -0
  369. package/dist/web/ui/switch.js +10 -0
  370. package/dist/web/ui/table.d.ts +10 -0
  371. package/dist/web/ui/table.js +30 -0
  372. package/dist/web/ui/tabs.d.ts +11 -0
  373. package/dist/web/ui/tabs.js +31 -0
  374. package/dist/web/ui/textarea.d.ts +3 -0
  375. package/dist/web/ui/textarea.js +8 -0
  376. package/dist/web/ui/tooltip.d.ts +7 -0
  377. package/dist/web/ui/tooltip.js +19 -0
  378. package/dist/web/ui/use-mobile.d.ts +1 -0
  379. package/dist/web/ui/use-mobile.js +16 -0
  380. package/dist/web/version/update-checker.d.ts +9 -0
  381. package/dist/web/version/update-checker.js +88 -0
  382. package/dist/web/widgets/ai-text-field.d.ts +36 -0
  383. package/dist/web/widgets/ai-text-field.js +137 -0
  384. package/dist/web/widgets/chart-window.d.ts +58 -0
  385. package/dist/web/widgets/chart-window.js +190 -0
  386. package/dist/web/widgets/charts.d.ts +208 -0
  387. package/dist/web/widgets/charts.js +685 -0
  388. package/dist/web/widgets/collapsible-section.d.ts +10 -0
  389. package/dist/web/widgets/collapsible-section.js +17 -0
  390. package/dist/web/widgets/dashboard-list.d.ts +21 -0
  391. package/dist/web/widgets/dashboard-list.js +45 -0
  392. package/dist/web/widgets/detail-list.d.ts +15 -0
  393. package/dist/web/widgets/detail-list.js +8 -0
  394. package/dist/web/widgets/drawer.d.ts +65 -0
  395. package/dist/web/widgets/drawer.js +142 -0
  396. package/dist/web/widgets/feed-list.d.ts +13 -0
  397. package/dist/web/widgets/feed-list.js +9 -0
  398. package/dist/web/widgets/floating-panel.d.ts +30 -0
  399. package/dist/web/widgets/floating-panel.js +242 -0
  400. package/dist/web/widgets/form-fields.d.ts +93 -0
  401. package/dist/web/widgets/form-fields.js +50 -0
  402. package/dist/web/widgets/index.d.ts +27 -0
  403. package/dist/web/widgets/index.js +30 -0
  404. package/dist/web/widgets/infinity-list.d.ts +46 -0
  405. package/dist/web/widgets/infinity-list.js +211 -0
  406. package/dist/web/widgets/mode-switch.d.ts +21 -0
  407. package/dist/web/widgets/mode-switch.js +25 -0
  408. package/dist/web/widgets/photo-slots.d.ts +29 -0
  409. package/dist/web/widgets/photo-slots.js +52 -0
  410. package/dist/web/widgets/plan-card.d.ts +36 -0
  411. package/dist/web/widgets/plan-card.js +13 -0
  412. package/dist/web/widgets/progress-bar.d.ts +19 -0
  413. package/dist/web/widgets/progress-bar.js +24 -0
  414. package/dist/web/widgets/progress-list.d.ts +19 -0
  415. package/dist/web/widgets/progress-list.js +11 -0
  416. package/dist/web/widgets/public-shell.d.ts +22 -0
  417. package/dist/web/widgets/public-shell.js +15 -0
  418. package/dist/web/widgets/query-table.d.ts +29 -0
  419. package/dist/web/widgets/query-table.js +30 -0
  420. package/dist/web/widgets/result-panel.d.ts +69 -0
  421. package/dist/web/widgets/result-panel.js +30 -0
  422. package/dist/web/widgets/section-card.d.ts +12 -0
  423. package/dist/web/widgets/section-card.js +9 -0
  424. package/dist/web/widgets/sheet-parts.d.ts +9 -0
  425. package/dist/web/widgets/sheet-parts.js +11 -0
  426. package/dist/web/widgets/side-by-side-table.d.ts +31 -0
  427. package/dist/web/widgets/side-by-side-table.js +11 -0
  428. package/dist/web/widgets/stat.d.ts +54 -0
  429. package/dist/web/widgets/stat.js +65 -0
  430. package/dist/web/widgets/states.d.ts +23 -0
  431. package/dist/web/widgets/states.js +20 -0
  432. package/dist/web/widgets/status-badge.d.ts +15 -0
  433. package/dist/web/widgets/status-badge.js +24 -0
  434. package/dist/web/widgets/step-bar.d.ts +35 -0
  435. package/dist/web/widgets/step-bar.js +60 -0
  436. package/dist/web/widgets/upload-zone.d.ts +24 -0
  437. package/dist/web/widgets/upload-zone.js +108 -0
  438. package/dist/web/widgets/use-draft.d.ts +20 -0
  439. package/dist/web/widgets/use-draft.js +21 -0
  440. package/dist/web/widgets/use-pointer-drag.d.ts +21 -0
  441. package/dist/web/widgets/use-pointer-drag.js +53 -0
  442. package/package.json +105 -7
  443. package/src/changes.json +53 -0
  444. package/src/web/fonts/OFL.txt +93 -0
  445. package/src/web/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  446. package/src/web/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
  447. package/src/web/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  448. package/src/web/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
  449. package/src/web/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  450. package/src/web/fonts/ibm-plex-sans-latin-500.woff2 +0 -0
  451. package/src/web/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  452. package/src/web/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  453. package/src/web/fonts/ibm-plex-sans-latin-ext-500.woff2 +0 -0
  454. package/src/web/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  455. package/src/web/styles.css +401 -0
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // @runtime client
3
+ //
4
+ // tiptap-backed implementation behind RichContentEditor's lazy() boundary —
5
+ // never import this file directly, tiptap must only load when a "rich"
6
+ // collection is actually rendered. StarterKit covers bold/italic/lists/
7
+ // headings, and its bundled Link extension autolinks on type/paste — no
8
+ // link button, so no URL-prompt UI to build or test.
9
+ import { EditorContent, useEditor, useEditorState } from "@tiptap/react";
10
+ import StarterKit from "@tiptap/starter-kit";
11
+ import { Bold as BoldIcon, Heading1, Heading2, Italic as ItalicIcon, List, ListOrdered, } from "lucide-react";
12
+ import { useEffect } from "react";
13
+ import { TextareaContentEditor, usePrimitives, useTranslation, VariableChips, } from "../../index.js";
14
+ import { cn } from "../lib/cn.js";
15
+ function Toolbar({ actions, disabled, }) {
16
+ const { Button } = usePrimitives();
17
+ return (_jsx("div", { className: "flex flex-wrap gap-1 border-b border-input p-1", children: actions.map((action) => (_jsx(Button, { type: "button", variant: action.isActive ? "primary" : "secondary", size: "icon", disabled: disabled, onClick: action.onClick, ariaLabel: action.label, children: _jsx(action.icon, { size: 16 }) }, action.label))) }));
18
+ }
19
+ export default function TiptapEditor({ id, value, onChange, variables, readOnly, }) {
20
+ const t = useTranslation();
21
+ // ponytail: rich = StarterKit's schema (bold/italic/lists/headings/links).
22
+ // Anything the schema doesn't model — <table>, <div>/<span>, style attrs,
23
+ // <img>, classes — is dropped on first parse (setContent below, and the
24
+ // initial `content: value` here). Upgrade if that ceiling is hit: add the
25
+ // matching tiptap extensions, or a raw-HTML mode for markup StarterKit
26
+ // can't represent.
27
+ const editor = useEditor({
28
+ extensions: [StarterKit],
29
+ content: value,
30
+ editable: !readOnly,
31
+ // Suspense (RichContentEditor's lazy boundary) speculatively mounts
32
+ // this component before committing it; immediate render would create
33
+ // an editor instance during that throwaway pass.
34
+ immediatelyRender: false,
35
+ // Caller-supplied id — the Field wrapping the editor (TextBlockEditor)
36
+ // associates its label via this id, see ContentEditorProps.id in
37
+ // content-editors.tsx.
38
+ editorProps: { attributes: { id } },
39
+ onUpdate: ({ editor: e }) => onChange(e.getHTML()),
40
+ });
41
+ // `useEditor` alone leaves `editor.isActive(...)` reads in the render body
42
+ // frozen on the last prop-driven render — @tiptap/react v3 defaults
43
+ // `shouldRerenderOnTransaction` to false, so a selection-only change (e.g.
44
+ // moving the cursor into bold text without typing) never triggers a
45
+ // re-render on its own. `useEditorState` subscribes to transactions itself
46
+ // and only re-renders when the selected slice of state actually changes.
47
+ const activeState = useEditorState({
48
+ editor,
49
+ selector: ({ editor: e }) => e === null
50
+ ? null
51
+ : {
52
+ bold: e.isActive("bold"),
53
+ italic: e.isActive("italic"),
54
+ heading1: e.isActive("heading", { level: 1 }),
55
+ heading2: e.isActive("heading", { level: 2 }),
56
+ bulletList: e.isActive("bulletList"),
57
+ orderedList: e.isActive("orderedList"),
58
+ },
59
+ });
60
+ // TextBlockEditor loads the entry's content asynchronously (by-slug query
61
+ // resolves after mount), so `value` arrives after useEditor already read
62
+ // its initial (empty) content once. Sync it in — guarded against
63
+ // clobbering in-flight typing by comparing against the editor's own HTML.
64
+ useEffect(() => {
65
+ if (editor && value !== editor.getHTML()) {
66
+ editor.commands.setContent(value, { emitUpdate: false });
67
+ }
68
+ }, [value, editor]);
69
+ useEffect(() => {
70
+ editor?.setEditable(!readOnly);
71
+ }, [readOnly, editor]);
72
+ if (!editor)
73
+ return (_jsx(TextareaContentEditor, { id: id, value: value, onChange: onChange, variables: variables, readOnly: readOnly }));
74
+ const actions = [
75
+ {
76
+ label: t("kumiko.contentEditor.bold"),
77
+ icon: BoldIcon,
78
+ isActive: activeState?.bold ?? false,
79
+ onClick: () => editor.chain().focus().toggleBold().run(),
80
+ },
81
+ {
82
+ label: t("kumiko.contentEditor.italic"),
83
+ icon: ItalicIcon,
84
+ isActive: activeState?.italic ?? false,
85
+ onClick: () => editor.chain().focus().toggleItalic().run(),
86
+ },
87
+ {
88
+ label: t("kumiko.contentEditor.heading1"),
89
+ icon: Heading1,
90
+ isActive: activeState?.heading1 ?? false,
91
+ onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
92
+ },
93
+ {
94
+ label: t("kumiko.contentEditor.heading2"),
95
+ icon: Heading2,
96
+ isActive: activeState?.heading2 ?? false,
97
+ onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
98
+ },
99
+ {
100
+ label: t("kumiko.contentEditor.bulletList"),
101
+ icon: List,
102
+ isActive: activeState?.bulletList ?? false,
103
+ onClick: () => editor.chain().focus().toggleBulletList().run(),
104
+ },
105
+ {
106
+ label: t("kumiko.contentEditor.orderedList"),
107
+ icon: ListOrdered,
108
+ isActive: activeState?.orderedList ?? false,
109
+ onClick: () => editor.chain().focus().toggleOrderedList().run(),
110
+ },
111
+ ];
112
+ const insertVariable = (name) => {
113
+ editor
114
+ .chain()
115
+ .focus()
116
+ .insertContent({ type: "text", text: `{{${name}}}` })
117
+ .run();
118
+ };
119
+ return (_jsxs("div", { className: "rounded-md border border-input bg-transparent", children: [_jsx(Toolbar, { actions: actions, disabled: readOnly }), _jsx(EditorContent, { editor: editor, className: cn("min-h-40 px-3 py-2 text-base outline-none md:text-sm", "[&_.ProseMirror]:min-h-40 [&_.ProseMirror]:outline-none", "[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6", "[&_h1]:text-xl [&_h1]:font-bold [&_h2]:text-lg [&_h2]:font-bold", "[&_a]:underline [&_a]:text-primary", "[&_strong]:font-bold [&_em]:italic") }), variables.length > 0 && (_jsx("div", { className: "border-t border-input p-1", children: _jsx(VariableChips, { variables: variables, onInsert: insertVariable, disabled: readOnly }) }))] }));
120
+ }
@@ -0,0 +1,5 @@
1
+ import { type ReactNode } from "react";
2
+ /** Shows client-action outcomes as toasts; mount inside the ToastProvider. */
3
+ export declare function ToastActionNotifier({ children }: {
4
+ readonly children: ReactNode;
5
+ }): ReactNode;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from "react";
3
+ import { ActionNoticeProvider, useTranslation } from "../../index.js";
4
+ import { useToast } from "../primitives/toast.js";
5
+ /** Shows client-action outcomes as toasts; mount inside the ToastProvider. */
6
+ export function ToastActionNotifier({ children }) {
7
+ const { toast } = useToast();
8
+ const t = useTranslation();
9
+ const notify = useCallback((notice) => {
10
+ if (notice.tone === "success") {
11
+ toast({ title: notice.text, variant: "ok" });
12
+ return;
13
+ }
14
+ toast({ title: t("kumiko.rowAction.failed"), description: notice.text, variant: "bad" });
15
+ }, [toast, t]);
16
+ return _jsx(ActionNoticeProvider, { notify: notify, children: children });
17
+ }
@@ -0,0 +1,13 @@
1
+ import type { ConfigCascade, ConfigScope } from "@cosmicdrift/kumiko-framework/engine";
2
+ import type { ReactNode } from "react";
3
+ type CascadeValueRenderer = (value: string | number | boolean) => ReactNode;
4
+ type ConfigCascadeViewProps = {
5
+ readonly cascade: ConfigCascade;
6
+ readonly screenScope: ConfigScope;
7
+ readonly onReset?: (key: string, scope: ConfigScope) => void;
8
+ readonly qualifiedKey?: string;
9
+ readonly required?: boolean;
10
+ readonly renderValue?: CascadeValueRenderer;
11
+ };
12
+ export declare function ConfigCascadeView({ cascade, screenScope, onReset, qualifiedKey, required, renderValue, }: ConfigCascadeViewProps): ReactNode;
13
+ export {};
@@ -0,0 +1,155 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useState } from "react";
3
+ import { usePrimitives, useTranslation } from "../../index.js";
4
+ import { Icon } from "../icons.js";
5
+ import { cn } from "../lib/cn.js";
6
+ const SOURCE_I18N_KEY = {
7
+ "user-row": "kumiko.config.source.user",
8
+ "tenant-row": "kumiko.config.source.tenant",
9
+ "system-row": "kumiko.config.source.system",
10
+ "app-override": "kumiko.config.source.appOverride",
11
+ computed: "kumiko.config.source.computed",
12
+ default: "kumiko.config.source.default",
13
+ missing: "kumiko.config.source.missing",
14
+ };
15
+ // Fallback-Reihenfolge der Cascade, spezifischste Quelle zuerst.
16
+ // Index-Vergleich gegen die Screen-Scope-Quelle entscheidet, welche
17
+ // Ebenen ein Nicht-Operator sehen darf.
18
+ const SOURCE_ORDER = [
19
+ "user-row",
20
+ "tenant-row",
21
+ "system-row",
22
+ "app-override",
23
+ "computed",
24
+ "default",
25
+ "missing",
26
+ ];
27
+ function formatValue(value, hasValue, t, renderValue) {
28
+ if (!hasValue || value === undefined)
29
+ return t("kumiko.config.cascade.noValue");
30
+ if (renderValue !== undefined)
31
+ return renderValue(value);
32
+ if (typeof value === "boolean")
33
+ return t(value ? "kumiko.config.cascade.on" : "kumiko.config.cascade.off");
34
+ return String(value);
35
+ }
36
+ // The origin sentence interpolates the fallback value, which can be a node (a
37
+ // select's option label resolved by a query), so the translated template is
38
+ // split at a marker instead of interpolating a string.
39
+ const VALUE_MARKER = "\u0000";
40
+ function interpolateValue(template, value) {
41
+ const markerIndex = template.indexOf(VALUE_MARKER);
42
+ if (markerIndex === -1)
43
+ return template;
44
+ return (_jsxs(_Fragment, { children: [template.slice(0, markerIndex), value, template.slice(markerIndex + VALUE_MARKER.length)] }));
45
+ }
46
+ function scopeToSource(scope) {
47
+ if (scope === "user")
48
+ return "user-row";
49
+ if (scope === "tenant")
50
+ return "tenant-row";
51
+ return "system-row";
52
+ }
53
+ function toDisplayLevels(levels, screenScopeSource) {
54
+ // System-Screens sind Operator-Sicht — volle Cascade inkl.
55
+ // app-override/computed/default bleibt sichtbar.
56
+ if (screenScopeSource === "system-row") {
57
+ return levels.map((level) => ({ level, badgeSource: level.source }));
58
+ }
59
+ const scopeIdx = SOURCE_ORDER.indexOf(screenScopeSource);
60
+ const own = levels.filter((l) => SOURCE_ORDER.indexOf(l.source) <= scopeIdx);
61
+ const higher = levels.filter((l) => SOURCE_ORDER.indexOf(l.source) > scopeIdx);
62
+ // Genau eine Fallback-Zeile: die aktive höhere Ebene (deren Wert der
63
+ // User effektiv bekommt), sonst der deklarierte Default/Missing.
64
+ const fallback = higher.find((l) => l.isActive) ??
65
+ higher.find((l) => l.source === "default" || l.source === "missing");
66
+ const ownRows = own.map((level) => ({ level, badgeSource: level.source }));
67
+ if (fallback === undefined)
68
+ return ownRows;
69
+ return [
70
+ ...ownRows,
71
+ {
72
+ level: fallback,
73
+ badgeSource: "default",
74
+ // Ein durchgängiger Begriff "Standard" (DE) / "Default" (EN) — derselbe
75
+ // Key wie das Feld-Label-Badge (kumiko.config.source.default), damit
76
+ // Badge + Cascade-Disclosure NICHT zwei verschiedene Wörter zeigen
77
+ // (Bug-Bash 3 #11). Der Screen-Scope kann die Operator-Ebenen
78
+ // (System/Override/Computed) weder setzen noch zurücksetzen, deshalb
79
+ // erscheinen sie hier neutral als "Standard".
80
+ badgeLabelKey: "kumiko.config.source.default",
81
+ },
82
+ ];
83
+ }
84
+ const OWN_LEVEL_ORIGIN_KEY = {
85
+ tenant: "kumiko.config.cascade.origin.tenant",
86
+ user: "kumiko.config.cascade.origin.user",
87
+ system: "kumiko.config.cascade.origin.system",
88
+ };
89
+ // A missing or empty default reads as "Default is ." — drop the clause instead.
90
+ const OWN_LEVEL_ORIGIN_NO_DEFAULT_KEY = {
91
+ tenant: "kumiko.config.cascade.originNoDefault.tenant",
92
+ user: "kumiko.config.cascade.originNoDefault.user",
93
+ system: "kumiko.config.cascade.originNoDefault.system",
94
+ };
95
+ export function ConfigCascadeView({ cascade, screenScope, onReset, qualifiedKey, required = false, renderValue, }) {
96
+ const t = useTranslation();
97
+ const { Button } = usePrimitives();
98
+ const [expanded, setExpanded] = useState(false);
99
+ const panelId = useId();
100
+ // Safety net: callers should already filter malformed cascades, but
101
+ // a missing levels-array (e.g. from a partial mock) shouldn't crash
102
+ // the screen.
103
+ if (!Array.isArray(cascade?.levels))
104
+ return null;
105
+ const screenScopeSource = scopeToSource(screenScope);
106
+ const displayLevels = toDisplayLevels(cascade.levels, screenScopeSource);
107
+ const activeDisplay = displayLevels.find((d) => d.level.isActive);
108
+ const hasOverride = activeDisplay?.level.source === screenScopeSource;
109
+ // Aufklappbar nur wenn das Panel echten Mehrwert bringt: ein eigener
110
+ // Override (→ Reset) oder mehr als eine Ebene MIT Wert. Leere Ebenen
111
+ // (z.B. die ungesetzte tenant-row eines reinen Default-Felds) zählen
112
+ // nicht — sonst wäre ein Feld, das nur seinen Standard zeigt, fälschlich
113
+ // aufklappbar und das Panel nur eine Wiederholung des Triggers.
114
+ const valuedLevels = displayLevels.filter((d) => d.level.hasValue);
115
+ const expandable = hasOverride || valuedLevels.length > 1;
116
+ const isUnset = activeDisplay === undefined || !activeDisplay.level.hasValue;
117
+ // The value the field falls back to if this level is reset: the next level
118
+ // below the active one that holds a value.
119
+ const activeIndex = activeDisplay === undefined ? -1 : displayLevels.indexOf(activeDisplay);
120
+ const fallbackLevel = displayLevels.slice(activeIndex + 1).find((d) => d.level.hasValue)?.level;
121
+ const fallbackValue = fallbackLevel === undefined || fallbackLevel.value === ""
122
+ ? undefined
123
+ : formatValue(fallbackLevel.value, true, t, renderValue);
124
+ const origin = hasOverride
125
+ ? {
126
+ text: fallbackValue === undefined
127
+ ? t(OWN_LEVEL_ORIGIN_NO_DEFAULT_KEY[screenScope])
128
+ : interpolateValue(t(OWN_LEVEL_ORIGIN_KEY[screenScope], { value: VALUE_MARKER }), fallbackValue),
129
+ className: "text-status-active",
130
+ }
131
+ : isUnset
132
+ ? required
133
+ ? {
134
+ text: t("kumiko.config.cascade.notSetRequired"),
135
+ className: "text-status-bad",
136
+ }
137
+ : {
138
+ text: t("kumiko.config.cascade.noValue"),
139
+ className: "text-muted-foreground",
140
+ }
141
+ : {
142
+ text: screenScope === "system"
143
+ ? t(SOURCE_I18N_KEY[activeDisplay.badgeSource])
144
+ : t("kumiko.config.cascade.origin.default"),
145
+ className: "text-muted-foreground",
146
+ };
147
+ return (_jsxs("div", { className: "flex flex-col gap-1 text-xs", "data-testid": "config-cascade", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-1 gap-y-1", children: [_jsx("span", { className: cn("inline-flex items-center gap-1.5", origin.className), children: origin.text }), hasOverride && onReset !== undefined && qualifiedKey !== undefined ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => onReset(qualifiedKey, screenScope), testId: "config-cascade-reset", className: "h-auto px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground", children: t(screenScope === "system"
148
+ ? "kumiko.config.cascade.resetToApp"
149
+ : "kumiko.config.cascade.resetTo") })) : null] }), expandable && (cascade.levels.length > 2 || screenScope === "system") ? (_jsxs("button", { type: "button", onClick: () => setExpanded((v) => !v), "aria-expanded": expanded, ...(expanded && { "aria-controls": panelId }), className: "inline-flex cursor-pointer items-center gap-1 self-start rounded-sm text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(Icon, { name: "chevron-right", className: cn("size-3.5 transition-transform motion-reduce:transition-none", expanded && "rotate-90") }), t(expanded ? "kumiko.config.cascade.hideLevels" : "kumiko.config.cascade.showLevels")] })) : null, expanded && expandable && (cascade.levels.length > 2 || screenScope === "system") ? (_jsx("ul", { id: panelId, className: "flex flex-col gap-0.5 border-l border-border pl-3", children: displayLevels.map((display) => (_jsx(CascadeLevelRow, { display: display, ...(renderValue !== undefined && { renderValue }) }, display.level.source))) })) : null] }));
150
+ }
151
+ function CascadeLevelRow({ display, renderValue, }) {
152
+ const t = useTranslation();
153
+ const { level } = display;
154
+ return (_jsxs("li", { className: cn("flex items-baseline gap-3", level.isActive ? "text-foreground" : "text-muted-foreground"), children: [_jsx("span", { className: "w-28 shrink-0", children: t(display.badgeLabelKey ?? SOURCE_I18N_KEY[display.badgeSource]) }), _jsx("span", { className: cn(level.isActive && "font-medium"), children: formatValue(level.value, level.hasValue, t, renderValue) }), level.isActive ? (_jsx("span", { className: "text-primary", children: t("kumiko.config.cascade.activeMarker") })) : null] }));
155
+ }
@@ -0,0 +1,6 @@
1
+ import type { ConfigScope, ConfigValueSource } from "@cosmicdrift/kumiko-framework/engine";
2
+ import type { ReactNode } from "react";
3
+ export declare function ConfigSourceBadge({ source, screenScope, }: {
4
+ readonly source: ConfigValueSource;
5
+ readonly screenScope?: ConfigScope;
6
+ }): ReactNode;
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useTranslation } from "../../index.js";
3
+ import { cn } from "../lib/cn.js";
4
+ const SOURCE_LABEL_KEY = {
5
+ "user-row": "kumiko.config.source.user",
6
+ "tenant-row": "kumiko.config.source.tenant",
7
+ "system-row": "kumiko.config.source.system",
8
+ "app-override": "kumiko.config.source.appOverride",
9
+ computed: "kumiko.config.source.computed",
10
+ default: "kumiko.config.source.default",
11
+ missing: "kumiko.config.source.missing",
12
+ };
13
+ // Two states only: set on a scope row (accent) vs. inherited/default (neutral);
14
+ // a missing value is the one status colour.
15
+ const ROW_SOURCES = new Set([
16
+ "user-row",
17
+ "tenant-row",
18
+ "system-row",
19
+ ]);
20
+ function badgeToneClass(source) {
21
+ if (source === "missing")
22
+ return "bg-status-bad-surface text-status-bad";
23
+ return ROW_SOURCES.has(source) ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground";
24
+ }
25
+ const SOURCE_ORDER = [
26
+ "user-row",
27
+ "tenant-row",
28
+ "system-row",
29
+ "app-override",
30
+ "computed",
31
+ "default",
32
+ "missing",
33
+ ];
34
+ function scopeToSource(scope) {
35
+ if (scope === "user")
36
+ return "user-row";
37
+ if (scope === "tenant")
38
+ return "tenant-row";
39
+ return "system-row";
40
+ }
41
+ export function ConfigSourceBadge({ source, screenScope, }) {
42
+ const t = useTranslation();
43
+ // Gleiche Kollaps-Regel wie toDisplayLevels (config-cascade.tsx):
44
+ // Operator-Quellen oberhalb des Screen-Scopes erscheinen für Nicht-
45
+ // Operator-Screens als neutrales "Vorgabe"-Badge — sonst leakte das
46
+ // Badge die System-Quelle, die die Cascade-View bewusst versteckt.
47
+ let effective = source;
48
+ if (screenScope !== undefined && screenScope !== "system") {
49
+ const scopeIdx = SOURCE_ORDER.indexOf(scopeToSource(screenScope));
50
+ if (SOURCE_ORDER.indexOf(source) > scopeIdx && source !== "missing") {
51
+ effective = "default";
52
+ }
53
+ }
54
+ return (_jsx("span", { "data-testid": "config-source-badge", className: cn("ml-1.5 inline-flex items-center whitespace-nowrap rounded px-1.5 text-[11px] font-medium leading-[18px]", badgeToneClass(effective)), children: t(SOURCE_LABEL_KEY[effective]) }));
55
+ }
@@ -0,0 +1,2 @@
1
+ export type DefaultColorScheme = "auto" | "light" | "dark";
2
+ export declare const DEFAULT_COLOR_SCHEME_VARIABLE = "--kumiko-default-color-scheme";
@@ -0,0 +1,3 @@
1
+ // Written by createThemePlugin, read by the browser tokens hook. A separate
2
+ // module keeps tailwindcss/plugin out of the client bundle.
3
+ export const DEFAULT_COLOR_SCHEME_VARIABLE = "--kumiko-default-color-scheme";
@@ -0,0 +1,94 @@
1
+ import type { NavIconKey } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { ReactNode } from "react";
3
+ export type { NavIconKey } from "@cosmicdrift/kumiko-framework/ui-types";
4
+ export declare const NAV_ICONS: {
5
+ readonly dashboard: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
6
+ readonly "layout-grid": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
7
+ readonly "book-open": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
8
+ readonly "clipboard-list": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
9
+ readonly package: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
10
+ readonly gauge: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
11
+ readonly list: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
12
+ readonly table: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
13
+ readonly layers: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
14
+ readonly building: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
15
+ readonly calculator: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
16
+ readonly wallet: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
17
+ readonly coins: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
18
+ readonly "credit-card": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
19
+ readonly "piggy-bank": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
20
+ readonly receipt: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
21
+ readonly chart: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
22
+ readonly "bar-chart": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
23
+ readonly trending: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
24
+ readonly sparkles: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
25
+ readonly wand: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
26
+ readonly calendar: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
27
+ readonly file: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
28
+ readonly folder: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
29
+ readonly "folder-open": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
30
+ readonly home: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
31
+ readonly bell: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
32
+ readonly shield: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
33
+ readonly "shield-check": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
34
+ readonly send: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
35
+ readonly settings: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
36
+ readonly users: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
37
+ readonly user: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
38
+ readonly search: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
39
+ readonly tag: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
40
+ readonly key: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
41
+ readonly link: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
42
+ readonly palette: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
43
+ readonly share: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
44
+ readonly server: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
45
+ readonly mail: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
46
+ readonly lock: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
47
+ readonly hash: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
48
+ readonly download: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
49
+ readonly upload: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
50
+ readonly rocket: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
51
+ readonly plus: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
52
+ readonly languages: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
53
+ readonly trash: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
54
+ readonly x: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
55
+ readonly check: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
56
+ readonly "arrow-left": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
57
+ readonly "arrow-right": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
58
+ readonly copy: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
59
+ readonly pencil: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
60
+ readonly eye: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
61
+ readonly "eye-off": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
62
+ readonly filter: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
63
+ readonly refresh: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
64
+ readonly "more-horizontal": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
65
+ readonly "more-vertical": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
66
+ readonly "external-link": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
67
+ readonly "chevron-down": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
68
+ readonly "chevron-left": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
69
+ readonly "chevron-right": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
70
+ readonly "chevron-up": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
71
+ readonly save: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
72
+ readonly undo: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
73
+ readonly archive: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
74
+ readonly star: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
75
+ readonly flag: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
76
+ readonly clock: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
77
+ readonly "map-pin": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
78
+ readonly phone: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
79
+ readonly printer: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
80
+ readonly "alert-triangle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
81
+ readonly info: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
82
+ readonly "check-circle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
83
+ readonly "x-circle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
84
+ readonly loader: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
85
+ readonly mic: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
86
+ readonly "circle-stop": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
87
+ readonly image: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
88
+ readonly camera: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
89
+ readonly headphones: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
90
+ };
91
+ export declare function Icon({ name, className, }: {
92
+ readonly name: NavIconKey;
93
+ readonly className?: string;
94
+ }): ReactNode;
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { AlertTriangle, Archive, ArrowLeft, ArrowRight, BarChart3, Bell, BookOpen, Building, Calculator, CalendarDays, Camera, Check, CheckCircle2, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, CircleStop, ClipboardList, Clock, Coins, Copy, CreditCard, Download, ExternalLink, Eye, EyeOff, FileText, Filter, Flag, Folder, FolderOpen, Gauge, Hash, Headphones, Home, ImageIcon, Info, KeyRound, Languages, Layers, LayoutDashboard, LayoutGrid, LineChart, Link, List, Loader2, Lock, Mail, MapPin, Mic, MoreHorizontal, MoreVertical, Package, Palette, Pencil, Phone, PiggyBank, Plus, Printer, Receipt, RefreshCw, Rocket, Save, Search, Send, Server, Settings, Share2, Shield, ShieldCheck, Sparkles, Star, Table, Tag, Trash2, TrendingUp, Undo2, Upload, User, Users, Wallet, Wand2, X, XCircle, } from "lucide-react";
3
+ import { cn } from "./lib/cn.js";
4
+ export const NAV_ICONS = {
5
+ dashboard: LayoutDashboard,
6
+ "layout-grid": LayoutGrid,
7
+ "book-open": BookOpen,
8
+ "clipboard-list": ClipboardList,
9
+ package: Package,
10
+ gauge: Gauge,
11
+ list: List,
12
+ table: Table,
13
+ layers: Layers,
14
+ building: Building,
15
+ calculator: Calculator,
16
+ wallet: Wallet,
17
+ coins: Coins,
18
+ "credit-card": CreditCard,
19
+ "piggy-bank": PiggyBank,
20
+ receipt: Receipt,
21
+ chart: LineChart,
22
+ "bar-chart": BarChart3,
23
+ trending: TrendingUp,
24
+ sparkles: Sparkles,
25
+ wand: Wand2,
26
+ calendar: CalendarDays,
27
+ file: FileText,
28
+ folder: Folder,
29
+ "folder-open": FolderOpen,
30
+ home: Home,
31
+ bell: Bell,
32
+ shield: Shield,
33
+ "shield-check": ShieldCheck,
34
+ send: Send,
35
+ settings: Settings,
36
+ users: Users,
37
+ user: User,
38
+ search: Search,
39
+ tag: Tag,
40
+ key: KeyRound,
41
+ link: Link,
42
+ palette: Palette,
43
+ share: Share2,
44
+ server: Server,
45
+ mail: Mail,
46
+ lock: Lock,
47
+ hash: Hash,
48
+ download: Download,
49
+ upload: Upload,
50
+ rocket: Rocket,
51
+ plus: Plus,
52
+ languages: Languages,
53
+ trash: Trash2,
54
+ x: X,
55
+ check: Check,
56
+ "arrow-left": ArrowLeft,
57
+ "arrow-right": ArrowRight,
58
+ copy: Copy,
59
+ pencil: Pencil,
60
+ eye: Eye,
61
+ "eye-off": EyeOff,
62
+ filter: Filter,
63
+ refresh: RefreshCw,
64
+ "more-horizontal": MoreHorizontal,
65
+ "more-vertical": MoreVertical,
66
+ "external-link": ExternalLink,
67
+ "chevron-down": ChevronDown,
68
+ "chevron-left": ChevronLeft,
69
+ "chevron-right": ChevronRight,
70
+ "chevron-up": ChevronUp,
71
+ save: Save,
72
+ undo: Undo2,
73
+ archive: Archive,
74
+ star: Star,
75
+ flag: Flag,
76
+ clock: Clock,
77
+ "map-pin": MapPin,
78
+ phone: Phone,
79
+ printer: Printer,
80
+ "alert-triangle": AlertTriangle,
81
+ info: Info,
82
+ "check-circle": CheckCircle2,
83
+ "x-circle": XCircle,
84
+ loader: Loader2,
85
+ mic: Mic,
86
+ "circle-stop": CircleStop,
87
+ image: ImageIcon,
88
+ camera: Camera,
89
+ headphones: Headphones,
90
+ };
91
+ // Widened alias for runtime lookups against the plain `string` icon keys
92
+ // resolved-tree nodes carry — not the closed NavIconKey union NAV_ICONS
93
+ // itself is typed against.
94
+ const ICON_LOOKUP = NAV_ICONS;
95
+ export function Icon({ name, className, }) {
96
+ const LucideIcon = Object.hasOwn(NAV_ICONS, name) ? ICON_LOOKUP[name] : undefined;
97
+ if (LucideIcon !== undefined)
98
+ return _jsx(LucideIcon, { "aria-hidden": "true", className: className });
99
+ return (_jsx("span", { "aria-hidden": "true", className: cn("text-xs", className), children: name }));
100
+ }