@mattermost/compass-ui 0.1.0-alpha.3 → 0.1.0-alpha.5

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 (290) hide show
  1. package/dist/compass-ui-standalone.css +10 -0
  2. package/dist/compass-ui.css +2 -0
  3. package/dist/components/action-button/ActionButton.cjs +1 -1
  4. package/dist/components/action-button/ActionButton.cjs.map +1 -1
  5. package/dist/components/action-button/ActionButton.d.ts +2 -1
  6. package/dist/components/action-button/ActionButton.d.ts.map +1 -1
  7. package/dist/components/action-button/ActionButton.js +22 -12
  8. package/dist/components/action-button/ActionButton.js.map +1 -1
  9. package/dist/components/action-button/ActionButton.module.css +1 -1
  10. package/dist/components/action-button/ActionButton.module.scss.cjs +1 -1
  11. package/dist/components/action-button/ActionButton.module.scss.js +5 -5
  12. package/dist/components/admin-panel/AdminPanel.d.ts +1 -1
  13. package/dist/components/attachment-card/AttachmentCard.cjs +1 -1
  14. package/dist/components/attachment-card/AttachmentCard.cjs.map +1 -1
  15. package/dist/components/attachment-card/AttachmentCard.d.ts +3 -1
  16. package/dist/components/attachment-card/AttachmentCard.d.ts.map +1 -1
  17. package/dist/components/attachment-card/AttachmentCard.js +92 -82
  18. package/dist/components/attachment-card/AttachmentCard.js.map +1 -1
  19. package/dist/components/attachment-card/AttachmentCard.module.css +1 -1
  20. package/dist/components/attachment-card/AttachmentCard.module.scss.cjs +1 -1
  21. package/dist/components/attachment-card/AttachmentCard.module.scss.js +19 -18
  22. package/dist/components/attachment-card/AttachmentCard.module.scss.js.map +1 -1
  23. package/dist/components/button/Button.module.css +1 -1
  24. package/dist/components/button/Button.module.scss.cjs +1 -1
  25. package/dist/components/button/Button.module.scss.js +15 -15
  26. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs +1 -1
  27. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs.map +1 -1
  28. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts +4 -1
  29. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts.map +1 -1
  30. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js +112 -92
  31. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js.map +1 -1
  32. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.css +1 -1
  33. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.cjs +1 -1
  34. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js +22 -20
  35. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js.map +1 -1
  36. package/dist/components/channels-sidebar/channelsSidebarModel.d.ts +1 -1
  37. package/dist/components/checkbox/Checkbox.cjs +1 -1
  38. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  39. package/dist/components/checkbox/Checkbox.d.ts +3 -3
  40. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  41. package/dist/components/checkbox/Checkbox.js +21 -20
  42. package/dist/components/checkbox/Checkbox.js.map +1 -1
  43. package/dist/components/checkbox/Checkbox.module.css +1 -1
  44. package/dist/components/checkbox/Checkbox.module.scss.cjs +1 -1
  45. package/dist/components/checkbox/Checkbox.module.scss.js +7 -7
  46. package/dist/components/chip/Chip.cjs +1 -1
  47. package/dist/components/chip/Chip.cjs.map +1 -1
  48. package/dist/components/chip/Chip.d.ts +3 -5
  49. package/dist/components/chip/Chip.d.ts.map +1 -1
  50. package/dist/components/chip/Chip.js +90 -48
  51. package/dist/components/chip/Chip.js.map +1 -1
  52. package/dist/components/chip/Chip.module.css +1 -1
  53. package/dist/components/chip/Chip.module.scss.cjs +1 -1
  54. package/dist/components/chip/Chip.module.scss.js +9 -9
  55. package/dist/components/chip/ChipGroup.cjs +2 -0
  56. package/dist/components/chip/ChipGroup.cjs.map +1 -0
  57. package/dist/components/chip/ChipGroup.d.ts +16 -0
  58. package/dist/components/chip/ChipGroup.d.ts.map +1 -0
  59. package/dist/components/chip/ChipGroup.js +112 -0
  60. package/dist/components/chip/ChipGroup.js.map +1 -0
  61. package/dist/components/chip/ChipGroup.module.css +1 -0
  62. package/dist/components/chip/ChipGroup.module.scss.cjs +2 -0
  63. package/dist/components/chip/ChipGroup.module.scss.cjs.map +1 -0
  64. package/dist/components/chip/ChipGroup.module.scss.js +7 -0
  65. package/dist/components/chip/ChipGroup.module.scss.js.map +1 -0
  66. package/dist/components/chip/index.cjs +1 -1
  67. package/dist/components/chip/index.d.ts +2 -0
  68. package/dist/components/chip/index.d.ts.map +1 -1
  69. package/dist/components/chip/index.js +4 -2
  70. package/dist/components/chip/index.js.map +1 -1
  71. package/dist/components/combobox/Combobox.cjs +1 -1
  72. package/dist/components/combobox/Combobox.cjs.map +1 -1
  73. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  74. package/dist/components/combobox/Combobox.js +115 -109
  75. package/dist/components/combobox/Combobox.js.map +1 -1
  76. package/dist/components/combobox/Combobox.module.css +1 -1
  77. package/dist/components/combobox/Combobox.module.scss.cjs +1 -1
  78. package/dist/components/combobox/Combobox.module.scss.js +27 -29
  79. package/dist/components/date-range-picker/DateRangePicker.cjs +1 -1
  80. package/dist/components/date-range-picker/DateRangePicker.cjs.map +1 -1
  81. package/dist/components/date-range-picker/DateRangePicker.js +154 -154
  82. package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
  83. package/dist/components/date-range-picker/DateRangePicker.module.css +1 -1
  84. package/dist/components/date-range-picker/DateRangePicker.module.scss.cjs +1 -1
  85. package/dist/components/date-range-picker/DateRangePicker.module.scss.js +28 -45
  86. package/dist/components/dropdown/Dropdown.cjs +1 -1
  87. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  88. package/dist/components/dropdown/Dropdown.js +1 -1
  89. package/dist/components/dropdown/Dropdown.js.map +1 -1
  90. package/dist/components/dropdown/Dropdown.module.css +1 -1
  91. package/dist/components/dropdown/Dropdown.module.scss.cjs +1 -1
  92. package/dist/components/dropdown/Dropdown.module.scss.js +15 -16
  93. package/dist/components/empty-state/EmptyState.d.ts +2 -2
  94. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.d.ts +2 -2
  95. package/dist/components/global-banner/GlobalBanner.module.css +1 -1
  96. package/dist/components/global-banner/GlobalBanner.module.scss.cjs +1 -1
  97. package/dist/components/global-banner/GlobalBanner.module.scss.js +10 -10
  98. package/dist/components/icon-button/IconButton.cjs +1 -1
  99. package/dist/components/icon-button/IconButton.cjs.map +1 -1
  100. package/dist/components/icon-button/IconButton.d.ts +1 -1
  101. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  102. package/dist/components/icon-button/IconButton.js +14 -14
  103. package/dist/components/icon-button/IconButton.js.map +1 -1
  104. package/dist/components/icon-button/IconButton.module.css +1 -1
  105. package/dist/components/icon-button/IconButton.module.scss.cjs +1 -1
  106. package/dist/components/icon-button/IconButton.module.scss.js +15 -15
  107. package/dist/components/image-preview/ImagePreview.cjs +1 -1
  108. package/dist/components/image-preview/ImagePreview.cjs.map +1 -1
  109. package/dist/components/image-preview/ImagePreview.d.ts +2 -1
  110. package/dist/components/image-preview/ImagePreview.d.ts.map +1 -1
  111. package/dist/components/image-preview/ImagePreview.js +70 -52
  112. package/dist/components/image-preview/ImagePreview.js.map +1 -1
  113. package/dist/components/image-preview/ImagePreview.module.css +1 -1
  114. package/dist/components/image-preview/ImagePreview.module.scss.cjs +1 -1
  115. package/dist/components/image-preview/ImagePreview.module.scss.js +15 -15
  116. package/dist/components/menu-item/MenuItem.cjs +1 -1
  117. package/dist/components/menu-item/MenuItem.cjs.map +1 -1
  118. package/dist/components/menu-item/MenuItem.js +11 -11
  119. package/dist/components/menu-item/MenuItem.js.map +1 -1
  120. package/dist/components/menu-item/MenuItem.module.css +1 -1
  121. package/dist/components/menu-item/MenuItem.module.scss.cjs +1 -1
  122. package/dist/components/menu-item/MenuItem.module.scss.js +16 -16
  123. package/dist/components/message/Message.d.ts +1 -1
  124. package/dist/components/message/Message.module.css +1 -1
  125. package/dist/components/message/Message.module.scss.cjs +1 -1
  126. package/dist/components/message/Message.module.scss.js +20 -20
  127. package/dist/components/message-reactions/MessageReactions.module.css +1 -1
  128. package/dist/components/message-reactions/MessageReactions.module.scss.cjs +1 -1
  129. package/dist/components/message-reactions/MessageReactions.module.scss.js +12 -12
  130. package/dist/components/modal/Modal.cjs +1 -1
  131. package/dist/components/modal/Modal.cjs.map +1 -1
  132. package/dist/components/modal/Modal.d.ts +9 -1
  133. package/dist/components/modal/Modal.d.ts.map +1 -1
  134. package/dist/components/modal/Modal.js +30 -20
  135. package/dist/components/modal/Modal.js.map +1 -1
  136. package/dist/components/modal/Modal.module.css +1 -1
  137. package/dist/components/modal/Modal.module.scss.cjs +1 -1
  138. package/dist/components/modal/Modal.module.scss.js +18 -17
  139. package/dist/components/modal/Modal.module.scss.js.map +1 -1
  140. package/dist/components/modal/index.d.ts +1 -1
  141. package/dist/components/modal/index.d.ts.map +1 -1
  142. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.css +1 -1
  143. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.cjs +1 -1
  144. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.js +5 -5
  145. package/dist/components/pagination-dots/PaginationDots.module.css +1 -1
  146. package/dist/components/pagination-dots/PaginationDots.module.scss.cjs +1 -1
  147. package/dist/components/pagination-dots/PaginationDots.module.scss.js +8 -8
  148. package/dist/components/radio/Radio.cjs +1 -1
  149. package/dist/components/radio/Radio.cjs.map +1 -1
  150. package/dist/components/radio/Radio.d.ts +3 -3
  151. package/dist/components/radio/Radio.d.ts.map +1 -1
  152. package/dist/components/radio/Radio.js +11 -11
  153. package/dist/components/radio/Radio.js.map +1 -1
  154. package/dist/components/radio/Radio.module.css +1 -1
  155. package/dist/components/radio/Radio.module.scss.cjs +1 -1
  156. package/dist/components/radio/Radio.module.scss.js +11 -11
  157. package/dist/components/right-sidebar/RightSidebarHeader/RightSidebarHeader.d.ts +1 -1
  158. package/dist/components/search-input/SearchInput.cjs +1 -1
  159. package/dist/components/search-input/SearchInput.cjs.map +1 -1
  160. package/dist/components/search-input/SearchInput.d.ts +2 -0
  161. package/dist/components/search-input/SearchInput.d.ts.map +1 -1
  162. package/dist/components/search-input/SearchInput.js +78 -64
  163. package/dist/components/search-input/SearchInput.js.map +1 -1
  164. package/dist/components/search-input/SearchInput.module.css +1 -1
  165. package/dist/components/search-input/SearchInput.module.scss.cjs +1 -1
  166. package/dist/components/search-input/SearchInput.module.scss.js +16 -23
  167. package/dist/components/search-input/SearchInput.module.scss.js.map +1 -1
  168. package/dist/components/select/Select.cjs +1 -1
  169. package/dist/components/select/Select.cjs.map +1 -1
  170. package/dist/components/select/Select.d.ts.map +1 -1
  171. package/dist/components/select/Select.js +64 -64
  172. package/dist/components/select/Select.js.map +1 -1
  173. package/dist/components/select/Select.module.css +1 -1
  174. package/dist/components/select/Select.module.scss.cjs +1 -1
  175. package/dist/components/select/Select.module.scss.js +24 -26
  176. package/dist/components/switch/Switch.cjs +1 -1
  177. package/dist/components/switch/Switch.cjs.map +1 -1
  178. package/dist/components/switch/Switch.d.ts.map +1 -1
  179. package/dist/components/switch/Switch.js +2 -2
  180. package/dist/components/switch/Switch.js.map +1 -1
  181. package/dist/components/switch/Switch.module.css +1 -1
  182. package/dist/components/switch/Switch.module.scss.cjs +1 -1
  183. package/dist/components/switch/Switch.module.scss.js +15 -15
  184. package/dist/components/tabs/Tabs.cjs +1 -1
  185. package/dist/components/tabs/Tabs.cjs.map +1 -1
  186. package/dist/components/tabs/Tabs.d.ts +4 -0
  187. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  188. package/dist/components/tabs/Tabs.js +47 -31
  189. package/dist/components/tabs/Tabs.js.map +1 -1
  190. package/dist/components/tabs/Tabs.module.css +1 -1
  191. package/dist/components/tabs/Tabs.module.scss.cjs +1 -1
  192. package/dist/components/tabs/Tabs.module.scss.js +8 -7
  193. package/dist/components/tabs/Tabs.module.scss.js.map +1 -1
  194. package/dist/components/tag/Tag.module.css +1 -1
  195. package/dist/components/tag/Tag.module.scss.cjs +1 -1
  196. package/dist/components/tag/Tag.module.scss.js +15 -15
  197. package/dist/components/text-area/TextArea.cjs +1 -1
  198. package/dist/components/text-area/TextArea.cjs.map +1 -1
  199. package/dist/components/text-area/TextArea.d.ts.map +1 -1
  200. package/dist/components/text-area/TextArea.js +57 -56
  201. package/dist/components/text-area/TextArea.js.map +1 -1
  202. package/dist/components/text-area/TextArea.module.css +1 -1
  203. package/dist/components/text-area/TextArea.module.scss.cjs +1 -1
  204. package/dist/components/text-area/TextArea.module.scss.js +12 -17
  205. package/dist/components/text-input/TextInput.cjs +1 -1
  206. package/dist/components/text-input/TextInput.cjs.map +1 -1
  207. package/dist/components/text-input/TextInput.d.ts.map +1 -1
  208. package/dist/components/text-input/TextInput.js +59 -58
  209. package/dist/components/text-input/TextInput.js.map +1 -1
  210. package/dist/components/text-input/TextInput.module.css +1 -1
  211. package/dist/components/text-input/TextInput.module.scss.cjs +1 -1
  212. package/dist/components/text-input/TextInput.module.scss.js +16 -24
  213. package/dist/components/thread-footer/ThreadFooter.cjs +1 -1
  214. package/dist/components/thread-footer/ThreadFooter.cjs.map +1 -1
  215. package/dist/components/thread-footer/ThreadFooter.d.ts +7 -8
  216. package/dist/components/thread-footer/ThreadFooter.d.ts.map +1 -1
  217. package/dist/components/thread-footer/ThreadFooter.js +59 -62
  218. package/dist/components/thread-footer/ThreadFooter.js.map +1 -1
  219. package/dist/components/thread-footer/ThreadFooter.module.css +1 -1
  220. package/dist/components/thread-footer/ThreadFooter.module.scss.cjs +1 -1
  221. package/dist/components/thread-footer/ThreadFooter.module.scss.js +17 -17
  222. package/dist/components/thread-footer/index.d.ts +7 -1
  223. package/dist/components/thread-footer/index.d.ts.map +1 -1
  224. package/dist/components/thread-list-item/ThreadListItem.cjs +1 -1
  225. package/dist/components/thread-list-item/ThreadListItem.cjs.map +1 -1
  226. package/dist/components/thread-list-item/ThreadListItem.d.ts +2 -2
  227. package/dist/components/thread-list-item/ThreadListItem.d.ts.map +1 -1
  228. package/dist/components/thread-list-item/ThreadListItem.js +102 -87
  229. package/dist/components/thread-list-item/ThreadListItem.js.map +1 -1
  230. package/dist/components/thread-list-item/ThreadListItem.module.css +1 -1
  231. package/dist/components/thread-list-item/ThreadListItem.module.scss.cjs +1 -1
  232. package/dist/components/thread-list-item/ThreadListItem.module.scss.js +26 -23
  233. package/dist/components/thread-list-item/ThreadListItem.module.scss.js.map +1 -1
  234. package/dist/components/thread-list-item/index.d.ts +1 -1
  235. package/dist/components/toast/Toast.module.css +1 -1
  236. package/dist/components/toast/Toast.module.scss.cjs +1 -1
  237. package/dist/components/toast/Toast.module.scss.js +6 -6
  238. package/dist/components/tour-point/TourPoint.module.css +1 -1
  239. package/dist/components/tour-point/TourPoint.module.scss.cjs +1 -1
  240. package/dist/components/tour-point/TourPoint.module.scss.js +28 -28
  241. package/dist/hooks/use-anchored-popup-portal.cjs +1 -1
  242. package/dist/hooks/use-anchored-popup-portal.cjs.map +1 -0
  243. package/dist/hooks/use-anchored-popup-portal.d.ts +1 -1
  244. package/dist/hooks/use-anchored-popup-portal.d.ts.map +1 -0
  245. package/dist/hooks/use-anchored-popup-portal.js +1 -1
  246. package/dist/hooks/use-anchored-popup-portal.js.map +1 -0
  247. package/dist/hooks/use-controllable.cjs +1 -1
  248. package/dist/hooks/use-controllable.cjs.map +1 -0
  249. package/dist/hooks/use-controllable.d.ts +1 -1
  250. package/dist/hooks/use-controllable.d.ts.map +1 -0
  251. package/dist/hooks/use-controllable.js +1 -1
  252. package/dist/hooks/{useControllable.cjs.map → use-controllable.js.map} +1 -1
  253. package/dist/hooks/use-exit-animation.cjs +1 -1
  254. package/dist/hooks/use-exit-animation.cjs.map +1 -0
  255. package/dist/hooks/use-exit-animation.d.ts +1 -1
  256. package/dist/hooks/use-exit-animation.d.ts.map +1 -0
  257. package/dist/hooks/use-exit-animation.js +1 -1
  258. package/dist/hooks/use-exit-animation.js.map +1 -0
  259. package/dist/hooks/use-outside-close.cjs +1 -1
  260. package/dist/hooks/use-outside-close.cjs.map +1 -0
  261. package/dist/hooks/use-outside-close.d.ts +1 -1
  262. package/dist/hooks/use-outside-close.d.ts.map +1 -0
  263. package/dist/hooks/use-outside-close.js +1 -1
  264. package/dist/hooks/use-outside-close.js.map +1 -0
  265. package/dist/hooks/use-popover-transition.cjs +1 -1
  266. package/dist/hooks/use-popover-transition.cjs.map +1 -0
  267. package/dist/hooks/use-popover-transition.d.ts +1 -1
  268. package/dist/hooks/use-popover-transition.d.ts.map +1 -0
  269. package/dist/hooks/use-popover-transition.js +1 -1
  270. package/dist/hooks/use-popover-transition.js.map +1 -0
  271. package/dist/index.cjs +1 -1
  272. package/dist/index.css +32 -30
  273. package/dist/index.d.ts +96 -96
  274. package/dist/index.js +156 -154
  275. package/dist/index.js.map +1 -1
  276. package/package.json +12 -12
  277. package/dist/hooks/useAnchoredPopupPortal.cjs.map +0 -1
  278. package/dist/hooks/useAnchoredPopupPortal.d.ts.map +0 -1
  279. package/dist/hooks/useAnchoredPopupPortal.js.map +0 -1
  280. package/dist/hooks/useControllable.d.ts.map +0 -1
  281. package/dist/hooks/useControllable.js.map +0 -1
  282. package/dist/hooks/useExitAnimation.cjs.map +0 -1
  283. package/dist/hooks/useExitAnimation.d.ts.map +0 -1
  284. package/dist/hooks/useExitAnimation.js.map +0 -1
  285. package/dist/hooks/useOutsideClose.cjs.map +0 -1
  286. package/dist/hooks/useOutsideClose.d.ts.map +0 -1
  287. package/dist/hooks/useOutsideClose.js.map +0 -1
  288. package/dist/hooks/usePopoverTransition.cjs.map +0 -1
  289. package/dist/hooks/usePopoverTransition.d.ts.map +0 -1
  290. package/dist/hooks/usePopoverTransition.js.map +0 -1
