@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
package/dist/forms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../src/forms.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n fieldRecipe,\n type FieldAlign,\n type FieldShape,\n type FieldVariant,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n iconRecipe,\n searchFieldRecipe,\n type SearchFieldSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n passwordFieldRecipe,\n resolvePasswordFieldDescriptor,\n type PasswordFieldAutofillHint,\n type PasswordFieldSize,\n} from \"@hjmds/design-contracts/components/password-field\";\nimport {\n getOtpFieldSlotValues,\n otpFieldRecipe,\n resolveOtpFieldValue,\n type OtpFieldSize,\n type OtpFieldPresentation,\n} from \"@hjmds/design-contracts/components/otp-field\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { composeRefs, classNames, isAriaInvalid, useControllableState } from \"./internal.js\";\nimport { useInitialFocusTarget } from \"./internal/initial-focus.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { FieldError } from \"./internal/field-error.js\";\n\ntype FieldCopyProps = Readonly<{\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n}>;\n\ntype FieldFrameProps = HTMLAttributes<HTMLDivElement> &\n FieldCopyProps &\n Readonly<{\n controlId: string;\n descriptionId?: string;\n errorId?: string;\n disabled?: boolean;\n focused?: boolean;\n invalid?: boolean;\n variant?: FieldVariant;\n shape?: FieldShape;\n align?: FieldAlign;\n /** Component recipe override of fieldRecipe.disabledOpacity (OtpField). */\n disabledOpacity?: number;\n children: ReactNode;\n /** Canonical layout-only placement on the field frame (`.hjm-field`), not the input. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/*\n How far a disabled field fades its label and control (fieldRecipe.disabledScope). The\n frame defaults to fieldRecipe.disabledOpacity; SearchField and PasswordField render\n through the public TextField, so they hand their own recipe value down this\n module-private context instead of widening TextField's public props.\n*/\nconst FieldDisabledOpacityContext = createContext<number | undefined>(undefined);\n\nfunction FieldFrame({\n controlId,\n label,\n description,\n error,\n descriptionId,\n errorId,\n required = false,\n disabled = false,\n focused = false,\n invalid = false,\n variant = fieldRecipe.defaults.variant,\n shape = fieldRecipe.defaults.shape,\n align = fieldRecipe.defaults.align,\n disabledOpacity,\n className,\n children,\n layoutStyle,\n style,\n ...props\n}: FieldFrameProps) {\n // A grouped field may reference one external error; aria-invalid must still\n // use the invalid recipe even when no inline error copy is repeated.\n const state = disabled ? \"disabled\" : error || invalid ? \"invalid\" : focused ? \"focused\" : \"idle\";\n const inheritedOpacity = useContext(FieldDisabledOpacityContext);\n const recipeOpacity = disabledOpacity ?? inheritedOpacity;\n return (\n <div\n {...props}\n // The stylesheet fades the label and control with --hjm-field-disabled-opacity\n // (theme value: fieldRecipe.disabledOpacity); a component recipe value is set\n // here, only while disabled, so enabled roots keep their old inline style.\n style={{\n ...style,\n ...layoutStyle,\n ...(disabled && recipeOpacity !== undefined\n ? ({ \"--hjm-field-disabled-opacity\": recipeOpacity } as CSSProperties)\n : {}),\n }}\n className={classNames(\"hjm-field\", className)}\n data-state={state}\n data-invalid={Boolean(error || invalid) || undefined}\n data-variant={variant}\n data-shape={shape}\n data-align={align}\n >\n {label !== undefined && label !== null ? (\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}\n {required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n ) : null}\n {children}\n {/*\n Support text stays visible under an error instead of being replaced by\n it: the guidance (a length or format hint) is what tells the user how to clear the\n error, and hiding it is why a product copied that sentence into its own\n error string. Both are also referenced by aria-describedby.\n */}\n {description ? (\n <div id={descriptionId} className=\"hjm-field__description\">\n {description}\n </div>\n ) : null}\n <FieldError id={errorId} error={error} />\n </div>\n );\n}\n\nexport type FieldControlProps = Readonly<{\n id: string;\n required: boolean;\n disabled: boolean;\n \"aria-invalid\"?: true;\n \"aria-describedby\"?: string;\n}>;\n\nexport type FieldProps = Omit<\n FieldFrameProps,\n \"children\" | \"descriptionId\" | \"errorId\" | \"disabledOpacity\"\n> &\n Readonly<{\n label: ReactNode;\n children: ReactNode | ((props: FieldControlProps) => ReactNode);\n }>;\n\n/** Generic frame for custom native controls; `controlId` keeps the label explicit. */\nexport function Field({\n controlId,\n description,\n error,\n required = false,\n disabled = false,\n children,\n ...props\n}: FieldProps) {\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const controlProps: FieldControlProps = {\n id: controlId,\n required,\n disabled,\n ...(error ? { \"aria-invalid\": true as const } : {}),\n // Same merge as the built-in fields: support text stays referenced once an\n // error appears, so a custom control does not have to re-derive the ids.\n ...(description || error\n ? {\n \"aria-describedby\": [description ? descriptionId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \"),\n }\n : {}),\n };\n return (\n <FieldFrame\n {...props}\n controlId={controlId}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n {...(description ? { descriptionId } : {})}\n {...(error ? { errorId } : {})}\n >\n {typeof children === \"function\" ? children(controlProps) : children}\n </FieldFrame>\n );\n}\n\nfunction useFieldIds(id: string | undefined) {\n const generatedId = useId();\n const controlId = id ?? `hjm-${generatedId.replaceAll(\":\", \"\")}`;\n return {\n controlId,\n descriptionId: `${controlId}-description`,\n errorId: `${controlId}-error`,\n } as const;\n}\n\n/*\n Support text and the error are both referenced when both exist, in DOM reading\n order, and the consumer's own `aria-describedby` is kept in front of them.\n Announcing only the error (the earlier behaviour) dropped the guidance that\n explains how to fix it — exactly the text a product then duplicated into the\n error string by hand.\n*/\nfunction describedBy(\n own: string | undefined,\n description: ReactNode | undefined,\n error: ReactNode | undefined,\n descriptionId: string,\n errorId: string,\n): string | undefined {\n return [own, description ? descriptionId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n}\n\nfunction requireFieldAccessibleName(label: ReactNode | undefined, ariaLabel: string | undefined) {\n if ((label === undefined || label === null) && !ariaLabel?.trim()) {\n throw new TypeError(\"Field controls require either label or aria-label\");\n }\n}\n\ntype SharedInputProps = FieldCopyProps &\n Readonly<{\n variant?: FieldVariant;\n shape?: FieldShape;\n /**\n * Text placement inside the control. `start` follows the resolved\n * direction; `center` suits a short, ceremonial single value such as a\n * nickname or a code. Replaces a `text-align` override.\n */\n align?: FieldAlign;\n leading?: ReactNode;\n trailing?: ReactNode;\n fieldClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input element, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n /**\n * Page-entry target: true prefers this field, false excludes it, omission uses tree order. Only chooses during\n * entry; revealing a field after interaction does not focus it. Bottom sheets disable automatic input focus.\n */\n initialFocusTarget?: boolean;\n }>;\n\nexport type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> &\n SharedInputProps &\n Readonly<{\n /**\n * Receives the next string value, the same callback name and shape as the\n * Native TextField. Web TextArea retains the DOM `onChange` callback. Before 1.5.0 Web TextField only had\n * the DOM `onChange`, so shared form code needed a platform branch. Both\n * fire; `onChange` stays for event access.\n */\n onValueChange?: (value: string) => void;\n }>;\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n function TextField(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n variant,\n shape,\n align,\n leading,\n trailing,\n fieldClassName,\n className,\n onFocus,\n onBlur,\n onChange,\n onValueChange,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n layoutStyle,\n initialFocusTarget,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const control = useRef<HTMLInputElement>(null);\n useInitialFocusTarget(control, initialFocusTarget);\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n return (\n <FieldFrame\n controlId={ids.controlId}\n label={label}\n description={description}\n error={error}\n required={required ?? false}\n disabled={disabled ?? false}\n focused={focused}\n invalid={isAriaInvalid(ariaInvalid)}\n variant={variant ?? fieldRecipe.defaults.variant}\n shape={shape ?? fieldRecipe.defaults.shape}\n align={align ?? fieldRecipe.defaults.align}\n className={fieldClassName}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div className=\"hjm-field__control\">\n {leading ? <span className=\"hjm-field__affix\">{leading}</span> : null}\n <input\n {...props}\n ref={composeRefs(control, ref)}\n id={ids.controlId}\n className={classNames(\"hjm-field__input\", className)}\n required={required}\n disabled={disabled}\n aria-invalid={error ? true : ariaInvalid}\n aria-label={ariaLabel}\n aria-describedby={describedBy(\n ariaDescribedBy,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={(event) => {\n onChange?.(event);\n onValueChange?.(event.currentTarget.value);\n }}\n />\n {trailing ? <span className=\"hjm-field__affix\">{trailing}</span> : null}\n </div>\n </FieldFrame>\n );\n },\n);\n\nexport type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> &\n Omit<SharedInputProps, \"leading\"> &\n Readonly<{\n /**\n * Action before the text inside the field frame (for example a composer's camera button),\n * vertically centred while the text grows. Mirrors `trailing`; `leading` stays omitted because\n * TextField's `leading` is a decorative affix with muted color, not an action slot.\n */\n leadingAction?: ReactNode;\n /**\n * Lower bound for a growing multiline field, in visible lines. Height is\n * recipe-owned, so this semantic axis replaces a `min-height` override.\n */\n minVisibleLines?: number;\n /** Upper bound for a growing multiline field, in visible lines. */\n maxVisibleLines?: number;\n }>;\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n variant,\n shape,\n trailing,\n leadingAction,\n align,\n fieldClassName,\n className,\n onFocus,\n onBlur,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n minVisibleLines,\n maxVisibleLines,\n style,\n layoutStyle,\n initialFocusTarget,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const control = useRef<HTMLTextAreaElement>(null);\n useInitialFocusTarget(control, initialFocusTarget);\n // Bounds are expressed in lines so the recipe keeps line height and padding.\n const lineBounds = {\n ...(minVisibleLines === undefined\n ? {}\n : { \"--hjm-field-min-visible-lines\": minVisibleLines }),\n ...(maxVisibleLines === undefined\n ? {}\n : { \"--hjm-field-max-visible-lines\": maxVisibleLines }),\n } as CSSProperties;\n return (\n <FieldFrame\n controlId={ids.controlId}\n label={label}\n description={description}\n error={error}\n required={required ?? false}\n disabled={disabled ?? false}\n focused={focused}\n invalid={isAriaInvalid(ariaInvalid)}\n variant={variant ?? fieldRecipe.defaults.variant}\n shape={shape ?? fieldRecipe.defaults.shape}\n align={align ?? fieldRecipe.defaults.align}\n className={fieldClassName}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div className=\"hjm-field__control hjm-field__control--multiline\">\n {leadingAction ? <span className=\"hjm-field__leading\">{leadingAction}</span> : null}\n <textarea\n {...props}\n ref={composeRefs(control, ref)}\n id={ids.controlId}\n className={classNames(\"hjm-field__input\", className)}\n style={{ ...style, ...lineBounds }}\n required={required}\n disabled={disabled}\n aria-invalid={error ? true : ariaInvalid}\n aria-label={ariaLabel}\n aria-describedby={describedBy(\n ariaDescribedBy,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n onBlur={(event) => {\n setFocused(false);\n onBlur?.(event);\n }}\n />\n {trailing ? <span className=\"hjm-field__trailing\">{trailing}</span> : null}\n </div>\n </FieldFrame>\n );\n },\n);\n\nexport type SearchFieldProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"value\" | \"defaultValue\"\n> &\n SharedInputProps &\n Readonly<{\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: SearchFieldSize;\n /** Localized accessible name for the clear action. */\n clearLabel: string;\n onClear?: () => void;\n /** Keeps the input mounted and named while replacing trailing actions with progress. */\n loading?: boolean;\n /** Product icon adapter; the renderer owns size and inherited color. */\n renderSearchIcon?: (props: SearchFieldIconRenderProps) => ReactNode;\n /** Product icon adapter for the clear action. */\n renderClearIcon?: (props: SearchFieldIconRenderProps) => ReactNode;\n /** Optional progress adapter. The default is the canonical CSS spinner. */\n renderLoadingIndicator?: (props: SearchFieldIconRenderProps) => ReactNode;\n }>;\n\nexport type SearchFieldIconRenderProps = Readonly<{\n color: \"currentColor\";\n size: number;\n}>;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n function SearchField(\n {\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onChange,\n size = searchFieldRecipe.defaults.size,\n clearLabel,\n onClear,\n loading = false,\n renderSearchIcon,\n renderClearIcon,\n renderLoadingIndicator,\n leading,\n trailing,\n fieldClassName,\n disabled,\n \"aria-busy\": ariaBusy,\n ...props\n },\n forwardedRef,\n ) {\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const inputRef = useRef<HTMLInputElement>(null);\n const iconAppearance: SearchFieldIconRenderProps = {\n color: \"currentColor\",\n size: iconRecipe.sizes[searchFieldRecipe.sizes[size].glyph],\n };\n const canClear = value.length > 0 && !disabled && !props.readOnly;\n return (\n <FieldDisabledOpacityContext.Provider value={searchFieldRecipe.states.disabledOpacity}>\n <TextField\n {...props}\n ref={composeRefs(inputRef, forwardedRef)}\n type=\"search\"\n value={value}\n data-size={size}\n data-loading={loading || undefined}\n disabled={disabled}\n aria-busy={loading || ariaBusy || undefined}\n fieldClassName={classNames(\"hjm-search-field\", fieldClassName)!}\n leading={\n leading ?? (renderSearchIcon ? renderSearchIcon(iconAppearance) : undefined)\n }\n onChange={(event) => {\n setValue(event.currentTarget.value);\n onChange?.(event);\n }}\n trailing={\n loading ? (\n <span className=\"hjm-search-field__spinner\" aria-hidden=\"true\">\n {renderLoadingIndicator?.(iconAppearance)}\n </span>\n ) : canClear ? (\n <button\n type=\"button\"\n className=\"hjm-search-field__clear\"\n aria-label={clearLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n onClear?.();\n inputRef.current?.focus();\n }}\n >\n {renderClearIcon?.(iconAppearance) ?? \"×\"}\n </button>\n ) : trailing\n }\n />\n </FieldDisabledOpacityContext.Provider>\n );\n },\n);\n\nexport type PasswordFieldToggleRenderProps = Readonly<{\n name: \"visibility\" | \"visibilityOff\";\n color: \"currentColor\";\n size: number;\n revealed: boolean;\n disabled: boolean;\n}>;\n\nexport type PasswordFieldProps = Omit<\n TextFieldProps,\n \"autoComplete\" | \"defaultValue\" | \"size\" | \"trailing\" | \"type\" | \"value\"\n> &\n Readonly<{\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n revealed?: boolean;\n defaultRevealed?: boolean;\n onRevealedChange?: (revealed: boolean) => void;\n autofillHint: PasswordFieldAutofillHint;\n revealLabel: string;\n concealLabel: string;\n size?: PasswordFieldSize;\n renderToggleIcon?: (props: PasswordFieldToggleRenderProps) => ReactNode;\n }>;\n\n/** Password input with an independently controlled, selection-safe reveal action. */\nexport const PasswordField = forwardRef<HTMLInputElement, PasswordFieldProps>(\n function PasswordField(\n {\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onChange,\n revealed: revealedProp,\n defaultRevealed = false,\n onRevealedChange,\n autofillHint,\n revealLabel,\n concealLabel,\n size = passwordFieldRecipe.defaults.size,\n renderToggleIcon,\n fieldClassName,\n className,\n disabled,\n readOnly,\n ...props\n },\n forwardedRef,\n ) {\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const [revealed, setRevealed] = useControllableState({\n ...(revealedProp === undefined ? {} : { value: revealedProp }),\n defaultValue: defaultRevealed,\n ...(onRevealedChange === undefined ? {} : { onChange: onRevealedChange }),\n });\n const resolved = resolvePasswordFieldDescriptor(\n { revealed, autofillHint },\n {\n composeToggleAccessibleName: ({ willReveal }) =>\n willReveal ? revealLabel : concealLabel,\n },\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const selectionRef = useRef<Readonly<{ start: number; end: number }> | null>(null);\n\n useLayoutEffect(() => {\n const selection = selectionRef.current;\n if (!selection || !inputRef.current) return;\n inputRef.current.setSelectionRange(selection.start, selection.end);\n selectionRef.current = null;\n }, [revealed]);\n\n const toggleAppearance: PasswordFieldToggleRenderProps = {\n name: revealed\n ? passwordFieldRecipe.toggle.icons.revealed\n : passwordFieldRecipe.toggle.icons.concealed,\n color: \"currentColor\",\n size: iconRecipe.sizes.sm,\n revealed,\n disabled: disabled ?? false,\n };\n\n return (\n <FieldDisabledOpacityContext.Provider value={passwordFieldRecipe.states.disabledOpacity}>\n <TextField\n {...props}\n ref={composeRefs(inputRef, forwardedRef)}\n autoComplete={autofillHint === \"none\" ? \"off\" : autofillHint === \"current\" ? \"current-password\" : \"new-password\"}\n className={classNames(\"hjm-password-field__input\", className)}\n disabled={disabled}\n fieldClassName={classNames(\n \"hjm-password-field\",\n `hjm-password-field--${size}`,\n fieldClassName,\n )!}\n onChange={(event) => {\n setValue(event.currentTarget.value);\n onChange?.(event);\n }}\n readOnly={readOnly}\n trailing={(\n <button\n // No `aria-pressed`: the name already says the next action (\"Show/Hide\n // password\"), and a pressed state on top would read as \"Hide password,\n // pressed\" — two answers to one question (password-field.md, rationale 1).\n aria-label={resolved.toggleAccessibleName}\n className=\"hjm-password-field__toggle\"\n data-revealed={revealed || undefined}\n disabled={disabled}\n onClick={() => {\n const input = inputRef.current;\n if (input && input.selectionStart !== null && input.selectionEnd !== null) {\n selectionRef.current = {\n start: input.selectionStart,\n end: input.selectionEnd,\n };\n }\n setRevealed(!revealed);\n }}\n type=\"button\"\n >\n {renderToggleIcon?.(toggleAppearance) ?? <Icon name={toggleAppearance.name} size=\"sm\" />}\n </button>\n )}\n type={resolved.webInputType}\n value={value}\n />\n </FieldDisabledOpacityContext.Provider>\n );\n },\n);\n\nexport type OtpFieldProps = Omit<\n TextFieldProps,\n | \"autoComplete\"\n | \"defaultValue\"\n | \"leading\"\n | \"maxLength\"\n | \"shape\"\n | \"size\"\n | \"trailing\"\n | \"type\"\n | \"value\"\n | \"variant\"\n> &\n Readonly<{\n length: number;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n size?: OtpFieldSize;\n presentation?: OtpFieldPresentation;\n busy?: boolean;\n }>;\n\n/** One accessible numeric input rendered as decorative OTP slots. */\nexport const OtpField = forwardRef<HTMLInputElement, OtpFieldProps>(\n function OtpField(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n readOnly,\n busy = false,\n length,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onComplete,\n onChange,\n size = otpFieldRecipe.defaults.size,\n presentation = \"boxes\",\n fieldClassName,\n className,\n onFocus,\n onBlur,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n layoutStyle,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: resolveOtpFieldValue(length, defaultValue),\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const slots = getOtpFieldSlotValues({ length, value });\n const complete = value.length === length;\n const wasCompleteRef = useRef(complete);\n useEffect(() => {\n if (complete && !wasCompleteRef.current) onComplete?.(value);\n wasCompleteRef.current = complete;\n }, [complete, onComplete, value]);\n const activeIndex = Math.min(value.length, length - 1);\n\n return (\n <FieldFrame\n className={classNames(\"hjm-otp-field\", fieldClassName)}\n disabledOpacity={otpFieldRecipe.states.disabledOpacity}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n controlId={ids.controlId}\n description={description}\n disabled={(disabled ?? false) || busy}\n error={error}\n focused={focused}\n label={label}\n required={required ?? false}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div\n className=\"hjm-otp-field__control\"\n data-presentation={presentation}\n data-complete={complete || undefined}\n data-size={size}\n style={{ \"--hjm-otp-length\": length } as CSSProperties}\n >\n <input\n {...props}\n ref={ref}\n aria-busy={busy || undefined}\n aria-describedby={describedBy(\n ariaDescribedBy,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n aria-invalid={error ? true : ariaInvalid}\n aria-label={ariaLabel}\n autoComplete=\"one-time-code\"\n className={classNames(\"hjm-otp-field__input\", className)}\n // busy stays focusable (read-only); see otp-field.md.\n disabled={disabled}\n id={ids.controlId}\n inputMode=\"numeric\"\n maxLength={length}\n onBlur={(event) => {\n setFocused(false);\n onBlur?.(event);\n }}\n onChange={(event) => {\n setValue(resolveOtpFieldValue(length, event.currentTarget.value));\n onChange?.(event);\n }}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n pattern=\"[0-9]*\"\n readOnly={readOnly || busy}\n required={required}\n type=\"text\"\n value={value}\n />\n <div aria-hidden=\"true\" className=\"hjm-otp-field__slots\">\n {slots.map((digit, index) => (\n <span\n className=\"hjm-otp-field__slot\"\n data-state={error\n ? \"invalid\"\n : focused && index === activeIndex\n ? \"focused\"\n : digit\n ? \"filled\"\n : \"idle\"}\n key={index}\n >\n {digit}\n </span>\n ))}\n </div>\n </div>\n </FieldFrame>\n );\n },\n);\n"]}
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../src/forms.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport {\n fieldRecipe,\n type FieldAlign,\n type FieldShape,\n type FieldVariant,\n} from \"@hjmds/design-contracts/recipes/base\";\nimport {\n iconRecipe,\n searchFieldRecipe,\n type SearchFieldSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n passwordFieldRecipe,\n resolvePasswordFieldDescriptor,\n type PasswordFieldAutofillHint,\n type PasswordFieldSize,\n} from \"@hjmds/design-contracts/components/password-field\";\nimport {\n getOtpFieldSlotValues,\n otpFieldRecipe,\n resolveOtpFieldValue,\n type OtpFieldSize,\n type OtpFieldPresentation,\n} from \"@hjmds/design-contracts/components/otp-field\";\nimport {\n resolveCharacterCount,\n resolveCharacterCountMaxLength,\n shouldAnnounceCharacterCount,\n type CharacterCountOptions,\n type CharacterCountState,\n type CharacterCountStatus,\n} from \"@hjmds/design-contracts/character-count\";\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { composeRefs, classNames, isAriaInvalid, useControllableState } from \"./internal.js\";\nimport { useInitialFocusTarget } from \"./internal/initial-focus.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { FieldError } from \"./internal/field-error.js\";\n\ntype FieldCopyProps = Readonly<{\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n}>;\n\ntype FieldFrameProps = HTMLAttributes<HTMLDivElement> &\n FieldCopyProps &\n Readonly<{\n controlId: string;\n descriptionId?: string;\n errorId?: string;\n disabled?: boolean;\n focused?: boolean;\n invalid?: boolean;\n variant?: FieldVariant;\n shape?: FieldShape;\n align?: FieldAlign;\n /** Component recipe override of fieldRecipe.disabledOpacity (OtpField). */\n disabledOpacity?: number;\n children: ReactNode;\n /** Canonical layout-only placement on the field frame (`.hjm-field`), not the input. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\n/*\n How far a disabled field fades its label and control (fieldRecipe.disabledScope). The\n frame defaults to fieldRecipe.disabledOpacity; SearchField and PasswordField render\n through the public TextField, so they hand their own recipe value down this\n module-private context instead of widening TextField's public props.\n*/\nconst FieldDisabledOpacityContext = createContext<number | undefined>(undefined);\n\nfunction FieldFrame({\n controlId,\n label,\n description,\n error,\n descriptionId,\n errorId,\n required = false,\n disabled = false,\n focused = false,\n invalid = false,\n variant = fieldRecipe.defaults.variant,\n shape = fieldRecipe.defaults.shape,\n align = fieldRecipe.defaults.align,\n disabledOpacity,\n className,\n children,\n layoutStyle,\n style,\n ...props\n}: FieldFrameProps) {\n // A grouped field may reference one external error; aria-invalid must still\n // use the invalid recipe even when no inline error copy is repeated.\n const state = disabled ? \"disabled\" : error || invalid ? \"invalid\" : focused ? \"focused\" : \"idle\";\n const inheritedOpacity = useContext(FieldDisabledOpacityContext);\n const recipeOpacity = disabledOpacity ?? inheritedOpacity;\n return (\n <div\n {...props}\n // The stylesheet fades the label and control with --hjm-field-disabled-opacity\n // (theme value: fieldRecipe.disabledOpacity); a component recipe value is set\n // here, only while disabled, so enabled roots keep their old inline style.\n style={{\n ...style,\n ...layoutStyle,\n ...(disabled && recipeOpacity !== undefined\n ? ({ \"--hjm-field-disabled-opacity\": recipeOpacity } as CSSProperties)\n : {}),\n }}\n className={classNames(\"hjm-field\", className)}\n data-state={state}\n data-invalid={Boolean(error || invalid) || undefined}\n data-variant={variant}\n data-shape={shape}\n data-align={align}\n >\n {label !== undefined && label !== null ? (\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}\n {required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n ) : null}\n {children}\n {/*\n Support text stays visible under an error instead of being replaced by\n it: the guidance (a length or format hint) is what tells the user how to clear the\n error, and hiding it is why a product copied that sentence into its own\n error string. Both are also referenced by aria-describedby.\n */}\n {description ? (\n <div id={descriptionId} className=\"hjm-field__description\">\n {description}\n </div>\n ) : null}\n <FieldError id={errorId} error={error} />\n </div>\n );\n}\n\nexport type FieldControlProps = Readonly<{\n id: string;\n required: boolean;\n disabled: boolean;\n \"aria-invalid\"?: true;\n \"aria-describedby\"?: string;\n}>;\n\nexport type FieldProps = Omit<\n FieldFrameProps,\n \"children\" | \"descriptionId\" | \"errorId\" | \"disabledOpacity\"\n> &\n Readonly<{\n label: ReactNode;\n children: ReactNode | ((props: FieldControlProps) => ReactNode);\n }>;\n\n/** Generic frame for custom native controls; `controlId` keeps the label explicit. */\nexport function Field({\n controlId,\n description,\n error,\n required = false,\n disabled = false,\n children,\n ...props\n}: FieldProps) {\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const controlProps: FieldControlProps = {\n id: controlId,\n required,\n disabled,\n ...(error ? { \"aria-invalid\": true as const } : {}),\n // Same merge as the built-in fields: support text stays referenced once an\n // error appears, so a custom control does not have to re-derive the ids.\n ...(description || error\n ? {\n \"aria-describedby\": [description ? descriptionId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \"),\n }\n : {}),\n };\n return (\n <FieldFrame\n {...props}\n controlId={controlId}\n description={description}\n error={error}\n required={required}\n disabled={disabled}\n {...(description ? { descriptionId } : {})}\n {...(error ? { errorId } : {})}\n >\n {typeof children === \"function\" ? children(controlProps) : children}\n </FieldFrame>\n );\n}\n\nfunction useFieldIds(id: string | undefined) {\n const generatedId = useId();\n const controlId = id ?? `hjm-${generatedId.replaceAll(\":\", \"\")}`;\n return {\n controlId,\n descriptionId: `${controlId}-description`,\n errorId: `${controlId}-error`,\n } as const;\n}\n\n/*\n Support text and the error are both referenced when both exist, in DOM reading\n order, and the consumer's own `aria-describedby` is kept in front of them.\n Announcing only the error (the earlier behaviour) dropped the guidance that\n explains how to fix it — exactly the text a product then duplicated into the\n error string by hand.\n*/\nfunction describedBy(\n own: string | undefined,\n description: ReactNode | undefined,\n error: ReactNode | undefined,\n descriptionId: string,\n errorId: string,\n): string | undefined {\n return [own, description ? descriptionId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n}\n\nfunction requireFieldAccessibleName(label: ReactNode | undefined, ariaLabel: string | undefined) {\n if ((label === undefined || label === null) && !ariaLabel?.trim()) {\n throw new TypeError(\"Field controls require either label or aria-label\");\n }\n}\n\n/*\n Character count (characterCountRecipe, 2026-10-23 BurnTok ComposerCount/TextLengthHint). The row sits under the\n control and before the description, and `aria-describedby` references it, so the counter and sentence are read on\n focus. A separate polite live region announces only on entering near/short/over: announcing each keystroke\n would talk over the typed text.\n*/\nfunction useCharacterCount(\n options: CharacterCountOptions | undefined,\n value: string,\n ownMaxLength: number | undefined,\n): Readonly<{ state?: CharacterCountState; announcement: string; maxLength?: number }> {\n if (options && ownMaxLength !== undefined) {\n throw new TypeError(\"Pass the limit through characterCount.max instead of maxLength\");\n }\n const state = options ? resolveCharacterCount(value, options) : undefined;\n const previous = useRef<CharacterCountStatus | undefined>(undefined);\n const [announcement, setAnnouncement] = useState(\"\");\n const status = state?.status;\n useEffect(() => {\n if (state && shouldAnnounceCharacterCount(previous.current, state)) setAnnouncement(state.message ?? \"\");\n previous.current = status;\n // Only a status change announces; the message inside one status changes with every keystroke.\n }, [status]);\n const maxLength = options ? resolveCharacterCountMaxLength(options) : ownMaxLength;\n return { ...(state ? { state } : {}), announcement, ...(maxLength === undefined ? {} : { maxLength }) };\n}\n\nfunction CharacterCountRow({ id, state, announcement }: Readonly<{ id: string; state: CharacterCountState; announcement: string }>) {\n return (\n <>\n <div id={id} className=\"hjm-field__count\" data-status={state.status} data-invalid={state.invalid || undefined}>\n {state.message ? <span className=\"hjm-field__count-message\">{state.message}</span> : null}\n <span className=\"hjm-field__counter\">{state.counter}</span>\n </div>\n <span className=\"hjm-visually-hidden\" aria-live=\"polite\" data-hjm-field-count-announcement=\"\">{announcement}</span>\n </>\n );\n}\n\nfunction useDraftValue(value: unknown, defaultValue: unknown): readonly [string, (next: string) => void] {\n const [draft, setDraft] = useState(() => (defaultValue === undefined || defaultValue === null ? \"\" : String(defaultValue)));\n return [value === undefined || value === null ? draft : String(value), setDraft] as const;\n}\n\ntype SharedInputProps = FieldCopyProps &\n Readonly<{\n variant?: FieldVariant;\n shape?: FieldShape;\n /**\n * Text placement inside the control. `start` follows the resolved\n * direction; `center` suits a short, ceremonial single value such as a\n * nickname or a code. Replaces a `text-align` override.\n */\n align?: FieldAlign;\n leading?: ReactNode;\n trailing?: ReactNode;\n fieldClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input element, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n /**\n * Page-entry target: true prefers this field, false excludes it, omission uses tree order. Only chooses during\n * entry; revealing a field after interaction does not focus it. Bottom sheets disable automatic input focus.\n */\n initialFocusTarget?: boolean;\n }>;\n\n/** TextField and TextArea only; SearchField, PasswordField and OtpField have no free-text limit to count. */\ntype CharacterCountProps = Readonly<{\n /**\n * Shows `length/max` and the product's sentence for the current status under the control\n * (`resolveCharacterCount`). `overflow: \"block\"` (default) also sets the platform `maxLength`; do not pass\n * `maxLength` together with it.\n */\n characterCount?: CharacterCountOptions;\n}>;\n\nexport type TextFieldProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> &\n SharedInputProps &\n CharacterCountProps &\n Readonly<{\n /**\n * Receives the next string value, the same callback name and shape as the\n * Native TextField. Web TextArea retains the DOM `onChange` callback. Before 1.5.0 Web TextField only had\n * the DOM `onChange`, so shared form code needed a platform branch. Both\n * fire; `onChange` stays for event access.\n */\n onValueChange?: (value: string) => void;\n }>;\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n function TextField(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n variant,\n shape,\n align,\n leading,\n trailing,\n fieldClassName,\n className,\n onFocus,\n onBlur,\n onChange,\n onValueChange,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n layoutStyle,\n initialFocusTarget,\n characterCount,\n maxLength: ownMaxLength,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const [countedValue, setDraft] = useDraftValue(props.value, props.defaultValue);\n const count = useCharacterCount(characterCount, countedValue, ownMaxLength);\n const countId = `${ids.controlId}-count`;\n const control = useRef<HTMLInputElement>(null);\n useInitialFocusTarget(control, initialFocusTarget);\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n return (\n <FieldFrame\n controlId={ids.controlId}\n label={label}\n description={description}\n error={error}\n required={required ?? false}\n disabled={disabled ?? false}\n focused={focused}\n invalid={isAriaInvalid(ariaInvalid) || count.state?.status === \"over\"}\n variant={variant ?? fieldRecipe.defaults.variant}\n shape={shape ?? fieldRecipe.defaults.shape}\n align={align ?? fieldRecipe.defaults.align}\n className={fieldClassName}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div className=\"hjm-field__control\">\n {leading ? <span className=\"hjm-field__affix\">{leading}</span> : null}\n <input\n {...props}\n ref={composeRefs(control, ref)}\n id={ids.controlId}\n className={classNames(\"hjm-field__input\", className)}\n required={required}\n disabled={disabled}\n {...(count.maxLength === undefined ? {} : { maxLength: count.maxLength })}\n aria-invalid={error || count.state?.status === \"over\" ? true : ariaInvalid}\n aria-label={ariaLabel}\n aria-describedby={describedBy(\n [ariaDescribedBy, count.state ? countId : undefined].filter(Boolean).join(\" \") || undefined,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={(event) => {\n setDraft(event.currentTarget.value);\n onChange?.(event);\n onValueChange?.(event.currentTarget.value);\n }}\n />\n {trailing ? <span className=\"hjm-field__affix\">{trailing}</span> : null}\n </div>\n {count.state ? <CharacterCountRow id={countId} state={count.state} announcement={count.announcement} /> : null}\n </FieldFrame>\n );\n },\n);\n\nexport type TextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement> &\n Omit<SharedInputProps, \"leading\"> &\n CharacterCountProps &\n Readonly<{\n /**\n * Action before the text inside the field frame (for example a composer's camera button),\n * vertically centred while the text grows. Mirrors `trailing`; `leading` stays omitted because\n * TextField's `leading` is a decorative affix with muted color, not an action slot.\n */\n leadingAction?: ReactNode;\n /**\n * Lower bound for a growing multiline field, in visible lines. Height is\n * recipe-owned, so this semantic axis replaces a `min-height` override.\n */\n minVisibleLines?: number;\n /** Upper bound for a growing multiline field, in visible lines. */\n maxVisibleLines?: number;\n }>;\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n variant,\n shape,\n trailing,\n leadingAction,\n align,\n fieldClassName,\n className,\n onFocus,\n onBlur,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n minVisibleLines,\n maxVisibleLines,\n style,\n layoutStyle,\n initialFocusTarget,\n characterCount,\n maxLength: ownMaxLength,\n onChange,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const [countedValue, setDraft] = useDraftValue(props.value, props.defaultValue);\n const count = useCharacterCount(characterCount, countedValue, ownMaxLength);\n const countId = `${ids.controlId}-count`;\n const control = useRef<HTMLTextAreaElement>(null);\n useInitialFocusTarget(control, initialFocusTarget);\n // Bounds are expressed in lines so the recipe keeps line height and padding.\n const lineBounds = {\n ...(minVisibleLines === undefined\n ? {}\n : { \"--hjm-field-min-visible-lines\": minVisibleLines }),\n ...(maxVisibleLines === undefined\n ? {}\n : { \"--hjm-field-max-visible-lines\": maxVisibleLines }),\n } as CSSProperties;\n return (\n <FieldFrame\n controlId={ids.controlId}\n label={label}\n description={description}\n error={error}\n required={required ?? false}\n disabled={disabled ?? false}\n focused={focused}\n invalid={isAriaInvalid(ariaInvalid) || count.state?.status === \"over\"}\n variant={variant ?? fieldRecipe.defaults.variant}\n shape={shape ?? fieldRecipe.defaults.shape}\n align={align ?? fieldRecipe.defaults.align}\n className={fieldClassName}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div className=\"hjm-field__control hjm-field__control--multiline\">\n {leadingAction ? <span className=\"hjm-field__leading\">{leadingAction}</span> : null}\n <textarea\n {...props}\n ref={composeRefs(control, ref)}\n id={ids.controlId}\n className={classNames(\"hjm-field__input\", className)}\n style={{ ...style, ...lineBounds }}\n required={required}\n disabled={disabled}\n {...(count.maxLength === undefined ? {} : { maxLength: count.maxLength })}\n aria-invalid={error || count.state?.status === \"over\" ? true : ariaInvalid}\n aria-label={ariaLabel}\n aria-describedby={describedBy(\n [ariaDescribedBy, count.state ? countId : undefined].filter(Boolean).join(\" \") || undefined,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n onChange={(event) => {\n setDraft(event.currentTarget.value);\n onChange?.(event);\n }}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n onBlur={(event) => {\n setFocused(false);\n onBlur?.(event);\n }}\n />\n {trailing ? <span className=\"hjm-field__trailing\">{trailing}</span> : null}\n </div>\n {count.state ? <CharacterCountRow id={countId} state={count.state} announcement={count.announcement} /> : null}\n </FieldFrame>\n );\n },\n);\n\nexport type SearchFieldProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"value\" | \"defaultValue\"\n> &\n SharedInputProps &\n Readonly<{\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n size?: SearchFieldSize;\n /** Localized accessible name for the clear action. */\n clearLabel: string;\n onClear?: () => void;\n /** Keeps the input mounted and named while replacing trailing actions with progress. */\n loading?: boolean;\n /** Product icon adapter; the renderer owns size and inherited color. */\n renderSearchIcon?: (props: SearchFieldIconRenderProps) => ReactNode;\n /** Product icon adapter for the clear action. */\n renderClearIcon?: (props: SearchFieldIconRenderProps) => ReactNode;\n /** Optional progress adapter. The default is the canonical CSS spinner. */\n renderLoadingIndicator?: (props: SearchFieldIconRenderProps) => ReactNode;\n }>;\n\nexport type SearchFieldIconRenderProps = Readonly<{\n color: \"currentColor\";\n size: number;\n}>;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n function SearchField(\n {\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onChange,\n size = searchFieldRecipe.defaults.size,\n clearLabel,\n onClear,\n loading = false,\n renderSearchIcon,\n renderClearIcon,\n renderLoadingIndicator,\n leading,\n trailing,\n fieldClassName,\n disabled,\n \"aria-busy\": ariaBusy,\n ...props\n },\n forwardedRef,\n ) {\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const inputRef = useRef<HTMLInputElement>(null);\n const iconAppearance: SearchFieldIconRenderProps = {\n color: \"currentColor\",\n size: iconRecipe.sizes[searchFieldRecipe.sizes[size].glyph],\n };\n const canClear = value.length > 0 && !disabled && !props.readOnly;\n return (\n <FieldDisabledOpacityContext.Provider value={searchFieldRecipe.states.disabledOpacity}>\n <TextField\n {...props}\n ref={composeRefs(inputRef, forwardedRef)}\n type=\"search\"\n value={value}\n data-size={size}\n data-loading={loading || undefined}\n disabled={disabled}\n aria-busy={loading || ariaBusy || undefined}\n fieldClassName={classNames(\"hjm-search-field\", fieldClassName)!}\n leading={\n leading ?? (renderSearchIcon ? renderSearchIcon(iconAppearance) : undefined)\n }\n onChange={(event) => {\n setValue(event.currentTarget.value);\n onChange?.(event);\n }}\n trailing={\n loading ? (\n <span className=\"hjm-search-field__spinner\" aria-hidden=\"true\">\n {renderLoadingIndicator?.(iconAppearance)}\n </span>\n ) : canClear ? (\n <button\n type=\"button\"\n className=\"hjm-search-field__clear\"\n aria-label={clearLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n onClear?.();\n inputRef.current?.focus();\n }}\n >\n {renderClearIcon?.(iconAppearance) ?? \"×\"}\n </button>\n ) : trailing\n }\n />\n </FieldDisabledOpacityContext.Provider>\n );\n },\n);\n\nexport type PasswordFieldToggleRenderProps = Readonly<{\n name: \"visibility\" | \"visibilityOff\";\n color: \"currentColor\";\n size: number;\n revealed: boolean;\n disabled: boolean;\n}>;\n\nexport type PasswordFieldProps = Omit<\n TextFieldProps,\n \"autoComplete\" | \"characterCount\" | \"defaultValue\" | \"size\" | \"trailing\" | \"type\" | \"value\"\n> &\n Readonly<{\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n revealed?: boolean;\n defaultRevealed?: boolean;\n onRevealedChange?: (revealed: boolean) => void;\n autofillHint: PasswordFieldAutofillHint;\n revealLabel: string;\n concealLabel: string;\n size?: PasswordFieldSize;\n renderToggleIcon?: (props: PasswordFieldToggleRenderProps) => ReactNode;\n }>;\n\n/** Password input with an independently controlled, selection-safe reveal action. */\nexport const PasswordField = forwardRef<HTMLInputElement, PasswordFieldProps>(\n function PasswordField(\n {\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onChange,\n revealed: revealedProp,\n defaultRevealed = false,\n onRevealedChange,\n autofillHint,\n revealLabel,\n concealLabel,\n size = passwordFieldRecipe.defaults.size,\n renderToggleIcon,\n fieldClassName,\n className,\n disabled,\n readOnly,\n ...props\n },\n forwardedRef,\n ) {\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const [revealed, setRevealed] = useControllableState({\n ...(revealedProp === undefined ? {} : { value: revealedProp }),\n defaultValue: defaultRevealed,\n ...(onRevealedChange === undefined ? {} : { onChange: onRevealedChange }),\n });\n const resolved = resolvePasswordFieldDescriptor(\n { revealed, autofillHint },\n {\n composeToggleAccessibleName: ({ willReveal }) =>\n willReveal ? revealLabel : concealLabel,\n },\n );\n const inputRef = useRef<HTMLInputElement>(null);\n const selectionRef = useRef<Readonly<{ start: number; end: number }> | null>(null);\n\n useLayoutEffect(() => {\n const selection = selectionRef.current;\n if (!selection || !inputRef.current) return;\n inputRef.current.setSelectionRange(selection.start, selection.end);\n selectionRef.current = null;\n }, [revealed]);\n\n const toggleAppearance: PasswordFieldToggleRenderProps = {\n name: revealed\n ? passwordFieldRecipe.toggle.icons.revealed\n : passwordFieldRecipe.toggle.icons.concealed,\n color: \"currentColor\",\n size: iconRecipe.sizes.sm,\n revealed,\n disabled: disabled ?? false,\n };\n\n return (\n <FieldDisabledOpacityContext.Provider value={passwordFieldRecipe.states.disabledOpacity}>\n <TextField\n {...props}\n ref={composeRefs(inputRef, forwardedRef)}\n autoComplete={autofillHint === \"none\" ? \"off\" : autofillHint === \"current\" ? \"current-password\" : \"new-password\"}\n className={classNames(\"hjm-password-field__input\", className)}\n disabled={disabled}\n fieldClassName={classNames(\n \"hjm-password-field\",\n `hjm-password-field--${size}`,\n fieldClassName,\n )!}\n onChange={(event) => {\n setValue(event.currentTarget.value);\n onChange?.(event);\n }}\n readOnly={readOnly}\n trailing={(\n <button\n // No `aria-pressed`: the name already says the next action (\"Show/Hide\n // password\"), and a pressed state on top would read as \"Hide password,\n // pressed\" — two answers to one question (password-field.md, rationale 1).\n aria-label={resolved.toggleAccessibleName}\n className=\"hjm-password-field__toggle\"\n data-revealed={revealed || undefined}\n disabled={disabled}\n onClick={() => {\n const input = inputRef.current;\n if (input && input.selectionStart !== null && input.selectionEnd !== null) {\n selectionRef.current = {\n start: input.selectionStart,\n end: input.selectionEnd,\n };\n }\n setRevealed(!revealed);\n }}\n type=\"button\"\n >\n {renderToggleIcon?.(toggleAppearance) ?? <Icon name={toggleAppearance.name} size=\"sm\" />}\n </button>\n )}\n type={resolved.webInputType}\n value={value}\n />\n </FieldDisabledOpacityContext.Provider>\n );\n },\n);\n\nexport type OtpFieldProps = Omit<\n TextFieldProps,\n | \"autoComplete\"\n | \"characterCount\"\n | \"defaultValue\"\n | \"leading\"\n | \"maxLength\"\n | \"shape\"\n | \"size\"\n | \"trailing\"\n | \"type\"\n | \"value\"\n | \"variant\"\n> &\n Readonly<{\n length: number;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n size?: OtpFieldSize;\n presentation?: OtpFieldPresentation;\n busy?: boolean;\n }>;\n\n/** One accessible numeric input rendered as decorative OTP slots. */\nexport const OtpField = forwardRef<HTMLInputElement, OtpFieldProps>(\n function OtpField(\n {\n id,\n label,\n description,\n error,\n required,\n disabled,\n readOnly,\n busy = false,\n length,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onComplete,\n onChange,\n size = otpFieldRecipe.defaults.size,\n presentation = \"boxes\",\n fieldClassName,\n className,\n onFocus,\n onBlur,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-label\": ariaLabel,\n layoutStyle,\n ...props\n },\n ref,\n ) {\n const ids = useFieldIds(id);\n const [focused, setFocused] = useState(false);\n requireFieldAccessibleName(label, ariaLabel);\n const [value, setValue] = useControllableState({\n ...(valueProp === undefined ? {} : { value: valueProp }),\n defaultValue: resolveOtpFieldValue(length, defaultValue),\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const slots = getOtpFieldSlotValues({ length, value });\n const complete = value.length === length;\n const wasCompleteRef = useRef(complete);\n useEffect(() => {\n if (complete && !wasCompleteRef.current) onComplete?.(value);\n wasCompleteRef.current = complete;\n }, [complete, onComplete, value]);\n const activeIndex = Math.min(value.length, length - 1);\n\n return (\n <FieldFrame\n className={classNames(\"hjm-otp-field\", fieldClassName)}\n disabledOpacity={otpFieldRecipe.states.disabledOpacity}\n {...(layoutStyle === undefined ? {} : { layoutStyle })}\n controlId={ids.controlId}\n description={description}\n disabled={(disabled ?? false) || busy}\n error={error}\n focused={focused}\n label={label}\n required={required ?? false}\n {...(description ? { descriptionId: ids.descriptionId } : {})}\n {...(error ? { errorId: ids.errorId } : {})}\n >\n <div\n className=\"hjm-otp-field__control\"\n data-presentation={presentation}\n data-complete={complete || undefined}\n data-size={size}\n style={{ \"--hjm-otp-length\": length } as CSSProperties}\n >\n <input\n {...props}\n ref={ref}\n aria-busy={busy || undefined}\n aria-describedby={describedBy(\n ariaDescribedBy,\n description,\n error,\n ids.descriptionId,\n ids.errorId,\n )}\n aria-invalid={error ? true : ariaInvalid}\n aria-label={ariaLabel}\n autoComplete=\"one-time-code\"\n className={classNames(\"hjm-otp-field__input\", className)}\n // busy stays focusable (read-only); see otp-field.md.\n disabled={disabled}\n id={ids.controlId}\n inputMode=\"numeric\"\n maxLength={length}\n onBlur={(event) => {\n setFocused(false);\n onBlur?.(event);\n }}\n onChange={(event) => {\n setValue(resolveOtpFieldValue(length, event.currentTarget.value));\n onChange?.(event);\n }}\n onFocus={(event) => {\n setFocused(true);\n onFocus?.(event);\n }}\n pattern=\"[0-9]*\"\n readOnly={readOnly || busy}\n required={required}\n type=\"text\"\n value={value}\n />\n <div aria-hidden=\"true\" className=\"hjm-otp-field__slots\">\n {slots.map((digit, index) => (\n <span\n className=\"hjm-otp-field__slot\"\n data-state={error\n ? \"invalid\"\n : focused && index === activeIndex\n ? \"focused\"\n : digit\n ? \"filled\"\n : \"idle\"}\n key={index}\n >\n {digit}\n </span>\n ))}\n </div>\n </div>\n </FieldFrame>\n );\n },\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"gravity-letters.d.ts","sourceRoot":"","sources":["../src/gravity-letters.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,gGAAgG;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CAAE,CAAC,CAAC;AAClQ,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAc,EAAE,SAAa,EAAE,WAAW,EAAE,EAAE,mBAAmB,+BAsBzG"}
1
+ {"version":3,"file":"gravity-letters.d.ts","sourceRoot":"","sources":["../src/gravity-letters.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,gGAAgG;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CAAE,CAAC,CAAC;AAClQ,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAc,EAAE,SAAa,EAAE,WAAW,EAAE,EAAE,mBAAmB,+BAsBzG"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { useLayoutEffect, useRef } from "react";
3
4
  import { gravityLetterMotion, resolveGravityLetters } from "@hjmds/design-contracts/gravity-letters";
@@ -1 +1 @@
1
- {"version":3,"file":"gravity-letters.js","sourceRoot":"","sources":["../src/gravity-letters.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useLayoutEffect, useRef } from \"react\";\nimport { gravityLetterMotion, resolveGravityLetters } from \"@hjmds/design-contracts/gravity-letters\";\nimport { useHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type GravityLettersProps = Readonly<{ glyphs: readonly string[]; active?: boolean; replayKey?: string | number; /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */ layoutStyle?: HjmCompositionStyleProp; }>;\n/** Decorative only: provide the meaningful heading outside this hidden presentation. */\nexport function GravityLetters({ glyphs, active = false, replayKey = 0, layoutStyle }: GravityLettersProps) {\n const { environment } = useHjmTheme();\n const root = useRef<HTMLSpanElement>(null);\n const signature = JSON.stringify(glyphs);\n const units = resolveGravityLetters(glyphs);\n useLayoutEffect(() => {\n if (!active || environment.reducedMotion || document.hidden) return;\n const recipe = resolveGravityLetters(JSON.parse(signature) as string[]);\n const animations: Animation[] = [];\n const stop = () => animations.forEach(animation => animation.cancel());\n // Decoration must not remove the readable page if WAAPI creation fails midway.\n try {\n [...root.current!.children].forEach((node, index) => animations.push(node.animate(\n gravityLetterMotion.input.map((offset, step) => ({ offset, transform: `translateY(${gravityLetterMotion.y[step]}px) rotate(${step === 0 ? recipe[index]!.rotation : 0}deg)` })),\n { duration: gravityLetterMotion.duration, delay: recipe[index]!.delay, fill: \"backwards\", easing: \"ease-out\" },\n )));\n } catch { stop(); return; }\n const visibility = () => { if (document.hidden) stop(); };\n document.addEventListener(\"visibilitychange\", visibility);\n return () => { stop(); document.removeEventListener(\"visibilitychange\", visibility); };\n }, [signature, active, replayKey, environment.reducedMotion]);\n return <span ref={root} aria-hidden=\"true\" style={{ display: \"flex\", flexWrap: \"wrap\", pointerEvents: \"none\", paddingTop: 36, ...layoutStyle }}>{units.map((unit, index) => <span key={index} style={{ display: \"inline-block\", whiteSpace: \"pre\" }}>{unit.glyph}</span>)}</span>;\n}\n"]}
1
+ {"version":3,"file":"gravity-letters.js","sourceRoot":"","sources":["../src/gravity-letters.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useLayoutEffect, useRef } from \"react\";\nimport { gravityLetterMotion, resolveGravityLetters } from \"@hjmds/design-contracts/gravity-letters\";\nimport { useHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type GravityLettersProps = Readonly<{ glyphs: readonly string[]; active?: boolean; replayKey?: string | number; /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */ layoutStyle?: HjmCompositionStyleProp; }>;\n/** Decorative only: provide the meaningful heading outside this hidden presentation. */\nexport function GravityLetters({ glyphs, active = false, replayKey = 0, layoutStyle }: GravityLettersProps) {\n const { environment } = useHjmTheme();\n const root = useRef<HTMLSpanElement>(null);\n const signature = JSON.stringify(glyphs);\n const units = resolveGravityLetters(glyphs);\n useLayoutEffect(() => {\n if (!active || environment.reducedMotion || document.hidden) return;\n const recipe = resolveGravityLetters(JSON.parse(signature) as string[]);\n const animations: Animation[] = [];\n const stop = () => animations.forEach(animation => animation.cancel());\n // Decoration must not remove the readable page if WAAPI creation fails midway.\n try {\n [...root.current!.children].forEach((node, index) => animations.push(node.animate(\n gravityLetterMotion.input.map((offset, step) => ({ offset, transform: `translateY(${gravityLetterMotion.y[step]}px) rotate(${step === 0 ? recipe[index]!.rotation : 0}deg)` })),\n { duration: gravityLetterMotion.duration, delay: recipe[index]!.delay, fill: \"backwards\", easing: \"ease-out\" },\n )));\n } catch { stop(); return; }\n const visibility = () => { if (document.hidden) stop(); };\n document.addEventListener(\"visibilitychange\", visibility);\n return () => { stop(); document.removeEventListener(\"visibilitychange\", visibility); };\n }, [signature, active, replayKey, environment.reducedMotion]);\n return <span ref={root} aria-hidden=\"true\" style={{ display: \"flex\", flexWrap: \"wrap\", pointerEvents: \"none\", paddingTop: 36, ...layoutStyle }}>{units.map((unit, index) => <span key={index} style={{ display: \"inline-block\", whiteSpace: \"pre\" }}>{unit.glyph}</span>)}</span>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"grid-reveal.d.ts","sourceRoot":"","sources":["../src/grid-reveal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,eAAe,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,OAAO,CAAC;IAAA,MAAM,CAAC,EAAC,OAAO,CAAC;IAAA,QAAQ,EAAC,SAAS,CAAC,CAAC,gGAAgG;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CAAC,CAAC,CAAC;AAClO,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,EAAC,KAAK,EAAC,MAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,EAAC,eAAe,+BAalF"}
1
+ {"version":3,"file":"grid-reveal.d.ts","sourceRoot":"","sources":["../src/grid-reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,MAAM,MAAM,eAAe,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,OAAO,CAAC;IAAA,MAAM,CAAC,EAAC,OAAO,CAAC;IAAA,QAAQ,EAAC,SAAS,CAAC,CAAC,gGAAgG;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CAAC,CAAC,CAAC;AAClO,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,EAAC,KAAK,EAAC,MAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,EAAC,eAAe,+BAalF"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { useLayoutEffect, useRef } from "react";
3
4
  import { gridRevealTiles, gridRevealDuration } from "@hjmds/design-contracts/grid-reveal";
@@ -1 +1 @@
1
- {"version":3,"file":"grid-reveal.js","sourceRoot":"","sources":["../src/grid-reveal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,gGAAgG;AAChG,MAAM,UAAU,UAAU,CAAC,EAAC,KAAK,EAAC,MAAM,GAAC,IAAI,EAAC,QAAQ,EAAC,WAAW,EAAiB;IAClF,MAAK,EAAC,WAAW,EAAC,GAAC,WAAW,EAAE,CAAC;IAAA,MAAM,OAAO,GAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC5E,eAAe,CAAC,GAAE,EAAE;QACnB,IAAG,CAAC,KAAK,IAAE,CAAC,MAAM,IAAE,WAAW,CAAC,aAAa,IAAE,QAAQ,CAAC,MAAM;YAAC,OAAO;QACtE,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,IAAI,GAAC,GAAE,EAAE,CAAA,UAAU,CAAC,OAAO,CAAC,SAAS,CAAA,EAAE,CAAA,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,0EAA0E;QAC1E,IAAG,CAAC;YAAA,CAAC,GAAG,OAAO,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,EAAE,CAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,EAAC,EAAC,EAAC,OAAO,EAAC,CAAC,EAAC,CAAC,EAAC,EAAC,QAAQ,EAAC,kBAAkB,EAAC,KAAK,EAAC,eAAe,CAAC,KAAK,CAAE,CAAC,KAAK,EAAC,IAAI,EAAC,WAAW,EAAC,MAAM,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,CAAC;QAAA,CAAC;QACzN,MAAK,CAAC;YAAA,IAAI,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QACrB,MAAM,UAAU,GAAC,GAAE,EAAE,GAAC,IAAG,QAAQ,CAAC,MAAM;YAAC,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAC,UAAU,CAAC,CAAC;QAC3G,OAAM,GAAE,EAAE,GAAC,IAAI,EAAE,CAAC,CAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAC,UAAU,CAAC,CAAC,CAAA,CAAC,CAAC;IACjF,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5C,OAAO,eAAK,KAAK,EAAE,EAAC,GAAG,WAAW,EAAC,QAAQ,EAAC,UAAU,EAAC,aAAG,QAAQ,EAAC,cAAK,GAAG,EAAE,OAAO,iBAAc,MAAM,EAAC,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,KAAK,EAAC,CAAC,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,YAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,eAAoB,KAAK,EAAE,EAAC,OAAO,EAAC,CAAC,EAAC,UAAU,EAAC,qBAAqB,EAAC,IAA5D,IAAI,CAAC,EAAE,CAAwD,CAAC,GAAO,IAAM,CAAC;AAC/W,CAAC","sourcesContent":["import { useLayoutEffect, useRef, type ReactNode } from \"react\";\nimport { gridRevealTiles, gridRevealDuration } from \"@hjmds/design-contracts/grid-reveal\";\nimport { useHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type GridRevealProps=Readonly<{ready:boolean;active?:boolean;children:ReactNode; /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */ layoutStyle?: HjmCompositionStyleProp;}>;\n/** Connect ready to Image.onLoadStatusChange; the image retains loading/error/accessibility. */\nexport function GridReveal({ready,active=true,children,layoutStyle}:GridRevealProps){\n const{environment}=useHjmTheme();const overlay=useRef<HTMLDivElement>(null);\n useLayoutEffect(()=>{\n if(!ready||!active||environment.reducedMotion||document.hidden)return;\n const animations:Animation[]=[];\n const stop=()=>animations.forEach(animation=>animation.cancel());\n // Failed decoration must reveal content, including after partial startup.\n try{[...overlay.current!.children].forEach((node,index)=>animations.push(node.animate([{opacity:1},{opacity:0}],{duration:gridRevealDuration,delay:gridRevealTiles[index]!.delay,fill:\"backwards\",easing:\"ease-out\"})));}\n catch{stop();return;}\n const visibility=()=>{if(document.hidden)stop();};document.addEventListener(\"visibilitychange\",visibility);\n return()=>{stop();document.removeEventListener(\"visibilitychange\",visibility);};\n },[ready,active,environment.reducedMotion]);\n return <div style={{...layoutStyle,position:\"relative\"}}>{children}<div ref={overlay} aria-hidden=\"true\" style={{position:\"absolute\",inset:0,pointerEvents:\"none\",display:\"grid\",gridTemplateColumns:\"repeat(4, 1fr)\",gridTemplateRows:\"repeat(4, 1fr)\"}}>{gridRevealTiles.map(tile=><span key={tile.id} style={{opacity:0,background:\"var(--hjm-color-bg)\"}}/>)}</div></div>;\n}\n"]}
1
+ {"version":3,"file":"grid-reveal.js","sourceRoot":"","sources":["../src/grid-reveal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,gGAAgG;AAChG,MAAM,UAAU,UAAU,CAAC,EAAC,KAAK,EAAC,MAAM,GAAC,IAAI,EAAC,QAAQ,EAAC,WAAW,EAAiB;IAClF,MAAK,EAAC,WAAW,EAAC,GAAC,WAAW,EAAE,CAAC;IAAA,MAAM,OAAO,GAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC5E,eAAe,CAAC,GAAE,EAAE;QACnB,IAAG,CAAC,KAAK,IAAE,CAAC,MAAM,IAAE,WAAW,CAAC,aAAa,IAAE,QAAQ,CAAC,MAAM;YAAC,OAAO;QACtE,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,IAAI,GAAC,GAAE,EAAE,CAAA,UAAU,CAAC,OAAO,CAAC,SAAS,CAAA,EAAE,CAAA,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,0EAA0E;QAC1E,IAAG,CAAC;YAAA,CAAC,GAAG,OAAO,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,EAAE,CAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,EAAC,EAAC,EAAC,OAAO,EAAC,CAAC,EAAC,CAAC,EAAC,EAAC,QAAQ,EAAC,kBAAkB,EAAC,KAAK,EAAC,eAAe,CAAC,KAAK,CAAE,CAAC,KAAK,EAAC,IAAI,EAAC,WAAW,EAAC,MAAM,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,CAAC;QAAA,CAAC;QACzN,MAAK,CAAC;YAAA,IAAI,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QACrB,MAAM,UAAU,GAAC,GAAE,EAAE,GAAC,IAAG,QAAQ,CAAC,MAAM;YAAC,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAC,UAAU,CAAC,CAAC;QAC3G,OAAM,GAAE,EAAE,GAAC,IAAI,EAAE,CAAC,CAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAC,UAAU,CAAC,CAAC,CAAA,CAAC,CAAC;IACjF,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5C,OAAO,eAAK,KAAK,EAAE,EAAC,GAAG,WAAW,EAAC,QAAQ,EAAC,UAAU,EAAC,aAAG,QAAQ,EAAC,cAAK,GAAG,EAAE,OAAO,iBAAc,MAAM,EAAC,KAAK,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,KAAK,EAAC,CAAC,EAAC,aAAa,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,YAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,eAAoB,KAAK,EAAE,EAAC,OAAO,EAAC,CAAC,EAAC,UAAU,EAAC,qBAAqB,EAAC,IAA5D,IAAI,CAAC,EAAE,CAAwD,CAAC,GAAO,IAAM,CAAC;AAC/W,CAAC","sourcesContent":["\"use client\";\n\nimport { useLayoutEffect, useRef, type ReactNode } from \"react\";\nimport { gridRevealTiles, gridRevealDuration } from \"@hjmds/design-contracts/grid-reveal\";\nimport { useHjmTheme } from \"./provider.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nexport type GridRevealProps=Readonly<{ready:boolean;active?:boolean;children:ReactNode; /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */ layoutStyle?: HjmCompositionStyleProp;}>;\n/** Connect ready to Image.onLoadStatusChange; the image retains loading/error/accessibility. */\nexport function GridReveal({ready,active=true,children,layoutStyle}:GridRevealProps){\n const{environment}=useHjmTheme();const overlay=useRef<HTMLDivElement>(null);\n useLayoutEffect(()=>{\n if(!ready||!active||environment.reducedMotion||document.hidden)return;\n const animations:Animation[]=[];\n const stop=()=>animations.forEach(animation=>animation.cancel());\n // Failed decoration must reveal content, including after partial startup.\n try{[...overlay.current!.children].forEach((node,index)=>animations.push(node.animate([{opacity:1},{opacity:0}],{duration:gridRevealDuration,delay:gridRevealTiles[index]!.delay,fill:\"backwards\",easing:\"ease-out\"})));}\n catch{stop();return;}\n const visibility=()=>{if(document.hidden)stop();};document.addEventListener(\"visibilitychange\",visibility);\n return()=>{stop();document.removeEventListener(\"visibilitychange\",visibility);};\n },[ready,active,environment.reducedMotion]);\n return <div style={{...layoutStyle,position:\"relative\"}}>{children}<div ref={overlay} aria-hidden=\"true\" style={{position:\"absolute\",inset:0,pointerEvents:\"none\",display:\"grid\",gridTemplateColumns:\"repeat(4, 1fr)\",gridTemplateRows:\"repeat(4, 1fr)\"}}>{gridRevealTiles.map(tile=><span key={tile.id} style={{opacity:0,background:\"var(--hjm-color-bg)\"}}/>)}</div></div>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../src/heading.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,GAC7E,iBAAiB,GACjB,QAAQ,CAAC;IACP,QAAQ,EAAE,SAAS,CAAC;IACpB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEL,eAAO,MAAM,OAAO;;;;cALN,SAAS;IACnB,gGAAgG;kBAClF,uBAAuB;uDAsCvC,CAAC"}
1
+ {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../src/heading.tsx"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,GAC7E,iBAAiB,GACjB,QAAQ,CAAC;IACP,QAAQ,EAAE,SAAS,CAAC;IACpB,gGAAgG;IAChG,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEL,eAAO,MAAM,OAAO;;;;cALN,SAAS;IACnB,gGAAgG;kBAClF,uBAAuB;uDAsCvC,CAAC"}
package/dist/heading.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { useDesignProfileDefaults } from "./internal.js";
2
3
  import { headingRecipe, resolveHeadingSemanticLevel, validateHeadingDescriptor, } from "@hjmds/design-contracts/components/heading";
3
4
  import { createElement, forwardRef, } from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","sourceRoot":"","sources":["../src/heading.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,yBAAyB,GAE1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,aAAa,EACb,UAAU,GAIX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAmC,SAAS,OAAO,CAClF,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAC3E,YAAY;IAEZ,MAAM,UAAU,GAAsB;QACpC,KAAK;QACL,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;KAC1D,CAAC;IACF,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,2EAA2E;IAC3E,0DAA0D;IAC1D,OAAO,aAAa,CAClB,IAAI,2BAA2B,CAAC,UAAU,CAAC,EAAE,EAC7C;QACE,GAAG,KAAK;QACR,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,YAAY,EAAE,KAAK;QACnB,2EAA2E;QAC3E,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,4EAA4E;QAC5E,KAAK,EAAE;YACL,GAAG,KAAK;YACR,GAAG,WAAW;YACd,oBAAoB,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI;YAC7C,2BAA2B,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI;YACtD,sBAAsB,EAAE,OAAO,CAAC,UAAU;SAC1B;KACnB,EACD,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { useDesignProfileDefaults } from \"./internal.js\";\nimport {\n headingRecipe,\n resolveHeadingSemanticLevel,\n validateHeadingDescriptor,\n type HeadingDescriptor,\n} from \"@hjmds/design-contracts/components/heading\";\nimport {\n createElement,\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type HeadingProps = Omit<HTMLAttributes<HTMLHeadingElement>, \"children\"> &\n HeadingDescriptor &\n Readonly<{\n children: ReactNode;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(function Heading(\n { level, semanticLevel, children, className, layoutStyle, style, ...props },\n forwardedRef,\n) {\n const descriptor: HeadingDescriptor = {\n level,\n ...(semanticLevel === undefined ? {} : { semanticLevel }),\n };\n validateHeadingDescriptor(descriptor);\n const profile = useDesignProfileDefaults();\n const metrics = profile?.tokens.heading[level] ?? headingRecipe.levels[level];\n // Visual size and document level are separate axes: the element comes from\n // the semantic level, the type comes from the visual one.\n return createElement(\n `h${resolveHeadingSemanticLevel(descriptor)}`,\n {\n ...props,\n ref: forwardedRef,\n className: classNames(\"hjm-heading\", className),\n \"data-level\": level,\n // The caller's `style` used to be replaced wholesale by the recipe object,\n // so a placement margin vanished without a type error. Merge it instead, and\n // spread the recipe variables last: the level still owns size, line height\n // and weight, which is why the variables are not caller-overridable here\n // (unlike Native's caller-last array; Web has `layoutStyle` for placement).\n style: {\n ...style,\n ...layoutStyle,\n \"--hjm-heading-size\": `${metrics.fontSize}px`,\n \"--hjm-heading-line-height\": `${metrics.lineHeight}px`,\n \"--hjm-heading-weight\": metrics.fontWeight,\n } as CSSProperties,\n },\n children,\n );\n});\n"]}
1
+ {"version":3,"file":"heading.js","sourceRoot":"","sources":["../src/heading.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,yBAAyB,GAE1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,aAAa,EACb,UAAU,GAIX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAmC,SAAS,OAAO,CAClF,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAC3E,YAAY;IAEZ,MAAM,UAAU,GAAsB;QACpC,KAAK;QACL,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;KAC1D,CAAC;IACF,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,2EAA2E;IAC3E,0DAA0D;IAC1D,OAAO,aAAa,CAClB,IAAI,2BAA2B,CAAC,UAAU,CAAC,EAAE,EAC7C;QACE,GAAG,KAAK;QACR,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,YAAY,EAAE,KAAK;QACnB,2EAA2E;QAC3E,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,4EAA4E;QAC5E,KAAK,EAAE;YACL,GAAG,KAAK;YACR,GAAG,WAAW;YACd,oBAAoB,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI;YAC7C,2BAA2B,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI;YACtD,sBAAsB,EAAE,OAAO,CAAC,UAAU;SAC1B;KACnB,EACD,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["\"use client\";\n\nimport { useDesignProfileDefaults } from \"./internal.js\";\nimport {\n headingRecipe,\n resolveHeadingSemanticLevel,\n validateHeadingDescriptor,\n type HeadingDescriptor,\n} from \"@hjmds/design-contracts/components/heading\";\nimport {\n createElement,\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { classNames } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\n\nexport type HeadingProps = Omit<HTMLAttributes<HTMLHeadingElement>, \"children\"> &\n HeadingDescriptor &\n Readonly<{\n children: ReactNode;\n /** Canonical layout-only placement on the root element. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nexport const Heading = forwardRef<HTMLHeadingElement, HeadingProps>(function Heading(\n { level, semanticLevel, children, className, layoutStyle, style, ...props },\n forwardedRef,\n) {\n const descriptor: HeadingDescriptor = {\n level,\n ...(semanticLevel === undefined ? {} : { semanticLevel }),\n };\n validateHeadingDescriptor(descriptor);\n const profile = useDesignProfileDefaults();\n const metrics = profile?.tokens.heading[level] ?? headingRecipe.levels[level];\n // Visual size and document level are separate axes: the element comes from\n // the semantic level, the type comes from the visual one.\n return createElement(\n `h${resolveHeadingSemanticLevel(descriptor)}`,\n {\n ...props,\n ref: forwardedRef,\n className: classNames(\"hjm-heading\", className),\n \"data-level\": level,\n // The caller's `style` used to be replaced wholesale by the recipe object,\n // so a placement margin vanished without a type error. Merge it instead, and\n // spread the recipe variables last: the level still owns size, line height\n // and weight, which is why the variables are not caller-overridable here\n // (unlike Native's caller-last array; Web has `layoutStyle` for placement).\n style: {\n ...style,\n ...layoutStyle,\n \"--hjm-heading-size\": `${metrics.fontSize}px`,\n \"--hjm-heading-line-height\": `${metrics.lineHeight}px`,\n \"--hjm-heading-weight\": metrics.fontWeight,\n } as CSSProperties,\n },\n children,\n );\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"image-choice.d.ts","sourceRoot":"","sources":["../src/image-choice.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2E,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIhH,OAAO,EAEwD,KAAK,yBAAyB,EAAE,KAAK,yBAAyB,EAC5H,MAAM,iDAAiD,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,yBAAyB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AACzF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,qHAAqH;IACrH,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AACH,KAAK,IAAI,GAAG,QAAQ,CAAC;IACnB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kHAAkH;IAClH,cAAc,CAAC,EAAE,yBAAyB,CAAC;IAC3C,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,yBAAyB,CAAC;CACzC,CAAC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACvC,QAAQ,CAAC;IAAE,aAAa,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAC/F,QAAQ,CAAC;IAAE,aAAa,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC,CAC1G,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAyC5D"}
1
+ {"version":3,"file":"image-choice.d.ts","sourceRoot":"","sources":["../src/image-choice.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2E,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIhH,OAAO,EAEwD,KAAK,yBAAyB,EAAE,KAAK,yBAAyB,EAC5H,MAAM,iDAAiD,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,yBAAyB,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AACzF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,qHAAqH;IACrH,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AACH,KAAK,IAAI,GAAG,QAAQ,CAAC;IACnB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kHAAkH;IAClH,cAAc,CAAC,EAAE,yBAAyB,CAAC;IAC3C,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,yBAAyB,CAAC;CACzC,CAAC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACvC,QAAQ,CAAC;IAAE,aAAa,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAC/F,QAAQ,CAAC;IAAE,aAAa,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC,CAC1G,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAyC5D"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { useEffect, useId, useLayoutEffect, useRef, useState } from "react";
3
4
  import { Text } from "./layout.js";
@@ -1 +1 @@
1
- {"version":3,"file":"image-choice.js","sourceRoot":"","sources":["../src/image-choice.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useId, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { Text } from \"./layout.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { typography } from \"@hjmds/design-contracts/foundations\";\nimport {\n imageChoiceRecipe, resolveImageChoiceCaptionLines, resolveImageChoiceColumns, resolveImageChoiceOuterSize, resolveImageChoiceTileHeight, resolveImageChoiceToggle,\n validateImageChoiceItemLabelLines, validateImageChoiceItems, type ImageChoiceItemDescriptor, type ImageChoiceItemLabelLines,\n} from \"@hjmds/design-contracts/components/image-choice\";\nimport { resolveVirtualWindow, virtualListRecipe } from \"@hjmds/design-contracts/components/virtual-list\";\n\nexport type ImageChoiceItem = ImageChoiceItemDescriptor & Readonly<{ image: ReactNode }>;\nexport type ImageChoiceVirtualization = Readonly<{\n /** Height of the scrolling viewport in px. The group scrolls itself, so do not also put it in a scrolling parent. */\n height: number;\n /** Rows kept mounted above and below the visible window. */\n overscan?: number;\n}>;\ntype Base = Readonly<{\n /** Localized group name read before the choices. */\n label: string;\n /** Visible caption above the tiles; omit when the screen heading already names the choice. */\n showLabel?: boolean;\n /**\n * Shows each item's `label` under its tile (one ellipsized line), e.g. a person's name in a recipient picker.\n * The tile keeps the same accessible name, so turning this on does not change what assistive tech reads.\n */\n showItemLabels?: boolean;\n /** Lines the visible item label wraps to before the ellipsis (default 1). Every tile reserves the same height. */\n itemLabelLines?: ImageChoiceItemLabelLines;\n items: readonly ImageChoiceItem[];\n disabled?: boolean;\n className?: string;\n /**\n * Long lists (hundreds of people): only the rows near the viewport are mounted. Tiles keep their size; the column\n * count follows the measured width.\n */\n virtualized?: ImageChoiceVirtualization;\n}>;\nexport type ImageChoiceGroupProps = Base & (\n | Readonly<{ selectionMode: \"single\"; value: string | null; onValueChange(value: string): void }>\n | Readonly<{ selectionMode: \"multiple\"; value: readonly string[]; onValueChange(value: string[]): void }>\n);\n\n/**\n * Picks avatars or photos by image (2026-10-16). Tiles are square, wrap to the available width, and show\n * a brand ring plus a check when chosen; assistive tech hears radios (single) or checkboxes (multiple).\n */\nexport function ImageChoiceGroup(props: ImageChoiceGroupProps) {\n const { label, showLabel = false, showItemLabels = false, itemLabelLines = imageChoiceRecipe.itemLabelLines, items, disabled = false, className, virtualized } = props;\n validateImageChoiceItems(items);\n validateImageChoiceItemLabelLines(itemLabelLines);\n const theme = useOptionalHjmTheme();\n const baseId = useId();\n const isSelected = (id: string) => props.selectionMode === \"single\" ? props.value === id : props.value.includes(id);\n const choose = (id: string) => {\n if (props.selectionMode === \"single\") props.onValueChange(resolveImageChoiceToggle(\"single\", props.value, id));\n else props.onValueChange(resolveImageChoiceToggle(\"multiple\", props.value, id));\n };\n const role = props.selectionMode === \"single\" ? \"radio\" : \"checkbox\";\n const groupRole = props.selectionMode === \"single\" ? \"radiogroup\" : \"group\";\n const captionLines = resolveImageChoiceCaptionLines({ showItemLabels, itemLabelLines, hasDescription: items.some(item => item.description !== undefined) });\n const style = { \"--hjm-image-choice-size\": `${imageChoiceRecipe.tileSize}px`, \"--hjm-image-choice-gap\": `${imageChoiceRecipe.gap}px`, \"--hjm-image-choice-radius\": `${imageChoiceRecipe.radius}px`, \"--hjm-image-choice-ring\": `${imageChoiceRecipe.ringWidth}px`, \"--hjm-image-choice-offset\": `${imageChoiceRecipe.ringOffset}px`, \"--hjm-image-choice-check\": `${imageChoiceRecipe.checkSize}px`, \"--hjm-image-choice-item-label-gap\": `${imageChoiceRecipe.itemLabelGap}px`, \"--hjm-image-choice-caption-lines\": captionLines, \"--hjm-image-choice-viewport-inset\": `${imageChoiceRecipe.virtualViewportInset}px` } as CSSProperties;\n const renderTile = (item: ImageChoiceItem, index: number) => {\n const selected = isSelected(item.id);\n const descriptionId = item.description === undefined ? undefined : `${baseId}-description-${index}`;\n return <button key={item.id} type=\"button\" role={role} aria-checked={selected} aria-label={item.label} aria-describedby={descriptionId} className=\"hjm-image-choice__tile\" data-selected={selected || undefined}\n disabled={disabled || item.disabled} onClick={() => choose(item.id)}>\n {/* The ring lives on an inner frame so an item label can sit below it inside the same button (one tap target). */}\n <span className=\"hjm-image-choice__ring\">\n <span className=\"hjm-image-choice__image\">{item.image}</span>\n {selected ? <span className=\"hjm-image-choice__check\" aria-hidden=\"true\">✓</span> : null}\n </span>\n {/* Every tile reserves the same caption block, so wrapped rows stay even and virtual rows share one height.\n aria-label already names the tile; the description is read once through aria-describedby. */}\n {captionLines > 0 ? <span className=\"hjm-image-choice__caption\">\n {showItemLabels ? <Text variant={imageChoiceRecipe.itemLabelVariant} className=\"hjm-image-choice__item-label\" aria-hidden=\"true\" data-lines={itemLabelLines === 1 ? undefined : itemLabelLines}>{item.label}</Text> : null}\n {item.description === undefined ? null : <Text id={descriptionId} variant={imageChoiceRecipe.itemDescriptionVariant} tone={imageChoiceRecipe.itemDescriptionTone} className=\"hjm-image-choice__item-description\" aria-hidden=\"true\">{item.description}</Text>}\n </span> : null}\n </button>;\n };\n // First-paint estimate in px; the rendered row is measured afterwards because caption line height is rem-based.\n const estimatedTileHeight = resolveImageChoiceTileHeight(captionLines, typography[imageChoiceRecipe.itemLabelVariant].lineHeight * (theme?.environment.textScale ?? 1));\n return <div className={[\"hjm-image-choice\", className].filter(Boolean).join(\" \")} style={style}>\n {showLabel ? <span className=\"hjm-image-choice__label\">{label}</span> : null}\n {virtualized\n ? <VirtualTileRows items={items} renderTile={renderTile} label={label} role={groupRole} height={virtualized.height} overscan={virtualized.overscan ?? virtualListRecipe.overscan} estimatedTileHeight={estimatedTileHeight} />\n : <div className=\"hjm-image-choice__tiles\" role={groupRole} aria-label={label}>{items.map(renderTile)}</div>}\n </div>;\n}\n\n/**\n * Windowed rows of tiles. It reuses the VirtualList window math (`resolveVirtualWindow`) but not the VirtualList\n * component: that one names its rows as list items and moves focus row by row, which would replace the radio/checkbox\n * group this control is. Tiles stay in the tab order; focusing one scrolls it into view and the window follows.\n */\nfunction VirtualTileRows({ items, renderTile, label, role, height, overscan, estimatedTileHeight }: Readonly<{\n items: readonly ImageChoiceItem[]; renderTile: (item: ImageChoiceItem, index: number) => ReactNode; label: string;\n role: \"radiogroup\" | \"group\"; height: number; overscan: number; estimatedTileHeight: number;\n}>) {\n const host = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n const [measuredTileHeight, setMeasuredTileHeight] = useState(0);\n const [scrollTop, setScrollTop] = useState(0);\n const [focusedRow, setFocusedRow] = useState<number | null>(null);\n useEffect(() => {\n if (!host.current) return;\n // Measure the slot itself (content box: inside the inset and the scrollbar); sheets and sidebars change it.\n const observer = new ResizeObserver(([entry]) => setWidth(entry?.contentRect.width ?? 0));\n observer.observe(host.current);\n return () => observer.disconnect();\n }, []);\n useLayoutEffect(() => {\n // Every row is one tile high (the caption block is reserved), so any mounted row gives the real stride.\n const rendered = host.current?.querySelector<HTMLElement>(\".hjm-image-choice__row\")?.offsetHeight ?? 0;\n if (rendered > 0 && rendered !== measuredTileHeight) setMeasuredTileHeight(rendered);\n });\n const columns = width > 0 ? Math.min(items.length, resolveImageChoiceColumns(width)) : 0;\n const stride = (measuredTileHeight || estimatedTileHeight) + imageChoiceRecipe.gap;\n const rowCount = columns ? Math.ceil(items.length / columns) : 0;\n const range = resolveVirtualWindow(rowCount, stride, height, scrollTop, overscan);\n // Keep the focused tile's row mounted when scrolling moves it out of the window, so focus is not dropped to body.\n const rows = Array.from({ length: range.end - range.start }, (_, i) => range.start + i);\n if (focusedRow !== null && focusedRow < rowCount && !rows.includes(focusedRow)) rows.push(focusedRow);\n rows.sort((first, second) => first - second); // DOM order is the tab order\n return <div ref={host} className=\"hjm-image-choice__viewport\" role={role} aria-label={label} style={{ height }}\n onScroll={event => setScrollTop(event.currentTarget.scrollTop)}>\n {columns ? <div style={{ position: \"relative\", height: Math.max(0, range.totalHeight - imageChoiceRecipe.gap) }}>\n {rows.map(row => <div key={row} className=\"hjm-image-choice__row\" style={{ top: row * stride, display: \"grid\", gridTemplateColumns: `repeat(${columns}, ${resolveImageChoiceOuterSize()}px)`, justifyContent: \"space-between\" }}\n onFocusCapture={() => setFocusedRow(row)} onBlurCapture={event => { if (!event.currentTarget.contains(event.relatedTarget)) setFocusedRow(current => current === row ? null : current); }}>\n {items.slice(row * columns, row * columns + columns).map((item, offset) => renderTile(item, row * columns + offset))}\n </div>)}\n </div> : null}\n </div>;\n}\n"]}
1
+ {"version":3,"file":"image-choice.js","sourceRoot":"","sources":["../src/image-choice.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { Text } from \"./layout.js\";\nimport { useOptionalHjmTheme } from \"./provider.js\";\nimport { typography } from \"@hjmds/design-contracts/foundations\";\nimport {\n imageChoiceRecipe, resolveImageChoiceCaptionLines, resolveImageChoiceColumns, resolveImageChoiceOuterSize, resolveImageChoiceTileHeight, resolveImageChoiceToggle,\n validateImageChoiceItemLabelLines, validateImageChoiceItems, type ImageChoiceItemDescriptor, type ImageChoiceItemLabelLines,\n} from \"@hjmds/design-contracts/components/image-choice\";\nimport { resolveVirtualWindow, virtualListRecipe } from \"@hjmds/design-contracts/components/virtual-list\";\n\nexport type ImageChoiceItem = ImageChoiceItemDescriptor & Readonly<{ image: ReactNode }>;\nexport type ImageChoiceVirtualization = Readonly<{\n /** Height of the scrolling viewport in px. The group scrolls itself, so do not also put it in a scrolling parent. */\n height: number;\n /** Rows kept mounted above and below the visible window. */\n overscan?: number;\n}>;\ntype Base = Readonly<{\n /** Localized group name read before the choices. */\n label: string;\n /** Visible caption above the tiles; omit when the screen heading already names the choice. */\n showLabel?: boolean;\n /**\n * Shows each item's `label` under its tile (one ellipsized line), e.g. a person's name in a recipient picker.\n * The tile keeps the same accessible name, so turning this on does not change what assistive tech reads.\n */\n showItemLabels?: boolean;\n /** Lines the visible item label wraps to before the ellipsis (default 1). Every tile reserves the same height. */\n itemLabelLines?: ImageChoiceItemLabelLines;\n items: readonly ImageChoiceItem[];\n disabled?: boolean;\n className?: string;\n /**\n * Long lists (hundreds of people): only the rows near the viewport are mounted. Tiles keep their size; the column\n * count follows the measured width.\n */\n virtualized?: ImageChoiceVirtualization;\n}>;\nexport type ImageChoiceGroupProps = Base & (\n | Readonly<{ selectionMode: \"single\"; value: string | null; onValueChange(value: string): void }>\n | Readonly<{ selectionMode: \"multiple\"; value: readonly string[]; onValueChange(value: string[]): void }>\n);\n\n/**\n * Picks avatars or photos by image (2026-10-16). Tiles are square, wrap to the available width, and show\n * a brand ring plus a check when chosen; assistive tech hears radios (single) or checkboxes (multiple).\n */\nexport function ImageChoiceGroup(props: ImageChoiceGroupProps) {\n const { label, showLabel = false, showItemLabels = false, itemLabelLines = imageChoiceRecipe.itemLabelLines, items, disabled = false, className, virtualized } = props;\n validateImageChoiceItems(items);\n validateImageChoiceItemLabelLines(itemLabelLines);\n const theme = useOptionalHjmTheme();\n const baseId = useId();\n const isSelected = (id: string) => props.selectionMode === \"single\" ? props.value === id : props.value.includes(id);\n const choose = (id: string) => {\n if (props.selectionMode === \"single\") props.onValueChange(resolveImageChoiceToggle(\"single\", props.value, id));\n else props.onValueChange(resolveImageChoiceToggle(\"multiple\", props.value, id));\n };\n const role = props.selectionMode === \"single\" ? \"radio\" : \"checkbox\";\n const groupRole = props.selectionMode === \"single\" ? \"radiogroup\" : \"group\";\n const captionLines = resolveImageChoiceCaptionLines({ showItemLabels, itemLabelLines, hasDescription: items.some(item => item.description !== undefined) });\n const style = { \"--hjm-image-choice-size\": `${imageChoiceRecipe.tileSize}px`, \"--hjm-image-choice-gap\": `${imageChoiceRecipe.gap}px`, \"--hjm-image-choice-radius\": `${imageChoiceRecipe.radius}px`, \"--hjm-image-choice-ring\": `${imageChoiceRecipe.ringWidth}px`, \"--hjm-image-choice-offset\": `${imageChoiceRecipe.ringOffset}px`, \"--hjm-image-choice-check\": `${imageChoiceRecipe.checkSize}px`, \"--hjm-image-choice-item-label-gap\": `${imageChoiceRecipe.itemLabelGap}px`, \"--hjm-image-choice-caption-lines\": captionLines, \"--hjm-image-choice-viewport-inset\": `${imageChoiceRecipe.virtualViewportInset}px` } as CSSProperties;\n const renderTile = (item: ImageChoiceItem, index: number) => {\n const selected = isSelected(item.id);\n const descriptionId = item.description === undefined ? undefined : `${baseId}-description-${index}`;\n return <button key={item.id} type=\"button\" role={role} aria-checked={selected} aria-label={item.label} aria-describedby={descriptionId} className=\"hjm-image-choice__tile\" data-selected={selected || undefined}\n disabled={disabled || item.disabled} onClick={() => choose(item.id)}>\n {/* The ring lives on an inner frame so an item label can sit below it inside the same button (one tap target). */}\n <span className=\"hjm-image-choice__ring\">\n <span className=\"hjm-image-choice__image\">{item.image}</span>\n {selected ? <span className=\"hjm-image-choice__check\" aria-hidden=\"true\">✓</span> : null}\n </span>\n {/* Every tile reserves the same caption block, so wrapped rows stay even and virtual rows share one height.\n aria-label already names the tile; the description is read once through aria-describedby. */}\n {captionLines > 0 ? <span className=\"hjm-image-choice__caption\">\n {showItemLabels ? <Text variant={imageChoiceRecipe.itemLabelVariant} className=\"hjm-image-choice__item-label\" aria-hidden=\"true\" data-lines={itemLabelLines === 1 ? undefined : itemLabelLines}>{item.label}</Text> : null}\n {item.description === undefined ? null : <Text id={descriptionId} variant={imageChoiceRecipe.itemDescriptionVariant} tone={imageChoiceRecipe.itemDescriptionTone} className=\"hjm-image-choice__item-description\" aria-hidden=\"true\">{item.description}</Text>}\n </span> : null}\n </button>;\n };\n // First-paint estimate in px; the rendered row is measured afterwards because caption line height is rem-based.\n const estimatedTileHeight = resolveImageChoiceTileHeight(captionLines, typography[imageChoiceRecipe.itemLabelVariant].lineHeight * (theme?.environment.textScale ?? 1));\n return <div className={[\"hjm-image-choice\", className].filter(Boolean).join(\" \")} style={style}>\n {showLabel ? <span className=\"hjm-image-choice__label\">{label}</span> : null}\n {virtualized\n ? <VirtualTileRows items={items} renderTile={renderTile} label={label} role={groupRole} height={virtualized.height} overscan={virtualized.overscan ?? virtualListRecipe.overscan} estimatedTileHeight={estimatedTileHeight} />\n : <div className=\"hjm-image-choice__tiles\" role={groupRole} aria-label={label}>{items.map(renderTile)}</div>}\n </div>;\n}\n\n/**\n * Windowed rows of tiles. It reuses the VirtualList window math (`resolveVirtualWindow`) but not the VirtualList\n * component: that one names its rows as list items and moves focus row by row, which would replace the radio/checkbox\n * group this control is. Tiles stay in the tab order; focusing one scrolls it into view and the window follows.\n */\nfunction VirtualTileRows({ items, renderTile, label, role, height, overscan, estimatedTileHeight }: Readonly<{\n items: readonly ImageChoiceItem[]; renderTile: (item: ImageChoiceItem, index: number) => ReactNode; label: string;\n role: \"radiogroup\" | \"group\"; height: number; overscan: number; estimatedTileHeight: number;\n}>) {\n const host = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n const [measuredTileHeight, setMeasuredTileHeight] = useState(0);\n const [scrollTop, setScrollTop] = useState(0);\n const [focusedRow, setFocusedRow] = useState<number | null>(null);\n useEffect(() => {\n if (!host.current) return;\n // Measure the slot itself (content box: inside the inset and the scrollbar); sheets and sidebars change it.\n const observer = new ResizeObserver(([entry]) => setWidth(entry?.contentRect.width ?? 0));\n observer.observe(host.current);\n return () => observer.disconnect();\n }, []);\n useLayoutEffect(() => {\n // Every row is one tile high (the caption block is reserved), so any mounted row gives the real stride.\n const rendered = host.current?.querySelector<HTMLElement>(\".hjm-image-choice__row\")?.offsetHeight ?? 0;\n if (rendered > 0 && rendered !== measuredTileHeight) setMeasuredTileHeight(rendered);\n });\n const columns = width > 0 ? Math.min(items.length, resolveImageChoiceColumns(width)) : 0;\n const stride = (measuredTileHeight || estimatedTileHeight) + imageChoiceRecipe.gap;\n const rowCount = columns ? Math.ceil(items.length / columns) : 0;\n const range = resolveVirtualWindow(rowCount, stride, height, scrollTop, overscan);\n // Keep the focused tile's row mounted when scrolling moves it out of the window, so focus is not dropped to body.\n const rows = Array.from({ length: range.end - range.start }, (_, i) => range.start + i);\n if (focusedRow !== null && focusedRow < rowCount && !rows.includes(focusedRow)) rows.push(focusedRow);\n rows.sort((first, second) => first - second); // DOM order is the tab order\n return <div ref={host} className=\"hjm-image-choice__viewport\" role={role} aria-label={label} style={{ height }}\n onScroll={event => setScrollTop(event.currentTarget.scrollTop)}>\n {columns ? <div style={{ position: \"relative\", height: Math.max(0, range.totalHeight - imageChoiceRecipe.gap) }}>\n {rows.map(row => <div key={row} className=\"hjm-image-choice__row\" style={{ top: row * stride, display: \"grid\", gridTemplateColumns: `repeat(${columns}, ${resolveImageChoiceOuterSize()}px)`, justifyContent: \"space-between\" }}\n onFocusCapture={() => setFocusedRow(row)} onBlurCapture={event => { if (!event.currentTarget.contains(event.relatedTarget)) setFocusedRow(current => current === row ? null : current); }}>\n {items.slice(row * columns, row * columns + columns).map((item, offset) => renderTile(item, row * columns + offset))}\n </div>)}\n </div> : null}\n </div>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"image-comparison.d.ts","sourceRoot":"","sources":["../src/image-comparison.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAA0B,KAAK,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAIpH,MAAM,MAAM,oBAAoB,GAAG,yBAAyB,GAAG,QAAQ,CAAC;IAAE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAC;AACxN;wEACwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAgB1D"}
1
+ {"version":3,"file":"image-comparison.d.ts","sourceRoot":"","sources":["../src/image-comparison.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAA0B,KAAK,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AAIpH,MAAM,MAAM,oBAAoB,GAAG,yBAAyB,GAAG,QAAQ,CAAC;IAAE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAC;AACxN;wEACwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAgB1D"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { resolveImageComparison } from "@hjmds/design-contracts/reference-controls";
3
4
  import { imageRecipe } from "@hjmds/design-contracts/components/image";
@@ -1 +1 @@
1
- {"version":3,"file":"image-comparison.js","sourceRoot":"","sources":["../src/image-comparison.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,sBAAsB,EAAkC,MAAM,4CAA4C,CAAC;AACpH,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD;wEACwE;AACxE,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IAC7F,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChE,8EAA8E;IAC9E,iFAAiF;IACjF,OAAO,eAAK,SAAS,EAAC,sBAAsB,EAAC,KAAK,EAAE,KAAK,CAAC,WAAW,aACnE,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAE,eAAM,GAAG,EAAC,MAAM,YAAE,MAAM,CAAC,KAAK,GAAQ,EAAA,eAAM,GAAG,EAAC,MAAM,YAAE,KAAK,CAAC,KAAK,GAAQ,IAAM,EAGnN,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAoB,WAAW,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,8BAA8B,EAAE,aAC1L,KAAC,KAAK,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACnL,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,GAAG,KAAK,QAAQ,EAAE,YAAE,KAAC,KAAK,IAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,GAAM,EACvR,6BAAiB,MAAM,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE,iBAAiB,EAAE,mCAAmC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAI,IACrL,EACN,KAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAC3I,CAAC;AACT,CAAC","sourcesContent":["import type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { resolveImageComparison, type ImageComparisonDescriptor } from \"@hjmds/design-contracts/reference-controls\";\nimport { imageRecipe } from \"@hjmds/design-contracts/components/image\";\nimport { Slider } from \"./slider.js\";\nimport { Image } from \"./supplemental-display.js\";\nexport type ImageComparisonProps = ImageComparisonDescriptor & Readonly<{ onValueChange: (value: number) => void; getValueText: (value: number) => string; disabled?: boolean; layoutStyle?: HjmCompositionStyleProp }>;\n/** Reuse Slider for drag/keyboard/commit semantics. The image divider is a\n * visual projection, not a second competing gesture or focus target. */\nexport function ImageComparison(props: ImageComparisonProps) {\n const { before, after, label, value, onValueChange, getValueText, disabled = false } = props;\n const { aspectRatio, fraction } = resolveImageComparison(props);\n // Labels follow the physical comparison sides even in RTL; each label retains\n // its own writing direction. Mirroring only the labels misidentifies the images.\n return <div className=\"hjm-image-comparison\" style={props.layoutStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", direction: \"ltr\", gap: \"var(--hjm-space-sm)\", flexWrap: \"wrap\" }}><span dir=\"auto\">{before.label}</span><span dir=\"auto\">{after.label}</span></div>\n {/* The frame takes the images' own corner radius: a square frame let the surface show through each image's\n rounded corners (2026-10-17 review N9). */}\n <div style={{ position: \"relative\", aspectRatio, overflow: \"hidden\", borderRadius: `var(--hjm-radius-${imageRecipe.radius})`, direction: \"ltr\", background: \"var(--hjm-color-surface-alt)\" }}>\n <Image src={after.src} width={after.width} height={after.height} decorative={false} accessibilityLabel={after.label} style={{ display: \"block\", width: \"100%\", height: \"100%\" }} />\n <div style={{ position: \"absolute\", inset: 0, clipPath: `inset(0 ${100 - value}% 0 0)` }}><Image src={before.src} width={before.width} height={before.height} decorative={false} accessibilityLabel={before.label} style={{ display: \"block\", width: \"100%\", height: \"100%\" }} /></div>\n <div aria-hidden=\"true\" style={{ position: \"absolute\", top: 0, bottom: 0, left: `${fraction * 100}%`, borderInlineStart: \"2px solid var(--hjm-color-border)\", pointerEvents: \"none\" }} />\n </div>\n <Slider label={label} min={0} max={100} step={1} value={value} onValueChange={onValueChange} getValueText={getValueText} disabled={disabled} />\n </div>;\n}\n"]}
1
+ {"version":3,"file":"image-comparison.js","sourceRoot":"","sources":["../src/image-comparison.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,sBAAsB,EAAkC,MAAM,4CAA4C,CAAC;AACpH,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD;wEACwE;AACxE,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IAC7F,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChE,8EAA8E;IAC9E,iFAAiF;IACjF,OAAO,eAAK,SAAS,EAAC,sBAAsB,EAAC,KAAK,EAAE,KAAK,CAAC,WAAW,aACnE,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAE,eAAM,GAAG,EAAC,MAAM,YAAE,MAAM,CAAC,KAAK,GAAQ,EAAA,eAAM,GAAG,EAAC,MAAM,YAAE,KAAK,CAAC,KAAK,GAAQ,IAAM,EAGnN,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAoB,WAAW,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,8BAA8B,EAAE,aAC1L,KAAC,KAAK,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACnL,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,GAAG,KAAK,QAAQ,EAAE,YAAE,KAAC,KAAK,IAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,GAAM,EACvR,6BAAiB,MAAM,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE,iBAAiB,EAAE,mCAAmC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAI,IACrL,EACN,KAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAC3I,CAAC;AACT,CAAC","sourcesContent":["\"use client\";\n\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { resolveImageComparison, type ImageComparisonDescriptor } from \"@hjmds/design-contracts/reference-controls\";\nimport { imageRecipe } from \"@hjmds/design-contracts/components/image\";\nimport { Slider } from \"./slider.js\";\nimport { Image } from \"./supplemental-display.js\";\nexport type ImageComparisonProps = ImageComparisonDescriptor & Readonly<{ onValueChange: (value: number) => void; getValueText: (value: number) => string; disabled?: boolean; layoutStyle?: HjmCompositionStyleProp }>;\n/** Reuse Slider for drag/keyboard/commit semantics. The image divider is a\n * visual projection, not a second competing gesture or focus target. */\nexport function ImageComparison(props: ImageComparisonProps) {\n const { before, after, label, value, onValueChange, getValueText, disabled = false } = props;\n const { aspectRatio, fraction } = resolveImageComparison(props);\n // Labels follow the physical comparison sides even in RTL; each label retains\n // its own writing direction. Mirroring only the labels misidentifies the images.\n return <div className=\"hjm-image-comparison\" style={props.layoutStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", direction: \"ltr\", gap: \"var(--hjm-space-sm)\", flexWrap: \"wrap\" }}><span dir=\"auto\">{before.label}</span><span dir=\"auto\">{after.label}</span></div>\n {/* The frame takes the images' own corner radius: a square frame let the surface show through each image's\n rounded corners (2026-10-17 review N9). */}\n <div style={{ position: \"relative\", aspectRatio, overflow: \"hidden\", borderRadius: `var(--hjm-radius-${imageRecipe.radius})`, direction: \"ltr\", background: \"var(--hjm-color-surface-alt)\" }}>\n <Image src={after.src} width={after.width} height={after.height} decorative={false} accessibilityLabel={after.label} style={{ display: \"block\", width: \"100%\", height: \"100%\" }} />\n <div style={{ position: \"absolute\", inset: 0, clipPath: `inset(0 ${100 - value}% 0 0)` }}><Image src={before.src} width={before.width} height={before.height} decorative={false} accessibilityLabel={before.label} style={{ display: \"block\", width: \"100%\", height: \"100%\" }} /></div>\n <div aria-hidden=\"true\" style={{ position: \"absolute\", top: 0, bottom: 0, left: `${fraction * 100}%`, borderInlineStart: \"2px solid var(--hjm-color-border)\", pointerEvents: \"none\" }} />\n </div>\n <Slider label={label} min={0} max={100} step={1} value={value} onValueChange={onValueChange} getValueText={getValueText} disabled={disabled} />\n </div>;\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { type ReactNode } from "react";
1
+ import { type ButtonHTMLAttributes, type ReactNode } from "react";
2
+ import type { HjmCompositionStyleProp } from "./composition-style.js";
2
3
  export type ImageViewerItem = {
3
4
  id: string;
4
5
  uri: string;
@@ -20,6 +21,26 @@ export type ImageViewerProps = {
20
21
  /** Authorized image hosts keep their fetching, loading and retry policy. Only the selected item mounts. */
21
22
  renderImage?: (item: ImageViewerItem) => ReactNode;
22
23
  };
24
+ export type ImageViewerTriggerProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "aria-label" | "type" | "style"> & Readonly<{
25
+ /** Localized accessible name, e.g. "사진 크게 보기". The media inside is decorative. */
26
+ label: string;
27
+ /** Product media (HJM `Image` with `decorative`, `<img alt="">`). */
28
+ children: ReactNode;
29
+ /** Layout-only placement; the trigger fills its container width by default, set `width` for a thumbnail. */
30
+ layoutStyle?: HjmCompositionStyleProp;
31
+ }>;
32
+ /**
33
+ * Button around product media that opens ImageViewer. The product keeps the viewer's `open` state and calls it from
34
+ * `onClick`; the trigger owns the name, focus ring on the image frame radius, zoom cursor and pressed opacity.
35
+ */
36
+ export declare const ImageViewerTrigger: import("react").ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "style" | "aria-label" | "type"> & Readonly<{
37
+ /** Localized accessible name, e.g. "사진 크게 보기". The media inside is decorative. */
38
+ label: string;
39
+ /** Product media (HJM `Image` with `decorative`, `<img alt="">`). */
40
+ children: ReactNode;
41
+ /** Layout-only placement; the trigger fills its container width by default, set `width` for a thumbnail. */
42
+ layoutStyle?: HjmCompositionStyleProp;
43
+ }> & import("react").RefAttributes<HTMLButtonElement>>;
23
44
  /** Full viewport photo presentation; shares modal isolation, focus return and Escape with Dialog. */
24
45
  export declare function ImageViewer(props: ImageViewerProps): import("react").JSX.Element | null;
25
46
  //# sourceMappingURL=image-viewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-viewer.d.ts","sourceRoot":"","sources":["../src/image-viewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAI5E,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACxE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAC7D,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAC7D,2GAA2G;IAC3G,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,SAAS,CAAC;CACpD,CAAC;AAEF,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,sCAQlD"}
1
+ {"version":3,"file":"image-viewer.d.ts","sourceRoot":"","sources":["../src/image-viewer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,oBAAoB,EAAsB,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAEvI,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAKtE,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACxE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAC7D,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAC7D,2GAA2G;IAC3G,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,SAAS,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC;IAC3I,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,QAAQ,EAAE,SAAS,CAAC;IACpB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAZ7B,kFAAkF;WAC3E,MAAM;IACb,qEAAqE;cAC3D,SAAS;IACnB,4GAA4G;kBAC9F,uBAAuB;sDAkBrC,CAAC;AAEH,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,sCAQlD"}
@@ -1,7 +1,20 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useRef, useState } from "react";
3
+ import { forwardRef, useRef, useState } from "react";
4
+ import { imageViewerTriggerRecipe, validateImageViewerTriggerLabel } from "@hjmds/design-contracts/components/image";
5
+ import { classNames } from "./internal.js";
3
6
  import { HjmPortal, getModalLayer, useModalFocus } from "./modal.js";
4
7
  import { IconButton } from "./actions.js";
8
+ /**
9
+ * Button around product media that opens ImageViewer. The product keeps the viewer's `open` state and calls it from
10
+ * `onClick`; the trigger owns the name, focus ring on the image frame radius, zoom cursor and pressed opacity.
11
+ */
12
+ export const ImageViewerTrigger = forwardRef(function ImageViewerTrigger({ label, children, className, layoutStyle, ...props }, ref) {
13
+ validateImageViewerTriggerLabel(label);
14
+ return _jsx("button", { ...props, ref: ref, type: "button", "aria-label": label, "aria-haspopup": "dialog", className: classNames("hjm-image-viewer-trigger", className), style: { ...layoutStyle, "--hjm-image-viewer-trigger-pressed-opacity": imageViewerTriggerRecipe.pressedOpacity,
15
+ "--hjm-image-viewer-trigger-disabled-opacity": imageViewerTriggerRecipe.disabledOpacity,
16
+ "--hjm-image-viewer-trigger-cursor": imageViewerTriggerRecipe.cursor }, children: children });
17
+ });
5
18
  /** Full viewport photo presentation; shares modal isolation, focus return and Escape with Dialog. */
6
19
  export function ImageViewer(props) {
7
20
  if (!props.open)