themelia-react-ui 2.0.2 → 2.0.4

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 (435) hide show
  1. package/CHANGELOG.md +67 -7
  2. package/README.md +70 -37
  3. package/THIRD_PARTY_NOTICES.md +6 -12
  4. package/dist/{accordion-Cjb6sx0G.js → accordion-96o0pN62.js} +5 -5
  5. package/dist/{accordion-Cjb6sx0G.js.map → accordion-96o0pN62.js.map} +1 -1
  6. package/dist/action-menu-CHgs8vmj.js +281 -0
  7. package/dist/action-menu-CHgs8vmj.js.map +1 -0
  8. package/dist/{affordance-geometry.generated-tF36bREk.js → affordance-geometry.generated-B8yGOr8-.js} +7 -1
  9. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +1 -0
  10. package/dist/{ai-artifact-DvTwDVyL.js → ai-artifact-BZUGwBq6.js} +277 -276
  11. package/dist/ai-artifact-BZUGwBq6.js.map +1 -0
  12. package/dist/{app-shell-C4FhvCqF.js → app-shell-D63ATkIK.js} +84 -83
  13. package/dist/app-shell-D63ATkIK.js.map +1 -0
  14. package/dist/{attachment-BxDfL2mw.js → attachment-DkoqHPPl.js} +7 -7
  15. package/dist/{attachment-BxDfL2mw.js.map → attachment-DkoqHPPl.js.map} +1 -1
  16. package/dist/{auth-ax2BqjrI.js → auth-D2FVZ1MH.js} +10 -10
  17. package/dist/{auth-ax2BqjrI.js.map → auth-D2FVZ1MH.js.map} +1 -1
  18. package/dist/{avatar-DAPlDvhJ.js → avatar-DWO_HHhB.js} +5 -5
  19. package/dist/{avatar-DAPlDvhJ.js.map → avatar-DWO_HHhB.js.map} +1 -1
  20. package/dist/{badge-HpFqoqSY.js → badge-DErMA7ul.js} +4 -4
  21. package/dist/{badge-HpFqoqSY.js.map → badge-DErMA7ul.js.map} +1 -1
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +1 -1
  29. package/dist/base/cards.js +2 -2
  30. package/dist/base/carousel.js +3 -3
  31. package/dist/base/cascader.js +13 -13
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +2 -2
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +2 -2
  39. package/dist/base/display.js +6 -6
  40. package/dist/base/feedback.js +3 -3
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +3 -3
  43. package/dist/base/inline-edit.js +10 -10
  44. package/dist/base/item.js +1 -1
  45. package/dist/base/media-gallery.js +1 -1
  46. package/dist/base/metadata-list.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +1 -1
  51. package/dist/base/repeaters.js +9 -9
  52. package/dist/base/sheet.js +1 -1
  53. package/dist/base/sidebar.js +1 -1
  54. package/dist/base/signature-pad.js +6 -6
  55. package/dist/base/skeleton.js +1 -1
  56. package/dist/base/spinner.js +4 -4
  57. package/dist/base/structure.js +1 -1
  58. package/dist/base/table.js +1 -1
  59. package/dist/base/text-inputs.js +2 -2
  60. package/dist/base/toaster.js +3 -3
  61. package/dist/base/tree.js +1 -1
  62. package/dist/base/upload-queue.js +1 -1
  63. package/dist/base/upload.js +3 -3
  64. package/dist/base/value-inputs.js +1 -1
  65. package/dist/{batch-action-bar-DnUJ21NQ.js → batch-action-bar-CdfIkCsV.js} +4 -4
  66. package/dist/{batch-action-bar-DnUJ21NQ.js.map → batch-action-bar-CdfIkCsV.js.map} +1 -1
  67. package/dist/blocks/admin.js +20 -20
  68. package/dist/blocks/admin.js.map +1 -1
  69. package/dist/blocks/ai.js +15 -15
  70. package/dist/blocks/analytics/usage-card.js +1 -1
  71. package/dist/blocks/analytics.js +17 -17
  72. package/dist/blocks/analytics.js.map +1 -1
  73. package/dist/blocks/collaboration.js +1 -1
  74. package/dist/blocks/commerce/receipt.js +1 -1
  75. package/dist/blocks/commerce.js +570 -567
  76. package/dist/blocks/commerce.js.map +1 -1
  77. package/dist/blocks/data-display.js +2 -2
  78. package/dist/blocks/onboarding.js +5 -5
  79. package/dist/blocks/planning.js +11 -11
  80. package/dist/blocks/timelines.js +1 -1
  81. package/dist/{breadcrumbs-C-oqs1sQ.js → breadcrumbs-B-WFKecD.js} +4 -4
  82. package/dist/{breadcrumbs-C-oqs1sQ.js.map → breadcrumbs-B-WFKecD.js.map} +1 -1
  83. package/dist/{button-DVzspB_G.js → button-DkmK-z8E.js} +2 -2
  84. package/dist/{button-DVzspB_G.js.map → button-DkmK-z8E.js.map} +1 -1
  85. package/dist/{buttons-DPZekJFu.js → buttons-BbfzgczK.js} +8 -8
  86. package/dist/{buttons-DPZekJFu.js.map → buttons-BbfzgczK.js.map} +1 -1
  87. package/dist/{cards-BaBZR-AU.js → cards-4JTWqvVe.js} +10 -10
  88. package/dist/cards-4JTWqvVe.js.map +1 -0
  89. package/dist/{chart-ZOYyK2xG.js → chart-C19flDQb.js} +4 -4
  90. package/dist/{chart-ZOYyK2xG.js.map → chart-C19flDQb.js.map} +1 -1
  91. package/dist/{checkbox-AWIhNhmo.js → checkbox-CzYUTPeJ.js} +9 -5
  92. package/dist/checkbox-CzYUTPeJ.js.map +1 -0
  93. package/dist/{choice-inputs-CNHvARCJ.js → choice-inputs-JLtij2y4.js} +182 -176
  94. package/dist/choice-inputs-JLtij2y4.js.map +1 -0
  95. package/dist/{code-block-DeneBJR_.js → code-block-CGNaUtAE.js} +7 -7
  96. package/dist/{code-block-DeneBJR_.js.map → code-block-CGNaUtAE.js.map} +1 -1
  97. package/dist/{collapsible-C-_l4hpy.js → collapsible-Do4G0zcC.js} +3 -3
  98. package/dist/{collapsible-C-_l4hpy.js.map → collapsible-Do4G0zcC.js.map} +1 -1
  99. package/dist/{collection-content-By56pLog.js → collection-content-C0e8SsTm.js} +3 -3
  100. package/dist/{collection-content-By56pLog.js.map → collection-content-C0e8SsTm.js.map} +1 -1
  101. package/dist/{combobox-C0EQW6dr.js → combobox-CBJDs6w_.js} +349 -347
  102. package/dist/combobox-CBJDs6w_.js.map +1 -0
  103. package/dist/{combobox-xCQ2RMNE.js → combobox-hbhSS18O.js} +158 -112
  104. package/dist/combobox-hbhSS18O.js.map +1 -0
  105. package/dist/{command-C25VMRII.js → command-D8NrBj-b.js} +7 -7
  106. package/dist/{command-C25VMRII.js.map → command-D8NrBj-b.js.map} +1 -1
  107. package/dist/{comments-BYYlTA8E.js → comments-Di4w0H_S.js} +383 -382
  108. package/dist/comments-Di4w0H_S.js.map +1 -0
  109. package/dist/components/base/action-menu/action-menu.d.ts +2 -0
  110. package/dist/components/base/cards/card.recipes.d.ts +12 -5
  111. package/dist/components/base/cards/smart-card.types.d.ts +12 -7
  112. package/dist/components/base/choice-inputs/checkbox.d.ts +7 -2
  113. package/dist/components/base/choice-inputs/switch-card.d.ts +7 -0
  114. package/dist/components/base/choice-inputs/toggle-field.d.ts +7 -0
  115. package/dist/components/base/combobox/combobox-field.d.ts +16 -0
  116. package/dist/components/base/date-pickers/datepicker.types.d.ts +7 -0
  117. package/dist/components/base/forms/controlled-form-field.d.ts +6 -6
  118. package/dist/components/base/forms/form-field.d.ts +5 -3
  119. package/dist/components/base/forms/index.d.ts +1 -0
  120. package/dist/components/base/forms/server-errors.d.ts +16 -0
  121. package/dist/components/base/forms/workflow.d.ts +5 -2
  122. package/dist/components/base/metadata-list/metadata-list.d.ts +3 -1
  123. package/dist/components/base/navigation/page-header/page-header.d.ts +4 -2
  124. package/dist/components/base/structure/composition.recipes.d.ts +17 -0
  125. package/dist/components/base/text-inputs/hooks/use-form-field-state.d.ts +7 -2
  126. package/dist/components/base/text-inputs/input.d.ts +4 -2
  127. package/dist/components/base/text-inputs/textarea.d.ts +4 -2
  128. package/dist/components/base/value-inputs/date-time-input.d.ts +2 -1
  129. package/dist/components/base/value-inputs/slider.d.ts +5 -1
  130. package/dist/components/base/value-inputs/tags-input.d.ts +5 -1
  131. package/dist/components/typography/text.styles.d.ts +26 -1
  132. package/dist/components/ui/combobox-dismiss.d.ts +16 -0
  133. package/dist/components/ui/combobox.d.ts +11 -6
  134. package/dist/components/ui/dialog.d.ts +1 -1
  135. package/dist/components/ui/popover.d.ts +1 -1
  136. package/dist/components/ui/sheet.d.ts +1 -1
  137. package/dist/composition.recipes-COdiFhxB.js +19 -0
  138. package/dist/composition.recipes-COdiFhxB.js.map +1 -0
  139. package/dist/containers-CRmHf7GP.js +104 -0
  140. package/dist/containers-CRmHf7GP.js.map +1 -0
  141. package/dist/{copyable-ClBuk_UK.js → copyable-CnGCZdX4.js} +4 -4
  142. package/dist/{copyable-ClBuk_UK.js.map → copyable-CnGCZdX4.js.map} +1 -1
  143. package/dist/{data-display-DT_khPl_.js → data-display-D4oujtx0.js} +239 -238
  144. package/dist/data-display-D4oujtx0.js.map +1 -0
  145. package/dist/{date-DCrsDTZc.js → date-Q7jnXxpk.js} +5 -5
  146. package/dist/{date-DCrsDTZc.js.map → date-Q7jnXxpk.js.map} +1 -1
  147. package/dist/{date-picker-ay0Pha_a.js → date-picker-zOt1oNss.js} +102 -90
  148. package/dist/date-picker-zOt1oNss.js.map +1 -0
  149. package/dist/date-pickers-cj8IXbDC.js +179 -0
  150. package/dist/date-pickers-cj8IXbDC.js.map +1 -0
  151. package/dist/{display-hAc1HjpI.js → display-BB4BL_-K.js} +8 -8
  152. package/dist/{display-hAc1HjpI.js.map → display-BB4BL_-K.js.map} +1 -1
  153. package/dist/{dropdown-menu-Cl4X7L5S.js → dropdown-menu-CjY8Vt7W.js} +8 -8
  154. package/dist/{dropdown-menu-Cl4X7L5S.js.map → dropdown-menu-CjY8Vt7W.js.map} +1 -1
  155. package/dist/features/activities.js +11 -11
  156. package/dist/features/ai-chat.js +9 -9
  157. package/dist/features/appointment-calendar.js +222 -220
  158. package/dist/features/appointment-calendar.js.map +1 -1
  159. package/dist/features/async-preview.js +8 -8
  160. package/dist/features/combobox.js +1 -1
  161. package/dist/features/comments.js +1 -1
  162. package/dist/features/data-view.js +10 -10
  163. package/dist/features/email-composer.js +275 -274
  164. package/dist/features/email-composer.js.map +1 -1
  165. package/dist/features/event-calendar.js +199 -198
  166. package/dist/features/event-calendar.js.map +1 -1
  167. package/dist/features/filters.js +1 -1
  168. package/dist/features/global-search.js +12 -12
  169. package/dist/features/kanban.js +4 -4
  170. package/dist/features/map.js +7 -7
  171. package/dist/features/media-library.js +623 -622
  172. package/dist/features/media-library.js.map +1 -1
  173. package/dist/features/mentions.js +1 -1
  174. package/dist/features/overlays.js +1 -1
  175. package/dist/features/products.js +973 -969
  176. package/dist/features/products.js.map +1 -1
  177. package/dist/features/questionnaire.js +12 -12
  178. package/dist/features/resource-assignment.js +8 -8
  179. package/dist/features/resource.js +113 -112
  180. package/dist/features/resource.js.map +1 -1
  181. package/dist/features/rich-text-editor.js +2 -2
  182. package/dist/features/schema-form.js +254 -253
  183. package/dist/features/schema-form.js.map +1 -1
  184. package/dist/features/suggestions.js +3 -3
  185. package/dist/features/sync.js +3 -3
  186. package/dist/features/table.js +1 -1
  187. package/dist/features/theme-tweaker.js +19 -19
  188. package/dist/features/theme-tweaker.js.map +1 -1
  189. package/dist/{feedback-BYIhtitP.js → feedback-DZNL5Lg1.js} +9 -9
  190. package/dist/{feedback-BYIhtitP.js.map → feedback-DZNL5Lg1.js.map} +1 -1
  191. package/dist/{field-affordance-recipes-DZhnIL_Y.js → field-affordance-recipes-DjwGx8eM.js} +2 -2
  192. package/dist/{field-affordance-recipes-DZhnIL_Y.js.map → field-affordance-recipes-DjwGx8eM.js.map} +1 -1
  193. package/dist/{filters-BGfvjP4d.js → filters-BcT-uoFy.js} +19 -19
  194. package/dist/{filters-BGfvjP4d.js.map → filters-BcT-uoFy.js.map} +1 -1
  195. package/dist/{form-field-CwH9y77i.js → form-field-CsgRmdit.js} +14 -8
  196. package/dist/form-field-CsgRmdit.js.map +1 -0
  197. package/dist/{form-sizing-BdP_Mf5p.js → form-sizing-NXgjkmBG.js} +3 -3
  198. package/dist/{form-sizing-BdP_Mf5p.js.map → form-sizing-NXgjkmBG.js.map} +1 -1
  199. package/dist/{forms-B9G_xwzi.js → forms-BV5m5aQF.js} +83 -65
  200. package/dist/forms-BV5m5aQF.js.map +1 -0
  201. package/dist/{forms-numeric-B_jraJaQ.js → forms-numeric-Cd33AKbD.js} +288 -288
  202. package/dist/forms-numeric-Cd33AKbD.js.map +1 -0
  203. package/dist/{header-CGXuhcRm.js → header-BA697l4a.js} +14 -14
  204. package/dist/{header-CGXuhcRm.js.map → header-BA697l4a.js.map} +1 -1
  205. package/dist/hooks/useFormErrors.d.ts +1 -1
  206. package/dist/{hooks-Dkz0K2WT.js → hooks-BQ-L7Uu2.js} +2 -2
  207. package/dist/{hooks-Dkz0K2WT.js.map → hooks-BQ-L7Uu2.js.map} +1 -1
  208. package/dist/{icon-badge-DYKIwvOV.js → icon-badge-COWbCCWu.js} +3 -3
  209. package/dist/{icon-badge-DYKIwvOV.js.map → icon-badge-COWbCCWu.js.map} +1 -1
  210. package/dist/index.js +2 -2
  211. package/dist/input-Cdw4k0fb.js +289 -0
  212. package/dist/input-Cdw4k0fb.js.map +1 -0
  213. package/dist/{input-CZw8iU99.js → input-DOPL5_QE.js} +3 -3
  214. package/dist/{input-CZw8iU99.js.map → input-DOPL5_QE.js.map} +1 -1
  215. package/dist/item-BvZ2DR_x.js +277 -0
  216. package/dist/item-BvZ2DR_x.js.map +1 -0
  217. package/dist/layout/app-shell.js +1 -1
  218. package/dist/layout/auth.js +1 -1
  219. package/dist/layout/containers.js +1 -1
  220. package/dist/layout/header.js +1 -1
  221. package/dist/layout/hooks.js +1 -1
  222. package/dist/layout/navigation.js +1 -1
  223. package/dist/layout/page.js +1 -1
  224. package/dist/layout/settings.js +1 -1
  225. package/dist/layout/sidebar.js +2 -2
  226. package/dist/layout/workspace.js +1 -1
  227. package/dist/layout.js +10 -10
  228. package/dist/lib/affordance-geometry.generated.d.ts +6 -0
  229. package/dist/lib/ui-provider/types.d.ts +1 -1
  230. package/dist/lib/use-popup-focus-recovery.d.ts +8 -0
  231. package/dist/lib/utils.js +1 -1
  232. package/dist/{media-gallery-3zIVLMWH.js → media-gallery-CSl5W1Fy.js} +6 -6
  233. package/dist/{media-gallery-3zIVLMWH.js.map → media-gallery-CSl5W1Fy.js.map} +1 -1
  234. package/dist/{mentions-utuUvH1K.js → mentions-RKOQaaIB.js} +8 -8
  235. package/dist/{mentions-utuUvH1K.js.map → mentions-RKOQaaIB.js.map} +1 -1
  236. package/dist/{message-DZ_ruyUV.js → message-INU2xsxu.js} +4 -4
  237. package/dist/{message-DZ_ruyUV.js.map → message-INU2xsxu.js.map} +1 -1
  238. package/dist/metadata-list-qVV7AVxa.js +443 -0
  239. package/dist/metadata-list-qVV7AVxa.js.map +1 -0
  240. package/dist/{navigation-BzhHI3lo.js → navigation-BQNcg1jT.js} +8 -8
  241. package/dist/{navigation-BzhHI3lo.js.map → navigation-BQNcg1jT.js.map} +1 -1
  242. package/dist/{navigation-Bnotn4AQ.js → navigation-DLF3E1IC.js} +7 -7
  243. package/dist/{navigation-Bnotn4AQ.js.map → navigation-DLF3E1IC.js.map} +1 -1
  244. package/dist/{navigation-row-recipes-BFLCk_Aq.js → navigation-row-recipes-WZEs-hYo.js} +2 -2
  245. package/dist/{navigation-row-recipes-BFLCk_Aq.js.map → navigation-row-recipes-WZEs-hYo.js.map} +1 -1
  246. package/dist/{number-DbV1Dija.js → number-E_OiIfJz.js} +5 -5
  247. package/dist/{number-DbV1Dija.js.map → number-E_OiIfJz.js.map} +1 -1
  248. package/dist/{overflow-tab-bar-CWY7Nogn.js → overflow-tab-bar-CrbqMteP.js} +107 -105
  249. package/dist/overflow-tab-bar-CrbqMteP.js.map +1 -0
  250. package/dist/{overlays-DNWmZrJ4.js → overlays-BlKynmde.js} +322 -319
  251. package/dist/overlays-BlKynmde.js.map +1 -0
  252. package/dist/page-CIwNUtGr.js +227 -0
  253. package/dist/page-CIwNUtGr.js.map +1 -0
  254. package/dist/page-header-commands-DFMlNYzN.js +128 -0
  255. package/dist/page-header-commands-DFMlNYzN.js.map +1 -0
  256. package/dist/{pagination-BL25hu2s.js → pagination-Ch8X_47u.js} +5 -5
  257. package/dist/{pagination-BL25hu2s.js.map → pagination-Ch8X_47u.js.map} +1 -1
  258. package/dist/{popover-menu-B9WWygpa.js → popover-menu-BYaCdFhf.js} +6 -6
  259. package/dist/{popover-menu-B9WWygpa.js.map → popover-menu-BYaCdFhf.js.map} +1 -1
  260. package/dist/{popover-7_m66eYW.js → popover-uwzX2vo7.js} +65 -63
  261. package/dist/popover-uwzX2vo7.js.map +1 -0
  262. package/dist/{primitives-BFK08r9M.js → primitives-Du64iDbb.js} +6 -6
  263. package/dist/{primitives-BFK08r9M.js.map → primitives-Du64iDbb.js.map} +1 -1
  264. package/dist/primitives.js +4 -4
  265. package/dist/{progress-B1VnCT0K.js → progress-BvF2oCdV.js} +5 -5
  266. package/dist/{progress-B1VnCT0K.js.map → progress-BvF2oCdV.js.map} +1 -1
  267. package/dist/{receipt-BVSOH3Xo.js → receipt-D789Jwyy.js} +6 -6
  268. package/dist/{receipt-BVSOH3Xo.js.map → receipt-D789Jwyy.js.map} +1 -1
  269. package/dist/{rich-text-GOUyKQ-s.js → rich-text-CLJEf76s.js} +4 -4
  270. package/dist/{rich-text-GOUyKQ-s.js.map → rich-text-CLJEf76s.js.map} +1 -1
  271. package/dist/{rich-text-editor-cRLC-eBK.js → rich-text-editor-Cm1dpUpQ.js} +10 -10
  272. package/dist/{rich-text-editor-cRLC-eBK.js.map → rich-text-editor-Cm1dpUpQ.js.map} +1 -1
  273. package/dist/{rich-text-editor-toolbar-DfXg0-VC.js → rich-text-editor-toolbar-L__e4x47.js} +4 -4
  274. package/dist/{rich-text-editor-toolbar-DfXg0-VC.js.map → rich-text-editor-toolbar-L__e4x47.js.map} +1 -1
  275. package/dist/{scroll-area-DcI-M1UT.js → scroll-area-La5RXsEk.js} +2 -2
  276. package/dist/{scroll-area-DcI-M1UT.js.map → scroll-area-La5RXsEk.js.map} +1 -1
  277. package/dist/{separator-Bom7NsGO.js → separator-DAEV0w65.js} +2 -2
  278. package/dist/{separator-Bom7NsGO.js.map → separator-DAEV0w65.js.map} +1 -1
  279. package/dist/{separator-BDV-Y648.js → separator-GNfPG-90.js} +3 -3
  280. package/dist/{separator-BDV-Y648.js.map → separator-GNfPG-90.js.map} +1 -1
  281. package/dist/services/actions.js +1 -1
  282. package/dist/settings-BA2iboic.js +174 -0
  283. package/dist/settings-BA2iboic.js.map +1 -0
  284. package/dist/{sheet-CGpB3omz.js → sheet-DoAxTb2J.js} +75 -73
  285. package/dist/sheet-DoAxTb2J.js.map +1 -0
  286. package/dist/{sidebar-A0ElHINE.js → sidebar-ByqKR_W5.js} +13 -13
  287. package/dist/{sidebar-A0ElHINE.js.map → sidebar-ByqKR_W5.js.map} +1 -1
  288. package/dist/{sidebar-CPx_7YBa.js → sidebar-D2iSnGJ7.js} +11 -11
  289. package/dist/{sidebar-CPx_7YBa.js.map → sidebar-D2iSnGJ7.js.map} +1 -1
  290. package/dist/{skeleton-Byjnt7qr.js → skeleton-CUj8O5Bd.js} +3 -3
  291. package/dist/{skeleton-Byjnt7qr.js.map → skeleton-CUj8O5Bd.js.map} +1 -1
  292. package/dist/smart-card-CqkzQsK-.js +614 -0
  293. package/dist/smart-card-CqkzQsK-.js.map +1 -0
  294. package/dist/{structure-BmisBK-3.js → structure-C0V0_Fyf.js} +3 -3
  295. package/dist/{structure-BmisBK-3.js.map → structure-C0V0_Fyf.js.map} +1 -1
  296. package/dist/{structure.recipes-EPz60cU8.js → structure.recipes-BB4-n58V.js} +2 -2
  297. package/dist/{structure.recipes-EPz60cU8.js.map → structure.recipes-BB4-n58V.js.map} +1 -1
  298. package/dist/style.css +1 -1
  299. package/dist/{table-DsfzoUia.js → table-CpvnzJn9.js} +3 -3
  300. package/dist/{table-DsfzoUia.js.map → table-CpvnzJn9.js.map} +1 -1
  301. package/dist/{table-BweFy_P9.js → table-DH7rozUv.js} +19 -19
  302. package/dist/{table-BweFy_P9.js.map → table-DH7rozUv.js.map} +1 -1
  303. package/dist/{tabs-CDocW5D1.js → tabs-eqVsJZWO.js} +7 -7
  304. package/dist/{tabs-CDocW5D1.js.map → tabs-eqVsJZWO.js.map} +1 -1
  305. package/dist/{text-inputs-f9Ia-aCi.js → text-inputs-DXItiR0O.js} +101 -98
  306. package/dist/text-inputs-DXItiR0O.js.map +1 -0
  307. package/dist/{text.styles-g4He6UIW.js → text.styles-B64My8RZ.js} +25 -10
  308. package/dist/text.styles-B64My8RZ.js.map +1 -0
  309. package/dist/theme.css +152 -112
  310. package/dist/{timelines-CwM_9IhD.js → timelines-DmtztAY_.js} +10 -10
  311. package/dist/{timelines-CwM_9IhD.js.map → timelines-DmtztAY_.js.map} +1 -1
  312. package/dist/{tooltip-yiRJUFjp.js → tooltip-B4hjKtoV.js} +3 -3
  313. package/dist/{tooltip-yiRJUFjp.js.map → tooltip-B4hjKtoV.js.map} +1 -1
  314. package/dist/{tree-WnKQzwbq.js → tree-CV11PURP.js} +8 -8
  315. package/dist/{tree-WnKQzwbq.js.map → tree-CV11PURP.js.map} +1 -1
  316. package/dist/typography/rich-text.js +1 -1
  317. package/dist/typography-CSyJrh28.js +117 -0
  318. package/dist/typography-CSyJrh28.js.map +1 -0
  319. package/dist/typography.js +1 -1
  320. package/dist/{ui-provider-C_U0Xma4.js → ui-provider-CQCuCBcy.js} +3 -3
  321. package/dist/ui-provider-CQCuCBcy.js.map +1 -0
  322. package/dist/ui-provider.js +1 -1
  323. package/dist/{upload-CXyxmQBP.js → upload-C9SA0X-8.js} +11 -11
  324. package/dist/{upload-CXyxmQBP.js.map → upload-C9SA0X-8.js.map} +1 -1
  325. package/dist/{upload-queue-Boscubn9.js → upload-queue-DhQJiSRc.js} +9 -9
  326. package/dist/{upload-queue-Boscubn9.js.map → upload-queue-DhQJiSRc.js.map} +1 -1
  327. package/dist/{usage-card-BhO5eqkX.js → usage-card-DVTRDmGz.js} +134 -133
  328. package/dist/usage-card-DVTRDmGz.js.map +1 -0
  329. package/dist/use-popup-focus-recovery-C0QPvgOR.js +36 -0
  330. package/dist/use-popup-focus-recovery-C0QPvgOR.js.map +1 -0
  331. package/dist/{utils-BRhFDwuU.js → utils-CF3c95Io.js} +68 -5
  332. package/dist/utils-CF3c95Io.js.map +1 -0
  333. package/dist/value-inputs-C0o70p-U.js +980 -0
  334. package/dist/value-inputs-C0o70p-U.js.map +1 -0
  335. package/dist/{value-typography-BP8OG6h5.js → value-typography-ClupF0Gz.js} +2 -2
  336. package/dist/{value-typography-BP8OG6h5.js.map → value-typography-ClupF0Gz.js.map} +1 -1
  337. package/dist/workspace-9EFVXUyk.js +410 -0
  338. package/dist/workspace-9EFVXUyk.js.map +1 -0
  339. package/docs/consumer-skill/SKILL.md +14 -129
  340. package/docs/consumer-skill/examples/app-layout.tsx +22 -12
  341. package/docs/consumer-skill/examples/authentication.tsx +77 -0
  342. package/docs/consumer-skill/examples/edit.tsx +30 -38
  343. package/docs/consumer-skill/examples/manifest.json +51 -1
  344. package/docs/consumer-skill/examples/rhf-bindings.tsx +86 -0
  345. package/docs/consumer-skill/examples/rhf-edit-page.tsx +141 -0
  346. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +92 -0
  347. package/docs/consumer-skill/examples/rhf-transport.tsx +28 -0
  348. package/docs/consumer-skill/references/agents-md.md +17 -7
  349. package/docs/consumer-skill/references/authentication.md +42 -0
  350. package/docs/consumer-skill/references/component-contracts.json +319824 -0
  351. package/docs/consumer-skill/references/composition-mapping.md +92 -0
  352. package/docs/consumer-skill/references/composition.md +43 -19
  353. package/docs/consumer-skill/references/design-contract.md +32 -0
  354. package/docs/consumer-skill/references/discovery.md +84 -7
  355. package/docs/consumer-skill/references/installation.md +45 -35
  356. package/docs/consumer-skill/references/integration.md +6 -2
  357. package/docs/consumer-skill/references/public-api.json +1520 -66
  358. package/docs/consumer-skill/references/review.md +9 -4
  359. package/docs/consumer-skill/references/rhf-workflows.md +86 -0
  360. package/docs/consumer-skill/references/screen-archetypes.md +22 -0
  361. package/docs/consumer-skill/references/theming.md +8 -9
  362. package/docs/consumer-skill/references/tokens.json +12 -3
  363. package/docs/consumer-skill/references/workflows.md +7 -5
  364. package/docs/consumer-skill/scripts/composition-schema.d.mts +2 -0
  365. package/docs/consumer-skill/scripts/composition-schema.mjs +32 -0
  366. package/docs/consumer-skill/scripts/composition.mjs +198 -0
  367. package/docs/consumer-skill/scripts/discovery.mjs +42 -10
  368. package/docs/consumer-skill/scripts/inspect-component.mjs +11 -0
  369. package/docs/consumer-skill/scripts/inspect-tokens.mjs +11 -0
  370. package/docs/consumer-skill/scripts/inspection.mjs +138 -0
  371. package/docs/consumer-skill/scripts/map-composition.mjs +12 -0
  372. package/docs/consumer-skill/scripts/setup-skills.mjs +76 -0
  373. package/docs/consumer-skills/themelia-components/SKILL.md +30 -0
  374. package/docs/consumer-skills/themelia-composition/SKILL.md +35 -0
  375. package/docs/consumer-skills/themelia-forms/SKILL.md +12 -0
  376. package/docs/consumer-skills/themelia-foundation/SKILL.md +14 -0
  377. package/docs/consumer-skills/themelia-tokenization/SKILL.md +35 -0
  378. package/package.json +6 -4
  379. package/templates/README.md +39 -0
  380. package/templates/admin-shell-template.tsx +382 -0
  381. package/templates/analytics-operations-template.tsx +376 -0
  382. package/templates/customers-template.tsx +509 -0
  383. package/templates/index.ts +29 -0
  384. package/templates/orders-template.tsx +1102 -0
  385. package/templates/products-template.tsx +834 -0
  386. package/templates/user-permissions-template.tsx +450 -0
  387. package/dist/action-menu-CllU52Mm.js +0 -280
  388. package/dist/action-menu-CllU52Mm.js.map +0 -1
  389. package/dist/affordance-geometry.generated-tF36bREk.js.map +0 -1
  390. package/dist/ai-artifact-DvTwDVyL.js.map +0 -1
  391. package/dist/app-shell-C4FhvCqF.js.map +0 -1
  392. package/dist/cards-BaBZR-AU.js.map +0 -1
  393. package/dist/checkbox-AWIhNhmo.js.map +0 -1
  394. package/dist/choice-inputs-CNHvARCJ.js.map +0 -1
  395. package/dist/combobox-C0EQW6dr.js.map +0 -1
  396. package/dist/combobox-xCQ2RMNE.js.map +0 -1
  397. package/dist/comments-BYYlTA8E.js.map +0 -1
  398. package/dist/containers-Mu1LMGV1.js +0 -103
  399. package/dist/containers-Mu1LMGV1.js.map +0 -1
  400. package/dist/data-display-DT_khPl_.js.map +0 -1
  401. package/dist/date-picker-ay0Pha_a.js.map +0 -1
  402. package/dist/date-pickers-Ccw8DL2b.js +0 -175
  403. package/dist/date-pickers-Ccw8DL2b.js.map +0 -1
  404. package/dist/form-field-CwH9y77i.js.map +0 -1
  405. package/dist/forms-B9G_xwzi.js.map +0 -1
  406. package/dist/forms-numeric-B_jraJaQ.js.map +0 -1
  407. package/dist/input-DQdEd0YD.js +0 -263
  408. package/dist/input-DQdEd0YD.js.map +0 -1
  409. package/dist/item-K5_ghvze.js +0 -275
  410. package/dist/item-K5_ghvze.js.map +0 -1
  411. package/dist/metadata-list-8N16ZMW_.js +0 -405
  412. package/dist/metadata-list-8N16ZMW_.js.map +0 -1
  413. package/dist/overflow-tab-bar-CWY7Nogn.js.map +0 -1
  414. package/dist/overlays-DNWmZrJ4.js.map +0 -1
  415. package/dist/page-Bgl1F560.js +0 -224
  416. package/dist/page-Bgl1F560.js.map +0 -1
  417. package/dist/page-header-commands-DOb6WsfD.js +0 -126
  418. package/dist/page-header-commands-DOb6WsfD.js.map +0 -1
  419. package/dist/popover-7_m66eYW.js.map +0 -1
  420. package/dist/settings-ybnjVwbd.js +0 -171
  421. package/dist/settings-ybnjVwbd.js.map +0 -1
  422. package/dist/sheet-CGpB3omz.js.map +0 -1
  423. package/dist/smart-card-DiC5aac3.js +0 -604
  424. package/dist/smart-card-DiC5aac3.js.map +0 -1
  425. package/dist/text-inputs-f9Ia-aCi.js.map +0 -1
  426. package/dist/text.styles-g4He6UIW.js.map +0 -1
  427. package/dist/typography-UTnveOEy.js +0 -117
  428. package/dist/typography-UTnveOEy.js.map +0 -1
  429. package/dist/ui-provider-C_U0Xma4.js.map +0 -1
  430. package/dist/usage-card-BhO5eqkX.js.map +0 -1
  431. package/dist/utils-BRhFDwuU.js.map +0 -1
  432. package/dist/value-inputs-DXPDjvBU.js +0 -963
  433. package/dist/value-inputs-DXPDjvBU.js.map +0 -1
  434. package/dist/workspace-Cdrg7k9f.js +0 -408
  435. package/dist/workspace-Cdrg7k9f.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { s as e } from "./ui-provider-C_U0Xma4.js";
