@hjmds/react 1.41.2 → 1.43.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 (393) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +41 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +40 -3
  5. package/dist/actions.js.map +1 -1
  6. package/dist/activity-chip.d.ts.map +1 -1
  7. package/dist/activity-chip.js +1 -0
  8. package/dist/activity-chip.js.map +1 -1
  9. package/dist/advanced-display.d.ts +47 -14
  10. package/dist/advanced-display.d.ts.map +1 -1
  11. package/dist/advanced-display.js +72 -17
  12. package/dist/advanced-display.js.map +1 -1
  13. package/dist/advanced-forms.d.ts.map +1 -1
  14. package/dist/advanced-forms.js +1 -0
  15. package/dist/advanced-forms.js.map +1 -1
  16. package/dist/affix.d.ts +6 -1
  17. package/dist/affix.d.ts.map +1 -1
  18. package/dist/affix.js +5 -3
  19. package/dist/affix.js.map +1 -1
  20. package/dist/agreement.d.ts.map +1 -1
  21. package/dist/agreement.js +1 -0
  22. package/dist/agreement.js.map +1 -1
  23. package/dist/alert-dialog-queue.d.ts +24 -0
  24. package/dist/alert-dialog-queue.d.ts.map +1 -0
  25. package/dist/alert-dialog-queue.js +44 -0
  26. package/dist/alert-dialog-queue.js.map +1 -0
  27. package/dist/anchor.d.ts.map +1 -1
  28. package/dist/anchor.js +1 -0
  29. package/dist/anchor.js.map +1 -1
  30. package/dist/asset.d.ts.map +1 -1
  31. package/dist/asset.js +1 -0
  32. package/dist/asset.js.map +1 -1
  33. package/dist/auth-screen.d.ts.map +1 -1
  34. package/dist/auth-screen.js +1 -0
  35. package/dist/auth-screen.js.map +1 -1
  36. package/dist/avatar-blobatar-motion.d.ts.map +1 -1
  37. package/dist/avatar-blobatar-motion.js +1 -0
  38. package/dist/avatar-blobatar-motion.js.map +1 -1
  39. package/dist/avatar-blobatar.d.ts.map +1 -1
  40. package/dist/avatar-blobatar.js +1 -0
  41. package/dist/avatar-blobatar.js.map +1 -1
  42. package/dist/bottom-cta.d.ts.map +1 -1
  43. package/dist/bottom-cta.js +1 -0
  44. package/dist/bottom-cta.js.map +1 -1
  45. package/dist/bottom-info.d.ts.map +1 -1
  46. package/dist/bottom-info.js +1 -0
  47. package/dist/bottom-info.js.map +1 -1
  48. package/dist/bottom-navigation.d.ts.map +1 -1
  49. package/dist/bottom-navigation.js +1 -0
  50. package/dist/bottom-navigation.js.map +1 -1
  51. package/dist/breadcrumb.d.ts.map +1 -1
  52. package/dist/breadcrumb.js +1 -0
  53. package/dist/breadcrumb.js.map +1 -1
  54. package/dist/calendar.d.ts.map +1 -1
  55. package/dist/calendar.js +1 -0
  56. package/dist/calendar.js.map +1 -1
  57. package/dist/carousel-motion.d.ts.map +1 -1
  58. package/dist/carousel-motion.js +1 -0
  59. package/dist/carousel-motion.js.map +1 -1
  60. package/dist/carousel.d.ts.map +1 -1
  61. package/dist/carousel.js +1 -0
  62. package/dist/carousel.js.map +1 -1
  63. package/dist/celebration.d.ts.map +1 -1
  64. package/dist/celebration.js +1 -0
  65. package/dist/celebration.js.map +1 -1
  66. package/dist/chart.d.ts +7 -2
  67. package/dist/chart.d.ts.map +1 -1
  68. package/dist/chart.js +6 -3
  69. package/dist/chart.js.map +1 -1
  70. package/dist/choice-row.d.ts +10 -2
  71. package/dist/choice-row.d.ts.map +1 -1
  72. package/dist/choice-row.js +7 -3
  73. package/dist/choice-row.js.map +1 -1
  74. package/dist/clipboard.d.ts.map +1 -1
  75. package/dist/clipboard.js +1 -0
  76. package/dist/clipboard.js.map +1 -1
  77. package/dist/collapsible.d.ts.map +1 -1
  78. package/dist/collapsible.js +1 -0
  79. package/dist/collapsible.js.map +1 -1
  80. package/dist/collection-rail.d.ts.map +1 -1
  81. package/dist/collection-rail.js +3 -1
  82. package/dist/collection-rail.js.map +1 -1
  83. package/dist/color-picker.d.ts.map +1 -1
  84. package/dist/color-picker.js +1 -0
  85. package/dist/color-picker.js.map +1 -1
  86. package/dist/command-palette.d.ts.map +1 -1
  87. package/dist/command-palette.js +1 -0
  88. package/dist/command-palette.js.map +1 -1
  89. package/dist/communication.d.ts +92 -0
  90. package/dist/communication.d.ts.map +1 -1
  91. package/dist/communication.js +49 -1
  92. package/dist/communication.js.map +1 -1
  93. package/dist/content-transition.d.ts.map +1 -1
  94. package/dist/content-transition.js +1 -0
  95. package/dist/content-transition.js.map +1 -1
  96. package/dist/context-menu.d.ts.map +1 -1
  97. package/dist/context-menu.js +1 -0
  98. package/dist/context-menu.js.map +1 -1
  99. package/dist/conversation-row.d.ts.map +1 -1
  100. package/dist/conversation-row.js +1 -0
  101. package/dist/conversation-row.js.map +1 -1
  102. package/dist/data-table.d.ts.map +1 -1
  103. package/dist/data-table.js +1 -0
  104. package/dist/data-table.js.map +1 -1
  105. package/dist/date-entry.d.ts.map +1 -1
  106. package/dist/date-entry.js +1 -0
  107. package/dist/date-entry.js.map +1 -1
  108. package/dist/date-picker.d.ts.map +1 -1
  109. package/dist/date-picker.js +1 -0
  110. package/dist/date-picker.js.map +1 -1
  111. package/dist/date-range.d.ts.map +1 -1
  112. package/dist/date-range.js +1 -0
  113. package/dist/date-range.js.map +1 -1
  114. package/dist/design-profile.d.ts.map +1 -1
  115. package/dist/design-profile.js +1 -0
  116. package/dist/design-profile.js.map +1 -1
  117. package/dist/display.d.ts +21 -1
  118. package/dist/display.d.ts.map +1 -1
  119. package/dist/display.js +34 -8
  120. package/dist/display.js.map +1 -1
  121. package/dist/duration-field.d.ts.map +1 -1
  122. package/dist/duration-field.js +1 -0
  123. package/dist/duration-field.js.map +1 -1
  124. package/dist/effect-surface.d.ts.map +1 -1
  125. package/dist/effect-surface.js +1 -0
  126. package/dist/effect-surface.js.map +1 -1
  127. package/dist/evidence.d.ts +1 -1
  128. package/dist/evidence.js +1 -1
  129. package/dist/evidence.js.map +1 -1
  130. package/dist/feedback.d.ts.map +1 -1
  131. package/dist/feedback.js +1 -0
  132. package/dist/feedback.js.map +1 -1
  133. package/dist/field-group.d.ts.map +1 -1
  134. package/dist/field-group.js +1 -0
  135. package/dist/field-group.js.map +1 -1
  136. package/dist/file-picker.d.ts.map +1 -1
  137. package/dist/file-picker.js +1 -0
  138. package/dist/file-picker.js.map +1 -1
  139. package/dist/floating-action-button.d.ts.map +1 -1
  140. package/dist/floating-action-button.js +1 -0
  141. package/dist/floating-action-button.js.map +1 -1
  142. package/dist/folder-preview.d.ts.map +1 -1
  143. package/dist/folder-preview.js +1 -0
  144. package/dist/folder-preview.js.map +1 -1
  145. package/dist/forms.d.ts +30 -6
  146. package/dist/forms.d.ts.map +1 -1
  147. package/dist/forms.js +56 -14
  148. package/dist/forms.js.map +1 -1
  149. package/dist/gravity-letters.d.ts.map +1 -1
  150. package/dist/gravity-letters.js +1 -0
  151. package/dist/gravity-letters.js.map +1 -1
  152. package/dist/grid-reveal.d.ts.map +1 -1
  153. package/dist/grid-reveal.js +1 -0
  154. package/dist/grid-reveal.js.map +1 -1
  155. package/dist/heading.d.ts.map +1 -1
  156. package/dist/heading.js +1 -0
  157. package/dist/heading.js.map +1 -1
  158. package/dist/image-choice.d.ts.map +1 -1
  159. package/dist/image-choice.js +1 -0
  160. package/dist/image-choice.js.map +1 -1
  161. package/dist/image-comparison.d.ts.map +1 -1
  162. package/dist/image-comparison.js +1 -0
  163. package/dist/image-comparison.js.map +1 -1
  164. package/dist/image-viewer.d.ts +22 -1
  165. package/dist/image-viewer.d.ts.map +1 -1
  166. package/dist/image-viewer.js +14 -1
  167. package/dist/image-viewer.js.map +1 -1
  168. package/dist/index.d.ts +3 -3
  169. package/dist/index.d.ts.map +1 -1
  170. package/dist/index.js +1 -1
  171. package/dist/index.js.map +1 -1
  172. package/dist/inline-confirm.d.ts.map +1 -1
  173. package/dist/inline-confirm.js +1 -0
  174. package/dist/inline-confirm.js.map +1 -1
  175. package/dist/internal/document-resource.d.ts.map +1 -1
  176. package/dist/internal/document-resource.js +1 -0
  177. package/dist/internal/document-resource.js.map +1 -1
  178. package/dist/internal/initial-focus.d.ts.map +1 -1
  179. package/dist/internal/initial-focus.js +1 -0
  180. package/dist/internal/initial-focus.js.map +1 -1
  181. package/dist/internal/media-album.d.ts.map +1 -1
  182. package/dist/internal/media-album.js +1 -0
  183. package/dist/internal/media-album.js.map +1 -1
  184. package/dist/internal/message-reactions.d.ts.map +1 -1
  185. package/dist/internal/message-reactions.js +1 -0
  186. package/dist/internal/message-reactions.js.map +1 -1
  187. package/dist/internal/overlay-origin-motion.d.ts.map +1 -1
  188. package/dist/internal/overlay-origin-motion.js +1 -0
  189. package/dist/internal/overlay-origin-motion.js.map +1 -1
  190. package/dist/internal/pending-content.d.ts.map +1 -1
  191. package/dist/internal/pending-content.js +1 -0
  192. package/dist/internal/pending-content.js.map +1 -1
  193. package/dist/internal/photo-source-icon.d.ts.map +1 -1
  194. package/dist/internal/photo-source-icon.js +1 -0
  195. package/dist/internal/photo-source-icon.js.map +1 -1
  196. package/dist/internal/screen-exit.d.ts.map +1 -1
  197. package/dist/internal/screen-exit.js +1 -0
  198. package/dist/internal/screen-exit.js.map +1 -1
  199. package/dist/internal/screen-footer.d.ts.map +1 -1
  200. package/dist/internal/screen-footer.js +1 -0
  201. package/dist/internal/screen-footer.js.map +1 -1
  202. package/dist/internal/spinner.d.ts.map +1 -1
  203. package/dist/internal/spinner.js +1 -0
  204. package/dist/internal/spinner.js.map +1 -1
  205. package/dist/internal/use-composition-action.d.ts.map +1 -1
  206. package/dist/internal/use-composition-action.js +1 -0
  207. package/dist/internal/use-composition-action.js.map +1 -1
  208. package/dist/internal.d.ts.map +1 -1
  209. package/dist/internal.js +1 -0
  210. package/dist/internal.js.map +1 -1
  211. package/dist/layout.d.ts +11 -1
  212. package/dist/layout.d.ts.map +1 -1
  213. package/dist/layout.js +8 -4
  214. package/dist/layout.js.map +1 -1
  215. package/dist/mentions.d.ts.map +1 -1
  216. package/dist/mentions.js +1 -0
  217. package/dist/mentions.js.map +1 -1
  218. package/dist/menu-morph.d.ts.map +1 -1
  219. package/dist/menu-morph.js +1 -0
  220. package/dist/menu-morph.js.map +1 -1
  221. package/dist/menubar.d.ts.map +1 -1
  222. package/dist/menubar.js +1 -0
  223. package/dist/menubar.js.map +1 -1
  224. package/dist/modal.d.ts.map +1 -1
  225. package/dist/modal.js +1 -0
  226. package/dist/modal.js.map +1 -1
  227. package/dist/navigation-bar.d.ts.map +1 -1
  228. package/dist/navigation-bar.js +1 -0
  229. package/dist/navigation-bar.js.map +1 -1
  230. package/dist/navigation.d.ts.map +1 -1
  231. package/dist/navigation.js +1 -0
  232. package/dist/navigation.js.map +1 -1
  233. package/dist/notification-bell.d.ts +1 -1
  234. package/dist/notification-bell.d.ts.map +1 -1
  235. package/dist/notification-bell.js +5 -1
  236. package/dist/notification-bell.js.map +1 -1
  237. package/dist/number-field.d.ts.map +1 -1
  238. package/dist/number-field.js +1 -0
  239. package/dist/number-field.js.map +1 -1
  240. package/dist/overlay-stack.d.ts.map +1 -1
  241. package/dist/overlay-stack.js +1 -0
  242. package/dist/overlay-stack.js.map +1 -1
  243. package/dist/overlays.d.ts.map +1 -1
  244. package/dist/overlays.js +11 -2
  245. package/dist/overlays.js.map +1 -1
  246. package/dist/pagination.d.ts.map +1 -1
  247. package/dist/pagination.js +1 -0
  248. package/dist/pagination.js.map +1 -1
  249. package/dist/popover.d.ts.map +1 -1
  250. package/dist/popover.js +1 -0
  251. package/dist/popover.js.map +1 -1
  252. package/dist/portal.d.ts.map +1 -1
  253. package/dist/portal.js +1 -0
  254. package/dist/portal.js.map +1 -1
  255. package/dist/progressive-blur.d.ts.map +1 -1
  256. package/dist/progressive-blur.js +1 -0
  257. package/dist/progressive-blur.js.map +1 -1
  258. package/dist/provider-button.d.ts.map +1 -1
  259. package/dist/provider-button.js +1 -0
  260. package/dist/provider-button.js.map +1 -1
  261. package/dist/provider.d.ts +9 -1
  262. package/dist/provider.d.ts.map +1 -1
  263. package/dist/provider.js +2 -2
  264. package/dist/provider.js.map +1 -1
  265. package/dist/public-exports.generated.d.ts +9 -0
  266. package/dist/public-exports.generated.d.ts.map +1 -1
  267. package/dist/public-exports.generated.js +27 -0
  268. package/dist/public-exports.generated.js.map +1 -1
  269. package/dist/rating.d.ts.map +1 -1
  270. package/dist/rating.js +1 -0
  271. package/dist/rating.js.map +1 -1
  272. package/dist/reaction-picker.d.ts.map +1 -1
  273. package/dist/reaction-picker.js +1 -0
  274. package/dist/reaction-picker.js.map +1 -1
  275. package/dist/saved-items.d.ts.map +1 -1
  276. package/dist/saved-items.js +1 -0
  277. package/dist/saved-items.js.map +1 -1
  278. package/dist/screen-flows.d.ts +5 -1
  279. package/dist/screen-flows.d.ts.map +1 -1
  280. package/dist/screen-flows.js +13 -4
  281. package/dist/screen-flows.js.map +1 -1
  282. package/dist/screens.d.ts +24 -4
  283. package/dist/screens.d.ts.map +1 -1
  284. package/dist/screens.js +39 -12
  285. package/dist/screens.js.map +1 -1
  286. package/dist/scroll-progress.d.ts.map +1 -1
  287. package/dist/scroll-progress.js +1 -0
  288. package/dist/scroll-progress.js.map +1 -1
  289. package/dist/select.d.ts.map +1 -1
  290. package/dist/select.js +1 -0
  291. package/dist/select.js.map +1 -1
  292. package/dist/selection.d.ts +7 -1
  293. package/dist/selection.d.ts.map +1 -1
  294. package/dist/selection.js +33 -10
  295. package/dist/selection.js.map +1 -1
  296. package/dist/side-panel.d.ts.map +1 -1
  297. package/dist/side-panel.js +1 -0
  298. package/dist/side-panel.js.map +1 -1
  299. package/dist/sidebar.d.ts +21 -2
  300. package/dist/sidebar.d.ts.map +1 -1
  301. package/dist/sidebar.js +40 -20
  302. package/dist/sidebar.js.map +1 -1
  303. package/dist/skip-nav.d.ts.map +1 -1
  304. package/dist/skip-nav.js +1 -0
  305. package/dist/skip-nav.js.map +1 -1
  306. package/dist/slider.d.ts.map +1 -1
  307. package/dist/slider.js +1 -0
  308. package/dist/slider.js.map +1 -1
  309. package/dist/sortable.d.ts.map +1 -1
  310. package/dist/sortable.js +1 -0
  311. package/dist/sortable.js.map +1 -1
  312. package/dist/splitter.d.ts.map +1 -1
  313. package/dist/splitter.js +1 -0
  314. package/dist/splitter.js.map +1 -1
  315. package/dist/statistic-motion.d.ts.map +1 -1
  316. package/dist/statistic-motion.js +1 -0
  317. package/dist/statistic-motion.js.map +1 -1
  318. package/dist/status-text.d.ts.map +1 -1
  319. package/dist/status-text.js +1 -0
  320. package/dist/status-text.js.map +1 -1
  321. package/dist/step-player.d.ts.map +1 -1
  322. package/dist/step-player.js +1 -0
  323. package/dist/step-player.js.map +1 -1
  324. package/dist/steps.d.ts +16 -14
  325. package/dist/steps.d.ts.map +1 -1
  326. package/dist/steps.js +26 -9
  327. package/dist/steps.js.map +1 -1
  328. package/dist/styles.css +165 -41
  329. package/dist/styles.layered.css +165 -41
  330. package/dist/supplemental-display.d.ts.map +1 -1
  331. package/dist/supplemental-display.js +1 -0
  332. package/dist/supplemental-display.js.map +1 -1
  333. package/dist/supplemental-navigation.d.ts.map +1 -1
  334. package/dist/supplemental-navigation.js +1 -0
  335. package/dist/supplemental-navigation.js.map +1 -1
  336. package/dist/swipe-actions.d.ts.map +1 -1
  337. package/dist/swipe-actions.js +1 -0
  338. package/dist/swipe-actions.js.map +1 -1
  339. package/dist/table-family.d.ts.map +1 -1
  340. package/dist/table-family.js +1 -0
  341. package/dist/table-family.js.map +1 -1
  342. package/dist/table-sort-button.d.ts.map +1 -1
  343. package/dist/table-sort-button.js +1 -0
  344. package/dist/table-sort-button.js.map +1 -1
  345. package/dist/tags-input.d.ts.map +1 -1
  346. package/dist/tags-input.js +1 -0
  347. package/dist/tags-input.js.map +1 -1
  348. package/dist/task-list.d.ts.map +1 -1
  349. package/dist/task-list.js +1 -0
  350. package/dist/task-list.js.map +1 -1
  351. package/dist/text-annotation.d.ts.map +1 -1
  352. package/dist/text-annotation.js +1 -0
  353. package/dist/text-annotation.js.map +1 -1
  354. package/dist/text-formats.d.ts.map +1 -1
  355. package/dist/text-formats.js +1 -0
  356. package/dist/text-formats.js.map +1 -1
  357. package/dist/theme.d.ts.map +1 -1
  358. package/dist/theme.js +12 -1
  359. package/dist/theme.js.map +1 -1
  360. package/dist/thinking-orb.d.ts.map +1 -1
  361. package/dist/thinking-orb.js +1 -0
  362. package/dist/thinking-orb.js.map +1 -1
  363. package/dist/toast.d.ts.map +1 -1
  364. package/dist/toast.js +1 -0
  365. package/dist/toast.js.map +1 -1
  366. package/dist/toggle-group.d.ts.map +1 -1
  367. package/dist/toggle-group.js +1 -0
  368. package/dist/toggle-group.js.map +1 -1
  369. package/dist/top-bar.d.ts.map +1 -1
  370. package/dist/top-bar.js +1 -0
  371. package/dist/top-bar.js.map +1 -1
  372. package/dist/top.d.ts.map +1 -1
  373. package/dist/top.js +4 -3
  374. package/dist/top.js.map +1 -1
  375. package/dist/tour.d.ts.map +1 -1
  376. package/dist/tour.js +1 -0
  377. package/dist/tour.js.map +1 -1
  378. package/dist/transfer-list.d.ts.map +1 -1
  379. package/dist/transfer-list.js +1 -0
  380. package/dist/transfer-list.js.map +1 -1
  381. package/dist/tree.d.ts.map +1 -1
  382. package/dist/tree.js +1 -0
  383. package/dist/tree.js.map +1 -1
  384. package/dist/upload-item.d.ts.map +1 -1
  385. package/dist/upload-item.js +1 -0
  386. package/dist/upload-item.js.map +1 -1
  387. package/dist/virtual-list.d.ts.map +1 -1
  388. package/dist/virtual-list.js +1 -0
  389. package/dist/virtual-list.js.map +1 -1
  390. package/dist/voice-note.d.ts.map +1 -1
  391. package/dist/voice-note.js +1 -0
  392. package/dist/voice-note.js.map +1 -1
  393. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../src/field-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useId, useLayoutEffect, useRef, type ReactNode } from \"react\";\nimport { createFieldGroupEditSession, resolveFieldGroup, fieldGroupRecipe, type FieldGroupLayout, type FieldGroupDescriptor } from \"@hjmds/design-contracts/field-group\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { Text } from \"./layout.js\";\n\nexport type FieldGroupBinding = Readonly<{\n id: string;\n controlProps: Readonly<{ id: string; label: string; disabled: boolean; \"aria-invalid\": boolean; \"aria-describedby\"?: string }>;\n guardChange: <Args extends unknown[]>(callback: (...args: Args) => void) => (...args: Args) => void;\n}>;\nexport type FieldGroupProps = Readonly<{\n descriptor: FieldGroupDescriptor;\n renderField: (field: FieldGroupBinding) => ReactNode;\n layout?: FieldGroupLayout;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Named related fields inside an existing form; never creates a submission boundary. */\nexport function FieldGroup({ descriptor, renderField, layout = fieldGroupRecipe.defaults.layout, className, layoutStyle }: FieldGroupProps) {\n const groupId = useId();\n const resolved = resolveFieldGroup(descriptor);\n const recipe = fieldGroupRecipe;\n const session = useRef(createFieldGroupEditSession(resolved.fields));\n useLayoutEffect(() => { session.current.update(resolved.fields); return () => session.current.suspend(); }, [resolved.fields]);\n // fieldGroupRecipe.inline.wrap \"all-or-none\" without measuring: below the width that fits every part, the\n // flex-basis turns huge and each part takes a full row; above it, parts share the row up to maxWidth.\n const scaled = (px: number) => `(${px}px * var(--hjm-text-scale, 1))`;\n const gapCss = `var(--hjm-space-${recipe.gap})`;\n const fitsAll = `(${resolved.fields.length} * ${scaled(recipe.inline.minWidth)} + ${Math.max(0, resolved.fields.length - 1)} * ${gapCss})`;\n const inlinePart = { flexGrow: 1, flexBasis: `calc((${fitsAll} - 100%) * 999)`, maxInlineSize: `max(calc${scaled(recipe.inline.maxWidth)}, calc((100% - ${fitsAll}) * -999))` };\n const groupSupport = [resolved.description ? `${groupId}-description` : undefined, resolved.error ? `${groupId}-error` : undefined].filter(Boolean).join(\" \") || undefined;\n return <fieldset className={className} disabled={resolved.disabled} aria-describedby={groupSupport}\n style={{ border: 0, margin: 0, padding: 0, minInlineSize: 0, ...layoutStyle }}>\n <legend style={{ maxInlineSize: \"100%\", overflowWrap: \"anywhere\", paddingInline: 0, marginBlockEnd: `var(--hjm-space-${recipe.headingGap})` }}><Text variant={recipe.heading.textVariant} emphasis={recipe.heading.emphasis}>{resolved.label}</Text></legend>\n {/* Same rhythm as Native's View gap: legend→description→error→fields at headingGap, support under a field at\n supportGap. Raw <p> carried browser margins that made Web gaps about 1.5x Native's (2026-10-17 review). */}\n <div style={{ display: \"grid\", gap: `var(--hjm-space-${recipe.headingGap})`, minInlineSize: 0 }}>\n {resolved.description ? <Text as=\"p\" id={`${groupId}-description`}>{resolved.description}</Text> : null}\n {resolved.error ? <Text as=\"p\" id={`${groupId}-error`} role=\"alert\" tone=\"danger\">{resolved.error}</Text> : null}\n <div style={{ display: layout === \"inline\" ? \"flex\" : \"grid\", ...(layout === \"inline\" ? { flexWrap: \"wrap\" } : {}), gap: `var(--hjm-space-${recipe.gap})`, minInlineSize: 0 }}>\n {resolved.fields.map(field => {\n // Encode product ids rather than indexes: reordering must preserve control identity and focus.\n const id = `${groupId}-field-${encodeURIComponent(field.id)}`;\n const supportId = (message: typeof field.support[number]) => message.scope === \"group\" ? `${groupId}-${message.kind}` : `${id}-${message.kind}`;\n const support = field.support.map(supportId).join(\" \");\n return <div key={field.id} style={{ display: \"grid\", gap: `var(--hjm-space-${recipe.supportGap})`, alignContent: \"start\", minInlineSize: 0, ...(layout === \"inline\" ? inlinePart : {}) }}>\n {renderField({ id: field.id, controlProps: { id, label: field.label, disabled: field.disabled, \"aria-invalid\": field.invalid,\n ...(support ? { \"aria-describedby\": support } : {}) }, guardChange: callback => session.current.guard(field.id, callback) })}\n {field.support.filter(message => message.scope === \"field\").map(message => <Text as=\"p\" key={message.kind} id={supportId(message)}\n {...(message.kind === \"error\" ? { role: \"alert\", tone: \"danger\" as const } : {})}>{message.text}</Text>)}\n </div>;\n })}\n </div>\n </div>\n </fieldset>;\n}\n"]}
