ics-ui-kit 0.1.0-alpha.47 → 0.1.0-alpha.49

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 (198) hide show
  1. package/README.md +32 -32
  2. package/dist/AlertContext-CxjW1LVL.js.map +1 -1
  3. package/dist/AlertIcon-DQs4wtDT.js.map +1 -1
  4. package/dist/Button--ooZ8ALo.js.map +1 -1
  5. package/dist/ButtonBase-Sf-fcVor.js.map +1 -1
  6. package/dist/CarouselItem-DCAuGIKz.js.map +1 -1
  7. package/dist/{CheckboxField-DvsGq3kV.js → CheckboxField-BR2hWwTO.js} +2 -2
  8. package/dist/CheckboxField-BR2hWwTO.js.map +1 -0
  9. package/dist/{Command-BU9Ouar3.js → Command-C_iW2joV.js} +2 -2
  10. package/dist/Command-C_iW2joV.js.map +1 -0
  11. package/dist/ComponentVariantProvider-B0SFUaXB.js.map +1 -1
  12. package/dist/Description-BTPMlTT-.js.map +1 -1
  13. package/dist/Dialog-CkDUxZUj.js.map +1 -1
  14. package/dist/Divider-Dm2gjy8W.js.map +1 -1
  15. package/dist/EmptyState-DRKjscH-.js.map +1 -1
  16. package/dist/ErrorState-B26k67-z.js.map +1 -1
  17. package/dist/FeatureIcon-yM7FhAXa.js.map +1 -1
  18. package/dist/{Field-CdocNMjg.js → Field-DpbrZvvg.js} +2 -2
  19. package/dist/Field-DpbrZvvg.js.map +1 -0
  20. package/dist/{FieldLabel-DRwAhGMz.js → FieldLabel-saPDMPPr.js} +2 -2
  21. package/dist/FieldLabel-saPDMPPr.js.map +1 -0
  22. package/dist/FolderSvg-cw0DxNVy.js.map +1 -1
  23. package/dist/{FormFooterTemplate-1MNxzQ7J.js → FormFooterTemplate-DV4pN3b-.js} +2 -2
  24. package/dist/FormFooterTemplate-DV4pN3b-.js.map +1 -0
  25. package/dist/FormHeader-BA2dJOPS.js.map +1 -1
  26. package/dist/{FormStack-DbtLshF8.js → FormStack-D-0fK-Zy.js} +3 -3
  27. package/dist/FormStack-D-0fK-Zy.js.map +1 -0
  28. package/dist/HintState-BxrCAWqq.js.map +1 -1
  29. package/dist/Icon-DH3ev9GK.js.map +1 -1
  30. package/dist/IconButton-moydR8IU.js.map +1 -1
  31. package/dist/{IconTooltip-CibXkFmt.js → IconTooltip-BbswlF6Q.js} +3 -3
  32. package/dist/IconTooltip-BbswlF6Q.js.map +1 -0
  33. package/dist/ImagePlaceholder-B6mGYVx2.js.map +1 -1
  34. package/dist/ImagePreview-BIBDrLVV.js.map +1 -1
  35. package/dist/ImageUploader-C-_ZPptv.js.map +1 -1
  36. package/dist/Indicator-B75A1Vgp.js.map +1 -1
  37. package/dist/InputGroup-CmstXpkX.js.map +1 -1
  38. package/dist/InputOTP-B2e1nfSO.js.map +1 -1
  39. package/dist/Loader-BpHiL6W-.js.map +1 -1
  40. package/dist/MenuItem-pvsONHlh.js.map +1 -1
  41. package/dist/{MenuItemShortcut-CGbVYqRi.js → MenuItemShortcut-DK7VneTR.js} +2 -2
  42. package/dist/MenuItemShortcut-DK7VneTR.js.map +1 -0
  43. package/dist/MenuItemText-7uPl9P3z.js.map +1 -1
  44. package/dist/Overlay-CLw_hvAN.js.map +1 -1
  45. package/dist/{Popover-CkezMtEz.js → Popover-DmwXZwYd.js} +17 -17
  46. package/dist/Popover-DmwXZwYd.js.map +1 -0
  47. package/dist/RichButton-BuenN3bJ.js.map +1 -1
  48. package/dist/ScrollShadowContainer-ODG9ChxA.js.map +1 -1
  49. package/dist/{SearchSelectTag-D1bFK1ux.js → SearchSelectTag-Ce-Q9JGR.js} +2 -2
  50. package/dist/SearchSelectTag-Ce-Q9JGR.js.map +1 -0
  51. package/dist/{Select-Bfrb-J8s.js → Select-CWbLja8r.js} +195 -195
  52. package/dist/Select-CWbLja8r.js.map +1 -0
  53. package/dist/Sheet-Dx9mwcF6.js.map +1 -1
  54. package/dist/Shortcut-D8L15_ed.js +22 -0
  55. package/dist/Shortcut-D8L15_ed.js.map +1 -0
  56. package/dist/Skeleton-y6I-i9q5.js.map +1 -1
  57. package/dist/{Tag-DJuVSJh5.js → Tag-CofZF1d0.js} +6 -6
  58. package/dist/Tag-CofZF1d0.js.map +1 -0
  59. package/dist/Text-DeBE8AKl.js.map +1 -1
  60. package/dist/TextInput-DTzujp77.js.map +1 -1
  61. package/dist/{Toggle-CS29Nksd.js → Toggle-CCD2UHWr.js} +15 -13
  62. package/dist/Toggle-CCD2UHWr.js.map +1 -0
  63. package/dist/{Tooltip-Cm1-WEdA.js → Tooltip-BH_Jc6ub.js} +2 -2
  64. package/dist/Tooltip-BH_Jc6ub.js.map +1 -0
  65. package/dist/TriggerButton-a2ClSj7f.js +33 -0
  66. package/dist/TriggerButton-a2ClSj7f.js.map +1 -0
  67. package/dist/blocks/auth/otp-form.js +1 -1
  68. package/dist/blocks/auth/otp-form.js.map +1 -1
  69. package/dist/cn-dsXlqdJg.js.map +1 -1
  70. package/dist/components/alert-dialog.js.map +1 -1
  71. package/dist/components/alert.js.map +1 -1
  72. package/dist/components/avatar/Avatar.d.ts +1 -1
  73. package/dist/components/avatar/avatar-indicator/AvatarIndicator.d.ts +3 -1
  74. package/dist/components/avatar/avatar-label/AvatarLabel.d.ts +1 -1
  75. package/dist/components/avatar.js +110 -93
  76. package/dist/components/avatar.js.map +1 -1
  77. package/dist/components/badge.js.map +1 -1
  78. package/dist/components/breadcrumb.js.map +1 -1
  79. package/dist/components/button.js +1 -1
  80. package/dist/components/button.js.map +1 -1
  81. package/dist/components/calendar.js.map +1 -1
  82. package/dist/components/card.js.map +1 -1
  83. package/dist/components/carousel.js.map +1 -1
  84. package/dist/components/checkbox.js +1 -1
  85. package/dist/components/collapsible.js.map +1 -1
  86. package/dist/components/color-tile.js.map +1 -1
  87. package/dist/components/command.js +1 -1
  88. package/dist/components/container.js.map +1 -1
  89. package/dist/components/counter.js.map +1 -1
  90. package/dist/components/dialog.js +1 -1
  91. package/dist/components/dialog.js.map +1 -1
  92. package/dist/components/divider.js.map +1 -1
  93. package/dist/components/drawer.js +1 -1
  94. package/dist/components/drawer.js.map +1 -1
  95. package/dist/components/dropdown.js +2 -2
  96. package/dist/components/dropdown.js.map +1 -1
  97. package/dist/components/error-state.js.map +1 -1
  98. package/dist/components/field.js +1 -1
  99. package/dist/components/file-upload.js.map +1 -1
  100. package/dist/components/form.js +3 -3
  101. package/dist/components/form.js.map +1 -1
  102. package/dist/components/gallery.js.map +1 -1
  103. package/dist/components/icon-tooltip.js +1 -1
  104. package/dist/components/input.js.map +1 -1
  105. package/dist/components/label.js +1 -1
  106. package/dist/components/menu-item.js +1 -1
  107. package/dist/components/menu-item.js.map +1 -1
  108. package/dist/components/overflow-tooltip.js +1 -1
  109. package/dist/components/overflow-tooltip.js.map +1 -1
  110. package/dist/components/page-state.js.map +1 -1
  111. package/dist/components/popover.js +1 -1
  112. package/dist/components/portal-container.js.map +1 -1
  113. package/dist/components/progress-circle.js.map +1 -1
  114. package/dist/components/progress.js.map +1 -1
  115. package/dist/components/prose.js.map +1 -1
  116. package/dist/components/radio-group.js.map +1 -1
  117. package/dist/components/resizable.js.map +1 -1
  118. package/dist/components/scheduler.js +1 -1
  119. package/dist/components/scheduler.js.map +1 -1
  120. package/dist/components/search-select.js +4 -4
  121. package/dist/components/search-select.js.map +1 -1
  122. package/dist/components/select.js +1 -1
  123. package/dist/components/shortcut.js +1 -1
  124. package/dist/components/sidebar.js +71 -68
  125. package/dist/components/sidebar.js.map +1 -1
  126. package/dist/components/slider.js.map +1 -1
  127. package/dist/components/stepper.js.map +1 -1
  128. package/dist/components/switch.js +1 -1
  129. package/dist/components/switch.js.map +1 -1
  130. package/dist/components/system-state.js.map +1 -1
  131. package/dist/components/table.js.map +1 -1
  132. package/dist/components/tabs.js.map +1 -1
  133. package/dist/components/tag-input.js +2 -2
  134. package/dist/components/tag-input.js.map +1 -1
  135. package/dist/components/tag.js +1 -1
  136. package/dist/components/textarea.js.map +1 -1
  137. package/dist/components/toast.js.map +1 -1
  138. package/dist/components/toggle/Toggle.d.ts +8 -2
  139. package/dist/components/toggle-group.js +1 -1
  140. package/dist/components/toggle-group.js.map +1 -1
  141. package/dist/components/toggle.js +1 -1
  142. package/dist/components/toolbar.js.map +1 -1
  143. package/dist/components/tooltip.js +1 -1
  144. package/dist/downloadFile-yZV-aaO2.js.map +1 -1
  145. package/dist/font-inter.css +15 -15
  146. package/dist/font-menlo.css +15 -15
  147. package/dist/index-0ioNhtNM.js.map +1 -1
  148. package/dist/index-5Bhkapwi.js.map +1 -1
  149. package/dist/index-BGQepRFJ.js.map +1 -1
  150. package/dist/index-BGfrl8IX.js.map +1 -1
  151. package/dist/index-BNirMMl4.js.map +1 -1
  152. package/dist/index-BVqs-uqP.js.map +1 -1
  153. package/dist/index-BZPx6jYI.js.map +1 -1
  154. package/dist/index-BdXokVmb.js.map +1 -1
  155. package/dist/index-Bwf2hSw6.js.map +1 -1
  156. package/dist/index-C0UREtMP.js.map +1 -1
  157. package/dist/index-C3surxzg.js.map +1 -1
  158. package/dist/index-CCKe-Mpx.js.map +1 -1
  159. package/dist/index-CpDnqHCm.js.map +1 -1
  160. package/dist/index-DFZozV_h.js.map +1 -1
  161. package/dist/index-DG36Jang.js.map +1 -1
  162. package/dist/index-DfNPZZ8M.js.map +1 -1
  163. package/dist/index-DpXwz_9G.js.map +1 -1
  164. package/dist/index-Nzc5v6h6.js.map +1 -1
  165. package/dist/index-l1F44JQJ.js.map +1 -1
  166. package/dist/index.js.map +1 -1
  167. package/dist/inputBaseStyles-BZJgQP7O.js.map +1 -1
  168. package/dist/lib/utils.js.map +1 -1
  169. package/dist/styles-scoped.css +5846 -5832
  170. package/dist/styles.css +1949 -1935
  171. package/dist/types/css.d.ts +4 -4
  172. package/dist/useBreakpoints-wEcfJPHd.js.map +1 -1
  173. package/dist/useDebounce-BRah78CF.js.map +1 -1
  174. package/dist/useFileUpload-iDag0iqM.js.map +1 -1
  175. package/dist/useMergeRefs-qoKniYqT.js.map +1 -1
  176. package/dist/usePortalContainer-ae6EzS08.js.map +1 -1
  177. package/dist/vendors/tanstack/react-table.js.map +1 -1
  178. package/dist/zod-BMNoK3aM.js.map +1 -1
  179. package/package.json +172 -172
  180. package/dist/CheckboxField-DvsGq3kV.js.map +0 -1
  181. package/dist/Command-BU9Ouar3.js.map +0 -1
  182. package/dist/Field-CdocNMjg.js.map +0 -1
  183. package/dist/FieldLabel-DRwAhGMz.js.map +0 -1
  184. package/dist/FormFooterTemplate-1MNxzQ7J.js.map +0 -1
  185. package/dist/FormStack-DbtLshF8.js.map +0 -1
  186. package/dist/IconTooltip-CibXkFmt.js.map +0 -1
  187. package/dist/MenuItemShortcut-CGbVYqRi.js.map +0 -1
  188. package/dist/Popover-CkezMtEz.js.map +0 -1
  189. package/dist/SearchSelectTag-D1bFK1ux.js.map +0 -1
  190. package/dist/Select-Bfrb-J8s.js.map +0 -1
  191. package/dist/Shortcut-Cm4nUx2C.js +0 -22
  192. package/dist/Shortcut-Cm4nUx2C.js.map +0 -1
  193. package/dist/Tag-DJuVSJh5.js.map +0 -1
  194. package/dist/Toggle-CS29Nksd.js.map +0 -1
  195. package/dist/Tooltip-Cm1-WEdA.js.map +0 -1
  196. package/dist/TriggerButton-BzXO5wcQ.js +0 -33
  197. package/dist/TriggerButton-BzXO5wcQ.js.map +0 -1
  198. package/dist/design-tokens.source.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tag-input.js","sources":["../../src/components/tag-input/TagInput.tsx"],"sourcesContent":["import { SearchSelectTag } from \"@/components/search-select/components/SearchSelectTag\";\r\nimport { useControllableState } from \"@/hooks/useControllableState\";\r\nimport { useItemsKeyboardNavigation } from \"@/hooks/useItemsKeyboardNavigation\";\r\nimport React, { KeyboardEvent, useCallback, useRef, useState } from \"react\";\r\nimport { tv } from \"tailwind-variants\";\r\nimport { InputGroup, InputGroupInput, InputGroupContentEditable } from \"../input\";\r\nimport { selectTriggerStyles } from \"../select/Select\";\r\n\r\nconst tagInputStyles = tv({\r\n\textend: selectTriggerStyles,\r\n\tbase: \"group/search-select-trigger flex h-auto min-h-10 flex-wrap items-center gap-1 !py-[0.3125rem] px-1.5 lg:h-auto lg:min-h-9 lg:px-1.5\"\r\n});\r\n\r\nconst inputStyles = tv({\r\n\tbase: \"min-w-28 rounded-none p-0 px-1.5 leading-6 read-only:w-0 read-only:min-w-0 lg:p-0 lg:px-1.5\"\r\n});\r\n\r\nconst editingDivStyles = tv({\r\n\tbase: \"p-0 px-1.5 outline-none lg:p-0 lg:px-1.5\"\r\n});\r\n\r\n/**\r\n * Пропсы для рендера тега\r\n */\r\nexport type RenderTagProps = {\r\n\t/** Значение тега (строка) */\r\n\ttag: string;\r\n\t/** Индекс тега в массиве */\r\n\tindex: number;\r\n\t/** Функция для удаления тега */\r\n\tonClose?: () => void;\r\n\t/** Функция для начала редактирования тега */\r\n\tonEdit?: () => void;\r\n\t/** Фокус на теге (для навигации с клавиатуры) */\r\n\tisFocused: boolean;\r\n\t/** Отключен ли компонент */\r\n\treadonly: boolean;\r\n};\r\n\r\n/**\r\n * Функция валидации тега по умолчанию\r\n */\r\nconst defaultValidateTag = (tag: string, allTags: string[], editingIndex?: number): boolean | string => {\r\n\tif (!tag.trim()) return \"Тег не может быть пустым\";\r\n\r\n\tif (editingIndex === undefined) {\r\n\t\t// Добавление нового тега\r\n\t\tif (allTags.includes(tag)) return \"Такой тег уже существует\";\r\n\t} else {\r\n\t\t// Редактирование существующего\r\n\t\tconst otherTags = allTags.filter((_, i) => i !== editingIndex);\r\n\t\tif (otherTags.includes(tag)) return \"Такой тег уже существует\";\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\nexport interface TagInputProps {\r\n\t/** Текущие выбранные опции (controlled режим) */\r\n\tvalue?: string[];\r\n\t/** Опции по умолчанию (uncontrolled режим) */\r\n\tdefaultValue?: string[];\r\n\t/** Callback при изменении выбранных опций */\r\n\tonChange?: (options: string[]) => void;\r\n\t/** Placeholder для input */\r\n\tplaceholder?: string;\r\n\t/** Отключить компонент */\r\n\treadonly?: boolean;\r\n\t/** CSS класс для контейнера */\r\n\tclassName?: string;\r\n\t/** Функция валидации тега. Если null - валидация отключена, если не передана - используется валидация по умолчанию */\r\n\tvalidateTag?: ((tag: string, allTags: string[], editingIndex?: number) => boolean | string) | null;\r\n\t/** Состояние ошибки */\r\n\tinvalid?: boolean;\r\n\t/** Кастомная функция рендера тега */\r\n\trenderOption?: (props: RenderTagProps) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Компонент для ввода и отображения тегов\r\n */\r\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>(\r\n\t(\r\n\t\t{\r\n\t\t\tvalue,\r\n\t\t\tdefaultValue = [],\r\n\t\t\tonChange,\r\n\t\t\tplaceholder = \"Добавить тег...\",\r\n\t\t\treadonly = false,\r\n\t\t\tclassName,\r\n\t\t\tvalidateTag,\r\n\t\t\tinvalid,\r\n\t\t\trenderOption\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\t// Состояние для ввода нового тега\r\n\t\tconst [inputValue, setInputValue] = useState(\"\");\r\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\r\n\r\n\t\t// Управление тегами\r\n\t\tconst [tags = [], setTags] = useControllableState<string[]>({ value, defaultValue, onChange });\r\n\r\n\t\tconst styles = tagInputStyles({ className, invalid });\r\n\t\tconst removeTag = useCallback(\r\n\t\t\t(index: number) => {\r\n\t\t\t\tif (readonly) return;\r\n\t\t\t\tsetTags(tags.filter((_, i) => i !== index));\r\n\t\t\t},\r\n\t\t\t[tags, setTags, readonly]\r\n\t\t);\r\n\r\n\t\t// Состояние для режима редактирования существующих тегов\r\n\t\tconst [editingIndex, setEditingIndex] = useState<number | null>(null);\r\n\t\tconst editingRef = useRef<HTMLDivElement>(null);\r\n\r\n\t\t/**\r\n\t\t * Функция валидации тега\r\n\t\t */\r\n\t\tconst validateTagValue = useCallback(\r\n\t\t\t(tag: string, editingIndex?: number): boolean => {\r\n\t\t\t\tif (validateTag === null) return true;\r\n\r\n\t\t\t\tconst validator = validateTag || defaultValidateTag;\r\n\t\t\t\tconst result = validator(tag, tags, editingIndex);\r\n\r\n\t\t\t\treturn result === true;\r\n\t\t\t},\r\n\t\t\t[validateTag, tags]\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Переключение в режим редактирования существующего тега\r\n\t\t */\r\n\t\tconst startEditing = useCallback(\r\n\t\t\t(index: number) => {\r\n\t\t\t\tif (readonly) return;\r\n\t\t\t\tsetEditingIndex(index);\r\n\t\t\t\t// Фокусируем элемент после обновления состояния\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tif (editingRef.current) {\r\n\t\t\t\t\t\t// Устанавливаем содержимое напрямую, без использования React state\r\n\t\t\t\t\t\teditingRef.current.textContent = tags[index];\r\n\t\t\t\t\t\teditingRef.current.focus();\r\n\t\t\t\t\t\t// Выделяем весь текст\r\n\t\t\t\t\t\tconst range = document.createRange();\r\n\t\t\t\t\t\trange.selectNodeContents(editingRef.current);\r\n\t\t\t\t\t\tconst selection = window.getSelection();\r\n\t\t\t\t\t\tselection?.removeAllRanges();\r\n\t\t\t\t\t\tselection?.addRange(range);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 0);\r\n\t\t\t},\r\n\t\t\t[tags, setEditingIndex, readonly]\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Отмена редактирования тега\r\n\t\t */\r\n\t\tconst cancelEditing = useCallback(() => {\r\n\t\t\tsetEditingIndex(null);\r\n\t\t\tsetTimeout(() => inputRef.current?.focus(), 0);\r\n\t\t}, [setEditingIndex]);\r\n\r\n\t\t/**\r\n\t\t * Обработчик нажатия Enter на теге: переключает текущий тег в режим редактирования\r\n\t\t */\r\n\t\tconst onEnter = useCallback((_: string, index: number) => startEditing(index), [startEditing]);\r\n\r\n\t\tconst handleDeleteTag = useCallback((_: string, index: number) => removeTag(index), [removeTag]);\r\n\r\n\t\t/**\r\n\t\t * Хук для навигации по тегам с помощью клавиатуры (вперед/назад)\r\n\t\t */\r\n\t\tconst { handleKeyDown: handleTagsKeyDown, isFocused } = useItemsKeyboardNavigation({\r\n\t\t\titems: tags,\r\n\t\t\tonEnter,\r\n\t\t\tonDelete: handleDeleteTag,\r\n\t\t\tcycleNavigation: true\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Сохранение изменений в текущем теге\r\n\t\t */\r\n\t\tconst saveEditing = useCallback(() => {\r\n\t\t\tif (editingIndex !== null && editingRef.current) {\r\n\t\t\t\tconst newValue = editingRef.current.textContent?.trim() || \"\";\r\n\r\n\t\t\t\tif (newValue && validateTagValue(newValue, editingIndex)) {\r\n\t\t\t\t\tconst newTags = [...tags];\r\n\t\t\t\t\tnewTags[editingIndex] = newValue;\r\n\t\t\t\t\tsetTags(newTags);\r\n\t\t\t\t\tsetEditingIndex(null);\r\n\t\t\t\t\t// Возвращаем фокус в input и устанавливаем фокус на отредактированный элемент\r\n\t\t\t\t\tsetTimeout(() => inputRef.current?.focus(), 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, [editingIndex, editingRef, tags, setEditingIndex, setTags, validateTagValue]);\r\n\r\n\t\t/**\r\n\t\t * Добавление нового тега\r\n\t\t */\r\n\t\tconst addNewTag = useCallback(\r\n\t\t\t(tagValue: string) => {\r\n\t\t\t\tconst trimmedTag = tagValue.trim();\r\n\t\t\t\tif (trimmedTag && validateTagValue(trimmedTag)) {\r\n\t\t\t\t\tsetTags([...tags, trimmedTag]);\r\n\t\t\t\t\tsetInputValue(\"\");\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t[tags, setTags, setInputValue, validateTagValue]\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Обработчик нажатия клавиш на input:\r\n\t\t * - Если нажат Enter и input не пустой, добавляет новый тег\r\n\t\t * - Если input пустой, обрабатывает навигацию по тегам\r\n\t\t */\r\n\t\tconst handleInputKeyDown = useCallback(\r\n\t\t\t(e: KeyboardEvent<HTMLInputElement>) => {\r\n\t\t\t\tif (e.key === \"Enter\" && inputValue.trim()) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\taddNewTag(inputValue);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (!inputValue.trim()) {\r\n\t\t\t\t\thandleTagsKeyDown(e);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t[inputValue, handleTagsKeyDown, addNewTag]\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Обработчик потери фокуса input - добавляет тег если он не пустой\r\n\t\t */\r\n\t\tconst handleInputBlur = useCallback(() => {\r\n\t\t\tif (inputValue.trim()) {\r\n\t\t\t\taddNewTag(inputValue);\r\n\t\t\t}\r\n\t\t}, [inputValue, addNewTag]);\r\n\r\n\t\tconst handleEditingKeyDown = useCallback(\r\n\t\t\t(e: KeyboardEvent<HTMLDivElement>) => {\r\n\t\t\t\tif (e.key === \"Enter\") {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tsaveEditing();\r\n\t\t\t\t} else if (e.key === \"Escape\") {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tcancelEditing();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t[saveEditing, cancelEditing]\r\n\t\t);\r\n\r\n\t\tconst renderTags = useCallback(() => {\r\n\t\t\treturn tags.map((tag, index) => {\r\n\t\t\t\tif (editingIndex === index) {\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<InputGroupContentEditable\r\n\t\t\t\t\t\t\tkey={`editing-${index}`}\r\n\t\t\t\t\t\t\tref={editingRef}\r\n\t\t\t\t\t\t\tclassName={editingDivStyles()}\r\n\t\t\t\t\t\t\tonKeyDown={handleEditingKeyDown}\r\n\t\t\t\t\t\t\tonBlur={cancelEditing}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (renderOption) {\r\n\t\t\t\t\tconst item = renderOption({\r\n\t\t\t\t\t\ttag,\r\n\t\t\t\t\t\tindex,\r\n\t\t\t\t\t\tonClose: () => removeTag(index),\r\n\t\t\t\t\t\tonEdit: () => startEditing(index),\r\n\t\t\t\t\t\tisFocused: !readonly && isFocused(index),\r\n\t\t\t\t\t\treadonly\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (item !== undefined) {\r\n\t\t\t\t\t\treturn item;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<SearchSelectTag\r\n\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\tonLabelClick={() => startEditing(index)}\r\n\t\t\t\t\t\tonClose={() => removeTag(index)}\r\n\t\t\t\t\t\treadonly={readonly}\r\n\t\t\t\t\t\tisFocused={!readonly && isFocused(index)}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{tag}\r\n\t\t\t\t\t</SearchSelectTag>\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}, [\r\n\t\t\teditingIndex,\r\n\t\t\teditingRef,\r\n\t\t\thandleEditingKeyDown,\r\n\t\t\tcancelEditing,\r\n\t\t\ttags,\r\n\t\t\treadonly,\r\n\t\t\tisFocused,\r\n\t\t\tremoveTag,\r\n\t\t\tstartEditing,\r\n\t\t\trenderOption\r\n\t\t]);\r\n\r\n\t\treturn (\r\n\t\t\t<InputGroup ref={ref} className={styles.base()}>\r\n\t\t\t\t{renderTags()}\r\n\t\t\t\t<InputGroupInput\r\n\t\t\t\t\tref={inputRef}\r\n\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\tvalue={inputValue}\r\n\t\t\t\t\tonChange={(e) => setInputValue(e.target.value)}\r\n\t\t\t\t\tonKeyDown={handleInputKeyDown}\r\n\t\t\t\t\tonBlur={handleInputBlur}\r\n\t\t\t\t\tplaceholder={readonly ? \"\" : placeholder}\r\n\t\t\t\t\tclassName={inputStyles()}\r\n\t\t\t\t\treadOnly={readonly}\r\n\t\t\t\t\taria-invalid={invalid}\r\n\t\t\t\t/>\r\n\t\t\t</InputGroup>\r\n\t\t);\r\n\t}\r\n);\r\n\r\nTagInput.displayName = \"TagInput\";\r\n"],"names":["tagInputStyles","tv","selectTriggerStyles","inputStyles","editingDivStyles","defaultValidateTag","tag","allTags","editingIndex","_","i","TagInput","React","value","defaultValue","onChange","placeholder","readonly","className","validateTag","invalid","renderOption","ref","inputValue","setInputValue","useState","inputRef","useRef","tags","setTags","useControllableState","styles","removeTag","useCallback","index","setEditingIndex","editingRef","validateTagValue","startEditing","range","selection","cancelEditing","onEnter","handleDeleteTag","handleTagsKeyDown","isFocused","useItemsKeyboardNavigation","saveEditing","newValue","newTags","addNewTag","tagValue","trimmedTag","handleInputKeyDown","e","handleInputBlur","handleEditingKeyDown","renderTags","jsx","InputGroupContentEditable","item","SearchSelectTag","InputGroup","InputGroupInput"],"mappings":"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"}
