@cosmicdrift/kumiko-renderer 0.374.0 → 0.378.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 (477) 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 +10 -7
  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/form-derivation-patch.d.ts +8 -0
  30. package/dist/components/form-derivation-patch.js +24 -0
  31. package/dist/components/form-screen-layout.d.ts +13 -0
  32. package/dist/components/form-screen-layout.js +13 -0
  33. package/dist/components/grid-cell-for-field.d.ts +1 -1
  34. package/dist/components/multi-select-checkboxes.d.ts +1 -1
  35. package/dist/components/multi-select-checkboxes.js +1 -1
  36. package/dist/components/query-options-select.d.ts +1 -1
  37. package/dist/components/related-list-section.d.ts +1 -1
  38. package/dist/components/render-edit-logic.d.ts +1 -1
  39. package/dist/components/render-edit-types.d.ts +6 -3
  40. package/dist/components/render-edit.d.ts +1 -1
  41. package/dist/components/render-edit.js +18 -3
  42. package/dist/components/render-field.d.ts +1 -1
  43. package/dist/components/render-field.js +12 -2
  44. package/dist/components/render-list.d.ts +1 -1
  45. package/dist/components/render-list.js +20 -4
  46. package/dist/components/write-form-section.d.ts +1 -1
  47. package/dist/components/write-form-section.js +1 -1
  48. package/dist/context/dispatcher-context.d.ts +1 -1
  49. package/dist/file-ids-of.d.ts +1 -0
  50. package/dist/file-ids-of.js +7 -0
  51. package/dist/flow-diagram/icons.d.ts +3 -0
  52. package/dist/flow-diagram/icons.js +14 -0
  53. package/dist/flow-diagram/index.d.ts +2 -0
  54. package/dist/flow-diagram/index.js +1 -0
  55. package/dist/flow-diagram/render.d.ts +3 -0
  56. package/dist/flow-diagram/render.js +234 -0
  57. package/dist/flow-diagram/types.d.ts +18 -0
  58. package/dist/flow-diagram/types.js +1 -0
  59. package/dist/format-when.js +1 -1
  60. package/dist/headless/apex/css.d.ts +3 -0
  61. package/dist/headless/apex/css.js +298 -0
  62. package/dist/headless/apex/index.d.ts +236 -0
  63. package/dist/headless/apex/index.js +377 -0
  64. package/dist/headless/apex/lightbox.d.ts +4 -0
  65. package/dist/headless/apex/lightbox.js +81 -0
  66. package/dist/headless/contracts/asset.d.ts +15 -0
  67. package/dist/headless/contracts/asset.js +17 -0
  68. package/dist/headless/contracts/index.d.ts +3 -0
  69. package/dist/headless/contracts/index.js +1 -0
  70. package/dist/headless/contracts/locale.d.ts +7 -0
  71. package/dist/headless/contracts/locale.js +11 -0
  72. package/dist/headless/contracts/primitives.d.ts +93 -0
  73. package/dist/headless/contracts/primitives.js +21 -0
  74. package/dist/headless/dispatcher/index.d.ts +2 -0
  75. package/dist/headless/dispatcher/index.js +1 -0
  76. package/dist/headless/dispatcher/types.d.ts +86 -0
  77. package/dist/headless/dispatcher/types.js +34 -0
  78. package/dist/headless/form/form-controller.d.ts +2 -0
  79. package/dist/headless/form/form-controller.js +409 -0
  80. package/dist/headless/form/index.d.ts +3 -0
  81. package/dist/headless/form/index.js +2 -0
  82. package/dist/headless/form/types.d.ts +76 -0
  83. package/dist/headless/form/types.js +1 -0
  84. package/dist/headless/form/zod-bridge.d.ts +10 -0
  85. package/dist/headless/form/zod-bridge.js +103 -0
  86. package/dist/headless/format/document-values.d.ts +12 -0
  87. package/dist/headless/format/document-values.js +70 -0
  88. package/dist/headless/format/escape.d.ts +5 -0
  89. package/dist/headless/format/escape.js +75 -0
  90. package/dist/headless/format/html-template.d.ts +9 -0
  91. package/dist/headless/format/html-template.js +39 -0
  92. package/dist/headless/format/index.d.ts +12 -0
  93. package/dist/headless/format/index.js +237 -0
  94. package/dist/headless/format/money.d.ts +3 -0
  95. package/dist/headless/format/money.js +39 -0
  96. package/dist/headless/index.d.ts +14 -0
  97. package/dist/headless/index.js +9 -0
  98. package/dist/headless/locale-routing/index.d.ts +41 -0
  99. package/dist/headless/locale-routing/index.js +145 -0
  100. package/dist/headless/nav/index.d.ts +2 -0
  101. package/dist/headless/nav/index.js +1 -0
  102. package/dist/headless/nav/resolve.d.ts +2 -0
  103. package/dist/headless/nav/resolve.js +71 -0
  104. package/dist/headless/nav/types.d.ts +26 -0
  105. package/dist/headless/nav/types.js +1 -0
  106. package/dist/headless/store/create-store.d.ts +2 -0
  107. package/dist/headless/store/create-store.js +43 -0
  108. package/dist/headless/store/equality.d.ts +1 -0
  109. package/dist/headless/store/equality.js +34 -0
  110. package/dist/headless/store/index.d.ts +3 -0
  111. package/dist/headless/store/index.js +2 -0
  112. package/dist/headless/store/types.d.ts +7 -0
  113. package/dist/headless/store/types.js +10 -0
  114. package/dist/headless/view-model/edit.d.ts +21 -0
  115. package/dist/headless/view-model/edit.js +512 -0
  116. package/dist/headless/view-model/embedded-list.d.ts +27 -0
  117. package/dist/headless/view-model/embedded-list.js +63 -0
  118. package/dist/headless/view-model/index.d.ts +7 -0
  119. package/dist/headless/view-model/index.js +3 -0
  120. package/dist/headless/view-model/list-file-display.d.ts +3 -0
  121. package/dist/headless/view-model/list-file-display.js +27 -0
  122. package/dist/headless/view-model/list.d.ts +16 -0
  123. package/dist/headless/view-model/list.js +229 -0
  124. package/dist/headless/view-model/types.d.ts +382 -0
  125. package/dist/headless/view-model/types.js +1 -0
  126. package/dist/hooks/use-ai-text.d.ts +1 -1
  127. package/dist/hooks/use-form.d.ts +1 -1
  128. package/dist/hooks/use-form.js +1 -1
  129. package/dist/hooks/use-mutation.d.ts +1 -1
  130. package/dist/hooks/use-query.d.ts +1 -1
  131. package/dist/hooks/use-store.d.ts +1 -1
  132. package/dist/hooks/use-store.js +7 -7
  133. package/dist/hooks/use-stream-handler.d.ts +1 -1
  134. package/dist/i18n-defaults.js +6 -0
  135. package/dist/i18n.d.ts +1 -1
  136. package/dist/i18n.js +1 -1
  137. package/dist/index.d.ts +3 -1
  138. package/dist/index.js +5 -4
  139. package/dist/live/csrf.d.ts +2 -0
  140. package/dist/live/csrf.js +60 -0
  141. package/dist/live/dispatcher-live.d.ts +7 -0
  142. package/dist/live/dispatcher-live.js +286 -0
  143. package/dist/live/envelopes.d.ts +101 -0
  144. package/dist/live/envelopes.js +35 -0
  145. package/dist/live/error-mapping.d.ts +16 -0
  146. package/dist/live/error-mapping.js +82 -0
  147. package/dist/live/index.d.ts +7 -0
  148. package/dist/live/index.js +5 -0
  149. package/dist/live/locale.d.ts +2 -0
  150. package/dist/live/locale.js +25 -0
  151. package/dist/live/sse-stream.d.ts +14 -0
  152. package/dist/live/sse-stream.js +128 -0
  153. package/dist/primitives.d.ts +45 -36
  154. package/dist/primitives.js +1 -1
  155. package/dist/session/session-ended.d.ts +1 -1
  156. package/dist/tokens.d.ts +3 -4
  157. package/dist/tokens.js +4 -5
  158. package/dist/web/app/app-schema-boot.d.ts +19 -0
  159. package/dist/web/app/app-schema-boot.js +124 -0
  160. package/dist/web/app/browser-locale.d.ts +22 -0
  161. package/dist/web/app/browser-locale.js +78 -0
  162. package/dist/web/app/client-plugin.d.ts +106 -0
  163. package/dist/web/app/client-plugin.js +12 -0
  164. package/dist/web/app/create-app.d.ts +104 -0
  165. package/dist/web/app/create-app.js +498 -0
  166. package/dist/web/app/create-public-surface.d.ts +36 -0
  167. package/dist/web/app/create-public-surface.js +40 -0
  168. package/dist/web/app/dashboard-body.d.ts +3 -0
  169. package/dist/web/app/dashboard-body.js +865 -0
  170. package/dist/web/app/dashboard-refresh.d.ts +6 -0
  171. package/dist/web/app/dashboard-refresh.js +15 -0
  172. package/dist/web/app/document-lang-sync.d.ts +4 -0
  173. package/dist/web/app/document-lang-sync.js +27 -0
  174. package/dist/web/app/draft-storage.d.ts +11 -0
  175. package/dist/web/app/draft-storage.js +53 -0
  176. package/dist/web/app/nav-providers-context.d.ts +13 -0
  177. package/dist/web/app/nav-providers-context.js +18 -0
  178. package/dist/web/app/nav.d.ts +40 -0
  179. package/dist/web/app/nav.js +231 -0
  180. package/dist/web/app/plain-content-editor.d.ts +3 -0
  181. package/dist/web/app/plain-content-editor.js +30 -0
  182. package/dist/web/app/relative-time.d.ts +10 -0
  183. package/dist/web/app/relative-time.js +56 -0
  184. package/dist/web/app/resolvers-context.d.ts +12 -0
  185. package/dist/web/app/resolvers-context.js +10 -0
  186. package/dist/web/app/rich-content-editor.d.ts +3 -0
  187. package/dist/web/app/rich-content-editor.js +15 -0
  188. package/dist/web/app/root-error-fallback.d.ts +2 -0
  189. package/dist/web/app/root-error-fallback.js +21 -0
  190. package/dist/web/app/screen-error-fallback.d.ts +6 -0
  191. package/dist/web/app/screen-error-fallback.js +17 -0
  192. package/dist/web/app/tiptap-editor.d.ts +3 -0
  193. package/dist/web/app/tiptap-editor.js +120 -0
  194. package/dist/web/app/toast-action-notifier.d.ts +5 -0
  195. package/dist/web/app/toast-action-notifier.js +17 -0
  196. package/dist/web/components/config-cascade.d.ts +13 -0
  197. package/dist/web/components/config-cascade.js +155 -0
  198. package/dist/web/components/config-source-badge.d.ts +6 -0
  199. package/dist/web/components/config-source-badge.js +55 -0
  200. package/dist/web/default-color-scheme.d.ts +2 -0
  201. package/dist/web/default-color-scheme.js +3 -0
  202. package/dist/web/icons.d.ts +94 -0
  203. package/dist/web/icons.js +100 -0
  204. package/dist/web/index.d.ts +78 -0
  205. package/dist/web/index.js +53 -0
  206. package/dist/web/layout/app-layout.d.ts +21 -0
  207. package/dist/web/layout/app-layout.js +8 -0
  208. package/dist/web/layout/avatar.d.ts +12 -0
  209. package/dist/web/layout/avatar.js +63 -0
  210. package/dist/web/layout/default-app-shell.d.ts +41 -0
  211. package/dist/web/layout/default-app-shell.js +16 -0
  212. package/dist/web/layout/editor-panel.d.ts +10 -0
  213. package/dist/web/layout/editor-panel.js +29 -0
  214. package/dist/web/layout/fill-classes.d.ts +9 -0
  215. package/dist/web/layout/fill-classes.js +15 -0
  216. package/dist/web/layout/filter-app-schema-navs.d.ts +7 -0
  217. package/dist/web/layout/filter-app-schema-navs.js +68 -0
  218. package/dist/web/layout/header-action-group.d.ts +6 -0
  219. package/dist/web/layout/header-action-group.js +8 -0
  220. package/dist/web/layout/header-overflow-menu.d.ts +4 -0
  221. package/dist/web/layout/header-overflow-menu.js +8 -0
  222. package/dist/web/layout/language-menu-items.d.ts +8 -0
  223. package/dist/web/layout/language-menu-items.js +16 -0
  224. package/dist/web/layout/language-switcher.d.ts +25 -0
  225. package/dist/web/layout/language-switcher.js +46 -0
  226. package/dist/web/layout/nav-tree.d.ts +19 -0
  227. package/dist/web/layout/nav-tree.js +536 -0
  228. package/dist/web/layout/page-header-slot.d.ts +25 -0
  229. package/dist/web/layout/page-header-slot.js +50 -0
  230. package/dist/web/layout/profile-menu.d.ts +13 -0
  231. package/dist/web/layout/profile-menu.js +6 -0
  232. package/dist/web/layout/shell-breadcrumb.d.ts +11 -0
  233. package/dist/web/layout/shell-breadcrumb.js +34 -0
  234. package/dist/web/layout/shell-header.d.ts +12 -0
  235. package/dist/web/layout/shell-header.js +159 -0
  236. package/dist/web/layout/sidebar-brand.d.ts +15 -0
  237. package/dist/web/layout/sidebar-brand.js +9 -0
  238. package/dist/web/layout/sidebar-panel.d.ts +41 -0
  239. package/dist/web/layout/sidebar-panel.js +107 -0
  240. package/dist/web/layout/sidebar-user.d.ts +8 -0
  241. package/dist/web/layout/sidebar-user.js +17 -0
  242. package/dist/web/layout/sidebar.d.ts +17 -0
  243. package/dist/web/layout/sidebar.js +11 -0
  244. package/dist/web/layout/target-resolver-stub.d.ts +13 -0
  245. package/dist/web/layout/target-resolver-stub.js +61 -0
  246. package/dist/web/layout/target-url.d.ts +12 -0
  247. package/dist/web/layout/target-url.js +77 -0
  248. package/dist/web/layout/theme-label.d.ts +15 -0
  249. package/dist/web/layout/theme-label.js +35 -0
  250. package/dist/web/layout/theme-menu-item.d.ts +12 -0
  251. package/dist/web/layout/theme-menu-item.js +16 -0
  252. package/dist/web/layout/theme-toggle.d.ts +17 -0
  253. package/dist/web/layout/theme-toggle.js +22 -0
  254. package/dist/web/layout/topbar.d.ts +8 -0
  255. package/dist/web/layout/topbar.js +4 -0
  256. package/dist/web/layout/workspace-shell.d.ts +63 -0
  257. package/dist/web/layout/workspace-shell.js +220 -0
  258. package/dist/web/layout/workspace-switcher.d.ts +15 -0
  259. package/dist/web/layout/workspace-switcher.js +36 -0
  260. package/dist/web/lib/accept-attr.d.ts +1 -0
  261. package/dist/web/lib/accept-attr.js +6 -0
  262. package/dist/web/lib/clamp.d.ts +1 -0
  263. package/dist/web/lib/clamp.js +3 -0
  264. package/dist/web/lib/cn.d.ts +6 -0
  265. package/dist/web/lib/cn.js +9 -0
  266. package/dist/web/lib/download.d.ts +2 -0
  267. package/dist/web/lib/download.js +24 -0
  268. package/dist/web/lib/file-ref-download.d.ts +15 -0
  269. package/dist/web/lib/file-ref-download.js +62 -0
  270. package/dist/web/lib/file-upload-form-data.d.ts +7 -0
  271. package/dist/web/lib/file-upload-form-data.js +11 -0
  272. package/dist/web/lib/resize-image.d.ts +1 -0
  273. package/dist/web/lib/resize-image.js +66 -0
  274. package/dist/web/lib/upload-file-ref.d.ts +9 -0
  275. package/dist/web/lib/upload-file-ref.js +29 -0
  276. package/dist/web/primitives/action-menu.d.ts +34 -0
  277. package/dist/web/primitives/action-menu.js +30 -0
  278. package/dist/web/primitives/calendar-popover.d.ts +13 -0
  279. package/dist/web/primitives/calendar-popover.js +76 -0
  280. package/dist/web/primitives/combobox.d.ts +56 -0
  281. package/dist/web/primitives/combobox.js +127 -0
  282. package/dist/web/primitives/date-field.d.ts +18 -0
  283. package/dist/web/primitives/date-field.js +74 -0
  284. package/dist/web/primitives/date-input.d.ts +1 -0
  285. package/dist/web/primitives/date-input.js +5 -0
  286. package/dist/web/primitives/date-parse.d.ts +11 -0
  287. package/dist/web/primitives/date-parse.js +159 -0
  288. package/dist/web/primitives/dialog.d.ts +3 -0
  289. package/dist/web/primitives/dialog.js +42 -0
  290. package/dist/web/primitives/drawer.d.ts +3 -0
  291. package/dist/web/primitives/drawer.js +17 -0
  292. package/dist/web/primitives/dropdown-menu.d.ts +15 -0
  293. package/dist/web/primitives/dropdown-menu.js +56 -0
  294. package/dist/web/primitives/embedded-list-input.d.ts +9 -0
  295. package/dist/web/primitives/embedded-list-input.js +382 -0
  296. package/dist/web/primitives/file-thumbnail.d.ts +31 -0
  297. package/dist/web/primitives/file-thumbnail.js +90 -0
  298. package/dist/web/primitives/file-upload.d.ts +21 -0
  299. package/dist/web/primitives/file-upload.js +56 -0
  300. package/dist/web/primitives/file-value-list.d.ts +3 -0
  301. package/dist/web/primitives/file-value-list.js +22 -0
  302. package/dist/web/primitives/index.d.ts +34 -0
  303. package/dist/web/primitives/index.js +2023 -0
  304. package/dist/web/primitives/json-view.d.ts +7 -0
  305. package/dist/web/primitives/json-view.js +84 -0
  306. package/dist/web/primitives/layout.d.ts +27 -0
  307. package/dist/web/primitives/layout.js +30 -0
  308. package/dist/web/primitives/lightbox.d.ts +3 -0
  309. package/dist/web/primitives/lightbox.js +36 -0
  310. package/dist/web/primitives/locale-number.d.ts +2 -0
  311. package/dist/web/primitives/locale-number.js +54 -0
  312. package/dist/web/primitives/located-timestamp-input.d.ts +22 -0
  313. package/dist/web/primitives/located-timestamp-input.js +22 -0
  314. package/dist/web/primitives/metric.d.ts +5 -0
  315. package/dist/web/primitives/metric.js +18 -0
  316. package/dist/web/primitives/modal-shell.d.ts +17 -0
  317. package/dist/web/primitives/modal-shell.js +9 -0
  318. package/dist/web/primitives/modal.d.ts +3 -0
  319. package/dist/web/primitives/modal.js +13 -0
  320. package/dist/web/primitives/money-input.d.ts +18 -0
  321. package/dist/web/primitives/money-input.js +122 -0
  322. package/dist/web/primitives/narrow-pinned-footer.d.ts +12 -0
  323. package/dist/web/primitives/narrow-pinned-footer.js +153 -0
  324. package/dist/web/primitives/number-input.d.ts +18 -0
  325. package/dist/web/primitives/number-input.js +53 -0
  326. package/dist/web/primitives/option-groups.d.ts +11 -0
  327. package/dist/web/primitives/option-groups.js +27 -0
  328. package/dist/web/primitives/page-header.d.ts +3 -0
  329. package/dist/web/primitives/page-header.js +52 -0
  330. package/dist/web/primitives/promo-panel.d.ts +3 -0
  331. package/dist/web/primitives/promo-panel.js +11 -0
  332. package/dist/web/primitives/segmented-select.d.ts +21 -0
  333. package/dist/web/primitives/segmented-select.js +62 -0
  334. package/dist/web/primitives/share-actions.d.ts +4 -0
  335. package/dist/web/primitives/share-actions.js +56 -0
  336. package/dist/web/primitives/status-badge.d.ts +3 -0
  337. package/dist/web/primitives/status-badge.js +5 -0
  338. package/dist/web/primitives/sticky-action-bar.d.ts +5 -0
  339. package/dist/web/primitives/sticky-action-bar.js +15 -0
  340. package/dist/web/primitives/tabs.d.ts +3 -0
  341. package/dist/web/primitives/tabs.js +107 -0
  342. package/dist/web/primitives/timestamp-input.d.ts +27 -0
  343. package/dist/web/primitives/timestamp-input.js +87 -0
  344. package/dist/web/primitives/toast.d.ts +19 -0
  345. package/dist/web/primitives/toast.js +63 -0
  346. package/dist/web/primitives/tz-input.d.ts +11 -0
  347. package/dist/web/primitives/tz-input.js +8 -0
  348. package/dist/web/primitives/tz-options.d.ts +4 -0
  349. package/dist/web/primitives/tz-options.js +17 -0
  350. package/dist/web/primitives/use-keyboard-inset.d.ts +1 -0
  351. package/dist/web/primitives/use-keyboard-inset.js +28 -0
  352. package/dist/web/primitives/use-narrow-viewport.d.ts +4 -0
  353. package/dist/web/primitives/use-narrow-viewport.js +46 -0
  354. package/dist/web/react-css-custom-properties.d.ts +6 -0
  355. package/dist/web/react-css-custom-properties.js +1 -0
  356. package/dist/web/sse/live-events.d.ts +15 -0
  357. package/dist/web/sse/live-events.js +148 -0
  358. package/dist/web/theme-plugin.d.ts +41 -0
  359. package/dist/web/theme-plugin.js +123 -0
  360. package/dist/web/tokens.d.ts +24 -0
  361. package/dist/web/tokens.js +203 -0
  362. package/dist/web/ui/avatar.d.ts +11 -0
  363. package/dist/web/ui/avatar.js +25 -0
  364. package/dist/web/ui/badge.d.ts +9 -0
  365. package/dist/web/ui/badge.js +26 -0
  366. package/dist/web/ui/breadcrumb.d.ts +11 -0
  367. package/dist/web/ui/breadcrumb.js +29 -0
  368. package/dist/web/ui/button.d.ts +10 -0
  369. package/dist/web/ui/button.js +37 -0
  370. package/dist/web/ui/checkbox.d.ts +4 -0
  371. package/dist/web/ui/checkbox.js +11 -0
  372. package/dist/web/ui/input.d.ts +3 -0
  373. package/dist/web/ui/input.js +8 -0
  374. package/dist/web/ui/label.d.ts +4 -0
  375. package/dist/web/ui/label.js +10 -0
  376. package/dist/web/ui/resizable.d.ts +7 -0
  377. package/dist/web/ui/resizable.js +16 -0
  378. package/dist/web/ui/separator.d.ts +4 -0
  379. package/dist/web/ui/separator.js +10 -0
  380. package/dist/web/ui/sheet.d.ts +14 -0
  381. package/dist/web/ui/sheet.js +42 -0
  382. package/dist/web/ui/sidebar.d.ts +73 -0
  383. package/dist/web/ui/sidebar.js +211 -0
  384. package/dist/web/ui/skeleton.d.ts +2 -0
  385. package/dist/web/ui/skeleton.js +7 -0
  386. package/dist/web/ui/switch.d.ts +6 -0
  387. package/dist/web/ui/switch.js +10 -0
  388. package/dist/web/ui/table.d.ts +10 -0
  389. package/dist/web/ui/table.js +30 -0
  390. package/dist/web/ui/tabs.d.ts +11 -0
  391. package/dist/web/ui/tabs.js +31 -0
  392. package/dist/web/ui/textarea.d.ts +3 -0
  393. package/dist/web/ui/textarea.js +8 -0
  394. package/dist/web/ui/tooltip.d.ts +7 -0
  395. package/dist/web/ui/tooltip.js +19 -0
  396. package/dist/web/ui/use-mobile.d.ts +1 -0
  397. package/dist/web/ui/use-mobile.js +16 -0
  398. package/dist/web/version/update-checker.d.ts +9 -0
  399. package/dist/web/version/update-checker.js +88 -0
  400. package/dist/web/widgets/ai-text-field.d.ts +36 -0
  401. package/dist/web/widgets/ai-text-field.js +137 -0
  402. package/dist/web/widgets/bounded-load-cache.d.ts +1 -0
  403. package/dist/web/widgets/bounded-load-cache.js +25 -0
  404. package/dist/web/widgets/chart-window.d.ts +58 -0
  405. package/dist/web/widgets/chart-window.js +190 -0
  406. package/dist/web/widgets/charts.d.ts +208 -0
  407. package/dist/web/widgets/charts.js +685 -0
  408. package/dist/web/widgets/collapsible-section.d.ts +10 -0
  409. package/dist/web/widgets/collapsible-section.js +17 -0
  410. package/dist/web/widgets/dashboard-list.d.ts +21 -0
  411. package/dist/web/widgets/dashboard-list.js +45 -0
  412. package/dist/web/widgets/detail-list.d.ts +15 -0
  413. package/dist/web/widgets/detail-list.js +8 -0
  414. package/dist/web/widgets/drawer.d.ts +65 -0
  415. package/dist/web/widgets/drawer.js +177 -0
  416. package/dist/web/widgets/feed-list.d.ts +13 -0
  417. package/dist/web/widgets/feed-list.js +9 -0
  418. package/dist/web/widgets/floating-panel.d.ts +30 -0
  419. package/dist/web/widgets/floating-panel.js +242 -0
  420. package/dist/web/widgets/form-fields.d.ts +93 -0
  421. package/dist/web/widgets/form-fields.js +50 -0
  422. package/dist/web/widgets/index.d.ts +28 -0
  423. package/dist/web/widgets/index.js +31 -0
  424. package/dist/web/widgets/infinity-list.d.ts +46 -0
  425. package/dist/web/widgets/infinity-list.js +211 -0
  426. package/dist/web/widgets/mode-switch.d.ts +21 -0
  427. package/dist/web/widgets/mode-switch.js +25 -0
  428. package/dist/web/widgets/pdf-preview.d.ts +10 -0
  429. package/dist/web/widgets/pdf-preview.js +140 -0
  430. package/dist/web/widgets/photo-slots.d.ts +29 -0
  431. package/dist/web/widgets/photo-slots.js +52 -0
  432. package/dist/web/widgets/plan-card.d.ts +36 -0
  433. package/dist/web/widgets/plan-card.js +13 -0
  434. package/dist/web/widgets/progress-bar.d.ts +19 -0
  435. package/dist/web/widgets/progress-bar.js +24 -0
  436. package/dist/web/widgets/progress-list.d.ts +19 -0
  437. package/dist/web/widgets/progress-list.js +11 -0
  438. package/dist/web/widgets/public-shell.d.ts +22 -0
  439. package/dist/web/widgets/public-shell.js +15 -0
  440. package/dist/web/widgets/query-table.d.ts +29 -0
  441. package/dist/web/widgets/query-table.js +30 -0
  442. package/dist/web/widgets/result-panel.d.ts +69 -0
  443. package/dist/web/widgets/result-panel.js +30 -0
  444. package/dist/web/widgets/section-card.d.ts +12 -0
  445. package/dist/web/widgets/section-card.js +9 -0
  446. package/dist/web/widgets/sheet-parts.d.ts +9 -0
  447. package/dist/web/widgets/sheet-parts.js +11 -0
  448. package/dist/web/widgets/side-by-side-table.d.ts +31 -0
  449. package/dist/web/widgets/side-by-side-table.js +11 -0
  450. package/dist/web/widgets/stat.d.ts +54 -0
  451. package/dist/web/widgets/stat.js +65 -0
  452. package/dist/web/widgets/states.d.ts +23 -0
  453. package/dist/web/widgets/states.js +20 -0
  454. package/dist/web/widgets/status-badge.d.ts +15 -0
  455. package/dist/web/widgets/status-badge.js +24 -0
  456. package/dist/web/widgets/step-bar.d.ts +35 -0
  457. package/dist/web/widgets/step-bar.js +60 -0
  458. package/dist/web/widgets/upload-zone.d.ts +24 -0
  459. package/dist/web/widgets/upload-zone.js +108 -0
  460. package/dist/web/widgets/use-draft.d.ts +20 -0
  461. package/dist/web/widgets/use-draft.js +21 -0
  462. package/dist/web/widgets/use-pointer-drag.d.ts +21 -0
  463. package/dist/web/widgets/use-pointer-drag.js +53 -0
  464. package/package.json +114 -7
  465. package/src/changes.json +92 -0
  466. package/src/web/fonts/OFL.txt +93 -0
  467. package/src/web/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  468. package/src/web/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
  469. package/src/web/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  470. package/src/web/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
  471. package/src/web/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  472. package/src/web/fonts/ibm-plex-sans-latin-500.woff2 +0 -0
  473. package/src/web/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  474. package/src/web/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  475. package/src/web/fonts/ibm-plex-sans-latin-ext-500.woff2 +0 -0
  476. package/src/web/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  477. package/src/web/styles.css +405 -0