1
+ {"version":3,"file":"field-group.js","sourceRoot":"","sources":["../src/field-group.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useId, useLayoutEffect, useRef, type ReactNode } from \"react\";\nimport { createFieldGroupEditSession, resolveFieldGroup, fieldGroupRecipe, type FieldGroupLayout, type FieldGroupDescriptor } from \"@hjmds/design-contracts/field-group\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { Text } from \"./layout.js\";\n\nexport type FieldGroupBinding = Readonly<{\n id: string;\n controlProps: Readonly<{ id: string; label: string; disabled: boolean; \"aria-invalid\": boolean; \"aria-describedby\"?: string }>;\n guardChange: <Args extends unknown[]>(callback: (...args: Args) => void) => (...args: Args) => void;\n}>;\nexport type FieldGroupProps = Readonly<{\n descriptor: FieldGroupDescriptor;\n renderField: (field: FieldGroupBinding) => ReactNode;\n layout?: FieldGroupLayout;\n className?: string;\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\n/** Named related fields inside an existing form; never creates a submission boundary. */\nexport function FieldGroup({ descriptor, renderField, layout = fieldGroupRecipe.defaults.layout, className, layoutStyle }: FieldGroupProps) {\n const groupId = useId();\n const resolved = resolveFieldGroup(descriptor);\n const recipe = fieldGroupRecipe;\n const session = useRef(createFieldGroupEditSession(resolved.fields));\n useLayoutEffect(() => { session.current.update(resolved.fields); return () => session.current.suspend(); }, [resolved.fields]);\n // fieldGroupRecipe.inline.wrap \"all-or-none\" without measuring: below the width that fits every part, the\n // flex-basis turns huge and each part takes a full row; above it, parts share the row up to maxWidth.\n const scaled = (px: number) => `(${px}px * var(--hjm-text-scale, 1))`;\n const gapCss = `var(--hjm-space-${recipe.gap})`;\n const fitsAll = `(${resolved.fields.length} * ${scaled(recipe.inline.minWidth)} + ${Math.max(0, resolved.fields.length - 1)} * ${gapCss})`;\n const inlinePart = { flexGrow: 1, flexBasis: `calc((${fitsAll} - 100%) * 999)`, maxInlineSize: `max(calc${scaled(recipe.inline.maxWidth)}, calc((100% - ${fitsAll}) * -999))` };\n const groupSupport = [resolved.description ? `${groupId}-description` : undefined, resolved.error ? `${groupId}-error` : undefined].filter(Boolean).join(\" \") || undefined;\n return <fieldset className={className} disabled={resolved.disabled} aria-describedby={groupSupport}\n style={{ border: 0, margin: 0, padding: 0, minInlineSize: 0, ...layoutStyle }}>\n <legend style={{ maxInlineSize: \"100%\", overflowWrap: \"anywhere\", paddingInline: 0, marginBlockEnd: `var(--hjm-space-${recipe.headingGap})` }}><Text variant={recipe.heading.textVariant} emphasis={recipe.heading.emphasis}>{resolved.label}</Text></legend>\n {/* Same rhythm as Native's View gap: legend→description→error→fields at headingGap, support under a field at\n supportGap. Raw <p> carried browser margins that made Web gaps about 1.5x Native's (2026-10-17 review). */}\n <div style={{ display: \"grid\", gap: `var(--hjm-space-${recipe.headingGap})`, minInlineSize: 0 }}>\n {resolved.description ? <Text as=\"p\" id={`${groupId}-description`}>{resolved.description}</Text> : null}\n {resolved.error ? <Text as=\"p\" id={`${groupId}-error`} role=\"alert\" tone=\"danger\">{resolved.error}</Text> : null}\n <div style={{ display: layout === \"inline\" ? \"flex\" : \"grid\", ...(layout === \"inline\" ? { flexWrap: \"wrap\" } : {}), gap: `var(--hjm-space-${recipe.gap})`, minInlineSize: 0 }}>\n {resolved.fields.map(field => {\n // Encode product ids rather than indexes: reordering must preserve control identity and focus.\n const id = `${groupId}-field-${encodeURIComponent(field.id)}`;\n const supportId = (message: typeof field.support[number]) => message.scope === \"group\" ? `${groupId}-${message.kind}` : `${id}-${message.kind}`;\n const support = field.support.map(supportId).join(\" \");\n return <div key={field.id} style={{ display: \"grid\", gap: `var(--hjm-space-${recipe.supportGap})`, alignContent: \"start\", minInlineSize: 0, ...(layout === \"inline\" ? inlinePart : {}) }}>\n {renderField({ id: field.id, controlProps: { id, label: field.label, disabled: field.disabled, \"aria-invalid\": field.invalid,\n ...(support ? { \"aria-describedby\": support } : {}) }, guardChange: callback => session.current.guard(field.id, callback) })}\n {field.support.filter(message => message.scope === \"field\").map(message => <Text as=\"p\" key={message.kind} id={supportId(message)}\n {...(message.kind === \"error\" ? { role: \"alert\", tone: \"danger\" as const } : {})}>{message.text}</Text>)}\n </div>;\n })}\n </div>\n </div>\n </fieldset>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC/B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GACzF,QAAQ,CAAC;IACP,UAAU,EAAE,oBAAoB,CAAC;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,SAAS,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAML,sFAAsF;AACtF,eAAO,MAAM,UAAU;gBA1BP,oBAAoB;WACzB,SAAS;iBACH,MAAM;mBACJ,SAAS;IACxB;;;;;OAKG;cACO,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI;oBACvE,MAAM;eACX,OAAO;WACX,SAAS;YACR,SAAS;cACP,MAAM;qBACC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;IACtD,gGAAgG;kBAClF,uBAAuB;mDAgGvC,CAAC"}
1
+ {"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC/B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GACzF,QAAQ,CAAC;IACP,UAAU,EAAE,oBAAoB,CAAC;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,SAAS,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAML,sFAAsF;AACtF,eAAO,MAAM,UAAU;gBA1BP,oBAAoB;WACzB,SAAS;iBACH,MAAM;mBACJ,SAAS;IACxB;;;;;OAKG;cACO,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI;oBACvE,MAAM;eACX,OAAO;WACX,SAAS;YACR,SAAS;cACP,MAAM;qBACC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM;IACtD,gGAAgG;kBAClF,uBAAuB;mDAgGvC,CAAC"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { filePickerTriggerDefaults, resolveFilePickerDescriptor, resolveFilePickerSelection, validateFilePickerTriggers, } from "@hjmds/design-contracts/components/file-picker";
3
4
  import { forwardRef, useEffect, useId, useRef, useState, } from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n filePickerTriggerDefaults,\n resolveFilePickerDescriptor,\n resolveFilePickerSelection,\n validateFilePickerTriggers,\n type FilePickerCandidate,\n type FilePickerDescriptor,\n type FilePickerSelectionResult,\n} from \"@hjmds/design-contracts/components/file-picker\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type DragEvent,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\n\nimport { classNames, composeRefs } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type FilePickerProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"onSelect\"> &\n Readonly<{\n descriptor: FilePickerDescriptor;\n label: ReactNode;\n buttonLabel: string;\n dropzoneLabel: ReactNode;\n /**\n * `files` maps each accepted candidate id to the browser `File`, so the product can read or upload\n * the bytes it accepted. Before this a Web product had no access to the File and fell back to a raw\n * `<input type=\"file\">` (2026-10-17 mockup studio review). Native products already own the file\n * reference through their `onPick` adapter, so Native keeps the single-argument callback.\n */\n onSelect: (result: FilePickerSelectionResult, files: ReadonlyMap<string, File>) => void;\n existingCount?: number;\n disabled?: boolean;\n hint?: ReactNode;\n error?: ReactNode;\n inputId?: string;\n getCandidateId?: (file: File, index: number) => string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction defaultCandidateId(file: File, index: number): string {\n return `${file.name}:${file.size}:${file.lastModified}:${index}`;\n}\n\n/** Native file input plus an optional Web dropzone sharing one selection resolver. */\nexport const FilePicker = forwardRef<HTMLDivElement, FilePickerProps>(function FilePicker(\n {\n descriptor,\n label,\n buttonLabel,\n dropzoneLabel,\n onSelect,\n existingCount = 0,\n disabled = false,\n hint,\n error,\n inputId,\n getCandidateId = defaultCandidateId,\n className,\n layoutStyle,\n ...props\n },\n ref,\n) {\n validateFilePickerTriggers(\"web\", filePickerTriggerDefaults.web);\n const resolved = resolveFilePickerDescriptor(descriptor);\n const generatedId = useId();\n const id = inputId ?? `hjm-file-${generatedId.replaceAll(\":\", \"\")}`;\n const inputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n useEffect(() => { if (disabled) setDragging(false); }, [disabled]);\n\n const commit = (files: FileList | readonly File[]) => {\n // The OS dialog may finish after the owner locks this field. Empty input\n // changes represent no selection and must not erase a product's file list.\n if (disabled || files.length === 0) return;\n const sources = Array.from(files);\n const candidates: FilePickerCandidate[] = sources.map((file, index) => ({\n id: getCandidateId(file, index),\n name: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n }));\n const result = resolveFilePickerSelection(candidates, resolved, existingCount);\n const accepted = new Set(result.accepted.map(candidate => candidate.id));\n onSelect(result, new Map(candidates.flatMap((candidate, index) => accepted.has(candidate.id) ? [[candidate.id, sources[index]!] as const] : [])));\n };\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n try { if (event.currentTarget.files) commit(event.currentTarget.files); }\n finally { event.currentTarget.value = \"\"; }\n };\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragging(false);\n if (!disabled && event.dataTransfer.files.length > 0) commit(event.dataTransfer.files);\n };\n\n return (\n <div {...props} style={{ ...props.style, ...layoutStyle }} ref={composeRefs(ref)} className={classNames(\"hjm-file-picker\", className)} data-dragging={(!disabled && dragging) || undefined} data-invalid={error !== undefined || undefined}>\n <span className=\"hjm-file-picker__label\" id={`${id}-label`}>{label}</span>\n {/*\n The visible button below is the keyboard entry point. Before 1.5.0 this\n hidden input was a second, unnamed tab stop (the label span was not\n associated with it), so a screen reader announced a nameless \"file\"\n control. It stays in the accessibility tree for virtual cursors, named\n by the label, and leaves the tab order.\n */}\n <input\n accept={resolved.accept?.join(\",\")}\n aria-labelledby={`${id}-label`}\n className=\"hjm-visually-hidden\"\n disabled={disabled}\n id={id}\n tabIndex={-1}\n multiple={resolved.mode === \"multiple\"}\n onChange={handleChange}\n ref={inputRef}\n type=\"file\"\n />\n <div\n className=\"hjm-file-picker__dropzone\"\n onDragEnter={(event) => { event.preventDefault(); if (!disabled) setDragging(true); }}\n onDragLeave={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setDragging(false); }}\n onDragOver={(event) => event.preventDefault()}\n onDrop={handleDrop}\n >\n <span>{dropzoneLabel}</span>\n <button disabled={disabled} onClick={() => inputRef.current?.click()} type=\"button\">{buttonLabel}</button>\n </div>\n {hint === undefined ? null : <span className=\"hjm-file-picker__hint\">{hint}</span>}\n {error === undefined ? null : <span className=\"hjm-file-picker__error\" role=\"alert\">{error}</span>}\n </div>\n );\n});\n"]}