1
+ {"version":3,"file":"tag-input.js","sources":["../../src/components/tag-input/TagInput.tsx"],"sourcesContent":["import { SearchSelectTag } from \"@/components/search-select/components/SearchSelectTag\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useItemsKeyboardNavigation } from \"@/hooks/useItemsKeyboardNavigation\";\nimport React, { KeyboardEvent, useCallback, useRef, useState } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { InputGroup, InputGroupInput, InputGroupContentEditable } from \"../input\";\nimport { selectTriggerStyles } from \"../select/Select\";\n\nconst tagInputStyles = tv({\n\textend: selectTriggerStyles,\n\tbase: \"group/search-select-trigger flex h-auto min-h-10 flex-wrap items-center gap-1 !py-[0.3125rem] px-1.5 lg:h-auto lg:min-h-9 lg:px-1.5\"\n});\n\nconst inputStyles = tv({\n\tbase: \"min-w-28 rounded-none p-0 px-1.5 leading-6 read-only:w-0 read-only:min-w-0 lg:p-0 lg:px-1.5\"\n});\n\nconst editingDivStyles = tv({\n\tbase: \"p-0 px-1.5 outline-none lg:p-0 lg:px-1.5\"\n});\n\n/**\n * Пропсы для рендера тега\n */\nexport type RenderTagProps = {\n\t/** Значение тега (строка) */\n\ttag: string;\n\t/** Индекс тега в массиве */\n\tindex: number;\n\t/** Функция для удаления тега */\n\tonClose?: () => void;\n\t/** Функция для начала редактирования тега */\n\tonEdit?: () => void;\n\t/** Фокус на теге (для навигации с клавиатуры) */\n\tisFocused: boolean;\n\t/** Отключен ли компонент */\n\treadonly: boolean;\n};\n\n/**\n * Функция валидации тега по умолчанию\n */\nconst defaultValidateTag = (tag: string, allTags: string[], editingIndex?: number): boolean | string => {\n\tif (!tag.trim()) return \"Тег не может быть пустым\";\n\n\tif (editingIndex === undefined) {\n\t\t// Добавление нового тега\n\t\tif (allTags.includes(tag)) return \"Такой тег уже существует\";\n\t} else {\n\t\t// Редактирование существующего\n\t\tconst otherTags = allTags.filter((_, i) => i !== editingIndex);\n\t\tif (otherTags.includes(tag)) return \"Такой тег уже существует\";\n\t}\n\n\treturn true;\n};\n\nexport interface TagInputProps {\n\t/** Текущие выбранные опции (controlled режим) */\n\tvalue?: string[];\n\t/** Опции по умолчанию (uncontrolled режим) */\n\tdefaultValue?: string[];\n\t/** Callback при изменении выбранных опций */\n\tonChange?: (options: string[]) => void;\n\t/** Placeholder для input */\n\tplaceholder?: string;\n\t/** Отключить компонент */\n\treadonly?: boolean;\n\t/** CSS класс для контейнера */\n\tclassName?: string;\n\t/** Функция валидации тега. Если null - валидация отключена, если не передана - используется валидация по умолчанию */\n\tvalidateTag?: ((tag: string, allTags: string[], editingIndex?: number) => boolean | string) | null;\n\t/** Состояние ошибки */\n\tinvalid?: boolean;\n\t/** Кастомная функция рендера тега */\n\trenderOption?: (props: RenderTagProps) => React.ReactNode;\n}\n\n/**\n * Компонент для ввода и отображения тегов\n */\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tdefaultValue = [],\n\t\t\tonChange,\n\t\t\tplaceholder = \"Добавить тег...\",\n\t\t\treadonly = false,\n\t\t\tclassName,\n\t\t\tvalidateTag,\n\t\t\tinvalid,\n\t\t\trenderOption\n\t\t},\n\t\tref\n\t) => {\n\t\t// Состояние для ввода нового тега\n\t\tconst [inputValue, setInputValue] = useState(\"\");\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\t\t// Управление тегами\n\t\tconst [tags = [], setTags] = useControllableState<string[]>({ value, defaultValue, onChange });\n\n\t\tconst styles = tagInputStyles({ className, invalid });\n\t\tconst removeTag = useCallback(\n\t\t\t(index: number) => {\n\t\t\t\tif (readonly) return;\n\t\t\t\tsetTags(tags.filter((_, i) => i !== index));\n\t\t\t},\n\t\t\t[tags, setTags, readonly]\n\t\t);\n\n\t\t// Состояние для режима редактирования существующих тегов\n\t\tconst [editingIndex, setEditingIndex] = useState<number | null>(null);\n\t\tconst editingRef = useRef<HTMLDivElement>(null);\n\n\t\t/**\n\t\t * Функция валидации тега\n\t\t */\n\t\tconst validateTagValue = useCallback(\n\t\t\t(tag: string, editingIndex?: number): boolean => {\n\t\t\t\tif (validateTag === null) return true;\n\n\t\t\t\tconst validator = validateTag || defaultValidateTag;\n\t\t\t\tconst result = validator(tag, tags, editingIndex);\n\n\t\t\t\treturn result === true;\n\t\t\t},\n\t\t\t[validateTag, tags]\n\t\t);\n\n\t\t/**\n\t\t * Переключение в режим редактирования существующего тега\n\t\t */\n\t\tconst startEditing = useCallback(\n\t\t\t(index: number) => {\n\t\t\t\tif (readonly) return;\n\t\t\t\tsetEditingIndex(index);\n\t\t\t\t// Фокусируем элемент после обновления состояния\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (editingRef.current) {\n\t\t\t\t\t\t// Устанавливаем содержимое напрямую, без использования React state\n\t\t\t\t\t\teditingRef.current.textContent = tags[index];\n\t\t\t\t\t\teditingRef.current.focus();\n\t\t\t\t\t\t// Выделяем весь текст\n\t\t\t\t\t\tconst range = document.createRange();\n\t\t\t\t\t\trange.selectNodeContents(editingRef.current);\n\t\t\t\t\t\tconst selection = window.getSelection();\n\t\t\t\t\t\tselection?.removeAllRanges();\n\t\t\t\t\t\tselection?.addRange(range);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t},\n\t\t\t[tags, setEditingIndex, readonly]\n\t\t);\n\n\t\t/**\n\t\t * Отмена редактирования тега\n\t\t */\n\t\tconst cancelEditing = useCallback(() => {\n\t\t\tsetEditingIndex(null);\n\t\t\tsetTimeout(() => inputRef.current?.focus(), 0);\n\t\t}, [setEditingIndex]);\n\n\t\t/**\n\t\t * Обработчик нажатия Enter на теге: переключает текущий тег в режим редактирования\n\t\t */\n\t\tconst onEnter = useCallback((_: string, index: number) => startEditing(index), [startEditing]);\n\n\t\tconst handleDeleteTag = useCallback((_: string, index: number) => removeTag(index), [removeTag]);\n\n\t\t/**\n\t\t * Хук для навигации по тегам с помощью клавиатуры (вперед/назад)\n\t\t */\n\t\tconst { handleKeyDown: handleTagsKeyDown, isFocused } = useItemsKeyboardNavigation({\n\t\t\titems: tags,\n\t\t\tonEnter,\n\t\t\tonDelete: handleDeleteTag,\n\t\t\tcycleNavigation: true\n\t\t});\n\n\t\t/**\n\t\t * Сохранение изменений в текущем теге\n\t\t */\n\t\tconst saveEditing = useCallback(() => {\n\t\t\tif (editingIndex !== null && editingRef.current) {\n\t\t\t\tconst newValue = editingRef.current.textContent?.trim() || \"\";\n\n\t\t\t\tif (newValue && validateTagValue(newValue, editingIndex)) {\n\t\t\t\t\tconst newTags = [...tags];\n\t\t\t\t\tnewTags[editingIndex] = newValue;\n\t\t\t\t\tsetTags(newTags);\n\t\t\t\t\tsetEditingIndex(null);\n\t\t\t\t\t// Возвращаем фокус в input и устанавливаем фокус на отредактированный элемент\n\t\t\t\t\tsetTimeout(() => inputRef.current?.focus(), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}, [editingIndex, editingRef, tags, setEditingIndex, setTags, validateTagValue]);\n\n\t\t/**\n\t\t * Добавление нового тега\n\t\t */\n\t\tconst addNewTag = useCallback(\n\t\t\t(tagValue: string) => {\n\t\t\t\tconst trimmedTag = tagValue.trim();\n\t\t\t\tif (trimmedTag && validateTagValue(trimmedTag)) {\n\t\t\t\t\tsetTags([...tags, trimmedTag]);\n\t\t\t\t\tsetInputValue(\"\");\n\t\t\t\t}\n\t\t\t},\n\t\t\t[tags, setTags, setInputValue, validateTagValue]\n\t\t);\n\n\t\t/**\n\t\t * Обработчик нажатия клавиш на input:\n\t\t * - Если нажат Enter и input не пустой, добавляет новый тег\n\t\t * - Если input пустой, обрабатывает навигацию по тегам\n\t\t */\n\t\tconst handleInputKeyDown = useCallback(\n\t\t\t(e: KeyboardEvent<HTMLInputElement>) => {\n\t\t\t\tif (e.key === \"Enter\" && inputValue.trim()) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\taddNewTag(inputValue);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!inputValue.trim()) {\n\t\t\t\t\thandleTagsKeyDown(e);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[inputValue, handleTagsKeyDown, addNewTag]\n\t\t);\n\n\t\t/**\n\t\t * Обработчик потери фокуса input - добавляет тег если он не пустой\n\t\t */\n\t\tconst handleInputBlur = useCallback(() => {\n\t\t\tif (inputValue.trim()) {\n\t\t\t\taddNewTag(inputValue);\n\t\t\t}\n\t\t}, [inputValue, addNewTag]);\n\n\t\tconst handleEditingKeyDown = useCallback(\n\t\t\t(e: KeyboardEvent<HTMLDivElement>) => {\n\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsaveEditing();\n\t\t\t\t} else if (e.key === \"Escape\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tcancelEditing();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[saveEditing, cancelEditing]\n\t\t);\n\n\t\tconst renderTags = useCallback(() => {\n\t\t\treturn tags.map((tag, index) => {\n\t\t\t\tif (editingIndex === index) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<InputGroupContentEditable\n\t\t\t\t\t\t\tkey={`editing-${index}`}\n\t\t\t\t\t\t\tref={editingRef}\n\t\t\t\t\t\t\tclassName={editingDivStyles()}\n\t\t\t\t\t\t\tonKeyDown={handleEditingKeyDown}\n\t\t\t\t\t\t\tonBlur={cancelEditing}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (renderOption) {\n\t\t\t\t\tconst item = renderOption({\n\t\t\t\t\t\ttag,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tonClose: () => removeTag(index),\n\t\t\t\t\t\tonEdit: () => startEditing(index),\n\t\t\t\t\t\tisFocused: !readonly && isFocused(index),\n\t\t\t\t\t\treadonly\n\t\t\t\t\t});\n\t\t\t\t\tif (item !== undefined) {\n\t\t\t\t\t\treturn item;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<SearchSelectTag\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tonLabelClick={() => startEditing(index)}\n\t\t\t\t\t\tonClose={() => removeTag(index)}\n\t\t\t\t\t\treadonly={readonly}\n\t\t\t\t\t\tisFocused={!readonly && isFocused(index)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t</SearchSelectTag>\n\t\t\t\t);\n\t\t\t});\n\t\t}, [\n\t\t\teditingIndex,\n\t\t\teditingRef,\n\t\t\thandleEditingKeyDown,\n\t\t\tcancelEditing,\n\t\t\ttags,\n\t\t\treadonly,\n\t\t\tisFocused,\n\t\t\tremoveTag,\n\t\t\tstartEditing,\n\t\t\trenderOption\n\t\t]);\n\n\t\treturn (\n\t\t\t<InputGroup ref={ref} className={styles.base()}>\n\t\t\t\t{renderTags()}\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\tonChange={(e) => setInputValue(e.target.value)}\n\t\t\t\t\tonKeyDown={handleInputKeyDown}\n\t\t\t\t\tonBlur={handleInputBlur}\n\t\t\t\t\tplaceholder={readonly ? \"\" : placeholder}\n\t\t\t\t\tclassName={inputStyles()}\n\t\t\t\t\treadOnly={readonly}\n\t\t\t\t\taria-invalid={invalid}\n\t\t\t\t/>\n\t\t\t</InputGroup>\n\t\t);\n\t}\n);\n\nTagInput.displayName = \"TagInput\";\n"],"names":["tagInputStyles","tv","selectTriggerStyles","inputStyles","editingDivStyles","defaultValidateTag","tag","allTags","editingIndex","_","i","TagInput","React","value","defaultValue","onChange","placeholder","readonly","className","validateTag","invalid","renderOption","ref","inputValue","setInputValue","useState","inputRef","useRef","tags","setTags","useControllableState","styles","removeTag","useCallback","index","setEditingIndex","editingRef","validateTagValue","startEditing","range","selection","cancelEditing","onEnter","handleDeleteTag","handleTagsKeyDown","isFocused","useItemsKeyboardNavigation","saveEditing","newValue","newTags","addNewTag","tagValue","trimmedTag","handleInputKeyDown","e","handleInputBlur","handleEditingKeyDown","renderTags","jsx","InputGroupContentEditable","item","SearchSelectTag","InputGroup","InputGroupInput"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { e as T, T as e, a as g, b as r, c as o, d as p } from "../Tag-DJuVSJh5.js";
1
+ import { e as T, T as e, a as g, b as r, c as o, d as p } from "../Tag-CofZF1d0.js";
2
2
  export {
3
3
  T as Tag,
4
4
  e as TagBase,
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.js","sources":["../../src/components/textarea/textarea/Textarea.tsx","../../node_modules/.pnpm/@babel+runtime@7.27.0/node_modules/@babel/runtime/helpers/esm/extends.js","../../node_modules/.pnpm/@babel+runtime@7.27.0/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../node_modules/.pnpm/use-isomorphic-layout-effec_0eaf1275c42a90a284bd73abb469f932/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js","../../node_modules/.pnpm/use-latest@1.3.0_@types+react@18.3.20_react@18.3.1/node_modules/use-latest/dist/use-latest.esm.js","../../node_modules/.pnpm/use-composed-ref@1.4.0_@types+react@18.3.20_react@18.3.1/node_modules/use-composed-ref/dist/use-composed-ref.esm.js","../../node_modules/.pnpm/react-textarea-autosize@8.5_234058ab51b636a76d02be9312558ea5/node_modules/react-textarea-autosize/dist/react-textarea-autosize.browser.esm.js","../../src/components/textarea/autogrow-textarea/AutogrowTextarea.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\r\nimport { tv } from \"tailwind-variants\";\r\nimport { useMergeRefs } from \"../../../hooks/useMergeRefs\";\r\nimport { useCustomValidity } from \"../../../hooks/useCustomValidity\";\r\nimport { inputBaseControlStyles } from \"../../input/styles/inputBaseStyles\";\r\nimport { VariantsConfig } from \"@/lib/utils/variants\";\r\n\r\nexport interface TextareaVariants {\r\n\tresize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\r\n}\r\n\r\nconst textareaStyles = tv({\r\n\textend: inputBaseControlStyles,\r\n\tbase: \"min-h-14\",\r\n\tvariants: {\r\n\t\tresize: {\r\n\t\t\tnone: \"resize-none\",\r\n\t\t\tvertical: \"resize-y\",\r\n\t\t\thorizontal: \"resize-x\",\r\n\t\t\tboth: \"resize\"\r\n\t\t}\r\n\t} satisfies VariantsConfig<TextareaVariants>,\r\n\tdefaultVariants: {\r\n\t\tresize: \"vertical\"\r\n\t}\r\n});\r\n\r\nexport type TextareaProps = React.ComponentProps<\"textarea\"> &\r\n\tTextareaVariants & {\r\n\t\t/** Текст сообщения об ошибке. При наличии делает поле невалидным */\r\n\t\terror?: string;\r\n\t};\r\n\r\n/**\r\n * Стилизованный компонент textarea для многострочного ввода текста.\r\n * Поддерживает все стандартные свойства textarea элемента.\r\n */\r\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n\t({ className, error, resize, ...other }, ref) => {\r\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\r\n\t\tconst mergedRef = useMergeRefs(textareaRef, ref);\r\n\r\n\t\tuseCustomValidity(textareaRef, error);\r\n\r\n\t\treturn (\r\n\t\t\t<textarea\r\n\t\t\t\tclassName={textareaStyles({ resize, className })}\r\n\t\t\t\tref={mergedRef}\r\n\t\t\t\taria-invalid={!!error}\r\n\t\t\t\t{...other}\r\n\t\t\t/>\r\n\t\t);\r\n\t}\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport default Textarea;\r\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import { useLayoutEffect } from 'react';\n\nvar index = useLayoutEffect ;\n\nexport { index as default };\n","import React from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\n\nvar useLatest = function useLatest(value) {\n var ref = React.useRef(value);\n useIsomorphicLayoutEffect(function () {\n ref.current = value;\n });\n return ref;\n};\n\nexport { useLatest as default };\n","import React from 'react';\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\n\nvar updateRef = function updateRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n return;\n }\n ref.current = value;\n};\nvar useComposedRef = function useComposedRef(libRef, userRef) {\n var prevUserRef = React.useRef();\n return React.useCallback(function (instance) {\n libRef.current = instance;\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null);\n }\n prevUserRef.current = userRef;\n if (!userRef) {\n return;\n }\n updateRef(userRef, instance);\n }, [userRef]);\n};\n\nexport { useComposedRef as default };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport * as React from 'react';\nimport useLatest from 'use-latest';\nimport useComposedRef from 'use-composed-ref';\n\nvar HIDDEN_TEXTAREA_STYLE = {\n 'min-height': '0',\n 'max-height': 'none',\n height: '0',\n visibility: 'hidden',\n overflow: 'hidden',\n position: 'absolute',\n 'z-index': '-1000',\n top: '0',\n right: '0',\n display: 'block'\n};\nvar forceHiddenStyles = function forceHiddenStyles(node) {\n Object.keys(HIDDEN_TEXTAREA_STYLE).forEach(function (key) {\n node.style.setProperty(key, HIDDEN_TEXTAREA_STYLE[key], 'important');\n });\n};\nvar forceHiddenStyles$1 = forceHiddenStyles;\n\nvar hiddenTextarea = null;\nvar getHeight = function getHeight(node, sizingData) {\n var height = node.scrollHeight;\n if (sizingData.sizingStyle.boxSizing === 'border-box') {\n // border-box: add border, since height = content + padding + border\n return height + sizingData.borderSize;\n }\n\n // remove padding, since height = content\n return height - sizingData.paddingSize;\n};\nfunction calculateNodeHeight(sizingData, value, minRows, maxRows) {\n if (minRows === void 0) {\n minRows = 1;\n }\n if (maxRows === void 0) {\n maxRows = Infinity;\n }\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n hiddenTextarea.setAttribute('tabindex', '-1');\n hiddenTextarea.setAttribute('aria-hidden', 'true');\n forceHiddenStyles$1(hiddenTextarea);\n }\n if (hiddenTextarea.parentNode === null) {\n document.body.appendChild(hiddenTextarea);\n }\n var paddingSize = sizingData.paddingSize,\n borderSize = sizingData.borderSize,\n sizingStyle = sizingData.sizingStyle;\n var boxSizing = sizingStyle.boxSizing;\n Object.keys(sizingStyle).forEach(function (_key) {\n var key = _key;\n hiddenTextarea.style[key] = sizingStyle[key];\n });\n forceHiddenStyles$1(hiddenTextarea);\n hiddenTextarea.value = value;\n var height = getHeight(hiddenTextarea, sizingData);\n // Double set and calc due to Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1795904\n hiddenTextarea.value = value;\n height = getHeight(hiddenTextarea, sizingData);\n\n // measure height of a textarea with a single row\n hiddenTextarea.value = 'x';\n var rowHeight = hiddenTextarea.scrollHeight - paddingSize;\n var minHeight = rowHeight * minRows;\n if (boxSizing === 'border-box') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n var maxHeight = rowHeight * maxRows;\n if (boxSizing === 'border-box') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n return [height, rowHeight];\n}\n\nvar noop = function noop() {};\nvar pick = function pick(props, obj) {\n return props.reduce(function (acc, prop) {\n acc[prop] = obj[prop];\n return acc;\n }, {});\n};\n\nvar SIZING_STYLE = ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'boxSizing', 'fontFamily', 'fontSize', 'fontStyle', 'fontWeight', 'letterSpacing', 'lineHeight', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop',\n// non-standard\n'tabSize', 'textIndent',\n// non-standard\n'textRendering', 'textTransform', 'width', 'wordBreak', 'wordSpacing', 'scrollbarGutter'];\nvar isIE = !!document.documentElement.currentStyle ;\nvar getSizingData = function getSizingData(node) {\n var style = window.getComputedStyle(node);\n if (style === null) {\n return null;\n }\n var sizingStyle = pick(SIZING_STYLE, style);\n var boxSizing = sizingStyle.boxSizing;\n\n // probably node is detached from DOM, can't read computed dimensions\n if (boxSizing === '') {\n return null;\n }\n\n // IE (Edge has already correct behaviour) returns content width as computed width\n // so we need to add manually padding and border widths\n if (isIE && boxSizing === 'border-box') {\n sizingStyle.width = parseFloat(sizingStyle.width) + parseFloat(sizingStyle.borderRightWidth) + parseFloat(sizingStyle.borderLeftWidth) + parseFloat(sizingStyle.paddingRight) + parseFloat(sizingStyle.paddingLeft) + 'px';\n }\n var paddingSize = parseFloat(sizingStyle.paddingBottom) + parseFloat(sizingStyle.paddingTop);\n var borderSize = parseFloat(sizingStyle.borderBottomWidth) + parseFloat(sizingStyle.borderTopWidth);\n return {\n sizingStyle: sizingStyle,\n paddingSize: paddingSize,\n borderSize: borderSize\n };\n};\nvar getSizingData$1 = getSizingData;\n\nfunction useListener(target, type, listener) {\n var latestListener = useLatest(listener);\n React.useLayoutEffect(function () {\n var handler = function handler(ev) {\n return latestListener.current(ev);\n };\n // might happen if document.fonts is not defined, for instance\n if (!target) {\n return;\n }\n target.addEventListener(type, handler);\n return function () {\n return target.removeEventListener(type, handler);\n };\n }, []);\n}\nvar useFormResetListener = function useFormResetListener(libRef, listener) {\n useListener(document.body, 'reset', function (ev) {\n if (libRef.current.form === ev.target) {\n listener(ev);\n }\n });\n};\nvar useWindowResizeListener = function useWindowResizeListener(listener) {\n useListener(window, 'resize', listener);\n};\nvar useFontsLoadedListener = function useFontsLoadedListener(listener) {\n useListener(document.fonts, 'loadingdone', listener);\n};\n\nvar _excluded = [\"cacheMeasurements\", \"maxRows\", \"minRows\", \"onChange\", \"onHeightChange\"];\nvar TextareaAutosize = function TextareaAutosize(_ref, userRef) {\n var cacheMeasurements = _ref.cacheMeasurements,\n maxRows = _ref.maxRows,\n minRows = _ref.minRows,\n _ref$onChange = _ref.onChange,\n onChange = _ref$onChange === void 0 ? noop : _ref$onChange,\n _ref$onHeightChange = _ref.onHeightChange,\n onHeightChange = _ref$onHeightChange === void 0 ? noop : _ref$onHeightChange,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n var isControlled = props.value !== undefined;\n var libRef = React.useRef(null);\n var ref = useComposedRef(libRef, userRef);\n var heightRef = React.useRef(0);\n var measurementsCacheRef = React.useRef();\n var resizeTextarea = function resizeTextarea() {\n var node = libRef.current;\n var nodeSizingData = cacheMeasurements && measurementsCacheRef.current ? measurementsCacheRef.current : getSizingData$1(node);\n if (!nodeSizingData) {\n return;\n }\n measurementsCacheRef.current = nodeSizingData;\n var _calculateNodeHeight = calculateNodeHeight(nodeSizingData, node.value || node.placeholder || 'x', minRows, maxRows),\n height = _calculateNodeHeight[0],\n rowHeight = _calculateNodeHeight[1];\n if (heightRef.current !== height) {\n heightRef.current = height;\n node.style.setProperty('height', height + \"px\", 'important');\n onHeightChange(height, {\n rowHeight: rowHeight\n });\n }\n };\n var handleChange = function handleChange(event) {\n if (!isControlled) {\n resizeTextarea();\n }\n onChange(event);\n };\n {\n React.useLayoutEffect(resizeTextarea);\n useFormResetListener(libRef, function () {\n if (!isControlled) {\n var currentValue = libRef.current.value;\n requestAnimationFrame(function () {\n var node = libRef.current;\n if (node && currentValue !== node.value) {\n resizeTextarea();\n }\n });\n }\n });\n useWindowResizeListener(resizeTextarea);\n useFontsLoadedListener(resizeTextarea);\n return /*#__PURE__*/React.createElement(\"textarea\", _extends({}, props, {\n onChange: handleChange,\n ref: ref\n }));\n }\n};\nvar index = /* #__PURE__ */React.forwardRef(TextareaAutosize);\n\nexport { index as default };\n","import React, { useRef } from \"react\";\r\nimport TextareaAutosize from \"react-textarea-autosize\";\r\nimport { tv } from \"tailwind-variants\";\r\nimport { useMergeRefs } from \"../../../hooks/useMergeRefs\";\r\nimport { useCustomValidity } from \"../../../hooks/useCustomValidity\";\r\nimport { inputBaseControlStyles } from \"../../input/styles/inputBaseStyles\";\r\n\r\nconst autogrowTextareaStyles = tv({\r\n\textend: inputBaseControlStyles,\r\n\tbase: \"resize-none\"\r\n});\r\n\r\nexport type AutogrowTextareaProps = React.ComponentProps<typeof TextareaAutosize> & {\r\n\t/** Текст сообщения об ошибке. При наличии делает поле невалидным */\r\n\terror?: string;\r\n};\r\n\r\n/**\r\n * Стилизованный компонент textarea с автоматическим увеличением высоты.\r\n * Использует библиотеку react-textarea-autosize для надежной работы с min-height и max-height.\r\n */\r\nexport const AutogrowTextarea = React.forwardRef<HTMLTextAreaElement, AutogrowTextareaProps>(\r\n\t({ className, minRows = 2, error, ...other }, ref) => {\r\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\r\n\t\tconst mergedRef = useMergeRefs(textareaRef, ref);\r\n\r\n\t\tuseCustomValidity(textareaRef, error);\r\n\r\n\t\tconst sharedProps = {\r\n\t\t\tclassName: autogrowTextareaStyles({ className }),\r\n\t\t\tref: mergedRef,\r\n\t\t\t\"aria-invalid\": !!error as boolean,\r\n\t\t\tminRows,\r\n\t\t\t...other\r\n\t\t};\r\n\r\n\t\t// SSR: document недоступен — рендерим обычный textarea\r\n\t\tif (typeof document === \"undefined\") {\r\n\t\t\treturn <textarea {...sharedProps} rows={minRows} />;\r\n\t\t}\r\n\r\n\t\treturn <TextareaAutosize {...sharedProps} />;\r\n\t}\r\n);\r\n\r\nAutogrowTextarea.displayName = \"AutogrowTextarea\";\r\n\r\nexport default AutogrowTextarea;\r\n"],"names":["textareaStyles","tv","inputBaseControlStyles","Textarea","React","className","error","resize","other","ref","textareaRef","useRef","mergedRef","useMergeRefs","useCustomValidity","jsx","_extends","t","r","_objectWithoutPropertiesLoose","n","index","useLayoutEffect","useLatest","value","useIsomorphicLayoutEffect","updateRef","useComposedRef","libRef","userRef","prevUserRef","instance","HIDDEN_TEXTAREA_STYLE","forceHiddenStyles","node","key","forceHiddenStyles$1","hiddenTextarea","getHeight","sizingData","height","calculateNodeHeight","minRows","maxRows","paddingSize","borderSize","sizingStyle","boxSizing","_key","rowHeight","minHeight","maxHeight","noop","pick","props","obj","acc","prop","SIZING_STYLE","isIE","getSizingData","style","getSizingData$1","useListener","target","type","listener","latestListener","handler","ev","useFormResetListener","useWindowResizeListener","useFontsLoadedListener","_excluded","TextareaAutosize","_ref","cacheMeasurements","_ref$onChange","onChange","_ref$onHeightChange","onHeightChange","isControlled","heightRef","measurementsCacheRef","resizeTextarea","nodeSizingData","_calculateNodeHeight","handleChange","event","currentValue","autogrowTextareaStyles","AutogrowTextarea","sharedProps"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6]}
1
+ {"version":3,"file":"textarea.js","sources":["../../src/components/textarea/textarea/Textarea.tsx","../../node_modules/.pnpm/@babel+runtime@7.27.0/node_modules/@babel/runtime/helpers/esm/extends.js","../../node_modules/.pnpm/@babel+runtime@7.27.0/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types+react@18.3.20_react@18.3.1/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js","../../node_modules/.pnpm/use-latest@1.3.0_@types+react@18.3.20_react@18.3.1/node_modules/use-latest/dist/use-latest.esm.js","../../node_modules/.pnpm/use-composed-ref@1.4.0_@types+react@18.3.20_react@18.3.1/node_modules/use-composed-ref/dist/use-composed-ref.esm.js","../../node_modules/.pnpm/react-textarea-autosize@8.5.9_@types+react@18.3.20_react@18.3.1/node_modules/react-textarea-autosize/dist/react-textarea-autosize.browser.esm.js","../../src/components/textarea/autogrow-textarea/AutogrowTextarea.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { useMergeRefs } from \"../../../hooks/useMergeRefs\";\nimport { useCustomValidity } from \"../../../hooks/useCustomValidity\";\nimport { inputBaseControlStyles } from \"../../input/styles/inputBaseStyles\";\nimport { VariantsConfig } from \"@/lib/utils/variants\";\n\nexport interface TextareaVariants {\n\tresize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n}\n\nconst textareaStyles = tv({\n\textend: inputBaseControlStyles,\n\tbase: \"min-h-14\",\n\tvariants: {\n\t\tresize: {\n\t\t\tnone: \"resize-none\",\n\t\t\tvertical: \"resize-y\",\n\t\t\thorizontal: \"resize-x\",\n\t\t\tboth: \"resize\"\n\t\t}\n\t} satisfies VariantsConfig<TextareaVariants>,\n\tdefaultVariants: {\n\t\tresize: \"vertical\"\n\t}\n});\n\nexport type TextareaProps = React.ComponentProps<\"textarea\"> &\n\tTextareaVariants & {\n\t\t/** Текст сообщения об ошибке. При наличии делает поле невалидным */\n\t\terror?: string;\n\t};\n\n/**\n * Стилизованный компонент textarea для многострочного ввода текста.\n * Поддерживает все стандартные свойства textarea элемента.\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n\t({ className, error, resize, ...other }, ref) => {\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst mergedRef = useMergeRefs(textareaRef, ref);\n\n\t\tuseCustomValidity(textareaRef, error);\n\n\t\treturn (\n\t\t\t<textarea\n\t\t\t\tclassName={textareaStyles({ resize, className })}\n\t\t\t\tref={mergedRef}\n\t\t\t\taria-invalid={!!error}\n\t\t\t\t{...other}\n\t\t\t/>\n\t\t);\n\t}\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import { useLayoutEffect } from 'react';\n\nvar index = useLayoutEffect ;\n\nexport { index as default };\n","import React from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\n\nvar useLatest = function useLatest(value) {\n var ref = React.useRef(value);\n useIsomorphicLayoutEffect(function () {\n ref.current = value;\n });\n return ref;\n};\n\nexport { useLatest as default };\n","import React from 'react';\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\n\nvar updateRef = function updateRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n return;\n }\n ref.current = value;\n};\nvar useComposedRef = function useComposedRef(libRef, userRef) {\n var prevUserRef = React.useRef();\n return React.useCallback(function (instance) {\n libRef.current = instance;\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null);\n }\n prevUserRef.current = userRef;\n if (!userRef) {\n return;\n }\n updateRef(userRef, instance);\n }, [userRef]);\n};\n\nexport { useComposedRef as default };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport * as React from 'react';\nimport useLatest from 'use-latest';\nimport useComposedRef from 'use-composed-ref';\n\nvar HIDDEN_TEXTAREA_STYLE = {\n 'min-height': '0',\n 'max-height': 'none',\n height: '0',\n visibility: 'hidden',\n overflow: 'hidden',\n position: 'absolute',\n 'z-index': '-1000',\n top: '0',\n right: '0',\n display: 'block'\n};\nvar forceHiddenStyles = function forceHiddenStyles(node) {\n Object.keys(HIDDEN_TEXTAREA_STYLE).forEach(function (key) {\n node.style.setProperty(key, HIDDEN_TEXTAREA_STYLE[key], 'important');\n });\n};\nvar forceHiddenStyles$1 = forceHiddenStyles;\n\nvar hiddenTextarea = null;\nvar getHeight = function getHeight(node, sizingData) {\n var height = node.scrollHeight;\n if (sizingData.sizingStyle.boxSizing === 'border-box') {\n // border-box: add border, since height = content + padding + border\n return height + sizingData.borderSize;\n }\n\n // remove padding, since height = content\n return height - sizingData.paddingSize;\n};\nfunction calculateNodeHeight(sizingData, value, minRows, maxRows) {\n if (minRows === void 0) {\n minRows = 1;\n }\n if (maxRows === void 0) {\n maxRows = Infinity;\n }\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n hiddenTextarea.setAttribute('tabindex', '-1');\n hiddenTextarea.setAttribute('aria-hidden', 'true');\n forceHiddenStyles$1(hiddenTextarea);\n }\n if (hiddenTextarea.parentNode === null) {\n document.body.appendChild(hiddenTextarea);\n }\n var paddingSize = sizingData.paddingSize,\n borderSize = sizingData.borderSize,\n sizingStyle = sizingData.sizingStyle;\n var boxSizing = sizingStyle.boxSizing;\n Object.keys(sizingStyle).forEach(function (_key) {\n var key = _key;\n hiddenTextarea.style[key] = sizingStyle[key];\n });\n forceHiddenStyles$1(hiddenTextarea);\n hiddenTextarea.value = value;\n var height = getHeight(hiddenTextarea, sizingData);\n // Double set and calc due to Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1795904\n hiddenTextarea.value = value;\n height = getHeight(hiddenTextarea, sizingData);\n\n // measure height of a textarea with a single row\n hiddenTextarea.value = 'x';\n var rowHeight = hiddenTextarea.scrollHeight - paddingSize;\n var minHeight = rowHeight * minRows;\n if (boxSizing === 'border-box') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n var maxHeight = rowHeight * maxRows;\n if (boxSizing === 'border-box') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n return [height, rowHeight];\n}\n\nvar noop = function noop() {};\nvar pick = function pick(props, obj) {\n return props.reduce(function (acc, prop) {\n acc[prop] = obj[prop];\n return acc;\n }, {});\n};\n\nvar SIZING_STYLE = ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'boxSizing', 'fontFamily', 'fontSize', 'fontStyle', 'fontWeight', 'letterSpacing', 'lineHeight', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop',\n// non-standard\n'tabSize', 'textIndent',\n// non-standard\n'textRendering', 'textTransform', 'width', 'wordBreak', 'wordSpacing', 'scrollbarGutter'];\nvar isIE = !!document.documentElement.currentStyle ;\nvar getSizingData = function getSizingData(node) {\n var style = window.getComputedStyle(node);\n if (style === null) {\n return null;\n }\n var sizingStyle = pick(SIZING_STYLE, style);\n var boxSizing = sizingStyle.boxSizing;\n\n // probably node is detached from DOM, can't read computed dimensions\n if (boxSizing === '') {\n return null;\n }\n\n // IE (Edge has already correct behaviour) returns content width as computed width\n // so we need to add manually padding and border widths\n if (isIE && boxSizing === 'border-box') {\n sizingStyle.width = parseFloat(sizingStyle.width) + parseFloat(sizingStyle.borderRightWidth) + parseFloat(sizingStyle.borderLeftWidth) + parseFloat(sizingStyle.paddingRight) + parseFloat(sizingStyle.paddingLeft) + 'px';\n }\n var paddingSize = parseFloat(sizingStyle.paddingBottom) + parseFloat(sizingStyle.paddingTop);\n var borderSize = parseFloat(sizingStyle.borderBottomWidth) + parseFloat(sizingStyle.borderTopWidth);\n return {\n sizingStyle: sizingStyle,\n paddingSize: paddingSize,\n borderSize: borderSize\n };\n};\nvar getSizingData$1 = getSizingData;\n\nfunction useListener(target, type, listener) {\n var latestListener = useLatest(listener);\n React.useLayoutEffect(function () {\n var handler = function handler(ev) {\n return latestListener.current(ev);\n };\n // might happen if document.fonts is not defined, for instance\n if (!target) {\n return;\n }\n target.addEventListener(type, handler);\n return function () {\n return target.removeEventListener(type, handler);\n };\n }, []);\n}\nvar useFormResetListener = function useFormResetListener(libRef, listener) {\n useListener(document.body, 'reset', function (ev) {\n if (libRef.current.form === ev.target) {\n listener(ev);\n }\n });\n};\nvar useWindowResizeListener = function useWindowResizeListener(listener) {\n useListener(window, 'resize', listener);\n};\nvar useFontsLoadedListener = function useFontsLoadedListener(listener) {\n useListener(document.fonts, 'loadingdone', listener);\n};\n\nvar _excluded = [\"cacheMeasurements\", \"maxRows\", \"minRows\", \"onChange\", \"onHeightChange\"];\nvar TextareaAutosize = function TextareaAutosize(_ref, userRef) {\n var cacheMeasurements = _ref.cacheMeasurements,\n maxRows = _ref.maxRows,\n minRows = _ref.minRows,\n _ref$onChange = _ref.onChange,\n onChange = _ref$onChange === void 0 ? noop : _ref$onChange,\n _ref$onHeightChange = _ref.onHeightChange,\n onHeightChange = _ref$onHeightChange === void 0 ? noop : _ref$onHeightChange,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n var isControlled = props.value !== undefined;\n var libRef = React.useRef(null);\n var ref = useComposedRef(libRef, userRef);\n var heightRef = React.useRef(0);\n var measurementsCacheRef = React.useRef();\n var resizeTextarea = function resizeTextarea() {\n var node = libRef.current;\n var nodeSizingData = cacheMeasurements && measurementsCacheRef.current ? measurementsCacheRef.current : getSizingData$1(node);\n if (!nodeSizingData) {\n return;\n }\n measurementsCacheRef.current = nodeSizingData;\n var _calculateNodeHeight = calculateNodeHeight(nodeSizingData, node.value || node.placeholder || 'x', minRows, maxRows),\n height = _calculateNodeHeight[0],\n rowHeight = _calculateNodeHeight[1];\n if (heightRef.current !== height) {\n heightRef.current = height;\n node.style.setProperty('height', height + \"px\", 'important');\n onHeightChange(height, {\n rowHeight: rowHeight\n });\n }\n };\n var handleChange = function handleChange(event) {\n if (!isControlled) {\n resizeTextarea();\n }\n onChange(event);\n };\n {\n React.useLayoutEffect(resizeTextarea);\n useFormResetListener(libRef, function () {\n if (!isControlled) {\n var currentValue = libRef.current.value;\n requestAnimationFrame(function () {\n var node = libRef.current;\n if (node && currentValue !== node.value) {\n resizeTextarea();\n }\n });\n }\n });\n useWindowResizeListener(resizeTextarea);\n useFontsLoadedListener(resizeTextarea);\n return /*#__PURE__*/React.createElement(\"textarea\", _extends({}, props, {\n onChange: handleChange,\n ref: ref\n }));\n }\n};\nvar index = /* #__PURE__ */React.forwardRef(TextareaAutosize);\n\nexport { index as default };\n","import React, { useRef } from \"react\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport { tv } from \"tailwind-variants\";\nimport { useMergeRefs } from \"../../../hooks/useMergeRefs\";\nimport { useCustomValidity } from \"../../../hooks/useCustomValidity\";\nimport { inputBaseControlStyles } from \"../../input/styles/inputBaseStyles\";\n\nconst autogrowTextareaStyles = tv({\n\textend: inputBaseControlStyles,\n\tbase: \"resize-none\"\n});\n\nexport type AutogrowTextareaProps = React.ComponentProps<typeof TextareaAutosize> & {\n\t/** Текст сообщения об ошибке. При наличии делает поле невалидным */\n\terror?: string;\n};\n\n/**\n * Стилизованный компонент textarea с автоматическим увеличением высоты.\n * Использует библиотеку react-textarea-autosize для надежной работы с min-height и max-height.\n */\nexport const AutogrowTextarea = React.forwardRef<HTMLTextAreaElement, AutogrowTextareaProps>(\n\t({ className, minRows = 2, error, ...other }, ref) => {\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst mergedRef = useMergeRefs(textareaRef, ref);\n\n\t\tuseCustomValidity(textareaRef, error);\n\n\t\tconst sharedProps = {\n\t\t\tclassName: autogrowTextareaStyles({ className }),\n\t\t\tref: mergedRef,\n\t\t\t\"aria-invalid\": !!error as boolean,\n\t\t\tminRows,\n\t\t\t...other\n\t\t};\n\n\t\t// SSR: document недоступен — рендерим обычный textarea\n\t\tif (typeof document === \"undefined\") {\n\t\t\treturn <textarea {...sharedProps} rows={minRows} />;\n\t\t}\n\n\t\treturn <TextareaAutosize {...sharedProps} />;\n\t}\n);\n\nAutogrowTextarea.displayName = \"AutogrowTextarea\";\n\nexport default AutogrowTextarea;\n"],"names":["textareaStyles","tv","inputBaseControlStyles","Textarea","React","className","error","resize","other","ref","textareaRef","useRef","mergedRef","useMergeRefs","useCustomValidity","jsx","_extends","t","r","_objectWithoutPropertiesLoose","n","index","useLayoutEffect","useLatest","value","useIsomorphicLayoutEffect","updateRef","useComposedRef","libRef","userRef","prevUserRef","instance","HIDDEN_TEXTAREA_STYLE","forceHiddenStyles","node","key","forceHiddenStyles$1","hiddenTextarea","getHeight","sizingData","height","calculateNodeHeight","minRows","maxRows","paddingSize","borderSize","sizingStyle","boxSizing","_key","rowHeight","minHeight","maxHeight","noop","pick","props","obj","acc","prop","SIZING_STYLE","isIE","getSizingData","style","getSizingData$1","useListener","target","type","listener","latestListener","handler","ev","useFormResetListener","useWindowResizeListener","useFontsLoadedListener","_excluded","TextareaAutosize","_ref","cacheMeasurements","_ref$onChange","onChange","_ref$onHeightChange","onHeightChange","isControlled","heightRef","measurementsCacheRef","resizeTextarea","nodeSizingData","_calculateNodeHeight","handleChange","event","currentValue","autogrowTextareaStyles","AutogrowTextarea","sharedProps"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6]}