@@ -1,86 +1,87 @@
1
- import { jsxs as u, jsx as p } from "react/jsx-runtime";
2
- import { forwardRef as M, useId as O, useState as _, useCallback as f } from "react";
3
- import { toKebab as Q } from "../../utils/string.js";
1
+ import { jsxs as u, jsx as _ } from "react/jsx-runtime";
2
+ import { forwardRef as O, useId as Q, useState as N, useCallback as f } from "react";
3
+ import { toKebab as W } from "../../utils/string.js";
4
4
  import e from "./TextArea.module.scss.js";
5
- const B = M(
5
+ const L = O(
6
6
  function({
7
- className: N = "",
8
- size: I = "medium",
7
+ className: j = "",
8
+ size: y = "medium",
9
9
  label: d,
10
- invalid: m = !1,
11
- maxLength: s,
12
- showCharacterCount: v = !1,
13
- id: h,
10
+ invalid: v = !1,
11
+ maxLength: l,
12
+ showCharacterCount: m = !1,
13
+ id: I,
14
14
  value: c,
15
15
  defaultValue: x,
16
- placeholder: j,
17
- onFocus: a,
16
+ placeholder: h,
17
+ onFocus: s,
18
18
  onBlur: r,
19
19
  onChange: i,
20
- disabled: y,
21
- readOnly: V,
22
- rows: z = 3,
23
- ...F
24
- }, T) {
25
- const $ = O(), n = h ?? $, l = c !== void 0, [k, w] = _(
20
+ disabled: V,
21
+ readOnly: z,
22
+ rows: A = 3,
23
+ "aria-describedby": F,
24
+ ...T
25
+ }, $) {
26
+ const k = Q(), n = I ?? k, a = c !== void 0, [w, C] = N(
26
27
  x ?? ""
27
- ), o = l ? c : k, C = o != null && o !== "", [K, A] = _(!1), R = K || C, S = f(
28
+ ), o = a ? c : w, K = o != null && o !== "", [R, b] = N(!1), S = R || K, U = f(
28
29
  (t) => {
29
- A(!0), a == null || a(t);
30
+ b(!0), s == null || s(t);
30
31
  },
31
- [a]
32
- ), U = f(
32
+ [s]
33
+ ), q = f(
33
34
  (t) => {
34
- A(!1), r == null || r(t);
35
+ b(!1), r == null || r(t);
35
36
  },
36
37
  [r]
37
- ), q = f(
38
+ ), D = f(
38
39
  (t) => {
39
- l || w(t.target.value), i == null || i(t);
40
+ a || C(t.target.value), i == null || i(t);
40
41
  },
41
- [l, i]
42
- ), D = e[`textArea--size-${Q(I)}`], E = m ? e["textArea--invalid"] : "", G = d != null && R ? e["textArea--label-floated"] : "", H = [
43
- e.textArea,
44
- D,
42
+ [a, i]
43
+ ), E = e[`text-area--size-${W(y)}`], G = v ? e["text-area--invalid"] : "", H = d != null && S ? e["text-area--label-floated"] : "", J = [
44
+ e["text-area"],
45
45
  E,
46
46
  G,
47
- N
48
- ].filter(Boolean).join(" "), J = typeof o == "string" ? o.length : 0, b = v && s != null ? `${n}-counter` : void 0;
49
- return /* @__PURE__ */ u("div", { className: H, children: [
50
- /* @__PURE__ */ u("div", { className: e.textArea__wrapper, children: [
51
- d != null && /* @__PURE__ */ p("label", { className: e.textArea__label, htmlFor: n, children: d }),
52
- /* @__PURE__ */ p(
47
+ H,
48
+ j
49
+ ].filter(Boolean).join(" "), M = typeof o == "string" ? o.length : 0, p = m && l != null ? `${n}-counter` : void 0;
50
+ return /* @__PURE__ */ u("div", { className: J, children: [
51
+ /* @__PURE__ */ u("div", { className: e["text-area__wrapper"], children: [
52
+ d != null && /* @__PURE__ */ _("label", { className: e["text-area__label"], htmlFor: n, children: d }),
53
+ /* @__PURE__ */ _(
53
54
  "textarea",
54
55
  {
55
- ref: T,
56
+ ref: $,
56
57
  id: n,
57
- className: e.textArea__input,
58
- value: l ? c : void 0,
59
- defaultValue: l ? void 0 : x,
60
- placeholder: j,
61
- maxLength: s,
62
- disabled: y,
63
- readOnly: V,
64
- rows: z,
65
- "aria-invalid": m ? !0 : void 0,
66
- "aria-describedby": b,
67
- onFocus: S,
68
- onBlur: U,
69
- onChange: q,
70
- ...F
58
+ className: e["text-area__input"],
59
+ value: a ? c : void 0,
60
+ defaultValue: a ? void 0 : x,
61
+ placeholder: h,
62
+ maxLength: l,
63
+ disabled: V,
64
+ readOnly: z,
65
+ rows: A,
66
+ "aria-invalid": v ? !0 : void 0,
67
+ "aria-describedby": [F, p].filter(Boolean).join(" ") || void 0,
68
+ onFocus: U,
69
+ onBlur: q,
70
+ onChange: D,
71
+ ...T
71
72
  }
72
73
  )
73
74
  ] }),
74
- v && s != null && /* @__PURE__ */ u(
75
+ m && l != null && /* @__PURE__ */ u(
75
76
  "div",
76
77
  {
77
- id: b,
78
- className: e.textArea__counter,
78
+ id: p,
79
+ className: e["text-area__counter"],
79
80
  "aria-live": "polite",
80
81
  children: [
81
- J,
82
+ M,
82
83
  " / ",
83
- s
84
+ l
84
85
  ]
85
86
  }
86
87
  )
@@ -88,6 +89,6 @@ const B = M(
88
89
  }
89
90
  );
90
91
  export {
91
- B as default
92
+ L as default
92
93
  };
93
94
  //# sourceMappingURL=TextArea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextArea.js","sources":["../../../src/components/text-area/TextArea.tsx"],"sourcesContent":["import type { TextareaHTMLAttributes, ReactNode, ChangeEvent } from 'react';\nimport { forwardRef, useId, useState, useCallback } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextArea.module.scss';\n\nexport type TextAreaSize = 'small' | 'medium' | 'large';\n\nexport interface TextAreaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Max length for the textarea; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below textarea. */\n showCharacterCount?: boolean;\n /** Size variant. Default: Medium. */\n size?: TextAreaSize;\n}\n\n/**\n * Text Areas let people write long-form text that spans multiple lines — descriptions,\n * channel purposes, message drafts, admin notes. They share their visual rhythm with Text\n * Input but trade the single-line constraint for room to breathe.\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n className = '',\n size = 'medium',\n label,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n rows = 3,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`textArea--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['textArea--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['textArea--label-floated'] : '';\n\n const rootClass = [\n styles.textArea,\n sizeClass,\n invalidClass,\n labelFloatedClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles.textArea__wrapper}>\n {label != null && (\n <label className={styles.textArea__label} htmlFor={id}>\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={id}\n className={styles.textArea__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n rows={rows}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={counterId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles.textArea__counter}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextArea;\n"],"names":["TextArea","forwardRef","className","size","label","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","rows","rest","ref","generatedId","useId","id","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","useCallback","e","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":";;;;AA8BA,MAAMA,IAAWC;AAAA,EACf,SACE;AAAA,IACE,WAAAC,IAAY;AAAA,IACZ,MAAAC,IAAO;AAAA,IACP,OAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,IACA,oBAAAC,IAAqB;AAAA,IACrB,IAAIC;AAAA,IACJ,OAAOC;AAAA,IACP,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAAcC,EAAA,GACdC,IAAKd,KAAUY,GAEfG,IAAed,MAAc,QAC7B,CAACe,GAAmBC,CAAoB,IAAIC;AAAA,MAChDhB,KAAgB;AAAA,IAAA,GAEZiB,IAAQJ,IAAgBd,IAAuBe,GAC/CI,IAAWD,KAAS,QAAQA,MAAU,IAEtC,CAACE,GAAWC,CAAY,IAAIJ,EAAS,EAAK,GAC1CK,IAAeF,KAAaD,GAE5BI,IAAcC;AAAA,MAClB,CAACC,MAA6C;AAC5C,QAAAJ,EAAa,EAAI,GACjBlB,KAAA,QAAAA,EAAUsB;AAAA,MACZ;AAAA,MACA,CAACtB,CAAO;AAAA,IAAA,GAEJuB,IAAaF;AAAA,MACjB,CAACC,MAA6C;AAC5C,QAAAJ,EAAa,EAAK,GAClBjB,KAAA,QAAAA,EAASqB;AAAA,MACX;AAAA,MACA,CAACrB,CAAM;AAAA,IAAA,GAEHuB,IAAeH;AAAA,MACnB,CAACC,MAAwC;AACvC,QAAKX,KAAcE,EAAqBS,EAAE,OAAO,KAAK,GACtDpB,KAAA,QAAAA,EAAWoB;AAAA,MACb;AAAA,MACA,CAACX,GAAcT,CAAQ;AAAA,IAAA,GAGnBuB,IAAYC,EAAO,kBAAkBC,EAAQpC,CAAI,CAAC,EAAE,GACpDqC,IAAenC,IAAUiC,EAAO,mBAAmB,IAAI,IACvDG,IACJrC,KAAS,QAAQ2B,IAAeO,EAAO,yBAAyB,IAAI,IAEhEI,IAAY;AAAA,MAChBJ,EAAO;AAAA,MACPD;AAAA,MACAG;AAAA,MACAC;AAAA,MACAvC;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELyC,IAAgB,OAAOhB,KAAU,WAAWA,EAAM,SAAS,GAC3DiB,IACJrC,KAAsBD,KAAa,OAAO,GAAGgB,CAAE,aAAa;AAE9D,WACE,gBAAAuB,EAAC,OAAA,EAAI,WAAWH,GACd,UAAA;AAAA,MAAA,gBAAAG,EAAC,OAAA,EAAI,WAAWP,EAAO,mBACpB,UAAA;AAAA,QAAAlC,KAAS,0BACP,SAAA,EAAM,WAAWkC,EAAO,iBAAiB,SAAShB,GAChD,UAAAlB,EAAA,CACH;AAAA,QAEF,gBAAA0C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAA3B;AAAA,YACA,IAAAG;AAAA,YACA,WAAWgB,EAAO;AAAA,YAClB,OAAOf,IAAed,IAAY;AAAA,YAClC,cAAcc,IAAe,SAAYb;AAAA,YACzC,aAAAC;AAAA,YACA,WAAAL;AAAA,YACA,UAAAS;AAAA,YACA,UAAAC;AAAA,YACA,MAAAC;AAAA,YACA,gBAAcZ,IAAU,KAAO;AAAA,YAC/B,oBAAkBuC;AAAA,YAClB,SAASZ;AAAA,YACT,QAAQG;AAAA,YACR,UAAUC;AAAA,YACT,GAAGlB;AAAA,UAAA;AAAA,QAAA;AAAA,MACN,GACF;AAAA,MACCX,KAAsBD,KAAa,QAClC,gBAAAuC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAID;AAAA,UACJ,WAAWN,EAAO;AAAA,UAClB,aAAU;AAAA,UAET,UAAA;AAAA,YAAAK;AAAA,YAAc;AAAA,YAAIrC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,GAEJ;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"TextArea.js","sources":["../../../src/components/text-area/TextArea.tsx"],"sourcesContent":["import type { TextareaHTMLAttributes, ReactNode, ChangeEvent } from 'react';\nimport { forwardRef, useId, useState, useCallback } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextArea.module.scss';\n\nexport type TextAreaSize = 'small' | 'medium' | 'large';\n\nexport interface TextAreaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Max length for the textarea; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below textarea. */\n showCharacterCount?: boolean;\n /** Size variant. Default: Medium. */\n size?: TextAreaSize;\n}\n\n/**\n * Text Areas let people write long-form text that spans multiple lines — descriptions,\n * channel purposes, message drafts, admin notes. They share their visual rhythm with Text\n * Input but trade the single-line constraint for room to breathe.\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n function TextArea(\n {\n className = '',\n size = 'medium',\n label,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n rows = 3,\n 'aria-describedby': describedBy,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`text-area--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['text-area--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['text-area--label-floated'] : '';\n\n const rootClass = [\n styles['text-area'],\n sizeClass,\n invalidClass,\n labelFloatedClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles['text-area__wrapper']}>\n {label != null && (\n <label className={styles['text-area__label']} htmlFor={id}>\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={id}\n className={styles['text-area__input']}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n rows={rows}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={\n [describedBy, counterId].filter(Boolean).join(' ') || undefined\n }\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles['text-area__counter']}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextArea;\n"],"names":["TextArea","forwardRef","className","size","label","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","rows","describedBy","rest","ref","generatedId","useId","id","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","useCallback","e","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":"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"}
@@ -1 +1 @@
1
- ._textArea_ewczf_2{display:flex;flex-direction:column;width:100%}._textArea__wrapper_ewczf_7{position:relative;background-color:var(--center-channel-bg);border-radius:var(--radius-s);box-shadow:inset 0 0 0 1px rgba(var(--center-channel-color-rgb),.16);transition:box-shadow var(--duration-quick) var(--ease-transition)}._textArea_ewczf_2:has(._textArea__input_ewczf_14:not(:disabled)):hover:not(:focus-within) ._textArea__wrapper_ewczf_7{box-shadow:inset 0 0 0 1px rgba(var(--center-channel-color-rgb),.24)}._textArea_ewczf_2:has(._textArea__input_ewczf_14:focus-visible) ._textArea__wrapper_ewczf_7{box-shadow:inset 0 0 0 1px var(--button-bg),0 0 0 1px var(--button-bg)}._textArea_ewczf_2:has(._textArea__input_ewczf_14:disabled) ._textArea__wrapper_ewczf_7{background-color:var(--center-channel-bg);opacity:.56}._textArea__label_ewczf_24{position:absolute;left:var(--spacing-xs);top:var(--spacing-s);padding:0 var(--spacing-xxxs);margin:0;font-family:Open Sans,sans-serif;font-size:var(--font-size-100);line-height:var(--line-height-100);font-weight:var(--font-weight-regular);color:rgba(var(--center-channel-color-rgb),.64);background-color:var(--center-channel-bg);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 24px);transition:font-size var(--duration-quick) var(--ease-transition),top var(--duration-quick) var(--ease-transition),color var(--duration-quick) var(--ease-transition)}._textArea--label-floated_ewczf_43 ._textArea__label_ewczf_24{top:0;transform:translateY(-50%);font-size:var(--font-size-25);line-height:14px;color:rgba(var(--center-channel-color-rgb),.64)}._textArea__input_ewczf_14{display:block;width:100%;margin:0;border:0;background:transparent;resize:vertical;font-family:Open Sans,sans-serif;font-size:var(--font-size-100);line-height:var(--line-height-100);font-weight:var(--font-weight-regular);color:var(--center-channel-color);box-sizing:border-box}._textArea__input_ewczf_14:focus{outline:none}._textArea__input_ewczf_14::placeholder{color:rgba(var(--center-channel-color-rgb),.64)}._textArea__input_ewczf_14:disabled{cursor:not-allowed;resize:none}._textArea__counter_ewczf_74{margin-top:var(--spacing-xxxs);font-family:Open Sans,sans-serif;font-size:var(--font-size-25);line-height:14px;color:rgba(var(--center-channel-color-rgb),.64)}._textArea--size-small_ewczf_81 ._textArea__input_ewczf_14{padding:var(--spacing-xs) var(--spacing-m);font-size:var(--font-size-75);line-height:var(--line-height-75)}._textArea--size-small_ewczf_81 ._textArea__label_ewczf_24{top:var(--spacing-xs);font-size:var(--font-size-75);line-height:var(--line-height-25)}._textArea--size-small_ewczf_81._textArea--label-floated_ewczf_43 ._textArea__label_ewczf_24{top:0;font-size:var(--font-size-25);line-height:14px}._textArea--size-medium_ewczf_96 ._textArea__input_ewczf_14{padding:var(--spacing-s) var(--spacing-l);font-size:var(--font-size-100);line-height:var(--line-height-100)}._textArea--size-medium_ewczf_96 ._textArea__label_ewczf_24{top:var(--spacing-s);left:var(--spacing-m);font-size:var(--font-size-100)}._textArea--size-medium_ewczf_96._textArea--label-floated_ewczf_43 ._textArea__label_ewczf_24{top:0;font-size:var(--font-size-25);line-height:14px}._textArea--size-large_ewczf_111 ._textArea__input_ewczf_14{padding:var(--spacing-m) var(--spacing-l);font-size:var(--font-size-200);line-height:var(--line-height-200)}._textArea--size-large_ewczf_111 ._textArea__label_ewczf_24{top:var(--spacing-m);left:var(--spacing-m);font-size:var(--font-size-200);line-height:var(--line-height-200)}._textArea--size-large_ewczf_111._textArea--label-floated_ewczf_43 ._textArea__label_ewczf_24{top:0;font-size:var(--font-size-25);line-height:14px}._textArea_ewczf_2:has(._textArea__input_ewczf_14:focus-visible) ._textArea__label_ewczf_24{color:var(--button-bg)}._textArea_ewczf_2:has(._textArea__label_ewczf_24):not(._textArea--label-floated_ewczf_43) ._textArea__input_ewczf_14::placeholder{color:transparent}._textArea--invalid_ewczf_133 ._textArea__wrapper_ewczf_7{box-shadow:inset 0 0 0 1px var(--error-text, var(--color-danger))}._textArea--invalid_ewczf_133:has(._textArea__input_ewczf_14:focus-visible) ._textArea__wrapper_ewczf_7{box-shadow:inset 0 0 0 1px var(--error-text, var(--color-danger)),0 0 0 1px var(--error-text, var(--color-danger))}._textArea--invalid_ewczf_133 ._textArea__label_ewczf_24{color:var(--error-text, var(--color-danger))}._textArea--invalid_ewczf_133:has(._textArea__input_ewczf_14:focus-visible) ._textArea__label_ewczf_24{color:var(--error-text, var(--color-danger))}
1
+ ._text-area_1qev1_2{display:flex;flex-direction:column;width:100%}._text-area__wrapper_1qev1_7{position:relative;background-color:var(--center-channel-bg);border-radius:var(--radius-s);box-shadow:inset 0 0 0 1px rgba(var(--center-channel-color-rgb),.16);transition:box-shadow var(--duration-quick) var(--ease-transition)}._text-area_1qev1_2:has(._text-area__input_1qev1_14:not(:disabled)):hover:not(:focus-within) ._text-area__wrapper_1qev1_7{box-shadow:inset 0 0 0 1px rgba(var(--center-channel-color-rgb),.24)}._text-area_1qev1_2:has(._text-area__input_1qev1_14:focus-visible) ._text-area__wrapper_1qev1_7{box-shadow:inset 0 0 0 1px var(--focus-ring-color),0 0 0 1px var(--focus-ring-color)}._text-area_1qev1_2:has(._text-area__input_1qev1_14:disabled) ._text-area__wrapper_1qev1_7{background-color:var(--center-channel-bg);opacity:.56}._text-area__label_1qev1_24{position:absolute;left:var(--spacing-xs);top:var(--spacing-s);padding:0 var(--spacing-xxxs);margin:0;font-family:Open Sans,sans-serif;font-size:var(--font-size-100);line-height:var(--line-height-100);font-weight:var(--font-weight-regular);color:rgba(var(--center-channel-color-rgb),.64);background-color:var(--center-channel-bg);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 24px);transition:font-size var(--duration-quick) var(--ease-transition),top var(--duration-quick) var(--ease-transition),color var(--duration-quick) var(--ease-transition)}._text-area--label-floated_1qev1_43 ._text-area__label_1qev1_24{top:0;transform:translateY(-50%);font-size:var(--font-size-25);line-height:14px;color:rgba(var(--center-channel-color-rgb),.64)}._text-area__input_1qev1_14{display:block;width:100%;margin:0;border:0;background:transparent;resize:vertical;font-family:Open Sans,sans-serif;font-size:var(--font-size-100);line-height:var(--line-height-100);font-weight:var(--font-weight-regular);color:var(--center-channel-color);box-sizing:border-box}._text-area__input_1qev1_14:focus{outline:none}._text-area__input_1qev1_14::placeholder{color:rgba(var(--center-channel-color-rgb),.64)}._text-area__input_1qev1_14:disabled{cursor:not-allowed;resize:none}._text-area__counter_1qev1_74{margin-top:var(--spacing-xxxs);font-family:Open Sans,sans-serif;font-size:var(--font-size-25);line-height:14px;color:rgba(var(--center-channel-color-rgb),.64)}._text-area--size-small_1qev1_81 ._text-area__input_1qev1_14{padding:var(--spacing-xs) var(--spacing-m);font-size:var(--font-size-75);line-height:var(--line-height-75)}._text-area--size-small_1qev1_81 ._text-area__label_1qev1_24{top:var(--spacing-xs);font-size:var(--font-size-75);line-height:var(--line-height-25)}._text-area--size-small_1qev1_81._text-area--label-floated_1qev1_43 ._text-area__label_1qev1_24{top:0;font-size:var(--font-size-25);line-height:14px}._text-area--size-medium_1qev1_96 ._text-area__input_1qev1_14{padding:var(--spacing-s) var(--spacing-l);font-size:var(--font-size-100);line-height:var(--line-height-100)}._text-area--size-medium_1qev1_96 ._text-area__label_1qev1_24{top:var(--spacing-s);left:var(--spacing-m);font-size:var(--font-size-100)}._text-area--size-medium_1qev1_96._text-area--label-floated_1qev1_43 ._text-area__label_1qev1_24{top:0;font-size:var(--font-size-25);line-height:14px}._text-area--size-large_1qev1_111 ._text-area__input_1qev1_14{padding:var(--spacing-m) var(--spacing-l);font-size:var(--font-size-200);line-height:var(--line-height-200)}._text-area--size-large_1qev1_111 ._text-area__label_1qev1_24{top:var(--spacing-m);left:var(--spacing-m);font-size:var(--font-size-200);line-height:var(--line-height-200)}._text-area--size-large_1qev1_111._text-area--label-floated_1qev1_43 ._text-area__label_1qev1_24{top:0;font-size:var(--font-size-25);line-height:14px}._text-area_1qev1_2:has(._text-area__input_1qev1_14:focus-visible) ._text-area__label_1qev1_24{color:var(--button-bg)}._text-area_1qev1_2:has(._text-area__label_1qev1_24):not(._text-area--label-floated_1qev1_43) ._text-area__input_1qev1_14::placeholder{color:transparent}._text-area--invalid_1qev1_133 ._text-area__wrapper_1qev1_7{box-shadow:inset 0 0 0 1px var(--error-text, var(--color-danger))}._text-area--invalid_1qev1_133:has(._text-area__input_1qev1_14:focus-visible) ._text-area__wrapper_1qev1_7{box-shadow:inset 0 0 0 1px var(--error-text, var(--color-danger)),0 0 0 1px var(--error-text, var(--color-danger))}._text-area--invalid_1qev1_133 ._text-area__label_1qev1_24{color:var(--error-text, var(--color-danger))}._text-area--invalid_1qev1_133:has(._text-area__input_1qev1_14:focus-visible) ._text-area__label_1qev1_24{color:var(--error-text, var(--color-danger))}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./TextArea.module.css');const e="_textArea_ewczf_2",t="_textArea__wrapper_ewczf_7",_="_textArea__input_ewczf_14",a="_textArea__label_ewczf_24",r="_textArea__counter_ewczf_74",x={textArea:e,textArea__wrapper:t,textArea__input:_,textArea__label:a,"textArea--label-floated":"_textArea--label-floated_ewczf_43",textArea__counter:r,"textArea--size-small":"_textArea--size-small_ewczf_81","textArea--size-medium":"_textArea--size-medium_ewczf_96","textArea--size-large":"_textArea--size-large_ewczf_111","textArea--invalid":"_textArea--invalid_ewczf_133"};exports.default=x;exports.textArea=e;exports.textArea__counter=r;exports.textArea__input=_;exports.textArea__label=a;exports.textArea__wrapper=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./TextArea.module.css');const e={"text-area":"_text-area_1qev1_2","text-area__wrapper":"_text-area__wrapper_1qev1_7","text-area__input":"_text-area__input_1qev1_14","text-area__label":"_text-area__label_1qev1_24","text-area--label-floated":"_text-area--label-floated_1qev1_43","text-area__counter":"_text-area__counter_1qev1_74","text-area--size-small":"_text-area--size-small_1qev1_81","text-area--size-medium":"_text-area--size-medium_1qev1_96","text-area--size-large":"_text-area--size-large_1qev1_111","text-area--invalid":"_text-area--invalid_1qev1_133"};exports.default=e;
2
2
  //# sourceMappingURL=TextArea.module.scss.cjs.map
@@ -1,21 +1,16 @@
1
- import './TextArea.module.css';const e = "_textArea_ewczf_2", t = "_textArea__wrapper_ewczf_7", _ = "_textArea__input_ewczf_14", a = "_textArea__label_ewczf_24", r = "_textArea__counter_ewczf_74", x = {
2
- textArea: e,
3
- textArea__wrapper: t,
4
- textArea__input: _,
5
- textArea__label: a,
6
- "textArea--label-floated": "_textArea--label-floated_ewczf_43",
7
- textArea__counter: r,
8
- "textArea--size-small": "_textArea--size-small_ewczf_81",
9
- "textArea--size-medium": "_textArea--size-medium_ewczf_96",
10
- "textArea--size-large": "_textArea--size-large_ewczf_111",
11
- "textArea--invalid": "_textArea--invalid_ewczf_133"
1
+ import './TextArea.module.css';const e = {
2
+ "text-area": "_text-area_1qev1_2",
3
+ "text-area__wrapper": "_text-area__wrapper_1qev1_7",
4
+ "text-area__input": "_text-area__input_1qev1_14",
5
+ "text-area__label": "_text-area__label_1qev1_24",
6
+ "text-area--label-floated": "_text-area--label-floated_1qev1_43",
7
+ "text-area__counter": "_text-area__counter_1qev1_74",
8
+ "text-area--size-small": "_text-area--size-small_1qev1_81",
9
+ "text-area--size-medium": "_text-area--size-medium_1qev1_96",
10
+ "text-area--size-large": "_text-area--size-large_1qev1_111",
11
+ "text-area--invalid": "_text-area--invalid_1qev1_133"
12
12
  };
13
13
  export {
14
- x as default,
15
- e as textArea,
16
- r as textArea__counter,
17
- _ as textArea__input,
18
- a as textArea__label,
19
- t as textArea__wrapper
14
+ e as default
20
15
  };
21
16
  //# sourceMappingURL=TextArea.module.scss.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),l=require("react"),W=require("../../utils/string.cjs"),t=require("./TextInput.module.scss.cjs"),X=l.forwardRef(function({className:C="",size:R="medium",label:o,leadingIcon:f,trailingIcon:p,invalid:I=!1,maxLength:u,showCharacterCount:_=!1,id:y,value:x,defaultValue:v,placeholder:T,onFocus:i,onBlur:c,onChange:d,disabled:g,readOnly:k,...q},n){const S=l.useId(),b=y??S,j=l.useRef(null),V=l.useCallback(e=>{if(j.current=e,typeof n=="function"){const N=n(e);return()=>{j.current=null,typeof N=="function"&&N()}}n&&(n.current=e)},[n]),a=x!==void 0,[z,M]=l.useState(v??""),r=a?x:z,$=r!=null&&r!=="",[w,m]=l.useState(!1),F=w||$,K=l.useCallback(e=>{m(!0),i==null||i(e)},[i]),O=l.useCallback(e=>{m(!1),c==null||c(e)},[c]),U=l.useCallback(e=>{a||M(e.target.value),d==null||d(e)},[a,d]),A=t.default[`textInput--size-${W.toKebab(R)}`],D=I?t.default["textInput--invalid"]:"",E=o!=null&&F?t.default["textInput--label-floated"]:"",G=f!=null?t.default["textInput--has-leading-icon"]:"",H=p!=null?t.default["textInput--has-trailing-icon"]:"",J=[t.default.textInput,A,D,E,G,H,C].filter(Boolean).join(" "),Q=typeof r=="string"?r.length:0,h=_&&u!=null?`${b}-counter`:void 0;return s.jsxs("div",{className:J,children:[s.jsx("div",{className:t.default.textInput__wrapper,children:s.jsxs("label",{className:t.default.textInput__inner,children:[o!=null&&s.jsx("span",{className:t.default.textInput__label,children:o}),f!=null&&s.jsx("span",{className:t.default.textInput__leadingIcon,children:f}),s.jsx("input",{ref:V,id:b,className:t.default.textInput__input,value:a?x:void 0,defaultValue:a?void 0:v,placeholder:T,maxLength:u,disabled:g,readOnly:k,"aria-invalid":I?!0:void 0,"aria-describedby":h,onFocus:K,onBlur:O,onChange:U,...q}),p!=null&&s.jsx("span",{className:t.default.textInput__trailingIcon,children:p})]})}),_&&u!=null&&s.jsxs("div",{id:h,className:t.default.textInput__counter,"aria-live":"polite",children:[Q," / ",u]})]})});exports.default=X;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),l=require("react"),X=require("../../utils/string.cjs"),t=require("./TextInput.module.scss.cjs"),Y=l.forwardRef(function({className:C="",size:R="medium",label:r,leadingIcon:f,trailingIcon:p,invalid:_=!1,maxLength:i,showCharacterCount:v=!1,id:T,value:x,defaultValue:b,placeholder:g,onFocus:u,onBlur:c,onChange:d,disabled:k,readOnly:q,"aria-describedby":I,...S},n){const V=l.useId(),j=T??V,m=l.useRef(null),z=l.useCallback(e=>{if(m.current=e,typeof n=="function"){const y=n(e);return()=>{m.current=null,typeof y=="function"&&y()}}n&&(n.current=e)},[n]),a=x!==void 0,[M,$]=l.useState(b??""),o=a?x:M,w=o!=null&&o!=="",[F,h]=l.useState(!1),K=F||w,O=l.useCallback(e=>{h(!0),u==null||u(e)},[u]),U=l.useCallback(e=>{h(!1),c==null||c(e)},[c]),A=l.useCallback(e=>{a||$(e.target.value),d==null||d(e)},[a,d]),D=t.default[`text-input--size-${X.toKebab(R)}`],E=_?t.default["text-input--invalid"]:"",G=r!=null&&K?t.default["text-input--label-floated"]:"",H=f!=null?t.default["text-input--has-leading-icon"]:"",J=p!=null?t.default["text-input--has-trailing-icon"]:"",Q=[t.default["text-input"],D,E,G,H,J,C].filter(Boolean).join(" "),W=typeof o=="string"?o.length:0,N=v&&i!=null?`${j}-counter`:void 0;return s.jsxs("div",{className:Q,children:[s.jsx("div",{className:t.default["text-input__wrapper"],children:s.jsxs("label",{className:t.default["text-input__inner"],children:[r!=null&&s.jsx("span",{className:t.default["text-input__label"],children:r}),f!=null&&s.jsx("span",{className:t.default["text-input__leading-icon"],children:f}),s.jsx("input",{ref:z,id:j,className:t.default["text-input__input"],value:a?x:void 0,defaultValue:a?void 0:b,placeholder:g,maxLength:i,disabled:k,readOnly:q,"aria-invalid":_?!0:void 0,"aria-describedby":[I,N].filter(Boolean).join(" ")||void 0,onFocus:O,onBlur:U,onChange:A,...S}),p!=null&&s.jsx("span",{className:t.default["text-input__trailing-icon"],children:p})]})}),v&&i!=null&&s.jsxs("div",{id:N,className:t.default["text-input__counter"],"aria-live":"polite",children:[W," / ",i]})]})});exports.default=Y;
2
2
  //# sourceMappingURL=TextInput.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.cjs","sources":["../../../src/components/text-input/TextInput.tsx"],"sourcesContent":["import type {\n InputHTMLAttributes,\n ReactNode,\n ChangeEvent,\n RefCallback,\n} from 'react';\nimport { forwardRef, useId, useState, useCallback, useRef } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextInput.module.scss';\n\nexport type TextInputSize = 'small' | 'medium' | 'large';\n\nexport interface TextInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Leading icon (e.g. <Icon glyph={<SearchIcon />} size=\"16\" />). */\n leadingIcon?: ReactNode;\n /** Max length for the input; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below input. */\n showCharacterCount?: boolean;\n /** Size variant. Figma: Small (32px), Medium (40px), Large (48px). Default: Medium. */\n size?: TextInputSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\n/**\n * Text Inputs let people enter and edit a single line of text — names, emails, search\n * queries, channel titles. They're the workhorse of every form and modal in Mattermost.\n */\nconst TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n function TextInput(\n {\n className = '',\n size = 'medium',\n label,\n leadingIcon,\n trailingIcon,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n const cleanup = (ref as RefCallback<HTMLInputElement>)(node);\n return () => {\n inputRef.current = null;\n if (typeof cleanup === 'function') cleanup();\n };\n }\n if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`textInput--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['textInput--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['textInput--label-floated'] : '';\n const hasLeadingClass =\n leadingIcon != null ? styles['textInput--has-leading-icon'] : '';\n const hasTrailingClass =\n trailingIcon != null ? styles['textInput--has-trailing-icon'] : '';\n\n const rootClass = [\n styles.textInput,\n sizeClass,\n invalidClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles.textInput__wrapper}>\n <label className={styles.textInput__inner}>\n {label != null && (\n <span className={styles.textInput__label}>{label}</span>\n )}\n {leadingIcon != null && (\n <span className={styles.textInput__leadingIcon}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles.textInput__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={counterId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {trailingIcon != null && (\n <span className={styles.textInput__trailingIcon}>\n {trailingIcon}\n </span>\n )}\n </label>\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles.textInput__counter}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextInput;\n"],"names":["TextInput","forwardRef","className","size","label","leadingIcon","trailingIcon","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","rest","ref","generatedId","useId","id","inputRef","useRef","setInputRef","useCallback","node","cleanup","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","hasLeadingClass","hasTrailingClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"TextInput.cjs","sources":["../../../src/components/text-input/TextInput.tsx"],"sourcesContent":["import type {\n InputHTMLAttributes,\n ReactNode,\n ChangeEvent,\n RefCallback,\n} from 'react';\nimport { forwardRef, useId, useState, useCallback, useRef } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextInput.module.scss';\n\nexport type TextInputSize = 'small' | 'medium' | 'large';\n\nexport interface TextInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Leading icon (e.g. <Icon glyph={<SearchIcon />} size=\"16\" />). */\n leadingIcon?: ReactNode;\n /** Max length for the input; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below input. */\n showCharacterCount?: boolean;\n /** Size variant. Figma: Small (32px), Medium (40px), Large (48px). Default: Medium. */\n size?: TextInputSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\n/**\n * Text Inputs let people enter and edit a single line of text — names, emails, search\n * queries, channel titles. They're the workhorse of every form and modal in Mattermost.\n */\nconst TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n function TextInput(\n {\n className = '',\n size = 'medium',\n label,\n leadingIcon,\n trailingIcon,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n 'aria-describedby': describedBy,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n const cleanup = (ref as RefCallback<HTMLInputElement>)(node);\n return () => {\n inputRef.current = null;\n if (typeof cleanup === 'function') cleanup();\n };\n }\n if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`text-input--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['text-input--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['text-input--label-floated'] : '';\n const hasLeadingClass =\n leadingIcon != null ? styles['text-input--has-leading-icon'] : '';\n const hasTrailingClass =\n trailingIcon != null ? styles['text-input--has-trailing-icon'] : '';\n\n const rootClass = [\n styles['text-input'],\n sizeClass,\n invalidClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles['text-input__wrapper']}>\n <label className={styles['text-input__inner']}>\n {label != null && (\n <span className={styles['text-input__label']}>{label}</span>\n )}\n {leadingIcon != null && (\n <span className={styles['text-input__leading-icon']}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles['text-input__input']}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={\n [describedBy, counterId].filter(Boolean).join(' ') || undefined\n }\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {trailingIcon != null && (\n <span className={styles['text-input__trailing-icon']}>\n {trailingIcon}\n </span>\n )}\n </label>\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles['text-input__counter']}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextInput;\n"],"names":["TextInput","forwardRef","className","size","label","leadingIcon","trailingIcon","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","describedBy","rest","ref","generatedId","useId","id","inputRef","useRef","setInputRef","useCallback","node","cleanup","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","hasLeadingClass","hasTrailingClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../src/components/text-input/TextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EAGV,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,CACP;IACC,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,qBAAqB;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;;GAGG;AACH,QAAA,MAAM,SAAS,6GAoJd,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../src/components/text-input/TextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EAGV,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,CACP;IACC,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,qBAAqB;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;;GAGG;AACH,QAAA,MAAM,SAAS,6GAuJd,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,101 +1,102 @@
1
- import { jsxs as m, jsx as n } from "react/jsx-runtime";
2
- import { forwardRef as Y, useId as Z, useRef as L, useCallback as r, useState as j } from "react";
3
- import { toKebab as B } from "../../utils/string.js";
1
+ import { jsxs as x, jsx as n } from "react/jsx-runtime";
2
+ import { forwardRef as Z, useId as B, useRef as L, useCallback as r, useState as C } from "react";
3
+ import { toKebab as P } from "../../utils/string.js";
4
4
  import t from "./TextInput.module.scss.js";
5
- const nt = Y(
5
+ const it = Z(
6
6
  function({
7
- className: C = "",
7
+ className: I = "",
8
8
  size: T = "medium",
9
9
  label: d,
10
10
  leadingIcon: p,
11
11
  trailingIcon: f,
12
- invalid: x = !1,
13
- maxLength: a,
12
+ invalid: v = !1,
13
+ maxLength: i,
14
14
  showCharacterCount: _ = !1,
15
15
  id: V,
16
- value: I,
17
- defaultValue: v,
16
+ value: m,
17
+ defaultValue: b,
18
18
  placeholder: z,
19
- onFocus: i,
20
- onBlur: u,
21
- onChange: c,
19
+ onFocus: a,
20
+ onBlur: c,
21
+ onChange: u,
22
22
  disabled: $,
23
23
  readOnly: g,
24
- ...k
25
- }, s) {
26
- const w = Z(), h = V ?? w, b = L(null), F = r(
24
+ "aria-describedby": k,
25
+ ...w
26
+ }, l) {
27
+ const F = B(), h = V ?? F, N = L(null), K = r(
27
28
  (e) => {
28
- if (b.current = e, typeof s == "function") {
29
- const R = s(e);
29
+ if (N.current = e, typeof l == "function") {
30
+ const R = l(e);
30
31
  return () => {
31
- b.current = null, typeof R == "function" && R();
32
+ N.current = null, typeof R == "function" && R();
32
33
  };
33
34
  }
34
- s && (s.current = e);
35
+ l && (l.current = e);
35
36
  },
36
- [s]
37
- ), l = I !== void 0, [K, S] = j(
38
- v ?? ""
39
- ), o = l ? I : K, U = o != null && o !== "", [q, N] = j(!1), A = q || U, D = r(
37
+ [l]
38
+ ), s = m !== void 0, [S, U] = C(
39
+ b ?? ""
40
+ ), o = s ? m : S, q = o != null && o !== "", [A, y] = C(!1), D = A || q, E = r(
40
41
  (e) => {
41
- N(!0), i == null || i(e);
42
+ y(!0), a == null || a(e);
42
43
  },
43
- [i]
44
- ), E = r(
44
+ [a]
45
+ ), G = r(
45
46
  (e) => {
46
- N(!1), u == null || u(e);
47
+ y(!1), c == null || c(e);
47
48
  },
48
- [u]
49
- ), G = r(
49
+ [c]
50
+ ), H = r(
50
51
  (e) => {
51
- l || S(e.target.value), c == null || c(e);
52
+ s || U(e.target.value), u == null || u(e);
52
53
  },
53
- [l, c]
54
- ), H = t[`textInput--size-${B(T)}`], J = x ? t["textInput--invalid"] : "", M = d != null && A ? t["textInput--label-floated"] : "", O = p != null ? t["textInput--has-leading-icon"] : "", Q = f != null ? t["textInput--has-trailing-icon"] : "", W = [
55
- t.textInput,
56
- H,
54
+ [s, u]
55
+ ), J = t[`text-input--size-${P(T)}`], M = v ? t["text-input--invalid"] : "", O = d != null && D ? t["text-input--label-floated"] : "", Q = p != null ? t["text-input--has-leading-icon"] : "", W = f != null ? t["text-input--has-trailing-icon"] : "", X = [
56
+ t["text-input"],
57
57
  J,
58
58
  M,
59
59
  O,
60
60
  Q,
61
- C
62
- ].filter(Boolean).join(" "), X = typeof o == "string" ? o.length : 0, y = _ && a != null ? `${h}-counter` : void 0;
63
- return /* @__PURE__ */ m("div", { className: W, children: [
64
- /* @__PURE__ */ n("div", { className: t.textInput__wrapper, children: /* @__PURE__ */ m("label", { className: t.textInput__inner, children: [
65
- d != null && /* @__PURE__ */ n("span", { className: t.textInput__label, children: d }),
66
- p != null && /* @__PURE__ */ n("span", { className: t.textInput__leadingIcon, children: p }),
61
+ W,
62
+ I
63
+ ].filter(Boolean).join(" "), Y = typeof o == "string" ? o.length : 0, j = _ && i != null ? `${h}-counter` : void 0;
64
+ return /* @__PURE__ */ x("div", { className: X, children: [
65
+ /* @__PURE__ */ n("div", { className: t["text-input__wrapper"], children: /* @__PURE__ */ x("label", { className: t["text-input__inner"], children: [
66
+ d != null && /* @__PURE__ */ n("span", { className: t["text-input__label"], children: d }),
67
+ p != null && /* @__PURE__ */ n("span", { className: t["text-input__leading-icon"], children: p }),
67
68
  /* @__PURE__ */ n(
68
69
  "input",
69
70
  {
70
- ref: F,
71
+ ref: K,
71
72
  id: h,
72
- className: t.textInput__input,
73
- value: l ? I : void 0,
74
- defaultValue: l ? void 0 : v,
73
+ className: t["text-input__input"],
74
+ value: s ? m : void 0,
75
+ defaultValue: s ? void 0 : b,
75
76
  placeholder: z,
76
- maxLength: a,
77
+ maxLength: i,
77
78
  disabled: $,
78
79
  readOnly: g,
79
- "aria-invalid": x ? !0 : void 0,
80
- "aria-describedby": y,
81
- onFocus: D,
82
- onBlur: E,
83
- onChange: G,
84
- ...k
80
+ "aria-invalid": v ? !0 : void 0,
81
+ "aria-describedby": [k, j].filter(Boolean).join(" ") || void 0,
82
+ onFocus: E,
83
+ onBlur: G,
84
+ onChange: H,
85
+ ...w
85
86
  }
86
87
  ),
87
- f != null && /* @__PURE__ */ n("span", { className: t.textInput__trailingIcon, children: f })
88
+ f != null && /* @__PURE__ */ n("span", { className: t["text-input__trailing-icon"], children: f })
88
89
  ] }) }),
89
- _ && a != null && /* @__PURE__ */ m(
90
+ _ && i != null && /* @__PURE__ */ x(
90
91
  "div",
91
92
  {
92
- id: y,
93
- className: t.textInput__counter,
93
+ id: j,
94
+ className: t["text-input__counter"],
94
95
  "aria-live": "polite",
95
96
  children: [
96
- X,
97
+ Y,
97
98
  " / ",
98
- a
99
+ i
99
100
  ]
100
101
  }
101
102
  )
@@ -103,6 +104,6 @@ const nt = Y(
103
104
  }
104
105
  );
105
106
  export {
106
- nt as default
107
+ it as default
107
108
  };
108
109
  //# sourceMappingURL=TextInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.js","sources":["../../../src/components/text-input/TextInput.tsx"],"sourcesContent":["import type {\n InputHTMLAttributes,\n ReactNode,\n ChangeEvent,\n RefCallback,\n} from 'react';\nimport { forwardRef, useId, useState, useCallback, useRef } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextInput.module.scss';\n\nexport type TextInputSize = 'small' | 'medium' | 'large';\n\nexport interface TextInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Leading icon (e.g. <Icon glyph={<SearchIcon />} size=\"16\" />). */\n leadingIcon?: ReactNode;\n /** Max length for the input; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below input. */\n showCharacterCount?: boolean;\n /** Size variant. Figma: Small (32px), Medium (40px), Large (48px). Default: Medium. */\n size?: TextInputSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\n/**\n * Text Inputs let people enter and edit a single line of text — names, emails, search\n * queries, channel titles. They're the workhorse of every form and modal in Mattermost.\n */\nconst TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n function TextInput(\n {\n className = '',\n size = 'medium',\n label,\n leadingIcon,\n trailingIcon,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n const cleanup = (ref as RefCallback<HTMLInputElement>)(node);\n return () => {\n inputRef.current = null;\n if (typeof cleanup === 'function') cleanup();\n };\n }\n if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`textInput--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['textInput--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['textInput--label-floated'] : '';\n const hasLeadingClass =\n leadingIcon != null ? styles['textInput--has-leading-icon'] : '';\n const hasTrailingClass =\n trailingIcon != null ? styles['textInput--has-trailing-icon'] : '';\n\n const rootClass = [\n styles.textInput,\n sizeClass,\n invalidClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles.textInput__wrapper}>\n <label className={styles.textInput__inner}>\n {label != null && (\n <span className={styles.textInput__label}>{label}</span>\n )}\n {leadingIcon != null && (\n <span className={styles.textInput__leadingIcon}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles.textInput__input}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={counterId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {trailingIcon != null && (\n <span className={styles.textInput__trailingIcon}>\n {trailingIcon}\n </span>\n )}\n </label>\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles.textInput__counter}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextInput;\n"],"names":["TextInput","forwardRef","className","size","label","leadingIcon","trailingIcon","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","rest","ref","generatedId","useId","id","inputRef","useRef","setInputRef","useCallback","node","cleanup","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","hasLeadingClass","hasTrailingClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"TextInput.js","sources":["../../../src/components/text-input/TextInput.tsx"],"sourcesContent":["import type {\n InputHTMLAttributes,\n ReactNode,\n ChangeEvent,\n RefCallback,\n} from 'react';\nimport { forwardRef, useId, useState, useCallback, useRef } from 'react';\nimport { toKebab } from '@/utils/string';\nimport styles from './TextInput.module.scss';\n\nexport type TextInputSize = 'small' | 'medium' | 'large';\n\nexport interface TextInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size'\n> {\n /** Optional CSS class name. */\n className?: string;\n /** When true, shows invalid/error styling. */\n invalid?: boolean;\n /** Floating label content. When provided, label floats on focus or when value is non-empty. */\n label?: ReactNode;\n /** Leading icon (e.g. <Icon glyph={<SearchIcon />} size=\"16\" />). */\n leadingIcon?: ReactNode;\n /** Max length for the input; used with showCharacterCount for counter. */\n maxLength?: number;\n /** When true with maxLength, shows \"current / max\" character count below input. */\n showCharacterCount?: boolean;\n /** Size variant. Figma: Small (32px), Medium (40px), Large (48px). Default: Medium. */\n size?: TextInputSize;\n /** Trailing icon. */\n trailingIcon?: ReactNode;\n}\n\n/**\n * Text Inputs let people enter and edit a single line of text — names, emails, search\n * queries, channel titles. They're the workhorse of every form and modal in Mattermost.\n */\nconst TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n function TextInput(\n {\n className = '',\n size = 'medium',\n label,\n leadingIcon,\n trailingIcon,\n invalid = false,\n maxLength,\n showCharacterCount = false,\n id: idProp,\n value: valueProp,\n defaultValue,\n placeholder,\n onFocus,\n onBlur,\n onChange,\n disabled,\n readOnly,\n 'aria-describedby': describedBy,\n ...rest\n },\n ref,\n ) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n const cleanup = (ref as RefCallback<HTMLInputElement>)(node);\n return () => {\n inputRef.current = null;\n if (typeof cleanup === 'function') cleanup();\n };\n }\n if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp as string) : uncontrolledValue;\n const hasValue = value != null && value !== '';\n\n const [isFocused, setIsFocused] = useState(false);\n const labelFloated = isFocused || hasValue;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolledValue(e.target.value);\n onChange?.(e);\n },\n [isControlled, onChange],\n );\n\n const sizeClass = styles[`text-input--size-${toKebab(size)}`];\n const invalidClass = invalid ? styles['text-input--invalid'] : '';\n const labelFloatedClass =\n label != null && labelFloated ? styles['text-input--label-floated'] : '';\n const hasLeadingClass =\n leadingIcon != null ? styles['text-input--has-leading-icon'] : '';\n const hasTrailingClass =\n trailingIcon != null ? styles['text-input--has-trailing-icon'] : '';\n\n const rootClass = [\n styles['text-input'],\n sizeClass,\n invalidClass,\n labelFloatedClass,\n hasLeadingClass,\n hasTrailingClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const currentLength = typeof value === 'string' ? value.length : 0;\n const counterId =\n showCharacterCount && maxLength != null ? `${id}-counter` : undefined;\n\n return (\n <div className={rootClass}>\n <div className={styles['text-input__wrapper']}>\n <label className={styles['text-input__inner']}>\n {label != null && (\n <span className={styles['text-input__label']}>{label}</span>\n )}\n {leadingIcon != null && (\n <span className={styles['text-input__leading-icon']}>\n {leadingIcon}\n </span>\n )}\n <input\n ref={setInputRef}\n id={id}\n className={styles['text-input__input']}\n value={isControlled ? valueProp : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid ? true : undefined}\n aria-describedby={\n [describedBy, counterId].filter(Boolean).join(' ') || undefined\n }\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n {trailingIcon != null && (\n <span className={styles['text-input__trailing-icon']}>\n {trailingIcon}\n </span>\n )}\n </label>\n </div>\n {showCharacterCount && maxLength != null && (\n <div\n id={counterId}\n className={styles['text-input__counter']}\n aria-live=\"polite\"\n >\n {currentLength} / {maxLength}\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default TextInput;\n"],"names":["TextInput","forwardRef","className","size","label","leadingIcon","trailingIcon","invalid","maxLength","showCharacterCount","idProp","valueProp","defaultValue","placeholder","onFocus","onBlur","onChange","disabled","readOnly","describedBy","rest","ref","generatedId","useId","id","inputRef","useRef","setInputRef","useCallback","node","cleanup","isControlled","uncontrolledValue","setUncontrolledValue","useState","value","hasValue","isFocused","setIsFocused","labelFloated","handleFocus","handleBlur","handleChange","sizeClass","styles","toKebab","invalidClass","labelFloatedClass","hasLeadingClass","hasTrailingClass","rootClass","currentLength","counterId","jsxs","jsx"],"mappings":";;;;AAsCA,MAAMA,KAAYC;AAAA,EAChB,SACE;AAAA,IACE,WAAAC,IAAY;AAAA,IACZ,MAAAC,IAAO;AAAA,IACP,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,IACA,oBAAAC,IAAqB;AAAA,IACrB,IAAIC;AAAA,IACJ,OAAOC;AAAA,IACP,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,oBAAoBC;AAAA,IACpB,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAAcC,EAAA,GACdC,IAAKd,KAAUY,GACfG,IAAWC,EAAgC,IAAI,GAE/CC,IAAcC;AAAA,MAClB,CAACC,MAAkC;AAEjC,YADAJ,EAAS,UAAUI,GACf,OAAOR,KAAQ,YAAY;AAC7B,gBAAMS,IAAWT,EAAsCQ,CAAI;AAC3D,iBAAO,MAAM;AACX,YAAAJ,EAAS,UAAU,MACf,OAAOK,KAAY,cAAYA,EAAA;AAAA,UACrC;AAAA,QACF;AACA,QAAIT,QAAS,UAAUQ;AAAA,MACzB;AAAA,MACA,CAACR,CAAG;AAAA,IAAA,GAGAU,IAAepB,MAAc,QAC7B,CAACqB,GAAmBC,CAAoB,IAAIC;AAAA,MAChDtB,KAAgB;AAAA,IAAA,GAEZuB,IAAQJ,IAAgBpB,IAAuBqB,GAC/CI,IAAWD,KAAS,QAAQA,MAAU,IAEtC,CAACE,GAAWC,CAAY,IAAIJ,EAAS,EAAK,GAC1CK,IAAeF,KAAaD,GAE5BI,IAAcZ;AAAA,MAClB,CAAC,MAA0C;AACzC,QAAAU,EAAa,EAAI,GACjBxB,KAAA,QAAAA,EAAU;AAAA,MACZ;AAAA,MACA,CAACA,CAAO;AAAA,IAAA,GAEJ2B,IAAab;AAAA,MACjB,CAAC,MAA0C;AACzC,QAAAU,EAAa,EAAK,GAClBvB,KAAA,QAAAA,EAAS;AAAA,MACX;AAAA,MACA,CAACA,CAAM;AAAA,IAAA,GAEH2B,IAAed;AAAA,MACnB,CAAC,MAAqC;AACpC,QAAKG,KAAcE,EAAqB,EAAE,OAAO,KAAK,GACtDjB,KAAA,QAAAA,EAAW;AAAA,MACb;AAAA,MACA,CAACe,GAAcf,CAAQ;AAAA,IAAA,GAGnB2B,IAAYC,EAAO,oBAAoBC,EAAQ1C,CAAI,CAAC,EAAE,GACtD2C,IAAevC,IAAUqC,EAAO,qBAAqB,IAAI,IACzDG,IACJ3C,KAAS,QAAQmC,IAAeK,EAAO,2BAA2B,IAAI,IAClEI,IACJ3C,KAAe,OAAOuC,EAAO,8BAA8B,IAAI,IAC3DK,IACJ3C,KAAgB,OAAOsC,EAAO,+BAA+B,IAAI,IAE7DM,IAAY;AAAA,MAChBN,EAAO,YAAY;AAAA,MACnBD;AAAA,MACAG;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACA/C;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELiD,IAAgB,OAAOhB,KAAU,WAAWA,EAAM,SAAS,GAC3DiB,IACJ3C,KAAsBD,KAAa,OAAO,GAAGgB,CAAE,aAAa;AAE9D,WACE,gBAAA6B,EAAC,OAAA,EAAI,WAAWH,GACd,UAAA;AAAA,MAAA,gBAAAI,EAAC,OAAA,EAAI,WAAWV,EAAO,qBAAqB,GAC1C,4BAAC,SAAA,EAAM,WAAWA,EAAO,mBAAmB,GACzC,UAAA;AAAA,QAAAxC,KAAS,QACR,gBAAAkD,EAAC,QAAA,EAAK,WAAWV,EAAO,mBAAmB,GAAI,UAAAxC,GAAM;AAAA,QAEtDC,KAAe,QACd,gBAAAiD,EAAC,QAAA,EAAK,WAAWV,EAAO,0BAA0B,GAC/C,UAAAvC,GACH;AAAA,QAEF,gBAAAiD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK3B;AAAA,YACL,IAAAH;AAAA,YACA,WAAWoB,EAAO,mBAAmB;AAAA,YACrC,OAAOb,IAAepB,IAAY;AAAA,YAClC,cAAcoB,IAAe,SAAYnB;AAAA,YACzC,aAAAC;AAAA,YACA,WAAAL;AAAA,YACA,UAAAS;AAAA,YACA,UAAAC;AAAA,YACA,gBAAcX,IAAU,KAAO;AAAA,YAC/B,oBACE,CAACY,GAAaiC,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YAExD,SAASZ;AAAA,YACT,QAAQC;AAAA,YACR,UAAUC;AAAA,YACT,GAAGtB;AAAA,UAAA;AAAA,QAAA;AAAA,QAELd,KAAgB,QACf,gBAAAgD,EAAC,QAAA,EAAK,WAAWV,EAAO,2BAA2B,GAChD,UAAAtC,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ,EAAA,CACF;AAAA,MACCG,KAAsBD,KAAa,QAClC,gBAAA6C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAID;AAAA,UACJ,WAAWR,EAAO,qBAAqB;AAAA,UACvC,aAAU;AAAA,UAET,UAAA;AAAA,YAAAO;AAAA,YAAc;AAAA,YAAI3C;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,GAEJ;AAAA,EAEJ;AACF;"}