@@ -0,0 +1,242 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { GripVerticalIcon } from "lucide-react";
3
+ import { useCallback, useEffect, useId, useRef, useState, } from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { useTranslation } from "../../index.js";
6
+ import { clamp } from "../lib/clamp.js";
7
+ import { cn } from "../lib/cn.js";
8
+ import { useIsNarrowViewport } from "../primitives/use-narrow-viewport.js";
9
+ import { arrowKeyDelta, usePointerDrag } from "./use-pointer-drag.js";
10
+ const MARGIN_PX = 24;
11
+ const DEFAULT_WIDTH_PX = 400;
12
+ const DEFAULT_HEIGHT_PX = 560;
13
+ const DEFAULT_MIN_WIDTH_PX = 280;
14
+ const DEFAULT_MIN_HEIGHT_PX = 200;
15
+ const EDGES = ["top", "right", "bottom", "left"];
16
+ const EDGE_HANDLE_BASE = "absolute z-10 touch-none hover:bg-border focus-visible:bg-ring";
17
+ const CORNER_HANDLE_BASE = "absolute z-20 size-3 touch-none";
18
+ const EDGE_HANDLE_CLASS = {
19
+ top: cn(EDGE_HANDLE_BASE, "inset-x-3 top-0 h-1.5 cursor-ns-resize"),
20
+ bottom: cn(EDGE_HANDLE_BASE, "inset-x-3 bottom-0 h-1.5 cursor-ns-resize"),
21
+ left: cn(EDGE_HANDLE_BASE, "inset-y-3 left-0 w-1.5 cursor-ew-resize"),
22
+ right: cn(EDGE_HANDLE_BASE, "inset-y-3 right-0 w-1.5 cursor-ew-resize"),
23
+ };
24
+ const CORNER_HANDLES = [
25
+ { edges: ["top", "left"], className: cn(CORNER_HANDLE_BASE, "top-0 left-0 cursor-nwse-resize") },
26
+ {
27
+ edges: ["top", "right"],
28
+ className: cn(CORNER_HANDLE_BASE, "top-0 right-0 cursor-nesw-resize"),
29
+ },
30
+ {
31
+ edges: ["bottom", "left"],
32
+ className: cn(CORNER_HANDLE_BASE, "bottom-0 left-0 cursor-nesw-resize"),
33
+ },
34
+ {
35
+ edges: ["bottom", "right"],
36
+ className: cn(CORNER_HANDLE_BASE, "right-0 bottom-0 cursor-nwse-resize"),
37
+ },
38
+ ];
39
+ const EDGE_LABEL_KEYS = {
40
+ top: "kumiko.widget.floatingPanel.resizeTop",
41
+ right: "kumiko.widget.floatingPanel.resizeRight",
42
+ bottom: "kumiko.widget.floatingPanel.resizeBottom",
43
+ left: "kumiko.widget.floatingPanel.resizeLeft",
44
+ };
45
+ const DRAG_HANDLE_SELECTOR = "[data-drag-handle]";
46
+ const INTERACTIVE_HEADER_TARGET = "button, a, input, select, textarea, [role=button]";
47
+ function readLimits(options) {
48
+ const viewportWidth = window.innerWidth;
49
+ const viewportHeight = window.innerHeight;
50
+ const maxWidth = Math.min(options.maxWidthPx ?? viewportWidth - 2 * MARGIN_PX, viewportWidth);
51
+ const maxHeight = Math.min(options.maxHeightPx ?? viewportHeight - 2 * MARGIN_PX, viewportHeight);
52
+ return {
53
+ // A viewport smaller than the configured minimum wins: the panel must stay fully visible.
54
+ minWidth: Math.min(options.minWidthPx ?? DEFAULT_MIN_WIDTH_PX, maxWidth),
55
+ minHeight: Math.min(options.minHeightPx ?? DEFAULT_MIN_HEIGHT_PX, maxHeight),
56
+ maxWidth,
57
+ maxHeight,
58
+ viewportWidth,
59
+ viewportHeight,
60
+ };
61
+ }
62
+ // Size first, then position, so a shrunk panel is placed against its final size.
63
+ function fitGeometry(geometry, limits) {
64
+ const width = clamp(geometry.width, limits.minWidth, limits.maxWidth);
65
+ const height = clamp(geometry.height, limits.minHeight, limits.maxHeight);
66
+ return {
67
+ width,
68
+ height,
69
+ x: clamp(geometry.x, 0, Math.max(0, limits.viewportWidth - width)),
70
+ y: clamp(geometry.y, 0, Math.max(0, limits.viewportHeight - height)),
71
+ };
72
+ }
73
+ // The edge being dragged follows the pointer; the opposite edge stays put.
74
+ function resizeAxis(start, delta, movesStartEdge, min, max, viewportSize) {
75
+ if (movesStartEdge) {
76
+ const end = start.position + start.size;
77
+ const size = clamp(start.size - delta, min, Math.min(max, end));
78
+ return { position: end - size, size };
79
+ }
80
+ const size = clamp(start.size + delta, min, Math.min(max, viewportSize - start.position));
81
+ return { position: start.position, size };
82
+ }
83
+ function resizeGeometry(start, edges, delta, limits) {
84
+ let { x, y, width, height } = start;
85
+ for (const edge of edges) {
86
+ if (edge === "left" || edge === "right") {
87
+ ({ position: x, size: width } = resizeAxis({ position: start.x, size: start.width }, delta.dx, edge === "left", limits.minWidth, limits.maxWidth, limits.viewportWidth));
88
+ }
89
+ else {
90
+ ({ position: y, size: height } = resizeAxis({ position: start.y, size: start.height }, delta.dy, edge === "top", limits.minHeight, limits.maxHeight, limits.viewportHeight));
91
+ }
92
+ }
93
+ return { x, y, width, height };
94
+ }
95
+ function isFiniteNumber(value) {
96
+ return typeof value === "number" && Number.isFinite(value);
97
+ }
98
+ function isFloatingPanelGeometry(value) {
99
+ return (typeof value === "object" &&
100
+ value !== null &&
101
+ "x" in value &&
102
+ isFiniteNumber(value.x) &&
103
+ "y" in value &&
104
+ isFiniteNumber(value.y) &&
105
+ "width" in value &&
106
+ isFiniteNumber(value.width) &&
107
+ "height" in value &&
108
+ isFiniteNumber(value.height));
109
+ }
110
+ function readStoredGeometry(storageKey) {
111
+ if (storageKey === undefined)
112
+ return undefined;
113
+ try {
114
+ const raw = window.localStorage.getItem(storageKey);
115
+ if (raw === null)
116
+ return undefined;
117
+ const parsed = JSON.parse(raw);
118
+ return isFloatingPanelGeometry(parsed) ? parsed : undefined;
119
+ }
120
+ catch {
121
+ // Unavailable or corrupt storage just means the default geometry is used.
122
+ return undefined;
123
+ }
124
+ }
125
+ function writeStoredGeometry(storageKey, geometry) {
126
+ if (storageKey === undefined)
127
+ return;
128
+ try {
129
+ window.localStorage.setItem(storageKey, JSON.stringify(geometry));
130
+ }
131
+ catch {
132
+ // Private mode or quota: the position is simply not remembered.
133
+ }
134
+ }
135
+ function initialGeometry(storageKey, defaults, limits) {
136
+ const stored = readStoredGeometry(storageKey);
137
+ if (stored !== undefined)
138
+ return fitGeometry(stored, limits);
139
+ const width = defaults?.width ?? DEFAULT_WIDTH_PX;
140
+ const height = defaults?.height ?? DEFAULT_HEIGHT_PX;
141
+ return fitGeometry({
142
+ width,
143
+ height,
144
+ x: defaults?.x ?? limits.viewportWidth - width - MARGIN_PX,
145
+ y: defaults?.y ?? limits.viewportHeight - height - MARGIN_PX,
146
+ }, limits);
147
+ }
148
+ /** Non-modal panel floating above the page: draggable by its header,
149
+ * resizable from all edges and corners, clamped to the viewport, geometry
150
+ * optionally remembered. On narrow viewports it becomes a full-screen sheet. */
151
+ export function FloatingPanel({ title, headerActions, children, storageKey, defaultGeometry, minWidthPx, minHeightPx, maxWidthPx, maxHeightPx, testId, }) {
152
+ const t = useTranslation();
153
+ const narrow = useIsNarrowViewport();
154
+ const titleId = useId();
155
+ const getLimits = () => readLimits({ minWidthPx, minHeightPx, maxWidthPx, maxHeightPx });
156
+ const getLimitsRef = useRef(getLimits);
157
+ getLimitsRef.current = getLimits;
158
+ const [geometry, setGeometry] = useState(() => initialGeometry(storageKey, defaultGeometry, getLimits()));
159
+ const geometryRef = useRef(geometry);
160
+ geometryRef.current = geometry;
161
+ const applyGeometry = useCallback((next) => {
162
+ geometryRef.current = next;
163
+ setGeometry(next);
164
+ }, []);
165
+ const persistGeometry = () => writeStoredGeometry(storageKey, geometryRef.current);
166
+ useEffect(() => {
167
+ if (narrow)
168
+ return;
169
+ const onWindowResize = () => {
170
+ applyGeometry(fitGeometry(geometryRef.current, getLimitsRef.current()));
171
+ };
172
+ // Resize events fired while narrow were ignored, so re-fit once on the way back to wide.
173
+ onWindowResize();
174
+ window.addEventListener("resize", onWindowResize);
175
+ return () => window.removeEventListener("resize", onWindowResize);
176
+ }, [narrow, applyGeometry]);
177
+ const moveDrag = usePointerDrag({
178
+ onStart: () => geometryRef.current,
179
+ onMove: (start, { dx, dy }) => applyGeometry(fitGeometry({ ...start, x: start.x + dx, y: start.y + dy }, getLimits())),
180
+ onEnd: persistGeometry,
181
+ });
182
+ const onHeaderPointerDown = (event) => {
183
+ // React events from portalled children (menus) bubble through the header although their DOM is elsewhere.
184
+ if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target))
185
+ return;
186
+ if (event.target instanceof Element &&
187
+ event.target.closest(INTERACTIVE_HEADER_TARGET) &&
188
+ !event.target.closest(DRAG_HANDLE_SELECTOR)) {
189
+ return;
190
+ }
191
+ moveDrag.onPointerDown(event);
192
+ };
193
+ const onGripKeyDown = (event) => {
194
+ const delta = arrowKeyDelta(event);
195
+ if (delta === undefined)
196
+ return;
197
+ event.preventDefault();
198
+ const current = geometryRef.current;
199
+ applyGeometry(fitGeometry({ ...current, x: current.x + delta.dx, y: current.y + delta.dy }, getLimits()));
200
+ persistGeometry();
201
+ };
202
+ if (typeof document === "undefined")
203
+ return null;
204
+ if (narrow) {
205
+ return createPortal(_jsxs("div", { role: "dialog", "aria-modal": "false", "aria-labelledby": titleId, "data-testid": testId, className: "fixed inset-0 z-50 flex flex-col bg-background text-foreground", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b px-3 py-2", children: [_jsx("div", { id: titleId, className: "min-w-0 flex-1 truncate font-medium", children: title }), headerActions] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto p-4", children: children })] }), document.body);
206
+ }
207
+ const limits = getLimits();
208
+ const handleContext = {
209
+ geometryRef,
210
+ getLimits,
211
+ applyGeometry,
212
+ persistGeometry,
213
+ };
214
+ return createPortal(_jsxs("div", { role: "dialog", "aria-modal": "false", "aria-labelledby": titleId, "data-testid": testId, className: "fixed z-50 flex flex-col overflow-hidden rounded-lg border bg-background text-foreground shadow-2xl", style: {
215
+ left: geometry.x,
216
+ top: geometry.y,
217
+ width: geometry.width,
218
+ height: geometry.height,
219
+ }, children: [_jsxs("div", { ...moveDrag, onPointerDown: onHeaderPointerDown, className: "flex shrink-0 cursor-grab touch-none select-none items-center gap-2 border-b bg-muted px-3 py-2 active:cursor-grabbing", children: [_jsx("button", { type: "button", "data-drag-handle": "", "aria-label": t("kumiko.widget.floatingPanel.move"), onKeyDown: onGripKeyDown, className: "rounded-xs p-1 text-muted-foreground hover:bg-secondary focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-hidden", children: _jsx(GripVerticalIcon, { className: "size-4" }) }), _jsx("div", { id: titleId, className: "min-w-0 flex-1 truncate font-medium", children: title }), headerActions] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto p-4", children: children }), EDGES.map((edge) => (_jsx(PanelResizeHandle, { edges: [edge], className: EDGE_HANDLE_CLASS[edge], context: handleContext, separator: { label: t(EDGE_LABEL_KEYS[edge]), geometry, limits } }, edge))), CORNER_HANDLES.map((corner) => (_jsx(PanelResizeHandle, { edges: corner.edges, className: corner.className, context: handleContext }, corner.edges.join("-"))))] }), document.body);
220
+ }
221
+ function PanelResizeHandle({ edges, className, context, separator, }) {
222
+ const drag = usePointerDrag({
223
+ onStart: () => context.geometryRef.current,
224
+ onMove: (start, delta) => context.applyGeometry(resizeGeometry(start, edges, delta, context.getLimits())),
225
+ onEnd: context.persistGeometry,
226
+ });
227
+ if (separator === undefined) {
228
+ return _jsx("div", { "aria-hidden": "true", ...drag, className: className });
229
+ }
230
+ const [edge] = edges;
231
+ const horizontalEdge = edge === "left" || edge === "right";
232
+ const { geometry, limits } = separator;
233
+ const onKeyDown = (event) => {
234
+ const delta = arrowKeyDelta(event);
235
+ if (delta === undefined || (horizontalEdge ? delta.dx === 0 : delta.dy === 0))
236
+ return;
237
+ event.preventDefault();
238
+ context.applyGeometry(resizeGeometry(context.geometryRef.current, edges, delta, context.getLimits()));
239
+ context.persistGeometry();
240
+ };
241
+ return (_jsx("div", { role: "separator", "aria-orientation": horizontalEdge ? "vertical" : "horizontal", "aria-label": separator.label, "aria-valuenow": horizontalEdge ? geometry.width : geometry.height, "aria-valuemin": horizontalEdge ? limits.minWidth : limits.minHeight, "aria-valuemax": horizontalEdge ? limits.maxWidth : limits.maxHeight, tabIndex: 0, ...drag, onKeyDown: onKeyDown, className: className }));
242
+ }
@@ -0,0 +1,93 @@
1
+ import type { ReactNode } from "react";
2
+ export interface NumberFieldProps {
3
+ readonly label: string;
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly value: number | undefined;
7
+ readonly onChange: (v: number | undefined) => void;
8
+ readonly required?: boolean;
9
+ readonly disabled?: boolean;
10
+ readonly hideLabel?: boolean;
11
+ readonly testId?: string;
12
+ /** `false` renders without thousands separators (e.g. a year). Default `true`. */
13
+ readonly grouping?: boolean;
14
+ }
15
+ /** Zahlenfeld = Field + Input(kind:"number") in einem — nimmt der Screen die
16
+ * wiederholte id/name/value/onChange-Verdrahtung ab. `value` darf `undefined`
17
+ * sein (leeres Feld), intern auf den `""`-Empty-State des Inputs gemappt.
18
+ * Einheiten (€/%) gehören ins Label (`t("…Summe (€)")`), nicht als Badge. */
19
+ export declare function NumberField({ label, id, name, value, onChange, required, disabled, hideLabel, testId, grouping, }: NumberFieldProps): ReactNode;
20
+ export declare const MoneyField: typeof NumberField;
21
+ export declare const PercentField: typeof NumberField;
22
+ interface FieldBase {
23
+ readonly label: string;
24
+ readonly id: string;
25
+ readonly name: string;
26
+ readonly required?: boolean;
27
+ readonly disabled?: boolean;
28
+ readonly hideLabel?: boolean;
29
+ readonly testId?: string;
30
+ }
31
+ export interface TextFieldProps extends FieldBase {
32
+ readonly value: string;
33
+ readonly onChange: (v: string) => void;
34
+ readonly placeholder?: string;
35
+ readonly autoComplete?: string;
36
+ }
37
+ /** Textfeld = Field + Input(kind:"text"). */
38
+ export declare function TextField({ label, id, name, value, onChange, required, disabled, placeholder, autoComplete, hideLabel, testId, }: TextFieldProps): ReactNode;
39
+ export interface SelectFieldProps extends FieldBase {
40
+ readonly value: string;
41
+ readonly onChange: (v: string) => void;
42
+ readonly options: readonly string[] | readonly {
43
+ readonly value: string;
44
+ readonly label: string;
45
+ }[];
46
+ }
47
+ /** Auswahlfeld = Field + Input(kind:"select"). */
48
+ export declare function SelectField({ label, id, name, value, onChange, options, required, disabled, hideLabel, testId, }: SelectFieldProps): ReactNode;
49
+ export interface DateFieldProps extends FieldBase {
50
+ readonly value: string;
51
+ readonly onChange: (v: string) => void;
52
+ readonly min?: string;
53
+ readonly max?: string;
54
+ }
55
+ /** Datumsfeld = Field + Input(kind:"date"), ISO yyyy-mm-dd. */
56
+ export declare function DateField({ label, id, name, value, onChange, min, max, required, disabled, hideLabel, testId, }: DateFieldProps): ReactNode;
57
+ export interface BooleanFieldProps extends FieldBase {
58
+ readonly value: boolean;
59
+ readonly onChange: (v: boolean) => void;
60
+ }
61
+ /** Checkbox/Switch = Field(layout:"inline") + Input(kind:"boolean"). */
62
+ export declare function BooleanField({ label, id, name, value, onChange, required, disabled, hideLabel, testId, }: BooleanFieldProps): ReactNode;
63
+ export interface TextareaFieldProps extends FieldBase {
64
+ readonly value: string;
65
+ readonly onChange: (v: string) => void;
66
+ readonly rows?: number;
67
+ }
68
+ /** Mehrzeiliges Textfeld = Field + Input(kind:"textarea"). */
69
+ export declare function TextareaField({ label, id, name, value, onChange, rows, required, disabled, hideLabel, testId, }: TextareaFieldProps): ReactNode;
70
+ export interface RangeFieldProps extends FieldBase {
71
+ readonly value: number;
72
+ readonly onChange: (v: number) => void;
73
+ readonly min: number;
74
+ readonly max: number;
75
+ readonly step?: number;
76
+ }
77
+ /** Schieberegler = Field + Input(kind:"range"). */
78
+ export declare function RangeField({ label, id, name, value, onChange, min, max, step, required, disabled, hideLabel, testId, }: RangeFieldProps): ReactNode;
79
+ export interface FileFieldProps extends FieldBase {
80
+ /** FileRef-UUID der gespeicherten Datei, oder null. */
81
+ readonly value: string | null;
82
+ readonly onChange: (fileId: string | null) => void;
83
+ readonly accept?: readonly string[];
84
+ /** "image" zeigt eine Vorschau, "file" nur den Dateinamen. Default "file". */
85
+ readonly variant?: "file" | "image";
86
+ /** Bindet den Upload an ein konkretes Entity-Feld — der `/api/files`-Endpoint
87
+ * prüft `accept`/`maxSize` dann serverseitig gegen dessen Feld-Definition. */
88
+ readonly entityType?: string;
89
+ readonly fieldName?: string;
90
+ }
91
+ /** Datei-Upload = Field + Input(kind:"file"|"image") — FileRef-basiert. */
92
+ export declare function FileField({ label, id, name, value, onChange, accept, variant, entityType, fieldName, required, disabled, hideLabel, testId, }: FileFieldProps): ReactNode;
93
+ export {};
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { usePrimitives } from "../../index.js";
3
+ /** Zahlenfeld = Field + Input(kind:"number") in einem — nimmt der Screen die
4
+ * wiederholte id/name/value/onChange-Verdrahtung ab. `value` darf `undefined`
5
+ * sein (leeres Feld), intern auf den `""`-Empty-State des Inputs gemappt.
6
+ * Einheiten (€/%) gehören ins Label (`t("…Summe (€)")`), nicht als Badge. */
7
+ export function NumberField({ label, id, name, value, onChange, required, disabled, hideLabel, testId, grouping, }) {
8
+ const { Field, Input } = usePrimitives();
9
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "number", id: id, name: name, value: value ?? "", onChange: onChange, required: required, disabled: disabled, ...(grouping !== undefined && { grouping }) }) }));
10
+ }
11
+ // Aliase markieren die Feld-Absicht am Call-Site (lesbarer als NumberField
12
+ // überall) ohne eigene Wrapper-Funktion vorzutäuschen — beide sind identisch
13
+ // zu NumberField, kein Ort für künftige geld-/prozent-spezifische Formatierung.
14
+ export const MoneyField = NumberField;
15
+ export const PercentField = NumberField;
16
+ /** Textfeld = Field + Input(kind:"text"). */
17
+ export function TextField({ label, id, name, value, onChange, required, disabled, placeholder, autoComplete, hideLabel, testId, }) {
18
+ const { Field, Input } = usePrimitives();
19
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "text", id: id, name: name, value: value, onChange: onChange, required: required, disabled: disabled, ...(placeholder !== undefined && { placeholder }), ...(autoComplete !== undefined && { autoComplete }) }) }));
20
+ }
21
+ /** Auswahlfeld = Field + Input(kind:"select"). */
22
+ export function SelectField({ label, id, name, value, onChange, options, required, disabled, hideLabel, testId, }) {
23
+ const { Field, Input } = usePrimitives();
24
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "select", id: id, name: name, value: value, onChange: onChange, options: options, required: required, disabled: disabled }) }));
25
+ }
26
+ /** Datumsfeld = Field + Input(kind:"date"), ISO yyyy-mm-dd. */
27
+ export function DateField({ label, id, name, value, onChange, min, max, required, disabled, hideLabel, testId, }) {
28
+ const { Field, Input } = usePrimitives();
29
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "date", id: id, name: name, value: value, onChange: (v) => onChange(v ?? ""), required: required, disabled: disabled, ...(min !== undefined && { min }), ...(max !== undefined && { max }) }) }));
30
+ }
31
+ /** Checkbox/Switch = Field(layout:"inline") + Input(kind:"boolean"). */
32
+ export function BooleanField({ label, id, name, value, onChange, required, disabled, hideLabel, testId, }) {
33
+ const { Field, Input } = usePrimitives();
34
+ return (_jsx(Field, { id: id, label: label, required: required, layout: "inline", hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "boolean", id: id, name: name, value: value, onChange: onChange, required: required, disabled: disabled }) }));
35
+ }
36
+ /** Mehrzeiliges Textfeld = Field + Input(kind:"textarea"). */
37
+ export function TextareaField({ label, id, name, value, onChange, rows, required, disabled, hideLabel, testId, }) {
38
+ const { Field, Input } = usePrimitives();
39
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "textarea", id: id, name: name, value: value, onChange: onChange, required: required, disabled: disabled, ...(rows !== undefined && { rows }) }) }));
40
+ }
41
+ /** Schieberegler = Field + Input(kind:"range"). */
42
+ export function RangeField({ label, id, name, value, onChange, min, max, step, required, disabled, hideLabel, testId, }) {
43
+ const { Field, Input } = usePrimitives();
44
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: "range", id: id, name: name, value: value, onChange: onChange, min: min, max: max, required: required, disabled: disabled, ...(step !== undefined && { step }) }) }));
45
+ }
46
+ /** Datei-Upload = Field + Input(kind:"file"|"image") — FileRef-basiert. */
47
+ export function FileField({ label, id, name, value, onChange, accept, variant = "file", entityType, fieldName, required, disabled, hideLabel, testId, }) {
48
+ const { Field, Input } = usePrimitives();
49
+ return (_jsx(Field, { id: id, label: label, required: required, hideLabel: hideLabel, testId: testId, children: _jsx(Input, { kind: variant, id: id, name: name, value: value, onChange: onChange, required: required, disabled: disabled, ...(accept !== undefined && { accept }), ...(entityType !== undefined && { entityType }), ...(fieldName !== undefined && { fieldName }) }) }));
50
+ }
@@ -0,0 +1,28 @@
1
+ export { AiTextArea, type AiTextAreaProps, AiTextField, type AiTextFieldProps, } from "./ai-text-field.tsx";
2
+ export type { StackedAreaDateFormat, StackedAreaInitialWindow, StackedAreaRangeOption, StackedAreaRanges, StackedAreaWindowSelection, } from "./chart-window.ts";
3
+ export { type ChartMarker, type ChartSeries, type ChartTone, SegmentBarChart, type SegmentBarRow, StackedAreaChart, StackedBarChart, StatusBarChart, type StatusBarEntry, smoothPath, TimeseriesChart, type TimeseriesHeight, type TimeseriesPoint, type TimeseriesReferenceLine, type TimeseriesXAxis, type TimeseriesYAxis, } from "./charts.tsx";
4
+ export { CollapsibleSection } from "./collapsible-section.tsx";
5
+ export { type DashboardListColumn, DashboardListTable } from "./dashboard-list.tsx";
6
+ export { DetailList } from "./detail-list.tsx";
7
+ export { Drawer, type DrawerProps } from "./drawer.tsx";
8
+ export { FeedList, type FeedRow } from "./feed-list.tsx";
9
+ export { FloatingPanel, type FloatingPanelGeometry, type FloatingPanelProps, } from "./floating-panel.tsx";
10
+ export { BooleanField, type BooleanFieldProps, DateField, type DateFieldProps, FileField, type FileFieldProps, MoneyField, NumberField, type NumberFieldProps, PercentField, RangeField, type RangeFieldProps, SelectField, type SelectFieldProps, TextareaField, type TextareaFieldProps, TextField, type TextFieldProps, } from "./form-fields.tsx";
11
+ export { InfinityList, type InfinityListProps, type InfinityListSelection, } from "./infinity-list.tsx";
12
+ export { ModeSwitch, type ModeSwitchVariant } from "./mode-switch.tsx";
13
+ export { PdfPreview, type PdfPreviewSource } from "./pdf-preview.tsx";
14
+ export { type PhotoSlotSpec, PhotoSlots, type PhotoSlotsProps } from "./photo-slots.tsx";
15
+ export { PlanCard, type PlanCardActionSlot, type PlanCardLinkSlot, type PlanCardPrice, type PlanCardProps, PlanGrid, type PlanGridProps, } from "./plan-card.tsx";
16
+ export { ProgressBar } from "./progress-bar.tsx";
17
+ export { ProgressList, type ProgressListRow } from "./progress-list.tsx";
18
+ export { PublicShell, type PublicShellProps, type PublicShellVariant } from "./public-shell.tsx";
19
+ export { QueryTable, type QueryTableColumn, type QueryTableProps } from "./query-table.tsx";
20
+ export { type ComparisonMetric, ComparisonTable, type ResultColumn, ResultPanel, ResultTable, } from "./result-panel.tsx";
21
+ export { SectionCard } from "./section-card.tsx";
22
+ export { SideBySideTable, type SideBySideTableCell, type SideBySideTableColumn, type SideBySideTableRow, } from "./side-by-side-table.tsx";
23
+ export { MiniStat, Sparkline, StatCard, type StatDelta, StatStripCell, type StatTone, } from "./stat.tsx";
24
+ export { EmptyState, ErrorState, LoadingState } from "./states.tsx";
25
+ export { STATUS_TONE_TEXT, StatusBadge, type StatusBadgeTone, type StatusTone, } from "./status-badge.tsx";
26
+ export { StepBar } from "./step-bar.tsx";
27
+ export { UploadZone, type UploadZoneProps } from "./upload-zone.tsx";
28
+ export { useDraft } from "./use-draft.ts";
@@ -0,0 +1,31 @@
1
+ // Mid-Level-Widgets — Kompositionen über den Primitives (Card, DataTable,
2
+ // Banner) + Theme-Tokens. Für Custom-Screens: erst hier schauen, dann bauen.
3
+ // Katalog: docs.kumiko.rocks → Guides → Widgets; visueller Überblick im
4
+ // styleguide-Sample.
5
+ export { AiTextArea, AiTextField, } from "./ai-text-field.js";
6
+ export { SegmentBarChart, StackedAreaChart, StackedBarChart, StatusBarChart, smoothPath, TimeseriesChart, } from "./charts.js";
7
+ export { CollapsibleSection } from "./collapsible-section.js";
8
+ export { DashboardListTable } from "./dashboard-list.js";
9
+ export { DetailList } from "./detail-list.js";
10
+ export { Drawer } from "./drawer.js";
11
+ export { FeedList } from "./feed-list.js";
12
+ export { FloatingPanel, } from "./floating-panel.js";
13
+ export { BooleanField, DateField, FileField, MoneyField, NumberField, PercentField, RangeField, SelectField, TextareaField, TextField, } from "./form-fields.js";
14
+ export { InfinityList, } from "./infinity-list.js";
15
+ export { ModeSwitch } from "./mode-switch.js";
16
+ export { PdfPreview } from "./pdf-preview.js";
17
+ export { PhotoSlots } from "./photo-slots.js";
18
+ export { PlanCard, PlanGrid, } from "./plan-card.js";
19
+ export { ProgressBar } from "./progress-bar.js";
20
+ export { ProgressList } from "./progress-list.js";
21
+ export { PublicShell } from "./public-shell.js";
22
+ export { QueryTable } from "./query-table.js";
23
+ export { ComparisonTable, ResultPanel, ResultTable, } from "./result-panel.js";
24
+ export { SectionCard } from "./section-card.js";
25
+ export { SideBySideTable, } from "./side-by-side-table.js";
26
+ export { MiniStat, Sparkline, StatCard, StatStripCell, } from "./stat.js";
27
+ export { EmptyState, ErrorState, LoadingState } from "./states.js";
28
+ export { STATUS_TONE_TEXT, StatusBadge, } from "./status-badge.js";
29
+ export { StepBar } from "./step-bar.js";
30
+ export { UploadZone } from "./upload-zone.js";
31
+ export { useDraft } from "./use-draft.js";
@@ -0,0 +1,46 @@
1
+ import { type ReactNode } from "react";
2
+ /** Position of the selected row among the rows loaded so far. `total`
3
+ * counts loaded rows only; `hasMore` says whether further pages exist. */
4
+ export type InfinityListSelection = {
5
+ readonly index: number;
6
+ readonly total: number;
7
+ readonly prevId: string | null;
8
+ readonly nextId: string | null;
9
+ readonly hasMore: boolean;
10
+ };
11
+ export type InfinityListProps<TData = unknown, TRow = Readonly<Record<string, unknown>>> = {
12
+ /** Dispatcher-Query-Type (`<feature>:query:<entity>:<verb>`). */
13
+ readonly query: string;
14
+ readonly payload?: Readonly<Record<string, unknown>>;
15
+ /** Rows per page — sent as `limit` in the query payload. Default 50. */
16
+ readonly pageSize?: number;
17
+ readonly rows: (data: TData) => readonly TRow[];
18
+ /** Pull the next-page cursor from the result; `null` means last page. */
19
+ readonly nextCursor: (data: TData) => string | null;
20
+ /** Must derive from row content (e.g. `row.id`), not from `index` — a
21
+ * live refresh reorders rows (new/changed rows move to the front). */
22
+ readonly rowId: (row: TRow, index: number) => string;
23
+ readonly renderRow: (row: TRow) => ReactNode;
24
+ readonly emptyState?: ReactNode;
25
+ readonly className?: string;
26
+ readonly testId?: string;
27
+ /** Subscribe to SSE events for the entity parsed from `query`
28
+ * (`<feature>:query:<entity>:<verb>`) and refetch the first page on
29
+ * any create/update/delete/restore event, merging it into the
30
+ * already-accumulated rows instead of collapsing them — see
31
+ * `useQuery`'s `live` option for the same convention. Default false. */
32
+ readonly live?: boolean;
33
+ /** Row id (as returned by `rowId`) whose position `onSelectionChange`
34
+ * reports. The list itself does not highlight it — `renderRow` does. */
35
+ readonly selectedId?: string | null;
36
+ /** Fires when the selected row's position or neighbours change, e.g. for
37
+ * a "message 4 of 6" header with previous/next buttons. Not called while
38
+ * nothing is selected or the selected row is not loaded. */
39
+ readonly onSelectionChange?: (selection: InfinityListSelection) => void;
40
+ };
41
+ /** Cursor-paginated scroll list (mail inbox, activity feeds) — loads the
42
+ * next page when the end sentinel becomes visible (IntersectionObserver),
43
+ * instead of a pager bar like QueryTable/entityList. The query handler
44
+ * receives `{ ...payload, limit, cursor? }` and returns rows plus the next
45
+ * cursor (same cursor convention as the audit-log screen). */
46
+ export declare function InfinityList<TData = unknown, TRow = Readonly<Record<string, unknown>>>({ query, payload, pageSize, rows, nextCursor, rowId, renderRow, emptyState, className, testId, live, selectedId, onSelectionChange, }: InfinityListProps<TData, TRow>): ReactNode;