@cosmicdrift/kumiko-renderer 0.373.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 (466) hide show
  1. package/README.md +2 -2
  2. package/dist/app/action-form-support.d.ts +58 -0
  3. package/dist/app/action-form-support.js +96 -0
  4. package/dist/app/client-actions.d.ts +46 -0
  5. package/dist/app/client-actions.js +60 -0
  6. package/dist/app/column-renderers.js +1 -1
  7. package/dist/app/config-edit-shim.js +1 -1
  8. package/dist/app/content-preview.js +1 -6
  9. package/dist/app/custom-screens.js +1 -1
  10. package/dist/app/dashboard-body.d.ts +1 -1
  11. package/dist/app/entity-list-expanded-row.d.ts +1 -1
  12. package/dist/app/entity-list-expanded-row.js +4 -0
  13. package/dist/app/form-schema.d.ts +1 -1
  14. package/dist/app/form-schema.js +2 -2
  15. package/dist/app/header-actions-bar.d.ts +19 -0
  16. package/dist/app/header-actions-bar.js +30 -0
  17. package/dist/app/kumiko-screen.d.ts +1 -1
  18. package/dist/app/kumiko-screen.js +134 -66
  19. package/dist/app/list-empty-content.d.ts +2 -2
  20. package/dist/app/list-empty-content.js +3 -2
  21. package/dist/app/list-facets.d.ts +1 -1
  22. package/dist/app/nav.js +2 -2
  23. package/dist/app/query-state-banners.d.ts +1 -1
  24. package/dist/app/reference-link.d.ts +1 -1
  25. package/dist/app/row-actions.d.ts +10 -2
  26. package/dist/app/row-actions.js +85 -6
  27. package/dist/app/secret-mint-body.d.ts +1 -1
  28. package/dist/app/secrets-edit-body.d.ts +1 -1
  29. package/dist/app/use-record-actions.d.ts +12 -0
  30. package/dist/app/use-record-actions.js +30 -0
  31. package/dist/app/write-failed-error.d.ts +1 -1
  32. package/dist/components/availability-options-select.d.ts +1 -1
  33. package/dist/components/embedded-list-field.d.ts +1 -1
  34. package/dist/components/embedded-list-field.js +1 -1
  35. package/dist/components/file-list-field.d.ts +1 -1
  36. package/dist/components/grid-cell-for-field.d.ts +4 -2
  37. package/dist/components/grid-cell-for-field.js +2 -2
  38. package/dist/components/multi-select-checkboxes.d.ts +1 -1
  39. package/dist/components/multi-select-checkboxes.js +1 -1
  40. package/dist/components/query-options-select.d.ts +1 -1
  41. package/dist/components/related-list-section.d.ts +1 -1
  42. package/dist/components/related-list-section.js +16 -3
  43. package/dist/components/render-edit-logic.d.ts +1 -1
  44. package/dist/components/render-edit-types.d.ts +2 -2
  45. package/dist/components/render-edit.d.ts +1 -1
  46. package/dist/components/render-edit.js +5 -3
  47. package/dist/components/render-field.d.ts +5 -2
  48. package/dist/components/render-field.js +103 -9
  49. package/dist/components/render-list.d.ts +1 -1
  50. package/dist/components/render-list.js +20 -4
  51. package/dist/components/write-form-section.d.ts +1 -1
  52. package/dist/components/write-form-section.js +1 -1
  53. package/dist/context/dispatcher-context.d.ts +1 -1
  54. package/dist/format-when.js +1 -1
  55. package/dist/headless/apex/css.d.ts +3 -0
  56. package/dist/headless/apex/css.js +298 -0
  57. package/dist/headless/apex/index.d.ts +236 -0
  58. package/dist/headless/apex/index.js +377 -0
  59. package/dist/headless/apex/lightbox.d.ts +4 -0
  60. package/dist/headless/apex/lightbox.js +81 -0
  61. package/dist/headless/contracts/asset.d.ts +15 -0
  62. package/dist/headless/contracts/asset.js +17 -0
  63. package/dist/headless/contracts/index.d.ts +3 -0
  64. package/dist/headless/contracts/index.js +1 -0
  65. package/dist/headless/contracts/locale.d.ts +7 -0
  66. package/dist/headless/contracts/locale.js +11 -0
  67. package/dist/headless/contracts/primitives.d.ts +93 -0
  68. package/dist/headless/contracts/primitives.js +21 -0
  69. package/dist/headless/dispatcher/index.d.ts +2 -0
  70. package/dist/headless/dispatcher/index.js +1 -0
  71. package/dist/headless/dispatcher/types.d.ts +86 -0
  72. package/dist/headless/dispatcher/types.js +34 -0
  73. package/dist/headless/form/form-controller.d.ts +2 -0
  74. package/dist/headless/form/form-controller.js +409 -0
  75. package/dist/headless/form/index.d.ts +3 -0
  76. package/dist/headless/form/index.js +2 -0
  77. package/dist/headless/form/types.d.ts +76 -0
  78. package/dist/headless/form/types.js +1 -0
  79. package/dist/headless/form/zod-bridge.d.ts +10 -0
  80. package/dist/headless/form/zod-bridge.js +103 -0
  81. package/dist/headless/format/document-values.d.ts +12 -0
  82. package/dist/headless/format/document-values.js +70 -0
  83. package/dist/headless/format/escape.d.ts +5 -0
  84. package/dist/headless/format/escape.js +75 -0
  85. package/dist/headless/format/html-template.d.ts +9 -0
  86. package/dist/headless/format/html-template.js +39 -0
  87. package/dist/headless/format/index.d.ts +12 -0
  88. package/dist/headless/format/index.js +237 -0
  89. package/dist/headless/format/money.d.ts +3 -0
  90. package/dist/headless/format/money.js +39 -0
  91. package/dist/headless/index.d.ts +14 -0
  92. package/dist/headless/index.js +9 -0
  93. package/dist/headless/locale-routing/index.d.ts +41 -0
  94. package/dist/headless/locale-routing/index.js +145 -0
  95. package/dist/headless/nav/index.d.ts +2 -0
  96. package/dist/headless/nav/index.js +1 -0
  97. package/dist/headless/nav/resolve.d.ts +2 -0
  98. package/dist/headless/nav/resolve.js +71 -0
  99. package/dist/headless/nav/types.d.ts +26 -0
  100. package/dist/headless/nav/types.js +1 -0
  101. package/dist/headless/store/create-store.d.ts +2 -0
  102. package/dist/headless/store/create-store.js +43 -0
  103. package/dist/headless/store/equality.d.ts +1 -0
  104. package/dist/headless/store/equality.js +34 -0
  105. package/dist/headless/store/index.d.ts +3 -0
  106. package/dist/headless/store/index.js +2 -0
  107. package/dist/headless/store/types.d.ts +7 -0
  108. package/dist/headless/store/types.js +10 -0
  109. package/dist/headless/view-model/edit.d.ts +18 -0
  110. package/dist/headless/view-model/edit.js +501 -0
  111. package/dist/headless/view-model/embedded-list.d.ts +27 -0
  112. package/dist/headless/view-model/embedded-list.js +63 -0
  113. package/dist/headless/view-model/index.d.ts +7 -0
  114. package/dist/headless/view-model/index.js +3 -0
  115. package/dist/headless/view-model/list-file-display.d.ts +3 -0
  116. package/dist/headless/view-model/list-file-display.js +27 -0
  117. package/dist/headless/view-model/list.d.ts +16 -0
  118. package/dist/headless/view-model/list.js +229 -0
  119. package/dist/headless/view-model/types.d.ts +382 -0
  120. package/dist/headless/view-model/types.js +1 -0
  121. package/dist/hooks/use-ai-text.d.ts +1 -1
  122. package/dist/hooks/use-form.d.ts +1 -1
  123. package/dist/hooks/use-form.js +1 -1
  124. package/dist/hooks/use-mutation.d.ts +1 -1
  125. package/dist/hooks/use-query.d.ts +1 -1
  126. package/dist/hooks/use-store.d.ts +1 -1
  127. package/dist/hooks/use-store.js +7 -7
  128. package/dist/hooks/use-stream-handler.d.ts +1 -1
  129. package/dist/i18n-defaults.js +7 -0
  130. package/dist/i18n.d.ts +1 -1
  131. package/dist/i18n.js +1 -1
  132. package/dist/index.d.ts +5 -1
  133. package/dist/index.js +7 -4
  134. package/dist/live/csrf.d.ts +2 -0
  135. package/dist/live/csrf.js +60 -0
  136. package/dist/live/dispatcher-live.d.ts +7 -0
  137. package/dist/live/dispatcher-live.js +286 -0
  138. package/dist/live/envelopes.d.ts +101 -0
  139. package/dist/live/envelopes.js +35 -0
  140. package/dist/live/error-mapping.d.ts +16 -0
  141. package/dist/live/error-mapping.js +82 -0
  142. package/dist/live/index.d.ts +7 -0
  143. package/dist/live/index.js +5 -0
  144. package/dist/live/locale.d.ts +2 -0
  145. package/dist/live/locale.js +25 -0
  146. package/dist/live/sse-stream.d.ts +14 -0
  147. package/dist/live/sse-stream.js +128 -0
  148. package/dist/primitives.d.ts +53 -36
  149. package/dist/primitives.js +1 -1
  150. package/dist/session/session-ended.d.ts +1 -1
  151. package/dist/tokens.d.ts +3 -4
  152. package/dist/tokens.js +4 -5
  153. package/dist/web/app/app-schema-boot.d.ts +19 -0
  154. package/dist/web/app/app-schema-boot.js +124 -0
  155. package/dist/web/app/browser-locale.d.ts +22 -0
  156. package/dist/web/app/browser-locale.js +78 -0
  157. package/dist/web/app/client-plugin.d.ts +106 -0
  158. package/dist/web/app/client-plugin.js +12 -0
  159. package/dist/web/app/create-app.d.ts +104 -0
  160. package/dist/web/app/create-app.js +498 -0
  161. package/dist/web/app/create-public-surface.d.ts +36 -0
  162. package/dist/web/app/create-public-surface.js +40 -0
  163. package/dist/web/app/dashboard-body.d.ts +3 -0
  164. package/dist/web/app/dashboard-body.js +865 -0
  165. package/dist/web/app/dashboard-refresh.d.ts +6 -0
  166. package/dist/web/app/dashboard-refresh.js +15 -0
  167. package/dist/web/app/document-lang-sync.d.ts +4 -0
  168. package/dist/web/app/document-lang-sync.js +27 -0
  169. package/dist/web/app/draft-storage.d.ts +11 -0
  170. package/dist/web/app/draft-storage.js +53 -0
  171. package/dist/web/app/nav-providers-context.d.ts +13 -0
  172. package/dist/web/app/nav-providers-context.js +18 -0
  173. package/dist/web/app/nav.d.ts +40 -0
  174. package/dist/web/app/nav.js +231 -0
  175. package/dist/web/app/plain-content-editor.d.ts +3 -0
  176. package/dist/web/app/plain-content-editor.js +30 -0
  177. package/dist/web/app/relative-time.d.ts +10 -0
  178. package/dist/web/app/relative-time.js +56 -0
  179. package/dist/web/app/resolvers-context.d.ts +12 -0
  180. package/dist/web/app/resolvers-context.js +10 -0
  181. package/dist/web/app/rich-content-editor.d.ts +3 -0
  182. package/dist/web/app/rich-content-editor.js +15 -0
  183. package/dist/web/app/root-error-fallback.d.ts +2 -0
  184. package/dist/web/app/root-error-fallback.js +21 -0
  185. package/dist/web/app/screen-error-fallback.d.ts +6 -0
  186. package/dist/web/app/screen-error-fallback.js +17 -0
  187. package/dist/web/app/tiptap-editor.d.ts +3 -0
  188. package/dist/web/app/tiptap-editor.js +120 -0
  189. package/dist/web/app/toast-action-notifier.d.ts +5 -0
  190. package/dist/web/app/toast-action-notifier.js +17 -0
  191. package/dist/web/components/config-cascade.d.ts +13 -0
  192. package/dist/web/components/config-cascade.js +155 -0
  193. package/dist/web/components/config-source-badge.d.ts +6 -0
  194. package/dist/web/components/config-source-badge.js +55 -0
  195. package/dist/web/default-color-scheme.d.ts +2 -0
  196. package/dist/web/default-color-scheme.js +3 -0
  197. package/dist/web/icons.d.ts +94 -0
  198. package/dist/web/icons.js +100 -0
  199. package/dist/web/index.d.ts +78 -0
  200. package/dist/web/index.js +53 -0
  201. package/dist/web/layout/app-layout.d.ts +21 -0
  202. package/dist/web/layout/app-layout.js +8 -0
  203. package/dist/web/layout/avatar.d.ts +12 -0
  204. package/dist/web/layout/avatar.js +63 -0
  205. package/dist/web/layout/default-app-shell.d.ts +41 -0
  206. package/dist/web/layout/default-app-shell.js +16 -0
  207. package/dist/web/layout/editor-panel.d.ts +10 -0
  208. package/dist/web/layout/editor-panel.js +29 -0
  209. package/dist/web/layout/fill-classes.d.ts +9 -0
  210. package/dist/web/layout/fill-classes.js +15 -0
  211. package/dist/web/layout/filter-app-schema-navs.d.ts +7 -0
  212. package/dist/web/layout/filter-app-schema-navs.js +68 -0
  213. package/dist/web/layout/header-action-group.d.ts +6 -0
  214. package/dist/web/layout/header-action-group.js +8 -0
  215. package/dist/web/layout/header-overflow-menu.d.ts +4 -0
  216. package/dist/web/layout/header-overflow-menu.js +8 -0
  217. package/dist/web/layout/language-menu-items.d.ts +8 -0
  218. package/dist/web/layout/language-menu-items.js +16 -0
  219. package/dist/web/layout/language-switcher.d.ts +25 -0
  220. package/dist/web/layout/language-switcher.js +46 -0
  221. package/dist/web/layout/nav-tree.d.ts +19 -0
  222. package/dist/web/layout/nav-tree.js +536 -0
  223. package/dist/web/layout/page-header-slot.d.ts +25 -0
  224. package/dist/web/layout/page-header-slot.js +50 -0
  225. package/dist/web/layout/profile-menu.d.ts +13 -0
  226. package/dist/web/layout/profile-menu.js +6 -0
  227. package/dist/web/layout/shell-breadcrumb.d.ts +11 -0
  228. package/dist/web/layout/shell-breadcrumb.js +34 -0
  229. package/dist/web/layout/shell-header.d.ts +12 -0
  230. package/dist/web/layout/shell-header.js +159 -0
  231. package/dist/web/layout/sidebar-brand.d.ts +15 -0
  232. package/dist/web/layout/sidebar-brand.js +9 -0
  233. package/dist/web/layout/sidebar-panel.d.ts +41 -0
  234. package/dist/web/layout/sidebar-panel.js +107 -0
  235. package/dist/web/layout/sidebar-user.d.ts +8 -0
  236. package/dist/web/layout/sidebar-user.js +17 -0
  237. package/dist/web/layout/sidebar.d.ts +17 -0
  238. package/dist/web/layout/sidebar.js +11 -0
  239. package/dist/web/layout/target-resolver-stub.d.ts +13 -0
  240. package/dist/web/layout/target-resolver-stub.js +61 -0
  241. package/dist/web/layout/target-url.d.ts +12 -0
  242. package/dist/web/layout/target-url.js +77 -0
  243. package/dist/web/layout/theme-label.d.ts +15 -0
  244. package/dist/web/layout/theme-label.js +35 -0
  245. package/dist/web/layout/theme-menu-item.d.ts +12 -0
  246. package/dist/web/layout/theme-menu-item.js +16 -0
  247. package/dist/web/layout/theme-toggle.d.ts +17 -0
  248. package/dist/web/layout/theme-toggle.js +22 -0
  249. package/dist/web/layout/topbar.d.ts +8 -0
  250. package/dist/web/layout/topbar.js +4 -0
  251. package/dist/web/layout/workspace-shell.d.ts +63 -0
  252. package/dist/web/layout/workspace-shell.js +220 -0
  253. package/dist/web/layout/workspace-switcher.d.ts +15 -0
  254. package/dist/web/layout/workspace-switcher.js +36 -0
  255. package/dist/web/lib/accept-attr.d.ts +1 -0
  256. package/dist/web/lib/accept-attr.js +6 -0
  257. package/dist/web/lib/clamp.d.ts +1 -0
  258. package/dist/web/lib/clamp.js +3 -0
  259. package/dist/web/lib/cn.d.ts +6 -0
  260. package/dist/web/lib/cn.js +9 -0
  261. package/dist/web/lib/download.d.ts +2 -0
  262. package/dist/web/lib/download.js +24 -0
  263. package/dist/web/lib/file-ref-download.d.ts +15 -0
  264. package/dist/web/lib/file-ref-download.js +62 -0
  265. package/dist/web/lib/file-upload-form-data.d.ts +7 -0
  266. package/dist/web/lib/file-upload-form-data.js +11 -0
  267. package/dist/web/lib/resize-image.d.ts +1 -0
  268. package/dist/web/lib/resize-image.js +66 -0
  269. package/dist/web/lib/upload-file-ref.d.ts +9 -0
  270. package/dist/web/lib/upload-file-ref.js +29 -0
  271. package/dist/web/primitives/action-menu.d.ts +34 -0
  272. package/dist/web/primitives/action-menu.js +30 -0
  273. package/dist/web/primitives/calendar-popover.d.ts +13 -0
  274. package/dist/web/primitives/calendar-popover.js +76 -0
  275. package/dist/web/primitives/combobox.d.ts +56 -0
  276. package/dist/web/primitives/combobox.js +127 -0
  277. package/dist/web/primitives/date-field.d.ts +18 -0
  278. package/dist/web/primitives/date-field.js +74 -0
  279. package/dist/web/primitives/date-input.d.ts +1 -0
  280. package/dist/web/primitives/date-input.js +5 -0
  281. package/dist/web/primitives/date-parse.d.ts +11 -0
  282. package/dist/web/primitives/date-parse.js +159 -0
  283. package/dist/web/primitives/dialog.d.ts +3 -0
  284. package/dist/web/primitives/dialog.js +42 -0
  285. package/dist/web/primitives/drawer.d.ts +3 -0
  286. package/dist/web/primitives/drawer.js +17 -0
  287. package/dist/web/primitives/dropdown-menu.d.ts +15 -0
  288. package/dist/web/primitives/dropdown-menu.js +56 -0
  289. package/dist/web/primitives/embedded-list-input.d.ts +9 -0
  290. package/dist/web/primitives/embedded-list-input.js +382 -0
  291. package/dist/web/primitives/file-thumbnail.d.ts +25 -0
  292. package/dist/web/primitives/file-thumbnail.js +90 -0
  293. package/dist/web/primitives/file-upload.d.ts +21 -0
  294. package/dist/web/primitives/file-upload.js +56 -0
  295. package/dist/web/primitives/index.d.ts +34 -0
  296. package/dist/web/primitives/index.js +2021 -0
  297. package/dist/web/primitives/json-view.d.ts +7 -0
  298. package/dist/web/primitives/json-view.js +84 -0
  299. package/dist/web/primitives/layout.d.ts +27 -0
  300. package/dist/web/primitives/layout.js +30 -0
  301. package/dist/web/primitives/lightbox.d.ts +3 -0
  302. package/dist/web/primitives/lightbox.js +36 -0
  303. package/dist/web/primitives/locale-number.d.ts +2 -0
  304. package/dist/web/primitives/locale-number.js +54 -0
  305. package/dist/web/primitives/located-timestamp-input.d.ts +22 -0
  306. package/dist/web/primitives/located-timestamp-input.js +22 -0
  307. package/dist/web/primitives/metric.d.ts +5 -0
  308. package/dist/web/primitives/metric.js +18 -0
  309. package/dist/web/primitives/modal-shell.d.ts +17 -0
  310. package/dist/web/primitives/modal-shell.js +9 -0
  311. package/dist/web/primitives/modal.d.ts +3 -0
  312. package/dist/web/primitives/modal.js +13 -0
  313. package/dist/web/primitives/money-input.d.ts +18 -0
  314. package/dist/web/primitives/money-input.js +122 -0
  315. package/dist/web/primitives/narrow-pinned-footer.d.ts +12 -0
  316. package/dist/web/primitives/narrow-pinned-footer.js +153 -0
  317. package/dist/web/primitives/number-input.d.ts +18 -0
  318. package/dist/web/primitives/number-input.js +53 -0
  319. package/dist/web/primitives/option-groups.d.ts +11 -0
  320. package/dist/web/primitives/option-groups.js +27 -0
  321. package/dist/web/primitives/page-header.d.ts +3 -0
  322. package/dist/web/primitives/page-header.js +52 -0
  323. package/dist/web/primitives/promo-panel.d.ts +3 -0
  324. package/dist/web/primitives/promo-panel.js +11 -0
  325. package/dist/web/primitives/segmented-select.d.ts +21 -0
  326. package/dist/web/primitives/segmented-select.js +62 -0
  327. package/dist/web/primitives/share-actions.d.ts +4 -0
  328. package/dist/web/primitives/share-actions.js +56 -0
  329. package/dist/web/primitives/status-badge.d.ts +3 -0
  330. package/dist/web/primitives/status-badge.js +5 -0
  331. package/dist/web/primitives/sticky-action-bar.d.ts +5 -0
  332. package/dist/web/primitives/sticky-action-bar.js +15 -0
  333. package/dist/web/primitives/tabs.d.ts +3 -0
  334. package/dist/web/primitives/tabs.js +107 -0
  335. package/dist/web/primitives/timestamp-input.d.ts +27 -0
  336. package/dist/web/primitives/timestamp-input.js +87 -0
  337. package/dist/web/primitives/toast.d.ts +19 -0
  338. package/dist/web/primitives/toast.js +63 -0
  339. package/dist/web/primitives/tz-input.d.ts +11 -0
  340. package/dist/web/primitives/tz-input.js +8 -0
  341. package/dist/web/primitives/tz-options.d.ts +4 -0
  342. package/dist/web/primitives/tz-options.js +17 -0
  343. package/dist/web/primitives/use-keyboard-inset.d.ts +1 -0
  344. package/dist/web/primitives/use-keyboard-inset.js +28 -0
  345. package/dist/web/primitives/use-narrow-viewport.d.ts +4 -0
  346. package/dist/web/primitives/use-narrow-viewport.js +46 -0
  347. package/dist/web/react-css-custom-properties.d.ts +6 -0
  348. package/dist/web/react-css-custom-properties.js +1 -0
  349. package/dist/web/sse/live-events.d.ts +15 -0
  350. package/dist/web/sse/live-events.js +148 -0
  351. package/dist/web/theme-plugin.d.ts +41 -0
  352. package/dist/web/theme-plugin.js +123 -0
  353. package/dist/web/tokens.d.ts +24 -0
  354. package/dist/web/tokens.js +203 -0
  355. package/dist/web/ui/avatar.d.ts +11 -0
  356. package/dist/web/ui/avatar.js +25 -0
  357. package/dist/web/ui/badge.d.ts +9 -0
  358. package/dist/web/ui/badge.js +26 -0
  359. package/dist/web/ui/breadcrumb.d.ts +11 -0
  360. package/dist/web/ui/breadcrumb.js +29 -0
  361. package/dist/web/ui/button.d.ts +10 -0
  362. package/dist/web/ui/button.js +37 -0
  363. package/dist/web/ui/checkbox.d.ts +4 -0
  364. package/dist/web/ui/checkbox.js +11 -0
  365. package/dist/web/ui/input.d.ts +3 -0
  366. package/dist/web/ui/input.js +8 -0
  367. package/dist/web/ui/label.d.ts +4 -0
  368. package/dist/web/ui/label.js +10 -0
  369. package/dist/web/ui/resizable.d.ts +7 -0
  370. package/dist/web/ui/resizable.js +16 -0
  371. package/dist/web/ui/separator.d.ts +4 -0
  372. package/dist/web/ui/separator.js +10 -0
  373. package/dist/web/ui/sheet.d.ts +14 -0
  374. package/dist/web/ui/sheet.js +42 -0
  375. package/dist/web/ui/sidebar.d.ts +73 -0
  376. package/dist/web/ui/sidebar.js +211 -0
  377. package/dist/web/ui/skeleton.d.ts +2 -0
  378. package/dist/web/ui/skeleton.js +7 -0
  379. package/dist/web/ui/switch.d.ts +6 -0
  380. package/dist/web/ui/switch.js +10 -0
  381. package/dist/web/ui/table.d.ts +10 -0
  382. package/dist/web/ui/table.js +30 -0
  383. package/dist/web/ui/tabs.d.ts +11 -0
  384. package/dist/web/ui/tabs.js +31 -0
  385. package/dist/web/ui/textarea.d.ts +3 -0
  386. package/dist/web/ui/textarea.js +8 -0
  387. package/dist/web/ui/tooltip.d.ts +7 -0
  388. package/dist/web/ui/tooltip.js +19 -0
  389. package/dist/web/ui/use-mobile.d.ts +1 -0
  390. package/dist/web/ui/use-mobile.js +16 -0
  391. package/dist/web/version/update-checker.d.ts +9 -0
  392. package/dist/web/version/update-checker.js +88 -0
  393. package/dist/web/widgets/ai-text-field.d.ts +36 -0
  394. package/dist/web/widgets/ai-text-field.js +137 -0
  395. package/dist/web/widgets/chart-window.d.ts +58 -0
  396. package/dist/web/widgets/chart-window.js +190 -0
  397. package/dist/web/widgets/charts.d.ts +208 -0
  398. package/dist/web/widgets/charts.js +685 -0
  399. package/dist/web/widgets/collapsible-section.d.ts +10 -0
  400. package/dist/web/widgets/collapsible-section.js +17 -0
  401. package/dist/web/widgets/dashboard-list.d.ts +21 -0
  402. package/dist/web/widgets/dashboard-list.js +45 -0
  403. package/dist/web/widgets/detail-list.d.ts +15 -0
  404. package/dist/web/widgets/detail-list.js +8 -0
  405. package/dist/web/widgets/drawer.d.ts +65 -0
  406. package/dist/web/widgets/drawer.js +142 -0
  407. package/dist/web/widgets/feed-list.d.ts +13 -0
  408. package/dist/web/widgets/feed-list.js +9 -0
  409. package/dist/web/widgets/floating-panel.d.ts +30 -0
  410. package/dist/web/widgets/floating-panel.js +242 -0
  411. package/dist/web/widgets/form-fields.d.ts +93 -0
  412. package/dist/web/widgets/form-fields.js +50 -0
  413. package/dist/web/widgets/index.d.ts +27 -0
  414. package/dist/web/widgets/index.js +30 -0
  415. package/dist/web/widgets/infinity-list.d.ts +46 -0
  416. package/dist/web/widgets/infinity-list.js +211 -0
  417. package/dist/web/widgets/mode-switch.d.ts +21 -0
  418. package/dist/web/widgets/mode-switch.js +25 -0
  419. package/dist/web/widgets/photo-slots.d.ts +29 -0
  420. package/dist/web/widgets/photo-slots.js +52 -0
  421. package/dist/web/widgets/plan-card.d.ts +36 -0
  422. package/dist/web/widgets/plan-card.js +13 -0
  423. package/dist/web/widgets/progress-bar.d.ts +19 -0
  424. package/dist/web/widgets/progress-bar.js +24 -0
  425. package/dist/web/widgets/progress-list.d.ts +19 -0
  426. package/dist/web/widgets/progress-list.js +11 -0
  427. package/dist/web/widgets/public-shell.d.ts +22 -0
  428. package/dist/web/widgets/public-shell.js +15 -0
  429. package/dist/web/widgets/query-table.d.ts +29 -0
  430. package/dist/web/widgets/query-table.js +30 -0
  431. package/dist/web/widgets/result-panel.d.ts +69 -0
  432. package/dist/web/widgets/result-panel.js +30 -0
  433. package/dist/web/widgets/section-card.d.ts +12 -0
  434. package/dist/web/widgets/section-card.js +9 -0
  435. package/dist/web/widgets/sheet-parts.d.ts +9 -0
  436. package/dist/web/widgets/sheet-parts.js +11 -0
  437. package/dist/web/widgets/side-by-side-table.d.ts +31 -0
  438. package/dist/web/widgets/side-by-side-table.js +11 -0
  439. package/dist/web/widgets/stat.d.ts +54 -0
  440. package/dist/web/widgets/stat.js +65 -0
  441. package/dist/web/widgets/states.d.ts +23 -0
  442. package/dist/web/widgets/states.js +20 -0
  443. package/dist/web/widgets/status-badge.d.ts +15 -0
  444. package/dist/web/widgets/status-badge.js +24 -0
  445. package/dist/web/widgets/step-bar.d.ts +35 -0
  446. package/dist/web/widgets/step-bar.js +60 -0
  447. package/dist/web/widgets/upload-zone.d.ts +24 -0
  448. package/dist/web/widgets/upload-zone.js +108 -0
  449. package/dist/web/widgets/use-draft.d.ts +20 -0
  450. package/dist/web/widgets/use-draft.js +21 -0
  451. package/dist/web/widgets/use-pointer-drag.d.ts +21 -0
  452. package/dist/web/widgets/use-pointer-drag.js +53 -0
  453. package/package.json +105 -7
  454. package/src/changes.json +77 -0
  455. package/src/web/fonts/OFL.txt +93 -0
  456. package/src/web/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  457. package/src/web/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
  458. package/src/web/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  459. package/src/web/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
  460. package/src/web/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  461. package/src/web/fonts/ibm-plex-sans-latin-500.woff2 +0 -0
  462. package/src/web/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  463. package/src/web/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  464. package/src/web/fonts/ibm-plex-sans-latin-ext-500.woff2 +0 -0
  465. package/src/web/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  466. package/src/web/styles.css +401 -0
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { toAppSchema, usePrimitives, useSessionEndedSignal, useTranslation } from "../../index.js";
4
+ // Mirrors framework's api-constants Routes.schema, same pattern as
5
+ // dispatcher-live's PATH_* constants — the one place that spells out the
6
+ // wire path both sides agree on.
7
+ export const APP_SCHEMA_API_PATH = "/api/schema";
8
+ function isFeatureSchemaPayload(value) {
9
+ if (typeof value !== "object" || value === null)
10
+ return false;
11
+ if (!("featureName" in value) || typeof value.featureName !== "string")
12
+ return false;
13
+ return "screens" in value && Array.isArray(value.screens);
14
+ }
15
+ export function isAppSchemaPayload(value) {
16
+ if (typeof value !== "object" || value === null)
17
+ return false;
18
+ if (!("features" in value) || !Array.isArray(value.features))
19
+ return false;
20
+ return value.features.every((feature) => isFeatureSchemaPayload(feature));
21
+ }
22
+ function isAbortError(err) {
23
+ return err instanceof DOMException && err.name === "AbortError";
24
+ }
25
+ // Mirrors createLiveDispatcher: a cross-origin API (absolute baseUrl) needs
26
+ // credentials "include" for the session cookie to travel; same-origin stays
27
+ // "same-origin" so a relative path never widens.
28
+ function schemaFetchCredentials(schemaUrl) {
29
+ try {
30
+ return new URL(schemaUrl, window.location.href).origin === window.location.origin
31
+ ? "same-origin"
32
+ : "include";
33
+ }
34
+ catch {
35
+ return "same-origin";
36
+ }
37
+ }
38
+ // Rejects only on abort (caller-cancelled) — every other failure mode
39
+ // (network error, non-2xx, unparseable/invalid body) resolves to
40
+ // `{ kind: "failed" }` so callers get one uniform result shape to branch
41
+ // on instead of a mix of thrown errors and resolved results.
42
+ export async function fetchAppSchema(signal, schemaUrl = APP_SCHEMA_API_PATH) {
43
+ let res;
44
+ try {
45
+ res = await fetch(schemaUrl, {
46
+ credentials: schemaFetchCredentials(schemaUrl),
47
+ headers: { Accept: "application/json" },
48
+ signal,
49
+ });
50
+ }
51
+ catch (err) {
52
+ if (isAbortError(err))
53
+ throw err;
54
+ return { kind: "failed" };
55
+ }
56
+ if (res.status === 401)
57
+ return { kind: "session-ended" };
58
+ if (res.status === 403)
59
+ return { kind: "unauthorized" };
60
+ if (!res.ok)
61
+ return { kind: "failed" };
62
+ let payload;
63
+ try {
64
+ payload = await res.json();
65
+ }
66
+ catch {
67
+ return { kind: "failed" };
68
+ }
69
+ if (!isAppSchemaPayload(payload))
70
+ return { kind: "failed" };
71
+ return { kind: "loaded", app: toAppSchema(payload) };
72
+ }
73
+ // Boots the app once the caller (AppSchemaBoundary, itself inside the
74
+ // clientFeature gates) decides to mount it — a login gate renders its own
75
+ // placeholder instead of children, so this component (and its fetch) never
76
+ // mounts until the user is authenticated.
77
+ export function AppSchemaFetchBoot({ onLoaded, schemaUrl, }) {
78
+ const t = useTranslation();
79
+ const { Banner, Button } = usePrimitives();
80
+ const [status, setStatus] = useState("loading");
81
+ const sessionEndedSignal = useSessionEndedSignal();
82
+ const [attempt, setAttempt] = useState(0);
83
+ // Ref instead of an effect dependency: onLoaded is a fresh closure on
84
+ // every KumikoAppRoot render (it captures setApp) — depending on it
85
+ // directly would refetch on every unrelated re-render.
86
+ const onLoadedRef = useRef(onLoaded);
87
+ onLoadedRef.current = onLoaded;
88
+ // biome-ignore lint/correctness/useExhaustiveDependencies: attempt is the retry trigger, never read in the body — bumping it is how the Retry button re-fires this effect.
89
+ useEffect(() => {
90
+ const controller = new AbortController();
91
+ setStatus("loading");
92
+ fetchAppSchema(controller.signal, schemaUrl)
93
+ .then((result) => {
94
+ if (controller.signal.aborted)
95
+ return;
96
+ if (result.kind === "loaded") {
97
+ onLoadedRef.current(result.app);
98
+ return;
99
+ }
100
+ setStatus(result.kind);
101
+ })
102
+ .catch((err) => {
103
+ if (!isAbortError(err))
104
+ setStatus("failed");
105
+ });
106
+ return () => controller.abort();
107
+ }, [attempt, schemaUrl]);
108
+ useEffect(() => {
109
+ if (status === "session-ended")
110
+ sessionEndedSignal?.notify();
111
+ }, [status, sessionEndedSignal]);
112
+ if (status === "loading") {
113
+ return (_jsx("div", { role: "status", "aria-busy": "true", children: t("kumiko.app-boot.loading") }));
114
+ }
115
+ if (status === "unauthorized" || status === "session-ended") {
116
+ // No auto-retry/reload here on purpose — a signed-out user retrying
117
+ // the same request just gets the same 401 again; the login gate that
118
+ // wraps this component is the actual way out. For session-ended the
119
+ // notify above normally swaps this banner for the login screen; the
120
+ // banner stays as fallback when no session provider is mounted.
121
+ return (_jsx(Banner, { variant: "error", padded: true, children: t("kumiko.app-boot.unauthorized") }));
122
+ }
123
+ return (_jsx(Banner, { variant: "error", padded: true, actions: _jsx(Button, { variant: "secondary", onClick: () => setAttempt((n) => n + 1), children: t("kumiko.actions.reload") }), children: t("kumiko.app-boot.failed") }));
124
+ }
@@ -0,0 +1,22 @@
1
+ import { type LocaleResolver } from "../../headless/index.ts";
2
+ export type CreateBrowserLocaleResolverOptions = {
3
+ /** localStorage-Key unter dem die aktive Locale persistiert wird.
4
+ * Default: `"kumiko:locale"`. Apps die mehrere Kumiko-Instanzen auf
5
+ * derselben Origin mounten (selten), setzen verschiedene Keys. */
6
+ readonly storageKey?: string;
7
+ /** Fallback wenn weder localStorage noch navigator.language liefern.
8
+ * Default: `"en"`. */
9
+ readonly defaultLocale?: string;
10
+ /** Maps a stored or browser-reported tag onto one of the app's locales;
11
+ * `undefined` rejects it (a stored tag then falls through to
12
+ * navigator.language, the browser tag to `defaultLocale`). Only applied to
13
+ * the initial detection, not to `setLocale`. */
14
+ readonly normalizeLocale?: (tag: string) => string | undefined;
15
+ };
16
+ export declare const BROWSER_LOCALE_STORAGE_KEY = "kumiko:locale";
17
+ /** Default-Resolver wenn createKumikoApp ohne `locale`-Option gebootet
18
+ * wird. Stateful: setLocale() persistiert in localStorage und ruft
19
+ * subscribed listeners. Apps die eine vollwertige i18n-Schicht haben
20
+ * (i18next, FormatJS, eigener Store), reichen stattdessen ihre eigene
21
+ * Resolver-Impl via `createKumikoApp({ locale })`. */
22
+ export declare function createBrowserLocaleResolver(options?: CreateBrowserLocaleResolverOptions): LocaleResolver;
@@ -0,0 +1,78 @@
1
+ // Browser-spezifischer LocaleResolver-Default für createKumikoApp.
2
+ //
3
+ // Stateful: hält die aktuelle Locale in localStorage, bricht subscribe-
4
+ // listener bei setLocale(). Initial-wert kommt aus localStorage wenn
5
+ // gespeichert, sonst aus navigator.language, sonst aus defaultLocale.
6
+ //
7
+ // App-Code setzt die Locale programmatisch via resolver.setLocale() —
8
+ // der LanguageSwitcher-Component macht genau das. Persistenz über
9
+ // localStorage heißt: nach Page-Reload gleiche Sprache, ohne Server-
10
+ // Roundtrip. Für device-übergreifende Persistenz würde ein
11
+ // user:write:update auf user.locale zusätzlich gesetzt (separater
12
+ // App-Code, nicht im Resolver).
13
+ import { createStore } from "../../headless/index.js";
14
+ export const BROWSER_LOCALE_STORAGE_KEY = "kumiko:locale";
15
+ function detectInitialLocale(storageKey, fallback, normalizeLocale) {
16
+ if (typeof localStorage !== "undefined") {
17
+ try {
18
+ const stored = localStorage.getItem(storageKey);
19
+ if (stored !== null && stored.length > 0) {
20
+ const normalized = normalizeLocale(stored);
21
+ if (normalized !== undefined)
22
+ return normalized;
23
+ }
24
+ }
25
+ catch {
26
+ // localStorage kann throwen (safari private mode, disabled) —
27
+ // leise auf navigator zurückfallen.
28
+ }
29
+ }
30
+ if (typeof navigator !== "undefined" && navigator.language) {
31
+ return normalizeLocale(navigator.language) ?? fallback;
32
+ }
33
+ return fallback;
34
+ }
35
+ function detectTimeZone() {
36
+ if (typeof Intl === "undefined")
37
+ return "UTC";
38
+ try {
39
+ return Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC";
40
+ }
41
+ catch {
42
+ return "UTC";
43
+ }
44
+ }
45
+ /** Default-Resolver wenn createKumikoApp ohne `locale`-Option gebootet
46
+ * wird. Stateful: setLocale() persistiert in localStorage und ruft
47
+ * subscribed listeners. Apps die eine vollwertige i18n-Schicht haben
48
+ * (i18next, FormatJS, eigener Store), reichen stattdessen ihre eigene
49
+ * Resolver-Impl via `createKumikoApp({ locale })`. */
50
+ export function createBrowserLocaleResolver(options = {}) {
51
+ const storageKey = options.storageKey ?? BROWSER_LOCALE_STORAGE_KEY;
52
+ const fallback = options.defaultLocale ?? "en";
53
+ const store = createStore(detectInitialLocale(storageKey, fallback, options.normalizeLocale ?? ((tag) => tag)));
54
+ const timeZone = detectTimeZone();
55
+ return {
56
+ translate: (key) => key,
57
+ locale: () => store.getSnapshot(), // @wrapper-known semantic-alias
58
+ timeZone: () => timeZone,
59
+ subscribe: store.subscribe,
60
+ setLocale: (next) => {
61
+ // skip: locale unchanged, avoid redundant localStorage write
62
+ // own Object.is-Gate would already block listener notification,
63
+ // but the persistence side-effect lives outside the store.
64
+ if (next === store.getSnapshot())
65
+ return;
66
+ store.setState(next);
67
+ if (typeof localStorage !== "undefined") {
68
+ try {
69
+ localStorage.setItem(storageKey, next);
70
+ }
71
+ catch {
72
+ // Persistenz fehlgeschlagen ist nicht fatal — die Session-Locale
73
+ // bleibt trotzdem gesetzt, nur der nächste Reload verliert sie.
74
+ }
75
+ }
76
+ },
77
+ };
78
+ }
@@ -0,0 +1,106 @@
1
+ import type { TargetRef, TreeChildrenSubscribe } from "@cosmicdrift/kumiko-framework/engine";
2
+ import type { ContentEditorFormat } from "@cosmicdrift/kumiko-types/nav";
3
+ import type { ComponentType, ReactNode } from "react";
4
+ import type { ClientActionHandler, ColumnRendererComponent, ContentEditorComponent, ExtensionSectionComponent, QualifiedContentCollection, TranslationsByLocale } from "../../index.ts";
5
+ /** What a `navProvidersFromCollections` factory returns: the providers plus
6
+ * the entities whose live events should re-fire them. Without `entities` a
7
+ * derived tree would sit stale until re-mount — the hand-wired path has the
8
+ * SSE refresh and the derived one must not lose it. */
9
+ export type CollectionNavProviders = {
10
+ readonly providers: Readonly<Record<string, TreeChildrenSubscribe>>;
11
+ readonly entities?: Readonly<Record<string, readonly string[]>>;
12
+ };
13
+ export type ClientFeatureDefinition = {
14
+ readonly name: string;
15
+ /** Context-Provider die um den kompletten Renderer-Tree gewrapped
16
+ * werden. Reihenfolge: erstes Element = äußerster Provider. Alle
17
+ * Provider stehen VOR allen Gates im Baum, damit jeder Gate und
18
+ * jedes Screen-Child darauf Zugriff hat. */
19
+ readonly providers?: readonly ComponentType<{
20
+ children: ReactNode;
21
+ }>[];
22
+ /** Screen-Decorators die zwischen dem Provider-Stack und dem Shell/
23
+ * Screen-Render sitzen. Typisches Muster: AuthGate rendert den
24
+ * LoginScreen statt children solange der User nicht eingeloggt ist.
25
+ * Reihenfolge: erstes Element = äußerster Gate. */
26
+ readonly gates?: readonly ComponentType<{
27
+ children: ReactNode;
28
+ }>[];
29
+ /** Default-Translations die das Feature für seine UI-Strings
30
+ * mitbringt. Werden in den LocaleProvider als Fallback-Bundle
31
+ * eingehängt — der App-Resolver (z.B. i18next) hat Vorrang und kann
32
+ * einzelne Keys überschreiben, ohne dass die Feature-Bundles
33
+ * komplett ausgetauscht werden müssen. */
34
+ readonly translations?: TranslationsByLocale;
35
+ /** Custom-Screen-Components — Map screenId → React-Component. Wenn
36
+ * ein Schema-Screen `type: "custom"` hat, schaut KumikoScreen in
37
+ * diese Map (gemerged aus allen ClientFeatures) und rendert die
38
+ * passende Component. So muss kein Sample mehr im AppShell-Wrapper
39
+ * selbst routen. Convention: screenId entspricht dem `id` aus
40
+ * `r.screen({ id, type: "custom", ... })` im server-side Feature. */
41
+ readonly components?: Readonly<Record<string, ComponentType>>;
42
+ /** Column-Renderer-Components — Map renderer-name → React-Component.
43
+ * Schema deklariert eine Column mit
44
+ * `renderer: { react: { __component: "ColorSwatch" } }`; client-side
45
+ * zieht der DataTable-Cell-Renderer den Component hier raus.
46
+ * Schemas bleiben so serializable (nur ein String-Key auf der Wire),
47
+ * echte JSX-Renderer leben im Client-Bundle. Last-Wins bei Key-
48
+ * Kollision über mehrere Features. */
49
+ readonly columnRenderers?: Readonly<Record<string, ColumnRendererComponent>>;
50
+ /** Extension-Section-Components — Map `__component`-name → React-
51
+ * Component. Schema deklariert eine entityEdit-Section mit
52
+ * `kind: "extension"` + `component: { react: { __component: "X" } }`;
53
+ * RenderEdit zieht den Component hier raus und mountet ihn mit
54
+ * `{ entityName, entityId }`. Pattern wie columnRenderers — Last-Wins
55
+ * bei Key-Kollision über mehrere Features. */
56
+ readonly extensionSectionComponents?: Readonly<Record<string, ExtensionSectionComponent>>;
57
+ /** Handlers for RowAction `kind: "clientAction"`, keyed by the action name
58
+ * `<feature>:<kebab>`. Last-wins with a warning on key collisions, like
59
+ * columnRenderers. */
60
+ readonly clientActions?: Readonly<Record<string, ClientActionHandler>>;
61
+ /** Nav-Provider für die EINE Nav (Visual-Tree-Merge): hängt dynamische
62
+ * Children an einen statischen `r.nav({ provider: true })`-Knoten. Keyed
63
+ * auf die LOKALE nav-id (create-app qualifiziert zu `<feature>:nav:<id>`;
64
+ * bereits qualifizierte QNs gehen durch). Anders als `treeProvider` (ein
65
+ * Top-Level-Branch pro Feature) attacht ein navProvider an einen konkreten
66
+ * Nav-Knoten — der idiomatic Weg seit dem Tree→Nav-Merge. */
67
+ readonly navProviders?: Readonly<Record<string, TreeChildrenSubscribe>>;
68
+ /** SSE-Entity-Listen pro nav-id für den Live-Refresh der navProviders
69
+ * (analog `treeEntities`). Live-Event für eine Entity → Provider des
70
+ * Knotens wird neu aufgerufen → neue Kinder erscheinen live. */
71
+ readonly navEntities?: Readonly<Record<string, readonly string[]>>;
72
+ /** Nav providers derived from the app schema — called with every
73
+ * `r.contentCollection()` the app declares. A feature that serves any
74
+ * number of collections (template-resolver) builds one provider per
75
+ * collection this way, without the app writing navId + kind a second time
76
+ * and without the renderer having to know bundled-features. Merged with
77
+ * `navProviders`; the static map wins on key collision (explicit beats
78
+ * derived). */
79
+ readonly navProvidersFromCollections?: (collections: readonly QualifiedContentCollection[]) => CollectionNavProviders;
80
+ /** Content editor components — map `contentFormat` ("plain" | "rich" | "markdown" | "document") →
81
+ * React component. `r.contentCollection()` declares which format an
82
+ * editor edits; the collection's editor UI (template-resolver's
83
+ * TextBlockEditor et al.) looks the component up here and falls back to
84
+ * a plain textarea when no clientFeature registered one for that
85
+ * format. Same last-wins semantics as columnRenderers. Public component
86
+ * contract: `{ value, onChange, variables, readOnly }`. */
87
+ readonly contentEditors?: Partial<Record<ContentEditorFormat, ContentEditorComponent>>;
88
+ /** Editor-Resolver-Komponenten pro featureId:action-Key. Wenn ein
89
+ * TreeNode mit target angeklickt wird, schlägt der EditorPanel das
90
+ * Component hier nach und rendert es. Komponenten erhalten target
91
+ * (mit args) und eine onClose-Callback. Ohne registrierten Resolver
92
+ * zeigt der EditorPanel einen Info-Fallback.
93
+ * Siehe visual-tree.md V.1.2. */
94
+ readonly resolvers?: Readonly<Record<string, ComponentType<{
95
+ readonly target: TargetRef;
96
+ readonly onClose: () => void;
97
+ }>>>;
98
+ };
99
+ /** Wickelt einen ReactNode durch eine Liste von Providern/Gates von
100
+ * innen nach außen — erstes Array-Element ist äußerste Hülle.
101
+ * Der Key nutzt den Component-Display-Namen (falls gesetzt) plus
102
+ * Index, damit Mounts stabil bleiben solange die Wrapper-Liste
103
+ * ihre Reihenfolge nicht ändert. */
104
+ export declare function stackWrappers(wrappers: readonly ComponentType<{
105
+ children: ReactNode;
106
+ }>[], inner: ReactNode): ReactNode;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Wickelt einen ReactNode durch eine Liste von Providern/Gates von
3
+ * innen nach außen — erstes Array-Element ist äußerste Hülle.
4
+ * Der Key nutzt den Component-Display-Namen (falls gesetzt) plus
5
+ * Index, damit Mounts stabil bleiben solange die Wrapper-Liste
6
+ * ihre Reihenfolge nicht ändert. */
7
+ export function stackWrappers(wrappers, inner) {
8
+ return wrappers.reduceRight((acc, Wrapper, i) => {
9
+ const key = `${Wrapper.displayName ?? Wrapper.name ?? "wrapper"}-${i}`;
10
+ return _jsx(Wrapper, { children: acc }, key);
11
+ }, inner);
12
+ }
@@ -0,0 +1,104 @@
1
+ import type { TreeChildrenSubscribe } from "@cosmicdrift/kumiko-framework/engine";
2
+ import { type ErrorInfo, type ReactNode } from "react";
3
+ import { type Root } from "react-dom/client";
4
+ import type { Dispatcher, ListRowViewModel, LocaleResolver, Translate } from "../../headless/index.ts";
5
+ import { type AppSchema, type ContentEditorComponent, type DraftStorage, type FeatureSchema, type FormWidth, type NavApi, type PrimitivesRegistry, type QualifiedContentCollection } from "../../index.ts";
6
+ import { type ClientFeatureDefinition } from "./client-plugin.tsx";
7
+ export declare function qualifyNavProviderKey(feature: string, id: string): string;
8
+ export declare function buildNavProviderMaps(clientFeatures: readonly ClientFeatureDefinition[], collections: readonly QualifiedContentCollection[]): {
9
+ readonly navProviders: ReadonlyMap<string, TreeChildrenSubscribe>;
10
+ readonly navEntities: ReadonlyMap<string, readonly string[]>;
11
+ };
12
+ export type BoundaryErrorHandler = (error: Error, info: ErrorInfo) => void;
13
+ export type CreateKumikoAppOptions = {
14
+ /** Called when the screen or root error boundary catches an error, after it
15
+ * was logged with console.error — attach telemetry here. */
16
+ readonly onError?: BoundaryErrorHandler;
17
+ /** App schema. Accepts AppSchema (multi-feature) or the legacy
18
+ * FeatureSchema (single-feature) — toAppSchema() normalizes internally.
19
+ *
20
+ * Optional. Resolution order: this option, then
21
+ * `window.__KUMIKO_SCHEMA__` (only for explicit/custom builds, e.g. e2e
22
+ * fixtures that bake it into the page themselves — the dev-server no
23
+ * longer injects it), then a client-side fetch to the authenticated
24
+ * `GET /api/schema` once the clientFeature gates (e.g. an auth gate)
25
+ * have let rendering through. Without an explicit
26
+ * schema, mounting shows a loading/unauthorized/error state until the
27
+ * fetch resolves instead of throwing at boot. */
28
+ readonly schema?: AppSchema | FeatureSchema;
29
+ readonly rootId?: string;
30
+ readonly dispatcher?: Dispatcher;
31
+ /** URL of the authenticated schema endpoint, fetched when no `schema` is
32
+ * given. Default `/api/schema` (same origin). Set an absolute URL when the
33
+ * API lives on another origin than the SPA (e.g. a `baseUrl` on
34
+ * `createLiveDispatcher`); a cross-origin URL is fetched with
35
+ * `credentials: "include"`. */
36
+ readonly schemaUrl?: string;
37
+ /** RenderEdit's create-mode draftId storage (issue #1913) — where a
38
+ * same-tab reload finds which of several parallel create-sessions on a
39
+ * screen to resume. Default: `createBrowserDraftStorage()`
40
+ * (sessionStorage-backed). Apps that don't want any client-side draftId
41
+ * persistence can pass a no-op impl; RenderEdit still resolves via its
42
+ * `form-draft:query:list` mount-time fallback either way. */
43
+ readonly draftStorage?: DraftStorage;
44
+ readonly screenQn?: string;
45
+ readonly translate?: Translate;
46
+ /** Row-click fallback for entities with no declared `detailFor` screen
47
+ * (fw#2164) — a `detailFor` screen always wins over this option. */
48
+ readonly onRowClick?: (row: ListRowViewModel, entityName: string) => void;
49
+ /** App-Shell. Bekommt das resolved `schema` als Prop — so können
50
+ * AppShell-Komponenten an WorkspaceShell/DefaultAppShell durchreichen
51
+ * ohne selbst das Schema zu importieren oder auf window-Globals zu
52
+ * greifen. */
53
+ readonly shell?: (props: {
54
+ readonly children: ReactNode;
55
+ readonly schema: AppSchema;
56
+ }) => ReactNode;
57
+ readonly primitives?: Partial<PrimitivesRegistry>;
58
+ /** Feature-gelieferte Client-Extensions. Jedes Element bringt
59
+ * Provider + Gates mit — siehe ClientFeatureDefinition. Beispiel:
60
+ * `clientFeatures: [emailPasswordClient()]` für Session+Login. */
61
+ readonly clientFeatures?: readonly ClientFeatureDefinition[];
62
+ /** App-level LocaleResolver. Typischerweise ein Adapter um i18next
63
+ * oder eine eigene Store-Impl. Wenn nicht gesetzt → Static-Default
64
+ * (`locale: "en"`, `translate: key → key`); Plugin-Translations
65
+ * springen dann als Fallback ein. */
66
+ readonly locale?: LocaleResolver;
67
+ /** Nav-Adapter — ein React-Hook der eine NavApi-Instanz liefert
68
+ * (route + navigate + hrefFor). Default: `useBrowserNavApi`, das
69
+ * window.history als Source-of-Truth benutzt. Wer einen anderen
70
+ * Router anbinden will (TanStack Router, Expo Linking auf Mobile,
71
+ * Memory-Router in Tests) übergibt hier seinen eigenen Hook.
72
+ *
73
+ * Der Hook wird EINMAL im Component-Tree aufgerufen (siehe
74
+ * `BrowserNavBoot`), muss also den React-Rules-of-Hooks folgen —
75
+ * `useSyncExternalStore` auf der zugrundeliegenden Router-State
76
+ * ist das gängige Pattern.
77
+ *
78
+ * Wenn das Schema Workspaces deklariert, wird der Adapter mit
79
+ * `{ hasWorkspaces: true }` aufgerufen — der Default-Hook nutzt das
80
+ * um das URL-Pattern auf `/<workspace>/<screen>[/<entityId>]`
81
+ * umzustellen. Eigene Adapter dürfen die Option ignorieren wenn ihr
82
+ * Router das anders löst. `features` ist `app.features` — der
83
+ * Default-Hook braucht sie für resolveTarget() (ObjectTarget →
84
+ * ScreenTarget); eigene Adapter die nie ein ObjectTarget bekommen,
85
+ * dürfen sie ignorieren. */
86
+ readonly navAdapter?: (options?: {
87
+ readonly hasWorkspaces?: boolean;
88
+ readonly features?: readonly FeatureSchema[];
89
+ }) => NavApi;
90
+ /** App-wide default width for form/detail screens that don't set their
91
+ * own `layout.width` (fw#2656). Default "4xl" (unchanged behavior) — a
92
+ * consumer app that wants e.g. bundled-feature screens to match its own
93
+ * full-width lists passes `screenWidth: "full"` once here instead of
94
+ * forking every screen it doesn't own. Per-screen `layout.width` always
95
+ * wins over this default. */
96
+ readonly screenWidth?: FormWidth;
97
+ };
98
+ export declare function firstOpenScreenQn(features: readonly FeatureSchema[]): string | undefined;
99
+ export declare function firstLandingScreenQnForProjectedSchema(features: readonly FeatureSchema[]): string | undefined;
100
+ export declare function resolveRootScreenQn(features: readonly FeatureSchema[], explicitScreenQn: string | undefined, schemaIsRoleProjected: boolean): string | undefined;
101
+ export declare function mergeContentEditors(clientFeatures: readonly ClientFeatureDefinition[]): Record<string, ContentEditorComponent>;
102
+ export declare function createKumikoApp(options?: CreateKumikoAppOptions): {
103
+ readonly root: Root;
104
+ };