themelia-react-ui 1.0.1 → 1.0.2

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 (488) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/README.md +59 -13
  3. package/dist/{accordion-B-5Focs8.js → accordion-BRTcsp8J.js} +8 -8
  4. package/dist/accordion-BRTcsp8J.js.map +1 -0
  5. package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
  6. package/dist/action-menu-Drxw_vJk.js.map +1 -0
  7. package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
  8. package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
  9. package/dist/{ai-artifact-B5tPpXnS.js → ai-artifact-DLVdK0Py.js} +151 -155
  10. package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
  11. package/dist/{app-shell-at8Kt4l_.js → app-shell-C_fKpljx.js} +11 -10
  12. package/dist/app-shell-C_fKpljx.js.map +1 -0
  13. package/dist/{attachment-BO2R47wn.js → attachment-DbjUWsP0.js} +12 -12
  14. package/dist/{attachment-BO2R47wn.js.map → attachment-DbjUWsP0.js.map} +1 -1
  15. package/dist/auth-CAQcasMV.js +723 -0
  16. package/dist/auth-CAQcasMV.js.map +1 -0
  17. package/dist/{avatar-Bpzty83c.js → avatar-Bu2HhitA.js} +6 -6
  18. package/dist/{avatar-Bpzty83c.js.map → avatar-Bu2HhitA.js.map} +1 -1
  19. package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
  20. package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/buttons.js +3 -2
  27. package/dist/base/cards.js +3 -3
  28. package/dist/base/carousel.js +25 -27
  29. package/dist/base/carousel.js.map +1 -1
  30. package/dist/base/cascader.js +150 -148
  31. package/dist/base/cascader.js.map +1 -1
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +1 -1
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +3 -3
  39. package/dist/base/display.js +7 -7
  40. package/dist/base/feedback.js +4 -4
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +40 -43
  44. package/dist/base/inline-edit.js.map +1 -1
  45. package/dist/base/item.js +1 -1
  46. package/dist/base/media-gallery.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +1 -1
  51. package/dist/base/repeaters.js +33 -33
  52. package/dist/base/repeaters.js.map +1 -1
  53. package/dist/base/sheet.js +1 -1
  54. package/dist/base/sidebar.js +1 -1
  55. package/dist/base/signature-pad.js +83 -81
  56. package/dist/base/signature-pad.js.map +1 -1
  57. package/dist/base/skeleton.js +1 -1
  58. package/dist/base/spinner.js +1 -1
  59. package/dist/base/structure.js +1 -1
  60. package/dist/base/table.js +1 -1
  61. package/dist/base/text-inputs.js +2 -2
  62. package/dist/base/toaster.js +6 -6
  63. package/dist/base/toaster.js.map +1 -1
  64. package/dist/base/tree.js +1 -1
  65. package/dist/base/upload-queue.js +1 -1
  66. package/dist/base/upload.js +3 -3
  67. package/dist/base/value-inputs.js +1 -1
  68. package/dist/blocks/admin.js +134 -134
  69. package/dist/blocks/admin.js.map +1 -1
  70. package/dist/blocks/ai.js +120 -117
  71. package/dist/blocks/ai.js.map +1 -1
  72. package/dist/blocks/analytics/usage-card.js +1 -1
  73. package/dist/blocks/analytics.js +510 -472
  74. package/dist/blocks/analytics.js.map +1 -1
  75. package/dist/blocks/collaboration.js +2 -2
  76. package/dist/blocks/commerce/receipt.js +1 -1
  77. package/dist/blocks/commerce.js +395 -383
  78. package/dist/blocks/commerce.js.map +1 -1
  79. package/dist/blocks/data-display.js +1 -1
  80. package/dist/blocks/onboarding.js +6 -6
  81. package/dist/blocks/onboarding.js.map +1 -1
  82. package/dist/blocks/planning.js +36 -36
  83. package/dist/blocks/planning.js.map +1 -1
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
  86. package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
  87. package/dist/button-BZDasD04.js +651 -0
  88. package/dist/button-BZDasD04.js.map +1 -0
  89. package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
  90. package/dist/button-BZyfTvwm.js.map +1 -0
  91. package/dist/buttons-D_6KJvEE.js +99 -0
  92. package/dist/buttons-D_6KJvEE.js.map +1 -0
  93. package/dist/{cards-Cum56XOF.js → cards-qGSErLw_.js} +12 -12
  94. package/dist/{cards-Cum56XOF.js.map → cards-qGSErLw_.js.map} +1 -1
  95. package/dist/chart-Bsc5BICK.js +150 -0
  96. package/dist/chart-Bsc5BICK.js.map +1 -0
  97. package/dist/{checkbox-BavDRjF7.js → checkbox-BQNDjUCh.js} +3 -3
  98. package/dist/checkbox-BQNDjUCh.js.map +1 -0
  99. package/dist/choice-inputs-Mk3iWbhr.js +725 -0
  100. package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
  101. package/dist/{code-block-xHKbAJDj.js → code-block-DzHKRybS.js} +23 -23
  102. package/dist/code-block-DzHKRybS.js.map +1 -0
  103. package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
  104. package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
  105. package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
  106. package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
  107. package/dist/{combobox-DEbdr-3u.js → combobox-BFnbJJp3.js} +18 -18
  108. package/dist/combobox-BFnbJJp3.js.map +1 -0
  109. package/dist/{combobox-xv3yJbzl.js → combobox-hozNwUcc.js} +313 -316
  110. package/dist/combobox-hozNwUcc.js.map +1 -0
  111. package/dist/{command-C0xe7u9B.js → command-BnmSchli.js} +9 -9
  112. package/dist/command-BnmSchli.js.map +1 -0
  113. package/dist/comments-u5L0OGip.js +1156 -0
  114. package/dist/comments-u5L0OGip.js.map +1 -0
  115. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  116. package/dist/components/base/buttons/button.recipes.d.ts +10 -19
  117. package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
  118. package/dist/components/base/cards/card.recipes.d.ts +13 -5
  119. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
  120. package/dist/components/base/cards/smart-card.types.d.ts +1 -1
  121. package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
  122. package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
  123. package/dist/components/base/forms/form-field.d.ts +1 -0
  124. package/dist/components/base/forms/form-sizing.d.ts +3 -3
  125. package/dist/components/base/navigation/tabs.d.ts +3 -5
  126. package/dist/components/base/popover/popover.recipes.d.ts +3 -3
  127. package/dist/components/base/table/index.d.ts +1 -1
  128. package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
  129. package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
  130. package/dist/components/blocks/analytics/types.d.ts +1 -1
  131. package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
  132. package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
  133. package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
  134. package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
  135. package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
  136. package/dist/components/features/combobox/components/error-message.d.ts +1 -1
  137. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
  138. package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
  139. package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
  140. package/dist/components/features/media-library/media-library.d.ts +1 -1
  141. package/dist/components/features/media-library/media-library.types.d.ts +9 -1
  142. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  143. package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
  144. package/dist/components/features/overlays/overlays.types.d.ts +5 -4
  145. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
  146. package/dist/components/features/table/data-table.d.ts +1 -1
  147. package/dist/components/features/table/table.types.d.ts +1 -1
  148. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
  149. package/dist/components/layout/auth/auth.types.d.ts +1 -0
  150. package/dist/components/layout/page/page.d.ts +0 -1
  151. package/dist/components/layout/page/page.types.d.ts +9 -3
  152. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
  153. package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
  154. package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
  155. package/dist/components/typography/heading.d.ts +5 -2
  156. package/dist/components/typography/index.d.ts +1 -1
  157. package/dist/components/typography/text.styles.d.ts +10 -0
  158. package/dist/components/ui/popover.d.ts +1 -1
  159. package/dist/components/ui/sidebar.d.ts +1 -1
  160. package/dist/components/ui/table.d.ts +2 -1
  161. package/dist/container.recipes-D9t8MHR3.js +27 -0
  162. package/dist/container.recipes-D9t8MHR3.js.map +1 -0
  163. package/dist/{containers-6s-ucRQQ.js → containers-DqB-bSYE.js} +33 -56
  164. package/dist/containers-DqB-bSYE.js.map +1 -0
  165. package/dist/control-group-recipes-DBXmfh2E.js +21 -0
  166. package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
  167. package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
  168. package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
  169. package/dist/{data-display-cWIRdeaf.js → data-display-Bihs9Ven.js} +545 -332
  170. package/dist/data-display-Bihs9Ven.js.map +1 -0
  171. package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
  172. package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
  173. package/dist/{date-picker-CA6ogMQB.js → date-picker-DzP5HQq7.js} +492 -472
  174. package/dist/date-picker-DzP5HQq7.js.map +1 -0
  175. package/dist/date-pickers-BpgGz7S-.js +196 -0
  176. package/dist/date-pickers-BpgGz7S-.js.map +1 -0
  177. package/dist/{display-CFM5myut.js → display-CS6Hbk18.js} +8 -8
  178. package/dist/{display-CFM5myut.js.map → display-CS6Hbk18.js.map} +1 -1
  179. package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
  180. package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
  181. package/dist/features/activities.js +152 -141
  182. package/dist/features/activities.js.map +1 -1
  183. package/dist/features/ai-chat.js +182 -179
  184. package/dist/features/ai-chat.js.map +1 -1
  185. package/dist/features/async-preview.js +9 -9
  186. package/dist/features/async-preview.js.map +1 -1
  187. package/dist/features/combobox.js +1 -1
  188. package/dist/features/comments.js +1 -1
  189. package/dist/features/data-view.js +25 -23
  190. package/dist/features/data-view.js.map +1 -1
  191. package/dist/features/email-composer/engine.js +1 -1
  192. package/dist/features/email-composer.js +103 -104
  193. package/dist/features/email-composer.js.map +1 -1
  194. package/dist/features/event-calendar.js +375 -373
  195. package/dist/features/event-calendar.js.map +1 -1
  196. package/dist/features/filters.js +1 -1
  197. package/dist/features/global-search.js +222 -224
  198. package/dist/features/global-search.js.map +1 -1
  199. package/dist/features/kanban.js +29 -29
  200. package/dist/features/kanban.js.map +1 -1
  201. package/dist/features/map.js +59 -58
  202. package/dist/features/map.js.map +1 -1
  203. package/dist/features/media-library.js +856 -855
  204. package/dist/features/media-library.js.map +1 -1
  205. package/dist/features/mentions.js +1 -1
  206. package/dist/features/overlays.js +1 -1
  207. package/dist/features/products.js +1209 -1209
  208. package/dist/features/products.js.map +1 -1
  209. package/dist/features/questionnaire.js +52 -52
  210. package/dist/features/questionnaire.js.map +1 -1
  211. package/dist/features/resource-assignment.js +29 -31
  212. package/dist/features/resource-assignment.js.map +1 -1
  213. package/dist/features/resource.js +13 -13
  214. package/dist/features/resource.js.map +1 -1
  215. package/dist/features/rich-text-editor.js +2 -2
  216. package/dist/features/schema-form.js +82 -82
  217. package/dist/features/schema-form.js.map +1 -1
  218. package/dist/features/suggestions.js +3 -3
  219. package/dist/features/sync.js +4 -4
  220. package/dist/features/sync.js.map +1 -1
  221. package/dist/features/table.js +1 -1
  222. package/dist/features/theme-tweaker.js +456 -450
  223. package/dist/features/theme-tweaker.js.map +1 -1
  224. package/dist/{feedback-DWUkgEjR.js → feedback-CJkUAapr.js} +29 -29
  225. package/dist/feedback-CJkUAapr.js.map +1 -0
  226. package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
  227. package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
  228. package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
  229. package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
  230. package/dist/{filters-BhsUtsxW.js → filters-D6FF8L6s.js} +715 -720
  231. package/dist/filters-D6FF8L6s.js.map +1 -0
  232. package/dist/{form-field-Bn7ZH1rA.js → form-field-CZwrkP7m.js} +17 -9
  233. package/dist/form-field-CZwrkP7m.js.map +1 -0
  234. package/dist/{form-sizing-BWs70_a2.js → form-sizing-QP8aIRaW.js} +8 -5
  235. package/dist/form-sizing-QP8aIRaW.js.map +1 -0
  236. package/dist/{forms-B7pzS25o.js → forms-B5NCbkSC.js} +35 -35
  237. package/dist/{forms-B7pzS25o.js.map → forms-B5NCbkSC.js.map} +1 -1
  238. package/dist/forms-numeric-Crrm80Lm.js +867 -0
  239. package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
  240. package/dist/{header-C59QZyxV.js → header-kxruN3RM.js} +53 -49
  241. package/dist/header-kxruN3RM.js.map +1 -0
  242. package/dist/{hooks-CM1Vp9Pe.js → hooks-BrlnCwQd.js} +2 -2
  243. package/dist/{hooks-CM1Vp9Pe.js.map → hooks-BrlnCwQd.js.map} +1 -1
  244. package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
  245. package/dist/http-CdEIHyQf.js.map +1 -0
  246. package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
  247. package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
  248. package/dist/index.js +2 -2
  249. package/dist/input-SX9V0AL3.js +255 -0
  250. package/dist/input-SX9V0AL3.js.map +1 -0
  251. package/dist/input-vxcaNCYC.js +20 -0
  252. package/dist/input-vxcaNCYC.js.map +1 -0
  253. package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
  254. package/dist/item-DE4YnuJx.js.map +1 -0
  255. package/dist/layout/app-shell.js +1 -1
  256. package/dist/layout/auth.js +1 -1
  257. package/dist/layout/containers.js +1 -1
  258. package/dist/layout/header.js +1 -1
  259. package/dist/layout/hooks.js +1 -1
  260. package/dist/layout/navigation.js +1 -1
  261. package/dist/layout/page.js +1 -1
  262. package/dist/layout/settings.js +1 -1
  263. package/dist/layout/sidebar.js +2 -2
  264. package/dist/layout/workspace.js +1 -1
  265. package/dist/layout.js +10 -10
  266. package/dist/lib/affordance-geometry.generated.d.ts +40 -9
  267. package/dist/lib/control-group-recipes.d.ts +22 -0
  268. package/dist/lib/field-affordance-recipes.d.ts +35 -2
  269. package/dist/lib/field-state-recipes.d.ts +2 -2
  270. package/dist/lib/navigation-row-recipes.d.ts +3 -2
  271. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
  272. package/dist/lib/surface-recipes.d.ts +5 -2
  273. package/dist/lib/token-merge.generated.d.ts +144 -2
  274. package/dist/lib/ui-provider/types.d.ts +4 -2
  275. package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
  276. package/dist/lib/utils.js +1 -1
  277. package/dist/{media-gallery-DhDRgnVZ.js → media-gallery-DLp3HAz0.js} +75 -74
  278. package/dist/media-gallery-DLp3HAz0.js.map +1 -0
  279. package/dist/{mentions-B8Ko-fhS.js → mentions-Cl0Kt_Pd.js} +52 -50
  280. package/dist/{mentions-B8Ko-fhS.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
  281. package/dist/message-SZUNB1eX.js +127 -0
  282. package/dist/message-SZUNB1eX.js.map +1 -0
  283. package/dist/{navigation-DBEu4POU.js → navigation-DnQSNMT0.js} +64 -55
  284. package/dist/navigation-DnQSNMT0.js.map +1 -0
  285. package/dist/{navigation-BUIn2Qxx.js → navigation-DyytsLRB.js} +37 -37
  286. package/dist/navigation-DyytsLRB.js.map +1 -0
  287. package/dist/{navigation-row-recipes-GVh11KiT.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
  288. package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
  289. package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
  290. package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
  291. package/dist/overlays-DUbs1KEi.js +1011 -0
  292. package/dist/overlays-DUbs1KEi.js.map +1 -0
  293. package/dist/{page-BV6ioQg3.js → page-hGmT4nWK.js} +75 -64
  294. package/dist/page-hGmT4nWK.js.map +1 -0
  295. package/dist/{page-header-DQRa0jug.js → page-header-D8nERkn5.js} +9 -9
  296. package/dist/page-header-D8nERkn5.js.map +1 -0
  297. package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
  298. package/dist/pagination-NLGqRirf.js.map +1 -0
  299. package/dist/{popover-CoLDEg19.js → popover-CghIYdQf.js} +23 -22
  300. package/dist/popover-CghIYdQf.js.map +1 -0
  301. package/dist/{popover-menu-GLIQTJTx.js → popover-menu-B4PoWhRl.js} +6 -6
  302. package/dist/{popover-menu-GLIQTJTx.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
  303. package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
  304. package/dist/popover.recipes-QlD4JenO.js.map +1 -0
  305. package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
  306. package/dist/primitives-C7ff0QaI.js.map +1 -0
  307. package/dist/primitives.js +3 -3
  308. package/dist/{progress-BOe8l_FZ.js → progress-BroqrAyV.js} +10 -9
  309. package/dist/progress-BroqrAyV.js.map +1 -0
  310. package/dist/{receipt-BM8xsGFy.js → receipt-BuJynLgf.js} +8 -8
  311. package/dist/{receipt-BM8xsGFy.js.map → receipt-BuJynLgf.js.map} +1 -1
  312. package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
  313. package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
  314. package/dist/rich-text-editor-BKyG7rWz.js +574 -0
  315. package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
  316. package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
  317. package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
  318. package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
  319. package/dist/scroll-area-D-pIhEKl.js.map +1 -0
  320. package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
  321. package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
  322. package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
  323. package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
  324. package/dist/services/actions.js +1 -1
  325. package/dist/{settings-BnCyyPOJ.js → settings-DOTOzeZ2.js} +10 -9
  326. package/dist/{settings-BnCyyPOJ.js.map → settings-DOTOzeZ2.js.map} +1 -1
  327. package/dist/{sheet-B-q914Ad.js → sheet-BFhrNehm.js} +11 -11
  328. package/dist/sheet-BFhrNehm.js.map +1 -0
  329. package/dist/{sidebar-DPR7fmqN.js → sidebar-CyR4XKwR.js} +219 -200
  330. package/dist/sidebar-CyR4XKwR.js.map +1 -0
  331. package/dist/{sidebar-C_2p3Tfj.js → sidebar-SvGJ0Zwi.js} +63 -58
  332. package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
  333. package/dist/{skeleton-CmT1ppqb.js → skeleton-3F0uhYn3.js} +4 -4
  334. package/dist/{skeleton-CmT1ppqb.js.map → skeleton-3F0uhYn3.js.map} +1 -1
  335. package/dist/{smart-card-CYLn46e6.js → smart-card-DjGVV2xr.js} +171 -165
  336. package/dist/smart-card-DjGVV2xr.js.map +1 -0
  337. package/dist/{spinner-BY9HbUEh.js → spinner-Cpf7oRkF.js} +5 -5
  338. package/dist/{spinner-BY9HbUEh.js.map → spinner-Cpf7oRkF.js.map} +1 -1
  339. package/dist/{structure-MvKVq-oL.js → structure-CRdqVawd.js} +2 -2
  340. package/dist/{structure-MvKVq-oL.js.map → structure-CRdqVawd.js.map} +1 -1
  341. package/dist/style.css +1 -1
  342. package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
  343. package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
  344. package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
  345. package/dist/table-CLtJTxoR.js.map +1 -0
  346. package/dist/table-CcRDZiLP.js +1444 -0
  347. package/dist/table-CcRDZiLP.js.map +1 -0
  348. package/dist/tabs-BNgu7g0u.js +188 -0
  349. package/dist/tabs-BNgu7g0u.js.map +1 -0
  350. package/dist/text-inputs-DsR56TR-.js +330 -0
  351. package/dist/text-inputs-DsR56TR-.js.map +1 -0
  352. package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
  353. package/dist/text.styles-Q4sGAIgA.js.map +1 -0
  354. package/dist/theme.css +77 -115
  355. package/dist/{timelines-B9ICkQcV.js → timelines-D1pkt3se.js} +84 -78
  356. package/dist/timelines-D1pkt3se.js.map +1 -0
  357. package/dist/{tree-BdWSaoFT.js → tree-BtmYyMZV.js} +8 -8
  358. package/dist/{tree-BdWSaoFT.js.map → tree-BtmYyMZV.js.map} +1 -1
  359. package/dist/typography/rich-text.js +1 -1
  360. package/dist/typography-BxQgiZyw.js +96 -0
  361. package/dist/typography-BxQgiZyw.js.map +1 -0
  362. package/dist/typography.js +1 -1
  363. package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
  364. package/dist/ui-provider-DRPn3qNl.js.map +1 -0
  365. package/dist/ui-provider.js +1 -1
  366. package/dist/{upload-D8Za5x_c.js → upload-CDbYw1WN.js} +326 -323
  367. package/dist/upload-CDbYw1WN.js.map +1 -0
  368. package/dist/{upload-queue-hIIYBLS7.js → upload-queue-CNd_hH_a.js} +25 -25
  369. package/dist/upload-queue-CNd_hH_a.js.map +1 -0
  370. package/dist/{usage-card-DnmnJ58D.js → usage-card-VyJLUwRr.js} +53 -54
  371. package/dist/usage-card-VyJLUwRr.js.map +1 -0
  372. package/dist/utils-BvH9PSmq.js +4275 -0
  373. package/dist/utils-BvH9PSmq.js.map +1 -0
  374. package/dist/value-inputs-D0KCrfVC.js +840 -0
  375. package/dist/value-inputs-D0KCrfVC.js.map +1 -0
  376. package/dist/{workspace-C1PZmk8L.js → workspace-CcR8r-Nt.js} +115 -122
  377. package/dist/workspace-CcR8r-Nt.js.map +1 -0
  378. package/docs/consumer-skill/SKILL.md +110 -119
  379. package/docs/consumer-skill/examples/analytics.tsx +34 -0
  380. package/docs/consumer-skill/examples/app-layout.tsx +42 -12
  381. package/docs/consumer-skill/examples/detail.tsx +20 -4
  382. package/docs/consumer-skill/examples/manifest.json +13 -1
  383. package/docs/consumer-skill/examples/website.tsx +56 -0
  384. package/docs/consumer-skill/references/analytics.md +70 -0
  385. package/docs/consumer-skill/references/composition.md +116 -2
  386. package/docs/consumer-skill/references/design-contract.md +33 -7
  387. package/docs/consumer-skill/references/discovery.md +76 -5
  388. package/docs/consumer-skill/references/integration.md +14 -0
  389. package/docs/consumer-skill/references/public-api.json +2023 -218
  390. package/docs/consumer-skill/references/review.md +55 -3
  391. package/docs/consumer-skill/references/theming.md +52 -7
  392. package/docs/consumer-skill/references/tokens.json +177 -9
  393. package/docs/consumer-skill/references/workflows.md +32 -0
  394. package/docs/consumer-skill/scripts/check-composition.mjs +1 -1
  395. package/docs/consumer-skill/scripts/composition-policy.mjs +179 -17
  396. package/docs/consumer-skill/scripts/discovery.mjs +61 -9
  397. package/docs/consumer-skill/scripts/surface-policy.mjs +44 -0
  398. package/package.json +7 -4
  399. package/dist/accordion-B-5Focs8.js.map +0 -1
  400. package/dist/action-menu-Cx3SdfbN.js.map +0 -1
  401. package/dist/affordance-geometry.generated-D8Jcfb0G.js +0 -32
  402. package/dist/affordance-geometry.generated-D8Jcfb0G.js.map +0 -1
  403. package/dist/ai-artifact-B5tPpXnS.js.map +0 -1
  404. package/dist/app-shell-at8Kt4l_.js.map +0 -1
  405. package/dist/auth-OFwWSAap.js +0 -704
  406. package/dist/auth-OFwWSAap.js.map +0 -1
  407. package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
  408. package/dist/button-BS6l5JUw.js.map +0 -1
  409. package/dist/buttons-Co6GavvM.js +0 -674
  410. package/dist/buttons-Co6GavvM.js.map +0 -1
  411. package/dist/chart-DVfcwQu6.js +0 -149
  412. package/dist/chart-DVfcwQu6.js.map +0 -1
  413. package/dist/checkbox-BavDRjF7.js.map +0 -1
  414. package/dist/choice-inputs-CC7XqPQO.js +0 -619
  415. package/dist/choice-inputs-CC7XqPQO.js.map +0 -1
  416. package/dist/code-block-xHKbAJDj.js.map +0 -1
  417. package/dist/combobox-DEbdr-3u.js.map +0 -1
  418. package/dist/combobox-xv3yJbzl.js.map +0 -1
  419. package/dist/command-C0xe7u9B.js.map +0 -1
  420. package/dist/comments-DviPLnwy.js +0 -1132
  421. package/dist/comments-DviPLnwy.js.map +0 -1
  422. package/dist/containers-6s-ucRQQ.js.map +0 -1
  423. package/dist/data-display-cWIRdeaf.js.map +0 -1
  424. package/dist/date-picker-CA6ogMQB.js.map +0 -1
  425. package/dist/date-pickers-BPIKLdsD.js +0 -224
  426. package/dist/date-pickers-BPIKLdsD.js.map +0 -1
  427. package/dist/feedback-DWUkgEjR.js.map +0 -1
  428. package/dist/field-affordance-recipes-IjzPrCTw.js +0 -17
  429. package/dist/field-affordance-recipes-IjzPrCTw.js.map +0 -1
  430. package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
  431. package/dist/filters-BhsUtsxW.js.map +0 -1
  432. package/dist/form-field-Bn7ZH1rA.js.map +0 -1
  433. package/dist/form-sizing-BWs70_a2.js.map +0 -1
  434. package/dist/forms-numeric-BUBxELBv.js +0 -867
  435. package/dist/forms-numeric-BUBxELBv.js.map +0 -1
  436. package/dist/header-C59QZyxV.js.map +0 -1
  437. package/dist/http-CLTVJc5I.js.map +0 -1
  438. package/dist/input-WwYQZJzG.js +0 -202
  439. package/dist/input-WwYQZJzG.js.map +0 -1
  440. package/dist/input-ci9fIgFH.js +0 -20
  441. package/dist/input-ci9fIgFH.js.map +0 -1
  442. package/dist/item-pJ0GsOiJ.js.map +0 -1
  443. package/dist/media-gallery-DhDRgnVZ.js.map +0 -1
  444. package/dist/message-COsdEvXT.js +0 -108
  445. package/dist/message-COsdEvXT.js.map +0 -1
  446. package/dist/navigation-BUIn2Qxx.js.map +0 -1
  447. package/dist/navigation-DBEu4POU.js.map +0 -1
  448. package/dist/navigation-row-recipes-GVh11KiT.js.map +0 -1
  449. package/dist/overlays-B11wZka6.js +0 -982
  450. package/dist/overlays-B11wZka6.js.map +0 -1
  451. package/dist/page-BV6ioQg3.js.map +0 -1
  452. package/dist/page-header-DQRa0jug.js.map +0 -1
  453. package/dist/pagination-C29vvt3I.js.map +0 -1
  454. package/dist/popover-CoLDEg19.js.map +0 -1
  455. package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
  456. package/dist/primitives-DKPOGVpj.js.map +0 -1
  457. package/dist/progress-BOe8l_FZ.js.map +0 -1
  458. package/dist/rich-text-editor-CoVrTiSv.js +0 -575
  459. package/dist/rich-text-editor-CoVrTiSv.js.map +0 -1
  460. package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
  461. package/dist/scroll-area-BheMQ270.js.map +0 -1
  462. package/dist/select-B2mb-qN2.js +0 -108
  463. package/dist/select-B2mb-qN2.js.map +0 -1
  464. package/dist/sheet-B-q914Ad.js.map +0 -1
  465. package/dist/sidebar-C_2p3Tfj.js.map +0 -1
  466. package/dist/sidebar-DPR7fmqN.js.map +0 -1
  467. package/dist/smart-card-CYLn46e6.js.map +0 -1
  468. package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
  469. package/dist/table-BS39xnlq.js +0 -1424
  470. package/dist/table-BS39xnlq.js.map +0 -1
  471. package/dist/table-DnlAJ-xR.js.map +0 -1
  472. package/dist/tabs-B5cNMWiP.js +0 -187
  473. package/dist/tabs-B5cNMWiP.js.map +0 -1
  474. package/dist/text-inputs-Dh9XGyiS.js +0 -331
  475. package/dist/text-inputs-Dh9XGyiS.js.map +0 -1
  476. package/dist/text.styles-BwB7vAF2.js.map +0 -1
  477. package/dist/timelines-B9ICkQcV.js.map +0 -1
  478. package/dist/typography-Cv8MT-82.js +0 -96
  479. package/dist/typography-Cv8MT-82.js.map +0 -1
  480. package/dist/ui-provider-CftIB6TY.js.map +0 -1
  481. package/dist/upload-D8Za5x_c.js.map +0 -1
  482. package/dist/upload-queue-hIIYBLS7.js.map +0 -1
  483. package/dist/usage-card-DnmnJ58D.js.map +0 -1
  484. package/dist/utils-C2EKeIw3.js +0 -72
  485. package/dist/utils-C2EKeIw3.js.map +0 -1
  486. package/dist/value-inputs-DX2dbxjj.js +0 -824
  487. package/dist/value-inputs-DX2dbxjj.js.map +0 -1
  488. package/dist/workspace-C1PZmk8L.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  "use client";
2
2
  import { useStrings as e } from "../lib/strings.js";
3
- import { t } from "../utils-C2EKeIw3.js";
4
- import { n } from "../buttons-Co6GavvM.js";
5
- import { a as r } from "../typography-Cv8MT-82.js";
6
- import { t as i } from "../structure-MvKVq-oL.js";
7
- import { t as a } from "../field-state-recipes-CBTRt9Bt.js";
8
- import { t as o } from "../input-WwYQZJzG.js";
9
- import { t as s } from "../form-field-Bn7ZH1rA.js";
10
- import { forwardRef as c, useEffect as l, useId as ee, useImperativeHandle as te, useMemo as ne, useRef as u, useState as d } from "react";
3
+ import { t } from "../utils-BvH9PSmq.js";
4
+ import { a as n } from "../typography-BxQgiZyw.js";
5
+ import { t as r } from "../button-BZDasD04.js";
6
+ import { t as i } from "../structure-CRdqVawd.js";
7
+ import { t as a } from "../field-state-recipes-DQQpiLWC.js";
8
+ import { t as o } from "../input-SX9V0AL3.js";
9
+ import { t as s } from "../form-field-CZwrkP7m.js";
10
+ import { forwardRef as c, useEffect as l, useId as ee, useImperativeHandle as te, useLayoutEffect as ne, useMemo as re, useRef as u, useState as d } from "react";
11
11
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
12
12
  //#region src/components/base/signature-pad/signature-pad.types.ts
13
- var m = {
13
+ var ie = {
14
14
  label: "Signature",
15
15
  instructions: "Draw with a pointer or type your name below. Escape cancels a stroke; Control or Command Z undoes it.",
16
16
  drawingInstructions: "Draw with a pointer. Escape cancels a stroke; Control or Command Z undoes it.",
@@ -21,22 +21,22 @@ var m = {
21
21
  clear: "Clear signature",
22
22
  empty: "Signature is empty",
23
23
  signed: "Signature entered"
24
- }, h = { strokes: [] };
25
- function g(e) {
24
+ }, m = { strokes: [] };
25
+ function h(e) {
26
26
  return !e.typedName?.trim() && !e.strokes.some((e) => e.points.length > 0);
27
27
  }
28
- var _ = (e) => Number.isFinite(e) ? Math.min(1, Math.max(0, e)) : 0;
29
- function v(e) {
28
+ var g = (e) => Number.isFinite(e) ? Math.min(1, Math.max(0, e)) : 0;
29
+ function _(e) {
30
30
  return {
31
31
  strokes: e.strokes.filter((e) => e.points.length > 0).map((e) => ({ points: e.points.map((e) => ({
32
- x: _(e.x),
33
- y: _(e.y),
34
- pressure: _(e.pressure)
32
+ x: g(e.x),
33
+ y: g(e.y),
34
+ pressure: g(e.pressure)
35
35
  })) })),
36
36
  ...e.typedName === void 0 ? {} : { typedName: e.typedName }
37
37
  };
38
38
  }
39
- function y(e, t, n, r, i) {
39
+ function v(e, t, n, r, i) {
40
40
  e.clearRect(0, 0, n, r), e.lineCap = "round", e.lineJoin = "round";
41
41
  for (let a of t.strokes) {
42
42
  let t = a.points[0];
@@ -50,29 +50,31 @@ function y(e, t, n, r, i) {
50
50
  }
51
51
  t.typedName && (e.font = `${Math.max(12, r / 5)}px cursive`, e.textBaseline = "bottom", e.fillText(t.typedName, n * .04, r * .9, n * .92));
52
52
  }
53
- var b = (e) => e.replace(/[&<>"']/g, (e) => ({
53
+ var y = (e) => e.replace(/[&<>"']/g, (e) => ({
54
54
  "&": "&amp;",
55
55
  "<": "&lt;",
56
56
  ">": "&gt;",
57
57
  "\"": "&quot;",
58
58
  "'": "&apos;"
59
59
  })[e]);
60
- function re(e, t = 600, n = 200, r = 2, i = "currentColor") {
61
- let a = v(e);
60
+ function ae(e, t = 600, n = 200, r = 2, i = "currentColor") {
61
+ let a = _(e);
62
62
  return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${t} ${n}" width="${t}" height="${n}">${a.strokes.map((e) => {
63
63
  let a = e.points[0];
64
- return e.points.length === 1 ? `<circle cx="${a.x * t}" cy="${a.y * n}" r="${r * (.5 + a.pressure) / 2}" fill="${b(i)}"/>` : e.points.slice(1).map((a, o) => {
64
+ return e.points.length === 1 ? `<circle cx="${a.x * t}" cy="${a.y * n}" r="${r * (.5 + a.pressure) / 2}" fill="${y(i)}"/>` : e.points.slice(1).map((a, o) => {
65
65
  let s = e.points[o];
66
- return `<path d="M${s.x * t} ${s.y * n}L${a.x * t} ${a.y * n}" fill="none" stroke="${b(i)}" stroke-width="${r * (.5 + (s.pressure + a.pressure) / 2)}" stroke-linecap="round"/>`;
66
+ return `<path d="M${s.x * t} ${s.y * n}L${a.x * t} ${a.y * n}" fill="none" stroke="${y(i)}" stroke-width="${r * (.5 + (s.pressure + a.pressure) / 2)}" stroke-linecap="round"/>`;
67
67
  }).join("");
68
- }).join("")}${a.typedName ? `<text x="${t * .04}" y="${n * .9}" textLength="${Math.min(t * .92, a.typedName.length * n * .1)}" font-family="cursive" font-size="${Math.max(12, n / 5)}" fill="${b(i)}">${b(a.typedName)}</text>` : ""}</svg>`;
68
+ }).join("")}${a.typedName ? `<text x="${t * .04}" y="${n * .9}" textLength="${Math.min(t * .92, a.typedName.length * n * .1)}" font-family="cursive" font-size="${Math.max(12, n / 5)}" fill="${y(i)}">${y(a.typedName)}</text>` : ""}</svg>`;
69
69
  }
70
70
  //#endregion
71
71
  //#region src/components/base/signature-pad/signature-pad.tsx
72
- var x = c(function(c, _) {
73
- let { value: b, defaultValue: x = h, onValueChange: S, disabled: C = !1, readOnly: w = !1, invalid: T, name: E, form: D, required: O, allowTypedSignature: k = !0, strokeWidth: ie = 2, strings: ae, className: oe, id: se, ...ce } = c, A = Object.prototype.hasOwnProperty.call(c, "value"), [le, ue] = d(() => v(x)), de = ne(() => v(b ?? h), [b]), j = A ? de : le, M = u(j);
74
- M.current = j;
75
- let N = u([]), P = u([]), [fe, F] = d(0), I = u(null), [pe, L] = d(!1), R = u(null), z = u(null), B = u(null), V = u(null), me = ee(), H = se ?? `signature-${me}`, U = e(m, ae), he = k ? U.instructions : ae?.instructions ?? U.drawingInstructions, W = C || w, G = Number.isFinite(ie) ? Math.max(.25, ie) : 2, K = (e) => {
72
+ var b = c(function(c, g) {
73
+ let { value: y, defaultValue: b = m, onValueChange: x, disabled: S = !1, readOnly: C = !1, invalid: w, name: T, form: E, required: D, allowTypedSignature: O = !0, strokeWidth: k = 2, strings: oe, className: se, id: ce, ...le } = c, A = Object.prototype.hasOwnProperty.call(c, "value"), [ue, de] = d(() => _(b)), fe = re(() => _(y ?? m), [y]), j = A ? fe : ue, M = u(j);
74
+ ne(() => {
75
+ M.current = j;
76
+ }, [j]);
77
+ let N = u([]), P = u([]), [pe, F] = d(0), I = u(null), [me, L] = d(!1), R = u(null), z = u(null), B = u(null), V = u(null), he = ee(), H = ce ?? `signature-${he}`, U = e(ie, oe), ge = O ? U.instructions : oe?.instructions ?? U.drawingInstructions, W = S || C, G = Number.isFinite(k) ? Math.max(.25, k) : 2, K = (e) => {
76
78
  let t = R.current;
77
79
  if (!t) return;
78
80
  let n = t.getBoundingClientRect();
@@ -80,15 +82,15 @@ var x = c(function(c, _) {
80
82
  let r = window.devicePixelRatio || 1;
81
83
  t.width !== Math.round(n.width * r) && (t.width = Math.round(n.width * r)), t.height !== Math.round(n.height * r) && (t.height = Math.round(n.height * r));
82
84
  let i = t.getContext("2d");
83
- i && (i.setTransform(r, 0, 0, r, 0, 0), i.strokeStyle = i.fillStyle = getComputedStyle(t).color, y(i, v(e), n.width, n.height, G));
85
+ i && (i.setTransform(r, 0, 0, r, 0, 0), i.strokeStyle = i.fillStyle = getComputedStyle(t).color, v(i, _(e), n.width, n.height, G));
84
86
  }, q = () => {
85
87
  let e = I.current;
86
88
  I.current = null, L(!1), e && R.current?.hasPointerCapture?.(e.pointerId) && R.current.releasePointerCapture(e.pointerId), K(M.current);
87
89
  }, J = (e, t = !0) => {
88
90
  if (W) return;
89
91
  q();
90
- let n = v(e);
91
- t && (N.current.push(M.current), P.current = []), V.current = n, A || (M.current = n, ue(n)), S?.(n), F((e) => e + 1);
92
+ let n = _(e);
93
+ t && (N.current.push(M.current), P.current = []), V.current = n, A || (M.current = n, de(n)), x?.(n), F((e) => e + 1);
92
94
  }, Y = () => {
93
95
  if (W || !N.current.length) return;
94
96
  let e = N.current.pop();
@@ -97,29 +99,29 @@ var x = c(function(c, _) {
97
99
  if (W || !P.current.length) return;
98
100
  let e = P.current.pop();
99
101
  N.current.push(M.current), J(e, !1);
100
- }, Z = () => (k ? B.current : R.current)?.focus();
101
- te(_, () => ({
102
+ }, Z = () => (O ? B.current : R.current)?.focus();
103
+ te(g, () => ({
102
104
  focus: Z,
103
105
  undo: Y,
104
106
  redo: X,
105
- clear: () => J(h),
107
+ clear: () => J(m),
106
108
  serialize: (e = "png", t = {}) => {
107
- let n = v(M.current);
109
+ let n = _(M.current);
108
110
  if (e === "json") return JSON.stringify(n);
109
111
  let r = R.current?.getBoundingClientRect(), i = Number.isFinite(t.width) ? Math.max(1, t.width) : r?.width || 600, a = Number.isFinite(t.height) ? Math.max(1, t.height) : r?.height || 200, o = R.current ? getComputedStyle(R.current).color : "currentColor";
110
- if (e === "svg") return re(n, i, a, G, o);
112
+ if (e === "svg") return ae(n, i, a, G, o);
111
113
  let s = Number.isFinite(t.scale) ? Math.max(.1, Math.min(8, t.scale)) : window.devicePixelRatio || 1, c = document.createElement("canvas");
112
114
  c.width = Math.round(i * s), c.height = Math.round(a * s);
113
115
  let l = c.getContext("2d");
114
116
  if (!l) throw Error("Canvas export is unavailable in this environment. Use SVG or JSON.");
115
- return l.scale(s, s), l.strokeStyle = l.fillStyle = o, y(l, n, i, a, G), c.toDataURL("image/png");
117
+ return l.scale(s, s), l.strokeStyle = l.fillStyle = o, v(l, n, i, a, G), c.toDataURL("image/png");
116
118
  }
117
119
  })), l(() => {
118
120
  A && JSON.stringify(j) !== JSON.stringify(V.current) && (N.current = [], P.current = [], F((e) => e + 1)), V.current = j, q();
119
121
  }, [
120
122
  j,
121
- C,
122
- w
123
+ S,
124
+ C
123
125
  ]), l(() => {
124
126
  let e = R.current;
125
127
  if (!e) return;
@@ -145,21 +147,21 @@ var x = c(function(c, _) {
145
147
  }, [G]), l(() => {
146
148
  let e = z.current?.form ?? B.current?.form ?? R.current?.closest("form"), t = !0, n, r = (e) => {
147
149
  clearTimeout(n), n = setTimeout(() => {
148
- n = void 0, t && !e.defaultPrevented && !W && (N.current = [], P.current = [], J(x, !1));
150
+ n = void 0, t && !e.defaultPrevented && !W && (N.current = [], P.current = [], J(b, !1));
149
151
  }, 0);
150
152
  };
151
153
  return e?.addEventListener("reset", r), () => {
152
154
  t = !1, clearTimeout(n), e?.removeEventListener("reset", r);
153
155
  };
154
156
  }, [
155
- x,
157
+ b,
156
158
  A,
157
159
  W,
158
- S,
159
- D,
160
+ x,
160
161
  E,
161
- O,
162
- k
162
+ T,
163
+ D,
164
+ O
163
165
  ]);
164
166
  let Q = (e, t = e) => {
165
167
  let n = e.currentTarget.getBoundingClientRect();
@@ -168,7 +170,7 @@ var x = c(function(c, _) {
168
170
  y: Math.max(0, Math.min(1, (t.clientY - n.top) / (n.height || 1))),
169
171
  pressure: e.pointerType === "pen" && t.pressure || .5
170
172
  };
171
- }, ge = (e) => {
173
+ }, _e = (e) => {
172
174
  let t = I.current;
173
175
  if (!t || t.pointerId !== e.pointerId) return;
174
176
  let n = Q(e), r = t.points[t.points.length - 1];
@@ -176,36 +178,36 @@ var x = c(function(c, _) {
176
178
  ...t.initial,
177
179
  strokes: [...t.initial.strokes, { points: t.points }]
178
180
  });
179
- }, $ = g(j);
181
+ }, $ = h(j);
180
182
  return /* @__PURE__ */ p(i, {
181
- ...ce,
183
+ ...le,
182
184
  id: H,
183
185
  role: "group",
184
- "aria-label": ce["aria-label"] ?? U.label,
186
+ "aria-label": le["aria-label"] ?? U.label,
185
187
  gap: "sm",
186
- className: t("signature-pad--component min-w-0", oe),
187
- "data-history-version": fe,
188
- "data-disabled": C || void 0,
189
- "data-readonly": w || void 0,
188
+ className: t("signature-pad--component min-w-0", se),
189
+ "data-history-version": pe,
190
+ "data-disabled": S || void 0,
191
+ "data-readonly": C || void 0,
190
192
  children: [
191
- /* @__PURE__ */ f(r, {
193
+ /* @__PURE__ */ f(n, {
192
194
  id: `${H}-instructions`,
193
195
  size: "xs",
194
196
  type: "secondary",
195
- children: he
197
+ children: ge
196
198
  }),
197
199
  /* @__PURE__ */ p("div", {
198
- className: t("signature-pad--area relative overflow-hidden rounded-radius border border-input bg-background text-foreground", a.invalid, C && "cursor-not-allowed opacity-50"),
199
- "aria-invalid": T || void 0,
200
+ className: t("signature-pad--area relative overflow-hidden rounded-inner border border-input bg-background text-foreground", a.invalid, S && "cursor-not-allowed opacity-50"),
201
+ "aria-invalid": w || void 0,
200
202
  children: [/* @__PURE__ */ f("canvas", {
201
203
  ref: R,
202
204
  className: t("signature-pad--canvas block w-full aspect-[3/1] min-h-40 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset", !W && "touch-none cursor-crosshair"),
203
- tabIndex: C ? -1 : 0,
205
+ tabIndex: S ? -1 : 0,
204
206
  role: "img",
205
207
  "aria-label": U.label,
206
208
  "aria-describedby": `${H}-instructions ${H}-status`,
207
- "aria-disabled": C || void 0,
208
- "aria-invalid": T || void 0,
209
+ "aria-disabled": S || void 0,
210
+ "aria-invalid": w || void 0,
209
211
  onPointerDown: (e) => {
210
212
  W || I.current || e.button !== 0 || (e.preventDefault(), e.currentTarget.focus(), e.currentTarget.setPointerCapture?.(e.pointerId), I.current = {
211
213
  pointerId: e.pointerId,
@@ -226,7 +228,7 @@ var x = c(function(c, _) {
226
228
  strokes: [...t.initial.strokes, { points: t.points }]
227
229
  });
228
230
  },
229
- onPointerUp: ge,
231
+ onPointerUp: _e,
230
232
  onPointerCancel: (e) => {
231
233
  I.current?.pointerId === e.pointerId && q();
232
234
  },
@@ -239,26 +241,26 @@ var x = c(function(c, _) {
239
241
  onKeyDown: (e) => {
240
242
  e.key === "Escape" && q(), !W && ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "z" && (e.preventDefault(), e.shiftKey ? X() : Y()), (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "y" && (e.preventDefault(), X()));
241
243
  },
242
- children: he
243
- }), $ && !pe && /* @__PURE__ */ f("div", {
244
+ children: ge
245
+ }), $ && !me && /* @__PURE__ */ f("div", {
244
246
  "aria-hidden": "true",
245
247
  className: "signature-pad--placeholder pointer-events-none absolute inset-0 flex items-center justify-center",
246
- children: /* @__PURE__ */ f(r, {
248
+ children: /* @__PURE__ */ f(n, {
247
249
  type: "secondary",
248
250
  children: U.placeholder
249
251
  })
250
252
  })]
251
253
  }),
252
- k && /* @__PURE__ */ f(s, {
254
+ O && /* @__PURE__ */ f(s, {
253
255
  label: U.typedName,
254
256
  htmlFor: `${H}-typed`,
255
257
  children: /* @__PURE__ */ f(o, {
256
258
  ref: B,
257
259
  id: `${H}-typed`,
258
260
  value: j.typedName ?? "",
259
- disabled: C,
260
- readOnly: w,
261
- invalid: T,
261
+ disabled: S,
262
+ readOnly: C,
263
+ invalid: w,
262
264
  onChange: (e) => J({
263
265
  ...M.current,
264
266
  typedName: e.target.value
@@ -270,7 +272,7 @@ var x = c(function(c, _) {
270
272
  gap: "xs",
271
273
  wrap: !0,
272
274
  children: [
273
- /* @__PURE__ */ f(n, {
275
+ /* @__PURE__ */ f(r, {
274
276
  type: "button",
275
277
  buttonStyle: "outline",
276
278
  disabled: W || !N.current.length,
@@ -279,7 +281,7 @@ var x = c(function(c, _) {
279
281
  },
280
282
  children: U.undo
281
283
  }),
282
- /* @__PURE__ */ f(n, {
284
+ /* @__PURE__ */ f(r, {
283
285
  type: "button",
284
286
  buttonStyle: "outline",
285
287
  disabled: W || !P.current.length,
@@ -288,35 +290,35 @@ var x = c(function(c, _) {
288
290
  },
289
291
  children: U.redo
290
292
  }),
291
- /* @__PURE__ */ f(n, {
293
+ /* @__PURE__ */ f(r, {
292
294
  type: "button",
293
295
  buttonStyle: "outline",
294
296
  disabled: W || $,
295
297
  onClick: () => {
296
- J(h), Z();
298
+ J(m), Z();
297
299
  },
298
300
  children: U.clear
299
301
  })
300
302
  ]
301
303
  }),
302
- /* @__PURE__ */ f(r, {
304
+ /* @__PURE__ */ f(n, {
303
305
  id: `${H}-status`,
304
306
  role: "status",
305
307
  size: "xs",
306
308
  type: "secondary",
307
309
  children: $ ? U.empty : U.signed
308
310
  }),
309
- (E || O) && /* @__PURE__ */ f("input", {
311
+ (T || D) && /* @__PURE__ */ f("input", {
310
312
  ref: z,
311
313
  className: "sr-only",
312
314
  type: "text",
313
315
  tabIndex: -1,
314
316
  "aria-hidden": "true",
315
- name: E,
316
- form: D,
317
- disabled: C,
318
- readOnly: w,
319
- required: O,
317
+ name: T,
318
+ form: E,
319
+ disabled: S,
320
+ readOnly: C,
321
+ required: D,
320
322
  value: $ ? "" : JSON.stringify(j),
321
323
  onChange: () => {},
322
324
  onFocus: Z,
@@ -324,8 +326,8 @@ var x = c(function(c, _) {
324
326
  })
325
327
  ]
326
328
  });
327
- }), S = c(function({ value: e, strokeWidth: n = 2, className: r, ...i }, a) {
328
- let o = v(e);
329
+ }), x = c(function({ value: e, strokeWidth: n = 2, className: r, ...i }, a) {
330
+ let o = _(e);
329
331
  return /* @__PURE__ */ p("svg", {
330
332
  ref: a,
331
333
  role: "img",
@@ -359,6 +361,6 @@ var x = c(function(c, _) {
359
361
  });
360
362
  });
361
363
  //#endregion
362
- export { x as SignaturePad, S as SignaturePadPreview, m as defaultSignaturePadStrings, g as isSignatureEmpty, re as signaturePadToSVG };
364
+ export { b as SignaturePad, x as SignaturePadPreview, ie as defaultSignaturePadStrings, h as isSignatureEmpty, ae as signaturePadToSVG };
363
365
 
364
366
  //# sourceMappingURL=signature-pad.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signature-pad.js","names":["Text","Stack","fieldStateRecipes","Input","FormField","defaultSignaturePadStrings","emptySignature","isSignatureEmpty","value","stroke","clamp","normalizeSignature","point","drawSignature","context","width","height","first","strokeWidth","i","a","b","escapeXml","text","character","signaturePadToSVG","signature","ink","index","SignaturePad","forwardRef","controlledValue","stringsProp","rootProps","props","controlled","internalValue","setInternalValue","useState","defaultValue","normalizedControlledValue","useMemo","valueRef","useRef","undoHistory","redoHistory","historyVersion","setHistoryVersion","live","drawing","setDrawing","canvasRef","fieldRef","typedRef","lastPublished","generatedId","useId","rootId","id","strings","useStrings","instructions","allowTypedSignature","locked","disabled","readOnly","inkWidth","paint","canvas","bounds","scale","cancelStroke","publish","normalized","next","history","onValueChange","version","undo","previous","redo","focus","useImperativeHandle","ref","snapshot","format","options","useEffect","redraw","resize","theme","ancestor","owner","active","resetTimer","reset","event","form","name","required","pointFrom","sample","finish","endpoint","last","empty","cn","className","invalid","samples","Button","SignaturePadPreview","pointIndex"],"sources":["../../src/components/base/signature-pad/signature-pad.types.ts","../../src/components/base/signature-pad/signature-pad.utils.ts","../../src/components/base/signature-pad/signature-pad.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\n/** Coordinates are fractions of the drawing area, so signatures survive resize. */\nexport interface SignaturePadPoint { x: number; y: number; pressure: number }\nexport interface SignaturePadStroke { points: readonly SignaturePadPoint[] }\nexport interface SignaturePadValue {\n\tstrokes: readonly SignaturePadStroke[];\n\t/** Accessible alternative to drawing; included in exports and native form data. */\n\ttypedName?: string;\n}\nexport type SignaturePadFormat = 'png' | 'svg' | 'json';\nexport interface SignaturePadExportOptions { width?: number; height?: number; scale?: number }\nexport interface SignaturePadHandle {\n\tfocus: () => void;\n\tclear: () => void;\n\tundo: () => void;\n\tredo: () => void;\n\t/** PNG is a data URL, SVG is markup, JSON is the structured value. */\n\tserialize: (format?: SignaturePadFormat, options?: SignaturePadExportOptions) => string;\n}\nexport interface SignaturePadStrings {\n\tlabel: string; instructions: string; drawingInstructions: string; placeholder: string; typedName: string;\n\tundo: string; redo: string; clear: string; empty: string; signed: string;\n}\nexport const defaultSignaturePadStrings: SignaturePadStrings = {\n\tlabel: 'Signature', instructions: 'Draw with a pointer or type your name below. Escape cancels a stroke; Control or Command Z undoes it.',\n\tdrawingInstructions: 'Draw with a pointer. Escape cancels a stroke; Control or Command Z undoes it.',\n\tplaceholder: 'Sign here', typedName: 'Or type your full name',\n\tundo: 'Undo', redo: 'Redo', clear: 'Clear signature', empty: 'Signature is empty', signed: 'Signature entered',\n};\nexport interface SignaturePadProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'defaultValue' | 'onChange'> {\n\t/** Controlled structured signature. */\n\tvalue?: SignaturePadValue;\n\t/** Initial structured signature for uncontrolled use. */\n\tdefaultValue?: SignaturePadValue;\n\tonValueChange?: (value: SignaturePadValue) => void;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tinvalid?: boolean;\n\t/** Native field serializes JSON; an empty signature fails required validation. */\n\tname?: string;\n\tform?: string;\n\trequired?: boolean;\n\t/** Shows the keyboard-accessible typed signature alternative. @default true */\n\tallowTypedSignature?: boolean;\n\t/** Ink diameter in CSS drawing pixels; pen pressure varies it. @default 2 */\n\tstrokeWidth?: number;\n\tstrings?: StringsProp<SignaturePadStrings>;\n}\nexport interface SignaturePadPreviewProps extends ComponentPropsWithoutRef<'svg'> {\n\tvalue: SignaturePadValue;\n\tstrokeWidth?: number;\n}\n","import type { SignaturePadValue } from './signature-pad.types';\n\nexport const emptySignature: SignaturePadValue = { strokes: [] };\nexport function isSignatureEmpty(value: SignaturePadValue): boolean {\n\treturn !value.typedName?.trim() && !value.strokes.some((stroke) => stroke.points.length > 0);\n}\nconst clamp = (value: number) => Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\nexport function normalizeSignature(value: SignaturePadValue): SignaturePadValue {\n\treturn {\n\t\tstrokes: value.strokes.filter((stroke) => stroke.points.length > 0).map((stroke) => ({\n\t\t\tpoints: stroke.points.map((point) => ({ x: clamp(point.x), y: clamp(point.y), pressure: clamp(point.pressure) })),\n\t\t})),\n\t\t...(value.typedName !== undefined ? { typedName: value.typedName } : {}),\n\t};\n}\n\n/** Drawing geometry, separate from structural UI spacing and theme tokens. */\nexport function drawSignature(context: CanvasRenderingContext2D, value: SignaturePadValue, width: number, height: number, strokeWidth: number) {\n\tcontext.clearRect(0, 0, width, height);\n\tcontext.lineCap = 'round';\n\tcontext.lineJoin = 'round';\n\tfor (const stroke of value.strokes) {\n\t\tconst first = stroke.points[0];\n\t\tif (!first) continue;\n\t\tif (stroke.points.length === 1) {\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc(first.x * width, first.y * height, strokeWidth * (0.5 + first.pressure) / 2, 0, Math.PI * 2);\n\t\t\tcontext.fill();\n\t\t}\n\t\tfor (let i = 1; i < stroke.points.length; i++) {\n\t\t\tconst a = stroke.points[i - 1]; const b = stroke.points[i];\n\t\t\tcontext.lineWidth = strokeWidth * (0.5 + (a.pressure + b.pressure) / 2);\n\t\t\tcontext.beginPath(); context.moveTo(a.x * width, a.y * height); context.lineTo(b.x * width, b.y * height); context.stroke();\n\t\t}\n\t}\n\tif (value.typedName) {\n\t\tcontext.font = `${Math.max(12, height / 5)}px cursive`;\n\t\tcontext.textBaseline = 'bottom';\n\t\tcontext.fillText(value.typedName, width * 0.04, height * 0.9, width * 0.92);\n\t}\n}\n\nconst escapeXml = (text: string) => text.replace(/[&<>\"']/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&apos;' })[character]!);\n/** Semantic currentColor is preserved unless a resolved export ink is supplied. */\nexport function signaturePadToSVG(value: SignaturePadValue, width = 600, height = 200, strokeWidth = 2, ink = 'currentColor'): string {\n\tconst signature = normalizeSignature(value);\n\tconst shapes = signature.strokes.map((stroke) => {\n\t\tconst first = stroke.points[0];\n\t\tif (stroke.points.length === 1) return `<circle cx=\"${first.x * width}\" cy=\"${first.y * height}\" r=\"${strokeWidth * (0.5 + first.pressure) / 2}\" fill=\"${escapeXml(ink)}\"/>`;\n\t\treturn stroke.points.slice(1).map((point, index) => {\n\t\t\tconst a = stroke.points[index];\n\t\t\treturn `<path d=\"M${a.x * width} ${a.y * height}L${point.x * width} ${point.y * height}\" fill=\"none\" stroke=\"${escapeXml(ink)}\" stroke-width=\"${strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)}\" stroke-linecap=\"round\"/>`;\n\t\t}).join('');\n\t}).join('');\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${shapes}${signature.typedName ? `<text x=\"${width * 0.04}\" y=\"${height * 0.9}\" textLength=\"${Math.min(width * 0.92, signature.typedName.length * height * 0.1)}\" font-family=\"cursive\" font-size=\"${Math.max(12, height / 5)}\" fill=\"${escapeXml(ink)}\">${escapeXml(signature.typedName)}</text>` : ''}</svg>`;\n}\n","import { forwardRef, useEffect, useId, useImperativeHandle, useMemo, useRef, useState, type PointerEvent } from 'react';\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Input } from '../text-inputs';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useStrings } from '../../../lib/strings';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { defaultSignaturePadStrings, type SignaturePadHandle, type SignaturePadPoint, type SignaturePadProps, type SignaturePadPreviewProps, type SignaturePadValue } from './signature-pad.types';\nimport { drawSignature, emptySignature, isSignatureEmpty, normalizeSignature, signaturePadToSVG } from './signature-pad.utils';\n\nexport const SignaturePad = forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(props, ref) {\n\tconst { value: controlledValue, defaultValue = emptySignature, onValueChange, disabled = false, readOnly = false, invalid,\n\t\tname, form, required, allowTypedSignature = true, strokeWidth = 2, strings: stringsProp, className, id, ...rootProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst [internalValue, setInternalValue] = useState(() => normalizeSignature(defaultValue));\n\tconst normalizedControlledValue = useMemo(() => normalizeSignature(controlledValue ?? emptySignature), [controlledValue]);\n\tconst value = controlled ? normalizedControlledValue : internalValue;\n\tconst valueRef = useRef(value); valueRef.current = value;\n\tconst undoHistory = useRef<SignaturePadValue[]>([]);\n\tconst redoHistory = useRef<SignaturePadValue[]>([]);\n\tconst [historyVersion, setHistoryVersion] = useState(0);\n\tconst live = useRef<{ pointerId: number; points: SignaturePadPoint[]; initial: SignaturePadValue } | null>(null);\n\tconst [drawing, setDrawing] = useState(false);\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fieldRef = useRef<HTMLInputElement>(null);\n\tconst typedRef = useRef<HTMLInputElement>(null);\n\tconst lastPublished = useRef<SignaturePadValue | null>(null);\n\tconst generatedId = useId();\n\tconst rootId = id ?? `signature-${generatedId}`;\n\tconst strings = useStrings(defaultSignaturePadStrings, stringsProp);\n\tconst instructions = allowTypedSignature ? strings.instructions : stringsProp?.instructions ?? strings.drawingInstructions;\n\tconst locked = disabled || readOnly;\n\tconst inkWidth = Number.isFinite(strokeWidth) ? Math.max(0.25, strokeWidth) : 2;\n\n\tconst paint = (signature: SignaturePadValue) => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tif (!bounds.width || !bounds.height) return;\n\t\tconst scale = window.devicePixelRatio || 1;\n\t\tif (canvas.width !== Math.round(bounds.width * scale)) canvas.width = Math.round(bounds.width * scale);\n\t\tif (canvas.height !== Math.round(bounds.height * scale)) canvas.height = Math.round(bounds.height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) return;\n\t\tcontext.setTransform(scale, 0, 0, scale, 0, 0);\n\t\tcontext.strokeStyle = context.fillStyle = getComputedStyle(canvas).color;\n\t\tdrawSignature(context, normalizeSignature(signature), bounds.width, bounds.height, inkWidth);\n\t};\n\tconst cancelStroke = () => {\n\t\tconst stroke = live.current;\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (stroke && canvasRef.current?.hasPointerCapture?.(stroke.pointerId)) canvasRef.current.releasePointerCapture(stroke.pointerId);\n\t\tpaint(valueRef.current);\n\t};\n\tconst publish = (next: SignaturePadValue, history = true) => {\n\t\tif (locked) return;\n\t\tcancelStroke();\n\t\tconst normalized = normalizeSignature(next);\n\t\tif (history) { undoHistory.current.push(valueRef.current); redoHistory.current = []; }\n\t\tlastPublished.current = normalized;\n\t\tif (!controlled) { valueRef.current = normalized; setInternalValue(normalized); }\n\t\tonValueChange?.(normalized);\n\t\tsetHistoryVersion((version) => version + 1);\n\t};\n\tconst undo = () => {\n\t\tif (locked || !undoHistory.current.length) return;\n\t\tconst previous = undoHistory.current.pop()!;\n\t\tredoHistory.current.push(valueRef.current); publish(previous, false);\n\t};\n\tconst redo = () => {\n\t\tif (locked || !redoHistory.current.length) return;\n\t\tconst next = redoHistory.current.pop()!;\n\t\tundoHistory.current.push(valueRef.current); publish(next, false);\n\t};\n\tconst focus = () => (allowTypedSignature ? typedRef.current : canvasRef.current)?.focus();\n\tuseImperativeHandle(ref, () => ({ focus, undo, redo, clear: () => publish(emptySignature), serialize: (format = 'png', options = {}) => {\n\t\tconst snapshot = normalizeSignature(valueRef.current);\n\t\tif (format === 'json') return JSON.stringify(snapshot);\n\t\tconst bounds = canvasRef.current?.getBoundingClientRect();\n\t\tconst width = Number.isFinite(options.width) ? Math.max(1, options.width!) : bounds?.width || 600;\n\t\tconst height = Number.isFinite(options.height) ? Math.max(1, options.height!) : bounds?.height || 200;\n\t\tconst ink = canvasRef.current ? getComputedStyle(canvasRef.current).color : 'currentColor';\n\t\tif (format === 'svg') return signaturePadToSVG(snapshot, width, height, inkWidth, ink);\n\t\tconst scale = Number.isFinite(options.scale) ? Math.max(0.1, Math.min(8, options.scale!)) : window.devicePixelRatio || 1;\n\t\tconst canvas = document.createElement('canvas'); canvas.width = Math.round(width * scale); canvas.height = Math.round(height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) throw new Error('Canvas export is unavailable in this environment. Use SVG or JSON.');\n\t\tcontext.scale(scale, scale); context.strokeStyle = context.fillStyle = ink;\n\t\tdrawSignature(context, snapshot, width, height, inkWidth);\n\t\treturn canvas.toDataURL('image/png');\n\t} }));\n\n\tuseEffect(() => {\n\t\t// External replacement invalidates history; an acknowledged controlled edit retains it.\n\t\tif (controlled && JSON.stringify(value) !== JSON.stringify(lastPublished.current)) { undoHistory.current = []; redoHistory.current = []; setHistoryVersion((version) => version + 1); }\n\t\tlastPublished.current = value;\n\t\tcancelStroke();\n\t}, [value, disabled, readOnly]);\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst redraw = () => paint(live.current ? { ...live.current.initial, strokes: [...live.current.initial.strokes, { points: live.current.points }] } : valueRef.current);\n\t\tredraw();\n\t\tconst resize = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(redraw) : undefined;\n\t\tresize?.observe(canvas);\n\t\t// Theme scopes can change without resizing the drawing area.\n\t\tconst theme = new MutationObserver(redraw);\n\t\tfor (let ancestor: HTMLElement | null = canvas; ancestor; ancestor = ancestor.parentElement) theme.observe(ancestor, { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] });\n\t\twindow.addEventListener('resize', redraw);\n\t\treturn () => { resize?.disconnect(); theme.disconnect(); window.removeEventListener('resize', redraw); };\n\t}, [inkWidth]);\n\tuseEffect(() => {\n\t\tconst owner = fieldRef.current?.form ?? typedRef.current?.form ?? canvasRef.current?.closest('form');\n\t\tlet active = true;\n\t\tlet resetTimer: ReturnType<typeof setTimeout> | undefined;\n\t\t// Trusted events can run microtasks between listeners. Wait for propagation and the native default action.\n\t\tconst reset = (event: Event) => {\n\t\t\tclearTimeout(resetTimer);\n\t\t\tresetTimer = setTimeout(() => { resetTimer = undefined; if (active && !event.defaultPrevented && !locked) { undoHistory.current = []; redoHistory.current = []; publish(defaultValue, false); } }, 0);\n\t\t};\n\t\towner?.addEventListener('reset', reset);\n\t\treturn () => { active = false; clearTimeout(resetTimer); owner?.removeEventListener('reset', reset); };\n\t}, [defaultValue, controlled, locked, onValueChange, form, name, required, allowTypedSignature]);\n\tconst pointFrom = (event: PointerEvent<HTMLCanvasElement>, sample: Pick<globalThis.PointerEvent, 'clientX' | 'clientY' | 'pressure'> = event): SignaturePadPoint => {\n\t\tconst bounds = event.currentTarget.getBoundingClientRect();\n\t\treturn { x: Math.max(0, Math.min(1, (sample.clientX - bounds.left) / (bounds.width || 1))), y: Math.max(0, Math.min(1, (sample.clientY - bounds.top) / (bounds.height || 1))), pressure: event.pointerType === 'pen' ? sample.pressure || 0.5 : 0.5 };\n\t};\n\tconst finish = (event: PointerEvent<HTMLCanvasElement>) => {\n\t\tconst stroke = live.current;\n\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t// A lift can arrive beyond the last move; keep that endpoint without duplicating a resting tap.\n\t\tconst endpoint = pointFrom(event);\n\t\tconst last = stroke.points[stroke.points.length - 1];\n\t\tif (last.x !== endpoint.x || last.y !== endpoint.y) stroke.points.push(endpoint);\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (valueRef.current === stroke.initial) publish({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t};\n\tconst empty = isSignatureEmpty(value);\n\treturn <Stack {...rootProps} id={rootId} role=\"group\" aria-label={rootProps['aria-label'] ?? strings.label} gap=\"sm\" className={cn('signature-pad--component min-w-0', className)} data-history-version={historyVersion} data-disabled={disabled || undefined} data-readonly={readOnly || undefined}>\n\t\t<Text id={`${rootId}-instructions`} size=\"xs\" type=\"secondary\">{instructions}</Text>\n\t\t<div className={cn('signature-pad--area relative overflow-hidden rounded-radius border border-input bg-background text-foreground', fieldStateRecipes.invalid, disabled && 'cursor-not-allowed opacity-50')} aria-invalid={invalid || undefined}>\n\t\t\t<canvas ref={canvasRef} className={cn('signature-pad--canvas block w-full aspect-[3/1] min-h-40 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset', !locked && 'touch-none cursor-crosshair')}\n\t\t\t\ttabIndex={disabled ? -1 : 0} role=\"img\" aria-label={strings.label} aria-describedby={`${rootId}-instructions ${rootId}-status`} aria-disabled={disabled || undefined} aria-invalid={invalid || undefined}\n\t\t\t\tonPointerDown={(event) => { if (locked || live.current || event.button !== 0) return; event.preventDefault(); event.currentTarget.focus(); event.currentTarget.setPointerCapture?.(event.pointerId); live.current = { pointerId: event.pointerId, points: [pointFrom(event)], initial: valueRef.current }; setDrawing(true); paint({ ...valueRef.current, strokes: [...valueRef.current.strokes, { points: live.current.points }] }); }}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tconst stroke = live.current;\n\t\t\t\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t\t\t\tconst samples = event.nativeEvent.getCoalescedEvents?.().filter((sample) => sample.pointerId === stroke.pointerId) ?? [];\n\t\t\t\t\tfor (const sample of samples.length ? samples : [event.nativeEvent]) stroke.points.push(pointFrom(event, sample));\n\t\t\t\t\tpaint({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t\t\t\t}}\n\t\t\t\tonPointerUp={finish} onPointerCancel={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }} onLostPointerCapture={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }}\n\t\t\t\tonContextMenu={(event) => { if (live.current) event.preventDefault(); }}\n\t\t\t\tonKeyDown={(event) => { if (event.key === 'Escape') cancelStroke(); if (locked) return; if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') { event.preventDefault(); event.shiftKey ? redo() : undo(); } if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') { event.preventDefault(); redo(); } }}>\n\t\t\t\t{instructions}\n\t\t\t</canvas>\n\t\t\t{empty && !drawing && <div aria-hidden=\"true\" className=\"signature-pad--placeholder pointer-events-none absolute inset-0 flex items-center justify-center\"><Text type=\"secondary\">{strings.placeholder}</Text></div>}\n\t\t</div>\n\t\t{allowTypedSignature && <FormField label={strings.typedName} htmlFor={`${rootId}-typed`}><Input ref={typedRef} id={`${rootId}-typed`} value={value.typedName ?? ''} disabled={disabled} readOnly={readOnly} invalid={invalid} onChange={(event) => publish({ ...valueRef.current, typedName: event.target.value })} /></FormField>}\n\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !undoHistory.current.length} onClick={() => { undo(); focus(); }}>{strings.undo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !redoHistory.current.length} onClick={() => { redo(); focus(); }}>{strings.redo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || empty} onClick={() => { publish(emptySignature); focus(); }}>{strings.clear}</Button>\n\t\t</Stack>\n\t\t<Text id={`${rootId}-status`} role=\"status\" size=\"xs\" type=\"secondary\">{empty ? strings.empty : strings.signed}</Text>\n\t\t{(name || required) && <input ref={fieldRef} className=\"sr-only\" type=\"text\" tabIndex={-1} aria-hidden=\"true\" name={name} form={form} disabled={disabled} readOnly={readOnly} required={required} value={empty ? '' : JSON.stringify(value)} onChange={() => {}} onFocus={focus} onInvalid={focus} />}\n\t</Stack>;\n});\n\n/** Server-renderable preview; normalized geometry follows the semantic foreground. */\nexport const SignaturePadPreview = forwardRef<SVGSVGElement, SignaturePadPreviewProps>(function SignaturePadPreview({ value, strokeWidth = 2, className, ...props }, ref) {\n\tconst normalized = normalizeSignature(value);\n\treturn <svg ref={ref} role=\"img\" viewBox=\"0 0 600 200\" aria-label=\"Signature\" {...props} className={cn('signature-pad-preview--component w-full h-auto text-foreground', className)}>\n\t\t{normalized.strokes.map((stroke, index) => stroke.points.length === 1 ? <circle key={index} cx={stroke.points[0].x * 600} cy={stroke.points[0].y * 200} r={strokeWidth * (0.5 + stroke.points[0].pressure) / 2} fill=\"currentColor\" /> : <g key={index}>{stroke.points.slice(1).map((point, pointIndex) => { const a = stroke.points[pointIndex]; return <path key={pointIndex} d={`M${a.x * 600} ${a.y * 200}L${point.x * 600} ${point.y * 200}`} fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)} strokeLinecap=\"round\" />; })}</g>)}\n\t\t{normalized.typedName && <text x=\"24\" y=\"180\" fill=\"currentColor\" fontFamily=\"cursive\" fontSize=\"40\" textLength={Math.min(552, normalized.typedName.length * 20)}>{normalized.typedName}</text>}\n\t</svg>;\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"signature-pad.js","names":["Text","Button","Stack","fieldStateRecipes","Input","FormField","defaultSignaturePadStrings","emptySignature","isSignatureEmpty","value","stroke","clamp","normalizeSignature","point","drawSignature","context","width","height","first","strokeWidth","i","a","b","escapeXml","text","character","signaturePadToSVG","signature","ink","index","SignaturePad","forwardRef","controlledValue","stringsProp","rootProps","props","controlled","internalValue","setInternalValue","useState","defaultValue","normalizedControlledValue","useMemo","valueRef","useRef","undoHistory","redoHistory","historyVersion","setHistoryVersion","live","drawing","setDrawing","canvasRef","fieldRef","typedRef","lastPublished","generatedId","useId","rootId","id","strings","useStrings","instructions","allowTypedSignature","locked","disabled","readOnly","inkWidth","paint","canvas","bounds","scale","cancelStroke","publish","normalized","next","history","onValueChange","version","undo","previous","redo","focus","useImperativeHandle","ref","snapshot","format","options","useEffect","redraw","resize","theme","ancestor","owner","active","resetTimer","reset","event","form","name","required","pointFrom","sample","finish","endpoint","last","empty","cn","className","invalid","samples","SignaturePadPreview","pointIndex"],"sources":["../../src/components/base/signature-pad/signature-pad.types.ts","../../src/components/base/signature-pad/signature-pad.utils.ts","../../src/components/base/signature-pad/signature-pad.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\n/** Coordinates are fractions of the drawing area, so signatures survive resize. */\nexport interface SignaturePadPoint { x: number; y: number; pressure: number }\nexport interface SignaturePadStroke { points: readonly SignaturePadPoint[] }\nexport interface SignaturePadValue {\n\tstrokes: readonly SignaturePadStroke[];\n\t/** Accessible alternative to drawing; included in exports and native form data. */\n\ttypedName?: string;\n}\nexport type SignaturePadFormat = 'png' | 'svg' | 'json';\nexport interface SignaturePadExportOptions { width?: number; height?: number; scale?: number }\nexport interface SignaturePadHandle {\n\tfocus: () => void;\n\tclear: () => void;\n\tundo: () => void;\n\tredo: () => void;\n\t/** PNG is a data URL, SVG is markup, JSON is the structured value. */\n\tserialize: (format?: SignaturePadFormat, options?: SignaturePadExportOptions) => string;\n}\nexport interface SignaturePadStrings {\n\tlabel: string; instructions: string; drawingInstructions: string; placeholder: string; typedName: string;\n\tundo: string; redo: string; clear: string; empty: string; signed: string;\n}\nexport const defaultSignaturePadStrings: SignaturePadStrings = {\n\tlabel: 'Signature', instructions: 'Draw with a pointer or type your name below. Escape cancels a stroke; Control or Command Z undoes it.',\n\tdrawingInstructions: 'Draw with a pointer. Escape cancels a stroke; Control or Command Z undoes it.',\n\tplaceholder: 'Sign here', typedName: 'Or type your full name',\n\tundo: 'Undo', redo: 'Redo', clear: 'Clear signature', empty: 'Signature is empty', signed: 'Signature entered',\n};\nexport interface SignaturePadProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'defaultValue' | 'onChange'> {\n\t/** Controlled structured signature. */\n\tvalue?: SignaturePadValue;\n\t/** Initial structured signature for uncontrolled use. */\n\tdefaultValue?: SignaturePadValue;\n\tonValueChange?: (value: SignaturePadValue) => void;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tinvalid?: boolean;\n\t/** Native field serializes JSON; an empty signature fails required validation. */\n\tname?: string;\n\tform?: string;\n\trequired?: boolean;\n\t/** Shows the keyboard-accessible typed signature alternative. @default true */\n\tallowTypedSignature?: boolean;\n\t/** Ink diameter in CSS drawing pixels; pen pressure varies it. @default 2 */\n\tstrokeWidth?: number;\n\tstrings?: StringsProp<SignaturePadStrings>;\n}\nexport interface SignaturePadPreviewProps extends ComponentPropsWithoutRef<'svg'> {\n\tvalue: SignaturePadValue;\n\tstrokeWidth?: number;\n}\n","import type { SignaturePadValue } from './signature-pad.types';\n\nexport const emptySignature: SignaturePadValue = { strokes: [] };\nexport function isSignatureEmpty(value: SignaturePadValue): boolean {\n\treturn !value.typedName?.trim() && !value.strokes.some((stroke) => stroke.points.length > 0);\n}\nconst clamp = (value: number) => Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\nexport function normalizeSignature(value: SignaturePadValue): SignaturePadValue {\n\treturn {\n\t\tstrokes: value.strokes.filter((stroke) => stroke.points.length > 0).map((stroke) => ({\n\t\t\tpoints: stroke.points.map((point) => ({ x: clamp(point.x), y: clamp(point.y), pressure: clamp(point.pressure) })),\n\t\t})),\n\t\t...(value.typedName !== undefined ? { typedName: value.typedName } : {}),\n\t};\n}\n\n/** Drawing geometry, separate from structural UI spacing and theme tokens. */\nexport function drawSignature(context: CanvasRenderingContext2D, value: SignaturePadValue, width: number, height: number, strokeWidth: number) {\n\tcontext.clearRect(0, 0, width, height);\n\tcontext.lineCap = 'round';\n\tcontext.lineJoin = 'round';\n\tfor (const stroke of value.strokes) {\n\t\tconst first = stroke.points[0];\n\t\tif (!first) continue;\n\t\tif (stroke.points.length === 1) {\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc(first.x * width, first.y * height, strokeWidth * (0.5 + first.pressure) / 2, 0, Math.PI * 2);\n\t\t\tcontext.fill();\n\t\t}\n\t\tfor (let i = 1; i < stroke.points.length; i++) {\n\t\t\tconst a = stroke.points[i - 1]; const b = stroke.points[i];\n\t\t\tcontext.lineWidth = strokeWidth * (0.5 + (a.pressure + b.pressure) / 2);\n\t\t\tcontext.beginPath(); context.moveTo(a.x * width, a.y * height); context.lineTo(b.x * width, b.y * height); context.stroke();\n\t\t}\n\t}\n\tif (value.typedName) {\n\t\tcontext.font = `${Math.max(12, height / 5)}px cursive`;\n\t\tcontext.textBaseline = 'bottom';\n\t\tcontext.fillText(value.typedName, width * 0.04, height * 0.9, width * 0.92);\n\t}\n}\n\nconst escapeXml = (text: string) => text.replace(/[&<>\"']/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&apos;' })[character]!);\n/** Semantic currentColor is preserved unless a resolved export ink is supplied. */\nexport function signaturePadToSVG(value: SignaturePadValue, width = 600, height = 200, strokeWidth = 2, ink = 'currentColor'): string {\n\tconst signature = normalizeSignature(value);\n\tconst shapes = signature.strokes.map((stroke) => {\n\t\tconst first = stroke.points[0];\n\t\tif (stroke.points.length === 1) return `<circle cx=\"${first.x * width}\" cy=\"${first.y * height}\" r=\"${strokeWidth * (0.5 + first.pressure) / 2}\" fill=\"${escapeXml(ink)}\"/>`;\n\t\treturn stroke.points.slice(1).map((point, index) => {\n\t\t\tconst a = stroke.points[index];\n\t\t\treturn `<path d=\"M${a.x * width} ${a.y * height}L${point.x * width} ${point.y * height}\" fill=\"none\" stroke=\"${escapeXml(ink)}\" stroke-width=\"${strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)}\" stroke-linecap=\"round\"/>`;\n\t\t}).join('');\n\t}).join('');\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${shapes}${signature.typedName ? `<text x=\"${width * 0.04}\" y=\"${height * 0.9}\" textLength=\"${Math.min(width * 0.92, signature.typedName.length * height * 0.1)}\" font-family=\"cursive\" font-size=\"${Math.max(12, height / 5)}\" fill=\"${escapeXml(ink)}\">${escapeXml(signature.typedName)}</text>` : ''}</svg>`;\n}\n","import { forwardRef, useEffect, useLayoutEffect, useId, useImperativeHandle, useMemo, useRef, useState, type PointerEvent } from 'react';\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Input } from '../text-inputs';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useStrings } from '../../../lib/strings';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { defaultSignaturePadStrings, type SignaturePadHandle, type SignaturePadPoint, type SignaturePadProps, type SignaturePadPreviewProps, type SignaturePadValue } from './signature-pad.types';\nimport { drawSignature, emptySignature, isSignatureEmpty, normalizeSignature, signaturePadToSVG } from './signature-pad.utils';\n\nexport const SignaturePad = forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(props, ref) {\n\tconst { value: controlledValue, defaultValue = emptySignature, onValueChange, disabled = false, readOnly = false, invalid,\n\t\tname, form, required, allowTypedSignature = true, strokeWidth = 2, strings: stringsProp, className, id, ...rootProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst [internalValue, setInternalValue] = useState(() => normalizeSignature(defaultValue));\n\tconst normalizedControlledValue = useMemo(() => normalizeSignature(controlledValue ?? emptySignature), [controlledValue]);\n\tconst value = controlled ? normalizedControlledValue : internalValue;\n\tconst valueRef = useRef(value);\n\tuseLayoutEffect(() => { valueRef.current = value; }, [value]);\n\tconst undoHistory = useRef<SignaturePadValue[]>([]);\n\tconst redoHistory = useRef<SignaturePadValue[]>([]);\n\tconst [historyVersion, setHistoryVersion] = useState(0);\n\tconst live = useRef<{ pointerId: number; points: SignaturePadPoint[]; initial: SignaturePadValue } | null>(null);\n\tconst [drawing, setDrawing] = useState(false);\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fieldRef = useRef<HTMLInputElement>(null);\n\tconst typedRef = useRef<HTMLInputElement>(null);\n\tconst lastPublished = useRef<SignaturePadValue | null>(null);\n\tconst generatedId = useId();\n\tconst rootId = id ?? `signature-${generatedId}`;\n\tconst strings = useStrings(defaultSignaturePadStrings, stringsProp);\n\tconst instructions = allowTypedSignature ? strings.instructions : stringsProp?.instructions ?? strings.drawingInstructions;\n\tconst locked = disabled || readOnly;\n\tconst inkWidth = Number.isFinite(strokeWidth) ? Math.max(0.25, strokeWidth) : 2;\n\n\tconst paint = (signature: SignaturePadValue) => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tif (!bounds.width || !bounds.height) return;\n\t\tconst scale = window.devicePixelRatio || 1;\n\t\tif (canvas.width !== Math.round(bounds.width * scale)) canvas.width = Math.round(bounds.width * scale);\n\t\tif (canvas.height !== Math.round(bounds.height * scale)) canvas.height = Math.round(bounds.height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) return;\n\t\tcontext.setTransform(scale, 0, 0, scale, 0, 0);\n\t\tcontext.strokeStyle = context.fillStyle = getComputedStyle(canvas).color;\n\t\tdrawSignature(context, normalizeSignature(signature), bounds.width, bounds.height, inkWidth);\n\t};\n\tconst cancelStroke = () => {\n\t\tconst stroke = live.current;\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (stroke && canvasRef.current?.hasPointerCapture?.(stroke.pointerId)) canvasRef.current.releasePointerCapture(stroke.pointerId);\n\t\tpaint(valueRef.current);\n\t};\n\tconst publish = (next: SignaturePadValue, history = true) => {\n\t\tif (locked) return;\n\t\tcancelStroke();\n\t\tconst normalized = normalizeSignature(next);\n\t\tif (history) { undoHistory.current.push(valueRef.current); redoHistory.current = []; }\n\t\tlastPublished.current = normalized;\n\t\tif (!controlled) { valueRef.current = normalized; setInternalValue(normalized); }\n\t\tonValueChange?.(normalized);\n\t\tsetHistoryVersion((version) => version + 1);\n\t};\n\tconst undo = () => {\n\t\tif (locked || !undoHistory.current.length) return;\n\t\tconst previous = undoHistory.current.pop()!;\n\t\tredoHistory.current.push(valueRef.current); publish(previous, false);\n\t};\n\tconst redo = () => {\n\t\tif (locked || !redoHistory.current.length) return;\n\t\tconst next = redoHistory.current.pop()!;\n\t\tundoHistory.current.push(valueRef.current); publish(next, false);\n\t};\n\tconst focus = () => (allowTypedSignature ? typedRef.current : canvasRef.current)?.focus();\n\tuseImperativeHandle(ref, () => ({ focus, undo, redo, clear: () => publish(emptySignature), serialize: (format = 'png', options = {}) => {\n\t\tconst snapshot = normalizeSignature(valueRef.current);\n\t\tif (format === 'json') return JSON.stringify(snapshot);\n\t\tconst bounds = canvasRef.current?.getBoundingClientRect();\n\t\tconst width = Number.isFinite(options.width) ? Math.max(1, options.width!) : bounds?.width || 600;\n\t\tconst height = Number.isFinite(options.height) ? Math.max(1, options.height!) : bounds?.height || 200;\n\t\tconst ink = canvasRef.current ? getComputedStyle(canvasRef.current).color : 'currentColor';\n\t\tif (format === 'svg') return signaturePadToSVG(snapshot, width, height, inkWidth, ink);\n\t\tconst scale = Number.isFinite(options.scale) ? Math.max(0.1, Math.min(8, options.scale!)) : window.devicePixelRatio || 1;\n\t\tconst canvas = document.createElement('canvas'); canvas.width = Math.round(width * scale); canvas.height = Math.round(height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) throw new Error('Canvas export is unavailable in this environment. Use SVG or JSON.');\n\t\tcontext.scale(scale, scale); context.strokeStyle = context.fillStyle = ink;\n\t\tdrawSignature(context, snapshot, width, height, inkWidth);\n\t\treturn canvas.toDataURL('image/png');\n\t} }));\n\n\tuseEffect(() => {\n\t\t// External replacement invalidates history; an acknowledged controlled edit retains it.\n\t\tif (controlled && JSON.stringify(value) !== JSON.stringify(lastPublished.current)) { undoHistory.current = []; redoHistory.current = []; setHistoryVersion((version) => version + 1); }\n\t\tlastPublished.current = value;\n\t\tcancelStroke();\n\t}, [value, disabled, readOnly]);\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst redraw = () => paint(live.current ? { ...live.current.initial, strokes: [...live.current.initial.strokes, { points: live.current.points }] } : valueRef.current);\n\t\tredraw();\n\t\tconst resize = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(redraw) : undefined;\n\t\tresize?.observe(canvas);\n\t\t// Theme scopes can change without resizing the drawing area.\n\t\tconst theme = new MutationObserver(redraw);\n\t\tfor (let ancestor: HTMLElement | null = canvas; ancestor; ancestor = ancestor.parentElement) theme.observe(ancestor, { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] });\n\t\twindow.addEventListener('resize', redraw);\n\t\treturn () => { resize?.disconnect(); theme.disconnect(); window.removeEventListener('resize', redraw); };\n\t}, [inkWidth]);\n\tuseEffect(() => {\n\t\tconst owner = fieldRef.current?.form ?? typedRef.current?.form ?? canvasRef.current?.closest('form');\n\t\tlet active = true;\n\t\tlet resetTimer: ReturnType<typeof setTimeout> | undefined;\n\t\t// Trusted events can run microtasks between listeners. Wait for propagation and the native default action.\n\t\tconst reset = (event: Event) => {\n\t\t\tclearTimeout(resetTimer);\n\t\t\tresetTimer = setTimeout(() => { resetTimer = undefined; if (active && !event.defaultPrevented && !locked) { undoHistory.current = []; redoHistory.current = []; publish(defaultValue, false); } }, 0);\n\t\t};\n\t\towner?.addEventListener('reset', reset);\n\t\treturn () => { active = false; clearTimeout(resetTimer); owner?.removeEventListener('reset', reset); };\n\t}, [defaultValue, controlled, locked, onValueChange, form, name, required, allowTypedSignature]);\n\tconst pointFrom = (event: PointerEvent<HTMLCanvasElement>, sample: Pick<globalThis.PointerEvent, 'clientX' | 'clientY' | 'pressure'> = event): SignaturePadPoint => {\n\t\tconst bounds = event.currentTarget.getBoundingClientRect();\n\t\treturn { x: Math.max(0, Math.min(1, (sample.clientX - bounds.left) / (bounds.width || 1))), y: Math.max(0, Math.min(1, (sample.clientY - bounds.top) / (bounds.height || 1))), pressure: event.pointerType === 'pen' ? sample.pressure || 0.5 : 0.5 };\n\t};\n\tconst finish = (event: PointerEvent<HTMLCanvasElement>) => {\n\t\tconst stroke = live.current;\n\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t// A lift can arrive beyond the last move; keep that endpoint without duplicating a resting tap.\n\t\tconst endpoint = pointFrom(event);\n\t\tconst last = stroke.points[stroke.points.length - 1];\n\t\tif (last.x !== endpoint.x || last.y !== endpoint.y) stroke.points.push(endpoint);\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (valueRef.current === stroke.initial) publish({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t};\n\tconst empty = isSignatureEmpty(value);\n\treturn <Stack {...rootProps} id={rootId} role=\"group\" aria-label={rootProps['aria-label'] ?? strings.label} gap=\"sm\" className={cn('signature-pad--component min-w-0', className)} data-history-version={historyVersion} data-disabled={disabled || undefined} data-readonly={readOnly || undefined}>\n\t\t<Text id={`${rootId}-instructions`} size=\"xs\" type=\"secondary\">{instructions}</Text>\n\t\t<div className={cn('signature-pad--area relative overflow-hidden rounded-inner border border-input bg-background text-foreground', fieldStateRecipes.invalid, disabled && 'cursor-not-allowed opacity-50')} aria-invalid={invalid || undefined}>\n\t\t\t<canvas ref={canvasRef} className={cn('signature-pad--canvas block w-full aspect-[3/1] min-h-40 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset', !locked && 'touch-none cursor-crosshair')}\n\t\t\t\ttabIndex={disabled ? -1 : 0} role=\"img\" aria-label={strings.label} aria-describedby={`${rootId}-instructions ${rootId}-status`} aria-disabled={disabled || undefined} aria-invalid={invalid || undefined}\n\t\t\t\tonPointerDown={(event) => { if (locked || live.current || event.button !== 0) return; event.preventDefault(); event.currentTarget.focus(); event.currentTarget.setPointerCapture?.(event.pointerId); live.current = { pointerId: event.pointerId, points: [pointFrom(event)], initial: valueRef.current }; setDrawing(true); paint({ ...valueRef.current, strokes: [...valueRef.current.strokes, { points: live.current.points }] }); }}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tconst stroke = live.current;\n\t\t\t\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t\t\t\tconst samples = event.nativeEvent.getCoalescedEvents?.().filter((sample) => sample.pointerId === stroke.pointerId) ?? [];\n\t\t\t\t\tfor (const sample of samples.length ? samples : [event.nativeEvent]) stroke.points.push(pointFrom(event, sample));\n\t\t\t\t\tpaint({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t\t\t\t}}\n\t\t\t\tonPointerUp={finish} onPointerCancel={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }} onLostPointerCapture={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }}\n\t\t\t\tonContextMenu={(event) => { if (live.current) event.preventDefault(); }}\n\t\t\t\tonKeyDown={(event) => { if (event.key === 'Escape') cancelStroke(); if (locked) return; if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') { event.preventDefault(); if (event.shiftKey) redo(); else undo(); } if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') { event.preventDefault(); redo(); } }}>\n\t\t\t\t{instructions}\n\t\t\t</canvas>\n\t\t\t{empty && !drawing && <div aria-hidden=\"true\" className=\"signature-pad--placeholder pointer-events-none absolute inset-0 flex items-center justify-center\"><Text type=\"secondary\">{strings.placeholder}</Text></div>}\n\t\t</div>\n\t\t{allowTypedSignature && <FormField label={strings.typedName} htmlFor={`${rootId}-typed`}><Input ref={typedRef} id={`${rootId}-typed`} value={value.typedName ?? ''} disabled={disabled} readOnly={readOnly} invalid={invalid} onChange={(event) => publish({ ...valueRef.current, typedName: event.target.value })} /></FormField>}\n\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !undoHistory.current.length} onClick={() => { undo(); focus(); }}>{strings.undo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !redoHistory.current.length} onClick={() => { redo(); focus(); }}>{strings.redo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || empty} onClick={() => { publish(emptySignature); focus(); }}>{strings.clear}</Button>\n\t\t</Stack>\n\t\t<Text id={`${rootId}-status`} role=\"status\" size=\"xs\" type=\"secondary\">{empty ? strings.empty : strings.signed}</Text>\n\t\t{(name || required) && <input ref={fieldRef} className=\"sr-only\" type=\"text\" tabIndex={-1} aria-hidden=\"true\" name={name} form={form} disabled={disabled} readOnly={readOnly} required={required} value={empty ? '' : JSON.stringify(value)} onChange={() => {}} onFocus={focus} onInvalid={focus} />}\n\t</Stack>;\n});\n\n/** Server-renderable preview; normalized geometry follows the semantic foreground. */\nexport const SignaturePadPreview = forwardRef<SVGSVGElement, SignaturePadPreviewProps>(function SignaturePadPreview({ value, strokeWidth = 2, className, ...props }, ref) {\n\tconst normalized = normalizeSignature(value);\n\treturn <svg ref={ref} role=\"img\" viewBox=\"0 0 600 200\" aria-label=\"Signature\" {...props} className={cn('signature-pad-preview--component w-full h-auto text-foreground', className)}>\n\t\t{normalized.strokes.map((stroke, index) => stroke.points.length === 1 ? <circle key={index} cx={stroke.points[0].x * 600} cy={stroke.points[0].y * 200} r={strokeWidth * (0.5 + stroke.points[0].pressure) / 2} fill=\"currentColor\" /> : <g key={index}>{stroke.points.slice(1).map((point, pointIndex) => { const a = stroke.points[pointIndex]; return <path key={pointIndex} d={`M${a.x * 600} ${a.y * 200}L${point.x * 600} ${point.y * 200}`} fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)} strokeLinecap=\"round\" />; })}</g>)}\n\t\t{normalized.typedName && <text x=\"24\" y=\"180\" fill=\"currentColor\" fontFamily=\"cursive\" fontSize=\"40\" textLength={Math.min(552, normalized.typedName.length * 20)}>{normalized.typedName}</text>}\n\t</svg>;\n});\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as e, i as t, n, r, t as i } from "../skeleton-CmT1ppqb.js";
2
+ import { a as e, i as t, n, r, t as i } from "../skeleton-3F0uhYn3.js";
3
3
  export { i as ContentSkeleton, n as PageSkeleton, r as Skeleton, t as TableSkeleton, e as TwoColumnPageSkeleton };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as e, t } from "../spinner-BY9HbUEh.js";
2
+ import { n as e, t } from "../spinner-Cpf7oRkF.js";
3
3
  export { t as Spinner, e as defaultSpinnerStrings };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { i as e, n as t, r as n, t as r } from "../structure-MvKVq-oL.js";
2
+ import { i as e, n as t, r as n, t as r } from "../structure-CRdqVawd.js";
3
3
  export { e as AdaptiveGrid, n as Grid, t as GridCell, r as Stack };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../table-DnlAJ-xR.js";
2
+ import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../table-CLtJTxoR.js";
3
3
  export { s as Table, r as TableBody, a as TableCaption, n as TableCell, e as TableFooter, i as TableHead, o as TableHeader, t as TableRow };
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { n as e, t } from "../input-WwYQZJzG.js";
3
- import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "../text-inputs-Dh9XGyiS.js";
2
+ import { n as e, t } from "../input-SX9V0AL3.js";
3
+ import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "../text-inputs-DsR56TR-.js";
4
4
  export { t as Input, n as InputGroup, c as InputGroupAddon, u as InputGroupButton, r as InputGroupInput, o as InputGroupText, f as InputGroupTextarea, l as PasswordInput, d as SlugField, i as Textarea, e as defaultInputStrings, a as defaultPasswordInputStrings, s as slugifyValue };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { f as e } from "../ui-provider-CftIB6TY.js";
3
- import { t } from "../utils-C2EKeIw3.js";
2
+ import { f as e } from "../ui-provider-DRPn3qNl.js";
3
+ import { t } from "../utils-BvH9PSmq.js";
4
4
  import { jsx as n } from "react/jsx-runtime";
5
5
  import { CircleCheckIcon as r, InfoIcon as i, Loader2Icon as a, OctagonXIcon as o, TriangleAlertIcon as s } from "lucide-react";
6
6
  import { Toaster as c } from "sonner";
@@ -24,13 +24,13 @@ var l = ({ theme: e = "system", ...t }) => /* @__PURE__ */ n(c, {
24
24
  toastOptions: { classNames: { toast: "cn-toast" } },
25
25
  ...t
26
26
  }), u = {
27
- toast: "toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius-md !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--spacing-action-sm)+var(--spacing-space-lg))] !text-inverse-foreground !shadow-lg",
27
+ toast: "toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--spacing-action-sm)+var(--spacing-space-lg))] !text-inverse-foreground !shadow-lg",
28
28
  title: "toaster--title text-sm font-medium leading-snug text-current",
29
29
  description: "toaster--description !text-inverse-muted text-xs leading-snug",
30
30
  icon: "toaster--icon !m-0 flex size-icon-lg shrink-0 items-center justify-center self-center text-inverse-muted",
31
31
  closeButton: "toaster--close-button !left-auto !right-space-sm !top-1/2 !size-action-xs !translate-x-0 !-translate-y-1/2 !transform-none !border-inverse-border !bg-transparent !text-inverse-foreground !opacity-60 transition-[background-color,opacity] hover:!bg-inverse-surface hover:!opacity-100",
32
- actionButton: "toaster--action-button !h-action-sm !rounded-radius-md !bg-inverse-foreground !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-background",
33
- cancelButton: "toaster--cancel-button !h-action-sm !rounded-radius-md !bg-inverse-surface !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-foreground",
32
+ actionButton: "toaster--action-button !h-action-sm !rounded-inner !bg-inverse-foreground !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-background",
33
+ cancelButton: "toaster--cancel-button !h-action-sm !rounded-inner !bg-inverse-surface !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-foreground",
34
34
  success: "toaster--success",
35
35
  info: "toaster--info",
36
36
  warning: "toaster--warning",
@@ -41,7 +41,7 @@ var l = ({ theme: e = "system", ...t }) => /* @__PURE__ */ n(c, {
41
41
  }, d = {
42
42
  success: /* @__PURE__ */ n(r, { className: "size-icon-lg text-success" }),
43
43
  info: /* @__PURE__ */ n(i, { className: "size-icon-lg text-info" }),
44
- warning: /* @__PURE__ */ n(s, { className: "size-icon-lg text-warning" }),
44
+ warning: /* @__PURE__ */ n(s, { className: "size-icon-lg text-warning-accent" }),
45
45
  error: /* @__PURE__ */ n(o, { className: "size-icon-lg text-destructive" }),
46
46
  loading: /* @__PURE__ */ n(a, { className: "size-icon-lg animate-spin text-inverse-muted" })
47
47
  }, f = {