themelia-react-ui 1.0.2 → 2.0.1

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 (748) hide show
  1. package/CHANGELOG.md +632 -1
  2. package/README.md +31 -13
  3. package/dist/accordion-B6a3vVgA.js +207 -0
  4. package/dist/accordion-B6a3vVgA.js.map +1 -0
  5. package/dist/action-menu-TzCoSlwL.js +280 -0
  6. package/dist/action-menu-TzCoSlwL.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-CL84ZN9A.js → affordance-geometry.generated-B5iu-Mkr.js} +9 -3
  8. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
  9. package/dist/{ai-artifact-DLVdK0Py.js → ai-artifact-BMJdv-6q.js} +389 -391
  10. package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
  11. package/dist/{app-shell-C_fKpljx.js → app-shell-ZK5RWdo6.js} +4 -4
  12. package/dist/{app-shell-C_fKpljx.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
  13. package/dist/attachment-BtfhGm8i.js +245 -0
  14. package/dist/attachment-BtfhGm8i.js.map +1 -0
  15. package/dist/{auth-CAQcasMV.js → auth-CYxKfo69.js} +239 -237
  16. package/dist/auth-CYxKfo69.js.map +1 -0
  17. package/dist/{avatar-Bu2HhitA.js → avatar-BBnEJIx8.js} +71 -68
  18. package/dist/avatar-BBnEJIx8.js.map +1 -0
  19. package/dist/badge-MrKVNzW9.js +93 -0
  20. package/dist/badge-MrKVNzW9.js.map +1 -0
  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/batch-action-bar.js +3 -0
  27. package/dist/base/buttons.js +2 -3
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +19 -19
  30. package/dist/base/carousel.js.map +1 -1
  31. package/dist/base/cascader.js +234 -224
  32. package/dist/base/cascader.js.map +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +3 -3
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +3 -3
  42. package/dist/base/forms-numeric.js +1 -1
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +81 -76
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +1 -1
  48. package/dist/base/metadata-list.js +3 -0
  49. package/dist/base/navigation.js +7 -7
  50. package/dist/base/popover-menu.js +1 -1
  51. package/dist/base/popover.js +1 -1
  52. package/dist/base/qr-code.js +7 -4
  53. package/dist/base/qr-code.js.map +1 -1
  54. package/dist/base/repeaters.js +175 -174
  55. package/dist/base/repeaters.js.map +1 -1
  56. package/dist/base/sheet.js +1 -1
  57. package/dist/base/sidebar.js +1 -1
  58. package/dist/base/signature-pad.js +148 -138
  59. package/dist/base/signature-pad.js.map +1 -1
  60. package/dist/base/skeleton.js +1 -1
  61. package/dist/base/spinner.js +1 -1
  62. package/dist/base/structure.js +1 -1
  63. package/dist/base/table.js +1 -1
  64. package/dist/base/text-inputs.js +2 -2
  65. package/dist/base/toaster.js +4 -4
  66. package/dist/base/toaster.js.map +1 -1
  67. package/dist/base/tree.js +1 -1
  68. package/dist/base/upload-queue.js +1 -1
  69. package/dist/base/upload.js +3 -3
  70. package/dist/base/value-inputs.js +2 -2
  71. package/dist/batch-action-bar-BZGDG-Si.js +104 -0
  72. package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
  73. package/dist/blocks/admin.js +264 -253
  74. package/dist/blocks/admin.js.map +1 -1
  75. package/dist/blocks/ai.js +293 -323
  76. package/dist/blocks/ai.js.map +1 -1
  77. package/dist/blocks/analytics/usage-card.js +1 -1
  78. package/dist/blocks/analytics.js +596 -587
  79. package/dist/blocks/analytics.js.map +1 -1
  80. package/dist/blocks/collaboration.js +1 -1
  81. package/dist/blocks/commerce/receipt.js +1 -1
  82. package/dist/blocks/commerce.js +2246 -1693
  83. package/dist/blocks/commerce.js.map +1 -1
  84. package/dist/blocks/data-display.js +3 -2
  85. package/dist/blocks/onboarding.js +50 -49
  86. package/dist/blocks/onboarding.js.map +1 -1
  87. package/dist/blocks/planning.js +82 -91
  88. package/dist/blocks/planning.js.map +1 -1
  89. package/dist/blocks/timelines.js +1 -1
  90. package/dist/breadcrumbs-D5t7I023.js +129 -0
  91. package/dist/breadcrumbs-D5t7I023.js.map +1 -0
  92. package/dist/{button-BZyfTvwm.js → button-QYwiyhD2.js} +15 -14
  93. package/dist/button-QYwiyhD2.js.map +1 -0
  94. package/dist/buttons-SbIcm1HJ.js +661 -0
  95. package/dist/buttons-SbIcm1HJ.js.map +1 -0
  96. package/dist/{cards-qGSErLw_.js → cards-CiiHpKYd.js} +8 -8
  97. package/dist/cards-CiiHpKYd.js.map +1 -0
  98. package/dist/{chart-Bsc5BICK.js → chart-QfrARkXl.js} +17 -15
  99. package/dist/chart-QfrARkXl.js.map +1 -0
  100. package/dist/checkbox-DhB6K0bK.js +36 -0
  101. package/dist/checkbox-DhB6K0bK.js.map +1 -0
  102. package/dist/choice-inputs-t6w3ATNz.js +766 -0
  103. package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
  104. package/dist/code-block-Dgbu-CU3.js +185 -0
  105. package/dist/code-block-Dgbu-CU3.js.map +1 -0
  106. package/dist/{collapsible-ClvC7Bj3.js → collapsible-D8AEGU1-.js} +4 -4
  107. package/dist/{collapsible-ClvC7Bj3.js.map → collapsible-D8AEGU1-.js.map} +1 -1
  108. package/dist/{collection-content-D6S8cv_n.js → collection-content-uK16Grv0.js} +3 -3
  109. package/dist/{collection-content-D6S8cv_n.js.map → collection-content-uK16Grv0.js.map} +1 -1
  110. package/dist/{combobox-BFnbJJp3.js → combobox-2Ic8N9bL.js} +103 -98
  111. package/dist/combobox-2Ic8N9bL.js.map +1 -0
  112. package/dist/combobox-DLl0bfiq.js +867 -0
  113. package/dist/combobox-DLl0bfiq.js.map +1 -0
  114. package/dist/{command-BnmSchli.js → command-kNR20o7x.js} +34 -30
  115. package/dist/command-kNR20o7x.js.map +1 -0
  116. package/dist/{comments-u5L0OGip.js → comments-BpDuCUUu.js} +304 -301
  117. package/dist/comments-BpDuCUUu.js.map +1 -0
  118. package/dist/components/base/accordion/accordion-variants.d.ts +3 -3
  119. package/dist/components/base/action-menu/action-menu.d.ts +27 -5
  120. package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
  121. package/dist/components/base/action-menu/index.d.ts +1 -0
  122. package/dist/components/base/avatar/stacked-avatars.d.ts +5 -4
  123. package/dist/components/base/badge/badge.d.ts +1 -1
  124. package/dist/components/base/badge/badge.recipes.d.ts +6 -6
  125. package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
  126. package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
  127. package/dist/components/base/batch-action-bar/index.d.ts +8 -0
  128. package/dist/components/base/buttons/base-button.d.ts +7 -0
  129. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  130. package/dist/components/base/buttons/button.recipes.d.ts +2 -2
  131. package/dist/components/base/buttons/button.variants.d.ts +1 -0
  132. package/dist/components/base/buttons/loader-button.d.ts +3 -1
  133. package/dist/components/base/buttons/text-button.d.ts +2 -2
  134. package/dist/components/base/carousel/carousel.d.ts +3 -1
  135. package/dist/components/base/chart/chart.d.ts +7 -7
  136. package/dist/components/base/choice-inputs/checkbox.d.ts +6 -7
  137. package/dist/components/base/choice-inputs/choice-types.d.ts +24 -3
  138. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +9 -0
  139. package/dist/components/base/choice-inputs/select-popup.d.ts +9 -1
  140. package/dist/components/base/choice-inputs/switch-card.d.ts +1 -1
  141. package/dist/components/base/date-pickers/date-picker-field.d.ts +23 -0
  142. package/dist/components/base/date-pickers/datepicker.types.d.ts +13 -3
  143. package/dist/components/base/display/alert-dialog.d.ts +10 -3
  144. package/dist/components/base/display/content-block.d.ts +4 -2
  145. package/dist/components/base/display/date-block.d.ts +1 -1
  146. package/dist/components/base/display/dialog.d.ts +8 -5
  147. package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
  148. package/dist/components/base/display/surface-title.d.ts +6 -1
  149. package/dist/components/base/feedback/alert.d.ts +1 -1
  150. package/dist/components/base/feedback/state-display.d.ts +5 -4
  151. package/dist/components/base/forms/form-sizing.d.ts +43 -8
  152. package/dist/components/base/forms/workflow.d.ts +2 -0
  153. package/dist/components/base/forms-numeric/coordinates-input.d.ts +3 -0
  154. package/dist/components/base/forms-numeric/rounding-mode-select.d.ts +4 -1
  155. package/dist/components/base/metadata-list/index.d.ts +12 -0
  156. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
  157. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
  158. package/dist/components/base/navigation/dropdown-menu.d.ts +2 -2
  159. package/dist/components/base/navigation/index.d.ts +1 -1
  160. package/dist/components/base/navigation/language-switcher.d.ts +4 -1
  161. package/dist/components/base/navigation/overflow-tab-bar.d.ts +7 -0
  162. package/dist/components/base/navigation/page-header/index.d.ts +1 -0
  163. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
  164. package/dist/components/base/navigation/page-header/page-header.d.ts +30 -4
  165. package/dist/components/base/qr-code/qr-code.d.ts +2 -0
  166. package/dist/components/base/sheet/index.d.ts +29 -1
  167. package/dist/components/base/sheet/sheet.d.ts +10 -5
  168. package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
  169. package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
  170. package/dist/components/base/spinner/spinner.d.ts +3 -2
  171. package/dist/components/base/structure/structure.types.d.ts +1 -1
  172. package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
  173. package/dist/components/base/text-inputs/input-group.d.ts +2 -2
  174. package/dist/components/base/upload/upload.recipes.d.ts +33 -0
  175. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -2
  176. package/dist/components/base/value-inputs/index.d.ts +5 -5
  177. package/dist/components/base/value-inputs/tags-input.d.ts +38 -12
  178. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +1 -1
  179. package/dist/components/blocks/analytics/format-metric-value.d.ts +11 -1
  180. package/dist/components/blocks/analytics/index.d.ts +1 -1
  181. package/dist/components/blocks/analytics/use-metric-format-options.d.ts +3 -0
  182. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  183. package/dist/components/blocks/commerce/address-card/types.d.ts +4 -1
  184. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +4 -0
  185. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +2 -2
  186. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
  187. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  188. package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
  189. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
  190. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  191. package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
  192. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
  193. package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
  194. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
  195. package/dist/components/blocks/commerce/index.d.ts +13 -5
  196. package/dist/components/blocks/commerce/inventory-section/types.d.ts +4 -1
  197. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  198. package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
  199. package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
  200. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
  201. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +1 -1
  202. package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
  203. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
  204. package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
  205. package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
  206. package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
  207. package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
  208. package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
  209. package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
  210. package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
  211. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  212. package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
  213. package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
  214. package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
  215. package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
  216. package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
  217. package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
  218. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  219. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
  220. package/dist/components/blocks/commerce/payment-method/types.d.ts +14 -1
  221. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  222. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
  223. package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
  224. package/dist/components/blocks/commerce/seo-listing/seo-listing-card.d.ts +1 -1
  225. package/dist/components/blocks/commerce/seo-listing/types.d.ts +3 -1
  226. package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
  227. package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
  228. package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
  229. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  230. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
  231. package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
  232. package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
  233. package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
  234. package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
  235. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  236. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
  237. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -1
  238. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +4 -1
  239. package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +4 -1
  240. package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
  241. package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
  242. package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
  243. package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
  244. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +1 -1
  245. package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
  246. package/dist/components/features/kanban/kanban.d.ts +1 -1
  247. package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
  248. package/dist/components/features/kanban/kanban.types.d.ts +2 -2
  249. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  250. package/dist/components/features/media-library/index.d.ts +1 -1
  251. package/dist/components/features/media-library/media-library.d.ts +1 -1
  252. package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
  253. package/dist/components/features/media-library/media-library.types.d.ts +74 -1
  254. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  255. package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
  256. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  257. package/dist/components/features/overlays/dialog.d.ts +1 -1
  258. package/dist/components/features/overlays/drawer.d.ts +1 -1
  259. package/dist/components/features/overlays/hooks/use-overlay-actions.d.ts +2 -2
  260. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +11 -4
  261. package/dist/components/features/overlays/index.d.ts +1 -1
  262. package/dist/components/features/overlays/overlay-tone-icon.d.ts +37 -0
  263. package/dist/components/features/overlays/overlays.types.d.ts +62 -19
  264. package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
  265. package/dist/components/features/products/components/product-details-card.d.ts +5 -0
  266. package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
  267. package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
  268. package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
  269. package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
  270. package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
  271. package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
  272. package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
  273. package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
  274. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  275. package/dist/components/features/products/partials/index.d.ts +1 -1
  276. package/dist/components/features/products/partials/product-metric-tile.d.ts +6 -0
  277. package/dist/components/features/products/partials/product-tone.d.ts +11 -1
  278. package/dist/components/features/products/products.types.d.ts +11 -3
  279. package/dist/components/features/resource/index.d.ts +1 -1
  280. package/dist/components/features/resource/resource.d.ts +1 -1
  281. package/dist/components/features/resource/resource.types.d.ts +34 -6
  282. package/dist/components/features/rich-text-editor/index.d.ts +2 -1
  283. package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
  284. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
  285. package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
  286. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  287. package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
  288. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
  289. package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
  290. package/dist/components/features/sync/index.d.ts +26 -3
  291. package/dist/components/features/table/data-table.d.ts +1 -1
  292. package/dist/components/features/table/partials/cell-renderers.d.ts +1 -1
  293. package/dist/components/features/table/table.types.d.ts +32 -7
  294. package/dist/components/layout/page/index.d.ts +1 -1
  295. package/dist/components/layout/page/page.types.d.ts +51 -4
  296. package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
  297. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  298. package/dist/components/layout/settings/settings.d.ts +16 -2
  299. package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
  300. package/dist/components/primitives/date.d.ts +16 -3
  301. package/dist/components/primitives/dimensions.d.ts +6 -0
  302. package/dist/components/primitives/duration.d.ts +6 -0
  303. package/dist/components/primitives/file-size.d.ts +6 -0
  304. package/dist/components/primitives/index.d.ts +1 -1
  305. package/dist/components/primitives/initials.d.ts +11 -2
  306. package/dist/components/primitives/link.d.ts +7 -0
  307. package/dist/components/primitives/money.d.ts +29 -7
  308. package/dist/components/primitives/number.d.ts +17 -0
  309. package/dist/components/primitives/value-typography.d.ts +54 -0
  310. package/dist/components/primitives/value.d.ts +31 -6
  311. package/dist/components/typography/heading.d.ts +9 -1
  312. package/dist/components/typography/label.d.ts +3 -0
  313. package/dist/components/typography/rich-text/index.d.ts +1 -1
  314. package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
  315. package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
  316. package/dist/components/typography/running-text.d.ts +12 -0
  317. package/dist/components/typography/text-link.d.ts +24 -1
  318. package/dist/components/typography/text.d.ts +12 -0
  319. package/dist/components/typography/text.styles.d.ts +35 -13
  320. package/dist/components/ui/button.d.ts +1 -1
  321. package/dist/components/ui/checkbox.d.ts +6 -0
  322. package/dist/components/ui/overlay.recipes.d.ts +6 -2
  323. package/dist/components/ui/select.d.ts +3 -1
  324. package/dist/components/ui/switch.d.ts +5 -0
  325. package/dist/{containers-DqB-bSYE.js → containers-DmWiJa2I.js} +36 -35
  326. package/dist/containers-DmWiJa2I.js.map +1 -0
  327. package/dist/{copyable-BTSByfmq.js → copyable-B3Gwgdqc.js} +6 -6
  328. package/dist/{copyable-BTSByfmq.js.map → copyable-B3Gwgdqc.js.map} +1 -1
  329. package/dist/data-display-DafIvCl5.js +960 -0
  330. package/dist/data-display-DafIvCl5.js.map +1 -0
  331. package/dist/date-BgK3bTdo.js +144 -0
  332. package/dist/date-BgK3bTdo.js.map +1 -0
  333. package/dist/date-picker-CF-DtUpF.js +1529 -0
  334. package/dist/date-picker-CF-DtUpF.js.map +1 -0
  335. package/dist/date-pickers-BmzxJl5l.js +174 -0
  336. package/dist/date-pickers-BmzxJl5l.js.map +1 -0
  337. package/dist/{display-CS6Hbk18.js → display-DsQTVzMz.js} +88 -87
  338. package/dist/display-DsQTVzMz.js.map +1 -0
  339. package/dist/{dropdown-menu-D-boNgGO.js → dropdown-menu-E2qmdC7o.js} +23 -16
  340. package/dist/dropdown-menu-E2qmdC7o.js.map +1 -0
  341. package/dist/features/activities.js +437 -521
  342. package/dist/features/activities.js.map +1 -1
  343. package/dist/features/ai-chat.js +174 -172
  344. package/dist/features/ai-chat.js.map +1 -1
  345. package/dist/features/async-preview.js +8 -8
  346. package/dist/features/async-preview.js.map +1 -1
  347. package/dist/features/combobox.js +1 -1
  348. package/dist/features/comments.js +1 -1
  349. package/dist/features/data-view.js +139 -138
  350. package/dist/features/data-view.js.map +1 -1
  351. package/dist/features/email-composer/engine.js +1 -1
  352. package/dist/features/email-composer.js +353 -352
  353. package/dist/features/email-composer.js.map +1 -1
  354. package/dist/features/event-calendar.js +262 -269
  355. package/dist/features/event-calendar.js.map +1 -1
  356. package/dist/features/filters.js +1 -1
  357. package/dist/features/global-search.js +307 -310
  358. package/dist/features/global-search.js.map +1 -1
  359. package/dist/features/kanban.js +95 -97
  360. package/dist/features/kanban.js.map +1 -1
  361. package/dist/features/map.js +56 -57
  362. package/dist/features/map.js.map +1 -1
  363. package/dist/features/media-library.js +914 -824
  364. package/dist/features/media-library.js.map +1 -1
  365. package/dist/features/mentions.js +1 -1
  366. package/dist/features/overlays.js +1 -1
  367. package/dist/features/products.js +1272 -1311
  368. package/dist/features/products.js.map +1 -1
  369. package/dist/features/questionnaire.js +204 -194
  370. package/dist/features/questionnaire.js.map +1 -1
  371. package/dist/features/resource-assignment.js +103 -95
  372. package/dist/features/resource-assignment.js.map +1 -1
  373. package/dist/features/resource.js +77 -69
  374. package/dist/features/resource.js.map +1 -1
  375. package/dist/features/rich-text-editor.js +30 -11
  376. package/dist/features/rich-text-editor.js.map +1 -1
  377. package/dist/features/schema-form.js +193 -189
  378. package/dist/features/schema-form.js.map +1 -1
  379. package/dist/features/suggestions.js +3 -3
  380. package/dist/features/sync.js +7 -7
  381. package/dist/features/sync.js.map +1 -1
  382. package/dist/features/table.js +1 -1
  383. package/dist/features/theme-tweaker.js +455 -455
  384. package/dist/features/theme-tweaker.js.map +1 -1
  385. package/dist/feedback-qNuMBtRH.js +233 -0
  386. package/dist/feedback-qNuMBtRH.js.map +1 -0
  387. package/dist/field-affordance-recipes-qQeIf4lG.js +48 -0
  388. package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
  389. package/dist/field-state-recipes-BVA2CWHo.js +12 -0
  390. package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
  391. package/dist/{filters-D6FF8L6s.js → filters-BkHH53uv.js} +414 -412
  392. package/dist/filters-BkHH53uv.js.map +1 -0
  393. package/dist/focus-recipes-B653VaLq.js +12 -0
  394. package/dist/focus-recipes-B653VaLq.js.map +1 -0
  395. package/dist/{form-field-CZwrkP7m.js → form-field-DUt4UxSV.js} +7 -7
  396. package/dist/{form-field-CZwrkP7m.js.map → form-field-DUt4UxSV.js.map} +1 -1
  397. package/dist/form-sizing-By94KzXE.js +130 -0
  398. package/dist/form-sizing-By94KzXE.js.map +1 -0
  399. package/dist/{forms-B5NCbkSC.js → forms-Bzha-Y3B.js} +25 -25
  400. package/dist/forms-Bzha-Y3B.js.map +1 -0
  401. package/dist/forms-numeric-C0bvjRPZ.js +906 -0
  402. package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
  403. package/dist/{header-kxruN3RM.js → header-BOefOKd1.js} +38 -41
  404. package/dist/header-BOefOKd1.js.map +1 -0
  405. package/dist/{hooks-BrlnCwQd.js → hooks-9k_TtmKh.js} +2 -2
  406. package/dist/{hooks-BrlnCwQd.js.map → hooks-9k_TtmKh.js.map} +1 -1
  407. package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
  408. package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
  409. package/dist/icon-badge-CAuKupo9.js +55 -0
  410. package/dist/icon-badge-CAuKupo9.js.map +1 -0
  411. package/dist/index.js +7 -7
  412. package/dist/input-DWhBBBww.js +262 -0
  413. package/dist/input-DWhBBBww.js.map +1 -0
  414. package/dist/{input-vxcaNCYC.js → input-Ddi_LSYv.js} +3 -3
  415. package/dist/{input-vxcaNCYC.js.map → input-Ddi_LSYv.js.map} +1 -1
  416. package/dist/interaction-recipes-CHr0dJUs.js +24 -0
  417. package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
  418. package/dist/item-DEmDiTlD.js +265 -0
  419. package/dist/item-DEmDiTlD.js.map +1 -0
  420. package/dist/layer-recipes-CCpklYME.js +13 -0
  421. package/dist/layer-recipes-CCpklYME.js.map +1 -0
  422. package/dist/layout/app-shell.js +1 -1
  423. package/dist/layout/auth.js +1 -1
  424. package/dist/layout/containers.js +1 -1
  425. package/dist/layout/header.js +1 -1
  426. package/dist/layout/hooks.js +1 -1
  427. package/dist/layout/navigation.js +1 -1
  428. package/dist/layout/page.js +1 -1
  429. package/dist/layout/settings.js +1 -1
  430. package/dist/layout/sidebar.js +2 -2
  431. package/dist/layout/workspace.js +1 -1
  432. package/dist/layout.js +10 -10
  433. package/dist/lib/affordance-geometry.generated.d.ts +7 -1
  434. package/dist/lib/field-affordance-recipes.d.ts +41 -1
  435. package/dist/lib/field-state-recipes.d.ts +9 -6
  436. package/dist/lib/focus-recipes.d.ts +24 -0
  437. package/dist/lib/format.d.ts +9 -0
  438. package/dist/lib/interaction-recipes.d.ts +35 -0
  439. package/dist/lib/layer-recipes.d.ts +19 -0
  440. package/dist/lib/money-format.d.ts +30 -0
  441. package/dist/lib/motion-recipes.d.ts +1 -0
  442. package/dist/lib/overlay-anatomy-recipes.d.ts +2 -1
  443. package/dist/lib/safe-image-src.d.ts +10 -0
  444. package/dist/lib/sanitize-html.d.ts +15 -3
  445. package/dist/lib/surface-recipes.d.ts +48 -6
  446. package/dist/lib/token-merge.generated.d.ts +17 -14
  447. package/dist/lib/tone-recipes.d.ts +79 -0
  448. package/dist/lib/track-recipes.d.ts +1 -1
  449. package/dist/lib/ui-provider/hooks.d.ts +2 -1
  450. package/dist/lib/ui-provider/index.d.ts +2 -2
  451. package/dist/lib/ui-provider/provider.d.ts +7 -2
  452. package/dist/lib/ui-provider/store.d.ts +6 -2
  453. package/dist/lib/ui-provider/types.d.ts +14 -2
  454. package/dist/lib/utils.js +1 -1
  455. package/dist/media-gallery-DcTtAaeC.js +203 -0
  456. package/dist/media-gallery-DcTtAaeC.js.map +1 -0
  457. package/dist/mentions-D-uyCh01.js +568 -0
  458. package/dist/mentions-D-uyCh01.js.map +1 -0
  459. package/dist/{message-SZUNB1eX.js → message-CdHgIWKf.js} +5 -5
  460. package/dist/{message-SZUNB1eX.js.map → message-CdHgIWKf.js.map} +1 -1
  461. package/dist/metadata-list-X5rYAKSB.js +394 -0
  462. package/dist/metadata-list-X5rYAKSB.js.map +1 -0
  463. package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
  464. package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
  465. package/dist/navigation-D3KwXmaq.js +145 -0
  466. package/dist/navigation-D3KwXmaq.js.map +1 -0
  467. package/dist/navigation-HJf5zxlH.js +268 -0
  468. package/dist/navigation-HJf5zxlH.js.map +1 -0
  469. package/dist/{navigation-row-recipes-DQEXQcqY.js → navigation-row-recipes-BVowojQw.js} +2 -2
  470. package/dist/{navigation-row-recipes-DQEXQcqY.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
  471. package/dist/number-DMhe-Vsk.js +352 -0
  472. package/dist/number-DMhe-Vsk.js.map +1 -0
  473. package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
  474. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
  475. package/dist/overlay.recipes-8GHqmlb4.js +6 -0
  476. package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
  477. package/dist/overlays-I0axtYA6.js +999 -0
  478. package/dist/overlays-I0axtYA6.js.map +1 -0
  479. package/dist/{page-hGmT4nWK.js → page-B5dTH9gE.js} +79 -68
  480. package/dist/page-B5dTH9gE.js.map +1 -0
  481. package/dist/page-header-commands-DjzFEq3E.js +126 -0
  482. package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
  483. package/dist/{pagination-NLGqRirf.js → pagination-3bPA_a6K.js} +19 -19
  484. package/dist/{pagination-NLGqRirf.js.map → pagination-3bPA_a6K.js.map} +1 -1
  485. package/dist/{popover-CghIYdQf.js → popover-Di55PyAI.js} +8 -8
  486. package/dist/popover-Di55PyAI.js.map +1 -0
  487. package/dist/{popover-menu-B4PoWhRl.js → popover-menu-B71Tn2Qz.js} +6 -6
  488. package/dist/{popover-menu-B4PoWhRl.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
  489. package/dist/{popover.recipes-QlD4JenO.js → popover.recipes-Bdyhj2db.js} +2 -2
  490. package/dist/{popover.recipes-QlD4JenO.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
  491. package/dist/primitives-B-CkiEMU.js +379 -0
  492. package/dist/primitives-B-CkiEMU.js.map +1 -0
  493. package/dist/primitives.js +5 -5
  494. package/dist/{progress-BroqrAyV.js → progress-rnS8-uAW.js} +11 -11
  495. package/dist/progress-rnS8-uAW.js.map +1 -0
  496. package/dist/{receipt-BuJynLgf.js → receipt-D0oswZ0p.js} +6 -6
  497. package/dist/{receipt-BuJynLgf.js.map → receipt-D0oswZ0p.js.map} +1 -1
  498. package/dist/rich-text-DvGulsNJ.js +78 -0
  499. package/dist/rich-text-DvGulsNJ.js.map +1 -0
  500. package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
  501. package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
  502. package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
  503. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
  504. package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
  505. package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
  506. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  507. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  508. package/dist/sanitize-html-DsQmI48u.js +92 -0
  509. package/dist/sanitize-html-DsQmI48u.js.map +1 -0
  510. package/dist/scroll-area-Bt_vXY2b.js +48 -0
  511. package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
  512. package/dist/{separator-BNIgG3au.js → separator-C8DlRGwF.js} +4 -4
  513. package/dist/separator-C8DlRGwF.js.map +1 -0
  514. package/dist/{separator-BhtFyo4x.js → separator-CYHnjsAb.js} +2 -2
  515. package/dist/{separator-BhtFyo4x.js.map → separator-CYHnjsAb.js.map} +1 -1
  516. package/dist/services/actions/action-adapters.d.ts +22 -0
  517. package/dist/services/actions/index.d.ts +1 -1
  518. package/dist/services/actions.js +23 -6
  519. package/dist/services/actions.js.map +1 -1
  520. package/dist/settings-CQW3b-Cu.js +170 -0
  521. package/dist/settings-CQW3b-Cu.js.map +1 -0
  522. package/dist/sheet-4SEvVYzA.js +210 -0
  523. package/dist/sheet-4SEvVYzA.js.map +1 -0
  524. package/dist/{sidebar-CyR4XKwR.js → sidebar-C7WWR29L.js} +181 -180
  525. package/dist/sidebar-C7WWR29L.js.map +1 -0
  526. package/dist/sidebar-d7Dg80ln.js +511 -0
  527. package/dist/sidebar-d7Dg80ln.js.map +1 -0
  528. package/dist/{skeleton-3F0uhYn3.js → skeleton-Cz890JZF.js} +10 -10
  529. package/dist/skeleton-Cz890JZF.js.map +1 -0
  530. package/dist/smart-card-lFKxn5Hu.js +595 -0
  531. package/dist/smart-card-lFKxn5Hu.js.map +1 -0
  532. package/dist/{spinner-Cpf7oRkF.js → spinner-fa3h1Aif.js} +10 -8
  533. package/dist/spinner-fa3h1Aif.js.map +1 -0
  534. package/dist/{structure-CRdqVawd.js → structure-DC2dygdA.js} +3 -3
  535. package/dist/{structure-CRdqVawd.js.map → structure-DC2dygdA.js.map} +1 -1
  536. package/dist/{structure.recipes-Bqhf9oIh.js → structure.recipes-EPz60cU8.js} +37 -19
  537. package/dist/structure.recipes-EPz60cU8.js.map +1 -0
  538. package/dist/style.css +1 -1
  539. package/dist/surface-recipes-BKRVW8Os.js +43 -0
  540. package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
  541. package/dist/table-CIKyLUsy.js +163 -0
  542. package/dist/table-CIKyLUsy.js.map +1 -0
  543. package/dist/{table-CcRDZiLP.js → table-CrcLN9Io.js} +544 -530
  544. package/dist/table-CrcLN9Io.js.map +1 -0
  545. package/dist/tabs-DwBJfjxX.js +190 -0
  546. package/dist/tabs-DwBJfjxX.js.map +1 -0
  547. package/dist/{text-inputs-DsR56TR-.js → text-inputs-aaK9wcDT.js} +151 -155
  548. package/dist/text-inputs-aaK9wcDT.js.map +1 -0
  549. package/dist/{text.styles-Q4sGAIgA.js → text.styles-g4He6UIW.js} +17 -14
  550. package/dist/text.styles-g4He6UIW.js.map +1 -0
  551. package/dist/theme.css +16 -12
  552. package/dist/themes/green.css +24 -0
  553. package/dist/{timelines-D1pkt3se.js → timelines-C_SBwHNP.js} +154 -164
  554. package/dist/timelines-C_SBwHNP.js.map +1 -0
  555. package/dist/tone-recipes-CPoExcTE.js +70 -0
  556. package/dist/tone-recipes-CPoExcTE.js.map +1 -0
  557. package/dist/tooltip-CsfgrfS7.js +111 -0
  558. package/dist/tooltip-CsfgrfS7.js.map +1 -0
  559. package/dist/track-recipes-CDcKmndW.js +10 -0
  560. package/dist/track-recipes-CDcKmndW.js.map +1 -0
  561. package/dist/{tree-BtmYyMZV.js → tree-BiKhg8AY.js} +72 -70
  562. package/dist/tree-BiKhg8AY.js.map +1 -0
  563. package/dist/typography/rich-text.js +1 -1
  564. package/dist/typography-DTRkE9zL.js +117 -0
  565. package/dist/typography-DTRkE9zL.js.map +1 -0
  566. package/dist/typography.js +2 -2
  567. package/dist/{ui-provider-DRPn3qNl.js → ui-provider-1D_NSYzO.js} +30 -23
  568. package/dist/ui-provider-1D_NSYzO.js.map +1 -0
  569. package/dist/ui-provider.js +3 -3
  570. package/dist/{upload-CDbYw1WN.js → upload-BO8-CLN6.js} +294 -293
  571. package/dist/upload-BO8-CLN6.js.map +1 -0
  572. package/dist/{upload-queue-CNd_hH_a.js → upload-queue-EOC8g1gf.js} +133 -138
  573. package/dist/upload-queue-EOC8g1gf.js.map +1 -0
  574. package/dist/upload.recipes-BbxTqrCT.js +61 -0
  575. package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
  576. package/dist/{usage-card-VyJLUwRr.js → usage-card-obRaBskq.js} +42 -43
  577. package/dist/{usage-card-VyJLUwRr.js.map → usage-card-obRaBskq.js.map} +1 -1
  578. package/dist/{utils-BvH9PSmq.js → utils-l5LpDw2z.js} +264 -62
  579. package/dist/utils-l5LpDw2z.js.map +1 -0
  580. package/dist/value-inputs-TAYMX111.js +947 -0
  581. package/dist/value-inputs-TAYMX111.js.map +1 -0
  582. package/dist/value-typography-b8wpz1eX.js +116 -0
  583. package/dist/value-typography-b8wpz1eX.js.map +1 -0
  584. package/dist/workspace-DH0v0KcB.js +407 -0
  585. package/dist/workspace-DH0v0KcB.js.map +1 -0
  586. package/docs/consumer-skill/SKILL.md +62 -50
  587. package/docs/consumer-skill/examples/app-layout.tsx +3 -5
  588. package/docs/consumer-skill/examples/composition.tsx +3 -3
  589. package/docs/consumer-skill/examples/detail.tsx +59 -13
  590. package/docs/consumer-skill/examples/edit.tsx +2 -2
  591. package/docs/consumer-skill/examples/layout-blocks.tsx +20 -0
  592. package/docs/consumer-skill/examples/manifest.json +28 -6
  593. package/docs/consumer-skill/examples/receipt.tsx +2 -2
  594. package/docs/consumer-skill/examples/scoped-directory.tsx +3 -3
  595. package/docs/consumer-skill/examples/website.tsx +1 -1
  596. package/docs/consumer-skill/references/agents-md.md +33 -0
  597. package/docs/consumer-skill/references/analytics.md +1 -1
  598. package/docs/consumer-skill/references/composition.md +139 -24
  599. package/docs/consumer-skill/references/design-contract.md +12 -3
  600. package/docs/consumer-skill/references/discovery.md +4 -0
  601. package/docs/consumer-skill/references/installation.md +33 -1
  602. package/docs/consumer-skill/references/integration.md +32 -1
  603. package/docs/consumer-skill/references/public-api.json +1051 -610
  604. package/docs/consumer-skill/references/review.md +44 -8
  605. package/docs/consumer-skill/references/theming.md +14 -4
  606. package/docs/consumer-skill/references/tokens.json +5 -2
  607. package/docs/consumer-skill/references/workflows.md +30 -9
  608. package/docs/consumer-skill/scripts/composition-policy.mjs +127 -6
  609. package/docs/consumer-skill/scripts/discovery.mjs +11 -3
  610. package/docs/consumer-skill/scripts/pin-button-defaults.mjs +95 -0
  611. package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
  612. package/package.json +13 -3
  613. package/dist/accordion-BRTcsp8J.js +0 -205
  614. package/dist/accordion-BRTcsp8J.js.map +0 -1
  615. package/dist/action-menu-Drxw_vJk.js +0 -265
  616. package/dist/action-menu-Drxw_vJk.js.map +0 -1
  617. package/dist/affordance-geometry.generated-CL84ZN9A.js.map +0 -1
  618. package/dist/ai-artifact-DLVdK0Py.js.map +0 -1
  619. package/dist/attachment-DbjUWsP0.js +0 -244
  620. package/dist/attachment-DbjUWsP0.js.map +0 -1
  621. package/dist/auth-CAQcasMV.js.map +0 -1
  622. package/dist/avatar-Bu2HhitA.js.map +0 -1
  623. package/dist/badge-CzId1Wlm.js +0 -92
  624. package/dist/badge-CzId1Wlm.js.map +0 -1
  625. package/dist/breadcrumbs-BuYz5SDU.js +0 -128
  626. package/dist/breadcrumbs-BuYz5SDU.js.map +0 -1
  627. package/dist/button-BZDasD04.js +0 -651
  628. package/dist/button-BZDasD04.js.map +0 -1
  629. package/dist/button-BZyfTvwm.js.map +0 -1
  630. package/dist/buttons-D_6KJvEE.js +0 -99
  631. package/dist/buttons-D_6KJvEE.js.map +0 -1
  632. package/dist/cards-qGSErLw_.js.map +0 -1
  633. package/dist/chart-Bsc5BICK.js.map +0 -1
  634. package/dist/checkbox-BQNDjUCh.js +0 -34
  635. package/dist/checkbox-BQNDjUCh.js.map +0 -1
  636. package/dist/choice-inputs-Mk3iWbhr.js +0 -725
  637. package/dist/choice-inputs-Mk3iWbhr.js.map +0 -1
  638. package/dist/code-block-DzHKRybS.js +0 -183
  639. package/dist/code-block-DzHKRybS.js.map +0 -1
  640. package/dist/combobox-BFnbJJp3.js.map +0 -1
  641. package/dist/combobox-hozNwUcc.js +0 -847
  642. package/dist/combobox-hozNwUcc.js.map +0 -1
  643. package/dist/command-BnmSchli.js.map +0 -1
  644. package/dist/comments-u5L0OGip.js.map +0 -1
  645. package/dist/containers-DqB-bSYE.js.map +0 -1
  646. package/dist/data-display-Bihs9Ven.js +0 -1342
  647. package/dist/data-display-Bihs9Ven.js.map +0 -1
  648. package/dist/date-DOKhJPu7.js +0 -140
  649. package/dist/date-DOKhJPu7.js.map +0 -1
  650. package/dist/date-picker-DzP5HQq7.js +0 -1541
  651. package/dist/date-picker-DzP5HQq7.js.map +0 -1
  652. package/dist/date-pickers-BpgGz7S-.js +0 -196
  653. package/dist/date-pickers-BpgGz7S-.js.map +0 -1
  654. package/dist/display-CS6Hbk18.js.map +0 -1
  655. package/dist/dropdown-menu-D-boNgGO.js.map +0 -1
  656. package/dist/feedback-CJkUAapr.js +0 -233
  657. package/dist/feedback-CJkUAapr.js.map +0 -1
  658. package/dist/field-affordance-recipes-uKY4MsZ_.js +0 -25
  659. package/dist/field-affordance-recipes-uKY4MsZ_.js.map +0 -1
  660. package/dist/field-state-recipes-DQQpiLWC.js +0 -11
  661. package/dist/field-state-recipes-DQQpiLWC.js.map +0 -1
  662. package/dist/filters-D6FF8L6s.js.map +0 -1
  663. package/dist/form-sizing-QP8aIRaW.js +0 -103
  664. package/dist/form-sizing-QP8aIRaW.js.map +0 -1
  665. package/dist/format-iamDSqs2.js +0 -110
  666. package/dist/format-iamDSqs2.js.map +0 -1
  667. package/dist/forms-B5NCbkSC.js.map +0 -1
  668. package/dist/forms-numeric-Crrm80Lm.js +0 -867
  669. package/dist/forms-numeric-Crrm80Lm.js.map +0 -1
  670. package/dist/header-kxruN3RM.js.map +0 -1
  671. package/dist/icon-badge-Btc6pQrp.js +0 -53
  672. package/dist/icon-badge-Btc6pQrp.js.map +0 -1
  673. package/dist/input-SX9V0AL3.js +0 -255
  674. package/dist/input-SX9V0AL3.js.map +0 -1
  675. package/dist/item-DE4YnuJx.js +0 -258
  676. package/dist/item-DE4YnuJx.js.map +0 -1
  677. package/dist/media-gallery-DLp3HAz0.js +0 -201
  678. package/dist/media-gallery-DLp3HAz0.js.map +0 -1
  679. package/dist/mentions-Cl0Kt_Pd.js +0 -565
  680. package/dist/mentions-Cl0Kt_Pd.js.map +0 -1
  681. package/dist/navigation-DnQSNMT0.js +0 -276
  682. package/dist/navigation-DnQSNMT0.js.map +0 -1
  683. package/dist/navigation-DyytsLRB.js +0 -265
  684. package/dist/navigation-DyytsLRB.js.map +0 -1
  685. package/dist/number-DasMFWEG.js +0 -269
  686. package/dist/number-DasMFWEG.js.map +0 -1
  687. package/dist/overlay.recipes-BxW5FIfK.js +0 -6
  688. package/dist/overlay.recipes-BxW5FIfK.js.map +0 -1
  689. package/dist/overlays-DUbs1KEi.js +0 -1011
  690. package/dist/overlays-DUbs1KEi.js.map +0 -1
  691. package/dist/page-hGmT4nWK.js.map +0 -1
  692. package/dist/page-header-D8nERkn5.js +0 -112
  693. package/dist/page-header-D8nERkn5.js.map +0 -1
  694. package/dist/popover-CghIYdQf.js.map +0 -1
  695. package/dist/primitives-C7ff0QaI.js +0 -337
  696. package/dist/primitives-C7ff0QaI.js.map +0 -1
  697. package/dist/progress-BroqrAyV.js.map +0 -1
  698. package/dist/rich-text-DlxDOtf4.js +0 -32
  699. package/dist/rich-text-DlxDOtf4.js.map +0 -1
  700. package/dist/rich-text-editor-BKyG7rWz.js +0 -574
  701. package/dist/rich-text-editor-BKyG7rWz.js.map +0 -1
  702. package/dist/rich-text-editor.recipes-B72Nfuze.js +0 -81
  703. package/dist/rich-text-editor.recipes-B72Nfuze.js.map +0 -1
  704. package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
  705. package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
  706. package/dist/sanitize-html-BG9FGe-j.js +0 -64
  707. package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
  708. package/dist/scroll-area-D-pIhEKl.js +0 -47
  709. package/dist/scroll-area-D-pIhEKl.js.map +0 -1
  710. package/dist/separator-BNIgG3au.js.map +0 -1
  711. package/dist/settings-DOTOzeZ2.js +0 -161
  712. package/dist/settings-DOTOzeZ2.js.map +0 -1
  713. package/dist/sheet-BFhrNehm.js +0 -205
  714. package/dist/sheet-BFhrNehm.js.map +0 -1
  715. package/dist/sidebar-CyR4XKwR.js.map +0 -1
  716. package/dist/sidebar-SvGJ0Zwi.js +0 -506
  717. package/dist/sidebar-SvGJ0Zwi.js.map +0 -1
  718. package/dist/skeleton-3F0uhYn3.js.map +0 -1
  719. package/dist/smart-card-DjGVV2xr.js +0 -584
  720. package/dist/smart-card-DjGVV2xr.js.map +0 -1
  721. package/dist/spinner-Cpf7oRkF.js.map +0 -1
  722. package/dist/structure.recipes-Bqhf9oIh.js.map +0 -1
  723. package/dist/surface-recipes-Dd__PD-w.js +0 -28
  724. package/dist/surface-recipes-Dd__PD-w.js.map +0 -1
  725. package/dist/table-CLtJTxoR.js +0 -147
  726. package/dist/table-CLtJTxoR.js.map +0 -1
  727. package/dist/table-CcRDZiLP.js.map +0 -1
  728. package/dist/tabs-BNgu7g0u.js +0 -188
  729. package/dist/tabs-BNgu7g0u.js.map +0 -1
  730. package/dist/text-inputs-DsR56TR-.js.map +0 -1
  731. package/dist/text.styles-Q4sGAIgA.js.map +0 -1
  732. package/dist/timelines-D1pkt3se.js.map +0 -1
  733. package/dist/track-recipes-LLPNVwFg.js +0 -10
  734. package/dist/track-recipes-LLPNVwFg.js.map +0 -1
  735. package/dist/tree-BtmYyMZV.js.map +0 -1
  736. package/dist/typography-BxQgiZyw.js +0 -96
  737. package/dist/typography-BxQgiZyw.js.map +0 -1
  738. package/dist/ui-provider-DRPn3qNl.js.map +0 -1
  739. package/dist/upload-CDbYw1WN.js.map +0 -1
  740. package/dist/upload-queue-CNd_hH_a.js.map +0 -1
  741. package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
  742. package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
  743. package/dist/utils-BvH9PSmq.js.map +0 -1
  744. package/dist/value-inputs-D0KCrfVC.js +0 -840
  745. package/dist/value-inputs-D0KCrfVC.js.map +0 -1
  746. package/dist/workspace-CcR8r-Nt.js +0 -395
  747. package/dist/workspace-CcR8r-Nt.js.map +0 -1
  748. /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-BrlnCwQd.js","names":["IconComponent","SidebarMenuBadge","resolveLayoutLinkRenderer","useLayoutLinkRenderer","useMemo","renderLink","toPath","href","isPathMatch","currentPath","currentUrl","path","getNavLabel","item","getNavKey","label","fallbackIndex","NavBadge","value","resolveNavBadge","handle","liveBadges","itemBadge","DynamicIcon","props","icon","IconComponent","iconMap","size","renderSidebarLink","useActivePath","useCallback","useCommandShortcut","enabled","onTrigger","handler","event","key","preventDefault"],"sources":["../src/components/layout/hooks/use-layout-link.tsx","../src/components/layout/sidebar/sidebar.utils.tsx","../src/components/layout/hooks/use-active-path.ts","../src/components/layout/hooks/use-command-shortcut.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport function useLayoutLinkRenderer({\n\trenderLink,\n}: LayoutNavigationAdapter = {}): LayoutLinkRenderer {\n\treturn useMemo(\n\t\t() => resolveLayoutLinkRenderer({ renderLink }),\n\t\t[renderLink],\n\t);\n}\n"," \n/** Sidebar utilities — pure path helpers, labels, icon rendering, badge pill. */\nimport * as React from 'react';\n\nimport { SidebarMenuBadge } from '../../base/sidebar';\n\nimport type { LayoutIconSource, LayoutLinkRenderer } from '../layout.types';\nimport type { SidebarNavItem } from './sidebar.types';\nimport type { ComponentScale } from '../../../lib/component-vocabulary';\n\nexport function toPath(href: string): string {\n\tif (href.startsWith('#/')) {\n\t\treturn href.slice(1).split('?')[0]?.split('#')[0] || '/';\n\t}\n\n\ttry {\n\t\treturn new URL(href, 'http://local.invalid').pathname;\n\t} catch {\n\t\treturn href;\n\t}\n}\n\nexport function isPathMatch(currentUrl: string, path: string): boolean {\n\tconst currentPath = toPath(currentUrl);\n\treturn currentPath === path || currentPath.startsWith(path + '/') || currentPath.startsWith(path + '?');\n}\n\nexport function getNavLabel(item: Pick<SidebarNavItem, 'label'>): React.ReactNode {\n\treturn item.label;\n}\n\nexport function getNavKey(item: SidebarNavItem, fallbackIndex?: number): React.Key {\n\tconst label = getNavLabel(item);\n\treturn item.handle ?? item.href ?? (typeof label === 'string' || typeof label === 'number' ? label : `nav-${fallbackIndex ?? 0}`);\n}\n\nexport function NavBadge({\n\tvalue,\n\tsize = 'md',\n}: {\n\t/** Current value. Controlled. */\n\tvalue: string | number;\n\t/** Size preset. */\n\tsize?: ComponentScale;\n}) {\n\treturn (\n\t\t<SidebarMenuBadge inline size={size}>\n\t\t\t{value}\n\t\t</SidebarMenuBadge>\n\t);\n}\n\nexport function resolveNavBadge(\n\thandle: string | undefined,\n\titemBadge: string | number | undefined,\n\tliveBadges: Record<string, string | number> | undefined,\n): string | number | undefined {\n\tif (handle && liveBadges && liveBadges[handle] != null) {\n\t\treturn liveBadges[handle];\n\t}\n\treturn itemBadge;\n}\n\nexport interface DynamicIconProps extends React.SVGProps<SVGSVGElement> {\n\t/** Leading glyph. */\n\ticon: LayoutIconSource;\n\t/** Resolves an item's icon name to a component, keeping navigation data serialisable. */\n\ticonMap?: Record<string, React.ComponentType<{ className?: string }>>;\n\t/** Size preset. */\n\tsize?: number;\n\tclassName?: string;\n}\n\nexport function DynamicIcon({\n\ticon,\n\ticonMap = {},\n\tsize = 20,\n\tclassName = 'size-icon',\n\t...props\n}: DynamicIconProps) {\n\tif (!icon) return null;\n\n\tif (typeof icon === 'string') {\n\t\tconst IconComponent = iconMap[icon];\n\t\treturn IconComponent ? <IconComponent className={className} /> : null;\n\t}\n\n\tif (\n\t\ttypeof icon === 'function'\n\t\t|| (typeof icon === 'object' && icon !== null && '$$typeof' in icon)\n\t) {\n\t\tconst IconComponent = icon as React.ElementType<React.SVGProps<SVGSVGElement>>;\n\t\treturn <IconComponent className={className} width={size} height={size} {...props} />;\n\t}\n\n\treturn null;\n}\n\nexport function renderSidebarLink(\n\trenderLink: LayoutLinkRenderer,\n\titem: SidebarNavItem,\n\tchildren: React.ReactNode,\n\tclassName?: string,\n\tactive?: boolean,\n) {\n\treturn renderLink({\n\t\thref: item.href,\n\t\tchildren,\n\t\tclassName,\n\t\tactive,\n\t\tdisabled: item.disabled || !item.href,\n\t\texternal: item.external,\n\t});\n}\n","import { useCallback } from 'react';\n\nimport { isPathMatch, toPath } from '../sidebar/sidebar.utils';\n\nexport function useActivePath(currentUrl = '/') {\n\treturn useCallback(\n\t\t(href?: string) => !!href && isPathMatch(currentUrl, toPath(href)),\n\t\t[currentUrl],\n\t);\n}\n","import { useEffect } from 'react';\n\nexport interface UseCommandShortcutOptions {\n\tkey: string;\n\tenabled?: boolean;\n\tonTrigger?: () => void;\n\tpreventDefault?: boolean;\n}\n\nexport function useCommandShortcut({\n\tkey,\n\tenabled = true,\n\tonTrigger,\n\tpreventDefault = true,\n}: UseCommandShortcutOptions) {\n\tuseEffect(() => {\n\t\tif (!enabled || !onTrigger || typeof document === 'undefined') return;\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tif (!(event.metaKey || event.ctrlKey)) return;\n\t\t\tif (event.key.toLowerCase() !== key.toLowerCase()) return;\n\t\t\tif (preventDefault) event.preventDefault();\n\t\t\tonTrigger();\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handler);\n\t\treturn () => document.removeEventListener('keydown', handler);\n\t}, [enabled, key, onTrigger, preventDefault]);\n}\n"],"mappings":";;;;;;AAQA,SAAgBG,EAAsB,EACrC,kBAC4B,CAAC,GAAuB;CACpD,OAAOC,QACAF,EAA0B,EAAE,cAAW,CAAC,GAC9C,CAACG,CAAU,CACZ;AACD;;;ACLA,SAAgBC,EAAO,GAAsB;CAC5C,IAAIC,EAAK,WAAW,IAAI,GACvB,OAAOA,EAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM;CAGtD,IAAI;EACH,OAAO,IAAI,IAAIA,GAAM,sBAAsB,CAAC,CAAC;CAC9C,QAAQ;EACP,OAAOA;CACR;AACD;AAEA,SAAgBC,EAAY,GAAoB,GAAuB;CACtE,IAAMC,IAAcH,EAAOI,CAAU;CACrC,OAAOD,MAAgBE,KAAQF,EAAY,WAAWE,IAAO,GAAG,KAAKF,EAAY,WAAWE,IAAO,GAAG;AACvG;AAEA,SAAgBC,EAAY,GAAsD;CACjF,OAAOC,EAAK;AACb;AAEA,SAAgBC,EAAU,GAAsB,GAAmC;CAClF,IAAMC,IAAQH,EAAYC,CAAI;CAC9B,OAAOA,EAAK,UAAUA,EAAK,SAAS,OAAOE,KAAU,YAAY,OAAOA,KAAU,WAAWA,IAAQ,OAAOC,KAAiB;AAC9H;AAEA,SAAgBC,EAAS,EACxB,UACA,UAAO,QAML;CACF,OACC,kBAAChB,GAAD;EAAkB,QAAA;EAAa;EAC7B,UAAAiB;CACgB,CAAA;AAEpB;AAEA,SAAgBC,EACf,GACA,GACA,GAC8B;CAI9B,OAHIC,KAAUC,KAAcA,EAAWD,MAAW,OAC1CC,EAAWD,KAEZE;AACR;AAYA,SAAgBC,EAAY,EAC3B,SACA,aAAU,CAAC,GACX,UAAO,IACP,eAAY,aACZ,GAAGC,KACiB;CACpB,IAAI,CAACC,GAAM,OAAO;CAElB,IAAI,OAAOA,KAAS,UAAU;EAC7B,IAAMC,IAAgBC,EAAQF;EAC9B,OAAOC,IAAgB,kBAACA,GAAD,EAA0B,aAAY,CAAA,IAAI;CAClE;CAUA,OAPC,OAAOD,KAAS,cACZ,OAAOA,KAAS,YAAYA,KAAiB,cAAcA,IAGxD,kBAACzB,GAAD;EAA0B;EAAW,OAAO4B;EAAM,QAAQA;EAAM,GAAIJ;CAAQ,CAAA,IAG7E;AACR;AAEA,SAAgBK,EACf,GACA,GACA,GACA,GACA,GACC;CACD,OAAOxB,EAAW;EACjB,MAAMQ,EAAK;EACX;EACA;EACA;EACA,UAAUA,EAAK,YAAY,CAACA,EAAK;EACjC,UAAUA,EAAK;CAChB,CAAC;AACF;;;AC7GA,SAAgBiB,EAAc,IAAa,KAAK;CAC/C,OAAOC,GACL,MAAkB,CAAC,CAACxB,KAAQC,EAAYE,GAAYJ,EAAOC,CAAI,CAAC,GACjE,CAACG,CAAU,CACZ;AACD;;;ACAA,SAAgBsB,EAAmB,EAClC,QACA,aAAU,IACV,cACA,oBAAiB,MACY;CAC7B,QAAgB;EACf,IAAI,CAACC,KAAW,CAACC,KAAa,OAAO,WAAa,KAAa;EAE/D,IAAMC,KAAW,MAAyB;GACzC,CAAMC,EAAM,WAAWA,EAAM,YACzBA,EAAM,IAAI,YAAY,MAAMC,EAAI,YAAY,MAC5CC,KAAgBF,EAAM,eAAe,GACzCF,EAAU;EACX;EAGA,OADA,SAAS,iBAAiB,WAAWC,CAAO,SAC/B,SAAS,oBAAoB,WAAWA,CAAO;CAC7D,GAAG;EAACF;EAASI;EAAKH;EAAWI;CAAc,CAAC;AAC7C"}
1
+ {"version":3,"file":"hooks-9k_TtmKh.js","names":["IconComponent","SidebarMenuBadge","resolveLayoutLinkRenderer","useLayoutLinkRenderer","useMemo","renderLink","toPath","href","isPathMatch","currentPath","currentUrl","path","getNavLabel","item","getNavKey","label","fallbackIndex","NavBadge","value","resolveNavBadge","handle","liveBadges","itemBadge","DynamicIcon","props","icon","IconComponent","iconMap","size","renderSidebarLink","useActivePath","useCallback","useCommandShortcut","enabled","onTrigger","handler","event","key","preventDefault"],"sources":["../src/components/layout/hooks/use-layout-link.tsx","../src/components/layout/sidebar/sidebar.utils.tsx","../src/components/layout/hooks/use-active-path.ts","../src/components/layout/hooks/use-command-shortcut.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport function useLayoutLinkRenderer({\n\trenderLink,\n}: LayoutNavigationAdapter = {}): LayoutLinkRenderer {\n\treturn useMemo(\n\t\t() => resolveLayoutLinkRenderer({ renderLink }),\n\t\t[renderLink],\n\t);\n}\n"," \n/** Sidebar utilities — pure path helpers, labels, icon rendering, badge pill. */\nimport * as React from 'react';\n\nimport { SidebarMenuBadge } from '../../base/sidebar';\n\nimport type { LayoutIconSource, LayoutLinkRenderer } from '../layout.types';\nimport type { SidebarNavItem } from './sidebar.types';\nimport type { ComponentScale } from '../../../lib/component-vocabulary';\n\nexport function toPath(href: string): string {\n\tif (href.startsWith('#/')) {\n\t\treturn href.slice(1).split('?')[0]?.split('#')[0] || '/';\n\t}\n\n\ttry {\n\t\treturn new URL(href, 'http://local.invalid').pathname;\n\t} catch {\n\t\treturn href;\n\t}\n}\n\nexport function isPathMatch(currentUrl: string, path: string): boolean {\n\tconst currentPath = toPath(currentUrl);\n\treturn currentPath === path || currentPath.startsWith(path + '/') || currentPath.startsWith(path + '?');\n}\n\nexport function getNavLabel(item: Pick<SidebarNavItem, 'label'>): React.ReactNode {\n\treturn item.label;\n}\n\nexport function getNavKey(item: SidebarNavItem, fallbackIndex?: number): React.Key {\n\tconst label = getNavLabel(item);\n\treturn item.handle ?? item.href ?? (typeof label === 'string' || typeof label === 'number' ? label : `nav-${fallbackIndex ?? 0}`);\n}\n\nexport function NavBadge({\n\tvalue,\n\tsize = 'md',\n}: {\n\t/** Current value. Controlled. */\n\tvalue: string | number;\n\t/** Size preset. */\n\tsize?: ComponentScale;\n}) {\n\treturn (\n\t\t<SidebarMenuBadge inline size={size}>\n\t\t\t{value}\n\t\t</SidebarMenuBadge>\n\t);\n}\n\nexport function resolveNavBadge(\n\thandle: string | undefined,\n\titemBadge: string | number | undefined,\n\tliveBadges: Record<string, string | number> | undefined,\n): string | number | undefined {\n\tif (handle && liveBadges && liveBadges[handle] != null) {\n\t\treturn liveBadges[handle];\n\t}\n\treturn itemBadge;\n}\n\nexport interface DynamicIconProps extends React.SVGProps<SVGSVGElement> {\n\t/** Leading glyph. */\n\ticon: LayoutIconSource;\n\t/** Resolves an item's icon name to a component, keeping navigation data serialisable. */\n\ticonMap?: Record<string, React.ComponentType<{ className?: string }>>;\n\t/** Size preset. */\n\tsize?: number;\n\tclassName?: string;\n}\n\nexport function DynamicIcon({\n\ticon,\n\ticonMap = {},\n\tsize = 20,\n\tclassName = 'size-icon',\n\t...props\n}: DynamicIconProps) {\n\tif (!icon) return null;\n\n\tif (typeof icon === 'string') {\n\t\tconst IconComponent = iconMap[icon];\n\t\treturn IconComponent ? <IconComponent className={className} /> : null;\n\t}\n\n\tif (\n\t\ttypeof icon === 'function'\n\t\t|| (typeof icon === 'object' && icon !== null && '$$typeof' in icon)\n\t) {\n\t\tconst IconComponent = icon as React.ElementType<React.SVGProps<SVGSVGElement>>;\n\t\treturn <IconComponent className={className} width={size} height={size} {...props} />;\n\t}\n\n\treturn null;\n}\n\nexport function renderSidebarLink(\n\trenderLink: LayoutLinkRenderer,\n\titem: SidebarNavItem,\n\tchildren: React.ReactNode,\n\tclassName?: string,\n\tactive?: boolean,\n) {\n\treturn renderLink({\n\t\thref: item.href,\n\t\tchildren,\n\t\tclassName,\n\t\tactive,\n\t\tdisabled: item.disabled || !item.href,\n\t\texternal: item.external,\n\t});\n}\n","import { useCallback } from 'react';\n\nimport { isPathMatch, toPath } from '../sidebar/sidebar.utils';\n\nexport function useActivePath(currentUrl = '/') {\n\treturn useCallback(\n\t\t(href?: string) => !!href && isPathMatch(currentUrl, toPath(href)),\n\t\t[currentUrl],\n\t);\n}\n","import { useEffect } from 'react';\n\nexport interface UseCommandShortcutOptions {\n\tkey: string;\n\tenabled?: boolean;\n\tonTrigger?: () => void;\n\tpreventDefault?: boolean;\n}\n\nexport function useCommandShortcut({\n\tkey,\n\tenabled = true,\n\tonTrigger,\n\tpreventDefault = true,\n}: UseCommandShortcutOptions) {\n\tuseEffect(() => {\n\t\tif (!enabled || !onTrigger || typeof document === 'undefined') return;\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tif (!(event.metaKey || event.ctrlKey)) return;\n\t\t\tif (event.key.toLowerCase() !== key.toLowerCase()) return;\n\t\t\tif (preventDefault) event.preventDefault();\n\t\t\tonTrigger();\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handler);\n\t\treturn () => document.removeEventListener('keydown', handler);\n\t}, [enabled, key, onTrigger, preventDefault]);\n}\n"],"mappings":";;;;;;AAQA,SAAgBG,EAAsB,EACrC,kBAC4B,CAAC,GAAuB;CACpD,OAAOC,QACAF,EAA0B,EAAE,cAAW,CAAC,GAC9C,CAACG,CAAU,CACZ;AACD;;;ACLA,SAAgBC,EAAO,GAAsB;CAC5C,IAAIC,EAAK,WAAW,IAAI,GACvB,OAAOA,EAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM;CAGtD,IAAI;EACH,OAAO,IAAI,IAAIA,GAAM,sBAAsB,CAAC,CAAC;CAC9C,QAAQ;EACP,OAAOA;CACR;AACD;AAEA,SAAgBC,EAAY,GAAoB,GAAuB;CACtE,IAAMC,IAAcH,EAAOI,CAAU;CACrC,OAAOD,MAAgBE,KAAQF,EAAY,WAAWE,IAAO,GAAG,KAAKF,EAAY,WAAWE,IAAO,GAAG;AACvG;AAEA,SAAgBC,EAAY,GAAsD;CACjF,OAAOC,EAAK;AACb;AAEA,SAAgBC,EAAU,GAAsB,GAAmC;CAClF,IAAMC,IAAQH,EAAYC,CAAI;CAC9B,OAAOA,EAAK,UAAUA,EAAK,SAAS,OAAOE,KAAU,YAAY,OAAOA,KAAU,WAAWA,IAAQ,OAAOC,KAAiB;AAC9H;AAEA,SAAgBC,EAAS,EACxB,UACA,UAAO,QAML;CACF,OACC,kBAAChB,GAAD;EAAkB,QAAA;EAAa;EAC7B,UAAAiB;CACgB,CAAA;AAEpB;AAEA,SAAgBC,EACf,GACA,GACA,GAC8B;CAI9B,OAHIC,KAAUC,KAAcA,EAAWD,MAAW,OAC1CC,EAAWD,KAEZE;AACR;AAYA,SAAgBC,EAAY,EAC3B,SACA,aAAU,CAAC,GACX,UAAO,IACP,eAAY,aACZ,GAAGC,KACiB;CACpB,IAAI,CAACC,GAAM,OAAO;CAElB,IAAI,OAAOA,KAAS,UAAU;EAC7B,IAAMC,IAAgBC,EAAQF;EAC9B,OAAOC,IAAgB,kBAACA,GAAD,EAA0B,aAAY,CAAA,IAAI;CAClE;CAUA,OAPC,OAAOD,KAAS,cACZ,OAAOA,KAAS,YAAYA,KAAiB,cAAcA,IAGxD,kBAACzB,GAAD;EAA0B;EAAW,OAAO4B;EAAM,QAAQA;EAAM,GAAIJ;CAAQ,CAAA,IAG7E;AACR;AAEA,SAAgBK,EACf,GACA,GACA,GACA,GACA,GACC;CACD,OAAOxB,EAAW;EACjB,MAAMQ,EAAK;EACX;EACA;EACA;EACA,UAAUA,EAAK,YAAY,CAACA,EAAK;EACjC,UAAUA,EAAK;CAChB,CAAC;AACF;;;AC7GA,SAAgBiB,EAAc,IAAa,KAAK;CAC/C,OAAOC,GACL,MAAkB,CAAC,CAACxB,KAAQC,EAAYE,GAAYJ,EAAOC,CAAI,CAAC,GACjE,CAACG,CAAU,CACZ;AACD;;;ACAA,SAAgBsB,EAAmB,EAClC,QACA,aAAU,IACV,cACA,oBAAiB,MACY;CAC7B,QAAgB;EACf,IAAI,CAACC,KAAW,CAACC,KAAa,OAAO,WAAa,KAAa;EAE/D,IAAMC,KAAW,MAAyB;GACzC,CAAMC,EAAM,WAAWA,EAAM,YACzBA,EAAM,IAAI,YAAY,MAAMC,EAAI,YAAY,MAC5CC,KAAgBF,EAAM,eAAe,GACzCF,EAAU;EACX;EAGA,OADA,SAAS,iBAAiB,WAAWC,CAAO,SAC/B,SAAS,oBAAoB,WAAWA,CAAO;CAC7D,GAAG;EAACF;EAASI;EAAKH;EAAWI;CAAc,CAAC;AAC7C"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./rich-text-editor.strings-BpnIQgMl.js";
1
+ import { t as e } from "./rich-text-editor.strings-CB59ekH2.js";
2
2
  import { fromHtml as t } from "hast-util-from-html";
3
3
  import { sanitize as n } from "hast-util-sanitize";
4
4
  import { toHtml as r } from "hast-util-to-html";
@@ -328,4 +328,4 @@ function w(e, t = {}) {
328
328
  //#endregion
329
329
  export { y as a, h as c, S as i, f as l, b as n, v as o, C as r, x as s, w as t, d as u };
330
330
 
331
- //# sourceMappingURL=http-CdEIHyQf.js.map
331
+ //# sourceMappingURL=http-D_6rOnzU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-CdEIHyQf.js","names":["defaultRichTextEditorStrings","schema","styleProperties","cleanProperties","node","key","value","style","split","declaration","name","parseEmailHtml","fromHtml","html","sanitizeEmailTree","cleaned","sanitize","tree","sanitizeEmailHtml","toHtml","emailHtmlText","defaultEmailComposerStrings","field","index","email","label","keys","id","emptyDocument","escapeEmailHtml","char","documentHtml","content","child","strings","text","mark","tags","level","bodyHtml","bodyMarkup","body","tokens","resolveValues","values","definitions","override","draft","context","template","renderEmail","unresolved","get","subject","visit","clean","inspectDraft","issues","rendered","renderError","r","result","issue","error","validate","recipientLabel","recipient","parseRecipient","match","createHttpSender","response","endpoint","options","message"],"sources":["../src/components/features/email-composer/email-html.ts","../src/components/features/email-composer/strings.ts","../src/components/features/email-composer/document.ts","../src/components/features/email-composer/engine.ts","../src/components/features/email-composer/http.ts"],"sourcesContent":["import { fromHtml } from 'hast-util-from-html';\nimport { sanitize, type Schema } from 'hast-util-sanitize';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nconst tags = ['a', 'b', 'blockquote', 'br', 'code', 'del', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'mark', 'ol', 'p', 'pre', 's', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tfoot', 'tr', 'u', 'ul'];\nconst schema: Schema = {\n\ttagNames: tags, attributes: { '*': ['style', 'align', 'width', 'height'], a: ['href', 'title'], img: ['src', 'alt', 'title'], span: ['dataPlaceholder'], ol: ['start'], td: ['colSpan', 'rowSpan'], th: ['colSpan', 'rowSpan'], table: ['cellPadding', 'cellSpacing', 'border'] },\n\tprotocols: { href: ['https', 'http', 'mailto'], src: ['https'] },\n\tstrip: ['script', 'style', 'iframe', 'object', 'embed', 'svg', 'math', 'template', 'form', 'input', 'button'],\n};\n// Email content has its own small allowlist; admin UI theme styles never enter it.\nconst styleProperties = new Set(['color', 'background', 'background-color', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-width', 'border-style', 'border-collapse', 'border-spacing', 'border-radius', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'width', 'max-width', 'min-width', 'height', 'font-family', 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration', 'vertical-align', 'white-space']);\nfunction cleanProperties(node: Root | RootContent): void {\n\tif (node.type === 'element') {\n\t\tfor (const key of ['href', 'src']) {\n\t\t\tconst value = node.properties[key];\n\t\t\tif (typeof value === 'string' && (value.trimStart().startsWith('//') || (key === 'src' && !/^https:\\/\\//i.test(value))))\n\t\t\t\tdelete node.properties[key];\n\t\t}\n\t\tconst style = node.properties.style;\n\t\tif (typeof style === 'string') {\n\t\t\tnode.properties.style = style.split(';').flatMap(declaration => {\n\t\t\t\tconst split = declaration.indexOf(':');\n\t\t\t\tconst name = declaration.slice(0, split).trim().toLowerCase();\n\t\t\t\tconst value = declaration.slice(split + 1).trim();\n\t\t\t\treturn split > 0 && styleProperties.has(name) && value && /^[\\w\\s#%.,()'\"+/-]+$/.test(value) && !/url\\s*\\(|expression|@|javascript|var\\s*\\(/i.test(value) ? [`${name}:${value}`] : [];\n\t\t\t}).join(';');\n\t\t\tif (!node.properties.style)\n\t\t\t\tdelete node.properties.style;\n\t\t}\n\t}\n\tif (node.type === 'root' || node.type === 'element')\n\t\tnode.children.forEach(cleanProperties);\n}\nexport function parseEmailHtml(html: string): Root { return fromHtml(html, { fragment: true }); }\nexport function sanitizeEmailTree(tree: Root): Root {\n\tconst cleaned = sanitize(tree, schema);\n\tif (cleaned.type !== 'root')\n\t\tthrow new Error('Expected an HTML document fragment.');\n\tcleanProperties(cleaned);\n\treturn cleaned;\n}\nexport function sanitizeEmailHtml(html: string): string { return toHtml(sanitizeEmailTree(parseEmailHtml(html))); }\nexport function emailHtmlText(tree: Root | RootContent): string {\n\tif (tree.type === 'text')\n\t\treturn tree.value;\n\tif (tree.type !== 'root' && tree.type !== 'element')\n\t\treturn '';\n\tif (tree.type === 'element' && tree.tagName === 'br')\n\t\treturn '\\n';\n\tconst text = tree.children.map(emailHtmlText).join('');\n\treturn text + (tree.type === 'element' && /^(p|div|li|h[1-6]|tr|blockquote|pre)$/.test(tree.tagName) ? '\\n' : '');\n}\n","import { defaultRichTextEditorStrings } from '../rich-text-editor/rich-text-editor.strings';\nexport const defaultEmailComposerStrings = {\n\ttoolbar: defaultRichTextEditorStrings.toolbar,\n\ttitle: 'New message', to: 'To', cc: 'Cc', bcc: 'Bcc', subject: 'Subject', body: 'Message body',\n\trecipientPlaceholder: 'Name <email@example.com>', addRecipient: (field: string) => `Add ${field} recipient`,\n\trecipientLabel: (field: string, index: number) => `${field} recipient ${index + 1}`,\n\tremoveRecipient: (email: string) => `Remove ${email}`, newRecipient: (field: string) => `New ${field} recipient`,\n\ttemplates: 'Templates', searchTemplates: 'Search templates…', noTemplates: 'No templates found.', importTemplate: 'Import template',\n\ttemplatesUnavailable: 'Templates are unavailable. Wait for loading to finish or retry.', loadingTemplates: 'Loading templates…', loadingVariables: 'Loading variables…', loadingRecipients: (field: string) => `Loading ${field} recipients…`, retry: 'Retry', dataUnavailable: 'Wait for required recipient and variable data to finish loading, or retry the failed request.',\n\tvariables: 'Variables', variablesDescription: 'Insert a variable into the message, or override its live value for this draft.', insertVariable: (label: string) => `Insert ${label}`, reset: 'Reset', dynamic: 'Dynamic value', overridden: 'Manual override',\n\tchoose: 'Choose…', editor: 'Editor', preview: 'Preview', previewLabel: 'Email body preview',\n\tsend: 'Send email', discard: 'Discard', working: 'Working…', sent: 'Email sent successfully.', discarded: 'Draft discarded.', close: 'Close composer', more: 'More actions',\n\tlink: 'Add or edit link', linkTitle: 'Message link', linkUrl: 'Link URL', closeLink: 'Close link editor', closeConversion: 'Close conversion confirmation', apply: 'Apply', cancel: 'Cancel',\n\tinvalidLink: 'Use an https://, http://, or mailto: URL.', convert: 'Convert to editable rich text',\n\tconvertTitle: 'Convert HTML layout?', convertDescription: 'Unsupported layout elements and styling may be lost when converting to rich text.',\n\tmissingRecipient: 'Add at least one recipient.', invalidRecipients: (field: string) => `Check ${field} addresses.`,\n\tinvalidSubject: 'Enter a single-line subject.', invalidResolvedSubject: 'Resolved subject must be a nonempty single line.', emptyBody: 'Enter a message.',\n\tmissingVariables: (keys: readonly string[]) => `Set values for: ${keys.join(', ')}.`,\n\tattributeVariables: 'Placeholders in HTML attributes are unsupported. Put placeholders in visible text.',\n\tunknownVariable: (key: string) => `Unknown placeholder: ${key}`, duplicateVariable: (key: string) => `Duplicate placeholder: ${key}`,\n\tunknownTemplate: (id: string) => `Unknown template: ${id}`, duplicateTemplate: 'Template IDs must be unique.',\n\teditableRequired: 'Use editable rich text for this operation.', editorNotReady: 'Editor is not ready.',\n\tunsupportedNode: (node: string) => `Unsupported document node: ${node}`, renderError: 'Unable to render the message.',\n\terrorTitle: 'Message could not be completed',\n};\nexport type EmailComposerStrings = typeof defaultEmailComposerStrings;\n","import type { JSONContent } from '@tiptap/react';\nimport type { EmailBody } from './types';\nimport { sanitizeEmailHtml } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nexport const emptyDocument: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\nexport const escapeEmailHtml = (value: string): string => value.replace(/[&<>\"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[char]!);\nexport function documentHtml(node: JSONContent, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\tconst content = () => (node.content ?? []).map(child => documentHtml(child, strings)).join('');\n\tif (node.type === 'text' || node.type === 'placeholderToken') {\n\t\tconst key = escapeEmailHtml(String(node.attrs?.key ?? ''));\n\t\tlet text = node.type === 'text' ? escapeEmailHtml(node.text ?? '') : `<span data-placeholder=\"${key}\">{{${key}}}</span>`;\n\t\tfor (const mark of node.marks ?? []) {\n\t\t\tconst tags: Record<string, string> = { bold: 'strong', italic: 'em', strike: 's', underline: 'u', code: 'code' };\n\t\t\tif (tags[mark.type])\n\t\t\t\ttext = `<${tags[mark.type]}>${text}</${tags[mark.type]}>`;\n\t\t\telse if (mark.type === 'link')\n\t\t\t\ttext = `<a href=\"${escapeEmailHtml(String(mark.attrs?.href ?? ''))}\">${text}</a>`;\n\t\t\telse\n\t\t\t\tthrow new Error(strings.unsupportedNode(mark.type));\n\t\t}\n\t\treturn text;\n\t}\n\tif (node.type === 'doc')\n\t\treturn content();\n\tif (node.type === 'hardBreak')\n\t\treturn '<br>';\n\tif (node.type === 'horizontalRule')\n\t\treturn '<hr>';\n\tif (node.type === 'heading') {\n\t\tconst level = Math.min(6, Math.max(1, Number(node.attrs?.level) || 2));\n\t\treturn `<h${level}>${content()}</h${level}>`;\n\t}\n\tif (node.type === 'codeBlock')\n\t\treturn `<pre><code>${content()}</code></pre>`;\n\tif (node.type === 'orderedList')\n\t\treturn `<ol start=\"${Math.max(1, Math.trunc(Number(node.attrs?.start) || 1))}\">${content()}</ol>`;\n\tconst tags: Record<string, string> = { paragraph: 'p', blockquote: 'blockquote', bulletList: 'ul', orderedList: 'ol', listItem: 'li' };\n\tif (!node.type || !tags[node.type])\n\t\tthrow new Error(strings.unsupportedNode(node.type ?? 'unknown'));\n\treturn `<${tags[node.type]}>${content()}</${tags[node.type]}>`;\n}\nexport function bodyHtml(body: EmailBody, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\treturn sanitizeEmailHtml(bodyMarkup(body, strings));\n}\nexport function bodyMarkup(body: EmailBody, strings: EmailComposerStrings): string {\n\treturn body.kind === 'html' ? body.html : body.kind === 'text' ? `<p>${escapeEmailHtml(body.text).replace(/\\n/g, '<br>')}</p>` : documentHtml(body.document, strings);\n}\n","import { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nimport { bodyMarkup } from './document';\nimport { parseEmailHtml, sanitizeEmailTree, emailHtmlText } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nimport type { ComposerDraft, ComposerIssue, EmailTemplate, PlaceholderDefinition, PlaceholderValue, PreparedEmail, Recipient } from './types';\nconst tokens = /\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g;\nexport function resolveValues<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>): Partial<Record<K, PlaceholderValue>> {\n\tconst values: Partial<Record<K, PlaceholderValue>> = Object.create(null);\n\tfor (const key of Object.keys(definitions) as K[]) {\n\t\tconst override = Object.hasOwn(draft.placeholderOverrides, key) ? draft.placeholderOverrides[key] : undefined;\n\t\tvalues[key] = override !== undefined ? override : definitions[key]!.resolve(context) ?? template?.defaults?.[key] ?? definitions[key]!.fallback ?? null;\n\t}\n\treturn values;\n}\nexport function renderEmail<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): {\n\temail: PreparedEmail<K>;\n\tunresolved: string[];\n} {\n\tconst values = resolveValues(draft, context, definitions, template);\n\tconst unresolved = new Set<string>();\n\tconst get = (key: string) => {\n\t\tconst value = Object.hasOwn(values, key) ? values[key as K] : null;\n\t\tif (value == null || value === '') {\n\t\t\tunresolved.add(key);\n\t\t\treturn `{{${key}}}`;\n\t\t}\n\t\treturn String(value);\n\t};\n\tconst subject = draft.subject.replace(tokens, (_, key: string) => get(key));\n\tconst tree = parseEmailHtml(bodyMarkup(draft.body, strings));\n\tfunction visit(node: Root | RootContent): void {\n\t\tif (node.type === 'element') {\n\t\t\tfor (const [key, value] of Object.entries(node.properties))\n\t\t\t\tif (key !== 'dataPlaceholder' && typeof value === 'string' && value.includes('{{'))\n\t\t\t\t\tthrow new Error(strings.attributeVariables);\n\t\t}\n\t\tif (node.type === 'root' || node.type === 'element')\n\t\t\tnode.children = node.children.map(child => {\n\t\t\t\tif (child.type === 'element' && child.properties.dataPlaceholder !== undefined)\n\t\t\t\t\treturn { type: 'text', value: get(String(child.properties.dataPlaceholder)) };\n\t\t\t\tif (child.type === 'text')\n\t\t\t\t\treturn { ...child, value: child.value.replace(tokens, (_, key: string) => get(key)) };\n\t\t\t\tvisit(child);\n\t\t\t\treturn child;\n\t\t\t});\n\t}\n\tvisit(tree);\n\tfor (const key of Object.keys(definitions) as K[])\n\t\tif (definitions[key]?.required && (values[key] == null || values[key] === ''))\n\t\t\tunresolved.add(key);\n\tfor (const key of template?.requiredPlaceholders ?? [])\n\t\tif (values[key] == null || values[key] === '')\n\t\t\tunresolved.add(key);\n\tconst clean = sanitizeEmailTree(tree);\n\treturn { email: { to: structuredClone(draft.to), cc: structuredClone(draft.cc), bcc: structuredClone(draft.bcc), subject, html: toHtml(clean), text: emailHtmlText(clean).trim(), templateId: draft.templateId, resolvedPlaceholders: values }, unresolved: [...unresolved] };\n}\nexport function inspectDraft<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings) {\n\tconst issues: ComposerIssue[] = [];\n\tlet rendered: ReturnType<typeof renderEmail<C, K>> | undefined;\n\tlet renderError = '';\n\tif (!draft.to.length)\n\t\tissues.push({ field: 'to', message: strings.missingRecipient });\n\tfor (const field of ['to', 'cc', 'bcc'] as const)\n\t\tif (draft[field].some(r => !/^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(r.email) || /[\\r\\n]/.test(r.name ?? '')))\n\t\t\tissues.push({ field, message: strings.invalidRecipients(strings[field]) });\n\tif (!draft.subject.trim() || /[\\r\\n]/.test(draft.subject))\n\t\tissues.push({ field: 'subject', message: strings.invalidSubject });\n\ttry {\n\t\tconst result = renderEmail(draft, context, definitions, template, strings);\n\t\trendered = result;\n\t\tif (!result.email.text.trim())\n\t\t\tissues.push({ field: 'body', message: strings.emptyBody });\n\t\tif (result.unresolved.length)\n\t\t\tissues.push({ field: 'placeholders', message: strings.missingVariables(result.unresolved) });\n\t\tif ((!result.email.subject.trim() || /[\\r\\n]/.test(result.email.subject)) && !issues.some(issue => issue.field === 'subject'))\n\t\t\tissues.push({ field: 'subject', message: strings.invalidResolvedSubject });\n\t}\n\tcatch (error) {\n\t\trenderError = error instanceof Error ? error.message : strings.renderError;\n\t\tissues.push({ field: 'body', message: renderError });\n\t}\n\treturn { rendered, renderError, issues };\n}\nexport function validate<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): ComposerIssue[] {\n\treturn inspectDraft(draft, context, definitions, template, strings).issues;\n}\nexport function recipientLabel(recipient: Recipient): string { return recipient.name ? `${recipient.name} <${recipient.email}>` : recipient.email; }\nexport function parseRecipient(value: string): Recipient {\n\tconst match = value.trim().match(/^(.*?)\\s*<([^<>]+)>$/);\n\treturn match ? { name: match[1].trim(), email: match[2].trim() } : { email: value.trim() };\n}\n","import type { PreparedEmail } from './types';\n/** Optional sender adapter. The consuming application owns the endpoint and delivery. */\nexport function createHttpSender(endpoint: string, options: {\n\theaders?: Record<string, string>;\n\ttimeoutMs?: number;\n} = {}) {\n\treturn async <K extends string>(email: PreparedEmail<K>): Promise<void> => {\n\t\tconst response = await fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(email), signal: AbortSignal.timeout(options.timeoutMs ?? 30000) });\n\t\tif (!response.ok) {\n\t\t\tlet message = `Email request failed (${response.status}).`;\n\t\t\ttry {\n\t\t\t\tconst result: unknown = await response.json();\n\t\t\t\tif (result && typeof result === 'object' && 'message' in result && typeof result.message === 'string')\n\t\t\t\t\tmessage = result.message;\n\t\t\t}\n\t\t\tcatch { /* Response bodies are optional. */ }\n\t\t\tthrow new Error(message);\n\t\t}\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http-D_6rOnzU.js","names":["defaultRichTextEditorStrings","schema","styleProperties","cleanProperties","node","key","value","style","split","declaration","name","parseEmailHtml","fromHtml","html","sanitizeEmailTree","cleaned","sanitize","tree","sanitizeEmailHtml","toHtml","emailHtmlText","defaultEmailComposerStrings","field","index","email","label","keys","id","emptyDocument","escapeEmailHtml","char","documentHtml","content","child","strings","text","mark","tags","level","bodyHtml","bodyMarkup","body","tokens","resolveValues","values","definitions","override","draft","context","template","renderEmail","unresolved","get","subject","visit","clean","inspectDraft","issues","rendered","renderError","r","result","issue","error","validate","recipientLabel","recipient","parseRecipient","match","createHttpSender","response","endpoint","options","message"],"sources":["../src/components/features/email-composer/email-html.ts","../src/components/features/email-composer/strings.ts","../src/components/features/email-composer/document.ts","../src/components/features/email-composer/engine.ts","../src/components/features/email-composer/http.ts"],"sourcesContent":["import { fromHtml } from 'hast-util-from-html';\nimport { sanitize, type Schema } from 'hast-util-sanitize';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nconst tags = ['a', 'b', 'blockquote', 'br', 'code', 'del', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'mark', 'ol', 'p', 'pre', 's', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tfoot', 'tr', 'u', 'ul'];\nconst schema: Schema = {\n\ttagNames: tags, attributes: { '*': ['style', 'align', 'width', 'height'], a: ['href', 'title'], img: ['src', 'alt', 'title'], span: ['dataPlaceholder'], ol: ['start'], td: ['colSpan', 'rowSpan'], th: ['colSpan', 'rowSpan'], table: ['cellPadding', 'cellSpacing', 'border'] },\n\tprotocols: { href: ['https', 'http', 'mailto'], src: ['https'] },\n\tstrip: ['script', 'style', 'iframe', 'object', 'embed', 'svg', 'math', 'template', 'form', 'input', 'button'],\n};\n// Email content has its own small allowlist; admin UI theme styles never enter it.\nconst styleProperties = new Set(['color', 'background', 'background-color', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-width', 'border-style', 'border-collapse', 'border-spacing', 'border-radius', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'width', 'max-width', 'min-width', 'height', 'font-family', 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration', 'vertical-align', 'white-space']);\nfunction cleanProperties(node: Root | RootContent): void {\n\tif (node.type === 'element') {\n\t\tfor (const key of ['href', 'src']) {\n\t\t\tconst value = node.properties[key];\n\t\t\tif (typeof value === 'string' && (value.trimStart().startsWith('//') || (key === 'src' && !/^https:\\/\\//i.test(value))))\n\t\t\t\tdelete node.properties[key];\n\t\t}\n\t\tconst style = node.properties.style;\n\t\tif (typeof style === 'string') {\n\t\t\tnode.properties.style = style.split(';').flatMap(declaration => {\n\t\t\t\tconst split = declaration.indexOf(':');\n\t\t\t\tconst name = declaration.slice(0, split).trim().toLowerCase();\n\t\t\t\tconst value = declaration.slice(split + 1).trim();\n\t\t\t\treturn split > 0 && styleProperties.has(name) && value && /^[\\w\\s#%.,()'\"+/-]+$/.test(value) && !/url\\s*\\(|expression|@|javascript|var\\s*\\(/i.test(value) ? [`${name}:${value}`] : [];\n\t\t\t}).join(';');\n\t\t\tif (!node.properties.style)\n\t\t\t\tdelete node.properties.style;\n\t\t}\n\t}\n\tif (node.type === 'root' || node.type === 'element')\n\t\tnode.children.forEach(cleanProperties);\n}\nexport function parseEmailHtml(html: string): Root { return fromHtml(html, { fragment: true }); }\nexport function sanitizeEmailTree(tree: Root): Root {\n\tconst cleaned = sanitize(tree, schema);\n\tif (cleaned.type !== 'root')\n\t\tthrow new Error('Expected an HTML document fragment.');\n\tcleanProperties(cleaned);\n\treturn cleaned;\n}\nexport function sanitizeEmailHtml(html: string): string { return toHtml(sanitizeEmailTree(parseEmailHtml(html))); }\nexport function emailHtmlText(tree: Root | RootContent): string {\n\tif (tree.type === 'text')\n\t\treturn tree.value;\n\tif (tree.type !== 'root' && tree.type !== 'element')\n\t\treturn '';\n\tif (tree.type === 'element' && tree.tagName === 'br')\n\t\treturn '\\n';\n\tconst text = tree.children.map(emailHtmlText).join('');\n\treturn text + (tree.type === 'element' && /^(p|div|li|h[1-6]|tr|blockquote|pre)$/.test(tree.tagName) ? '\\n' : '');\n}\n","import { defaultRichTextEditorStrings } from '../rich-text-editor/rich-text-editor.strings';\nexport const defaultEmailComposerStrings = {\n\ttoolbar: defaultRichTextEditorStrings.toolbar,\n\ttitle: 'New message', to: 'To', cc: 'Cc', bcc: 'Bcc', subject: 'Subject', body: 'Message body',\n\trecipientPlaceholder: 'Name <email@example.com>', addRecipient: (field: string) => `Add ${field} recipient`,\n\trecipientLabel: (field: string, index: number) => `${field} recipient ${index + 1}`,\n\tremoveRecipient: (email: string) => `Remove ${email}`, newRecipient: (field: string) => `New ${field} recipient`,\n\ttemplates: 'Templates', searchTemplates: 'Search templates…', noTemplates: 'No templates found.', importTemplate: 'Import template',\n\ttemplatesUnavailable: 'Templates are unavailable. Wait for loading to finish or retry.', loadingTemplates: 'Loading templates…', loadingVariables: 'Loading variables…', loadingRecipients: (field: string) => `Loading ${field} recipients…`, retry: 'Retry', dataUnavailable: 'Wait for required recipient and variable data to finish loading, or retry the failed request.',\n\tvariables: 'Variables', variablesDescription: 'Insert a variable into the message, or override its live value for this draft.', insertVariable: (label: string) => `Insert ${label}`, reset: 'Reset', dynamic: 'Dynamic value', overridden: 'Manual override',\n\tchoose: 'Choose…', editor: 'Editor', preview: 'Preview', previewLabel: 'Email body preview',\n\tsend: 'Send email', discard: 'Discard', working: 'Working…', sent: 'Email sent successfully.', discarded: 'Draft discarded.', close: 'Close composer', more: 'More actions',\n\tlink: 'Add or edit link', linkTitle: 'Message link', linkUrl: 'Link URL', closeLink: 'Close link editor', closeConversion: 'Close conversion confirmation', apply: 'Apply', cancel: 'Cancel',\n\tinvalidLink: 'Use an https://, http://, or mailto: URL.', convert: 'Convert to editable rich text',\n\tconvertTitle: 'Convert HTML layout?', convertDescription: 'Unsupported layout elements and styling may be lost when converting to rich text.',\n\tmissingRecipient: 'Add at least one recipient.', invalidRecipients: (field: string) => `Check ${field} addresses.`,\n\tinvalidSubject: 'Enter a single-line subject.', invalidResolvedSubject: 'Resolved subject must be a nonempty single line.', emptyBody: 'Enter a message.',\n\tmissingVariables: (keys: readonly string[]) => `Set values for: ${keys.join(', ')}.`,\n\tattributeVariables: 'Placeholders in HTML attributes are unsupported. Put placeholders in visible text.',\n\tunknownVariable: (key: string) => `Unknown placeholder: ${key}`, duplicateVariable: (key: string) => `Duplicate placeholder: ${key}`,\n\tunknownTemplate: (id: string) => `Unknown template: ${id}`, duplicateTemplate: 'Template IDs must be unique.',\n\teditableRequired: 'Use editable rich text for this operation.', editorNotReady: 'Editor is not ready.',\n\tunsupportedNode: (node: string) => `Unsupported document node: ${node}`, renderError: 'Unable to render the message.',\n\terrorTitle: 'Message could not be completed',\n};\nexport type EmailComposerStrings = typeof defaultEmailComposerStrings;\n","import type { JSONContent } from '@tiptap/react';\nimport type { EmailBody } from './types';\nimport { sanitizeEmailHtml } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nexport const emptyDocument: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\nexport const escapeEmailHtml = (value: string): string => value.replace(/[&<>\"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[char]!);\nexport function documentHtml(node: JSONContent, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\tconst content = () => (node.content ?? []).map(child => documentHtml(child, strings)).join('');\n\tif (node.type === 'text' || node.type === 'placeholderToken') {\n\t\tconst key = escapeEmailHtml(String(node.attrs?.key ?? ''));\n\t\tlet text = node.type === 'text' ? escapeEmailHtml(node.text ?? '') : `<span data-placeholder=\"${key}\">{{${key}}}</span>`;\n\t\tfor (const mark of node.marks ?? []) {\n\t\t\tconst tags: Record<string, string> = { bold: 'strong', italic: 'em', strike: 's', underline: 'u', code: 'code' };\n\t\t\tif (tags[mark.type])\n\t\t\t\ttext = `<${tags[mark.type]}>${text}</${tags[mark.type]}>`;\n\t\t\telse if (mark.type === 'link')\n\t\t\t\ttext = `<a href=\"${escapeEmailHtml(String(mark.attrs?.href ?? ''))}\">${text}</a>`;\n\t\t\telse\n\t\t\t\tthrow new Error(strings.unsupportedNode(mark.type));\n\t\t}\n\t\treturn text;\n\t}\n\tif (node.type === 'doc')\n\t\treturn content();\n\tif (node.type === 'hardBreak')\n\t\treturn '<br>';\n\tif (node.type === 'horizontalRule')\n\t\treturn '<hr>';\n\tif (node.type === 'heading') {\n\t\tconst level = Math.min(6, Math.max(1, Number(node.attrs?.level) || 2));\n\t\treturn `<h${level}>${content()}</h${level}>`;\n\t}\n\tif (node.type === 'codeBlock')\n\t\treturn `<pre><code>${content()}</code></pre>`;\n\tif (node.type === 'orderedList')\n\t\treturn `<ol start=\"${Math.max(1, Math.trunc(Number(node.attrs?.start) || 1))}\">${content()}</ol>`;\n\tconst tags: Record<string, string> = { paragraph: 'p', blockquote: 'blockquote', bulletList: 'ul', orderedList: 'ol', listItem: 'li' };\n\tif (!node.type || !tags[node.type])\n\t\tthrow new Error(strings.unsupportedNode(node.type ?? 'unknown'));\n\treturn `<${tags[node.type]}>${content()}</${tags[node.type]}>`;\n}\nexport function bodyHtml(body: EmailBody, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\treturn sanitizeEmailHtml(bodyMarkup(body, strings));\n}\nexport function bodyMarkup(body: EmailBody, strings: EmailComposerStrings): string {\n\treturn body.kind === 'html' ? body.html : body.kind === 'text' ? `<p>${escapeEmailHtml(body.text).replace(/\\n/g, '<br>')}</p>` : documentHtml(body.document, strings);\n}\n","import { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nimport { bodyMarkup } from './document';\nimport { parseEmailHtml, sanitizeEmailTree, emailHtmlText } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nimport type { ComposerDraft, ComposerIssue, EmailTemplate, PlaceholderDefinition, PlaceholderValue, PreparedEmail, Recipient } from './types';\nconst tokens = /\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g;\nexport function resolveValues<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>): Partial<Record<K, PlaceholderValue>> {\n\tconst values: Partial<Record<K, PlaceholderValue>> = Object.create(null);\n\tfor (const key of Object.keys(definitions) as K[]) {\n\t\tconst override = Object.hasOwn(draft.placeholderOverrides, key) ? draft.placeholderOverrides[key] : undefined;\n\t\tvalues[key] = override !== undefined ? override : definitions[key]!.resolve(context) ?? template?.defaults?.[key] ?? definitions[key]!.fallback ?? null;\n\t}\n\treturn values;\n}\nexport function renderEmail<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): {\n\temail: PreparedEmail<K>;\n\tunresolved: string[];\n} {\n\tconst values = resolveValues(draft, context, definitions, template);\n\tconst unresolved = new Set<string>();\n\tconst get = (key: string) => {\n\t\tconst value = Object.hasOwn(values, key) ? values[key as K] : null;\n\t\tif (value == null || value === '') {\n\t\t\tunresolved.add(key);\n\t\t\treturn `{{${key}}}`;\n\t\t}\n\t\treturn String(value);\n\t};\n\tconst subject = draft.subject.replace(tokens, (_, key: string) => get(key));\n\tconst tree = parseEmailHtml(bodyMarkup(draft.body, strings));\n\tfunction visit(node: Root | RootContent): void {\n\t\tif (node.type === 'element') {\n\t\t\tfor (const [key, value] of Object.entries(node.properties))\n\t\t\t\tif (key !== 'dataPlaceholder' && typeof value === 'string' && value.includes('{{'))\n\t\t\t\t\tthrow new Error(strings.attributeVariables);\n\t\t}\n\t\tif (node.type === 'root' || node.type === 'element')\n\t\t\tnode.children = node.children.map(child => {\n\t\t\t\tif (child.type === 'element' && child.properties.dataPlaceholder !== undefined)\n\t\t\t\t\treturn { type: 'text', value: get(String(child.properties.dataPlaceholder)) };\n\t\t\t\tif (child.type === 'text')\n\t\t\t\t\treturn { ...child, value: child.value.replace(tokens, (_, key: string) => get(key)) };\n\t\t\t\tvisit(child);\n\t\t\t\treturn child;\n\t\t\t});\n\t}\n\tvisit(tree);\n\tfor (const key of Object.keys(definitions) as K[])\n\t\tif (definitions[key]?.required && (values[key] == null || values[key] === ''))\n\t\t\tunresolved.add(key);\n\tfor (const key of template?.requiredPlaceholders ?? [])\n\t\tif (values[key] == null || values[key] === '')\n\t\t\tunresolved.add(key);\n\tconst clean = sanitizeEmailTree(tree);\n\treturn { email: { to: structuredClone(draft.to), cc: structuredClone(draft.cc), bcc: structuredClone(draft.bcc), subject, html: toHtml(clean), text: emailHtmlText(clean).trim(), templateId: draft.templateId, resolvedPlaceholders: values }, unresolved: [...unresolved] };\n}\nexport function inspectDraft<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings) {\n\tconst issues: ComposerIssue[] = [];\n\tlet rendered: ReturnType<typeof renderEmail<C, K>> | undefined;\n\tlet renderError = '';\n\tif (!draft.to.length)\n\t\tissues.push({ field: 'to', message: strings.missingRecipient });\n\tfor (const field of ['to', 'cc', 'bcc'] as const)\n\t\tif (draft[field].some(r => !/^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(r.email) || /[\\r\\n]/.test(r.name ?? '')))\n\t\t\tissues.push({ field, message: strings.invalidRecipients(strings[field]) });\n\tif (!draft.subject.trim() || /[\\r\\n]/.test(draft.subject))\n\t\tissues.push({ field: 'subject', message: strings.invalidSubject });\n\ttry {\n\t\tconst result = renderEmail(draft, context, definitions, template, strings);\n\t\trendered = result;\n\t\tif (!result.email.text.trim())\n\t\t\tissues.push({ field: 'body', message: strings.emptyBody });\n\t\tif (result.unresolved.length)\n\t\t\tissues.push({ field: 'placeholders', message: strings.missingVariables(result.unresolved) });\n\t\tif ((!result.email.subject.trim() || /[\\r\\n]/.test(result.email.subject)) && !issues.some(issue => issue.field === 'subject'))\n\t\t\tissues.push({ field: 'subject', message: strings.invalidResolvedSubject });\n\t}\n\tcatch (error) {\n\t\trenderError = error instanceof Error ? error.message : strings.renderError;\n\t\tissues.push({ field: 'body', message: renderError });\n\t}\n\treturn { rendered, renderError, issues };\n}\nexport function validate<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): ComposerIssue[] {\n\treturn inspectDraft(draft, context, definitions, template, strings).issues;\n}\nexport function recipientLabel(recipient: Recipient): string { return recipient.name ? `${recipient.name} <${recipient.email}>` : recipient.email; }\nexport function parseRecipient(value: string): Recipient {\n\tconst match = value.trim().match(/^(.*?)\\s*<([^<>]+)>$/);\n\treturn match ? { name: match[1].trim(), email: match[2].trim() } : { email: value.trim() };\n}\n","import type { PreparedEmail } from './types';\n/** Optional sender adapter. The consuming application owns the endpoint and delivery. */\nexport function createHttpSender(endpoint: string, options: {\n\theaders?: Record<string, string>;\n\ttimeoutMs?: number;\n} = {}) {\n\treturn async <K extends string>(email: PreparedEmail<K>): Promise<void> => {\n\t\tconst response = await fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(email), signal: AbortSignal.timeout(options.timeoutMs ?? 30000) });\n\t\tif (!response.ok) {\n\t\t\tlet message = `Email request failed (${response.status}).`;\n\t\t\ttry {\n\t\t\t\tconst result: unknown = await response.json();\n\t\t\t\tif (result && typeof result === 'object' && 'message' in result && typeof result.message === 'string')\n\t\t\t\t\tmessage = result.message;\n\t\t\t}\n\t\t\tcatch { /* Response bodies are optional. */ }\n\t\t\tthrow new Error(message);\n\t\t}\n\t};\n}\n"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { s as e, v as t } from "./ui-provider-1D_NSYzO.js";
3
+ import { t as n } from "./utils-l5LpDw2z.js";
4
+ import { n as r } from "./icon-size-B6PVwjbC.js";
5
+ import { r as i } from "./tone-recipes-CPoExcTE.js";
6
+ import { createElement as a } from "react";
7
+ import { jsx as o } from "react/jsx-runtime";
8
+ //#region src/components/base/display/icon-badge/icon-badge.tsx
9
+ var s = {
10
+ sm: {
11
+ box: "size-avatar-sm",
12
+ icon: "size-icon-sm"
13
+ },
14
+ md: {
15
+ box: "size-avatar",
16
+ icon: "size-icon"
17
+ },
18
+ lg: {
19
+ box: "size-avatar-lg",
20
+ icon: "size-icon-lg"
21
+ }
22
+ }, c = {
23
+ neutral: "bg-muted text-muted-foreground",
24
+ primary: `${i.primary.tint} ${i.primary.ink}`,
25
+ secondary: "bg-foreground/8 text-muted-foreground",
26
+ success: `${i.success.tint} ${i.success.ink}`,
27
+ warning: `${i.warning.tint} ${i.warning.ink}`,
28
+ destructive: `${i.destructive.tint} ${i.destructive.ink}`,
29
+ info: `${i.info.tint} ${i.info.ink}`
30
+ }, l = {
31
+ neutral: "bg-foreground text-background",
32
+ primary: "bg-primary text-primary-foreground",
33
+ secondary: "bg-secondary text-secondary-foreground",
34
+ success: "bg-success text-success-foreground",
35
+ warning: "bg-warning text-warning-foreground",
36
+ destructive: "bg-destructive text-destructive-foreground",
37
+ info: "bg-info text-info-foreground"
38
+ };
39
+ function u({ icon: i, children: u, size: d, shape: f = "circle", tone: p = "primary", solid: m = !1, bordered: h = !1, className: g, role: _, "aria-hidden": v, "aria-label": y, "aria-labelledby": b, ...x }) {
40
+ let { defaultScale: S } = e(), C = t(d, S), w = s[C], T = m ? l[p] : c[p], E = !!(y || b);
41
+ return /* @__PURE__ */ o("span", {
42
+ role: _ ?? (E ? "img" : void 0),
43
+ "aria-hidden": v ?? (!E || void 0),
44
+ "aria-label": y,
45
+ "aria-labelledby": b,
46
+ className: n("icon-badge--component", "box-border inline-flex shrink-0 items-center justify-center", f === "circle" ? "rounded-full" : "rounded-radius", w.box, r[C], T, h && "border border-border/60", g),
47
+ ...x,
48
+ children: i ? a(i, { className: w.icon }) : u
49
+ });
50
+ }
51
+ u.displayName = "IconBadge";
52
+ //#endregion
53
+ export { u as t };
54
+
55
+ //# sourceMappingURL=icon-badge-CAuKupo9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-badge-CAuKupo9.js","names":["useDensityConfig","resolveComponentScale","cn","ICON_DESCENDANT_SIZE_CLASSNAMES","toneRecipes","SIZE_MAP","TONE_TINT","TONE_SOLID","IconBadge","Icon","sizeProp","ariaHidden","ariaLabel","ariaLabelledBy","props","size","defaultScale","sizes","tones","solid","tone","hasAccessibleName","role","shape","bordered","className","createElement","children"],"sources":["../src/components/base/display/icon-badge/icon-badge.tsx"],"sourcesContent":["/**\n * IconBadge — circular or square icon container with a tinted background.\n * Workhorse for \"row leading icon\" and \"feature illustration\" patterns —\n * coupon checks, conversation initials, search-result tones, AI-bot avatars.\n *\n * Tones reuse the shadcn semantic tokens, with the foreground colour picked\n * to read against its tone's shared tint (`toneRecipes`, contrast-tested).\n * For a fully-saturated mark (primary fill, inverse foreground), use\n * `tone=\"primary\"` and pass `solid`.\n *\n * Warning takes `--warning-accent` rather than `--warning-foreground`: the\n * latter is the colour for text on a SOLID warning fill and stays near-black\n * in both themes, so on a 20% tint it vanished in dark (1.87 contrast). Amber\n * is intrinsically light, so — as with `--primary-accent` — the tone needs a\n * separate foreground token that darkens in light and brightens in dark.\n */\nimport type { ComponentProps, ElementType, ReactNode } from 'react';\nimport { createElement } from 'react';\n\nimport { useDensityConfig, type ComponentScale } from '../../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../../lib/ui-provider/scale';\nimport { cn } from '../../../../lib/utils';\nimport type { SemanticTone } from '../../../../lib/component-vocabulary';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\nimport { ICON_DESCENDANT_SIZE_CLASSNAMES } from '../icon-size';\n\nexport type IconBadgeSize = ComponentScale;\nexport type IconBadgeShape = 'circle' | 'square';\nexport type IconBadgeTone = SemanticTone;\n\nexport interface IconBadgeProps extends Omit<ComponentProps<'span'>, 'children'> {\n\t/** Leading glyph. */\n\ticon?: ElementType;\n\tchildren?: ReactNode;\n\t/** Size preset. */\n\tsize?: IconBadgeSize;\n\tshape?: IconBadgeShape;\n\t/** Semantic tone driving the entry's colour. */\n\ttone?: IconBadgeTone;\n\t/** When true, fills the badge with the tone color and inverts the icon. */\n\tsolid?: boolean;\n\t/**\n\t * When true, renders a hairline `border-border/60` around the badge.\n\t * Useful for compact \"secret list\" / \"key list\" rows where the icon\n\t * needs a subtle outline against the surrounding card surface\n\t * (see `blocks/admin/api-key-list`).\n\t */\n\tbordered?: boolean;\n}\n\nconst SIZE_MAP: Record<IconBadgeSize, { box: string; icon: string }> = {\n\tsm: { box: 'size-avatar-sm', icon: 'size-icon-sm' },\n\tmd: { box: 'size-avatar', icon: 'size-icon' },\n\tlg: { box: 'size-avatar-lg', icon: 'size-icon-lg' },\n};\n\nconst TONE_TINT: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: `${toneRecipes.primary.tint} ${toneRecipes.primary.ink}`,\n\tsecondary: 'bg-foreground/8 text-muted-foreground',\n\tsuccess: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`,\n\twarning: `${toneRecipes.warning.tint} ${toneRecipes.warning.ink}`,\n\tdestructive: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`,\n\tinfo: `${toneRecipes.info.tint} ${toneRecipes.info.ink}`,\n};\n\nconst TONE_SOLID: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-foreground text-background',\n\tprimary: 'bg-primary text-primary-foreground',\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\tsuccess: 'bg-success text-success-foreground',\n\twarning: 'bg-warning text-warning-foreground',\n\tdestructive: 'bg-destructive text-destructive-foreground',\n\tinfo: 'bg-info text-info-foreground',\n};\n\nexport function IconBadge({\n\ticon: Icon,\n\tchildren,\n\tsize: sizeProp,\n\tshape = 'circle',\n\ttone = 'primary',\n\tsolid = false,\n\tbordered = false,\n\tclassName,\n\trole,\n\t'aria-hidden': ariaHidden,\n\t'aria-label': ariaLabel,\n\t'aria-labelledby': ariaLabelledBy,\n\t...props\n}: IconBadgeProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst sizes = SIZE_MAP[size];\n\tconst tones = solid ? TONE_SOLID[tone] : TONE_TINT[tone];\n\tconst hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);\n\n\treturn (\n\t\t<span\n\t\t\trole={role ?? (hasAccessibleName ? 'img' : undefined)}\n\t\t\taria-hidden={ariaHidden ?? (hasAccessibleName ? undefined : true)}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\tclassName={cn('icon-badge--component', \n\t\t\t\t'box-border inline-flex shrink-0 items-center justify-center',\n\t\t\t\tshape === 'circle' ? 'rounded-full' : 'rounded-radius',\n\t\t\t\tsizes.box,\n\t\t\t\t// A glyph passed as children takes the size's icon role, like `icon`,\n\t\t\t\t// unless it brings its own size class.\n\t\t\t\tICON_DESCENDANT_SIZE_CLASSNAMES[size],\n\t\t\t\ttones,\n\t\t\t\tbordered && 'border border-border/60',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{Icon ? createElement(Icon, { className: sizes.icon }) : children}\n\t\t</span>\n\t);\n}\n\nIconBadge.displayName = 'IconBadge';\n"],"mappings":";;;;;;;;AAkDA,IAAMK,IAAiE;CACtE,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;CAClD,IAAI;EAAE,KAAK;EAAe,MAAM;CAAY;CAC5C,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;AACnD,GAEMC,IAA2C;CAChD,SAAS;CACT,SAAS,GAAGF,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,WAAW;CACX,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,aAAa,GAAGA,EAAY,YAAY,KAAK,GAAGA,EAAY,YAAY;CACxE,MAAM,GAAGA,EAAY,KAAK,KAAK,GAAGA,EAAY,KAAK;AACpD,GAEMG,IAA4C;CACjD,SAAS;CACT,SAAS;CACT,WAAW;CACX,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;AACP;AAEA,SAAgBC,EAAU,EACzB,MAAMC,GACN,aACA,MAAMC,GACN,WAAQ,UACR,UAAO,WACP,WAAQ,IACR,cAAW,IACX,cACA,SACA,eAAeC,GACf,cAAcC,GACd,mBAAmBC,GACnB,GAAGC,KACe;CAClB,IAAM,EAAE,oBAAiBd,EAAiB,GACpCe,IAAOd,EAAsBS,GAAUM,CAAY,GACnDC,IAAQZ,EAASU,IACjBG,IAAQC,IAAQZ,EAAWa,KAAQd,EAAUc,IAC7CC,IAAoB,GAAQT,KAAaC;CAE/C,OACC,kBAAC,QAAD;EACC,MAAMS,MAASD,IAAoB,QAAQ,KAAA;EAC3C,eAAaV,MAAe,MAAoB,KAAA;EAChD,cAAYC;EACZ,mBAAiBC;EACjB,WAAWX,EAAG,yBACb,+DACAqB,MAAU,WAAW,iBAAiB,kBACtCN,EAAM,KAGNd,EAAgCY,IAChCG,GACAM,KAAY,2BACZC,CACD;EACA,GAAIX;EAEH,UAAAL,IAAOiB,EAAcjB,GAAM,EAAE,WAAWQ,EAAM,KAAK,CAAC,IAAIU;CACpD,CAAA;AAER;AAEA,EAAU,cAAc"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { _ as e, a as t, c as n, d as r, f as i, g as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h, v as g } from "./ui-provider-DRPn3qNl.js";
2
- import { CARD_SURFACES as _, COMPONENT_SCALES as v, DISCLOSURE_SURFACES as y, SEMANTIC_TONES as b } from "./component-vocabulary.js";
3
- import { t as x } from "./theme-scope-kStaAer0.js";
4
- import { ACTION_BUTTON_STYLES as S } from "./action-presentation.js";
5
- import { interpolateString as C, mergeStrings as w, useStrings as T } from "./lib/strings.js";
6
- import { t as E } from "./utils-BvH9PSmq.js";
7
- export { S as ACTION_BUTTON_STYLES, _ as CARD_SURFACES, v as COMPONENT_SCALES, g as DEFAULT_UI_CONFIG, y as DISCLOSURE_SURFACES, m as DirectionProvider, b as SEMANTIC_TONES, x as ThemeScope, c as UIProvider, E as cn, C as interpolateString, a as isComponentScale, w as mergeStrings, e as resolveComponentScale, l as useBadgeConfig, f as useButtonConfig, o as useCardConfig, t as useCommentsConfig, u as useDatesConfig, p as useDensityConfig, n as useFormattingConfig, s as useItemConfig, h as useMoneyConfig, r as useSpinnerConfig, T as useStrings, i as useToastConfig, d as useTypographyConfig };
1
+ import { _ as e, a as t, c as n, d as r, f as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h, v as g, y as _ } from "./ui-provider-1D_NSYzO.js";
2
+ import { CARD_SURFACES as v, COMPONENT_SCALES as y, DISCLOSURE_SURFACES as b, SEMANTIC_TONES as x } from "./component-vocabulary.js";
3
+ import { t as S } from "./theme-scope-kStaAer0.js";
4
+ import { ACTION_BUTTON_STYLES as C } from "./action-presentation.js";
5
+ import { interpolateString as w, mergeStrings as T, useStrings as E } from "./lib/strings.js";
6
+ import { t as D } from "./utils-l5LpDw2z.js";
7
+ export { C as ACTION_BUTTON_STYLES, v as CARD_SURFACES, y as COMPONENT_SCALES, _ as DEFAULT_UI_CONFIG, b as DISCLOSURE_SURFACES, m as DirectionProvider, x as SEMANTIC_TONES, S as ThemeScope, a as UIProvider, D as cn, w as interpolateString, e as isComponentScale, T as mergeStrings, g as resolveComponentScale, l as useBadgeConfig, f as useButtonConfig, o as useCardConfig, t as useCommentsConfig, u as useDatesConfig, p as useDensityConfig, n as useFormattingConfig, s as useItemConfig, h as useMoneyConfig, r as useOverlayConfig, i as useSpinnerConfig, E as useStrings, d as useToastConfig, c as useTypographyConfig };
@@ -0,0 +1,262 @@
1
+ "use client";
2
+ import { s as e } from "./ui-provider-1D_NSYzO.js";
3
+ import { useStrings as t } from "./lib/strings.js";
4
+ import { t as n } from "./utils-l5LpDw2z.js";
5
+ import { s as r } from "./typography-DTRkE9zL.js";
6
+ import { n as i, t as a } from "./field-affordance-recipes-qQeIf4lG.js";
7
+ import { _ as o, d as s, i as c, n as ee, o as l, r as u, s as d, t as f } from "./form-sizing-By94KzXE.js";
8
+ import * as p from "react";
9
+ import { createContext as m, forwardRef as h, memo as g, useCallback as _, useId as v, useMemo as te, useRef as y, useState as b } from "react";
10
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
11
+ import { Loader2Icon as ne } from "lucide-react";
12
+ //#region src/components/base/text-inputs/hooks/use-form-field-state.ts
13
+ function C({ controlledValue: e, defaultValue: t, maxLength: n, showCharacterCount: r, providedId: i, idPrefix: a = "field", hasOnChange: o }) {
14
+ let s = v(), c = i || `${a}${s}`, [ee, l] = b(t || ""), u = e !== void 0, d = (u ? e : ee) ?? "", f = !(!o || u || t), p = d.length, m = n !== void 0, h = r !== !1 && !!(r || m), g = d !== "", y = _((e) => m && e.length > n, [m, n]), x = _((e) => !y(e) && (u || l(e), !0), [u, y]), S = _(() => {
15
+ u || l("");
16
+ }, [u]);
17
+ return te(() => ({
18
+ id: c,
19
+ value: d,
20
+ isControlled: u,
21
+ isReactHookForm: f,
22
+ characterCount: p,
23
+ hasCharacterLimit: m,
24
+ showCount: h,
25
+ hasValue: g,
26
+ updateValue: x,
27
+ clearValue: S,
28
+ wouldExceedLimit: y
29
+ }), [
30
+ c,
31
+ d,
32
+ u,
33
+ f,
34
+ p,
35
+ m,
36
+ h,
37
+ g,
38
+ x,
39
+ S,
40
+ y
41
+ ]);
42
+ }
43
+ //#endregion
44
+ //#region src/components/base/text-inputs/clear-native-field.ts
45
+ function w(e) {
46
+ let t = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e), "value")?.set;
47
+ e.type === "file" ? e.value = "" : t?.call(e, ""), e.dispatchEvent(new Event("change", { bubbles: !0 }));
48
+ }
49
+ //#endregion
50
+ //#region src/components/base/text-inputs/input-trailing-action.ts
51
+ var T = m(null), E = h(function({ className: e, type: t = "button", ...r }, o) {
52
+ return /* @__PURE__ */ x("button", {
53
+ ref: o,
54
+ type: t,
55
+ className: n(i.target, i.focus, i.clear, e),
56
+ ...r,
57
+ children: /* @__PURE__ */ x(a, {
58
+ className: i.icon,
59
+ "aria-hidden": "true"
60
+ })
61
+ });
62
+ });
63
+ E.displayName = "FieldClearButton";
64
+ //#endregion
65
+ //#region src/components/base/text-inputs/input.tsx
66
+ var D = { clear: "Clear input" }, re = (e, t, n) => {
67
+ let r = e || "";
68
+ return t && r && (r = t + r), n && r && (r += n), r;
69
+ };
70
+ function O({ className: a, type: m = "text", startIcon: h, endIcon: g, startAddon: v, endAddon: b, maxLength: O, showCharacterCount: k, clearable: ie, onClear: A, loading: j = !1, returnValueWithAddons: ae, invalid: oe, size: se, onChange: M, value: ce, defaultValue: le, id: ue, strings: de, ...N }, P) {
71
+ let F = y(null), I = p.useContext(T), L = y(null), R = y(null), [z, B] = p.useState(), [V, H] = p.useState(), fe = t(D, de), { defaultScale: pe } = e(), U = o(se, pe), me = _((e) => {
72
+ typeof P == "function" ? P(e) : P && (P.current = e), F.current = e;
73
+ }, [P]), { id: he, value: ge, isReactHookForm: _e, characterCount: W, hasCharacterLimit: ve, showCount: G, hasValue: ye, updateValue: be, clearValue: xe, wouldExceedLimit: K } = C({
74
+ controlledValue: ce,
75
+ defaultValue: le,
76
+ maxLength: O,
77
+ showCharacterCount: k,
78
+ providedId: ue,
79
+ idPrefix: "input",
80
+ hasOnChange: M !== void 0
81
+ }), Se = !!ie, q = j, Ce = !!g, we = !!b, J = m === "file", Y = !!oe, X = Se && ye && !G && !q, Z = q && !G, Q = Ce && !X && !G && !q, $ = we && !X && !G && !q;
82
+ p.useLayoutEffect(() => {
83
+ let e = L.current, t = R.current, n = () => {
84
+ if (e) {
85
+ let t = e.getBoundingClientRect().width;
86
+ t > 0 && B(t);
87
+ } else B(void 0);
88
+ if (t) {
89
+ let e = t.getBoundingClientRect().width;
90
+ e > 0 && H(e);
91
+ } else H(void 0);
92
+ };
93
+ if (n(), !e && !t) return;
94
+ let r = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(n);
95
+ return e && r?.observe(e), t && r?.observe(t), window.addEventListener("resize", n), () => {
96
+ r?.disconnect(), window.removeEventListener("resize", n);
97
+ };
98
+ }, [
99
+ U,
100
+ W,
101
+ O,
102
+ v,
103
+ b,
104
+ Q,
105
+ $,
106
+ X,
107
+ G,
108
+ Z,
109
+ I
110
+ ]);
111
+ let Te = te(() => {
112
+ let e = U === "sm" ? "ps-control-sm" : "ps-control", t = U === "sm" ? "pe-control-sm" : "pe-control";
113
+ return h && (e = d[U]), v && (e = f[U]), v && V !== void 0 && (e = i.measuredStartPadding[U]), Q && (t = c[U]), $ && (t = u[U]), q && (t = c[U]), X && (t = i.clearPadding[U]), G && (t = ee[U]), I && (t = G ? i.pairedCountPadding[U] : X ? i.pairedClearPadding[U] : $ ? i.pairedAddonPadding[U] : Q || Z ? i.pairedIconPadding[U] : i.clearPadding[U]), z !== void 0 && (t = i.measuredPadding[U]), `${e} ${t}`;
114
+ }, [
115
+ h,
116
+ v,
117
+ Q,
118
+ $,
119
+ X,
120
+ Z,
121
+ q,
122
+ G,
123
+ I,
124
+ z,
125
+ V,
126
+ U
127
+ ]), Ee = _((e) => {
128
+ let t = e.target.value;
129
+ if (!K(t) && (be(t), M)) {
130
+ if (ae && t) {
131
+ let n = re(t, v, b);
132
+ M({
133
+ ...e,
134
+ target: {
135
+ ...e.target,
136
+ value: n
137
+ },
138
+ currentTarget: {
139
+ ...e.currentTarget,
140
+ value: n
141
+ }
142
+ });
143
+ } else M(e);
144
+ }
145
+ }, [
146
+ M,
147
+ ae,
148
+ v,
149
+ b,
150
+ be,
151
+ K
152
+ ]), De = _(() => {
153
+ if (N.disabled || N.readOnly || j) return;
154
+ let e = F.current;
155
+ if (e?.type === "color" || e?.type === "range") {
156
+ xe();
157
+ let t = {
158
+ value: "",
159
+ name: e.name,
160
+ id: e.id,
161
+ type: e.type
162
+ };
163
+ M?.({
164
+ target: t,
165
+ currentTarget: t
166
+ });
167
+ } else e && w(e);
168
+ A?.(), F.current?.focus();
169
+ }, [
170
+ N.disabled,
171
+ N.readOnly,
172
+ j,
173
+ xe,
174
+ M,
175
+ A
176
+ ]);
177
+ return /* @__PURE__ */ S("div", {
178
+ className: n("input--component", "relative h-fit w-full min-w-0"),
179
+ style: z === void 0 && V === void 0 ? void 0 : {
180
+ "--field-trailing-width": z === void 0 ? void 0 : `${z}px`,
181
+ "--field-leading-width": V === void 0 ? void 0 : `${V}px`
182
+ },
183
+ children: [
184
+ /* @__PURE__ */ x("input", {
185
+ ref: me,
186
+ id: he,
187
+ type: m,
188
+ ...!_e && { value: ge },
189
+ onChange: Ee,
190
+ maxLength: O,
191
+ "aria-invalid": Y || void 0,
192
+ className: n("flex w-full min-w-0", s(U), "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:font-medium", "file:text-pxs", J ? "cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-inner file:border-input file:bg-background file:text-foreground" : "bg-transparent", J ? "read-only:bg-background" : "[&:read-only:not(:disabled)]:bg-muted", Te, a),
193
+ ...N,
194
+ disabled: N.disabled || j
195
+ }),
196
+ !!h && /* @__PURE__ */ x("div", {
197
+ className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50", Y ? "text-destructive" : "text-muted-foreground"),
198
+ children: /* @__PURE__ */ x(h, {
199
+ className: l[U],
200
+ "aria-hidden": "true"
201
+ })
202
+ }),
203
+ !!v && /* @__PURE__ */ x("span", {
204
+ className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50"),
205
+ children: /* @__PURE__ */ x(r, {
206
+ ref: R,
207
+ tag: "span",
208
+ size: U === "sm" ? "pxs" : "sm",
209
+ type: Y ? "error" : "secondary",
210
+ lineHeight: "tight",
211
+ className: "input--start-addon",
212
+ children: v
213
+ })
214
+ }),
215
+ (Q || $ || G || Z || X || I) && /* @__PURE__ */ S("div", {
216
+ ref: L,
217
+ className: n("input--trailing absolute inset-y-0 flex items-center gap-space-sm whitespace-nowrap", i.clearEnd[U], N.disabled && "opacity-50"),
218
+ children: [
219
+ Q && g && /* @__PURE__ */ x(g, {
220
+ className: n("pointer-events-none", l[U], Y ? "text-destructive" : "text-muted-foreground"),
221
+ "aria-hidden": "true"
222
+ }),
223
+ $ && /* @__PURE__ */ x(r, {
224
+ tag: "span",
225
+ size: U === "sm" ? "pxs" : "sm",
226
+ type: Y ? "error" : "secondary",
227
+ lineHeight: "tight",
228
+ className: "input--end-addon pointer-events-none",
229
+ children: b
230
+ }),
231
+ G && /* @__PURE__ */ x("div", {
232
+ role: "status",
233
+ "aria-live": "polite",
234
+ className: "pointer-events-none tabular-nums",
235
+ children: /* @__PURE__ */ S(r, {
236
+ tag: "span",
237
+ size: U === "sm" ? "xxs" : "xs",
238
+ type: Y ? "error" : "secondary",
239
+ children: [W, ve ? `/${O}` : ""]
240
+ })
241
+ }),
242
+ Z && /* @__PURE__ */ x(ne, {
243
+ className: n(l[U], "pointer-events-none animate-spin", Y ? "text-destructive" : "text-muted-foreground"),
244
+ "aria-hidden": "true"
245
+ }),
246
+ X && /* @__PURE__ */ x(E, {
247
+ "aria-label": fe.clear,
248
+ onClick: De,
249
+ disabled: N.disabled || N.readOnly || j
250
+ }),
251
+ I
252
+ ]
253
+ })
254
+ ]
255
+ });
256
+ }
257
+ var k = g(p.forwardRef(O));
258
+ k.displayName = "Input";
259
+ //#endregion
260
+ export { w as a, T as i, D as n, C as o, E as r, k as t };
261
+
262
+ //# sourceMappingURL=input-DWhBBBww.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-DWhBBBww.js","names":["React","useDensityConfig","cn","Text","fieldAffordanceRecipes","FieldClearGlyph","resolveFormControlSize","formFieldFrameClasses","formControlEndIconOffsetClasses","formControlCountOffsetClasses","formControlIconClasses","formControlEndAddonOffsetClasses","formControlIconOffsetClasses","formControlAddonOffsetClasses","React$1","useFormFieldState","reactId","useId","id","providedId","idPrefix","internalValue","setInternalValue","useState","defaultValue","isControlled","controlledValue","value","isReactHookForm","characterCount","hasCharacterLimit","maxLength","showCount","showCharacterCount","hasValue","wouldExceedLimit","useCallback","newValue","updateValue","clearValue","useMemo","clearNativeField","setValue","field","InputTrailingActionContext","createContext","FieldClearButton","forwardRef","props","className","defaultInputStrings","getValueWithAddons","result","startAddon","endAddon","InputImpl","StartIcon","EndIcon","sizeProp","stringsProp","inputRef","useRef","trailingAction","trailingRef","leadingRef","trailingWidth","setTrailingWidth","leadingWidth","setLeadingWidth","strings","useStrings","size","defaultScale","setRefs","forwardedRef","node","inputValue","onChange","isClearable","clearable","isShowingLoading","loading","hasEndIcon","hasEndAddon","isFileInput","type","hasError","invalid","showClearButton","showLoadingSpinner","showEndIcon","showEndAddon","track","leading","measure","width","observer","inputPaddingClasses","paddingStart","paddingEnd","handleInputChange","returnValueWithAddons","valueWithAddons","handleClear","nativeField","target","onClear","Loader2Icon","Input","memo"],"sources":["../src/components/base/text-inputs/hooks/use-form-field-state.ts","../src/components/base/text-inputs/clear-native-field.ts","../src/components/base/text-inputs/input-trailing-action.ts","../src/components/base/text-inputs/field-clear-button.tsx","../src/components/base/text-inputs/input.tsx"],"sourcesContent":["import { useState, useCallback, useMemo, useId } from 'react';\n\nexport interface UseFormFieldStateOptions {\n\t/** Controlled value from parent */\n\tcontrolledValue?: string;\n\t/** Default value for uncontrolled mode */\n\tdefaultValue?: string;\n\t/** Maximum character length */\n\tmaxLength?: number;\n\t/** Whether to show character count */\n\tshowCharacterCount?: boolean;\n\t/** Provided ID or auto-generate */\n\tprovidedId?: string;\n\t/** Prefix for auto-generated ID */\n\tidPrefix?: string;\n\t/** Whether onChange is provided (for react-hook-form detection) */\n\thasOnChange?: boolean;\n}\n\nexport interface UseFormFieldStateReturn {\n\t/** Generated or provided ID */\n\tid: string;\n\t/** Current value (controlled or internal) */\n\tvalue: string;\n\t/** Whether component is in controlled mode */\n\tisControlled: boolean;\n\t/** Whether using react-hook-form (has onChange but no controlled value) */\n\tisReactHookForm: boolean;\n\t/** Current character count */\n\tcharacterCount: number;\n\t/** Whether a character limit is set */\n\thasCharacterLimit: boolean;\n\t/** Whether to show character count UI */\n\tshowCount: boolean;\n\t/** Whether the field has a value */\n\thasValue: boolean;\n\t/** Update value - returns false if blocked by character limit */\n\tupdateValue: (newValue: string) => boolean;\n\t/** Clear the value */\n\tclearValue: () => void;\n\t/** Check if a new value would exceed the character limit */\n\twouldExceedLimit: (newValue: string) => boolean;\n}\n\n/**\n * Shared hook for managing form field state including:\n * - Controlled vs uncontrolled value handling\n * - Character counting and limits\n * - React Hook Form compatibility detection\n * - ID generation\n */\nexport function useFormFieldState({\n\tcontrolledValue,\n\tdefaultValue,\n\tmaxLength,\n\tshowCharacterCount,\n\tprovidedId,\n\tidPrefix = 'field',\n\thasOnChange,\n}: UseFormFieldStateOptions): UseFormFieldStateReturn {\n\t// Generate stable ID using React 18's useId (SSR-safe)\n\tconst reactId = useId();\n\tconst id = providedId || `${idPrefix}${reactId}`;\n\n\t// Internal state for uncontrolled mode\n\tconst [internalValue, setInternalValue] = useState(defaultValue || '');\n\n\t// Determine control mode\n\tconst isControlled = controlledValue !== undefined;\n\n\t// Normalize value (handle null from backend)\n\tconst rawValue = isControlled ? controlledValue : internalValue;\n\tconst value = rawValue ?? '';\n\n\t// React Hook Form detection: has onChange but no controlled value or defaultValue\n\tconst isReactHookForm = Boolean(hasOnChange && !isControlled && !defaultValue);\n\n\t// Character counting\n\tconst characterCount = value.length;\n\tconst hasCharacterLimit = maxLength !== undefined;\n\tconst showCount = showCharacterCount === false ? false : Boolean(showCharacterCount || hasCharacterLimit);\n\tconst hasValue = value !== '';\n\n\t// Check if value would exceed limit\n\tconst wouldExceedLimit = useCallback(\n\t\t(newValue: string) => {\n\t\t\treturn hasCharacterLimit && newValue.length > maxLength;\n\t\t},\n\t\t[hasCharacterLimit, maxLength]\n\t);\n\n\t// Update value (respects character limit, updates internal state if uncontrolled)\n\tconst updateValue = useCallback(\n\t\t(newValue: string): boolean => {\n\t\t\tif (wouldExceedLimit(newValue)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalValue(newValue);\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t[isControlled, wouldExceedLimit]\n\t);\n\n\t// Clear value\n\tconst clearValue = useCallback(() => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue('');\n\t\t}\n\t}, [isControlled]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tid,\n\t\t\tvalue,\n\t\t\tisControlled,\n\t\t\tisReactHookForm,\n\t\t\tcharacterCount,\n\t\t\thasCharacterLimit,\n\t\t\tshowCount,\n\t\t\thasValue,\n\t\t\tupdateValue,\n\t\t\tclearValue,\n\t\t\twouldExceedLimit,\n\t\t}),\n\t\t[\n\t\t\tid,\n\t\t\tvalue,\n\t\t\tisControlled,\n\t\t\tisReactHookForm,\n\t\t\tcharacterCount,\n\t\t\thasCharacterLimit,\n\t\t\tshowCount,\n\t\t\thasValue,\n\t\t\tupdateValue,\n\t\t\tclearValue,\n\t\t\twouldExceedLimit,\n\t\t]\n\t);\n}\n","/** Route inline clearing through the field's existing native change handler. */\nexport function clearNativeField(field: HTMLInputElement | HTMLTextAreaElement) {\n\t// Bypass React's value tracker so it observes the change and restores any\n\t// controlled value that the consumer declines or replaces synchronously.\n\tconst setValue = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(field), 'value')?.set;\n\tif (field.type === 'file') field.value = '';\n\telse setValue?.call(field, '');\n\tfield.dispatchEvent(new Event('change', { bubbles: true }));\n}\n","import { createContext, type ReactNode } from 'react';\n\n/** Private composition seam: the Input owner lays out PasswordInput's action. */\nexport const InputTrailingActionContext = createContext<ReactNode>(null);\n","import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { cn } from '../../../lib/utils';\n\n/**\n * The inline clear action shared by Input, Textarea and Cascader: a native button\n * drawing the shared clear target, focus edge and glyph. Its owner places it and\n * supplies the accessible name, handler and disabled state.\n */\nexport const FieldClearButton = forwardRef<HTMLButtonElement, ComponentPropsWithoutRef<'button'>>(function FieldClearButton(\n\t{ className, type = 'button', ...props },\n\tref,\n) {\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype={type}\n\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<FieldClearGlyph className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t</button>\n\t);\n});\nFieldClearButton.displayName = 'FieldClearButton';\n","import { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { Loader2Icon, type LucideIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useCallback, useMemo, memo } from 'react';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport {\n\t\tformControlAddonOffsetClasses,\n\t\tformControlCountOffsetClasses,\n\t\tformControlEndAddonOffsetClasses,\n\t\tformControlEndIconOffsetClasses,\n\t\tformControlIconClasses,\n\t\tformControlIconOffsetClasses,\n\t\tformFieldFrameClasses,\n\t\tresolveFormControlSize,\n} from '../forms/form-sizing';\nimport { useFormFieldState } from './hooks';\nimport { clearNativeField } from './clear-native-field';\nimport { InputTrailingActionContext } from './input-trailing-action';\nimport { FieldClearButton } from './field-clear-button';\n\nexport interface InputStrings {\n\t/** Accessible label for the clear action. */\n\t\tclear: string;\n}\n\nexport const defaultInputStrings: InputStrings = {\n\t\tclear: 'Clear input',\n};\n\n/**\n * Helper function to get value with prefix/suffix\n */\nconst getValueWithAddons = (value: string, startAddon?: string, endAddon?: string): string => {\n\t\tlet result = value || '';\n\t\tif (startAddon && result) result = startAddon + result;\n\t\tif (endAddon && result) result = result + endAddon;\n\t\treturn result;\n};\n\nexport interface InputProps extends Omit<React.ComponentProps<'input'>, 'onChange' | 'size'> {\n\t/** Decorative or semantic icon rendered before the value. */\n\t\tstartIcon?: LucideIcon;\n\t/** Decorative or semantic icon rendered after the value. */\n\t\tendIcon?: LucideIcon;\n\n\t/** Visual text prefix rendered inside the input frame. */\n\t\tstartAddon?: string;\n\t/** Visual text suffix rendered inside the input frame. */\n\t\tendAddon?: string;\n\n\t/** Maximum accepted character count. */\n\t\tmaxLength?: number;\n\t/** Shows the current and maximum character count. */\n\t\tshowCharacterCount?: boolean;\n\n\t/** Shows an inline clear action when the input has a value. */\n\t\tclearable?: boolean;\n\t/** Called after the inline clear action resets the value. */\n\t\tonClear?: () => void;\n\n\t/** Replaces the trailing affordance with a loading indicator. */\n\t\tloading?: boolean;\n\n\t/** Includes visual add-on text in the value exposed by `onChange`. */\n\t\treturnValueWithAddons?: boolean;\n\n\t/** Applies invalid control styling. Validation copy remains owned by FormField. */\n\t\tinvalid?: boolean;\n\n\t/** Control-height preset. Falls back to `UIProvider.density.defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t/** Native-style value callback for the controlled raw string. */\n\t\tonChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n\t/** Controlled raw string value. */\n\t\tvalue?: string;\n\t/** Initial raw string value for uncontrolled usage. */\n\t\tdefaultValue?: string;\n\n\t/** Accessible copy overrides for input-owned actions. */\n\t\tstrings?: StringsProp<InputStrings>;\n}\n\nfunction InputImpl(\n\t{\n\t\tclassName,\n\t\ttype = 'text',\n\t\tstartIcon: StartIcon,\n\t\tendIcon: EndIcon,\n\t\tstartAddon,\n\t\tendAddon,\n\t\tmaxLength,\n\t\tshowCharacterCount,\n\t\tclearable,\n\t\tonClear,\n\t\tloading = false,\n\t\treturnValueWithAddons,\n\t\tinvalid,\n\t\tsize: sizeProp,\n\t\tonChange,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tid: providedId,\n\t\tstrings: stringsProp,\n\t\t...props\n\t}: InputProps,\n\tforwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\n\t\tconst trailingAction = React.useContext(InputTrailingActionContext);\n\t\tconst trailingRef = useRef<HTMLDivElement>(null);\n\t\tconst leadingRef = useRef<HTMLElement>(null);\n\t\tconst [trailingWidth, setTrailingWidth] = React.useState<number>();\n\t\tconst [leadingWidth, setLeadingWidth] = React.useState<number>();\n\t\tconst strings = useStrings(defaultInputStrings, stringsProp);\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\n\t\t// Memoize ref callback to avoid recreation on every render\n\t\tconst setRefs = useCallback(\n\t\t\t\t(node: HTMLInputElement | null) => {\n\t\t\t\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputRef.current = node;\n\t\t\t\t},\n\t\t\t\t[forwardedRef]\n\t\t);\n\n\t\t// Use shared form field state hook\n\t\tconst {\n\t\t\t\tid,\n\t\t\t\tvalue: inputValue,\n\t\t\t\tisReactHookForm,\n\t\t\t\tcharacterCount,\n\t\t\t\thasCharacterLimit,\n\t\t\t\tshowCount,\n\t\t\t\thasValue,\n\t\t\t\tupdateValue,\n\t\t\t\tclearValue,\n\t\t\t\twouldExceedLimit,\n\t\t} = useFormFieldState({\n\t\t\t\tcontrolledValue,\n\t\t\t\tdefaultValue,\n\t\t\t\tmaxLength,\n\t\t\t\tshowCharacterCount,\n\t\t\t\tprovidedId,\n\t\t\t\tidPrefix: 'input',\n\t\t\t\thasOnChange: onChange !== undefined,\n\t\t});\n\n\t\t// Derive display states (simple booleans, no need for useMemo)\n\t\tconst isClearable = !!clearable;\n\t\tconst isShowingLoading = loading;\n\t\tconst hasEndIcon = !!EndIcon;\n\t\tconst hasEndAddon = !!endAddon;\n\t\tconst isFileInput = type === 'file';\n\t\tconst hasError = !!invalid;\n\t\tconst showClearButton = isClearable && hasValue && !showCount && !isShowingLoading;\n\t\tconst showLoadingSpinner = isShowingLoading && !showCount;\n\t\tconst showEndIcon = hasEndIcon && !showClearButton && !showCount && !isShowingLoading;\n\t\tconst showEndAddon = hasEndAddon && !showClearButton && !showCount && !isShowingLoading;\n\n\t\tReact.useLayoutEffect(() => {\n\t\t\tconst track = trailingRef.current;\n\t\t\tconst leading = leadingRef.current;\n\t\t\tconst measure = () => {\n\t\t\t\t// Hidden/SSR surfaces retain the generated fallback until measurable.\n\t\t\t\tif (track) {\n\t\t\t\t\tconst width = track.getBoundingClientRect().width;\n\t\t\t\t\tif (width > 0) setTrailingWidth(width);\n\t\t\t\t} else setTrailingWidth(undefined);\n\t\t\t\tif (leading) {\n\t\t\t\t\tconst width = leading.getBoundingClientRect().width;\n\t\t\t\t\tif (width > 0) setLeadingWidth(width);\n\t\t\t\t} else setLeadingWidth(undefined);\n\t\t\t};\n\t\t\tmeasure();\n\t\t\tif (!track && !leading) return;\n\t\t\tconst observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(measure);\n\t\t\tif (track) observer?.observe(track);\n\t\t\tif (leading) observer?.observe(leading);\n\t\t\twindow.addEventListener('resize', measure);\n\t\t\treturn () => { observer?.disconnect(); window.removeEventListener('resize', measure); };\n\t\t}, [size, characterCount, maxLength, startAddon, endAddon, showEndIcon, showEndAddon, showClearButton, showCount, showLoadingSpinner, trailingAction]);\n\n\t\t// Generated fallbacks cover SSR; measured text keeps translated add-ons\n\t\t// clear of the editable value. Consumer padding classes remain last.\n\t\tconst inputPaddingClasses = useMemo(() => {\n\t\t\t\tlet paddingStart = size === 'sm' ? 'ps-control-sm' : 'ps-control';\n\t\t\t\tlet paddingEnd = size === 'sm' ? 'pe-control-sm' : 'pe-control';\n\n\t\t\t\tif (StartIcon) paddingStart = formControlIconOffsetClasses[size];\n\t\t\t\tif (startAddon) paddingStart = formControlAddonOffsetClasses[size];\n\t\t\t\tif (startAddon && leadingWidth !== undefined) paddingStart = fieldAffordanceRecipes.measuredStartPadding[size];\n\n\t\t\t\tif (showEndIcon) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (showEndAddon) paddingEnd = formControlEndAddonOffsetClasses[size];\n\t\t\t\tif (isShowingLoading) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (showClearButton) paddingEnd = fieldAffordanceRecipes.clearPadding[size];\n\t\t\t\tif (showCount) paddingEnd = formControlCountOffsetClasses[size];\n\t\t\t\tif (trailingAction) {\n\t\t\t\t\tpaddingEnd = showCount ? fieldAffordanceRecipes.pairedCountPadding[size]\n\t\t\t\t\t\t: showClearButton ? fieldAffordanceRecipes.pairedClearPadding[size]\n\t\t\t\t\t\t: showEndAddon ? fieldAffordanceRecipes.pairedAddonPadding[size]\n\t\t\t\t\t\t: showEndIcon || showLoadingSpinner ? fieldAffordanceRecipes.pairedIconPadding[size]\n\t\t\t\t\t\t: fieldAffordanceRecipes.clearPadding[size];\n\t\t\t\t}\n\n\t\t\t\tif (trailingWidth !== undefined) paddingEnd = fieldAffordanceRecipes.measuredPadding[size];\n\n\t\t\t\treturn `${paddingStart} ${paddingEnd}`;\n\t\t}, [StartIcon, startAddon, showEndIcon, showEndAddon, showClearButton, showLoadingSpinner, isShowingLoading, showCount, trailingAction, trailingWidth, leadingWidth, size]);\n\n\t\tconst handleInputChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tconst newValue = e.target.value;\n\n\t\t\t\t\t\t// Check character limit\n\t\t\t\t\t\tif (wouldExceedLimit(newValue)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update internal state if uncontrolled\n\t\t\t\t\t\tupdateValue(newValue);\n\n\t\t\t\t\t\t// Call external onChange with modified event if addons are requested\n\t\t\t\t\t\tif (onChange) {\n\t\t\t\t\t\t\t\tif (returnValueWithAddons && newValue) {\n\t\t\t\t\t\t\t\t\t\tconst valueWithAddons = getValueWithAddons(newValue, startAddon, endAddon);\n\t\t\t\t\t\t\t\t\t\tconst modifiedEvent = {\n\t\t\t\t\t\t\t\t\t\t\t\t...e,\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: { ...e.target, value: valueWithAddons },\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentTarget: { ...e.currentTarget, value: valueWithAddons },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\tonChange(modifiedEvent as React.ChangeEvent<HTMLInputElement>);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tonChange(e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[onChange, returnValueWithAddons, startAddon, endAddon, updateValue, wouldExceedLimit]\n\t\t);\n\n\t\tconst handleClear = useCallback(() => {\n\t\t\t\tif (props.disabled || props.readOnly || loading) return;\n\n\t\t\t\tconst nativeField = inputRef.current;\n\t\t\t\tif (nativeField?.type === 'color' || nativeField?.type === 'range') {\n\t\t\t\t\t\t// These native types cannot represent ''. Retain the existing empty\n\t\t\t\t\t\t// proposal while the browser owns the rendered value's sanitization.\n\t\t\t\t\t\tclearValue();\n\t\t\t\t\t\tconst target = { value: '', name: nativeField.name, id: nativeField.id, type: nativeField.type };\n\t\t\t\t\t\tonChange?.({ target, currentTarget: target } as React.ChangeEvent<HTMLInputElement>);\n\t\t\t\t} else if (nativeField) {\n\t\t\t\t\t\tclearNativeField(nativeField);\n\t\t\t\t}\n\n\t\t\t\t// Execute optional onClear callback\n\t\t\t\tonClear?.();\n\n\t\t\t\t// Focus the input after clearing\n\t\t\t\tinputRef.current?.focus();\n\t\t}, [props.disabled, props.readOnly, loading, clearValue, onChange, onClear]);\n\n\n\n\t\treturn (\n\t\t\t\t<div className={cn('input--component', 'relative h-fit w-full min-w-0')} style={trailingWidth === undefined && leadingWidth === undefined ? undefined : {\n\t\t\t\t\t'--field-trailing-width': trailingWidth === undefined ? undefined : `${trailingWidth}px`,\n\t\t\t\t\t'--field-leading-width': leadingWidth === undefined ? undefined : `${leadingWidth}px`,\n\t\t\t\t} as React.CSSProperties}>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={setRefs}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\t\t{...(!isReactHookForm && { value: inputValue })}\n\t\t\t\t\t\t\t\tonChange={handleInputChange}\n\t\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\t\taria-invalid={hasError || undefined}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// The shared field frame, which input-shaped triggers draw too\n\t\t\t\t\t\t\t\t\t\t'flex w-full min-w-0',\n\t\t\t\t\t\t\t\t\t\tformFieldFrameClasses(size),\n\t\t\t\t\t\t\t\t\t\t'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t// File input styles\n\t\t\t\t\t\t\t\t\t\t'file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:font-medium',\n\t\t\t\t\t\t\t\t\t\t'file:text-pxs',\n\t\t\t\t\t\t\t\t\t\tisFileInput\n\t\t\t\t\t\t\t\t\t\t\t\t? 'cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-inner file:border-input file:bg-background file:text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent',\n\t\t\t\t\t\t\t\t\t\t// Read-only fill. A disabled input also matches :read-only, and\n\t\t\t\t\t\t\t\t\t\t// disabled fields dim on a transparent fill like every trigger.\n\t\t\t\t\t\t\t\t\t\tisFileInput\n\t\t\t\t\t\t\t\t\t\t\t\t? 'read-only:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t: '[&:read-only:not(:disabled)]:bg-muted',\n\t\t\t\t\t\t\t\t\t\t// Dynamic padding\n\t\t\t\t\t\t\t\t\t\tinputPaddingClasses,\n\t\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tdisabled={props.disabled || loading}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{/* Start Icon */}\n\t\t\t\t\t\t{!!StartIcon && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'ps-control-sm' : 'ps-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<StartIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Start Add-on */}\n\t\t\t\t\t\t{!!startAddon && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'ps-control-sm' : 'ps-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tref={leadingRef}\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize={size === 'sm' ? 'pxs' : 'sm'}\n\t\t\t\t\t\ttype={hasError ? 'error' : 'secondary'}\n\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\tclassName=\"input--start-addon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{startAddon}\n\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{(showEndIcon || showEndAddon || showCount || showLoadingSpinner || showClearButton || trailingAction) && (\n\t\t\t\t\t\t\t<div ref={trailingRef} className={cn('input--trailing absolute inset-y-0 flex items-center gap-space-sm whitespace-nowrap', fieldAffordanceRecipes.clearEnd[size],\n\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50')}>\n\t\t\t\t\t\t\t\t{showEndIcon && EndIcon && <EndIcon className={cn('pointer-events-none', formControlIconClasses[size], hasError ? 'text-destructive' : 'text-muted-foreground')} aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t{showEndAddon && <Text tag=\"span\" size={size === 'sm' ? 'pxs' : 'sm'} type={hasError ? 'error' : 'secondary'} lineHeight=\"tight\" className=\"input--end-addon pointer-events-none\">{endAddon}</Text>}\n\t\t\t\t\t\t\t\t{showCount && <div role=\"status\" aria-live=\"polite\" className=\"pointer-events-none tabular-nums\">\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size={size === 'sm' ? 'xxs' : 'xs'} type={hasError ? 'error' : 'secondary'}>{characterCount}{hasCharacterLimit ? `/${maxLength}` : ''}</Text>\n\t\t\t\t\t\t\t\t</div>}\n\t\t\t\t\t\t\t\t{showLoadingSpinner && <Loader2Icon className={cn(formControlIconClasses[size], 'pointer-events-none animate-spin', hasError ? 'text-destructive' : 'text-muted-foreground')} aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t{showClearButton && <FieldClearButton aria-label={strings.clear} onClick={handleClear} disabled={props.disabled || props.readOnly || loading} />}\n\t\t\t\t\t\t\t\t{trailingAction}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n}\n\n// forwardRef + memo (needed for callers that require refs, e.g. segmented inputs)\nconst Input = memo(React.forwardRef<HTMLInputElement, InputProps>(InputImpl));\nInput.displayName = 'Input';\n\nexport { Input };\n"],"mappings":"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"}