1
+ {"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport {\n filePickerTriggerDefaults,\n resolveFilePickerDescriptor,\n resolveFilePickerSelection,\n validateFilePickerTriggers,\n type FilePickerCandidate,\n type FilePickerDescriptor,\n type FilePickerSelectionResult,\n} from \"@hjmds/design-contracts/components/file-picker\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type DragEvent,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\n\nimport { classNames, composeRefs } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type FilePickerProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"onSelect\"> &\n Readonly<{\n descriptor: FilePickerDescriptor;\n label: ReactNode;\n buttonLabel: string;\n dropzoneLabel: ReactNode;\n /**\n * `files` maps each accepted candidate id to the browser `File`, so the product can read or upload\n * the bytes it accepted. Before this a Web product had no access to the File and fell back to a raw\n * `<input type=\"file\">` (2026-10-17 mockup studio review). Native products already own the file\n * reference through their `onPick` adapter, so Native keeps the single-argument callback.\n */\n onSelect: (result: FilePickerSelectionResult, files: ReadonlyMap<string, File>) => void;\n existingCount?: number;\n disabled?: boolean;\n hint?: ReactNode;\n error?: ReactNode;\n inputId?: string;\n getCandidateId?: (file: File, index: number) => string;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction defaultCandidateId(file: File, index: number): string {\n return `${file.name}:${file.size}:${file.lastModified}:${index}`;\n}\n\n/** Native file input plus an optional Web dropzone sharing one selection resolver. */\nexport const FilePicker = forwardRef<HTMLDivElement, FilePickerProps>(function FilePicker(\n {\n descriptor,\n label,\n buttonLabel,\n dropzoneLabel,\n onSelect,\n existingCount = 0,\n disabled = false,\n hint,\n error,\n inputId,\n getCandidateId = defaultCandidateId,\n className,\n layoutStyle,\n ...props\n },\n ref,\n) {\n validateFilePickerTriggers(\"web\", filePickerTriggerDefaults.web);\n const resolved = resolveFilePickerDescriptor(descriptor);\n const generatedId = useId();\n const id = inputId ?? `hjm-file-${generatedId.replaceAll(\":\", \"\")}`;\n const inputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n useEffect(() => { if (disabled) setDragging(false); }, [disabled]);\n\n const commit = (files: FileList | readonly File[]) => {\n // The OS dialog may finish after the owner locks this field. Empty input\n // changes represent no selection and must not erase a product's file list.\n if (disabled || files.length === 0) return;\n const sources = Array.from(files);\n const candidates: FilePickerCandidate[] = sources.map((file, index) => ({\n id: getCandidateId(file, index),\n name: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n }));\n const result = resolveFilePickerSelection(candidates, resolved, existingCount);\n const accepted = new Set(result.accepted.map(candidate => candidate.id));\n onSelect(result, new Map(candidates.flatMap((candidate, index) => accepted.has(candidate.id) ? [[candidate.id, sources[index]!] as const] : [])));\n };\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n try { if (event.currentTarget.files) commit(event.currentTarget.files); }\n finally { event.currentTarget.value = \"\"; }\n };\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragging(false);\n if (!disabled && event.dataTransfer.files.length > 0) commit(event.dataTransfer.files);\n };\n\n return (\n <div {...props} style={{ ...props.style, ...layoutStyle }} ref={composeRefs(ref)} className={classNames(\"hjm-file-picker\", className)} data-dragging={(!disabled && dragging) || undefined} data-invalid={error !== undefined || undefined}>\n <span className=\"hjm-file-picker__label\" id={`${id}-label`}>{label}</span>\n {/*\n The visible button below is the keyboard entry point. Before 1.5.0 this\n hidden input was a second, unnamed tab stop (the label span was not\n associated with it), so a screen reader announced a nameless \"file\"\n control. It stays in the accessibility tree for virtual cursors, named\n by the label, and leaves the tab order.\n */}\n <input\n accept={resolved.accept?.join(\",\")}\n aria-labelledby={`${id}-label`}\n className=\"hjm-visually-hidden\"\n disabled={disabled}\n id={id}\n tabIndex={-1}\n multiple={resolved.mode === \"multiple\"}\n onChange={handleChange}\n ref={inputRef}\n type=\"file\"\n />\n <div\n className=\"hjm-file-picker__dropzone\"\n onDragEnter={(event) => { event.preventDefault(); if (!disabled) setDragging(true); }}\n onDragLeave={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setDragging(false); }}\n onDragOver={(event) => event.preventDefault()}\n onDrop={handleDrop}\n >\n <span>{dropzoneLabel}</span>\n <button disabled={disabled} onClick={() => inputRef.current?.click()} type=\"button\">{buttonLabel}</button>\n </div>\n {hint === undefined ? null : <span className=\"hjm-file-picker__hint\">{hint}</span>}\n {error === undefined ? null : <span className=\"hjm-file-picker__error\" role=\"alert\">{error}</span>}\n </div>\n );\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../src/floating-action-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpG,OAAO,EAEkC,2CAA2C,EAClF,KAAK,8BAA8B,EAAE,KAAK,8BAA8B,EACzE,MAAM,2DAA2D,CAAC;AAEnE,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIxD,OAAO,EAAE,2CAA2C,EAAE,CAAC;AAEvD,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC;IAC1H,UAAU,EAAE,8BAA8B,CAAC;IAC3C,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,SAAS,CAAC;IAC3G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qFAAqF;IACrF,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD,CAAC,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,oBAAoB;gBATnB,8BAA8B;WACnC,QAAQ,GAAG,OAAO;gBACb,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,SAAS;0BACpF,MAAM;IAC5B,qFAAqF;8BAC3D,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;sDAoCrD,CAAC;AAEH,yFAAyF;AACzF,wBAAgB,6BAA6B,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,8BAA8B,CAmBzG"}
1
+ {"version":3,"file":"floating-action-button.d.ts","sourceRoot":"","sources":["../src/floating-action-button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpG,OAAO,EAEkC,2CAA2C,EAClF,KAAK,8BAA8B,EAAE,KAAK,8BAA8B,EACzE,MAAM,2DAA2D,CAAC;AAEnE,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIxD,OAAO,EAAE,2CAA2C,EAAE,CAAC;AAEvD,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC;IAC1H,UAAU,EAAE,8BAA8B,CAAC;IAC3C,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,SAAS,CAAC;IAC3G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qFAAqF;IACrF,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD,CAAC,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,oBAAoB;gBATnB,8BAA8B;WACnC,QAAQ,GAAG,OAAO;gBACb,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,SAAS;0BACpF,MAAM;IAC5B,qFAAqF;8BAC3D,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI;sDAoCrD,CAAC;AAEH,yFAAyF;AACzF,wBAAgB,6BAA6B,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,8BAA8B,CAmBzG"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { forwardRef, useEffect, useRef, useState } from "react";
3
4
  import { floatingActionButtonRecipe as recipe, resolveFloatingActionButtonDescriptor, resolveFloatingActionButtonLayoutMode, resolveFloatingActionButtonContentClearance, } from "@hjmds/design-contracts/components/floating-action-button";
@@ -1 +1 @@
1
- {"version":3,"file":"floating-action-button.js","sourceRoot":"","sources":["../src/floating-action-button.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport {\n floatingActionButtonRecipe as recipe, resolveFloatingActionButtonDescriptor,\n resolveFloatingActionButtonLayoutMode, resolveFloatingActionButtonContentClearance,\n type FloatingActionButtonDescriptor, type FloatingActionButtonLayoutMode,\n} from \"@hjmds/design-contracts/components/floating-action-button\";\nimport { glyph, easing } from \"@hjmds/design-contracts/foundations\";\nimport { Button, type ButtonProps } from \"./actions.js\";\nimport { assignRef, classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport { resolveFloatingActionButtonContentClearance };\n// No `layoutStyle`: fixed to the viewport corner with safe-area and content-clearance math the recipe owns; margins would desync `onContentClearanceChange`.\nexport type FloatingActionButtonProps = Pick<ButtonProps, \"onClick\" | \"onFocus\" | \"onBlur\" | \"id\" | \"className\"> & Readonly<{\n descriptor: FloatingActionButtonDescriptor;\n size?: \"medium\" | \"large\";\n renderIcon: (icon: Readonly<{ name: string; size: number; color: string; decorative: true }>) => ReactNode;\n safeAreaBottomInset?: number;\n /** Apply this to the scroll content's bottom padding, including multiline labels. */\n onContentClearanceChange: (clearance: number) => void;\n}>;\n\n/** One persistent button preserves focus while its label collapses. */\nexport const FloatingActionButton = forwardRef<HTMLButtonElement, FloatingActionButtonProps>(function FloatingActionButton({\n descriptor, size = \"large\", renderIcon, safeAreaBottomInset = 0, onContentClearanceChange, className, ...props\n}, forwardedRef) {\n const resolved = resolveFloatingActionButtonDescriptor(descriptor);\n const theme = useOptionalHjmTheme();\n const minimumClearance = resolveFloatingActionButtonContentClearance(safeAreaBottomInset, size);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n const measure = () => {\n const bottom = parseFloat(getComputedStyle(button).bottom);\n onContentClearanceChange(Math.max(minimumClearance, button.getBoundingClientRect().height\n + (Number.isFinite(bottom) ? bottom : recipe.margin + safeAreaBottomInset) + recipe.margin));\n };\n measure(); const observer = new ResizeObserver(measure); observer.observe(button);\n window.addEventListener(\"resize\", measure);\n return () => { observer.disconnect(); window.removeEventListener(\"resize\", measure); };\n }, [minimumClearance, safeAreaBottomInset, onContentClearanceChange]);\n return <Button {...props} appearance=\"flat\" ref={(node) => { buttonRef.current = node; assignRef(forwardedRef, node); }}\n className={classNames(\"hjm-fab\", className)} size={size} tone=\"primary\" shape=\"pill\"\n data-mode={resolved.layoutMode} data-direction={theme?.environment.direction ?? \"ltr\"} data-reduced-motion={theme?.environment.reducedMotion ?? false} aria-label={resolved.resolvedAccessibilityLabel}\n style={{ \"--hjm-fab-diameter\": `${recipe.sizes[size].diameter}px`, \"--hjm-fab-margin\": `${recipe.margin}px`,\n \"--hjm-fab-safe-area\": `${safeAreaBottomInset}px`, \"--hjm-fab-duration\": `${recipe.transition.duration}ms`,\n \"--hjm-fab-easing\": `cubic-bezier(${easing[recipe.transition.easing].join(\",\")})`,\n // Match other floating chrome under a profile; keep the stylesheet-only\n // legacy path rather than requiring a Provider for existing consumers.\n boxShadow: theme?.designProfile ? \"var(--hjm-shadow-floating)\"\n : `0 ${recipe.shadow.offsetY}px ${recipe.shadow.radius}px color-mix(in srgb, ${recipe.shadow.color} ${recipe.shadow.opacity * 100}%, transparent)` } as CSSProperties}\n leading={<span aria-hidden=\"true\" className=\"hjm-fab__icon\">{renderIcon({ name: resolved.icon.name, size: glyph[recipe.sizes[size].glyph], color: \"currentColor\", decorative: true })}</span>}>\n {resolved.label}\n </Button>;\n});\n\n/** Omit target for window scrolling; null waits for a custom scroll element to mount. */\nexport function useFloatingActionButtonScroll(target?: HTMLElement | null): FloatingActionButtonLayoutMode {\n const [layoutMode, setLayoutMode] = useState<FloatingActionButtonLayoutMode>(\"expanded\");\n useEffect(() => {\n if (target === null) return;\n const source = target ?? window;\n let anchor = target?.scrollTop ?? window.scrollY;\n const onScroll = () => {\n const offset = Math.max(0, target?.scrollTop ?? window.scrollY);\n const delta = offset - anchor;\n // Half the edge margin ignores tiny trackpad tremors, but accumulates small\n // deltas until direction is clear instead of resetting on every frame.\n if (offset > 0 && Math.abs(delta) < recipe.margin / 2) return;\n anchor = offset;\n setLayoutMode((mode) => resolveFloatingActionButtonLayoutMode(offset === 0 || delta < 0 ? \"toward-start\" : \"away-from-start\", mode));\n };\n source.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => source.removeEventListener(\"scroll\", onScroll);\n }, [target]);\n return layoutMode;\n}\n"]}
1
+ {"version":3,"file":"floating-action-button.js","sourceRoot":"","sources":["../src/floating-action-button.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { forwardRef, useEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport {\n floatingActionButtonRecipe as recipe, resolveFloatingActionButtonDescriptor,\n resolveFloatingActionButtonLayoutMode, resolveFloatingActionButtonContentClearance,\n type FloatingActionButtonDescriptor, type FloatingActionButtonLayoutMode,\n} from \"@hjmds/design-contracts/components/floating-action-button\";\nimport { glyph, easing } from \"@hjmds/design-contracts/foundations\";\nimport { Button, type ButtonProps } from \"./actions.js\";\nimport { assignRef, classNames } from \"./internal.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\n\nexport { resolveFloatingActionButtonContentClearance };\n// No `layoutStyle`: fixed to the viewport corner with safe-area and content-clearance math the recipe owns; margins would desync `onContentClearanceChange`.\nexport type FloatingActionButtonProps = Pick<ButtonProps, \"onClick\" | \"onFocus\" | \"onBlur\" | \"id\" | \"className\"> & Readonly<{\n descriptor: FloatingActionButtonDescriptor;\n size?: \"medium\" | \"large\";\n renderIcon: (icon: Readonly<{ name: string; size: number; color: string; decorative: true }>) => ReactNode;\n safeAreaBottomInset?: number;\n /** Apply this to the scroll content's bottom padding, including multiline labels. */\n onContentClearanceChange: (clearance: number) => void;\n}>;\n\n/** One persistent button preserves focus while its label collapses. */\nexport const FloatingActionButton = forwardRef<HTMLButtonElement, FloatingActionButtonProps>(function FloatingActionButton({\n descriptor, size = \"large\", renderIcon, safeAreaBottomInset = 0, onContentClearanceChange, className, ...props\n}, forwardedRef) {\n const resolved = resolveFloatingActionButtonDescriptor(descriptor);\n const theme = useOptionalHjmTheme();\n const minimumClearance = resolveFloatingActionButtonContentClearance(safeAreaBottomInset, size);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n const measure = () => {\n const bottom = parseFloat(getComputedStyle(button).bottom);\n onContentClearanceChange(Math.max(minimumClearance, button.getBoundingClientRect().height\n + (Number.isFinite(bottom) ? bottom : recipe.margin + safeAreaBottomInset) + recipe.margin));\n };\n measure(); const observer = new ResizeObserver(measure); observer.observe(button);\n window.addEventListener(\"resize\", measure);\n return () => { observer.disconnect(); window.removeEventListener(\"resize\", measure); };\n }, [minimumClearance, safeAreaBottomInset, onContentClearanceChange]);\n return <Button {...props} appearance=\"flat\" ref={(node) => { buttonRef.current = node; assignRef(forwardedRef, node); }}\n className={classNames(\"hjm-fab\", className)} size={size} tone=\"primary\" shape=\"pill\"\n data-mode={resolved.layoutMode} data-direction={theme?.environment.direction ?? \"ltr\"} data-reduced-motion={theme?.environment.reducedMotion ?? false} aria-label={resolved.resolvedAccessibilityLabel}\n style={{ \"--hjm-fab-diameter\": `${recipe.sizes[size].diameter}px`, \"--hjm-fab-margin\": `${recipe.margin}px`,\n \"--hjm-fab-safe-area\": `${safeAreaBottomInset}px`, \"--hjm-fab-duration\": `${recipe.transition.duration}ms`,\n \"--hjm-fab-easing\": `cubic-bezier(${easing[recipe.transition.easing].join(\",\")})`,\n // Match other floating chrome under a profile; keep the stylesheet-only\n // legacy path rather than requiring a Provider for existing consumers.\n boxShadow: theme?.designProfile ? \"var(--hjm-shadow-floating)\"\n : `0 ${recipe.shadow.offsetY}px ${recipe.shadow.radius}px color-mix(in srgb, ${recipe.shadow.color} ${recipe.shadow.opacity * 100}%, transparent)` } as CSSProperties}\n leading={<span aria-hidden=\"true\" className=\"hjm-fab__icon\">{renderIcon({ name: resolved.icon.name, size: glyph[recipe.sizes[size].glyph], color: \"currentColor\", decorative: true })}</span>}>\n {resolved.label}\n </Button>;\n});\n\n/** Omit target for window scrolling; null waits for a custom scroll element to mount. */\nexport function useFloatingActionButtonScroll(target?: HTMLElement | null): FloatingActionButtonLayoutMode {\n const [layoutMode, setLayoutMode] = useState<FloatingActionButtonLayoutMode>(\"expanded\");\n useEffect(() => {\n if (target === null) return;\n const source = target ?? window;\n let anchor = target?.scrollTop ?? window.scrollY;\n const onScroll = () => {\n const offset = Math.max(0, target?.scrollTop ?? window.scrollY);\n const delta = offset - anchor;\n // Half the edge margin ignores tiny trackpad tremors, but accumulates small\n // deltas until direction is clear instead of resetting on every frame.\n if (offset > 0 && Math.abs(delta) < recipe.margin / 2) return;\n anchor = offset;\n setLayoutMode((mode) => resolveFloatingActionButtonLayoutMode(offset === 0 || delta < 0 ? \"toward-start\" : \"away-from-start\", mode));\n };\n source.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => source.removeEventListener(\"scroll\", onScroll);\n }, [target]);\n return layoutMode;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"folder-preview.d.ts","sourceRoot":"","sources":["../src/folder-preview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAI,EAAC,SAAS,EAAC,MAAI,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,OAAO,CAAC;IAAA,YAAY,EAAC,CAAC,IAAI,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,QAAQ,EAAC,SAAS,SAAS,EAAE,CAAC;IAAA,QAAQ,EAAC,SAAS,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IACvK,oGAAoG;IACpG,WAAW,CAAC,EAAC,uBAAuB,CAAA;CAAC,CAAC,CAAC;AACxC,yGAAyG;AACzG,wBAAgB,aAAa,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAc,EAAC,WAAW,EAAC,EAAC,kBAAkB,+BAAw5C"}
1
+ {"version":3,"file":"folder-preview.d.ts","sourceRoot":"","sources":["../src/folder-preview.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAI,EAAC,SAAS,EAAC,MAAI,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,OAAO,CAAC;IAAA,YAAY,EAAC,CAAC,IAAI,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,QAAQ,EAAC,SAAS,SAAS,EAAE,CAAC;IAAA,QAAQ,EAAC,SAAS,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IACvK,oGAAoG;IACpG,WAAW,CAAC,EAAC,uBAAuB,CAAA;CAAC,CAAC,CAAC;AACxC,yGAAyG;AACzG,wBAAgB,aAAa,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAc,EAAC,WAAW,EAAC,EAAC,kBAAkB,+BAAw5C"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { Collapsible, CollapsibleMarker } from './collapsible.js';
3
4
  import { useHjmTheme } from './provider.js';
@@ -1 +1 @@
1
- {"version":3,"file":"folder-preview.js","sourceRoot":"","sources":["../src/folder-preview.tsx"],"names":[],"mappings":";AAGkC,OAAM,EAAC,WAAW,EAAC,iBAAiB,EAAC,MAAI,kBAAkB,CAAC;AAAA,OAAM,EAAC,WAAW,EAAC,MAAI,eAAe,CAAC;AAKrI,yGAAyG;AACzG,MAAM,UAAU,aAAa,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,GAAC,KAAK,EAAC,WAAW,EAAoB,IAAE,MAAK,EAAC,WAAW,EAAC,GAAC,WAAW,EAAE,CAAC,CAAA,IAAG,CAAC,KAAK,CAAC,IAAI,EAAE;IAAC,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAA,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAM,CAAC,WAAW,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,CAAC,EAAE,MAAM,EAAC,MAAM,EAAC,OAAO,EAAE,eAAK,KAAK,EAAE,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,CAAC,EAAC,OAAO,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,aAAE,eAAK,KAAK,uBAAa,MAAM,EAAC,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,aAAa,EAAC,MAAM,EAAC,aAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAC,KAAK,EAAC,EAAE,CAAA,cAAiB,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,gBAAgB,EAAC,KAAK,EAAC,GAAG,EAAC,EAAE,GAAC,KAAK,GAAC,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,QAAQ,EAAC,YAAY,EAAC,sBAAsB,EAAC,UAAU,EAAC,8BAA8B,EAAC,MAAM,EAAC,mCAAmC,EAAC,SAAS,EAAC,cAAc,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,cAAc,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,WAAW,CAAC,aAAa,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,0BAA0B,EAAC,YAAG,OAAO,IAApZ,KAAK,CAAsZ,CAAC,EAAC,cAAK,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,CAAC,EAAC,WAAW,EAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAC,YAAY,EAAC,sBAAsB,EAAC,UAAU,EAAC,iCAAiC,EAAC,MAAM,EAAC,mCAAmC,EAAC,eAAe,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,CAAA,CAAC,CAAA,oCAAoC,CAAA,CAAC,CAAA,MAAM,EAAC,GAAG,IAAM,EAAA,gBAAM,KAAK,EAAE,EAAC,OAAO,EAAC,aAAa,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,QAAQ,EAAC,aAAE,yBAAO,KAAK,GAAQ,EAAA,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,GAAG,IAAO,IAAM,YAAG,QAAQ,GAAe,CAAC,CAAA,CAAC","sourcesContent":["// Artwork, label and open mark form one centred column; the label used to sit at the start under centred artwork with\n// the mark floating at the row end (2026-10-17 review E20).\n// Fixed 260×160 artwork is decorative; cap at three previews to keep the motif bounded. The trigger label and expanded content remain fluid.\nimport type{ReactNode}from'react';import{Collapsible,CollapsibleMarker}from'./collapsible.js';import{useHjmTheme}from'./provider.js';\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type FolderPreviewProps=Readonly<{label:string;open:boolean;onOpenChange:(open:boolean)=>void;previews:readonly ReactNode[];children:ReactNode;disabled?:boolean;\n /** Canonical layout-only placement on the root Collapsible. Controlled visual keys are excluded. */\n layoutStyle?:HjmCompositionStyleProp}>;\n/** Preview slots are decorative snapshots; expanded children own real actions and accessible content. */\nexport function FolderPreview({label,open,onOpenChange,previews,children,disabled=false,layoutStyle}:FolderPreviewProps){const{environment}=useHjmTheme();if(!label.trim())throw new TypeError('Folder needs a label');return <Collapsible open={open} onOpenChange={onOpenChange} disabled={disabled} {...(layoutStyle===undefined?{}:{layoutStyle})} marker=\"none\" trigger={<div style={{width:'100%',minWidth:0,display:'flex',flexDirection:'column',alignItems:'center',gap:'var(--hjm-space-sm)'}}><div inert aria-hidden=\"true\" style={{position:'relative',height:160,width:'100%',maxWidth:260,pointerEvents:'none'}}>{previews.slice(0,3).map((preview,index)=><div key={index} style={{position:'absolute',insetInlineStart:'20%',top:24+index*8,width:'60%',height:104,overflow:'hidden',borderRadius:'var(--hjm-radius-md)',background:'var(--hjm-color-surface-alt)',border:'1px solid var(--hjm-color-border)',transform:`translateX(${(index-1)*(open?34:10)}px) rotate(${(index-1)*(open?12:4)}deg)`,transition:environment.reducedMotion?'none':'transform 200ms ease-out'}}>{preview}</div>)}<div style={{position:'absolute',bottom:0,insetInline:0,height:56,borderRadius:'var(--hjm-radius-lg)',background:'var(--hjm-color-surface-accent)',border:'1px solid var(--hjm-color-border)',transformOrigin:'bottom',transform:open?'perspective(400px) rotateX(-15deg)':'none'}}/></div><span style={{display:'inline-flex',alignItems:'center',gap:'var(--hjm-space-xs)',textAlign:'center'}}><span>{label}</span><CollapsibleMarker open={open}/></span></div>}>{children}</Collapsible>;}\n"]}
1
+ {"version":3,"file":"folder-preview.js","sourceRoot":"","sources":["../src/folder-preview.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAKqB,OAAM,EAAC,WAAW,EAAC,iBAAiB,EAAC,MAAI,kBAAkB,CAAC;AAAA,OAAM,EAAC,WAAW,EAAC,MAAI,eAAe,CAAC;AAKrI,yGAAyG;AACzG,MAAM,UAAU,aAAa,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,QAAQ,GAAC,KAAK,EAAC,WAAW,EAAoB,IAAE,MAAK,EAAC,WAAW,EAAC,GAAC,WAAW,EAAE,CAAC,CAAA,IAAG,CAAC,KAAK,CAAC,IAAI,EAAE;IAAC,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAA,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAM,CAAC,WAAW,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,CAAC,EAAE,MAAM,EAAC,MAAM,EAAC,OAAO,EAAE,eAAK,KAAK,EAAE,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,CAAC,EAAC,OAAO,EAAC,MAAM,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,aAAE,eAAK,KAAK,uBAAa,MAAM,EAAC,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,aAAa,EAAC,MAAM,EAAC,aAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAC,KAAK,EAAC,EAAE,CAAA,cAAiB,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,gBAAgB,EAAC,KAAK,EAAC,GAAG,EAAC,EAAE,GAAC,KAAK,GAAC,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,QAAQ,EAAC,YAAY,EAAC,sBAAsB,EAAC,UAAU,EAAC,8BAA8B,EAAC,MAAM,EAAC,mCAAmC,EAAC,SAAS,EAAC,cAAc,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,cAAc,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,WAAW,CAAC,aAAa,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,0BAA0B,EAAC,YAAG,OAAO,IAApZ,KAAK,CAAsZ,CAAC,EAAC,cAAK,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,EAAC,CAAC,EAAC,WAAW,EAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAC,YAAY,EAAC,sBAAsB,EAAC,UAAU,EAAC,iCAAiC,EAAC,MAAM,EAAC,mCAAmC,EAAC,eAAe,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,CAAA,CAAC,CAAA,oCAAoC,CAAA,CAAC,CAAA,MAAM,EAAC,GAAG,IAAM,EAAA,gBAAM,KAAK,EAAE,EAAC,OAAO,EAAC,aAAa,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,QAAQ,EAAC,aAAE,yBAAO,KAAK,GAAQ,EAAA,KAAC,iBAAiB,IAAC,IAAI,EAAE,IAAI,GAAG,IAAO,IAAM,YAAG,QAAQ,GAAe,CAAC,CAAA,CAAC","sourcesContent":["\"use client\";\n\n// Artwork, label and open mark form one centred column; the label used to sit at the start under centred artwork with\n// the mark floating at the row end (2026-10-17 review E20).\n// Fixed 260×160 artwork is decorative; cap at three previews to keep the motif bounded. The trigger label and expanded content remain fluid.\nimport type{ReactNode}from'react';import{Collapsible,CollapsibleMarker}from'./collapsible.js';import{useHjmTheme}from'./provider.js';\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type FolderPreviewProps=Readonly<{label:string;open:boolean;onOpenChange:(open:boolean)=>void;previews:readonly ReactNode[];children:ReactNode;disabled?:boolean;\n /** Canonical layout-only placement on the root Collapsible. Controlled visual keys are excluded. */\n layoutStyle?:HjmCompositionStyleProp}>;\n/** Preview slots are decorative snapshots; expanded children own real actions and accessible content. */\nexport function FolderPreview({label,open,onOpenChange,previews,children,disabled=false,layoutStyle}:FolderPreviewProps){const{environment}=useHjmTheme();if(!label.trim())throw new TypeError('Folder needs a label');return <Collapsible open={open} onOpenChange={onOpenChange} disabled={disabled} {...(layoutStyle===undefined?{}:{layoutStyle})} marker=\"none\" trigger={<div style={{width:'100%',minWidth:0,display:'flex',flexDirection:'column',alignItems:'center',gap:'var(--hjm-space-sm)'}}><div inert aria-hidden=\"true\" style={{position:'relative',height:160,width:'100%',maxWidth:260,pointerEvents:'none'}}>{previews.slice(0,3).map((preview,index)=><div key={index} style={{position:'absolute',insetInlineStart:'20%',top:24+index*8,width:'60%',height:104,overflow:'hidden',borderRadius:'var(--hjm-radius-md)',background:'var(--hjm-color-surface-alt)',border:'1px solid var(--hjm-color-border)',transform:`translateX(${(index-1)*(open?34:10)}px) rotate(${(index-1)*(open?12:4)}deg)`,transition:environment.reducedMotion?'none':'transform 200ms ease-out'}}>{preview}</div>)}<div style={{position:'absolute',bottom:0,insetInline:0,height:56,borderRadius:'var(--hjm-radius-lg)',background:'var(--hjm-color-surface-accent)',border:'1px solid var(--hjm-color-border)',transformOrigin:'bottom',transform:open?'perspective(400px) rotateX(-15deg)':'none'}}/></div><span style={{display:'inline-flex',alignItems:'center',gap:'var(--hjm-space-xs)',textAlign:'center'}}><span>{label}</span><CollapsibleMarker open={open}/></span></div>}>{children}</Collapsible>;}\n"]}
package/dist/forms.d.ts CHANGED
@@ -2,6 +2,7 @@ import { type FieldAlign, type FieldShape, type FieldVariant } from "@hjmds/desi
2
2
  import { type SearchFieldSize } from "@hjmds/design-contracts/recipes";
3
3
  import { type PasswordFieldAutofillHint, type PasswordFieldSize } from "@hjmds/design-contracts/components/password-field";
4
4
  import { type OtpFieldSize, type OtpFieldPresentation } from "@hjmds/design-contracts/components/otp-field";
5
+ import { type CharacterCountOptions } from "@hjmds/design-contracts/character-count";
5
6
  import { type HTMLAttributes, type InputHTMLAttributes, type ReactNode, type TextareaHTMLAttributes } from "react";
6
7
  import type { HjmCompositionStyleProp } from "./composition-style.js";
7
8
  type FieldCopyProps = Readonly<{
@@ -62,7 +63,16 @@ type SharedInputProps = FieldCopyProps & Readonly<{
62
63
  */
63
64
  initialFocusTarget?: boolean;
64
65
  }>;
65
- export type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & SharedInputProps & Readonly<{
66
+ /** TextField and TextArea only; SearchField, PasswordField and OtpField have no free-text limit to count. */
67
+ type CharacterCountProps = Readonly<{
68
+ /**
69
+ * Shows `length/max` and the product's sentence for the current status under the control
70
+ * (`resolveCharacterCount`). `overflow: "block"` (default) also sets the platform `maxLength`; do not pass
71
+ * `maxLength` together with it.
72
+ */
73
+ characterCount?: CharacterCountOptions;
74
+ }>;
75
+ export type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, "size"> & SharedInputProps & CharacterCountProps & Readonly<{
66
76
  /**
67
77
  * Receives the next string value, the same callback name and shape as the
68
78
  * Native TextField. Web TextArea retains the DOM `onChange` callback. Before 1.5.0 Web TextField only had
@@ -98,6 +108,13 @@ export declare const TextField: import("react").ForwardRefExoticComponent<Omit<I
98
108
  * entry; revealing a field after interaction does not focus it. Bottom sheets disable automatic input focus.
99
109
  */
100
110
  initialFocusTarget?: boolean;
111
+ }> & Readonly<{
112
+ /**
113
+ * Shows `length/max` and the product's sentence for the current status under the control
114
+ * (`resolveCharacterCount`). `overflow: "block"` (default) also sets the platform `maxLength`; do not pass
115
+ * `maxLength` together with it.
116
+ */
117
+ characterCount?: CharacterCountOptions;
101
118
  }> & Readonly<{
102
119
  /**
103
120
  * Receives the next string value, the same callback name and shape as the
@@ -107,7 +124,7 @@ export declare const TextField: import("react").ForwardRefExoticComponent<Omit<I
107
124
  */
108
125
  onValueChange?: (value: string) => void;
109
126
  }> & import("react").RefAttributes<HTMLInputElement>>;
110
- export type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & Omit<SharedInputProps, "leading"> & Readonly<{
127
+ export type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & Omit<SharedInputProps, "leading"> & CharacterCountProps & Readonly<{
111
128
  /**
112
129
  * Action before the text inside the field frame (for example a composer's camera button),
113
130
  * vertically centred while the text grows. Mirrors `trailing`; `leading` stays omitted because
@@ -123,6 +140,13 @@ export type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & Omit<S
123
140
  maxVisibleLines?: number;
124
141
  }>;
125
142
  export declare const TextArea: import("react").ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & Omit<SharedInputProps, "leading"> & Readonly<{
143
+ /**
144
+ * Shows `length/max` and the product's sentence for the current status under the control
145
+ * (`resolveCharacterCount`). `overflow: "block"` (default) also sets the platform `maxLength`; do not pass
146
+ * `maxLength` together with it.
147
+ */
148
+ characterCount?: CharacterCountOptions;
149
+ }> & Readonly<{
126
150
  /**
127
151
  * Action before the text inside the field frame (for example a composer's camera button),
128
152
  * vertically centred while the text grows. Mirrors `trailing`; `leading` stays omitted because
@@ -209,7 +233,7 @@ export type PasswordFieldToggleRenderProps = Readonly<{
209
233
  revealed: boolean;
210
234
  disabled: boolean;
211
235
  }>;
212
- export type PasswordFieldProps = Omit<TextFieldProps, "autoComplete" | "defaultValue" | "size" | "trailing" | "type" | "value"> & Readonly<{
236
+ export type PasswordFieldProps = Omit<TextFieldProps, "autoComplete" | "characterCount" | "defaultValue" | "size" | "trailing" | "type" | "value"> & Readonly<{
213
237
  value?: string;
214
238
  defaultValue?: string;
215
239
  onValueChange?: (value: string) => void;
@@ -223,7 +247,7 @@ export type PasswordFieldProps = Omit<TextFieldProps, "autoComplete" | "defaultV
223
247
  renderToggleIcon?: (props: PasswordFieldToggleRenderProps) => ReactNode;
224
248
  }>;
225
249
  /** Password input with an independently controlled, selection-safe reveal action. */
226
- export declare const PasswordField: import("react").ForwardRefExoticComponent<Omit<TextFieldProps, "value" | "defaultValue" | "size" | "type" | "trailing" | "autoComplete"> & Readonly<{
250
+ export declare const PasswordField: import("react").ForwardRefExoticComponent<Omit<TextFieldProps, "value" | "defaultValue" | "size" | "type" | "trailing" | "autoComplete" | "characterCount"> & Readonly<{
227
251
  value?: string;
228
252
  defaultValue?: string;
229
253
  onValueChange?: (value: string) => void;
@@ -236,7 +260,7 @@ export declare const PasswordField: import("react").ForwardRefExoticComponent<Om
236
260
  size?: PasswordFieldSize;
237
261
  renderToggleIcon?: (props: PasswordFieldToggleRenderProps) => ReactNode;
238
262
  }> & import("react").RefAttributes<HTMLInputElement>>;
239
- export type OtpFieldProps = Omit<TextFieldProps, "autoComplete" | "defaultValue" | "leading" | "maxLength" | "shape" | "size" | "trailing" | "type" | "value" | "variant"> & Readonly<{
263
+ export type OtpFieldProps = Omit<TextFieldProps, "autoComplete" | "characterCount" | "defaultValue" | "leading" | "maxLength" | "shape" | "size" | "trailing" | "type" | "value" | "variant"> & Readonly<{
240
264
  length: number;
241
265
  value?: string;
242
266
  defaultValue?: string;
@@ -247,7 +271,7 @@ export type OtpFieldProps = Omit<TextFieldProps, "autoComplete" | "defaultValue"
247
271
  busy?: boolean;
248
272
  }>;
249
273
  /** One accessible numeric input rendered as decorative OTP slots. */
250
- export declare const OtpField: import("react").ForwardRefExoticComponent<Omit<TextFieldProps, "value" | "defaultValue" | "size" | "type" | "variant" | "leading" | "trailing" | "shape" | "autoComplete" | "maxLength"> & Readonly<{
274
+ export declare const OtpField: import("react").ForwardRefExoticComponent<Omit<TextFieldProps, "value" | "defaultValue" | "size" | "type" | "variant" | "leading" | "trailing" | "shape" | "maxLength" | "autoComplete" | "characterCount"> & Readonly<{
251
275
  length: number;
252
276
  value?: string;
253
277
  defaultValue?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../src/forms.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../src/forms.tsx"],"names":[],"mappings":"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"}
package/dist/forms.js CHANGED
@@ -1,8 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
3
  import { fieldRecipe, } from "@hjmds/design-contracts/recipes/base";
3
4
  import { iconRecipe, searchFieldRecipe, } from "@hjmds/design-contracts/recipes";
4
5
  import { passwordFieldRecipe, resolvePasswordFieldDescriptor, } from "@hjmds/design-contracts/components/password-field";
5
6
  import { getOtpFieldSlotValues, otpFieldRecipe, resolveOtpFieldValue, } from "@hjmds/design-contracts/components/otp-field";
7
+ import { resolveCharacterCount, resolveCharacterCountMaxLength, shouldAnnounceCharacterCount, } from "@hjmds/design-contracts/character-count";
6
8
  import { createContext, forwardRef, useContext, useEffect, useId, useLayoutEffect, useRef, useState, } from "react";
7
9
  import { composeRefs, classNames, isAriaInvalid, useControllableState } from "./internal.js";
8
10
  import { useInitialFocusTarget } from "./internal/initial-focus.js";
@@ -80,10 +82,43 @@ function requireFieldAccessibleName(label, ariaLabel) {
80
82
  throw new TypeError("Field controls require either label or aria-label");
81
83
  }
82
84
  }
83
- export const TextField = forwardRef(function TextField({ id, label, description, error, required, disabled, variant, shape, align, leading, trailing, fieldClassName, className, onFocus, onBlur, onChange, onValueChange, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-label": ariaLabel, layoutStyle, initialFocusTarget, ...props }, ref) {
85
+ /*
86
+ Character count (characterCountRecipe, 2026-10-23 BurnTok ComposerCount/TextLengthHint). The row sits under the
87
+ control and before the description, and `aria-describedby` references it, so the counter and sentence are read on
88
+ focus. A separate polite live region announces only on entering near/short/over: announcing each keystroke
89
+ would talk over the typed text.
90
+ */
91
+ function useCharacterCount(options, value, ownMaxLength) {
92
+ if (options && ownMaxLength !== undefined) {
93
+ throw new TypeError("Pass the limit through characterCount.max instead of maxLength");
94
+ }
95
+ const state = options ? resolveCharacterCount(value, options) : undefined;
96
+ const previous = useRef(undefined);
97
+ const [announcement, setAnnouncement] = useState("");
98
+ const status = state?.status;
99
+ useEffect(() => {
100
+ if (state && shouldAnnounceCharacterCount(previous.current, state))
101
+ setAnnouncement(state.message ?? "");
102
+ previous.current = status;
103
+ // Only a status change announces; the message inside one status changes with every keystroke.
104
+ }, [status]);
105
+ const maxLength = options ? resolveCharacterCountMaxLength(options) : ownMaxLength;
106
+ return { ...(state ? { state } : {}), announcement, ...(maxLength === undefined ? {} : { maxLength }) };
107
+ }
108
+ function CharacterCountRow({ id, state, announcement }) {
109
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { id: id, className: "hjm-field__count", "data-status": state.status, "data-invalid": state.invalid || undefined, children: [state.message ? _jsx("span", { className: "hjm-field__count-message", children: state.message }) : null, _jsx("span", { className: "hjm-field__counter", children: state.counter })] }), _jsx("span", { className: "hjm-visually-hidden", "aria-live": "polite", "data-hjm-field-count-announcement": "", children: announcement })] }));
110
+ }
111
+ function useDraftValue(value, defaultValue) {
112
+ const [draft, setDraft] = useState(() => (defaultValue === undefined || defaultValue === null ? "" : String(defaultValue)));
113
+ return [value === undefined || value === null ? draft : String(value), setDraft];
114
+ }
115
+ export const TextField = forwardRef(function TextField({ id, label, description, error, required, disabled, variant, shape, align, leading, trailing, fieldClassName, className, onFocus, onBlur, onChange, onValueChange, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-label": ariaLabel, layoutStyle, initialFocusTarget, characterCount, maxLength: ownMaxLength, ...props }, ref) {
84
116
  const ids = useFieldIds(id);
85
117
  const [focused, setFocused] = useState(false);
86
118
  requireFieldAccessibleName(label, ariaLabel);
119
+ const [countedValue, setDraft] = useDraftValue(props.value, props.defaultValue);
120
+ const count = useCharacterCount(characterCount, countedValue, ownMaxLength);
121
+ const countId = `${ids.controlId}-count`;
87
122
  const control = useRef(null);
88
123
  useInitialFocusTarget(control, initialFocusTarget);
89
124
  const handleFocus = (event) => {
@@ -94,15 +129,19 @@ export const TextField = forwardRef(function TextField({ id, label, description,
94
129
  setFocused(false);
95
130
  onBlur?.(event);
96
131
  };
97
- return (_jsx(FieldFrame, { controlId: ids.controlId, label: label, description: description, error: error, required: required ?? false, disabled: disabled ?? false, focused: focused, invalid: isAriaInvalid(ariaInvalid), variant: variant ?? fieldRecipe.defaults.variant, shape: shape ?? fieldRecipe.defaults.shape, align: align ?? fieldRecipe.defaults.align, className: fieldClassName, ...(layoutStyle === undefined ? {} : { layoutStyle }), ...(description ? { descriptionId: ids.descriptionId } : {}), ...(error ? { errorId: ids.errorId } : {}), children: _jsxs("div", { className: "hjm-field__control", children: [leading ? _jsx("span", { className: "hjm-field__affix", children: leading }) : null, _jsx("input", { ...props, ref: composeRefs(control, ref), id: ids.controlId, className: classNames("hjm-field__input", className), required: required, disabled: disabled, "aria-invalid": error ? true : ariaInvalid, "aria-label": ariaLabel, "aria-describedby": describedBy(ariaDescribedBy, description, error, ids.descriptionId, ids.errorId), onFocus: handleFocus, onBlur: handleBlur, onChange: (event) => {
98
- onChange?.(event);
99
- onValueChange?.(event.currentTarget.value);
100
- } }), trailing ? _jsx("span", { className: "hjm-field__affix", children: trailing }) : null] }) }));
132
+ return (_jsxs(FieldFrame, { controlId: ids.controlId, label: label, description: description, error: error, required: required ?? false, disabled: disabled ?? false, focused: focused, invalid: isAriaInvalid(ariaInvalid) || count.state?.status === "over", variant: variant ?? fieldRecipe.defaults.variant, shape: shape ?? fieldRecipe.defaults.shape, align: align ?? fieldRecipe.defaults.align, className: fieldClassName, ...(layoutStyle === undefined ? {} : { layoutStyle }), ...(description ? { descriptionId: ids.descriptionId } : {}), ...(error ? { errorId: ids.errorId } : {}), children: [_jsxs("div", { className: "hjm-field__control", children: [leading ? _jsx("span", { className: "hjm-field__affix", children: leading }) : null, _jsx("input", { ...props, ref: composeRefs(control, ref), id: ids.controlId, className: classNames("hjm-field__input", className), required: required, disabled: disabled, ...(count.maxLength === undefined ? {} : { maxLength: count.maxLength }), "aria-invalid": error || count.state?.status === "over" ? true : ariaInvalid, "aria-label": ariaLabel, "aria-describedby": describedBy([ariaDescribedBy, count.state ? countId : undefined].filter(Boolean).join(" ") || undefined, description, error, ids.descriptionId, ids.errorId), onFocus: handleFocus, onBlur: handleBlur, onChange: (event) => {
133
+ setDraft(event.currentTarget.value);
134
+ onChange?.(event);
135
+ onValueChange?.(event.currentTarget.value);
136
+ } }), trailing ? _jsx("span", { className: "hjm-field__affix", children: trailing }) : null] }), count.state ? _jsx(CharacterCountRow, { id: countId, state: count.state, announcement: count.announcement }) : null] }));
101
137
  });
102
- export const TextArea = forwardRef(function TextArea({ id, label, description, error, required, disabled, variant, shape, trailing, leadingAction, align, fieldClassName, className, onFocus, onBlur, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-label": ariaLabel, minVisibleLines, maxVisibleLines, style, layoutStyle, initialFocusTarget, ...props }, ref) {
138
+ export const TextArea = forwardRef(function TextArea({ id, label, description, error, required, disabled, variant, shape, trailing, leadingAction, align, fieldClassName, className, onFocus, onBlur, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-label": ariaLabel, minVisibleLines, maxVisibleLines, style, layoutStyle, initialFocusTarget, characterCount, maxLength: ownMaxLength, onChange, ...props }, ref) {
103
139
  const ids = useFieldIds(id);
104
140
  const [focused, setFocused] = useState(false);
105
141
  requireFieldAccessibleName(label, ariaLabel);
142
+ const [countedValue, setDraft] = useDraftValue(props.value, props.defaultValue);
143
+ const count = useCharacterCount(characterCount, countedValue, ownMaxLength);
144
+ const countId = `${ids.controlId}-count`;
106
145
  const control = useRef(null);
107
146
  useInitialFocusTarget(control, initialFocusTarget);
108
147
  // Bounds are expressed in lines so the recipe keeps line height and padding.
@@ -114,13 +153,16 @@ export const TextArea = forwardRef(function TextArea({ id, label, description, e
114
153
  ? {}
115
154
  : { "--hjm-field-max-visible-lines": maxVisibleLines }),
116
155
  };
117
- return (_jsx(FieldFrame, { controlId: ids.controlId, label: label, description: description, error: error, required: required ?? false, disabled: disabled ?? false, focused: focused, invalid: isAriaInvalid(ariaInvalid), variant: variant ?? fieldRecipe.defaults.variant, shape: shape ?? fieldRecipe.defaults.shape, align: align ?? fieldRecipe.defaults.align, className: fieldClassName, ...(layoutStyle === undefined ? {} : { layoutStyle }), ...(description ? { descriptionId: ids.descriptionId } : {}), ...(error ? { errorId: ids.errorId } : {}), children: _jsxs("div", { className: "hjm-field__control hjm-field__control--multiline", children: [leadingAction ? _jsx("span", { className: "hjm-field__leading", children: leadingAction }) : null, _jsx("textarea", { ...props, ref: composeRefs(control, ref), id: ids.controlId, className: classNames("hjm-field__input", className), style: { ...style, ...lineBounds }, required: required, disabled: disabled, "aria-invalid": error ? true : ariaInvalid, "aria-label": ariaLabel, "aria-describedby": describedBy(ariaDescribedBy, description, error, ids.descriptionId, ids.errorId), onFocus: (event) => {
118
- setFocused(true);
119
- onFocus?.(event);
120
- }, onBlur: (event) => {
121
- setFocused(false);
122
- onBlur?.(event);
123
- } }), trailing ? _jsx("span", { className: "hjm-field__trailing", children: trailing }) : null] }) }));
156
+ return (_jsxs(FieldFrame, { controlId: ids.controlId, label: label, description: description, error: error, required: required ?? false, disabled: disabled ?? false, focused: focused, invalid: isAriaInvalid(ariaInvalid) || count.state?.status === "over", variant: variant ?? fieldRecipe.defaults.variant, shape: shape ?? fieldRecipe.defaults.shape, align: align ?? fieldRecipe.defaults.align, className: fieldClassName, ...(layoutStyle === undefined ? {} : { layoutStyle }), ...(description ? { descriptionId: ids.descriptionId } : {}), ...(error ? { errorId: ids.errorId } : {}), children: [_jsxs("div", { className: "hjm-field__control hjm-field__control--multiline", children: [leadingAction ? _jsx("span", { className: "hjm-field__leading", children: leadingAction }) : null, _jsx("textarea", { ...props, ref: composeRefs(control, ref), id: ids.controlId, className: classNames("hjm-field__input", className), style: { ...style, ...lineBounds }, required: required, disabled: disabled, ...(count.maxLength === undefined ? {} : { maxLength: count.maxLength }), "aria-invalid": error || count.state?.status === "over" ? true : ariaInvalid, "aria-label": ariaLabel, "aria-describedby": describedBy([ariaDescribedBy, count.state ? countId : undefined].filter(Boolean).join(" ") || undefined, description, error, ids.descriptionId, ids.errorId), onChange: (event) => {
157
+ setDraft(event.currentTarget.value);
158
+ onChange?.(event);
159
+ }, onFocus: (event) => {
160
+ setFocused(true);
161
+ onFocus?.(event);
162
+ }, onBlur: (event) => {
163
+ setFocused(false);
164
+ onBlur?.(event);
165
+ } }), trailing ? _jsx("span", { className: "hjm-field__trailing", children: trailing }) : null] }), count.state ? _jsx(CharacterCountRow, { id: countId, state: count.state, announcement: count.announcement }) : null] }));
124
166
  });
125
167
  export const SearchField = forwardRef(function SearchField({ value: valueProp, defaultValue = "", onValueChange, onChange, size = searchFieldRecipe.defaults.size, clearLabel, onClear, loading = false, renderSearchIcon, renderClearIcon, renderLoadingIndicator, leading, trailing, fieldClassName, disabled, "aria-busy": ariaBusy, ...props }, forwardedRef) {
126
168
  const [value, setValue] = useControllableState({