2
+ import { s as e } from "./ui-provider-CQCuCBcy.js";
3
3
  import { useStrings as t } from "./lib/strings.js";
4
- import { t as n } from "./utils-BRhFDwuU.js";
5
- import { n as r } from "./buttons-DPZekJFu.js";
6
- import { c as i } from "./typography-UTnveOEy.js";
4
+ import { t as n } from "./utils-CF3c95Io.js";
5
+ import { n as r } from "./buttons-BbfzgczK.js";
6
+ import { c as i } from "./typography-CSyJrh28.js";
7
7
  import { t as a } from "./focus-recipes-B653VaLq.js";
8
- import { t as o } from "./structure-BmisBK-3.js";
9
- import { t as s } from "./scroll-area-DcI-M1UT.js";
8
+ import { t as o } from "./structure-C0V0_Fyf.js";
9
+ import { t as s } from "./scroll-area-La5RXsEk.js";
10
10
  import { useLayoutEffect as c, useRef as l, useState as u } from "react";
11
11
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
12
12
  import { ChevronLeft as p, ChevronRight as m } from "lucide-react";
@@ -188,4 +188,4 @@ function O({ className: e, children: t, ...r }) {
188
188
  //#endregion
189
189
  export { v as a, D as i, O as n, _ as o, E as r, T as t };
190
190
 
191
- //# sourceMappingURL=tabs-CDocW5D1.js.map
191
+ //# sourceMappingURL=tabs-eqVsJZWO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-CDocW5D1.js","names":["Tabs","TabsPrimitive","TabsList","TabsTrigger","TabsContent","Tabs","PrimitiveTabs","PrimitiveTabsList","PrimitiveTabsTrigger","PrimitiveTabsContent","useDensityConfig","cn","Button","Text","focusRecipes","Stack","ScrollArea","defaultTabsScrollStrings","TabScrollViewport","stringsProp","strings","useStrings","frameRef","useRef","viewportRef","edges","setEdges","useState","viewport","measure","maximum","offset","available","style","inset","next","current","reveal","selected","bounds","item","resize","selection","scroll","rtl","reduce","direction","ChevronLeft","ChevronRight","Tabs$2","props","Tabs","orientation","className","tabsListVariants","cva","TabsList$1","variant","TabsTrigger$1","TabsContent$1","isSimpleText","value","Tabs$1","TabsList","height","defaultScale","list","scrollable","scrollStrings","TabsTrigger","children","TabsContent"],"sources":["../src/components/base/navigation/tab-scroll-viewport.tsx","../src/components/ui/tabs.tsx","../src/components/base/navigation/tabs.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { Button } from '../buttons';\nimport { ScrollArea } from '../display/scroll-area';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\n\nexport interface TabsScrollStrings {\n\tprevious: string;\n\tnext: string;\n}\n\nexport const defaultTabsScrollStrings: TabsScrollStrings = {\n\tprevious: 'Previous tabs',\n\tnext: 'Next tabs',\n};\n\n/** Shared scroll mechanics for state tabs and route tabs; selection stays with each owner. */\nexport function TabScrollViewport({ children, strings: stringsProp }: {\n\tchildren: ReactNode;\n\tstrings?: StringsProp<TabsScrollStrings>;\n}) {\n\tconst strings = useStrings(defaultTabsScrollStrings, stringsProp);\n\tconst frameRef = useRef<HTMLDivElement>(null);\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst [edges, setEdges] = useState({ overflow: false, start: true, end: true });\n\n\tuseLayoutEffect(() => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst measure = () => {\n\t\t\tconst maximum = viewport.scrollWidth - viewport.clientWidth;\n\t\t\tconst offset = Math.abs(viewport.scrollLeft);\n\t\t\t// Measure the full row so visible arrows cannot keep themselves alive after a resize.\n\t\t\tconst available = frameRef.current?.clientWidth || viewport.clientWidth;\n\t\t\t// The viewport's ring inset is outside the row (negative margin), so it is not content.\n\t\t\tconst style = getComputedStyle(viewport);\n\t\t\tconst inset = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n\t\t\tconst next = { overflow: viewport.scrollWidth - inset > available + 1, start: offset <= 1, end: offset >= maximum - 1 };\n\t\t\tsetEdges(current => current.overflow === next.overflow && current.start === next.start && current.end === next.end ? current : next);\n\t\t};\n\t\tconst reveal = () => {\n\t\t\tconst selected = viewport.querySelector<HTMLElement>('[aria-selected=\"true\"], [aria-current=\"page\"]');\n\t\t\tif (selected) {\n\t\t\t\tconst bounds = viewport.getBoundingClientRect();\n\t\t\t\tconst item = selected.getBoundingClientRect();\n\t\t\t\tif (item.left < bounds.left) viewport.scrollLeft += item.left - bounds.left;\n\t\t\t\telse if (item.right > bounds.right) viewport.scrollLeft += item.right - bounds.right;\n\t\t\t}\n\t\t\tmeasure();\n\t\t};\n\t\tmeasure();\n\t\tviewport.addEventListener('scroll', measure, { passive: true });\n\t\tconst resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(reveal);\n\t\tresize?.observe(viewport);\n\t\tif (frameRef.current) resize?.observe(frameRef.current);\n\t\tif (viewport.firstElementChild) resize?.observe(viewport.firstElementChild);\n\t\tconst selection = new MutationObserver(reveal);\n\t\tselection.observe(viewport, { subtree: true, attributes: true, attributeFilter: ['aria-selected', 'aria-current'] });\n\t\treveal();\n\t\treturn () => { viewport.removeEventListener('scroll', measure); resize?.disconnect(); selection.disconnect(); };\n\t}, []);\n\n\tconst scroll = (direction: number) => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst rtl = getComputedStyle(viewport).direction === 'rtl';\n\t\tconst reduce = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\t\tviewport.scrollBy({ left: direction * (rtl ? -1 : 1) * viewport.clientWidth * 0.75, behavior: reduce ? 'instant' : 'smooth' });\n\t};\n\n\treturn <Stack ref={frameRef} direction=\"horizontal\" gap=\"xs\" align=\"center\" wrap={false} className=\"tab-scroll--component w-full min-w-0\">\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronLeft} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.previous} disabled={edges.start} onClick={() => scroll(-1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t\t{/* The inset only gives focus rings and the active tab's shadow room inside the\n\t\t clipping viewport; the matching negative margin keeps the list on the\n\t\t container's edge and centred on the arrows. The arrows replace the\n\t\t scrollbar, so it no longer needs reserved space under the tabs. */}\n\t\t<ScrollArea orientation=\"horizontal\" viewportRef={viewportRef} className=\"-m-space-xs min-w-0 flex-1\" viewportClassName=\"p-space-xs\" scrollbarClassName=\"hidden\">{children}</ScrollArea>\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronRight} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.next} disabled={edges.end} onClick={() => scroll(1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t</Stack>;\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { focusRecipes } from \"../../lib/focus-recipes\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"gap-space-md group/tabs flex data-[orientation=horizontal]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"box-border rounded-inner p-space-2xs h-action data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-space-xs bg-transparent\",\n // Wrapping toggle chips (saved views, filter presets): no track, compact\n // pressed-state triggers that wrap onto further lines.\n chips: \"h-auto flex-wrap justify-start gap-space-xs bg-transparent p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n `box-border font-sans gap-space-sm rounded-inner border border-transparent px-space-md py-space-xs text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-icon outline-none ${focusRecipes.frame} text-muted-foreground hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n // The card fill is lighter than the muted track in both themes; the page\n // background is darker than the track in dark mode and reads as recessed.\n \"data-active:bg-card data-active:text-foreground\",\n // Chips use the toggle recipe: a muted hover and the accent pressed fill.\n \"group-data-[variant=chips]/tabs-list:h-action-sm group-data-[variant=chips]/tabs-list:flex-none group-data-[variant=chips]/tabs-list:px-control-sm group-data-[variant=chips]/tabs-list:py-0 group-data-[variant=chips]/tabs-list:after:hidden group-data-[variant=chips]/tabs-list:hover:bg-muted group-data-[variant=chips]/tabs-list:data-active:bg-accent group-data-[variant=chips]/tabs-list:data-active:text-accent-foreground group-data-[variant=chips]/tabs-list:data-active:hover:bg-accent group-data-[variant=chips]/tabs-list:data-active:hover:text-accent-foreground\",\n \"after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"text-sm flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","/**\n * Typography- and token-aware wrappers around the internal shadcn tabs parts.\n *\n * Raw anatomy and these wrappers share token-backed spacing. The wrappers\n * add stable public hooks, canonical corners, scalar text and scroll controls;\n * the primitive owns tab/list interaction and the nested list inset.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tTabs as PrimitiveTabs,\n\tTabsContent as PrimitiveTabsContent,\n\tTabsList as PrimitiveTabsList,\n\tTabsTrigger as PrimitiveTabsTrigger,\n} from '../../ui/tabs';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport type { StringsProp } from '../../../lib/strings';\nimport { TabScrollViewport, type TabsScrollStrings } from './tab-scroll-viewport';\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport function Tabs({ className, ...props }: ComponentProps<typeof PrimitiveTabs>) {\n\treturn <PrimitiveTabs className={cn('tabs--component', className)} {...props} />;\n}\n\nexport type TabsListProps = ComponentProps<typeof PrimitiveTabsList> & {\n\t/** Adds previous/next controls when the tab list exceeds its container. */\n\tscrollable?: boolean;\n\t/** Accessible labels for the previous/next scroll controls. */\n\tscrollStrings?: StringsProp<TabsScrollStrings>;\n};\n\nexport function TabsList({ className, scrollable = false, scrollStrings, ...props }: TabsListProps) {\n\tconst { defaultScale } = useDensityConfig();\n\t// Chips wrap onto further lines, so the list takes its height from them.\n\tconst height = props.variant === 'chips' ? undefined : defaultScale === 'sm' ? 'h-action-sm' : defaultScale === 'lg' ? 'h-action-lg' : 'h-action';\n\tconst list = (\n\t\t<PrimitiveTabsList\n\t\t\tclassName={cn('tabs-list--component', 'rounded-inner', height, scrollable && 'w-max', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n\treturn scrollable ? <TabScrollViewport strings={scrollStrings}>{list}</TabScrollViewport> : list;\n}\n\nexport function TabsTrigger({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsTrigger>) {\n\treturn (\n\t\t<PrimitiveTabsTrigger\n\t\t\tclassName={cn(\n\t\t\t\t'tabs-trigger--component',\n\t\t\t\t'gap-space-sm rounded-inner px-space-md py-space-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</PrimitiveTabsTrigger>\n\t);\n}\n\nexport function TabsContent({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsContent>) {\n\treturn (\n\t\t<PrimitiveTabsContent className={cn('tabs-content--component', className)} {...props}>\n\t\t\t{isSimpleText(children) ? <Text>{children}</Text> : children}\n\t\t</PrimitiveTabsContent>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tabs-eqVsJZWO.js","names":["Tabs","TabsPrimitive","TabsList","TabsTrigger","TabsContent","Tabs","PrimitiveTabs","PrimitiveTabsList","PrimitiveTabsTrigger","PrimitiveTabsContent","useDensityConfig","cn","Button","Text","focusRecipes","Stack","ScrollArea","defaultTabsScrollStrings","TabScrollViewport","stringsProp","strings","useStrings","frameRef","useRef","viewportRef","edges","setEdges","useState","viewport","measure","maximum","offset","available","style","inset","next","current","reveal","selected","bounds","item","resize","selection","scroll","rtl","reduce","direction","ChevronLeft","ChevronRight","Tabs$2","props","Tabs","orientation","className","tabsListVariants","cva","TabsList$1","variant","TabsTrigger$1","TabsContent$1","isSimpleText","value","Tabs$1","TabsList","height","defaultScale","list","scrollable","scrollStrings","TabsTrigger","children","TabsContent"],"sources":["../src/components/base/navigation/tab-scroll-viewport.tsx","../src/components/ui/tabs.tsx","../src/components/base/navigation/tabs.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { Button } from '../buttons';\nimport { ScrollArea } from '../display/scroll-area';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\n\nexport interface TabsScrollStrings {\n\tprevious: string;\n\tnext: string;\n}\n\nexport const defaultTabsScrollStrings: TabsScrollStrings = {\n\tprevious: 'Previous tabs',\n\tnext: 'Next tabs',\n};\n\n/** Shared scroll mechanics for state tabs and route tabs; selection stays with each owner. */\nexport function TabScrollViewport({ children, strings: stringsProp }: {\n\tchildren: ReactNode;\n\tstrings?: StringsProp<TabsScrollStrings>;\n}) {\n\tconst strings = useStrings(defaultTabsScrollStrings, stringsProp);\n\tconst frameRef = useRef<HTMLDivElement>(null);\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst [edges, setEdges] = useState({ overflow: false, start: true, end: true });\n\n\tuseLayoutEffect(() => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst measure = () => {\n\t\t\tconst maximum = viewport.scrollWidth - viewport.clientWidth;\n\t\t\tconst offset = Math.abs(viewport.scrollLeft);\n\t\t\t// Measure the full row so visible arrows cannot keep themselves alive after a resize.\n\t\t\tconst available = frameRef.current?.clientWidth || viewport.clientWidth;\n\t\t\t// The viewport's ring inset is outside the row (negative margin), so it is not content.\n\t\t\tconst style = getComputedStyle(viewport);\n\t\t\tconst inset = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n\t\t\tconst next = { overflow: viewport.scrollWidth - inset > available + 1, start: offset <= 1, end: offset >= maximum - 1 };\n\t\t\tsetEdges(current => current.overflow === next.overflow && current.start === next.start && current.end === next.end ? current : next);\n\t\t};\n\t\tconst reveal = () => {\n\t\t\tconst selected = viewport.querySelector<HTMLElement>('[aria-selected=\"true\"], [aria-current=\"page\"]');\n\t\t\tif (selected) {\n\t\t\t\tconst bounds = viewport.getBoundingClientRect();\n\t\t\t\tconst item = selected.getBoundingClientRect();\n\t\t\t\tif (item.left < bounds.left) viewport.scrollLeft += item.left - bounds.left;\n\t\t\t\telse if (item.right > bounds.right) viewport.scrollLeft += item.right - bounds.right;\n\t\t\t}\n\t\t\tmeasure();\n\t\t};\n\t\tmeasure();\n\t\tviewport.addEventListener('scroll', measure, { passive: true });\n\t\tconst resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(reveal);\n\t\tresize?.observe(viewport);\n\t\tif (frameRef.current) resize?.observe(frameRef.current);\n\t\tif (viewport.firstElementChild) resize?.observe(viewport.firstElementChild);\n\t\tconst selection = new MutationObserver(reveal);\n\t\tselection.observe(viewport, { subtree: true, attributes: true, attributeFilter: ['aria-selected', 'aria-current'] });\n\t\treveal();\n\t\treturn () => { viewport.removeEventListener('scroll', measure); resize?.disconnect(); selection.disconnect(); };\n\t}, []);\n\n\tconst scroll = (direction: number) => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst rtl = getComputedStyle(viewport).direction === 'rtl';\n\t\tconst reduce = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\t\tviewport.scrollBy({ left: direction * (rtl ? -1 : 1) * viewport.clientWidth * 0.75, behavior: reduce ? 'instant' : 'smooth' });\n\t};\n\n\treturn <Stack ref={frameRef} direction=\"horizontal\" gap=\"xs\" align=\"center\" wrap={false} className=\"tab-scroll--component w-full min-w-0\">\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronLeft} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.previous} disabled={edges.start} onClick={() => scroll(-1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t\t{/* The inset only gives focus rings and the active tab's shadow room inside the\n\t\t clipping viewport; the matching negative margin keeps the list on the\n\t\t container's edge and centred on the arrows. The arrows replace the\n\t\t scrollbar, so it no longer needs reserved space under the tabs. */}\n\t\t<ScrollArea orientation=\"horizontal\" viewportRef={viewportRef} className=\"-m-space-xs min-w-0 flex-1\" viewportClassName=\"p-space-xs\" scrollbarClassName=\"hidden\">{children}</ScrollArea>\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronRight} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.next} disabled={edges.end} onClick={() => scroll(1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t</Stack>;\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { focusRecipes } from \"../../lib/focus-recipes\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"gap-space-md group/tabs flex data-[orientation=horizontal]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"box-border rounded-inner p-space-2xs h-action data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-space-xs bg-transparent\",\n // Wrapping toggle chips (saved views, filter presets): no track, compact\n // pressed-state triggers that wrap onto further lines.\n chips: \"h-auto flex-wrap justify-start gap-space-xs bg-transparent p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n `box-border font-sans gap-space-sm rounded-inner border border-transparent px-space-md py-space-xs text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-icon outline-none ${focusRecipes.frame} text-muted-foreground hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n // The card fill is lighter than the muted track in both themes; the page\n // background is darker than the track in dark mode and reads as recessed.\n \"data-active:bg-card data-active:text-foreground\",\n // Chips use the toggle recipe: a muted hover and the accent pressed fill.\n \"group-data-[variant=chips]/tabs-list:h-action-sm group-data-[variant=chips]/tabs-list:flex-none group-data-[variant=chips]/tabs-list:px-control-sm group-data-[variant=chips]/tabs-list:py-0 group-data-[variant=chips]/tabs-list:after:hidden group-data-[variant=chips]/tabs-list:hover:bg-muted group-data-[variant=chips]/tabs-list:data-active:bg-accent group-data-[variant=chips]/tabs-list:data-active:text-accent-foreground group-data-[variant=chips]/tabs-list:data-active:hover:bg-accent group-data-[variant=chips]/tabs-list:data-active:hover:text-accent-foreground\",\n \"after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"text-sm flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","/**\n * Typography- and token-aware wrappers around the internal shadcn tabs parts.\n *\n * Raw anatomy and these wrappers share token-backed spacing. The wrappers\n * add stable public hooks, canonical corners, scalar text and scroll controls;\n * the primitive owns tab/list interaction and the nested list inset.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tTabs as PrimitiveTabs,\n\tTabsContent as PrimitiveTabsContent,\n\tTabsList as PrimitiveTabsList,\n\tTabsTrigger as PrimitiveTabsTrigger,\n} from '../../ui/tabs';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport type { StringsProp } from '../../../lib/strings';\nimport { TabScrollViewport, type TabsScrollStrings } from './tab-scroll-viewport';\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport function Tabs({ className, ...props }: ComponentProps<typeof PrimitiveTabs>) {\n\treturn <PrimitiveTabs className={cn('tabs--component', className)} {...props} />;\n}\n\nexport type TabsListProps = ComponentProps<typeof PrimitiveTabsList> & {\n\t/** Adds previous/next controls when the tab list exceeds its container. */\n\tscrollable?: boolean;\n\t/** Accessible labels for the previous/next scroll controls. */\n\tscrollStrings?: StringsProp<TabsScrollStrings>;\n};\n\nexport function TabsList({ className, scrollable = false, scrollStrings, ...props }: TabsListProps) {\n\tconst { defaultScale } = useDensityConfig();\n\t// Chips wrap onto further lines, so the list takes its height from them.\n\tconst height = props.variant === 'chips' ? undefined : defaultScale === 'sm' ? 'h-action-sm' : defaultScale === 'lg' ? 'h-action-lg' : 'h-action';\n\tconst list = (\n\t\t<PrimitiveTabsList\n\t\t\tclassName={cn('tabs-list--component', 'rounded-inner', height, scrollable && 'w-max', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n\treturn scrollable ? <TabScrollViewport strings={scrollStrings}>{list}</TabScrollViewport> : list;\n}\n\nexport function TabsTrigger({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsTrigger>) {\n\treturn (\n\t\t<PrimitiveTabsTrigger\n\t\t\tclassName={cn(\n\t\t\t\t'tabs-trigger--component',\n\t\t\t\t'gap-space-sm rounded-inner px-space-md py-space-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</PrimitiveTabsTrigger>\n\t);\n}\n\nexport function TabsContent({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsContent>) {\n\treturn (\n\t\t<PrimitiveTabsContent className={cn('tabs-content--component', className)} {...props}>\n\t\t\t{isSimpleText(children) ? <Text>{children}</Text> : children}\n\t\t</PrimitiveTabsContent>\n\t);\n}\n"],"mappings":"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"}
@@ -1,120 +1,123 @@
1
1
  "use client";
2
- import { s as e } from "./ui-provider-C_U0Xma4.js";
2
+ import { s as e } from "./ui-provider-CQCuCBcy.js";
3
3
  import { useStrings as t } from "./lib/strings.js";
4
- import { t as n } from "./utils-BRhFDwuU.js";
5
- import { t as r } from "./affordance-geometry.generated-tF36bREk.js";
6
- import { n as i } from "./buttons-DPZekJFu.js";
7
- import { c as a } from "./typography-UTnveOEy.js";
4
+ import { t as n } from "./utils-CF3c95Io.js";
5
+ import { t as r } from "./affordance-geometry.generated-B8yGOr8-.js";
6
+ import { n as i } from "./buttons-BbfzgczK.js";
7
+ import { c as a } from "./typography-CSyJrh28.js";
8
8
  import { t as o } from "./field-state-recipes-BVA2CWHo.js";
9
- import { n as s } from "./field-affordance-recipes-DZhnIL_Y.js";
9
+ import { n as s } from "./field-affordance-recipes-DjwGx8eM.js";
10
10
  import { t as c } from "./editable-text-recipe-Cn61kEcv.js";
11
- import { _ as l, a as u, g as d, o as f, u as p, v as m, y as h } from "./form-sizing-BdP_Mf5p.js";
12
- import { a as g, i as _, o as v, r as y, t as b } from "./input-DQdEd0YD.js";
13
- import { t as x } from "./input-CZw8iU99.js";
11
+ import { _ as l, a as u, g as d, o as f, u as p, v as m, y as h } from "./form-sizing-NXgjkmBG.js";
12
+ import { a as g, i as _, o as v, r as y, t as b } from "./input-Cdw4k0fb.js";
13
+ import { t as x } from "./input-DOPL5_QE.js";
14
14
  import * as S from "react";
15
15
  import { useCallback as C, useEffect as w, useRef as T } from "react";
16
16
  import { jsx as E, jsxs as D } from "react/jsx-runtime";
17
17
  import { Eye as O, EyeOff as k, Loader2Icon as ee } from "lucide-react";
18
18
  import { cva as A } from "class-variance-authority";
19
19
  //#region src/components/base/text-inputs/textarea.tsx
20
- var te = { clear: "Clear textarea" }, j = S.forwardRef(({ className: i, maxLength: u, showCharacterCount: f, clearable: p, onClear: _, loading: b = !1, invalid: x, size: S, autoResize: O = !1, minRows: k = 2, maxRows: A, onChange: j, value: M, defaultValue: N, id: P, strings: F, ...I }, L) => {
21
- let R = T(null), z = t(te, F), { defaultScale: B } = e(), V = h(S, B), { id: H, value: U, isReactHookForm: W, characterCount: G, hasCharacterLimit: K, showCount: q, hasValue: J, updateValue: Y, wouldExceedLimit: X } = v({
22
- controlledValue: M,
23
- defaultValue: N,
24
- maxLength: u,
25
- showCharacterCount: f,
26
- providedId: P,
20
+ var te = { clear: "Clear textarea" }, j = S.forwardRef((i, u) => {
21
+ let { className: f, maxLength: p, showCharacterCount: _, clearable: b, onClear: x, loading: S = !1, invalid: O, size: k, autoResize: A = !1, minRows: j = 2, maxRows: M, onChange: N, onValueChange: P, value: F, defaultValue: I, id: L, strings: ne, ...R } = i, z = T(null), B = t(te, ne), { defaultScale: V } = e(), H = h(k, V), { id: U, value: W, isControlled: G, characterCount: K, hasCharacterLimit: q, showCount: J, hasValue: Y, updateValue: X, wouldExceedLimit: Z } = v({
22
+ controlledValue: F,
23
+ hasControlledValue: "value" in i,
24
+ nativeRef: z,
25
+ defaultValue: I,
26
+ maxLength: p,
27
+ showCharacterCount: _,
28
+ providedId: L,
27
29
  idPrefix: "textarea",
28
- hasOnChange: j !== void 0
29
- }), Z = !!x, Q = C(() => {
30
- if (!O || !R.current) return;
31
- let e = R.current, t = getComputedStyle(e), n = Number.parseFloat(t.lineHeight) || 20, r = (Number.parseFloat(t.paddingTop) || 0) + (Number.parseFloat(t.paddingBottom) || 0), i = t.boxSizing === "border-box" ? (Number.parseFloat(t.borderTopWidth) || 0) + (Number.parseFloat(t.borderBottomWidth) || 0) : 0;
30
+ hasOnChange: N !== void 0
31
+ }), Q = !!O, $ = C(() => {
32
+ if (!A || !z.current) return;
33
+ let e = z.current, t = getComputedStyle(e), n = Number.parseFloat(t.lineHeight) || 20, r = (Number.parseFloat(t.paddingTop) || 0) + (Number.parseFloat(t.paddingBottom) || 0), i = t.boxSizing === "border-box" ? (Number.parseFloat(t.borderTopWidth) || 0) + (Number.parseFloat(t.borderBottomWidth) || 0) : 0;
32
34
  e.style.height = "auto";
33
- let a = n * k + r + i, o = A ? n * A + r + i : Infinity, s = Math.min(Math.max(e.scrollHeight + i, a), o);
35
+ let a = n * j + r + i, o = M ? n * M + r + i : Infinity, s = Math.min(Math.max(e.scrollHeight + i, a), o);
34
36
  e.style.height = `${s}px`;
35
37
  }, [
36
- O,
37
38
  A,
38
- k
39
+ M,
40
+ j
39
41
  ]);
40
42
  w(() => {
41
- Q();
43
+ $();
42
44
  }, [
43
- U,
44
- I.placeholder,
45
- O,
46
- Q
45
+ W,
46
+ R.placeholder,
47
+ A,
48
+ $
47
49
  ]), w(() => {
48
- let e = R.current;
49
- if (!O || !e || typeof ResizeObserver > "u") return;
50
+ let e = z.current;
51
+ if (!A || !e || typeof ResizeObserver > "u") return;
50
52
  let t = "", n = new ResizeObserver(() => {
51
53
  let n = getComputedStyle(e), r = `${e.clientWidth}:${n.fontSize}:${n.lineHeight}`;
52
- r !== t && (t = r, Q());
54
+ r !== t && (t = r, $());
53
55
  });
54
56
  return n.observe(e), () => n.disconnect();
55
- }, [O, Q]);
56
- let $ = C((e) => {
57
+ }, [A, $]);
58
+ let re = C((e) => {
57
59
  let t = e.target.value;
58
- X(t) || (Y(t), j?.(e), O && setTimeout(Q, 0));
60
+ Z(t) || (X(t), P?.(t), N?.(e), A && setTimeout($, 0));
59
61
  }, [
60
- j,
61
- Y,
62
+ N,
63
+ P,
62
64
  X,
63
- O,
64
- Q
65
- ]), ne = C(() => {
66
- I.disabled || I.readOnly || b || (R.current && g(R.current), _?.(), R.current?.focus());
65
+ Z,
66
+ A,
67
+ $
68
+ ]), ie = C(() => {
69
+ R.disabled || R.readOnly || S || (z.current && g(z.current), x?.(), z.current?.focus());
67
70
  }, [
68
- I.disabled,
69
- I.readOnly,
70
- b,
71
- _
72
- ]), re = p && J && !b && !q;
71
+ R.disabled,
72
+ R.readOnly,
73
+ S,
74
+ x
75
+ ]), ae = b && Y && !S && !J;
73
76
  return /* @__PURE__ */ D("div", {
74
77
  className: n("textarea--component", "relative w-full"),
75
78
  children: [
76
79
  /* @__PURE__ */ E("textarea", {
77
80
  ref: (e) => {
78
- typeof L == "function" ? L(e) : L && (L.current = e), R.current = e;
81
+ typeof u == "function" ? u(e) : u && (u.current = e), z.current = e;
79
82
  },
80
- id: H,
81
- ...!W && { value: U },
82
- onChange: $,
83
- maxLength: u,
84
- "aria-invalid": Z || void 0,
85
- rows: k,
83
+ id: U,
84
+ ...G ? { value: W } : { defaultValue: I },
85
+ onChange: re,
86
+ maxLength: p,
87
+ "aria-invalid": Q || void 0,
88
+ rows: j,
86
89
  style: {
87
- resize: O ? "none" : I.style?.resize,
88
- overflow: O && A ? "auto" : "visible",
89
- ...I.style
90
+ resize: A ? "none" : R.style?.resize,
91
+ overflow: A && M ? "auto" : "visible",
92
+ ...R.style
90
93
  },
91
- className: n("placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "border-input box-border flex w-full rounded-inner border bg-transparent px-control", l[V], "transition-[color,box-shadow] outline-none", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", "[&:read-only:not(:disabled)]:bg-muted", m[V], c[V], o.focus, o.invalid, re && s.clearPadding[V], q && s.textareaCountPadding, i),
92
- ...I,
93
- disabled: I.disabled || b
94
+ className: n("placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "border-input box-border flex w-full rounded-inner border bg-transparent px-control", l[H], "transition-[color,box-shadow] outline-none", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", "[&:read-only:not(:disabled)]:bg-muted", m[H], c[H], o.focus, o.invalid, ae && s.clearPadding[H], J && s.textareaCountPadding, f),
95
+ ...R,
96
+ disabled: R.disabled || S
94
97
  }),
95
- !!q && /* @__PURE__ */ E("div", {
96
- className: n("pointer-events-none absolute bottom-control-y-offset text-xs tabular-nums", r.clearEnd.md, I.disabled && "opacity-50", Z ? "text-destructive" : "text-muted-foreground"),
98
+ !!J && /* @__PURE__ */ E("div", {
99
+ className: n("pointer-events-none absolute bottom-control-y-offset text-xs tabular-nums", r.clearEnd.md, R.disabled && "opacity-50", Q ? "text-destructive" : "text-muted-foreground"),
97
100
  "aria-live": "polite",
98
101
  role: "status",
99
102
  children: /* @__PURE__ */ D(a, {
100
103
  tag: "span",
101
104
  size: "xs",
102
- type: Z ? "error" : "secondary",
103
- children: [G, K ? `/${u}` : ""]
105
+ type: Q ? "error" : "secondary",
106
+ children: [K, q ? `/${p}` : ""]
104
107
  })
105
108
  }),
106
- !!b && !q && /* @__PURE__ */ E("div", {
107
- className: n("pointer-events-none absolute end-[calc(var(--control-x)*var(--space-scale))]", d.icon[V], Z ? "text-destructive" : "text-muted-foreground"),
109
+ !!S && !J && /* @__PURE__ */ E("div", {
110
+ className: n("pointer-events-none absolute end-[calc(var(--control-x)*var(--space-scale))]", d.icon[H], Q ? "text-destructive" : "text-muted-foreground"),
108
111
  children: /* @__PURE__ */ E(ee, {
109
112
  className: "size-icon animate-spin",
110
113
  "aria-hidden": "true"
111
114
  })
112
115
  }),
113
- !!re && !q && /* @__PURE__ */ E(y, {
114
- className: n("absolute", d.target[V], s.clearEnd[V]),
115
- "aria-label": z.clear,
116
- onClick: ne,
117
- disabled: I.disabled || I.readOnly || b
116
+ !!ae && !J && /* @__PURE__ */ E(y, {
117
+ className: n("absolute", d.target[H], s.clearEnd[H]),
118
+ "aria-label": B.clear,
119
+ onClick: ie,
120
+ disabled: R.disabled || R.readOnly || S
118
121
  })
119
122
  ]
120
123
  });
@@ -182,7 +185,7 @@ function L({ className: e, ...t }) {
182
185
  ...t
183
186
  });
184
187
  }
185
- function R({ className: e, ...t }) {
188
+ function ne({ className: e, ...t }) {
186
189
  return /* @__PURE__ */ E(M, {
187
190
  "data-slot": "input-group-control",
188
191
  className: n("rounded-none border-0 bg-transparent py-space-md shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 flex-1 resize-none", e),
@@ -191,23 +194,23 @@ function R({ className: e, ...t }) {
191
194
  }
192
195
  //#endregion
193
196
  //#region src/components/base/text-inputs/input-group.tsx
194
- function z() {
197
+ function R() {
195
198
  let { defaultScale: t } = e();
196
199
  return h(void 0, t);
197
200
  }
198
- function B({ className: e, ...t }) {
199
- let r = z();
201
+ function z({ className: e, ...t }) {
202
+ let r = R();
200
203
  return /* @__PURE__ */ E(N, {
201
204
  className: n("input-group--component box-border rounded-inner font-sans text-foreground shadow-none", u[r], c[r], "has-[>[data-align=block-end]]:[&>input]:pt-space-lg has-[>[data-align=block-start]]:[&>input]:pb-space-lg", "has-[>[data-align=inline-end]]:[&>input]:pe-space-sm has-[>[data-align=inline-start]]:[&>input]:ps-space-sm", e),
202
205
  ...t
203
206
  });
204
207
  }
205
- var V = {
208
+ var B = {
206
209
  "inline-start": "h-full py-0",
207
210
  "inline-end": "h-full py-0",
208
211
  "block-start": "pt-space-md group-has-[>input]/input-group:pt-space-md [.border-b]:pb-space-md",
209
212
  "block-end": "pb-space-md group-has-[>input]/input-group:pb-space-md [.border-t]:pt-space-md"
210
- }, H = {
213
+ }, V = {
211
214
  sm: {
212
215
  "inline-start": "ps-control-sm",
213
216
  "inline-end": "pe-control-sm"
@@ -220,20 +223,20 @@ var V = {
220
223
  "inline-start": "ps-control",
221
224
  "inline-end": "pe-control"
222
225
  }
223
- }, U = {
226
+ }, H = {
224
227
  sm: "[&>svg:not([class*='size-'])]:size-icon-sm",
225
228
  md: "[&>svg:not([class*='size-'])]:size-icon",
226
229
  lg: "[&>svg:not([class*='size-'])]:size-icon-lg"
227
230
  };
228
- function W({ className: e, align: t = "inline-start", ...r }) {
229
- let i = z(), a = t ?? "inline-start";
231
+ function U({ className: e, align: t = "inline-start", ...r }) {
232
+ let i = R(), a = t ?? "inline-start";
230
233
  return /* @__PURE__ */ E(F, {
231
234
  align: t,
232
- className: n("input-group-addon--component box-border gap-space-md py-space-sm", U[i], V[a], a === "inline-start" || a === "inline-end" ? H[i][a] : f[i], e),
235
+ className: n("input-group-addon--component box-border gap-space-md py-space-sm", H[i], B[a], a === "inline-start" || a === "inline-end" ? V[i][a] : f[i], e),
233
236
  ...r
234
237
  });
235
238
  }
236
- function G({ className: e, tone: t = "secondary", buttonStyle: r = "ghost", truncate: a = !0, iconOnly: o, ...s }) {
239
+ function W({ className: e, tone: t = "secondary", buttonStyle: r = "ghost", truncate: a = !0, iconOnly: o, ...s }) {
237
240
  return /* @__PURE__ */ E(i, {
238
241
  tone: t,
239
242
  buttonStyle: r,
@@ -243,14 +246,14 @@ function G({ className: e, tone: t = "secondary", buttonStyle: r = "ghost", trun
243
246
  ...s
244
247
  });
245
248
  }
246
- function K(e) {
249
+ function G(e) {
247
250
  return typeof e == "string" || typeof e == "number" || typeof e == "bigint";
248
251
  }
249
- function q({ children: e, className: t, ...r }) {
252
+ function K({ children: e, className: t, ...r }) {
250
253
  return /* @__PURE__ */ E(I, {
251
254
  className: n("input-group-text--component gap-space-md [&_svg:not([class*='size-'])]:size-icon", t),
252
255
  ...r,
253
- children: K(e) ? /* @__PURE__ */ E(a, {
256
+ children: G(e) ? /* @__PURE__ */ E(a, {
254
257
  tag: "span",
255
258
  size: "inherit",
256
259
  lineHeight: "tight",
@@ -259,27 +262,27 @@ function q({ children: e, className: t, ...r }) {
259
262
  }) : e
260
263
  });
261
264
  }
262
- function J({ className: e, ...t }) {
263
- let r = z();
265
+ function q({ className: e, ...t }) {
266
+ let r = R();
264
267
  return /* @__PURE__ */ E(L, {
265
268
  className: n("input-group-input--component box-border max-h-full font-sans text-foreground", u[r], "min-h-lh", p[r], c[r], e),
266
269
  ...t
267
270
  });
268
271
  }
269
- function Y({ className: e, ...t }) {
270
- let r = z();
271
- return /* @__PURE__ */ E(R, {
272
+ function J({ className: e, ...t }) {
273
+ let r = R();
274
+ return /* @__PURE__ */ E(ne, {
272
275
  className: n("input-group-textarea--component box-border py-space-md", m[r], f[r], c[r], e),
273
276
  ...t
274
277
  });
275
278
  }
276
279
  //#endregion
277
280
  //#region src/components/base/text-inputs/password-input.tsx
278
- var X = {
281
+ var Y = {
279
282
  showPassword: "Show password",
280
283
  hidePassword: "Hide password"
281
- }, Z = S.forwardRef(function({ visible: e, defaultVisible: r = !1, onVisibleChange: i, revealable: a = !0, wrapperClassName: o, visibilityButtonClassName: c, className: l, disabled: u, loading: d, inputStrings: f, strings: p, ...m }, h) {
282
- let g = t(X, p), [v, y] = S.useState(r), x = e !== void 0, C = x ? e : v, w = u || d, T = S.useCallback(() => {
284
+ }, X = S.forwardRef(function({ visible: e, defaultVisible: r = !1, onVisibleChange: i, revealable: a = !0, wrapperClassName: o, visibilityButtonClassName: c, className: l, disabled: u, loading: d, inputStrings: f, strings: p, ...m }, h) {
285
+ let g = t(Y, p), [v, y] = S.useState(r), x = e !== void 0, C = x ? e : v, w = u || d, T = S.useCallback(() => {
283
286
  let e = !C;
284
287
  x || y(e), i?.(e);
285
288
  }, [
@@ -315,15 +318,15 @@ var X = {
315
318
  })
316
319
  });
317
320
  });
318
- Z.displayName = "PasswordInput";
321
+ X.displayName = "PasswordInput";
319
322
  //#endregion
320
323
  //#region src/components/base/text-inputs/slug-field.tsx
321
- function Q(e, { separator: t = "-", lowercase: n = !0, trim: r = !0 } = {}) {
324
+ function Z(e, { separator: t = "-", lowercase: n = !0, trim: r = !0 } = {}) {
322
325
  let i = t || "-", a = i.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), o = String(e ?? "").normalize("NFKD").replace(/[\u0300-\u036f]/g, "").replace(/&/g, " and ").replace(/['’]/g, "");
323
326
  return n && (o = o.toLowerCase()), o = o.replace(/[^\p{Letter}\p{Number}]+/gu, i).replace(RegExp(`${a}{2,}`, "g"), i), r && (o = o.replace(RegExp(`^${a}|${a}$`, "g"), "")), o;
324
327
  }
325
- var $ = S.forwardRef(function({ value: e, slugify: t, separator: r = "-", lowercase: i = !0, trim: a = !0, wrapperClassName: o, className: s, ...c }, l) {
326
- let u = S.useMemo(() => t?.(e) ?? Q(e, {
328
+ var Q = S.forwardRef(function({ value: e, slugify: t, separator: r = "-", lowercase: i = !0, trim: a = !0, wrapperClassName: o, className: s, ...c }, l) {
329
+ let u = S.useMemo(() => t?.(e) ?? Z(e, {
327
330
  separator: r,
328
331
  lowercase: i,
329
332
  trim: a
@@ -346,8 +349,8 @@ var $ = S.forwardRef(function({ value: e, slugify: t, separator: r = "-", lowerc
346
349
  })
347
350
  });
348
351
  });
349
- $.displayName = "SlugField";
352
+ Q.displayName = "SlugField";
350
353
  //#endregion
351
- export { B as a, J as c, j as d, X as i, q as l, Q as n, W as o, Z as r, G as s, $ as t, Y as u };
354
+ export { z as a, q as c, j as d, Y as i, K as l, Z as n, U as o, X as r, W as s, Q as t, J as u };
352
355
 
353
- //# sourceMappingURL=text-inputs-f9Ia-aCi.js.map
356
+ //# sourceMappingURL=text-inputs-DXItiR0O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-inputs-DXItiR0O.js","names":["Textarea","React","InputGroup","InputGroupAddon","InputGroupText","InputGroupInput","Input","InputGroupTextarea","InputGroupPrimitive","InputGroupAddonPrimitive","InputGroupTextPrimitive","InputGroupInputPrimitive","InputGroupTextareaPrimitive","React","React","useDensityConfig","cn","affordanceGeometry","Button","Text","fieldStateRecipes","fieldAffordanceRecipes","editableTextSizeClasses","formTextareaInsetClasses","formControlHeightClasses","formTextareaAffordanceTopClasses","formControlHorizontalPaddingClasses","formControlPaddingClasses","formTextareaSizeClasses","resolveFormControlSize","clearNativeField","InputTrailingActionContext","useFormFieldState","FieldClearButton","Input","Input$1","React$1","defaultTextareaStrings","Textarea$1","sizeProp","controlledValue","providedId","stringsProp","props","allProps","textareaRef","useRef","strings","useStrings","size","defaultScale","textareaValue","onChange","hasError","invalid","adjustHeight","useCallback","autoResize","textarea","css","lineHeight","padding","border","minHeight","minRows","maxHeight","maxRows","newHeight","useEffect","previous","observer","signature","handleTextareaChange","newValue","wouldExceedLimit","updateValue","onValueChange","handleClear","loading","onClear","showClearButton","clearable","hasValue","showCount","forwardedRef","node","isControlled","className","characterCount","hasCharacterLimit","maxLength","Loader2Icon","Textarea","InputGroup$1","inputGroupAddonVariants","cva","InputGroupAddon$1","align","InputGroupText$1","InputGroupInput$1","InputGroupTextarea$1","useInputGroupScale","InputGroup","addonAlignmentClasses","addonInlinePaddingClasses","addonIconClasses","InputGroupAddon","alignment","InputGroupButton","iconOnly","isScalarContent","content","InputGroupText","children","InputGroupInput","InputGroupTextarea","defaultPasswordInputStrings","PasswordInput","internalVisible","setInternalVisible","defaultVisible","visible","isVisible","disabledState","disabled","toggleVisibility","nextVisible","onVisibleChange","visibilityAction","revealable","visibilityButtonClassName","event","jsx","EyeOff","Eye","wrapperClassName","inputStrings","slugifyValue","safeSeparator","separator","escapedSeparator","normalized","value","lowercase","trim","SlugField","slug","slugify"],"sources":["../src/components/base/text-inputs/textarea.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/components/base/text-inputs/input-group.tsx","../src/components/base/text-inputs/password-input.tsx","../src/components/base/text-inputs/slug-field.tsx"],"sourcesContent":["import { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { affordanceGeometry } from '../../../lib/affordance-geometry.generated';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { Loader2Icon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useCallback, useEffect } 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 { formTextareaAffordanceTopClasses, formTextareaInsetClasses, formTextareaSizeClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { useFormFieldState } from './hooks';\nimport { clearNativeField } from './clear-native-field';\nimport { FieldClearButton } from './field-clear-button';\n\nexport interface TextareaStrings {\n\t\tclear: string;\n}\n\nexport const defaultTextareaStrings: TextareaStrings = {\n\t\tclear: 'Clear textarea',\n};\n\nexport interface TextareaProps extends Omit<React.ComponentProps<'textarea'>, 'onChange' | 'value'> {\n\t\t// String overrides (e.g. clear button aria-label)\n\t\t/** Overrides the character-count and clear copy. */\n\t\tstrings?: StringsProp<TextareaStrings>;\n\t\t// Character limit\n\t\t/** Character cap, also used as the denominator of the count. */\n\t\tmaxLength?: number;\n\t\t/** Shows the current and maximum character count. */\n\t\tshowCharacterCount?: boolean;\n\n\t\t// Clear button\n\t\t/** Shows an inline clear action when the field has a value. */\n\t\tclearable?: boolean;\n\t\tonClear?: () => void;\n\n\t\t// Loading state\n\t\t/** Replaces the trailing affordance with a loading indicator. */\n\t\tloading?: boolean;\n\n\t\t// Error state for styling (passed from FormField)\n\t\t/** Applies the invalid styling. Validation copy stays with FormField. */\n\t\tinvalid?: boolean;\n\n\t\t// Visual size\n\t\t/** Control density. Falls back to `UIProvider.density.defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t// Auto-resize functionality\n\t\t/** Grows the field with its content, between `minRows` and `maxRows`. */\n\t\tautoResize?: boolean;\n\t\t/** Smallest height, in rows, when `autoResize` is set. */\n\t\tminRows?: number;\n\t\t/** Height at which the field stops growing and starts scrolling. */\n\t\tmaxRows?: number;\n\n\t\t// Value props\n\t\tonChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n\t\t/** Raw string callback, emitted alongside the native change event. */\n\t\tonValueChange?: (value: string) => void;\n\t\t/** Current text. Controlled. */\n\t\tvalue?: string | null;\n\t\t/** Initial text for uncontrolled use. */\n\t\tdefaultValue?: string;\n}\n\nconst TextareaImpl = (\n\t\tallProps: TextareaProps,\n\t\tforwardedRef: React.ForwardedRef<HTMLTextAreaElement>,\n) => {\n\t\tconst {\n\t\t\t\tclassName,\n\t\t\t\tmaxLength,\n\t\t\t\tshowCharacterCount,\n\t\t\t\tclearable,\n\t\t\t\tonClear,\n\t\t\t\tloading = false,\n\t\t\t\tinvalid,\n\t\t\t\tsize: sizeProp,\n\t\t\t\tautoResize = false,\n\t\t\t\tminRows = 2,\n\t\t\t\tmaxRows,\n\t\t\t\tonChange,\n\t\t\t\tonValueChange,\n\t\t\t\tvalue: controlledValue,\n\t\t\t\tdefaultValue,\n\t\t\t\tid: providedId,\n\t\t\t\tstrings: stringsProp,\n\t\t\t\t...props\n\t\t} = allProps;\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst strings = useStrings(defaultTextareaStrings, stringsProp);\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\n\t\t// Use shared form field state hook\n\t\tconst {\n\t\t\t\tid,\n\t\t\t\tvalue: textareaValue,\n\t\t\t\tisControlled,\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\twouldExceedLimit,\n\t\t} = useFormFieldState({\n\t\t\t\tcontrolledValue,\n\t\t\t\thasControlledValue: 'value' in allProps,\n\t\t\t\tnativeRef: textareaRef,\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: 'textarea',\n\t\t\t\thasOnChange: onChange !== undefined,\n\t\t});\n\n\t\t// Derive display states\n\t\tconst hasError = Boolean(invalid);\n\n\t\tconst adjustHeight = useCallback(() => {\n\t\t\t\tif (!autoResize || !textareaRef.current) return;\n\n\t\t\t\tconst textarea = textareaRef.current;\n\n\t\t\t\tconst css = getComputedStyle(textarea);\n\t\t\t\tconst lineHeight = Number.parseFloat(css.lineHeight) || 20;\n\t\t\t\tconst padding = (Number.parseFloat(css.paddingTop) || 0) + (Number.parseFloat(css.paddingBottom) || 0);\n\t\t\t\tconst border = css.boxSizing === 'border-box' ? (Number.parseFloat(css.borderTopWidth) || 0) + (Number.parseFloat(css.borderBottomWidth) || 0) : 0;\n\t\t\t\ttextarea.style.height = 'auto';\n\t\t\t\tconst minHeight = lineHeight * minRows + padding + border;\n\t\t\t\tconst maxHeight = maxRows ? lineHeight * maxRows + padding + border : Infinity;\n\n\t\t\t\tconst newHeight = Math.min(Math.max(textarea.scrollHeight + border, minHeight), maxHeight);\n\t\t\t\ttextarea.style.height = `${newHeight}px`;\n\t\t}, [autoResize, maxRows, minRows]);\n\n\t\tuseEffect(() => {\n\t\t\t\tadjustHeight();\n\t\t}, [textareaValue, props.placeholder, autoResize, adjustHeight]);\n\n\t\tuseEffect(() => {\n\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\tif (!autoResize || !textarea || typeof ResizeObserver === 'undefined') return;\n\t\t\t\tlet previous = '';\n\t\t\t\tconst observer = new ResizeObserver(() => {\n\t\t\t\t\t\tconst css = getComputedStyle(textarea);\n\t\t\t\t\t\tconst signature = `${textarea.clientWidth}:${css.fontSize}:${css.lineHeight}`;\n\t\t\t\t\t\tif (signature === previous) return;\n\t\t\t\t\t\tprevious = signature;\n\t\t\t\t\t\tadjustHeight();\n\t\t\t\t});\n\t\t\t\tobserver.observe(textarea);\n\t\t\t\treturn () => observer.disconnect();\n\t\t}, [autoResize, adjustHeight]);\n\n\t\tconst handleTextareaChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\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\t\t\t\t\t\tonValueChange?.(newValue);\n\n\t\t\t\t\t\t// Call external onChange\n\t\t\t\t\t\tonChange?.(e);\n\n\t\t\t\t\t\t// Auto-resize if enabled\n\t\t\t\t\t\tif (autoResize) {\n\t\t\t\t\t\t\t\tsetTimeout(adjustHeight, 0);\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[onChange, onValueChange, updateValue, wouldExceedLimit, autoResize, adjustHeight]\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\tif (textareaRef.current) clearNativeField(textareaRef.current);\n\n\t\t\t\t// Execute optional onClear callback\n\t\t\t\tonClear?.();\n\n\t\t\t\t// Focus the textarea after clearing\n\t\t\t\ttextareaRef.current?.focus();\n\n\t\t}, [props.disabled, props.readOnly, loading, onClear]);\n\n\t\t// Determine what to show in the end position\n\t\tconst showClearButton = clearable && hasValue && !loading && !showCount;\n\n\t\treturn (\n\t\t\t\t<div className={cn('textarea--component', 'relative w-full')}>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\t\t\t\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\t\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\ttextareaRef.current = node;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\t{...(isControlled ? { value: textareaValue } : { defaultValue })}\n\t\t\t\t\t\t\t\tonChange={handleTextareaChange}\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\trows={minRows}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tresize: autoResize ? 'none' : props.style?.resize,\n\t\t\t\t\t\t\t\t\t\toverflow: autoResize && maxRows ? 'auto' : 'visible',\n\t\t\t\t\t\t\t\t\t\t...props.style,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Base styles\n\t\t\t\t\t\t\t\t\t\t'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t'border-input box-border flex w-full rounded-inner border bg-transparent px-control',\n\t\t\t\t\t\t\t\t\t\t// First line where a single-line control of this size draws its value.\n\t\t\t\t\t\t\t\t\t\tformTextareaInsetClasses[size],\n\t\t\t\t\t\t\t\t\t\t'transition-[color,box-shadow] outline-none',\n\t\t\t\t\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\t\t\t\t\t// Same read-only fill as Input; disabled stays on the transparent fill.\n\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\tformTextareaSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\t// Focus styles\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\t\t\t\t\t\t\t// Invalid/error styles\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\t\t\t\t\t\t// Dynamic padding for overlays\n\t\t\t\t\t\t\t\t\t\tshowClearButton && fieldAffordanceRecipes.clearPadding[size],\n\t\t\t\t\t\t\t\t\t\tshowCount && fieldAffordanceRecipes.textareaCountPadding,\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{/* Character Count */}\n\t\t\t\t\t\t{!!showCount && (\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 bottom-control-y-offset text-xs tabular-nums',\n\t\t\t\t\t\t\t\t\t\t\t\taffordanceGeometry.clearEnd.md,\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\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type={hasError ? 'error' : 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{characterCount}\n\t\t\t\t\t\t\t\t\t\t\t\t{hasCharacterLimit ? `/${maxLength}` : ''}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Loading Spinner */}\n\t\t\t\t\t\t{!!loading && !showCount && (\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 end-[calc(var(--control-x)*var(--space-scale))]',\n\t\t\t\t\t\t\t\t\t\t\t\tformTextareaAffordanceTopClasses.icon[size],\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<Loader2Icon className=\"size-icon animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Clear Button */}\n\t\t\t\t\t\t{!!showClearButton && !showCount && (\n\t\t\t\t\t\t\t\t<FieldClearButton\n\t\t\t\t\t\t\t\t\t\tclassName={cn('absolute', formTextareaAffordanceTopClasses.target[size], fieldAffordanceRecipes.clearEnd[size])}\n\t\t\t\t\t\t\t\t\t\taria-label={strings.clear}\n\t\t\t\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t\t\t\tdisabled={props.disabled || props.readOnly || loading}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(TextareaImpl);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { editableTextSizeClasses } from '../../lib/editable-text-recipe';\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input rounded-inner border bg-transparent px-control py-space-md shadow-none transition-[color,box-shadow] placeholder:text-muted-foreground flex field-sizing-content min-h-textarea w-full outline-none disabled:cursor-not-allowed disabled:opacity-50 [&:read-only:not(:disabled)]:bg-muted\",\n editableTextSizeClasses.md,\n fieldStateRecipes.focus,\n fieldStateRecipes.invalid,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\n\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\nimport { cn } from \"../../lib/utils\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"border-input h-control rounded-inner border shadow-none transition-[color,box-shadow] has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-space-lg has-[>[data-align=block-start]]:[&>input]:pb-space-lg has-[>[data-align=inline-end]]:[&>input]:pe-space-sm has-[>[data-align=inline-start]]:[&>input]:ps-space-sm [[data-slot=combobox-content]_&]:focus-within:border-inherit [[data-slot=combobox-content]_&]:focus-within:ring-0 group/input-group relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto\",\n fieldStateRecipes.groupFocus,\n fieldStateRecipes.groupInvalid,\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground h-auto gap-space-md py-space-sm text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-inner [&>svg:not([class*='size-'])]:size-icon flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\": \"ps-control has-[>button]:-ms-space-xs has-[>kbd]:-ms-space-2xs order-first\",\n \"inline-end\": \"pe-control has-[>button]:-me-space-xs has-[>kbd]:-me-space-2xs order-last\",\n \"block-start\":\n \"px-control pt-space-md group-has-[>input]/input-group:pt-space-md [.border-b]:pb-space-md order-first w-full justify-start\",\n \"block-end\":\n \"px-control pb-space-md group-has-[>input]/input-group:pb-space-md [.border-t]:pt-space-md order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"gap-space-md text-sm shadow-none flex items-center\",\n {\n variants: {\n size: {\n xs: \"h-action-xs gap-space-xs rounded-inner px-control-xs [&>svg:not([class*='size-'])]:size-icon-sm\",\n sm: \"\",\n \"icon-xs\": \"size-action-xs rounded-inner p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-action-sm p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground gap-space-md text-sm [&_svg:not([class*='size-'])]:size-icon flex items-center [&_svg]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\"rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 flex-1\", className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\"rounded-none border-0 bg-transparent py-space-md shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 flex-1 resize-none\", className)}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","/**\n * InputGroup — base wrapper around the shadcn `ui/input-group` primitive.\n *\n * What this layer adds on top of the primitive:\n * - Stable BEM hooks on every wrapped part's outermost node\n * (`input-group--component`, `input-group-addon--component`, and so on).\n * - Design-system typography for the scalar copy inside `InputGroupText`,\n * while arbitrary `ReactNode` content (icons, `kbd`, buttons) passes through\n * untouched so the compound pattern stays composable.\n * - Keeps the primitive's addon alignment and button-size variants, its\n * focus-within/aria-invalid ring behaviour, and every native prop by spread.\n *\n * Compose it as\n * `<InputGroup><InputGroupAddon><Icon/></InputGroupAddon><InputGroupInput/></InputGroup>`.\n *\n * Reach for it when one control needs inline affordances welded to its frame —\n * a search icon, a unit suffix, a busy indicator, an inline action. For the\n * label / control / hint / error row, use `FormField` instead; this wrapper\n * owns only the control frame.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tInputGroup as InputGroupPrimitive,\n\tInputGroupAddon as InputGroupAddonPrimitive,\n\tInputGroupInput as InputGroupInputPrimitive,\n\tInputGroupText as InputGroupTextPrimitive,\n\tInputGroupTextarea as InputGroupTextareaPrimitive,\n} from '../../ui/input-group';\nimport { Button, type ButtonProps } from '../buttons';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { cn } from '../../../lib/utils';\nimport {\n\tformControlHeightClasses,\n\tformControlHorizontalPaddingClasses,\n\tformControlPaddingClasses,\n\tformTextareaSizeClasses,\n\tresolveFormControlSize,\n} from '../forms/form-sizing';\n\nexport type InputGroupProps = ComponentProps<typeof InputGroupPrimitive>;\nexport type InputGroupAddonProps = ComponentProps<typeof InputGroupAddonPrimitive>;\nexport interface InputGroupButtonProps extends Omit<ButtonProps, 'size'> {\n\t/** Component scale. Falls back to `UIProvider.density.defaultScale`. */\n\tsize?: ComponentScale;\n}\nexport type InputGroupInputProps = ComponentProps<typeof InputGroupInputPrimitive>;\nexport type InputGroupTextProps = ComponentProps<typeof InputGroupTextPrimitive>;\nexport type InputGroupTextareaProps = ComponentProps<typeof InputGroupTextareaPrimitive>;\n\nfunction useInputGroupScale() {\n\tconst { defaultScale } = useDensityConfig();\n\treturn resolveFormControlSize(undefined, defaultScale);\n}\n\n/** Control frame that welds inline addons onto a single input or textarea. */\nfunction InputGroup({ className, ...props }: InputGroupProps) {\n\tconst size = useInputGroupScale();\n\treturn (\n\t\t<InputGroupPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t'input-group--component box-border rounded-inner font-sans text-foreground shadow-none',\n\t\t\t\tformControlHeightClasses[size],\n\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t'has-[>[data-align=block-end]]:[&>input]:pt-space-lg has-[>[data-align=block-start]]:[&>input]:pb-space-lg',\n\t\t\t\t'has-[>[data-align=inline-end]]:[&>input]:pe-space-sm has-[>[data-align=inline-start]]:[&>input]:ps-space-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst addonAlignmentClasses = {\n\t'inline-start': 'h-full py-0',\n\t'inline-end': 'h-full py-0',\n\t'block-start': 'pt-space-md group-has-[>input]/input-group:pt-space-md [.border-b]:pb-space-md',\n\t'block-end': 'pb-space-md group-has-[>input]/input-group:pb-space-md [.border-t]:pt-space-md',\n} as const;\n\nconst addonInlinePaddingClasses = {\n\tsm: { 'inline-start': 'ps-control-sm', 'inline-end': 'pe-control-sm' },\n\tmd: { 'inline-start': 'ps-control', 'inline-end': 'pe-control' },\n\tlg: { 'inline-start': 'ps-control', 'inline-end': 'pe-control' },\n} as const;\n\nconst addonIconClasses = {\n\tsm: \"[&>svg:not([class*='size-'])]:size-icon-sm\",\n\tmd: \"[&>svg:not([class*='size-'])]:size-icon\",\n\tlg: \"[&>svg:not([class*='size-'])]:size-icon-lg\",\n} as const;\n\n/** Leading/trailing (or block start/end) affordance slot inside the frame. */\nfunction InputGroupAddon({ className, align = 'inline-start', ...props }: InputGroupAddonProps) {\n\tconst size = useInputGroupScale();\n\tconst alignment = align ?? 'inline-start';\n\treturn (\n\t\t<InputGroupAddonPrimitive\n\t\t\talign={align}\n\t\t\tclassName={cn(\n\t\t\t\t'input-group-addon--component box-border gap-space-md py-space-sm',\n\t\t\t\taddonIconClasses[size],\n\t\t\t\taddonAlignmentClasses[alignment],\n\t\t\t\talignment === 'inline-start' || alignment === 'inline-end'\n\t\t\t\t\t? addonInlinePaddingClasses[size][alignment]\n\t\t\t\t\t: formControlHorizontalPaddingClasses[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/** Inline action button sized to sit inside the control frame; its label stays on one line. */\nfunction InputGroupButton({\n\tclassName,\n\ttone = 'secondary',\n\tbuttonStyle = 'ghost',\n\ttruncate = true,\n\ticonOnly,\n\t...props\n}: InputGroupButtonProps) {\n\treturn (\n\t\t<Button\n\t\t\ttone={tone}\n\t\t\tbuttonStyle={buttonStyle}\n\t\t\ttruncate={truncate}\n\t\t\ticonOnly={iconOnly}\n\t\t\tclassName={cn(\n\t\t\t\t'input-group-button--component max-h-full shadow-none',\n\t\t\t\t// Text actions fit the inner frame. Icon actions retain their own\n\t\t\t\t// height and derive a square width after the frame caps that height.\n\t\t\t\t// Block/footer actions keep their natural Button geometry.\n\t\t\t\ticonOnly\n\t\t\t\t\t? 'in-[[data-align=inline-start]]:w-auto in-[[data-align=inline-start]]:aspect-square in-[[data-align=inline-end]]:w-auto in-[[data-align=inline-end]]:aspect-square'\n\t\t\t\t\t: 'in-[[data-align=inline-start]]:h-full in-[[data-align=inline-start]]:min-h-0 in-[[data-align=inline-end]]:h-full in-[[data-align=inline-end]]:min-h-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction isScalarContent(content: ReactNode): content is string | number | bigint {\n\treturn typeof content === 'string' || typeof content === 'number' || typeof content === 'bigint';\n}\n\n/** Static copy segment — scalar text renders through Typography. */\nfunction InputGroupText({ children, className, ...props }: InputGroupTextProps) {\n\treturn (\n\t\t<InputGroupTextPrimitive\n\t\t\tclassName={cn('input-group-text--component gap-space-md [&_svg:not([class*=\\'size-\\'])]:size-icon', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isScalarContent(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</InputGroupTextPrimitive>\n\t);\n}\n\n/** Single-line control that inherits the group's frame instead of its own. */\nfunction InputGroupInput({ className, ...props }: InputGroupInputProps) {\n\tconst size = useInputGroupScale();\n\treturn (\n\t\t<InputGroupInputPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t// Inline frames grow for their shared editable line and clamp the\n\t\t\t\t// borderless input to the resulting content box.\n\t\t\t\t// Auto-height block compositions retain the shared control height.\n\t\t\t\t'input-group-input--component box-border max-h-full font-sans text-foreground',\n\t\t\t\tformControlHeightClasses[size],\n\t\t\t\t// The group owns the border; its native editor needs only its line.\n\t\t\t\t'min-h-lh',\n\t\t\t\tformControlPaddingClasses[size],\n\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/** Multi-line control that inherits the group's frame instead of its own. */\nfunction InputGroupTextarea({ className, ...props }: InputGroupTextareaProps) {\n\tconst size = useInputGroupScale();\n\treturn (\n\t\t<InputGroupTextareaPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t'input-group-textarea--component box-border py-space-md',\n\t\t\t\tformTextareaSizeClasses[size],\n\t\t\t\tformControlHorizontalPaddingClasses[size],\n\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupInput,\n\tInputGroupText,\n\tInputGroupTextarea,\n};\n","import { Eye, EyeOff } from 'lucide-react';\nimport * as React from 'react';\n\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { Input, type InputProps } from './input';\nimport { InputTrailingActionContext } from './input-trailing-action';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\n\nexport interface PasswordInputStrings {\n\tshowPassword: string;\n\thidePassword: string;\n}\n\nexport const defaultPasswordInputStrings: PasswordInputStrings = {\n\tshowPassword: 'Show password',\n\thidePassword: 'Hide password',\n};\n\nexport interface PasswordInputProps extends Omit<InputProps, 'type' | 'endIcon' | 'strings'> {\n\t/** Whether the value is revealed. Controlled. */\n\tvisible?: boolean;\n\t/** Whether the value starts revealed, for uncontrolled use. */\n\tdefaultVisible?: boolean;\n\t/** Fired whenever the reveal state changes. */\n\tonVisibleChange?: (visible: boolean) => void;\n\t/** Shows the reveal toggle. Turn it off for fields that must stay masked. */\n\trevealable?: boolean;\n\t/** Merged onto the field wrapper, outside the input frame. */\n\twrapperClassName?: string;\n\t/** Merged onto the reveal toggle. */\n\tvisibilityButtonClassName?: string;\n\t/** Copy overrides forwarded to the underlying text input. */\n\tinputStrings?: InputProps['strings'];\n\t/** Overrides the show/hide accessible names. */\n\tstrings?: StringsProp<PasswordInputStrings>;\n}\n\nconst PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(\n\tfunction PasswordInput(\n\t\t{\n\t\t\tvisible,\n\t\t\tdefaultVisible = false,\n\t\t\tonVisibleChange,\n\t\t\trevealable = true,\n\t\t\twrapperClassName,\n\t\t\tvisibilityButtonClassName,\n\t\t\tclassName,\n\t\t\tdisabled,\n\t\t\tloading,\n\t\t\tinputStrings,\n\t\t\tstrings: stringsProp,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst strings = useStrings(defaultPasswordInputStrings, stringsProp);\n\t\tconst [internalVisible, setInternalVisible] = React.useState(defaultVisible);\n\t\tconst isControlled = visible !== undefined;\n\t\tconst isVisible = isControlled ? visible : internalVisible;\n\t\tconst disabledState = disabled || loading;\n\n\t\tconst toggleVisibility = React.useCallback(() => {\n\t\t\tconst nextVisible = !isVisible;\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalVisible(nextVisible);\n\t\t\t}\n\t\t\tonVisibleChange?.(nextVisible);\n\t\t}, [isControlled, isVisible, onVisibleChange]);\n\n\t\tconst visibilityAction = revealable ? (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn('password-input--toggle', fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.toggle, visibilityButtonClassName)}\n\t\t\t\taria-label={isVisible ? strings.hidePassword : strings.showPassword}\n\t\t\t\taria-pressed={isVisible}\n\t\t\t\tdisabled={disabledState}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tonClick={toggleVisibility}\n\t\t\t>\n\t\t\t\t{isVisible ? <EyeOff className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" /> : <Eye className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />}\n\t\t\t</button>\n\t\t) : null;\n\n\t\treturn (\n\t\t\t<div className={cn('password-input--component', 'relative', wrapperClassName)}>\n\t\t\t\t<InputTrailingActionContext.Provider value={visibilityAction}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\ttype={isVisible ? 'text' : 'password'}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tstrings={inputStrings}\n\t\t\t\t\t/>\n\t\t\t\t</InputTrailingActionContext.Provider>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPasswordInput.displayName = 'PasswordInput';\n\nexport { PasswordInput };\n","import * as React from 'react';\n\nimport { cn } from '../../../lib/utils';\n\nimport { Input, type InputProps } from './input';\n\nexport interface SlugifyValueOptions {\n\t/** Character joining words in the generated slug. Default: `-`. */\n\tseparator?: string;\n\t/** Lowercases the generated slug. */\n\tlowercase?: boolean;\n\t/** Strips leading and trailing separators. */\n\ttrim?: boolean;\n}\n\nexport function slugifyValue(\n\tvalue: string | number | null | undefined,\n\t{\n\t\tseparator = '-',\n\t\tlowercase = true,\n\t\ttrim = true,\n\t}: SlugifyValueOptions = {},\n) {\n\tconst safeSeparator = separator || '-';\n\tconst escapedSeparator = safeSeparator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\tlet normalized = String(value ?? '')\n\t\t.normalize('NFKD')\n\t\t.replace(/[\\u0300-\\u036f]/g, '')\n\t\t.replace(/&/g, ' and ')\n\t\t.replace(/['’]/g, '');\n\n\tif (lowercase) {\n\t\tnormalized = normalized.toLowerCase();\n\t}\n\n\tnormalized = normalized\n\t\t.replace(/[^\\p{Letter}\\p{Number}]+/gu, safeSeparator)\n\t\t.replace(new RegExp(`${escapedSeparator}{2,}`, 'g'), safeSeparator);\n\n\tif (trim) {\n\t\tnormalized = normalized.replace(new RegExp(`^${escapedSeparator}|${escapedSeparator}$`, 'g'), '');\n\t}\n\n\treturn normalized;\n}\n\nexport interface SlugFieldProps\n\textends Omit<\n\t\tInputProps,\n\t\t'value' | 'defaultValue' | 'onChange' | 'readOnly' | 'type'\n\t>,\n\t\tSlugifyValueOptions {\n\t/** Current slug. Controlled. */\n\tvalue: string | number | null | undefined;\n\t/** Replaces the built-in slug derivation entirely. */\n\tslugify?: (value: string | number | null | undefined) => string;\n\t/** Merged onto the field wrapper, outside the input frame. */\n\twrapperClassName?: string;\n}\n\nconst SlugField = React.forwardRef<HTMLInputElement, SlugFieldProps>(\n\tfunction SlugField(\n\t\t{\n\t\t\tvalue,\n\t\t\tslugify,\n\t\t\tseparator = '-',\n\t\t\tlowercase = true,\n\t\t\ttrim = true,\n\t\t\twrapperClassName,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst slug = React.useMemo(\n\t\t\t() => slugify?.(value) ?? slugifyValue(value, { separator, lowercase, trim }),\n\t\t\t[lowercase, separator, slugify, trim, value],\n\t\t);\n\n\t\treturn (\n\t\t\t<div className={cn('slug-field--component', wrapperClassName)}>\n\t\t\t\t<Input\n\t\t\t\t\tref={ref}\n\t\t\t\t\t{...props}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={slug}\n\t\t\t\t\treadOnly\n\t\t\t\t\tclassName={className}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nSlugField.displayName = 'SlugField';\n\nexport { SlugField };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,IAAaqC,KAA0C,EACrD,OAAO,iBACT,GA8QMrC,IAAWC,EAAM,YA9NrB,GACA,MACG;CACH,IAAM,EACJ,cACA,cACA,uBACA,cACA,YACA,aAAU,IACV,YACA,MAAMsC,GACN,gBAAa,IACb,aAAU,GACV,YACA,aACA,kBACA,OAAOC,GACP,iBACA,IAAIC,GACJ,SAASC,IACT,GAAGC,MACDC,GACEC,IAAcC,EAA4B,IAAI,GAC9CC,IAAUC,EAAWX,IAAwBK,EAAW,GACxD,EAAE,oBAAiB3B,EAAiB,GACpCkC,IAAOpB,EAAuBU,GAAUW,CAAY,GAGpD,EACJ,OACA,OAAOC,GACP,iBACA,mBACA,sBACA,cACA,aACA,gBACA,wBACEnB,EAAkB;EACpB;EACA,oBAAoB,WAAWY;EAC/B,WAAWC;EACX;EACA;EACA;EACA;EACA,UAAU;EACV,aAAaO,MAAa,KAAA;CAC5B,CAAC,GAGKC,IAAW,EAAQC,GAEnBC,IAAeC,QAAkB;EACrC,IAAI,CAACC,KAAc,CAACZ,EAAY,SAAS;EAEzC,IAAMa,IAAWb,EAAY,SAEvBc,IAAM,iBAAiBD,CAAQ,GAC/BE,IAAa,OAAO,WAAWD,EAAI,UAAU,KAAK,IAClDE,KAAW,OAAO,WAAWF,EAAI,UAAU,KAAK,MAAM,OAAO,WAAWA,EAAI,aAAa,KAAK,IAC9FG,IAASH,EAAI,cAAc,gBAAgB,OAAO,WAAWA,EAAI,cAAc,KAAK,MAAM,OAAO,WAAWA,EAAI,iBAAiB,KAAK,KAAK;EACjJ,EAAS,MAAM,SAAS;EACxB,IAAMI,IAAYH,IAAaI,IAAUH,IAAUC,GAC7CG,IAAYC,IAAUN,IAAaM,IAAUL,IAAUC,IAAS,UAEhEK,IAAY,KAAK,IAAI,KAAK,IAAIT,EAAS,eAAeI,GAAQC,CAAS,GAAGE,CAAS;EACzF,EAAS,MAAM,SAAS,GAAGE,EAAU;CACvC,GAAG;EAACV;EAAYS;EAASF;CAAO,CAAC;CAMjC,AAJAI,QAAgB;EACd,EAAa;CACf,GAAG;EAACjB;EAAeR,EAAM;EAAac;EAAYF;CAAY,CAAC,GAE/Da,QAAgB;EACd,IAAMV,IAAWb,EAAY;EAC7B,IAAI,CAACY,KAAc,CAACC,KAAY,OAAO,iBAAmB,KAAa;EACvE,IAAIW,IAAW,IACTC,IAAW,IAAI,qBAAqB;GACxC,IAAMX,IAAM,iBAAiBD,CAAQ,GAC/Ba,IAAY,GAAGb,EAAS,YAAY,GAAGC,EAAI,SAAS,GAAGA,EAAI;GACjE,AAAIY,MAAcF,MAClB,IAAWE,GACXhB,EAAa;EACf,CAAC;EAED,OADAe,EAAS,QAAQZ,CAAQ,SACZY,EAAS,WAAW;CACnC,GAAG,CAACb,GAAYF,CAAY,CAAC;CAE7B,IAAMiB,KAAuBhB,GAC1B,MAA8C;EAC7C,IAAMiB,IAAW,EAAE,OAAO;EAG1B,AAAIC,EAAiBD,CAAQ,MAK7BE,EAAYF,CAAQ,GACpBG,IAAgBH,CAAQ,GAGxBrB,IAAW,CAAC,GAGRK,KACF,WAAWF,GAAc,CAAC;CAE9B,GACA;EAACH;EAAUwB;EAAeD;EAAaD;EAAkBjB;EAAYF;CAAY,CACnF,GAEMsB,KAAcrB,QAAkB;EACpC,AAAIb,EAAM,YAAYA,EAAM,YAAYmC,MAEpCjC,EAAY,WAASf,EAAiBe,EAAY,OAAO,GAG7DkC,IAAU,GAGVlC,EAAY,SAAS,MAAM;CAE7B,GAAG;EAACF,EAAM;EAAUA,EAAM;EAAUmC;EAASC;CAAO,CAAC,GAG/CC,KAAkBC,KAAaC,KAAY,CAACJ,KAAW,CAACK;CAE9D,OACE,kBAAC,OAAD;EAAK,WAAWnE,EAAG,uBAAuB,iBAAiB;EAA3D,UAAA;GACE,kBAAC,YAAD;IACE,MAAM,MAAS;KAMb,AALI,OAAOoE,KAAiB,aAC1BA,EAAaC,CAAI,IACRD,MACT,EAAa,UAAUC,IAEzB,EAAY,UAAUA;IACxB;IACI;IACJ,GAAKC,IAAe,EAAE,OAAOnC,EAAc,IAAI,EAAE,gBAAa;IAC9D,UAAUqB;IACC;IACX,gBAAcnB,KAAY,KAAA;IAC1B,MAAMW;IACN,OAAO;KACL,QAAQP,IAAa,SAASd,EAAM,OAAO;KAC3C,UAAUc,KAAcS,IAAU,SAAS;KAC3C,GAAGvB,EAAM;IACX;IACA,WAAW3B,EAET,4FACA,sFAEAO,EAAyB0B,IACzB,8CACA,gFAEA,yCACArB,EAAwBqB,IACxB3B,EAAwB2B,IAExB7B,EAAkB,OAElBA,EAAkB,SAElB4D,MAAmB3D,EAAuB,aAAa4B,IACvDkC,KAAa9D,EAAuB,sBACpCkE,CACF;IACA,GAAI5C;IACJ,UAAUA,EAAM,YAAYmC;GAC7B,CAAA;GAGA,CAAC,CAACK,KACD,kBAAC,OAAD;IACE,WAAWnE,EACT,6EACAC,EAAmB,SAAS,IAC5B0B,EAAM,YAAY,cAClBU,IAAW,qBAAqB,uBAClC;IACA,aAAU;IACV,MAAK;IAEL,UAAA,kBAAClC,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAMkC,IAAW,UAAU;KAAtD,UAAA,CACGmC,GACAC,IAAoB,IAAIC,MAAc,EACnC;;GACH,CAAA;GAIN,CAAC,CAACZ,KAAW,CAACK,KACb,kBAAC,OAAD;IACE,WAAWnE,EACT,gFACAS,EAAiC,KAAKwB,IACtCI,IAAW,qBAAqB,uBAClC;IAEA,UAAA,kBAACsC,IAAD;KAAa,WAAU;KAAyB,eAAY;IAAQ,CAAA;GACjE,CAAA;GAIN,CAAC,CAACX,MAAmB,CAACG,KACrB,kBAAClD,GAAD;IACE,WAAWjB,EAAG,YAAYS,EAAiC,OAAOwB,IAAO5B,EAAuB,SAAS4B,EAAK;IAC9G,cAAYF,EAAQ;IACpB,SAAS8B;IACT,UAAUlC,EAAM,YAAYA,EAAM,YAAYmC;GAC/C,CAAA;EAEA;;AAET,CAEkF;AAClF,EAAS,cAAc;;;AC/RvB,SAASc,EAAS,EAAE,cAAW,GAAGjD,KAA2C;CAC3E,OACE,kBAAC,YAAD;EACE,aAAU;EACV,WAAW3B,EACT,0SACAM,EAAwB,IACxBF,EAAkB,OAClBA,EAAkB,SAClBmE,CACF;EACA,GAAI5C;CACL,CAAA;AAEL;;;ACXA,SAASzC,EAAW,EAAE,cAAW,GAAGyC,KAAsC;CACxE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW3B,EACT,6pBACAI,EAAkB,YAClBA,EAAkB,cAClBmE,CACF;EACA,GAAI5C;CACL,CAAA;AAEL;AAEA,IAAMmD,IAA0BC,EAC9B,sPACA;CACE,UAAU,EACR,OAAO;EACL,gBAAgB;EAChB,cAAc;EACd,eACE;EACF,aACE;CACJ,EACF;CACA,iBAAiB,EACf,OAAO,eACT;AACF,CACF;AAEA,SAAS5F,EAAgB,EACvB,cACA,WAAQ,gBACR,GAAGwC,KAC0E;CAC7E,OACE,kBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAYsD;EACZ,WAAWjF,EAAG8E,EAAwB,EAAE,SAAM,CAAC,GAAGP,CAAS;EAC3D,UAAU,MAAM;GACd,AAAK,EAAE,OAAuB,QAAQ,QAAQ,KAG9C,EAAE,cAAc,eAAe,cAAc,OAAO,CAAC,EAAE,MAAM;EAC/D;EACA,GAAI5C;CACL,CAAA;AAEL;AAEiCoD,EAC/B,sDACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,WAAW;EACX,WAAW;CACb,EACF;CACA,iBAAiB,EACf,MAAM,KACR;AACF,CACF;AAuBA,SAAS3F,EAAe,EAAE,cAAW,GAAGuC,KAAuC;CAC7E,OACE,kBAAC,QAAD;EACE,WAAW3B,EACT,oIACAuE,CACF;EACA,GAAI5C;CACL,CAAA;AAEL;AAEA,SAAStC,EAAgB,EACvB,cACA,GAAGsC,KAC6B;CAChC,OACE,kBAACrC,GAAD;EACE,aAAU;EACV,WAAWU,EAAG,2GAA2GuE,CAAS;EAClI,GAAI5C;CACL,CAAA;AAEL;AAEA,SAASpC,GAAmB,EAC1B,cACA,GAAGoC,KACgC;CACnC,OACE,kBAACiD,GAAD;EACE,aAAU;EACV,WAAW5E,EAAG,mIAAmIuE,CAAS;EAC1J,GAAI5C;CACL,CAAA;AAEL;;;ACxFA,SAAS0D,IAAqB;CAC7B,IAAM,EAAE,oBAAiBtF,EAAiB;CAC1C,OAAOc,EAAuB,KAAA,GAAWqB,CAAY;AACtD;AAGA,SAASoD,EAAW,EAAE,cAAW,GAAG3D,KAA0B;CAC7D,IAAMM,IAAOoD,EAAmB;CAChC,OACC,kBAAC7F,GAAD;EACC,WAAWQ,EACV,yFACAQ,EAAyByB,IACzB3B,EAAwB2B,IACxB,6GACA,+GACAsC,CACD;EACA,GAAI5C;CACJ,CAAA;AAEH;AAEA,IAAM4D,IAAwB;CAC7B,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,aAAa;AACd,GAEMC,IAA4B;CACjC,IAAI;EAAE,gBAAgB;EAAiB,cAAc;CAAgB;CACrE,IAAI;EAAE,gBAAgB;EAAc,cAAc;CAAa;CAC/D,IAAI;EAAE,gBAAgB;EAAc,cAAc;CAAa;AAChE,GAEMC,IAAmB;CACxB,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;AAGA,SAASC,EAAgB,EAAE,cAAW,WAAQ,gBAAgB,GAAG/D,KAA+B;CAC/F,IAAMM,IAAOoD,EAAmB,GAC1BM,IAAYV,KAAS;CAC3B,OACC,kBAACxF,GAAD;EACQ;EACP,WAAWO,EACV,oEACAyF,EAAiBxD,IACjBsD,EAAsBI,IACtBA,MAAc,kBAAkBA,MAAc,eAC3CH,EAA0BvD,EAAK,CAAC0D,KAChCjF,EAAoCuB,IACvCsC,CACD;EACA,GAAI5C;CACJ,CAAA;AAEH;AAGA,SAASiE,EAAiB,EACzB,cACA,UAAO,aACP,iBAAc,SACd,cAAW,IACX,aACA,GAAGjE,KACsB;CACzB,OACC,kBAACzB,GAAD;EACO;EACO;EACH;EACA;EACV,WAAWF,EACV,wDAIA6F,IACG,sKACA,yJACHtB,CACD;EACA,GAAI5C;CACJ,CAAA;AAEH;AAEA,SAASmE,EAAgB,GAAyD;CACjF,OAAO,OAAOC,KAAY,YAAY,OAAOA,KAAY,YAAY,OAAOA,KAAY;AACzF;AAGA,SAASC,EAAe,EAAE,aAAU,cAAW,GAAGrE,KAA8B;CAC/E,OACC,kBAACjC,GAAD;EACC,WAAWM,EAAG,oFAAsFuE,CAAS;EAC7G,GAAI5C;EAEH,UAAAmE,EAAgBG,CAAQ,IACxB,kBAAC9F,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,YAAW;GAAQ,WAAU;GAC3D;EACI,CAAA,IAEN8F;CAEuB,CAAA;AAE3B;AAGA,SAASC,EAAgB,EAAE,cAAW,GAAGvE,KAA+B;CACvE,IAAMM,IAAOoD,EAAmB;CAChC,OACC,kBAAC1F,GAAD;EACC,WAAWK,EAIV,gFACAQ,EAAyByB,IAEzB,YACAtB,EAA0BsB,IAC1B3B,EAAwB2B,IACxBsC,CACD;EACA,GAAI5C;CACJ,CAAA;AAEH;AAGA,SAASwE,EAAmB,EAAE,cAAW,GAAGxE,KAAkC;CAC7E,IAAMM,IAAOoD,EAAmB;CAChC,OACC,kBAACzF,IAAD;EACC,WAAWI,EACV,0DACAY,EAAwBqB,IACxBvB,EAAoCuB,IACpC3B,EAAwB2B,IACxBsC,CACD;EACA,GAAI5C;CACJ,CAAA;AAEH;;;AC7LA,IAAayE,IAAoD;CAChE,cAAc;CACd,cAAc;AACf,GAqBMC,IAAgBxG,EAAM,WAC3B,SACC,EACC,YACA,oBAAiB,IACjB,oBACA,gBAAa,IACb,qBACA,8BACA,cACA,aACA,YACA,iBACA,SAAS6B,GACT,GAAGC,KAEJ,GACC;CACD,IAAMI,IAAUC,EAAWoE,GAA6B1E,CAAW,GAC7D,CAAC4E,GAAiBC,KAAsB1G,EAAM,SAAS2G,CAAc,GACrElC,IAAemC,MAAY,KAAA,GAC3BC,IAAYpC,IAAemC,IAAUH,GACrCK,IAAgBC,KAAY9C,GAE5B+C,IAAmBhH,EAAM,kBAAkB;EAChD,IAAMiH,IAAc,CAACJ;EAIrB,AAHKpC,KACJiC,EAAmBO,CAAW,GAE/BC,IAAkBD,CAAW;CAC9B,GAAG;EAACxC;EAAcoC;EAAWK;CAAe,CAAC,GAEvCC,IAAmBC,IACxB,kBAAC,UAAD;EACC,MAAK;EACL,WAAWjH,EAAG,0BAA0BK,EAAuB,QAAQA,EAAuB,OAAOA,EAAuB,QAAQ6G,CAAyB;EAC7J,cAAYR,IAAY3E,EAAQ,eAAeA,EAAQ;EACvD,gBAAc2E;EACd,UAAUC;EACV,cAAc,MAAUQ,EAAM,eAAe;EAC7C,SAASN;EAER,UAAYO,EAAZV,IAAaW,IAAwEC,GAAzE;GAAQ,WAAWjH,EAAuB;GAAM,eAAY;EAAQ,CAAqE;CAC/I,CAAA,IACL;CAEJ,OACC,kBAAC,OAAD;EAAK,WAAWL,EAAG,6BAA6B,YAAYuH,CAAgB;EAC3E,UAAA,kBAACxG,EAA2B,UAA5B;GAAqC,OAAOiG;GAC3C,UAAA,kBAAC9F,GAAD;IACC,GAAIS;IACC;IACL,MAAM+E,IAAY,SAAS;IACjB;IACD;IACE;IACX,SAASc;GACT,CAAA;EACmC,CAAA;CACjC,CAAA;AAEP,CACD;AAEA,EAAc,cAAc;;;ACxF5B,SAAgBC,EACf,GACA,EACC,eAAY,KACZ,eAAY,IACZ,UAAO,OACiB,CAAC,GACzB;CACD,IAAMC,IAAgBC,KAAa,KAC7BC,IAAmBF,EAAc,QAAQ,uBAAuB,MAAM,GACxEG,IAAa,OAAOC,KAAS,EAAE,CAAC,CAClC,UAAU,MAAM,CAAC,CACjB,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,QAAQ,MAAM,OAAO,CAAC,CACtB,QAAQ,SAAS,EAAE;CAcrB,OAZIC,MACH,IAAaF,EAAW,YAAY,IAGrC,IAAaA,EACX,QAAQ,8BAA8BH,CAAa,CAAC,CACpD,QAAY,OAAO,GAAGE,EAAiB,OAAO,GAAG,GAAGF,CAAa,GAE/DM,MACH,IAAaH,EAAW,QAAY,OAAO,IAAID,EAAiB,GAAGA,EAAiB,IAAI,GAAG,GAAG,EAAE,IAG1FC;AACR;AAgBA,IAAMI,IAAYnI,EAAM,WACvB,SACC,EACC,UACA,YACA,eAAY,KACZ,eAAY,IACZ,UAAO,IACP,qBACA,cACA,GAAG6B,KAEJ,GACC;CACD,IAAMuG,IAAOpI,EAAM,cACZqI,IAAUL,CAAK,KAAKL,EAAaK,GAAO;EAAE;EAAW;EAAW;CAAK,CAAC,GAC5E;EAACC;EAAWJ;EAAWQ;EAASH;EAAMF;CAAK,CAC5C;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW9H,EAAG,yBAAyBuH,CAAgB;EAC3D,UAAA,kBAACrG,GAAD;GACM;GACL,GAAIS;GACJ,MAAK;GACL,OAAOuG;GACP,UAAA;GACW;EACX,CAAA;CACG,CAAA;AAEP,CACD;AAEA,EAAU,cAAc"}