@ryuzaki13/react-foundation-ui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/advanced-search/index.d.ts +3 -0
  2. package/dist/advanced-search/index.d.ts.map +1 -0
  3. package/dist/advanced-search/index.js +361 -0
  4. package/dist/advanced-search/index.js.map +1 -0
  5. package/dist/advanced-search/lib/index.d.ts +2 -0
  6. package/dist/advanced-search/lib/index.d.ts.map +1 -0
  7. package/dist/advanced-search/lib/searchParts.d.ts +3 -0
  8. package/dist/advanced-search/lib/searchParts.d.ts.map +1 -0
  9. package/dist/advanced-search/model/index.d.ts +5 -0
  10. package/dist/advanced-search/model/index.d.ts.map +1 -0
  11. package/dist/advanced-search/model/types.d.ts +55 -0
  12. package/dist/advanced-search/model/types.d.ts.map +1 -0
  13. package/dist/advanced-search/model/useAdvancedSearch.d.ts +11 -0
  14. package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +1 -0
  15. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +6 -0
  16. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +1 -0
  17. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +13 -0
  18. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +1 -0
  19. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +13 -0
  20. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +1 -0
  21. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +8 -0
  22. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +1 -0
  23. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +9 -0
  24. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +1 -0
  25. package/dist/advanced-search/ui/index.d.ts +2 -0
  26. package/dist/advanced-search/ui/index.d.ts.map +1 -0
  27. package/dist/badge/index.js +1 -1
  28. package/dist/badge/stories/Badge.stories.js +22 -22
  29. package/dist/base-table/index.js +2 -2
  30. package/dist/button/index.js +7 -7
  31. package/dist/button/stories/Button.stories.js +1 -1
  32. package/dist/check-box/index.js +1 -1
  33. package/dist/check-box/stories/CheckBox.stories.js +25 -25
  34. package/dist/chunks/{BadgeList-6qL9oNAp.js → BadgeList-DYgun2rf.js} +16 -16
  35. package/dist/chunks/{BadgeList-6qL9oNAp.js.map → BadgeList-DYgun2rf.js.map} +1 -1
  36. package/dist/chunks/{Button-BZ_b-Kin.js → Button-CCWuggdA.js} +16 -16
  37. package/dist/chunks/{Button-BZ_b-Kin.js.map → Button-CCWuggdA.js.map} +1 -1
  38. package/dist/chunks/CalendarView-DjeTJkTT.js +435 -0
  39. package/dist/chunks/{CalendarView-DjShdvRD.js.map → CalendarView-DjeTJkTT.js.map} +1 -1
  40. package/dist/chunks/CheckBox-BowNqqd3.js +48 -0
  41. package/dist/chunks/{CheckBox-CulnjNvJ.js.map → CheckBox-BowNqqd3.js.map} +1 -1
  42. package/dist/chunks/{DateInput-LSSvObtg.js → DateInput--tfofQ2x.js} +68 -68
  43. package/dist/chunks/{DateInput-LSSvObtg.js.map → DateInput--tfofQ2x.js.map} +1 -1
  44. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js → DateRangePresetSelect-UgsfaOeM.js} +22 -22
  45. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js.map → DateRangePresetSelect-UgsfaOeM.js.map} +1 -1
  46. package/dist/chunks/Detail-DHDMsg8q.js +80 -0
  47. package/dist/chunks/{Detail-DKolHye4.js.map → Detail-DHDMsg8q.js.map} +1 -1
  48. package/dist/chunks/{Dialog-BPS4BeWZ.js → Dialog-CFIvGxER.js} +8 -8
  49. package/dist/chunks/{Dialog-BPS4BeWZ.js.map → Dialog-CFIvGxER.js.map} +1 -1
  50. package/dist/chunks/DisclosureGroup-CfRTkl6Z.js +49 -0
  51. package/dist/chunks/{DisclosureGroup-Plk2M_Vl.js.map → DisclosureGroup-CfRTkl6Z.js.map} +1 -1
  52. package/dist/chunks/{DropZone-DPGTpHI6.js → DropZone-kJfbZU5g.js} +22 -22
  53. package/dist/chunks/{DropZone-DPGTpHI6.js.map → DropZone-kJfbZU5g.js.map} +1 -1
  54. package/dist/chunks/{DropdownMenu-Ds-trH4M.js → DropdownMenu-DQeR3y7M.js} +138 -138
  55. package/dist/chunks/{DropdownMenu-Ds-trH4M.js.map → DropdownMenu-DQeR3y7M.js.map} +1 -1
  56. package/dist/chunks/{Flex-DbBdq336.js → Flex-DUYSL5TE.js} +16 -16
  57. package/dist/chunks/{Flex-DbBdq336.js.map → Flex-DUYSL5TE.js.map} +1 -1
  58. package/dist/chunks/Input-BmjlpA09.js +227 -0
  59. package/dist/chunks/{Input-Wrew1puH.js.map → Input-BmjlpA09.js.map} +1 -1
  60. package/dist/chunks/{InputDateTime-2PCX8an8.js → InputDateTime-CxfAFe2L.js} +56 -56
  61. package/dist/chunks/{InputDateTime-2PCX8an8.js.map → InputDateTime-CxfAFe2L.js.map} +1 -1
  62. package/dist/chunks/{InputFile-Ca-bRo93.js → InputFile-CyZu__B_.js} +17 -17
  63. package/dist/chunks/{InputFile-Ca-bRo93.js.map → InputFile-CyZu__B_.js.map} +1 -1
  64. package/dist/chunks/{InputFiles-pI9rQXOI.js → InputFiles-CrTJV27R.js} +31 -31
  65. package/dist/chunks/{InputFiles-pI9rQXOI.js.map → InputFiles-CrTJV27R.js.map} +1 -1
  66. package/dist/chunks/{InputImage-B522AQzl.js → InputImage-Cw8rPYQu.js} +18 -18
  67. package/dist/chunks/{InputImage-B522AQzl.js.map → InputImage-Cw8rPYQu.js.map} +1 -1
  68. package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js → LabeledExpandableActionPanel-D3kUvmFH.js} +26 -26
  69. package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js.map → LabeledExpandableActionPanel-D3kUvmFH.js.map} +1 -1
  70. package/dist/chunks/Listbox-BZlp5qHz.js +81 -0
  71. package/dist/chunks/{Listbox-B6F_IKQv.js.map → Listbox-BZlp5qHz.js.map} +1 -1
  72. package/dist/chunks/{MultiSelect-CUXA8gx-.js → MultiSelect-D1XYuwH1.js} +113 -113
  73. package/dist/chunks/{MultiSelect-CUXA8gx-.js.map → MultiSelect-D1XYuwH1.js.map} +1 -1
  74. package/dist/chunks/{NotificationsHost-Bnq7xFKO.js → NotificationsHost-_icJx4xR.js} +44 -44
  75. package/dist/chunks/{NotificationsHost-Bnq7xFKO.js.map → NotificationsHost-_icJx4xR.js.map} +1 -1
  76. package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js → PresetRangeDateInput-CapirptQ.js} +11 -11
  77. package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js.map → PresetRangeDateInput-CapirptQ.js.map} +1 -1
  78. package/dist/chunks/RadioButton-D0uA0rX_.js +48 -0
  79. package/dist/chunks/{RadioButton-D5vPW4Yr.js.map → RadioButton-D0uA0rX_.js.map} +1 -1
  80. package/dist/chunks/RadioGroup-B9XjkcOy.js +121 -0
  81. package/dist/chunks/{RadioGroup-BAhN1d1X.js.map → RadioGroup-B9XjkcOy.js.map} +1 -1
  82. package/dist/chunks/{Select-CoAYWNOn.js → Select-CXeVjVKA.js} +11 -11
  83. package/dist/chunks/{Select-CoAYWNOn.js.map → Select-CXeVjVKA.js.map} +1 -1
  84. package/dist/chunks/{SerializableSelect-awBOWKTj.js → SerializableSelect-DkYeJtAO.js} +2 -2
  85. package/dist/chunks/{SerializableSelect-awBOWKTj.js.map → SerializableSelect-DkYeJtAO.js.map} +1 -1
  86. package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js → SingleDateTimeInput-BmeuVGQT.js} +78 -78
  87. package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js.map → SingleDateTimeInput-BmeuVGQT.js.map} +1 -1
  88. package/dist/chunks/{Splitter-NjNFuEq4.js → Splitter-BFkVGVRb.js} +32 -32
  89. package/dist/chunks/{Splitter-NjNFuEq4.js.map → Splitter-BFkVGVRb.js.map} +1 -1
  90. package/dist/chunks/StateSelect-1jH3uLz9.js +78 -0
  91. package/dist/chunks/{StateSelect-abZq176J.js.map → StateSelect-1jH3uLz9.js.map} +1 -1
  92. package/dist/chunks/{Switch-DHMnZVmN.js → Switch-B57Qmy1z.js} +19 -19
  93. package/dist/chunks/{Switch-DHMnZVmN.js.map → Switch-B57Qmy1z.js.map} +1 -1
  94. package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js → TextEditorLexicalClient-DRhAswpP.js} +204 -204
  95. package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js.map → TextEditorLexicalClient-DRhAswpP.js.map} +1 -1
  96. package/dist/chunks/{Textarea-DOVrPH4I.js → Textarea-C9UdUueF.js} +2 -2
  97. package/dist/chunks/{Textarea-DOVrPH4I.js.map → Textarea-C9UdUueF.js.map} +1 -1
  98. package/dist/chunks/{TimePanel-_kF2RtHk.js → TimePanel-b4saqoUY.js} +27 -27
  99. package/dist/chunks/{TimePanel-_kF2RtHk.js.map → TimePanel-b4saqoUY.js.map} +1 -1
  100. package/dist/chunks/{Toggle-C_fE-bkM.js → Toggle-DVqOQXmt.js} +18 -18
  101. package/dist/chunks/{Toggle-C_fE-bkM.js.map → Toggle-DVqOQXmt.js.map} +1 -1
  102. package/dist/chunks/{TreeMultiSelect-C76RYavo.js → TreeMultiSelect-CfQhlfnC.js} +6 -6
  103. package/dist/chunks/{TreeMultiSelect-C76RYavo.js.map → TreeMultiSelect-CfQhlfnC.js.map} +1 -1
  104. package/dist/chunks/{TreePickerBase-qNHIWbYL.js → TreePickerBase-BBUOWsSu.js} +49 -49
  105. package/dist/chunks/{TreePickerBase-qNHIWbYL.js.map → TreePickerBase-BBUOWsSu.js.map} +1 -1
  106. package/dist/chunks/{TreeSelect-LEhNdPCX.js → TreeSelect-2wUXs90E.js} +6 -6
  107. package/dist/chunks/{TreeSelect-LEhNdPCX.js.map → TreeSelect-2wUXs90E.js.map} +1 -1
  108. package/dist/chunks/base-table-CoQlKABk.js +514 -0
  109. package/dist/chunks/{base-table-ij2guVMB.js.map → base-table-CoQlKABk.js.map} +1 -1
  110. package/dist/chunks/{floating-arrow-CdRV69sg.js → floating-arrow-BE-z4QkE.js} +7 -7
  111. package/dist/chunks/{floating-arrow-CdRV69sg.js.map → floating-arrow-BE-z4QkE.js.map} +1 -1
  112. package/dist/chunks/input-search-Dw4rnJBq.js +30 -0
  113. package/dist/chunks/input-search-Dw4rnJBq.js.map +1 -0
  114. package/dist/chunks/{layout-picker-CzZ8Xzkk.js → layout-picker-MWaImn3L.js} +34 -34
  115. package/dist/chunks/{layout-picker-CzZ8Xzkk.js.map → layout-picker-MWaImn3L.js.map} +1 -1
  116. package/dist/chunks/{misc-Bj0y3ERC.js → misc-DoqZBMof.js} +110 -110
  117. package/dist/chunks/{misc-Bj0y3ERC.js.map → misc-DoqZBMof.js.map} +1 -1
  118. package/dist/chunks/{modal-B4ivQb2h.js → modal-B3HY3laL.js} +40 -40
  119. package/dist/chunks/{modal-B4ivQb2h.js.map → modal-B3HY3laL.js.map} +1 -1
  120. package/dist/chunks/multi-select-BzYIviCU.js +1305 -0
  121. package/dist/chunks/multi-select-BzYIviCU.js.map +1 -0
  122. package/dist/chunks/{picker-gIUs0nE_.js → picker-Dg55Ss-B.js} +74 -74
  123. package/dist/chunks/{picker-gIUs0nE_.js.map → picker-Dg55Ss-B.js.map} +1 -1
  124. package/dist/chunks/{popover-C79P5bm2.js → popover-xJJqy1v6.js} +52 -52
  125. package/dist/chunks/{popover-C79P5bm2.js.map → popover-xJJqy1v6.js.map} +1 -1
  126. package/dist/chunks/{separator-CIqnk2z9.js → separator-B72Aq-6a.js} +2 -2
  127. package/dist/chunks/{separator-CIqnk2z9.js.map → separator-B72Aq-6a.js.map} +1 -1
  128. package/dist/chunks/{slider-CigVo4Ju.js → slider-CFKsfxFp.js} +83 -83
  129. package/dist/chunks/{slider-CigVo4Ju.js.map → slider-CFKsfxFp.js.map} +1 -1
  130. package/dist/chunks/sortable-DcTIAbjD.js +185 -0
  131. package/dist/chunks/{sortable-BZqnZ_LA.js.map → sortable-DcTIAbjD.js.map} +1 -1
  132. package/dist/chunks/{table-CK-CM2zD.js → table-Dc3AqMzP.js} +21 -21
  133. package/dist/chunks/{table-CK-CM2zD.js.map → table-Dc3AqMzP.js.map} +1 -1
  134. package/dist/chunks/{table-column-interactions-DPyJDD7P.js → table-column-interactions-6RGjmiI5.js} +24 -24
  135. package/dist/chunks/{table-column-interactions-DPyJDD7P.js.map → table-column-interactions-6RGjmiI5.js.map} +1 -1
  136. package/dist/chunks/{tabs-D5ikIIng.js → tabs-DlnVVMJl.js} +96 -96
  137. package/dist/chunks/{tabs-D5ikIIng.js.map → tabs-DlnVVMJl.js.map} +1 -1
  138. package/dist/chunks/{toolbar-C-Ziw_Uh.js → toolbar-BCZNdRXM.js} +2 -2
  139. package/dist/chunks/{toolbar-C-Ziw_Uh.js.map → toolbar-BCZNdRXM.js.map} +1 -1
  140. package/dist/chunks/{wheel-picker-DUHGy7wE.js → wheel-picker-FS58cRsQ.js} +23 -23
  141. package/dist/chunks/{wheel-picker-DUHGy7wE.js.map → wheel-picker-FS58cRsQ.js.map} +1 -1
  142. package/dist/context-menu/index.js +1 -1
  143. package/dist/context-menu/stories/ContextMenu.stories.js +45 -45
  144. package/dist/date-input/index.js +2 -2
  145. package/dist/date-input/stories/DateInput.stories.js +2 -2
  146. package/dist/date-range-preset-select/index.js +1 -1
  147. package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +8 -8
  148. package/dist/date-time-input/index.js +1 -1
  149. package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +38 -38
  150. package/dist/date-time-input/stories/TimePanel.stories.js +9 -9
  151. package/dist/detail/index.js +1 -1
  152. package/dist/detail/stories/Detail.stories.js +1 -1
  153. package/dist/dialog/index.js +1 -1
  154. package/dist/dialog/stories/Dialog.stories.js +16 -16
  155. package/dist/disclosure/index.js +1 -1
  156. package/dist/disclosure/stories/Disclosure.stories.js +1 -1
  157. package/dist/drop-zone/index.js +1 -1
  158. package/dist/drop-zone/stories/DropZone.stories.js +14 -14
  159. package/dist/errors/index.js +47 -47
  160. package/dist/expandable-action-panel/index.js +1 -1
  161. package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +28 -28
  162. package/dist/flex/index.js +2 -2
  163. package/dist/flex/stories/Flex.stories.js +2 -2
  164. package/dist/floating-arrow/index.js +1 -1
  165. package/dist/fullscreen-portal/index.js +6 -6
  166. package/dist/grid/stories/Grid.stories.js +1 -1
  167. package/dist/image/index.js +123 -123
  168. package/dist/input/index.js +1 -1
  169. package/dist/input/stories/Input.stories.js +11 -11
  170. package/dist/input-date-time/index.js +1 -1
  171. package/dist/input-date-time/stories/InputDateTime.stories.js +11 -11
  172. package/dist/input-file/index.js +1 -1
  173. package/dist/input-file/stories/InputFile.stories.js +9 -9
  174. package/dist/input-files/index.js +1 -1
  175. package/dist/input-files/stories/InputFiles.stories.js +9 -9
  176. package/dist/input-image/index.js +1 -1
  177. package/dist/input-image/stories/InputImage.stories.js +15 -15
  178. package/dist/input-search/index.js +2 -30
  179. package/dist/layout-picker/index.js +1 -1
  180. package/dist/layout-picker/stories/LayoutPicker.stories.js +52 -52
  181. package/dist/list/index.js +27 -27
  182. package/dist/listbox/index.js +1 -1
  183. package/dist/listbox/stories/Listbox.stories.js +19 -19
  184. package/dist/misc/index.js +1 -1
  185. package/dist/modal/index.js +1 -1
  186. package/dist/modal/stories/Modal.stories.js +55 -55
  187. package/dist/multi-select/index.js +3 -1141
  188. package/dist/multi-select/ui/stories/MultiSelect.stories.js +17 -17
  189. package/dist/notifications/index.js +1 -1
  190. package/dist/notifications/ui/stories/NotificationsHost.stories.js +59 -59
  191. package/dist/period-select/index.js +20 -20
  192. package/dist/period-select/stories/PeriodSelect.stories.js +17 -17
  193. package/dist/picker/index.js +1 -1
  194. package/dist/popover/index.js +1 -1
  195. package/dist/popover/stories/Popover.stories.js +16 -16
  196. package/dist/preset-range-date-input/index.js +1 -1
  197. package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +9 -9
  198. package/dist/preset-select/index.js +1 -1
  199. package/dist/radio-button/index.js +1 -1
  200. package/dist/radio-button/stories/RadioButton.stories.js +11 -11
  201. package/dist/radio-group/index.js +1 -1
  202. package/dist/radio-group/stories/RadioGroup.stories.js +21 -21
  203. package/dist/select/index.js +2 -2
  204. package/dist/select/stories/Select.stories.js +23 -23
  205. package/dist/select/stories/SerializableSelect.stories.js +22 -22
  206. package/dist/separator/index.js +1 -1
  207. package/dist/simple-table/index.js +5 -5
  208. package/dist/slider/index.js +1 -1
  209. package/dist/slider/stories/Slider.stories.js +32 -32
  210. package/dist/slider/stories/SliderInput.stories.js +39 -39
  211. package/dist/sortable/index.js +1 -1
  212. package/dist/sortable/stories/Sortable.stories.js +23 -23
  213. package/dist/splitter/index.js +1 -1
  214. package/dist/splitter/stories/Splitter.stories.js +1 -1
  215. package/dist/state-select/index.js +1 -1
  216. package/dist/state-select/stories/StateSelect.stories.js +23 -23
  217. package/dist/styles.css +1 -1
  218. package/dist/switch/index.js +1 -1
  219. package/dist/switch/stories/Switch.stories.js +11 -11
  220. package/dist/table/index.js +1 -1
  221. package/dist/table-column-interactions/index.js +1 -1
  222. package/dist/table-sorting/index.js +1 -1
  223. package/dist/tabs/index.js +1 -1
  224. package/dist/tabs/stories/Tabs.stories.js +39 -39
  225. package/dist/text/index.js +20 -20
  226. package/dist/text-editor/index.js +3 -3
  227. package/dist/text-editor/toolbar/index.js +1 -1
  228. package/dist/textarea/index.js +1 -1
  229. package/dist/textarea/stories/Textarea.stories.js +8 -8
  230. package/dist/three-scene/index.js +7 -7
  231. package/dist/toggle/index.js +1 -1
  232. package/dist/toggle/stories/Toggle.stories.js +7 -7
  233. package/dist/toolbar/index.js +16 -16
  234. package/dist/tree/index.js +24 -24
  235. package/dist/tree-select/index.js +2 -2
  236. package/dist/tree-select/stories/TreeMultiSelect.stories.js +9 -9
  237. package/dist/tree-select/stories/TreeSelect.stories.js +9 -9
  238. package/dist/tree-table/index.js +32 -32
  239. package/dist/wheel-picker/index.js +1 -1
  240. package/package.json +11 -1
  241. package/dist/chunks/CalendarView-DjShdvRD.js +0 -435
  242. package/dist/chunks/CheckBox-CulnjNvJ.js +0 -48
  243. package/dist/chunks/Detail-DKolHye4.js +0 -80
  244. package/dist/chunks/DisclosureGroup-Plk2M_Vl.js +0 -49
  245. package/dist/chunks/Input-Wrew1puH.js +0 -227
  246. package/dist/chunks/Listbox-B6F_IKQv.js +0 -81
  247. package/dist/chunks/RadioButton-D5vPW4Yr.js +0 -48
  248. package/dist/chunks/RadioGroup-BAhN1d1X.js +0 -121
  249. package/dist/chunks/StateSelect-abZq176J.js +0 -78
  250. package/dist/chunks/base-table-ij2guVMB.js +0 -514
  251. package/dist/chunks/sortable-BZqnZ_LA.js +0 -185
  252. package/dist/input-search/index.js.map +0 -1
  253. package/dist/multi-select/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePresetSelect-CyzGMvVp.js","names":[],"sources":["../../src/date-range-preset-select/lib/dateRangePresets.ts","../../src/date-range-preset-select/DateRangePresetSelect.tsx"],"sourcesContent":["import {\n\ttype DateRangeReferenceContext,\n\ttype NullableDateRange,\n\tresolveMonthAgoRange,\n\tresolveMonthStartToTodayRange,\n\tresolveMonthStartToYesterdayRange,\n\tresolveTodayRange,\n\tresolveYesterdayRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\n\n/**\n * Идентификаторы встроенных пресетов диапазона дат.\n */\nexport type DateRangePresetId = \"monthStartToYesterday\" | \"monthStartToToday\" | \"today\" | \"yesterday\" | \"monthAgo\";\n\n/**\n * Описание одного пресета диапазона дат.\n */\nexport interface DateRangePresetOption extends PresetOption<DateRangePresetId | (string & {})> {\n\tresolveRange: (context: DateRangeReferenceContext) => NullableDateRange;\n}\n\ntype BuiltInDateRangePresetOption = DateRangePresetOption & {\n\tid: DateRangePresetId;\n};\n\n/**\n * Полезная нагрузка события с вычисленным диапазоном.\n */\nexport interface DateRangePresetChangePayload {\n\tid: DateRangePresetOption[\"id\"];\n\tlabel: string;\n\trange: NullableDateRange;\n}\n\n/**\n * Полный встроенный список пресетов диапазона дат.\n */\nexport const DATE_RANGE_PRESET_OPTIONS: readonly BuiltInDateRangePresetOption[] = Object.freeze([\n\t{\n\t\tid: \"monthStartToYesterday\",\n\t\tlabel: \"С начала месяца по вчера\",\n\t\tresolveRange: resolveMonthStartToYesterdayRange\n\t},\n\t{\n\t\tid: \"monthStartToToday\",\n\t\tlabel: \"С начала месяца по сегодня\",\n\t\tresolveRange: resolveMonthStartToTodayRange\n\t},\n\t{\n\t\tid: \"today\",\n\t\tlabel: \"За сегодня\",\n\t\tresolveRange: resolveTodayRange\n\t},\n\t{\n\t\tid: \"yesterday\",\n\t\tlabel: \"За вчера\",\n\t\tresolveRange: resolveYesterdayRange\n\t},\n\t{\n\t\tid: \"monthAgo\",\n\t\tlabel: \"Месяц назад\",\n\t\tresolveRange: resolveMonthAgoRange\n\t}\n]);\n\n/**\n * Идентификаторы пресетов, которые включены в контрол по умолчанию.\n */\nexport const DEFAULT_DATE_RANGE_PRESET_IDS = Object.freeze([\n\t\"monthStartToYesterday\",\n\t\"monthStartToToday\",\n\t\"today\",\n\t\"yesterday\"\n] as const satisfies readonly DateRangePresetId[]);\n\nconst DATE_RANGE_PRESET_ID_SET: ReadonlySet<string> = new Set(DATE_RANGE_PRESET_OPTIONS.map((option) => option.id));\n\n/**\n * Проверяет, что значение является идентификатором встроенного пресета.\n */\nexport function isDateRangePresetId(value: unknown): value is DateRangePresetId {\n\treturn typeof value === \"string\" && DATE_RANGE_PRESET_ID_SET.has(value);\n}\n\n/**\n * Нормализует сохраненный список идентификаторов пресетов.\n */\nexport function normalizeDateRangePresetIds(value: unknown, fallbackIds: readonly DateRangePresetId[] = []): DateRangePresetId[] {\n\treturn normalizePresetIds(value, isDateRangePresetId, fallbackIds);\n}\n\n/**\n * Формирует список пресетов по сохраненным идентификаторам, сохраняя порядок.\n */\nexport function resolveDateRangePresetOptionsByIds(\n\tpresetIds: readonly DateRangePresetOption[\"id\"][],\n\toptions: readonly DateRangePresetOption[] = DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\n/**\n * Встроенный список пресетов диапазона дат, включенный по умолчанию.\n */\nexport const DEFAULT_DATE_RANGE_PRESET_OPTIONS: readonly DateRangePresetOption[] = Object.freeze(\n\tresolveDateRangePresetOptionsByIds(DEFAULT_DATE_RANGE_PRESET_IDS)\n);\n\n/**\n * Ищет пресет по идентификатору.\n */\nexport function getDateRangePresetOption(\n\tid: DateRangePresetOption[\"id\"] | undefined,\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption | null {\n\treturn getPresetOption(id, options);\n}\n\n/**\n * Вычисляет диапазон по идентификатору пресета.\n */\nexport function resolveDateRangePresetPayload(\n\tid: DateRangePresetOption[\"id\"] | undefined,\n\treferenceDate = new Date(),\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetChangePayload | null {\n\tconst option = getDateRangePresetOption(id, options);\n\tif (!option) return null;\n\n\treturn {\n\t\tid: option.id,\n\t\tlabel: option.label,\n\t\trange: option.resolveRange({ referenceDate })\n\t};\n}\n\n/**\n * Ищет идентификатор пресета, который полностью совпадает с переданным диапазоном.\n */\nexport function resolveDateRangePresetIdByRange(\n\trange: NullableDateRange | null | undefined,\n\treferenceDate = new Date(),\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption[\"id\"] | null {\n\tif (!Array.isArray(range)) return null;\n\n\tconst [rangeStartDate, rangeEndDate] = range;\n\tif (!(rangeStartDate instanceof Date) || !(rangeEndDate instanceof Date)) return null;\n\n\tconst rangeStartTime = rangeStartDate.getTime();\n\tconst rangeEndTime = rangeEndDate.getTime();\n\n\tfor (const option of options) {\n\t\tconst [presetStartDate, presetEndDate] = option.resolveRange({ referenceDate });\n\t\tif (!(presetStartDate instanceof Date) || !(presetEndDate instanceof Date)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (presetStartDate.getTime() === rangeStartTime && presetEndDate.getTime() === rangeEndTime) {\n\t\t\treturn option.id;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tDEFAULT_DATE_RANGE_PRESET_OPTIONS,\n\ttype DateRangePresetChangePayload,\n\ttype DateRangePresetOption,\n\tresolveDateRangePresetPayload\n} from \"./lib/dateRangePresets\";\n\nimport type { UiBaseProps } from \"../types\";\n\nexport interface DateRangePresetSelectProps extends UiBaseProps<DateRangePresetOption[\"id\"] | undefined> {\n\toptions?: readonly DateRangePresetOption[];\n\treferenceDate?: Date;\n\tonRangeChange?: (payload: DateRangePresetChangePayload | null) => void;\n}\n\n/**\n * Строит строковый ключ полезной нагрузки для защиты от повторного эмита одинакового диапазона.\n */\nfunction getPayloadSignature(payload: DateRangePresetChangePayload | null): string {\n\tif (!payload) return \"__empty__\";\n\n\tconst [startDate, endDate] = payload.range;\n\treturn [payload.id, startDate?.getTime() ?? \"null\", endDate?.getTime() ?? \"null\"].join(\"|\");\n}\n\n/**\n * Выбор пресета диапазона дат с вычислением диапазона без timezone-сдвига.\n */\nexport function DateRangePresetSelect({\n\tvalue,\n\tonChange,\n\toptions = DEFAULT_DATE_RANGE_PRESET_OPTIONS,\n\treferenceDate,\n\tonRangeChange,\n\t...props\n}: DateRangePresetSelectProps) {\n\tconst [defaultReferenceDate] = useState(() => new Date());\n\tconst referenceDateTimestamp = referenceDate?.getTime() ?? defaultReferenceDate.getTime();\n\tconst hasRangeChangeHandler = Boolean(onRangeChange);\n\tconst lastPayloadSignatureRef = useRef<string>(\"\");\n\n\t/**\n\t * Сообщает наружу только реально изменившийся диапазон.\n\t */\n\tconst emitRangeChange = useEffectEvent((nextValue: DateRangePresetOption[\"id\"] | undefined) => {\n\t\tif (!onRangeChange) return;\n\n\t\tconst nextPayload = resolveDateRangePresetPayload(nextValue, new Date(referenceDateTimestamp), options);\n\t\tconst nextSignature = getPayloadSignature(nextPayload);\n\t\tif (nextSignature === lastPayloadSignatureRef.current) return;\n\n\t\tlastPayloadSignatureRef.current = nextSignature;\n\t\tonRangeChange(nextPayload);\n\t});\n\n\tuseEffect(() => {\n\t\temitRangeChange(value);\n\t}, [hasRangeChangeHandler, options, referenceDateTimestamp, value]);\n\n\treturn <PresetSelect {...props} options={options} value={value} onChange={onChange} />;\n}\n"],"mappings":";;;;;;AAuCA,IAAa,IAAqE,OAAO,OAAO;CAC/F;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;AACD,CAAC,GAKY,IAAgC,OAAO,OAAO;CAC1D;CACA;CACA;CACA;AACD,CAAiD,GAE3C,IAAgD,IAAI,IAAI,EAA0B,KAAK,MAAW,EAAO,EAAE,CAAC;AAKlH,SAAgB,EAAoB,GAA4C;CAC/E,OAAO,OAAO,KAAU,YAAY,EAAyB,IAAI,CAAK;AACvE;AAKA,SAAgB,EAA4B,GAAgB,IAA4C,CAAC,GAAwB;CAChI,OAAO,EAAmB,GAAO,GAAqB,CAAW;AAClE;AAKA,SAAgB,EACf,GACA,IAA4C,GAClB;CAC1B,OAAO,EAA0B,GAAW,CAAO;AACpD;AAKA,IAAa,IAAsE,OAAO,OACzF,EAAmC,CAA6B,CACjE;AAKA,SAAgB,EACf,GACA,IAA4C,GACb;CAC/B,OAAO,EAAgB,GAAI,CAAO;AACnC;AAKA,SAAgB,EACf,GACA,oBAAgB,IAAI,KAAK,GACzB,IAA4C,GACN;CACtC,IAAM,IAAS,EAAyB,GAAI,CAAO;CAGnD,OAFK,IAEE;EACN,IAAI,EAAO;EACX,OAAO,EAAO;EACd,OAAO,EAAO,aAAa,EAAE,iBAAc,CAAC;CAC7C,IANoB;AAOrB;AAKA,SAAgB,EACf,GACA,oBAAgB,IAAI,KAAK,GACzB,IAA4C,GACP;CACrC,IAAI,CAAC,MAAM,QAAQ,CAAK,GAAG,OAAO;CAElC,IAAM,CAAC,GAAgB,KAAgB;CACvC,IAAI,EAAE,aAA0B,SAAS,EAAE,aAAwB,OAAO,OAAO;CAEjF,IAAM,IAAiB,EAAe,QAAQ,GACxC,IAAe,EAAa,QAAQ;CAE1C,KAAK,IAAM,KAAU,GAAS;EAC7B,IAAM,CAAC,GAAiB,KAAiB,EAAO,aAAa,EAAE,iBAAc,CAAC;EAC1E,QAAE,aAA2B,SAAS,EAAE,aAAyB,UAIjE,EAAgB,QAAQ,MAAM,KAAkB,EAAc,QAAQ,MAAM,GAC/E,OAAO,EAAO;CAEhB;CAEA,OAAO;AACR;;;AChJA,SAAS,EAAoB,GAAsD;CAClF,IAAI,CAAC,GAAS,OAAO;CAErB,IAAM,CAAC,GAAW,KAAW,EAAQ;CACrC,OAAO;EAAC,EAAQ;EAAI,GAAW,QAAQ,KAAK;EAAQ,GAAS,QAAQ,KAAK;CAAM,CAAC,CAAC,KAAK,GAAG;AAC3F;AAKA,SAAgB,EAAsB,EACrC,UACA,aACA,aAAU,GACV,kBACA,kBACA,GAAG,KAC2B;CAC9B,IAAM,CAAC,KAAwB,wBAAe,IAAI,KAAK,CAAC,GAClD,IAAyB,GAAe,QAAQ,KAAK,EAAqB,QAAQ,GAClF,IAAwB,EAAQ,GAChC,IAA0B,EAAe,EAAE,GAK3C,IAAkB,GAAgB,MAAuD;EAC9F,IAAI,CAAC,GAAe;EAEpB,IAAM,IAAc,EAA8B,GAAW,IAAI,KAAK,CAAsB,GAAG,CAAO,GAChG,IAAgB,EAAoB,CAAW;EACjD,MAAkB,EAAwB,YAE9C,EAAwB,UAAU,GAClC,EAAc,CAAW;CAC1B,CAAC;CAMD,OAJA,QAAgB;EACf,EAAgB,CAAK;CACtB,GAAG;EAAC;EAAuB;EAAS;EAAwB;CAAK,CAAC,GAE3D,kBAAC,GAAD;EAAc,GAAI;EAAgB;EAAgB;EAAiB;CAAW,CAAA;AACtF"}
1
+ {"version":3,"file":"DateRangePresetSelect-UgsfaOeM.js","names":[],"sources":["../../src/date-range-preset-select/lib/dateRangePresets.ts","../../src/date-range-preset-select/DateRangePresetSelect.tsx"],"sourcesContent":["import {\n\ttype DateRangeReferenceContext,\n\ttype NullableDateRange,\n\tresolveMonthAgoRange,\n\tresolveMonthStartToTodayRange,\n\tresolveMonthStartToYesterdayRange,\n\tresolveTodayRange,\n\tresolveYesterdayRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\n\n/**\n * Идентификаторы встроенных пресетов диапазона дат.\n */\nexport type DateRangePresetId = \"monthStartToYesterday\" | \"monthStartToToday\" | \"today\" | \"yesterday\" | \"monthAgo\";\n\n/**\n * Описание одного пресета диапазона дат.\n */\nexport interface DateRangePresetOption extends PresetOption<DateRangePresetId | (string & {})> {\n\tresolveRange: (context: DateRangeReferenceContext) => NullableDateRange;\n}\n\ntype BuiltInDateRangePresetOption = DateRangePresetOption & {\n\tid: DateRangePresetId;\n};\n\n/**\n * Полезная нагрузка события с вычисленным диапазоном.\n */\nexport interface DateRangePresetChangePayload {\n\tid: DateRangePresetOption[\"id\"];\n\tlabel: string;\n\trange: NullableDateRange;\n}\n\n/**\n * Полный встроенный список пресетов диапазона дат.\n */\nexport const DATE_RANGE_PRESET_OPTIONS: readonly BuiltInDateRangePresetOption[] = Object.freeze([\n\t{\n\t\tid: \"monthStartToYesterday\",\n\t\tlabel: \"С начала месяца по вчера\",\n\t\tresolveRange: resolveMonthStartToYesterdayRange\n\t},\n\t{\n\t\tid: \"monthStartToToday\",\n\t\tlabel: \"С начала месяца по сегодня\",\n\t\tresolveRange: resolveMonthStartToTodayRange\n\t},\n\t{\n\t\tid: \"today\",\n\t\tlabel: \"За сегодня\",\n\t\tresolveRange: resolveTodayRange\n\t},\n\t{\n\t\tid: \"yesterday\",\n\t\tlabel: \"За вчера\",\n\t\tresolveRange: resolveYesterdayRange\n\t},\n\t{\n\t\tid: \"monthAgo\",\n\t\tlabel: \"Месяц назад\",\n\t\tresolveRange: resolveMonthAgoRange\n\t}\n]);\n\n/**\n * Идентификаторы пресетов, которые включены в контрол по умолчанию.\n */\nexport const DEFAULT_DATE_RANGE_PRESET_IDS = Object.freeze([\n\t\"monthStartToYesterday\",\n\t\"monthStartToToday\",\n\t\"today\",\n\t\"yesterday\"\n] as const satisfies readonly DateRangePresetId[]);\n\nconst DATE_RANGE_PRESET_ID_SET: ReadonlySet<string> = new Set(DATE_RANGE_PRESET_OPTIONS.map((option) => option.id));\n\n/**\n * Проверяет, что значение является идентификатором встроенного пресета.\n */\nexport function isDateRangePresetId(value: unknown): value is DateRangePresetId {\n\treturn typeof value === \"string\" && DATE_RANGE_PRESET_ID_SET.has(value);\n}\n\n/**\n * Нормализует сохраненный список идентификаторов пресетов.\n */\nexport function normalizeDateRangePresetIds(value: unknown, fallbackIds: readonly DateRangePresetId[] = []): DateRangePresetId[] {\n\treturn normalizePresetIds(value, isDateRangePresetId, fallbackIds);\n}\n\n/**\n * Формирует список пресетов по сохраненным идентификаторам, сохраняя порядок.\n */\nexport function resolveDateRangePresetOptionsByIds(\n\tpresetIds: readonly DateRangePresetOption[\"id\"][],\n\toptions: readonly DateRangePresetOption[] = DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\n/**\n * Встроенный список пресетов диапазона дат, включенный по умолчанию.\n */\nexport const DEFAULT_DATE_RANGE_PRESET_OPTIONS: readonly DateRangePresetOption[] = Object.freeze(\n\tresolveDateRangePresetOptionsByIds(DEFAULT_DATE_RANGE_PRESET_IDS)\n);\n\n/**\n * Ищет пресет по идентификатору.\n */\nexport function getDateRangePresetOption(\n\tid: DateRangePresetOption[\"id\"] | undefined,\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption | null {\n\treturn getPresetOption(id, options);\n}\n\n/**\n * Вычисляет диапазон по идентификатору пресета.\n */\nexport function resolveDateRangePresetPayload(\n\tid: DateRangePresetOption[\"id\"] | undefined,\n\treferenceDate = new Date(),\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetChangePayload | null {\n\tconst option = getDateRangePresetOption(id, options);\n\tif (!option) return null;\n\n\treturn {\n\t\tid: option.id,\n\t\tlabel: option.label,\n\t\trange: option.resolveRange({ referenceDate })\n\t};\n}\n\n/**\n * Ищет идентификатор пресета, который полностью совпадает с переданным диапазоном.\n */\nexport function resolveDateRangePresetIdByRange(\n\trange: NullableDateRange | null | undefined,\n\treferenceDate = new Date(),\n\toptions: readonly DateRangePresetOption[] = DEFAULT_DATE_RANGE_PRESET_OPTIONS\n): DateRangePresetOption[\"id\"] | null {\n\tif (!Array.isArray(range)) return null;\n\n\tconst [rangeStartDate, rangeEndDate] = range;\n\tif (!(rangeStartDate instanceof Date) || !(rangeEndDate instanceof Date)) return null;\n\n\tconst rangeStartTime = rangeStartDate.getTime();\n\tconst rangeEndTime = rangeEndDate.getTime();\n\n\tfor (const option of options) {\n\t\tconst [presetStartDate, presetEndDate] = option.resolveRange({ referenceDate });\n\t\tif (!(presetStartDate instanceof Date) || !(presetEndDate instanceof Date)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (presetStartDate.getTime() === rangeStartTime && presetEndDate.getTime() === rangeEndTime) {\n\t\t\treturn option.id;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tDEFAULT_DATE_RANGE_PRESET_OPTIONS,\n\ttype DateRangePresetChangePayload,\n\ttype DateRangePresetOption,\n\tresolveDateRangePresetPayload\n} from \"./lib/dateRangePresets\";\n\nimport type { UiBaseProps } from \"../types\";\n\nexport interface DateRangePresetSelectProps extends UiBaseProps<DateRangePresetOption[\"id\"] | undefined> {\n\toptions?: readonly DateRangePresetOption[];\n\treferenceDate?: Date;\n\tonRangeChange?: (payload: DateRangePresetChangePayload | null) => void;\n}\n\n/**\n * Строит строковый ключ полезной нагрузки для защиты от повторного эмита одинакового диапазона.\n */\nfunction getPayloadSignature(payload: DateRangePresetChangePayload | null): string {\n\tif (!payload) return \"__empty__\";\n\n\tconst [startDate, endDate] = payload.range;\n\treturn [payload.id, startDate?.getTime() ?? \"null\", endDate?.getTime() ?? \"null\"].join(\"|\");\n}\n\n/**\n * Выбор пресета диапазона дат с вычислением диапазона без timezone-сдвига.\n */\nexport function DateRangePresetSelect({\n\tvalue,\n\tonChange,\n\toptions = DEFAULT_DATE_RANGE_PRESET_OPTIONS,\n\treferenceDate,\n\tonRangeChange,\n\t...props\n}: DateRangePresetSelectProps) {\n\tconst [defaultReferenceDate] = useState(() => new Date());\n\tconst referenceDateTimestamp = referenceDate?.getTime() ?? defaultReferenceDate.getTime();\n\tconst hasRangeChangeHandler = Boolean(onRangeChange);\n\tconst lastPayloadSignatureRef = useRef<string>(\"\");\n\n\t/**\n\t * Сообщает наружу только реально изменившийся диапазон.\n\t */\n\tconst emitRangeChange = useEffectEvent((nextValue: DateRangePresetOption[\"id\"] | undefined) => {\n\t\tif (!onRangeChange) return;\n\n\t\tconst nextPayload = resolveDateRangePresetPayload(nextValue, new Date(referenceDateTimestamp), options);\n\t\tconst nextSignature = getPayloadSignature(nextPayload);\n\t\tif (nextSignature === lastPayloadSignatureRef.current) return;\n\n\t\tlastPayloadSignatureRef.current = nextSignature;\n\t\tonRangeChange(nextPayload);\n\t});\n\n\tuseEffect(() => {\n\t\temitRangeChange(value);\n\t}, [hasRangeChangeHandler, options, referenceDateTimestamp, value]);\n\n\treturn <PresetSelect {...props} options={options} value={value} onChange={onChange} />;\n}\n"],"mappings":";;;;;;AAuCA,IAAa,IAAqE,OAAO,OAAO;CAC/F;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;CACA;EACC,IAAI;EACJ,OAAO;EACP,cAAc;CACf;AACD,CAAC,GAKY,IAAgC,OAAO,OAAO;CAC1D;CACA;CACA;CACA;AACD,CAAiD,GAE3C,IAAgD,IAAI,IAAI,EAA0B,KAAK,MAAW,EAAO,EAAE,CAAC;AAKlH,SAAgB,EAAoB,GAA4C;CAC/E,OAAO,OAAO,KAAU,YAAY,EAAyB,IAAI,CAAK;AACvE;AAKA,SAAgB,EAA4B,GAAgB,IAA4C,CAAC,GAAwB;CAChI,OAAO,EAAmB,GAAO,GAAqB,CAAW;AAClE;AAKA,SAAgB,EACf,GACA,IAA4C,GAClB;CAC1B,OAAO,EAA0B,GAAW,CAAO;AACpD;AAKA,IAAa,IAAsE,OAAO,OACzF,EAAmC,CAA6B,CACjE;AAKA,SAAgB,EACf,GACA,IAA4C,GACb;CAC/B,OAAO,EAAgB,GAAI,CAAO;AACnC;AAKA,SAAgB,EACf,GACA,oBAAgB,IAAI,KAAK,GACzB,IAA4C,GACN;CACtC,IAAM,IAAS,EAAyB,GAAI,CAAO;CAGnD,OAFK,IAEE;EACN,IAAI,EAAO;EACX,OAAO,EAAO;EACd,OAAO,EAAO,aAAa,EAAE,iBAAc,CAAC;CAC7C,IANoB;AAOrB;AAKA,SAAgB,EACf,GACA,oBAAgB,IAAI,KAAK,GACzB,IAA4C,GACP;CACrC,IAAI,CAAC,MAAM,QAAQ,CAAK,GAAG,OAAO;CAElC,IAAM,CAAC,GAAgB,KAAgB;CACvC,IAAI,EAAE,aAA0B,SAAS,EAAE,aAAwB,OAAO,OAAO;CAEjF,IAAM,IAAiB,EAAe,QAAQ,GACxC,IAAe,EAAa,QAAQ;CAE1C,KAAK,IAAM,KAAU,GAAS;EAC7B,IAAM,CAAC,GAAiB,KAAiB,EAAO,aAAa,EAAE,iBAAc,CAAC;EAC1E,QAAE,aAA2B,SAAS,EAAE,aAAyB,UAIjE,EAAgB,QAAQ,MAAM,KAAkB,EAAc,QAAQ,MAAM,GAC/E,OAAO,EAAO;CAEhB;CAEA,OAAO;AACR;;;AChJA,SAAS,EAAoB,GAAsD;CAClF,IAAI,CAAC,GAAS,OAAO;CAErB,IAAM,CAAC,GAAW,KAAW,EAAQ;CACrC,OAAO;EAAC,EAAQ;EAAI,GAAW,QAAQ,KAAK;EAAQ,GAAS,QAAQ,KAAK;CAAM,CAAC,CAAC,KAAK,GAAG;AAC3F;AAKA,SAAgB,EAAsB,EACrC,UACA,aACA,aAAU,GACV,kBACA,kBACA,GAAG,KAC2B;CAC9B,IAAM,CAAC,KAAwB,wBAAe,IAAI,KAAK,CAAC,GAClD,IAAyB,GAAe,QAAQ,KAAK,EAAqB,QAAQ,GAClF,IAAwB,EAAQ,GAChC,IAA0B,EAAe,EAAE,GAK3C,IAAkB,GAAgB,MAAuD;EAC9F,IAAI,CAAC,GAAe;EAEpB,IAAM,IAAc,EAA8B,GAAW,IAAI,KAAK,CAAsB,GAAG,CAAO,GAChG,IAAgB,EAAoB,CAAW;EACjD,MAAkB,EAAwB,YAE9C,EAAwB,UAAU,GAClC,EAAc,CAAW;CAC1B,CAAC;CAMD,OAJA,QAAgB;EACf,EAAgB,CAAK;CACtB,GAAG;EAAC;EAAuB;EAAS;EAAwB;CAAK,CAAC,GAE3D,kBAAC,GAAD;EAAc,GAAI;EAAgB;EAAgB;EAAiB;CAAW,CAAA;AACtF"}
@@ -0,0 +1,80 @@
1
+ import { createContext as e, useContext as t } from "react";
2
+ import { cn as n } from "@ryuzaki13/react-foundation-lib/utils";
3
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
+ var o = {
5
+ detailList: "DyKaN-",
6
+ none: "_2Cf0DN",
7
+ small: "igyZiV",
8
+ normal: "lFsl-5",
9
+ large: "zQlD1x",
10
+ detail: "a6oRih",
11
+ dt: "MYdzIV",
12
+ dd: "Pxw-eb",
13
+ textCenter: "Kz2K6S",
14
+ inline: "Pbwja7",
15
+ start: "_1DseTb",
16
+ center: "h3oORx",
17
+ end: "gB9Kr4",
18
+ noWrap: "V-PlLc"
19
+ }, s = e({});
20
+ function c({ label: e, value: c, withColon: l, required: u }) {
21
+ let { semantic: d, inline: f, noWrap: p, center: m, vertical: h = "center", withColon: g = !0 } = t(s), _ = n(o.detail, m && o.textCenter, f && o.inline, p && o.noWrap, o[h]), v = /* @__PURE__ */ a(r, { children: [
22
+ e,
23
+ u && /* @__PURE__ */ i("span", {
24
+ className: "statusError",
25
+ children: "*"
26
+ }),
27
+ (typeof l == "boolean" ? l : g) && ":"
28
+ ] });
29
+ switch (d) {
30
+ case "detail": return /* @__PURE__ */ a("div", {
31
+ className: _,
32
+ children: [/* @__PURE__ */ i("dt", {
33
+ className: o.dt,
34
+ children: v
35
+ }), /* @__PURE__ */ i("dd", {
36
+ className: o.dd,
37
+ children: c
38
+ })]
39
+ });
40
+ case "list": return /* @__PURE__ */ a("li", {
41
+ className: _,
42
+ children: [/* @__PURE__ */ i("div", {
43
+ className: o.dt,
44
+ children: v
45
+ }), /* @__PURE__ */ i("div", {
46
+ className: o.dd,
47
+ children: c
48
+ })]
49
+ });
50
+ default: return /* @__PURE__ */ a("div", {
51
+ className: _,
52
+ children: [/* @__PURE__ */ i("div", {
53
+ className: o.dt,
54
+ children: v
55
+ }), /* @__PURE__ */ i("div", {
56
+ className: o.dd,
57
+ children: c
58
+ })]
59
+ });
60
+ }
61
+ }
62
+ var l = ({ children: e, columnCount: t = 1, rowGap: r = "none", semantic: a = "list", className: c, ...l }) => {
63
+ let u = n(o.detailList, o[r], c), d = i(a === "detail" ? "dl" : "ul", {
64
+ className: u,
65
+ style: { columnCount: Math.min(5, Math.max(1, t)) },
66
+ children: e
67
+ });
68
+ return /* @__PURE__ */ i(s.Provider, {
69
+ value: {
70
+ ...l,
71
+ semantic: a
72
+ },
73
+ children: d
74
+ });
75
+ };
76
+ l.Item = c;
77
+ //#endregion
78
+ export { l as t };
79
+
80
+ //# sourceMappingURL=Detail-DHDMsg8q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Detail-DKolHye4.js","names":[],"sources":["../../src/detail/Detail.module.scss","../../src/detail/Detail.tsx"],"sourcesContent":[".detailList {\n\tcolumn-gap: var(--space-sm);\n\n\t&.none {\n\t\t--row-gap: 0;\n\t}\n\n\t&.small {\n\t\t--row-gap: var(--space-xs);\n\t}\n\n\t&.normal {\n\t\t--row-gap: var(--space-sm);\n\t}\n\n\t&.large {\n\t\t--row-gap: var(--space-md);\n\t}\n}\n\n.detail {\n\t.dt {\n\t\tfont-weight: 700;\n\t\tfont-variation-settings: \"wght\" 700;\n\t}\n\n\t.dd {\n\t\tfont-weight: 500;\n\t\tfont-variation-settings: \"wght\" 500;\n\t}\n\n\t&.textCenter {\n\t\ttext-align: center;\n\n\t\t.dt,\n\t\t.dd {\n\t\t\tflex: 1;\n\t\t}\n\t}\n\n\t&.inline {\n\t\tdisplay: flex;\n\n\t\t.dt {\n\t\t\ttext-align: right;\n\t\t\tpadding-right: var(--space-sm);\n\t\t}\n\n\t\t.dd {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t&.start {\n\t\t\talign-items: flex-start;\n\t\t}\n\t\t&.center {\n\t\t\talign-items: center;\n\t\t}\n\t\t&.end {\n\t\t\talign-items: flex-end;\n\t\t}\n\t}\n\n\t&.noWrap {\n\t\t.dt,\n\t\t.dd {\n\t\t\twhite-space: nowrap;\n\t\t\tword-break: normal;\n\t\t}\n\n\t\t.dd {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tmargin-bottom: var(--row-gap);\n\t}\n}\n","import { createContext, CSSProperties, FC, ReactNode, useContext } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Detail.module.scss\";\n\nexport type DetailType = \"detail\" | \"list\";\n\nexport interface DetailContextType {\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nconst DetailContext = createContext<DetailContextType>({});\n\nexport interface DetailItemProps {\n\tlabel: ReactNode;\n\tvalue: ReactNode;\n\twithColon?: boolean;\n\trequired?: boolean;\n}\n\nfunction Item({ label, value, withColon, required }: DetailItemProps) {\n\tconst { semantic, inline, noWrap, center, vertical = \"center\", withColon: withColonParent = true } = useContext(DetailContext);\n\tconst detailClass = cn(styles.detail, center && styles.textCenter, inline && styles.inline, noWrap && styles.noWrap, styles[vertical]);\n\n\tconst labelContent = (\n\t\t<>\n\t\t\t{label}\n\t\t\t{required && <span className=\"statusError\">*</span>}\n\t\t\t{(typeof withColon === \"boolean\" ? withColon : withColonParent) && \":\"}\n\t\t</>\n\t);\n\n\tswitch (semantic) {\n\t\tcase \"detail\":\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<dt className={styles.dt}>{labelContent}</dt>\n\t\t\t\t\t<dd className={styles.dd}>{value}</dd>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"list\":\n\t\t\treturn (\n\t\t\t\t<li className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</li>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t}\n}\n\nexport interface DetailProps {\n\tcolumnCount?: number;\n\trowGap?: \"none\" | \"small\" | \"normal\" | \"large\";\n\tchildren: ReactNode;\n\tclassName?: string;\n\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nexport interface DetailComponent extends FC<DetailProps> {\n\tItem: FC<DetailItemProps>;\n}\n\n/**\n * Компонент для вывода пар «заголовок-значение» в одну или несколько колонок. Подходит для карточек сущностей, сводок и страниц просмотра.\n */\nexport const Detail: DetailComponent = ({ children, columnCount = 1, rowGap = \"none\", semantic = \"list\", className, ...itemProps }) => {\n\tconst classes = cn(styles.detailList, styles[rowGap], className);\n\tconst style = { columnCount: Math.min(5, Math.max(1, columnCount)) } as CSSProperties;\n\tconst content =\n\t\tsemantic === \"detail\" ? (\n\t\t\t<dl className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</dl>\n\t\t) : (\n\t\t\t<ul className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</ul>\n\t\t);\n\n\treturn <DetailContext.Provider value={{ ...itemProps, semantic }}>{content}</DetailContext.Provider>;\n};\n\nDetail.Item = Item;\n"],"mappings":";;;;;;;;;;;;;;;;;;GCiBM,IAAgB,EAAiC,CAAC,CAAC;AASzD,SAAS,EAAK,EAAE,UAAO,UAAO,cAAW,eAA6B;CACrE,IAAM,EAAE,aAAU,WAAQ,WAAQ,WAAQ,cAAW,UAAU,WAAW,IAAkB,OAAS,EAAW,CAAa,GACvH,IAAc,EAAG,EAAO,QAAQ,KAAU,EAAO,YAAY,KAAU,EAAO,QAAQ,KAAU,EAAO,QAAQ,EAAO,EAAS,GAE/H,IACL,kBAAA,GAAA,EAAA,UAAA;EACE;EACA,KAAY,kBAAC,QAAD;GAAM,WAAU;aAAc;EAAO,CAAA;GAChD,OAAO,KAAc,YAAY,IAAY,MAAoB;CAClE,EAAA,CAAA;CAGH,QAAQ,GAAR;EACC,KAAK,UACJ,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAiB,CAAA,GAC5C,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAU,CAAA,CACjC;;EAGP,KAAK,QACJ,OACC,kBAAC,MAAD;GAAI,WAAW;aAAf,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACpC;;EAGN,SACC,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACnC;;CAER;AACD;AAuBA,IAAa,KAA2B,EAAE,aAAU,iBAAc,GAAG,YAAS,QAAQ,cAAW,QAAQ,cAAW,GAAG,QAAgB;CACtI,IAAM,IAAU,EAAG,EAAO,YAAY,EAAO,IAAS,CAAS,GAEzD,IAEJ,EADD,MAAa,WACX,OAIA,MAJD;EAAI,WAAW;EAAgB,SAHjB,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAW,CAAC,EAGhC;EAC7B;CACE,CAIA;CAGN,OAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;GAAE,GAAG;GAAW;EAAS;YAAI;CAAgC,CAAA;AACpG;AAEA,EAAO,OAAO"}
1
+ {"version":3,"file":"Detail-DHDMsg8q.js","names":[],"sources":["../../src/detail/Detail.module.scss","../../src/detail/Detail.tsx"],"sourcesContent":[".detailList {\n\tcolumn-gap: var(--space-sm);\n\n\t&.none {\n\t\t--row-gap: 0;\n\t}\n\n\t&.small {\n\t\t--row-gap: var(--space-xs);\n\t}\n\n\t&.normal {\n\t\t--row-gap: var(--space-sm);\n\t}\n\n\t&.large {\n\t\t--row-gap: var(--space-md);\n\t}\n}\n\n.detail {\n\t.dt {\n\t\tfont-weight: 700;\n\t\tfont-variation-settings: \"wght\" 700;\n\t}\n\n\t.dd {\n\t\tfont-weight: 500;\n\t\tfont-variation-settings: \"wght\" 500;\n\t}\n\n\t&.textCenter {\n\t\ttext-align: center;\n\n\t\t.dt,\n\t\t.dd {\n\t\t\tflex: 1;\n\t\t}\n\t}\n\n\t&.inline {\n\t\tdisplay: flex;\n\n\t\t.dt {\n\t\t\ttext-align: right;\n\t\t\tpadding-right: var(--space-sm);\n\t\t}\n\n\t\t.dd {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t&.start {\n\t\t\talign-items: flex-start;\n\t\t}\n\t\t&.center {\n\t\t\talign-items: center;\n\t\t}\n\t\t&.end {\n\t\t\talign-items: flex-end;\n\t\t}\n\t}\n\n\t&.noWrap {\n\t\t.dt,\n\t\t.dd {\n\t\t\twhite-space: nowrap;\n\t\t\tword-break: normal;\n\t\t}\n\n\t\t.dd {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tmargin-bottom: var(--row-gap);\n\t}\n}\n","import { createContext, CSSProperties, FC, ReactNode, useContext } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Detail.module.scss\";\n\nexport type DetailType = \"detail\" | \"list\";\n\nexport interface DetailContextType {\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nconst DetailContext = createContext<DetailContextType>({});\n\nexport interface DetailItemProps {\n\tlabel: ReactNode;\n\tvalue: ReactNode;\n\twithColon?: boolean;\n\trequired?: boolean;\n}\n\nfunction Item({ label, value, withColon, required }: DetailItemProps) {\n\tconst { semantic, inline, noWrap, center, vertical = \"center\", withColon: withColonParent = true } = useContext(DetailContext);\n\tconst detailClass = cn(styles.detail, center && styles.textCenter, inline && styles.inline, noWrap && styles.noWrap, styles[vertical]);\n\n\tconst labelContent = (\n\t\t<>\n\t\t\t{label}\n\t\t\t{required && <span className=\"statusError\">*</span>}\n\t\t\t{(typeof withColon === \"boolean\" ? withColon : withColonParent) && \":\"}\n\t\t</>\n\t);\n\n\tswitch (semantic) {\n\t\tcase \"detail\":\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<dt className={styles.dt}>{labelContent}</dt>\n\t\t\t\t\t<dd className={styles.dd}>{value}</dd>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"list\":\n\t\t\treturn (\n\t\t\t\t<li className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</li>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t}\n}\n\nexport interface DetailProps {\n\tcolumnCount?: number;\n\trowGap?: \"none\" | \"small\" | \"normal\" | \"large\";\n\tchildren: ReactNode;\n\tclassName?: string;\n\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nexport interface DetailComponent extends FC<DetailProps> {\n\tItem: FC<DetailItemProps>;\n}\n\n/**\n * Компонент для вывода пар «заголовок-значение» в одну или несколько колонок. Подходит для карточек сущностей, сводок и страниц просмотра.\n */\nexport const Detail: DetailComponent = ({ children, columnCount = 1, rowGap = \"none\", semantic = \"list\", className, ...itemProps }) => {\n\tconst classes = cn(styles.detailList, styles[rowGap], className);\n\tconst style = { columnCount: Math.min(5, Math.max(1, columnCount)) } as CSSProperties;\n\tconst content =\n\t\tsemantic === \"detail\" ? (\n\t\t\t<dl className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</dl>\n\t\t) : (\n\t\t\t<ul className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</ul>\n\t\t);\n\n\treturn <DetailContext.Provider value={{ ...itemProps, semantic }}>{content}</DetailContext.Provider>;\n};\n\nDetail.Item = Item;\n"],"mappings":";;;;;;;;;;;;;;;;;;GCiBM,IAAgB,EAAiC,CAAC,CAAC;AASzD,SAAS,EAAK,EAAE,UAAO,UAAO,cAAW,eAA6B;CACrE,IAAM,EAAE,aAAU,WAAQ,WAAQ,WAAQ,cAAW,UAAU,WAAW,IAAkB,OAAS,EAAW,CAAa,GACvH,IAAc,EAAG,EAAO,QAAQ,KAAU,EAAO,YAAY,KAAU,EAAO,QAAQ,KAAU,EAAO,QAAQ,EAAO,EAAS,GAE/H,IACL,kBAAA,GAAA,EAAA,UAAA;EACE;EACA,KAAY,kBAAC,QAAD;GAAM,WAAU;aAAc;EAAO,CAAA;GAChD,OAAO,KAAc,YAAY,IAAY,MAAoB;CAClE,EAAA,CAAA;CAGH,QAAQ,GAAR;EACC,KAAK,UACJ,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAiB,CAAA,GAC5C,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAU,CAAA,CACjC;;EAGP,KAAK,QACJ,OACC,kBAAC,MAAD;GAAI,WAAW;aAAf,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACpC;;EAGN,SACC,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACnC;;CAER;AACD;AAuBA,IAAa,KAA2B,EAAE,aAAU,iBAAc,GAAG,YAAS,QAAQ,cAAW,QAAQ,cAAW,GAAG,QAAgB;CACtI,IAAM,IAAU,EAAG,EAAO,YAAY,EAAO,IAAS,CAAS,GAEzD,IAEJ,EADD,MAAa,WACX,OAIA,MAJD;EAAI,WAAW;EAAgB,SAHjB,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAW,CAAC,EAGhC;EAC7B;CACE,CAIA;CAGN,OAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;GAAE,GAAG;GAAW;EAAS;YAAI;CAAgC,CAAA;AACpG;AAEA,EAAO,OAAO"}
@@ -1,10 +1,10 @@
1
- import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
- import { useId as n } from "react";
1
+ import { useId as e } from "react";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  import { getOrCreatePortalRoot as r, useEscapeDismiss as i, useOverlayFocus as a } from "@ryuzaki13/react-foundation-lib/dom";
4
4
  import { createPortal as o } from "react-dom";
5
5
  //#region src/dialog/Dialog.tsx
6
6
  function s({ title: s, description: c, open: l, onClose: u, minWidth: d, children: f }) {
7
- let p = n(), m = n(), h = a({
7
+ let p = e(), m = e(), h = a({
8
8
  active: l,
9
9
  trapFocus: !0,
10
10
  restoreFocus: !0,
@@ -16,11 +16,11 @@ function s({ title: s, description: c, open: l, onClose: u, minWidth: d, childre
16
16
  containerRef: h
17
17
  }), !l || typeof document > "u") return null;
18
18
  let g = r("dialog-root");
19
- return g ? o(/* @__PURE__ */ e("div", {
19
+ return g ? o(/* @__PURE__ */ t("div", {
20
20
  className: "fixed inset0 flexCenter surfaceBackdrop",
21
21
  style: { zIndex: "var(--z-dialog)" },
22
22
  onMouseDown: (e) => e.target === e.currentTarget && u(),
23
- children: /* @__PURE__ */ t("div", {
23
+ children: /* @__PURE__ */ n("div", {
24
24
  ref: h,
25
25
  role: "dialog",
26
26
  "aria-modal": "true",
@@ -30,12 +30,12 @@ function s({ title: s, description: c, open: l, onClose: u, minWidth: d, childre
30
30
  className: "surface0 shadowMd paddingLg radiusSm",
31
31
  style: { minWidth: d },
32
32
  children: [
33
- s && /* @__PURE__ */ e("h2", {
33
+ s && /* @__PURE__ */ t("h2", {
34
34
  id: p,
35
35
  className: "margin0",
36
36
  children: s
37
37
  }),
38
- c && /* @__PURE__ */ e("p", {
38
+ c && /* @__PURE__ */ t("p", {
39
39
  id: m,
40
40
  children: c
41
41
  }),
@@ -47,4 +47,4 @@ function s({ title: s, description: c, open: l, onClose: u, minWidth: d, childre
47
47
  //#endregion
48
48
  export { s as t };
49
49
 
50
- //# sourceMappingURL=Dialog-BPS4BeWZ.js.map
50
+ //# sourceMappingURL=Dialog-CFIvGxER.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog-BPS4BeWZ.js","names":[],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import React, { PropsWithChildren, useId } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { createPortal } from \"react-dom\";\n\ninterface DialogProps extends PropsWithChildren {\n\ttitle: React.ReactNode;\n\tdescription: string;\n\topen: boolean;\n\tonClose: () => void;\n\tminWidth?: string | number;\n}\n\n/**\n * Модальное диалоговое окно для важных подтверждений и коротких пользовательских сценариев.\n */\nexport function Dialog({ title, description, open, onClose, minWidth, children }: DialogProps) {\n\tconst titleId = useId();\n\tconst descriptionId = useId();\n\tconst panelRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\ttrapFocus: true,\n\t\trestoreFocus: true,\n\t\tinitialFocus: \"auto\"\n\t});\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: panelRef\n\t});\n\n\tif (!open) {\n\t\treturn null;\n\t}\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\tconst portalTarget = getOrCreatePortalRoot(\"dialog-root\");\n\n\tif (!portalTarget) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div\n\t\t\tclassName=\"fixed inset0 flexCenter surfaceBackdrop\"\n\t\t\tstyle={{ zIndex: \"var(--z-dialog)\" }}\n\t\t\tonMouseDown={(event) => event.target === event.currentTarget && onClose()}>\n\t\t\t<div\n\t\t\t\tref={panelRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={title ? titleId : undefined}\n\t\t\t\taria-describedby={description ? descriptionId : undefined}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tclassName=\"surface0 shadowMd paddingLg radiusSm\"\n\t\t\t\tstyle={{ minWidth }}>\n\t\t\t\t{title && (\n\t\t\t\t\t<h2 id={titleId} className=\"margin0\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t)}\n\t\t\t\t{description && <p id={descriptionId}>{description}</p>}\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>,\n\t\tportalTarget\n\t);\n}\n"],"mappings":";;;;;AAgBA,SAAgB,EAAO,EAAE,UAAO,gBAAa,SAAM,YAAS,aAAU,eAAyB;CAC9F,IAAM,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAW,EAAgC;EAChD,QAAQ;EACR,WAAW;EACX,cAAc;EACd,cAAc;CACf,CAAC;CAYD,IAVA,EAAiB;EAChB,QAAQ;EACR,WAAW;EACX,cAAc;CACf,CAAC,GAEG,CAAC,KAID,OAAO,WAAa,KACvB,OAAO;CAGR,IAAM,IAAe,EAAsB,aAAa;CAMxD,OAJK,IAIE,EACN,kBAAC,OAAD;EACC,WAAU;EACV,OAAO,EAAE,QAAQ,kBAAkB;EACnC,cAAc,MAAU,EAAM,WAAW,EAAM,iBAAiB,EAAQ;YACxE,kBAAC,OAAD;GACC,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,oBAAkB,IAAc,IAAgB,KAAA;GAChD,UAAU;GACV,WAAU;GACV,OAAO,EAAE,YAAS;aARnB;IASE,KACA,kBAAC,MAAD;KAAI,IAAI;KAAS,WAAU;eACzB;IACE,CAAA;IAEJ,KAAe,kBAAC,KAAD;KAAG,IAAI;eAAgB;IAAe,CAAA;IACrD;GACG;;CACD,CAAA,GACL,CACD,IA3BQ;AA4BT"}
1
+ {"version":3,"file":"Dialog-CFIvGxER.js","names":[],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import React, { PropsWithChildren, useId } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { createPortal } from \"react-dom\";\n\ninterface DialogProps extends PropsWithChildren {\n\ttitle: React.ReactNode;\n\tdescription: string;\n\topen: boolean;\n\tonClose: () => void;\n\tminWidth?: string | number;\n}\n\n/**\n * Модальное диалоговое окно для важных подтверждений и коротких пользовательских сценариев.\n */\nexport function Dialog({ title, description, open, onClose, minWidth, children }: DialogProps) {\n\tconst titleId = useId();\n\tconst descriptionId = useId();\n\tconst panelRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\ttrapFocus: true,\n\t\trestoreFocus: true,\n\t\tinitialFocus: \"auto\"\n\t});\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: panelRef\n\t});\n\n\tif (!open) {\n\t\treturn null;\n\t}\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\tconst portalTarget = getOrCreatePortalRoot(\"dialog-root\");\n\n\tif (!portalTarget) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div\n\t\t\tclassName=\"fixed inset0 flexCenter surfaceBackdrop\"\n\t\t\tstyle={{ zIndex: \"var(--z-dialog)\" }}\n\t\t\tonMouseDown={(event) => event.target === event.currentTarget && onClose()}>\n\t\t\t<div\n\t\t\t\tref={panelRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={title ? titleId : undefined}\n\t\t\t\taria-describedby={description ? descriptionId : undefined}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tclassName=\"surface0 shadowMd paddingLg radiusSm\"\n\t\t\t\tstyle={{ minWidth }}>\n\t\t\t\t{title && (\n\t\t\t\t\t<h2 id={titleId} className=\"margin0\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t)}\n\t\t\t\t{description && <p id={descriptionId}>{description}</p>}\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>,\n\t\tportalTarget\n\t);\n}\n"],"mappings":";;;;;AAgBA,SAAgB,EAAO,EAAE,UAAO,gBAAa,SAAM,YAAS,aAAU,eAAyB;CAC9F,IAAM,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAW,EAAgC;EAChD,QAAQ;EACR,WAAW;EACX,cAAc;EACd,cAAc;CACf,CAAC;CAYD,IAVA,EAAiB;EAChB,QAAQ;EACR,WAAW;EACX,cAAc;CACf,CAAC,GAEG,CAAC,KAID,OAAO,WAAa,KACvB,OAAO;CAGR,IAAM,IAAe,EAAsB,aAAa;CAMxD,OAJK,IAIE,EACN,kBAAC,OAAD;EACC,WAAU;EACV,OAAO,EAAE,QAAQ,kBAAkB;EACnC,cAAc,MAAU,EAAM,WAAW,EAAM,iBAAiB,EAAQ;YACxE,kBAAC,OAAD;GACC,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,oBAAkB,IAAc,IAAgB,KAAA;GAChD,UAAU;GACV,WAAU;GACV,OAAO,EAAE,YAAS;aARnB;IASE,KACA,kBAAC,MAAD;KAAI,IAAI;KAAS,WAAU;eACzB;IACE,CAAA;IAEJ,KAAe,kBAAC,KAAD;KAAG,IAAI;eAAgB;IAAe,CAAA;IACrD;GACG;;CACD,CAAA,GACL,CACD,IA3BQ;AA4BT"}
@@ -0,0 +1,49 @@
1
+ import { t as e } from "./ui.module-BisoTevy.js";
2
+ import { useId as t, useState as n } from "react";
3
+ import { cn as r } from "@ryuzaki13/react-foundation-lib/utils";
4
+ import { ChevronDownIcon as i, ChevronUpIcon as a } from "lucide-react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ var c = {
7
+ disclosure: "O-da-N",
8
+ disclosureButton: "_9yjaDf",
9
+ disclosureGroup: "KAIPfW"
10
+ };
11
+ //#endregion
12
+ //#region src/disclosure/Disclosure.tsx
13
+ function l({ label: l, defaultOpen: u, children: d }) {
14
+ let [f, p] = n(u === !0), m = t(), h = t();
15
+ return /* @__PURE__ */ s("div", {
16
+ className: r(e.uiElement, e.uiPanel, c.disclosure),
17
+ children: [/* @__PURE__ */ s("button", {
18
+ id: h,
19
+ type: "button",
20
+ "aria-expanded": f,
21
+ "aria-controls": m,
22
+ className: r(c.disclosureButton, "fontBold radiusSm paddingSm gapSm"),
23
+ "data-ui": "disclosure-toggle",
24
+ "data-action": f ? "collapse-disclosure" : "expand-disclosure",
25
+ onClick: () => p((e) => !e),
26
+ children: [o(f ? a : i, {}), l]
27
+ }), f && /* @__PURE__ */ o("div", {
28
+ id: m,
29
+ role: "region",
30
+ "aria-labelledby": h,
31
+ children: /* @__PURE__ */ o("div", {
32
+ className: "paddingMd",
33
+ children: d
34
+ })
35
+ })]
36
+ });
37
+ }
38
+ //#endregion
39
+ //#region src/disclosure/DisclosureGroup.tsx
40
+ function u({ className: e, children: t }) {
41
+ return /* @__PURE__ */ o("div", {
42
+ className: r(c.disclosureGroup, e),
43
+ children: t
44
+ });
45
+ }
46
+ //#endregion
47
+ export { l as n, u as t };
48
+
49
+ //# sourceMappingURL=DisclosureGroup-CfRTkl6Z.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DisclosureGroup-Plk2M_Vl.js","names":[],"sources":["../../src/disclosure/Disclosure.module.scss","../../src/disclosure/Disclosure.tsx","../../src/disclosure/DisclosureGroup.tsx"],"sourcesContent":[".disclosure {\n\t--ui-panel-background: var(--surface-2);\n\n\tbox-shadow: none;\n}\n\n.disclosureButton {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.disclosureGroup {\n\t> .disclosure {\n\t\tborder-radius: 0;\n\n\t\t&:not(:first-child) {\n\t\t\tborder-top: none;\n\t\t}\n\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: var(--radius-sm);\n\t\t\tborder-top-right-radius: var(--radius-sm);\n\t\t}\n\n\t\t&:last-child {\n\t\t\tborder-bottom-left-radius: var(--radius-sm);\n\t\t\tborder-bottom-right-radius: var(--radius-sm);\n\t\t}\n\t}\n}\n","import React, { PropsWithChildren, useId, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Disclosure.module.scss\";\n\nexport interface DisclosureProps extends PropsWithChildren {\n\tlabel: React.ReactNode;\n\tdefaultOpen?: boolean;\n}\n\n/**\n * Раскрывающийся блок с заголовком и скрываемым содержимым. Используется для FAQ, настроек и компактного размещения второстепенной информации.\n */\nexport function Disclosure({ label, defaultOpen, children }: DisclosureProps) {\n\tconst [open, setOpen] = useState(defaultOpen === true);\n\tconst panelId = useId();\n\tconst buttonId = useId();\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, uiStyles.uiPanel, styles.disclosure)}>\n\t\t\t<button\n\t\t\t\tid={buttonId}\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={open}\n\t\t\t\taria-controls={panelId}\n\t\t\t\tclassName={cn(styles.disclosureButton, \"fontBold radiusSm paddingSm gapSm\")}\n\t\t\t\tdata-ui=\"disclosure-toggle\"\n\t\t\t\tdata-action={open ? \"collapse-disclosure\" : \"expand-disclosure\"}\n\t\t\t\tonClick={() => setOpen((prevOpen) => !prevOpen)}>\n\t\t\t\t{open ? <ChevronUpIcon /> : <ChevronDownIcon />}\n\t\t\t\t{label}\n\t\t\t</button>\n\n\t\t\t{open && (\n\t\t\t\t<div id={panelId} role=\"region\" aria-labelledby={buttonId}>\n\t\t\t\t\t<div className={\"paddingMd\"}>{children}</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Disclosure, DisclosureProps } from \"./Disclosure\";\nimport styles from \"./Disclosure.module.scss\";\n\ninterface DisclosureGroupProps {\n\tchildren?:\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)[];\n\tclassName?: string;\n}\n\n/**\n * Групповой контейнер для нескольких `Disclosure`. Помогает выстраивать последовательный список раскрывающихся секций.\n */\nexport function DisclosureGroup({ className, children }: DisclosureGroupProps) {\n\treturn <div className={cn(styles.disclosureGroup, className)}>{children}</div>;\n}\n"],"mappings":";;;;;;;;;;;;ACiBA,SAAgB,EAAW,EAAE,UAAO,gBAAa,eAA6B;CAC7E,IAAM,CAAC,GAAM,KAAW,EAAS,MAAgB,EAAI,GAC/C,IAAU,EAAM,GAChB,IAAW,EAAM;CAEvB,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,EAAS,SAAS,EAAO,UAAU;YAA1E,CACC,kBAAC,UAAD;GACC,IAAI;GACJ,MAAK;GACL,iBAAe;GACf,iBAAe;GACf,WAAW,EAAG,EAAO,kBAAkB,mCAAmC;GAC1E,WAAQ;GACR,eAAa,IAAO,wBAAwB;GAC5C,eAAe,GAAS,MAAa,CAAC,CAAQ;aAR/C,CASS,EAAP,IAAQ,IAAoB,GAArB,CAAgB,CAAsB,GAC7C,CACM;MAEP,KACA,kBAAC,OAAD;GAAK,IAAI;GAAS,MAAK;GAAS,mBAAiB;aAChD,kBAAC,OAAD;IAAK,WAAW;IAAc;GAAc,CAAA;EACxC,CAAA,CAEF;;AAEP;;;AC3BA,SAAgB,EAAgB,EAAE,cAAW,eAAkC;CAC9E,OAAO,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,iBAAiB,CAAS;EAAI;CAAc,CAAA;AAC9E"}
1
+ {"version":3,"file":"DisclosureGroup-CfRTkl6Z.js","names":[],"sources":["../../src/disclosure/Disclosure.module.scss","../../src/disclosure/Disclosure.tsx","../../src/disclosure/DisclosureGroup.tsx"],"sourcesContent":[".disclosure {\n\t--ui-panel-background: var(--surface-2);\n\n\tbox-shadow: none;\n}\n\n.disclosureButton {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.disclosureGroup {\n\t> .disclosure {\n\t\tborder-radius: 0;\n\n\t\t&:not(:first-child) {\n\t\t\tborder-top: none;\n\t\t}\n\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: var(--radius-sm);\n\t\t\tborder-top-right-radius: var(--radius-sm);\n\t\t}\n\n\t\t&:last-child {\n\t\t\tborder-bottom-left-radius: var(--radius-sm);\n\t\t\tborder-bottom-right-radius: var(--radius-sm);\n\t\t}\n\t}\n}\n","import React, { PropsWithChildren, useId, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Disclosure.module.scss\";\n\nexport interface DisclosureProps extends PropsWithChildren {\n\tlabel: React.ReactNode;\n\tdefaultOpen?: boolean;\n}\n\n/**\n * Раскрывающийся блок с заголовком и скрываемым содержимым. Используется для FAQ, настроек и компактного размещения второстепенной информации.\n */\nexport function Disclosure({ label, defaultOpen, children }: DisclosureProps) {\n\tconst [open, setOpen] = useState(defaultOpen === true);\n\tconst panelId = useId();\n\tconst buttonId = useId();\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, uiStyles.uiPanel, styles.disclosure)}>\n\t\t\t<button\n\t\t\t\tid={buttonId}\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={open}\n\t\t\t\taria-controls={panelId}\n\t\t\t\tclassName={cn(styles.disclosureButton, \"fontBold radiusSm paddingSm gapSm\")}\n\t\t\t\tdata-ui=\"disclosure-toggle\"\n\t\t\t\tdata-action={open ? \"collapse-disclosure\" : \"expand-disclosure\"}\n\t\t\t\tonClick={() => setOpen((prevOpen) => !prevOpen)}>\n\t\t\t\t{open ? <ChevronUpIcon /> : <ChevronDownIcon />}\n\t\t\t\t{label}\n\t\t\t</button>\n\n\t\t\t{open && (\n\t\t\t\t<div id={panelId} role=\"region\" aria-labelledby={buttonId}>\n\t\t\t\t\t<div className={\"paddingMd\"}>{children}</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Disclosure, DisclosureProps } from \"./Disclosure\";\nimport styles from \"./Disclosure.module.scss\";\n\ninterface DisclosureGroupProps {\n\tchildren?:\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)[];\n\tclassName?: string;\n}\n\n/**\n * Групповой контейнер для нескольких `Disclosure`. Помогает выстраивать последовательный список раскрывающихся секций.\n */\nexport function DisclosureGroup({ className, children }: DisclosureGroupProps) {\n\treturn <div className={cn(styles.disclosureGroup, className)}>{children}</div>;\n}\n"],"mappings":";;;;;;;;;;;;ACiBA,SAAgB,EAAW,EAAE,UAAO,gBAAa,eAA6B;CAC7E,IAAM,CAAC,GAAM,KAAW,EAAS,MAAgB,EAAI,GAC/C,IAAU,EAAM,GAChB,IAAW,EAAM;CAEvB,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,EAAS,SAAS,EAAO,UAAU;YAA1E,CACC,kBAAC,UAAD;GACC,IAAI;GACJ,MAAK;GACL,iBAAe;GACf,iBAAe;GACf,WAAW,EAAG,EAAO,kBAAkB,mCAAmC;GAC1E,WAAQ;GACR,eAAa,IAAO,wBAAwB;GAC5C,eAAe,GAAS,MAAa,CAAC,CAAQ;aAR/C,CASS,EAAP,IAAQ,IAAoB,GAArB,CAAgB,CAAsB,GAC7C,CACM;MAEP,KACA,kBAAC,OAAD;GAAK,IAAI;GAAS,MAAK;GAAS,mBAAiB;aAChD,kBAAC,OAAD;IAAK,WAAW;IAAc;GAAc,CAAA;EACxC,CAAA,CAEF;;AAEP;;;AC3BA,SAAgB,EAAgB,EAAE,cAAW,eAAkC;CAC9E,OAAO,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,iBAAiB,CAAS;EAAI;CAAc,CAAA;AAC9E"}
@@ -1,8 +1,8 @@
1
- import { n as e } from "./InputFiles-pI9rQXOI.js";
2
- import { cn as t, handleKeyboardActivation as n } from "@ryuzaki13/react-foundation-lib/utils";
3
- import { UploadIcon as r } from "lucide-react";
4
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
5
- import { useCallback as s, useMemo as c, useRef as l, useState as u } from "react";
1
+ import { n as e } from "./InputFiles-CrTJV27R.js";
2
+ import { useCallback as t, useMemo as n, useRef as r, useState as i } from "react";
3
+ import { cn as a, handleKeyboardActivation as o } from "@ryuzaki13/react-foundation-lib/utils";
4
+ import { UploadIcon as s } from "lucide-react";
5
+ import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
6
6
  import { ReadFileError as d, assertValidAccept as f, assertValidAllowedMime as p, readFile as m } from "@ryuzaki13/react-foundation-lib/file";
7
7
  var h = {
8
8
  zone: "q2D6Pw",
@@ -15,7 +15,7 @@ var h = {
15
15
  //#region src/drop-zone/DropZone.tsx
16
16
  function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b, maxBytes: x, readMode: S, multiple: C = !0, disabled: w, className: T, children: E }) {
17
17
  p(b), f(y);
18
- let D = l(0), O = l(null), [k, A] = u(!1), j = c(() => y && y.length > 0 ? y.join(",") : b && b.length > 0 ? b.join(",") : "*", [b, y]), M = s((e) => S === "array-buffer" ? m(e, {
18
+ let D = r(0), O = r(null), [k, A] = i(!1), j = n(() => y && y.length > 0 ? y.join(",") : b && b.length > 0 ? b.join(",") : "*", [b, y]), M = t((e) => S === "array-buffer" ? m(e, {
19
19
  allowedMime: b,
20
20
  maxBytes: x,
21
21
  mode: "array-buffer"
@@ -26,7 +26,7 @@ function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b,
26
26
  b,
27
27
  x,
28
28
  S
29
- ]), N = s(async (e) => {
29
+ ]), N = t(async (e) => {
30
30
  if (w || e.length === 0) return;
31
31
  let t = C ? e : e.slice(0, 1), n = [];
32
32
  for (let e of t) try {
@@ -42,26 +42,26 @@ function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b,
42
42
  _,
43
43
  v,
44
44
  M
45
- ]), P = s(() => {
45
+ ]), P = t(() => {
46
46
  w || O.current?.click();
47
- }, [w]), F = s((e) => {
47
+ }, [w]), F = t((e) => {
48
48
  e.preventDefault(), e.stopPropagation(), !w && (D.current += 1, D.current === 1 && A(!0));
49
- }, [w]), I = s((e) => {
49
+ }, [w]), I = t((e) => {
50
50
  e.preventDefault(), e.stopPropagation(), !w && (e.dataTransfer.dropEffect = "copy");
51
- }, [w]), L = s((e) => {
51
+ }, [w]), L = t((e) => {
52
52
  e.preventDefault(), e.stopPropagation(), !w && (--D.current, D.current === 0 && A(!1));
53
- }, [w]), R = s(async (e) => {
53
+ }, [w]), R = t(async (e) => {
54
54
  if (e.preventDefault(), e.stopPropagation(), D.current = 0, A(!1), w) return;
55
55
  let t = Array.from(e.dataTransfer.files);
56
56
  await N(t);
57
- }, [w, N]), z = s(async (e) => {
57
+ }, [w, N]), z = t(async (e) => {
58
58
  let t = Array.from(e.target.files ?? []);
59
59
  await N(t), e.target.value = "";
60
- }, [N]), B = s((e) => {
61
- n(e, P, { disabled: w });
60
+ }, [N]), B = t((e) => {
61
+ o(e, P, { disabled: w });
62
62
  }, [w, P]);
63
- return /* @__PURE__ */ o("div", { children: [
64
- /* @__PURE__ */ a("input", {
63
+ return /* @__PURE__ */ u("div", { children: [
64
+ /* @__PURE__ */ l("input", {
65
65
  ref: O,
66
66
  type: "file",
67
67
  hidden: !0,
@@ -70,8 +70,8 @@ function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b,
70
70
  accept: j,
71
71
  onChange: z
72
72
  }),
73
- /* @__PURE__ */ a("div", {
74
- className: t(h.zone, k && h.dragOver, w && h.disabled, T),
73
+ /* @__PURE__ */ l("div", {
74
+ className: a(h.zone, k && h.dragOver, w && h.disabled, T),
75
75
  onClick: P,
76
76
  onKeyDown: B,
77
77
  onDragEnter: F,
@@ -81,12 +81,12 @@ function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b,
81
81
  role: "button",
82
82
  tabIndex: w ? -1 : 0,
83
83
  "aria-disabled": w,
84
- children: E ?? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(r, { className: h.icon }), /* @__PURE__ */ a("span", {
84
+ children: E ?? /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ l(s, { className: h.icon }), /* @__PURE__ */ l("span", {
85
85
  className: h.hint,
86
86
  children: C ? "Перетащите файлы сюда или нажмите для выбора" : "Перетащите файл сюда или нажмите для выбора"
87
87
  })] })
88
88
  }),
89
- /* @__PURE__ */ a(e, {
89
+ /* @__PURE__ */ l(e, {
90
90
  files: g,
91
91
  onChange: _
92
92
  })
@@ -95,4 +95,4 @@ function g({ value: g, onChange: _, onChangeError: v, accept: y, allowedMime: b,
95
95
  //#endregion
96
96
  export { g as t };
97
97
 
98
- //# sourceMappingURL=DropZone-DPGTpHI6.js.map
98
+ //# sourceMappingURL=DropZone-kJfbZU5g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone-DPGTpHI6.js","names":[],"sources":["../../src/drop-zone/DropZone.module.scss","../../src/drop-zone/DropZone.tsx"],"sourcesContent":[".zone {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: var(--space-sm);\n\n\tmin-height: 8em;\n\tpadding: var(--space-lg);\n\n\tborder: var(--border-width) dashed var(--border-0);\n\tborder-radius: var(--radius-sm);\n\tbackground-color: var(--surface-0);\n\n\tcolor: var(--content-2);\n\tcursor: pointer;\n\n\ttransition-property: border-color, background-color;\n\ttransition-duration: var(--transition-fast);\n\n\t&.dragOver {\n\t\tborder-color: var(--content-accent);\n\t\tbackground-color: var(--surface-1);\n\t}\n\n\t&.disabled {\n\t\tcursor: default;\n\t\tpointer-events: none;\n\t\tbackground-color: var(--surface-2);\n\t\tborder-color: var(--overlay-backdrop);\n\n\t\t.icon,\n\t\t.hint {\n\t\t\topacity: 0.25;\n\t\t}\n\t}\n}\n\n.icon {\n\twidth: 2em;\n\theight: 2em;\n\tcolor: var(--content-2);\n}\n\n.hint {\n\ttext-align: center;\n}\n","import { ChangeEvent, ReactNode, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n\tassertValidAccept,\n\tassertValidAllowedMime,\n\treadFile,\n\tReadFileError,\n\tReadFileResult,\n\tReadMode\n} from \"@ryuzaki13/react-foundation-lib/file\";\nimport { cn, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { UploadIcon } from \"lucide-react\";\n\nimport { InputFilesList } from \"../input-files\";\n\nimport styles from \"./DropZone.module.scss\";\n\n/**\n * Пропсы компонента DropZone.\n *\n * Компонент представляет собой визуальную зону для выбора файлов.\n * Поддерживает перетаскивание и выбор по клику, а результаты передаются в onDrop.\n */\nexport interface DropZoneProps {\n\tvalue: ReadFileResult[];\n\t/** Вызывается с массивом результатов readFile после сброса файлов */\n\tonChange: (results: ReadFileResult[]) => void;\n\t/** Callback ошибки чтения одного из файлов */\n\tonChangeError?: (error: ReadFileError) => void;\n\n\t/** HTML-атрибут accept для нативного input[type=\"file\"] (например `[\".pdf\", \".docx\"]`) */\n\taccept?: readonly string[];\n\t/** Список допустимых MIME-типов — передаётся в readFile (например `[\"application/pdf\", \"image/png\"]`) */\n\tallowedMime?: readonly string[];\n\t/** Максимальный размер одного файла в байтах */\n\tmaxBytes?: number;\n\t/** Режим чтения: \"data-url\" (по умолчанию) или \"array-buffer\" */\n\treadMode?: ReadMode;\n\t/** Разрешить сброс нескольких файлов (по умолчанию true) */\n\tmultiple?: boolean;\n\n\t/** Блокировка компонента */\n\tdisabled?: boolean;\n\t/** CSS-класс обёртки */\n\tclassName?: string;\n\t/**\n\t * Кастомный контент внутри зоны.\n\t * По умолчанию отображается иконка загрузки и текст \"Перетащите файлы сюда\".\n\t */\n\tchildren?: ReactNode;\n}\n\n/**\n * DropZone — зона для перетаскивания файлов и выбора по клику.\n *\n * При наведении файла зона подсвечивается (пунктирная рамка меняет цвет).\n * При сбросе файлов каждый читается через readFile, успешные результаты\n * передаются в onDrop, ошибки — в onDropError.\n *\n * Поддерживает кастомный контент через children.\n * Если children не указан — отображается иконка загрузки и подсказка.\n */\nexport function DropZone({\n\tvalue,\n\tonChange,\n\tonChangeError,\n\taccept,\n\tallowedMime,\n\tmaxBytes,\n\treadMode,\n\tmultiple = true,\n\tdisabled,\n\tclassName,\n\tchildren\n}: DropZoneProps) {\n\tassertValidAllowedMime(allowedMime);\n\tassertValidAccept(accept);\n\n\t/** Счётчик вложенности drag-событий для корректной обработки dragLeave */\n\tconst dragCounter = useRef(0);\n\t/** Скрытый input для выбора файлов по клику */\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\t/** Состояние: файл перетаскивается над зоной */\n\tconst [isDragOver, setIsDragOver] = useState(false);\n\n\t/**\n\t * Формируем HTML-атрибут accept из accept или allowedMime.\n\t */\n\tconst acceptAttr = useMemo(() => {\n\t\tif (accept && accept.length > 0) {\n\t\t\treturn accept.join(\",\");\n\t\t}\n\t\tif (allowedMime && allowedMime.length > 0) {\n\t\t\treturn allowedMime.join(\",\");\n\t\t}\n\t\treturn \"*\";\n\t}, [allowedMime, accept]);\n\n\tconst readDroppedFile = useCallback(\n\t\t(file: File) => {\n\t\t\tif (readMode === \"array-buffer\") {\n\t\t\t\treturn readFile(file, { allowedMime, maxBytes, mode: \"array-buffer\" });\n\t\t\t}\n\n\t\t\treturn readFile(file, { allowedMime, maxBytes });\n\t\t},\n\t\t[allowedMime, maxBytes, readMode]\n\t);\n\n\tconst processFiles = useCallback(\n\t\tasync (files: File[]) => {\n\t\t\tif (disabled || files.length === 0) return;\n\n\t\t\tconst filesToProcess = multiple ? files : files.slice(0, 1);\n\t\t\tconst results: ReadFileResult[] = [];\n\n\t\t\tfor (const file of filesToProcess) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await readDroppedFile(file);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof ReadFileError && onChangeError) {\n\t\t\t\t\t\tonChangeError(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (results.length > 0) {\n\t\t\t\tonChange(results);\n\t\t\t}\n\t\t},\n\t\t[disabled, multiple, onChange, onChangeError, readDroppedFile]\n\t);\n\n\tconst openFileDialog = useCallback(() => {\n\t\tif (disabled) return;\n\n\t\tinputRef.current?.click();\n\t}, [disabled]);\n\n\t/**\n\t * Обработка dragEnter — увеличиваем счётчик и включаем подсветку.\n\t * Счётчик нужен потому что dragEnter/dragLeave срабатывают\n\t * на каждом дочернем элементе внутри зоны.\n\t */\n\tconst handleDragEnter = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\tdragCounter.current += 1;\n\t\t\tif (dragCounter.current === 1) {\n\t\t\t\tsetIsDragOver(true);\n\t\t\t}\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка dragOver — предотвращаем дефолтное поведение браузера\n\t * (иначе drop-событие не сработает).\n\t */\n\tconst handleDragOver = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\te.dataTransfer.dropEffect = \"copy\";\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка dragLeave — уменьшаем счётчик, выключаем подсветку при 0.\n\t */\n\tconst handleDragLeave = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\tdragCounter.current -= 1;\n\t\t\tif (dragCounter.current === 0) {\n\t\t\t\tsetIsDragOver(false);\n\t\t\t}\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка drop — читаем сброшенные файлы через общую логику.\n\t */\n\tconst handleDrop = useCallback(\n\t\tasync (e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// Сбрасываем состояние drag\n\t\t\tdragCounter.current = 0;\n\t\t\tsetIsDragOver(false);\n\n\t\t\tif (disabled) return;\n\n\t\t\tconst droppedFiles = Array.from(e.dataTransfer.files);\n\t\t\tawait processFiles(droppedFiles);\n\t\t},\n\t\t[disabled, processFiles]\n\t);\n\n\tconst handleInputChange = useCallback(\n\t\tasync (e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst selectedFiles = Array.from(e.target.files ?? []);\n\t\t\tawait processFiles(selectedFiles);\n\n\t\t\t// Сбрасываем значение, чтобы повторный выбор того же файла тоже вызывал change.\n\t\t\te.target.value = \"\";\n\t\t},\n\t\t[processFiles]\n\t);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\thandleKeyboardActivation(e, openFileDialog, { disabled });\n\t\t},\n\t\t[disabled, openFileDialog]\n\t);\n\n\treturn (\n\t\t<div>\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\thidden\n\t\t\t\tdisabled={disabled}\n\t\t\t\tmultiple={multiple}\n\t\t\t\taccept={acceptAttr}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(styles.zone, isDragOver && styles.dragOver, disabled && styles.disabled, className)}\n\t\t\t\tonClick={openFileDialog}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonDragEnter={handleDragEnter}\n\t\t\t\tonDragOver={handleDragOver}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\taria-disabled={disabled}>\n\t\t\t\t{children ?? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* Иконка загрузки по умолчанию */}\n\t\t\t\t\t\t<UploadIcon className={styles.icon} />\n\t\t\t\t\t\t{/* Текст подсказки */}\n\t\t\t\t\t\t<span className={styles.hint}>\n\t\t\t\t\t\t\t{multiple ? \"Перетащите файлы сюда или нажмите для выбора\" : \"Перетащите файл сюда или нажмите для выбора\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Список выбранных файлов */}\n\t\t\t<InputFilesList files={value} onChange={onChange} />\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropZone-kJfbZU5g.js","names":[],"sources":["../../src/drop-zone/DropZone.module.scss","../../src/drop-zone/DropZone.tsx"],"sourcesContent":[".zone {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tgap: var(--space-sm);\n\n\tmin-height: 8em;\n\tpadding: var(--space-lg);\n\n\tborder: var(--border-width) dashed var(--border-0);\n\tborder-radius: var(--radius-sm);\n\tbackground-color: var(--surface-0);\n\n\tcolor: var(--content-2);\n\tcursor: pointer;\n\n\ttransition-property: border-color, background-color;\n\ttransition-duration: var(--transition-fast);\n\n\t&.dragOver {\n\t\tborder-color: var(--content-accent);\n\t\tbackground-color: var(--surface-1);\n\t}\n\n\t&.disabled {\n\t\tcursor: default;\n\t\tpointer-events: none;\n\t\tbackground-color: var(--surface-2);\n\t\tborder-color: var(--overlay-backdrop);\n\n\t\t.icon,\n\t\t.hint {\n\t\t\topacity: 0.25;\n\t\t}\n\t}\n}\n\n.icon {\n\twidth: 2em;\n\theight: 2em;\n\tcolor: var(--content-2);\n}\n\n.hint {\n\ttext-align: center;\n}\n","import { ChangeEvent, ReactNode, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n\tassertValidAccept,\n\tassertValidAllowedMime,\n\treadFile,\n\tReadFileError,\n\tReadFileResult,\n\tReadMode\n} from \"@ryuzaki13/react-foundation-lib/file\";\nimport { cn, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { UploadIcon } from \"lucide-react\";\n\nimport { InputFilesList } from \"../input-files\";\n\nimport styles from \"./DropZone.module.scss\";\n\n/**\n * Пропсы компонента DropZone.\n *\n * Компонент представляет собой визуальную зону для выбора файлов.\n * Поддерживает перетаскивание и выбор по клику, а результаты передаются в onDrop.\n */\nexport interface DropZoneProps {\n\tvalue: ReadFileResult[];\n\t/** Вызывается с массивом результатов readFile после сброса файлов */\n\tonChange: (results: ReadFileResult[]) => void;\n\t/** Callback ошибки чтения одного из файлов */\n\tonChangeError?: (error: ReadFileError) => void;\n\n\t/** HTML-атрибут accept для нативного input[type=\"file\"] (например `[\".pdf\", \".docx\"]`) */\n\taccept?: readonly string[];\n\t/** Список допустимых MIME-типов — передаётся в readFile (например `[\"application/pdf\", \"image/png\"]`) */\n\tallowedMime?: readonly string[];\n\t/** Максимальный размер одного файла в байтах */\n\tmaxBytes?: number;\n\t/** Режим чтения: \"data-url\" (по умолчанию) или \"array-buffer\" */\n\treadMode?: ReadMode;\n\t/** Разрешить сброс нескольких файлов (по умолчанию true) */\n\tmultiple?: boolean;\n\n\t/** Блокировка компонента */\n\tdisabled?: boolean;\n\t/** CSS-класс обёртки */\n\tclassName?: string;\n\t/**\n\t * Кастомный контент внутри зоны.\n\t * По умолчанию отображается иконка загрузки и текст \"Перетащите файлы сюда\".\n\t */\n\tchildren?: ReactNode;\n}\n\n/**\n * DropZone — зона для перетаскивания файлов и выбора по клику.\n *\n * При наведении файла зона подсвечивается (пунктирная рамка меняет цвет).\n * При сбросе файлов каждый читается через readFile, успешные результаты\n * передаются в onDrop, ошибки — в onDropError.\n *\n * Поддерживает кастомный контент через children.\n * Если children не указан — отображается иконка загрузки и подсказка.\n */\nexport function DropZone({\n\tvalue,\n\tonChange,\n\tonChangeError,\n\taccept,\n\tallowedMime,\n\tmaxBytes,\n\treadMode,\n\tmultiple = true,\n\tdisabled,\n\tclassName,\n\tchildren\n}: DropZoneProps) {\n\tassertValidAllowedMime(allowedMime);\n\tassertValidAccept(accept);\n\n\t/** Счётчик вложенности drag-событий для корректной обработки dragLeave */\n\tconst dragCounter = useRef(0);\n\t/** Скрытый input для выбора файлов по клику */\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\t/** Состояние: файл перетаскивается над зоной */\n\tconst [isDragOver, setIsDragOver] = useState(false);\n\n\t/**\n\t * Формируем HTML-атрибут accept из accept или allowedMime.\n\t */\n\tconst acceptAttr = useMemo(() => {\n\t\tif (accept && accept.length > 0) {\n\t\t\treturn accept.join(\",\");\n\t\t}\n\t\tif (allowedMime && allowedMime.length > 0) {\n\t\t\treturn allowedMime.join(\",\");\n\t\t}\n\t\treturn \"*\";\n\t}, [allowedMime, accept]);\n\n\tconst readDroppedFile = useCallback(\n\t\t(file: File) => {\n\t\t\tif (readMode === \"array-buffer\") {\n\t\t\t\treturn readFile(file, { allowedMime, maxBytes, mode: \"array-buffer\" });\n\t\t\t}\n\n\t\t\treturn readFile(file, { allowedMime, maxBytes });\n\t\t},\n\t\t[allowedMime, maxBytes, readMode]\n\t);\n\n\tconst processFiles = useCallback(\n\t\tasync (files: File[]) => {\n\t\t\tif (disabled || files.length === 0) return;\n\n\t\t\tconst filesToProcess = multiple ? files : files.slice(0, 1);\n\t\t\tconst results: ReadFileResult[] = [];\n\n\t\t\tfor (const file of filesToProcess) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await readDroppedFile(file);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof ReadFileError && onChangeError) {\n\t\t\t\t\t\tonChangeError(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (results.length > 0) {\n\t\t\t\tonChange(results);\n\t\t\t}\n\t\t},\n\t\t[disabled, multiple, onChange, onChangeError, readDroppedFile]\n\t);\n\n\tconst openFileDialog = useCallback(() => {\n\t\tif (disabled) return;\n\n\t\tinputRef.current?.click();\n\t}, [disabled]);\n\n\t/**\n\t * Обработка dragEnter — увеличиваем счётчик и включаем подсветку.\n\t * Счётчик нужен потому что dragEnter/dragLeave срабатывают\n\t * на каждом дочернем элементе внутри зоны.\n\t */\n\tconst handleDragEnter = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\tdragCounter.current += 1;\n\t\t\tif (dragCounter.current === 1) {\n\t\t\t\tsetIsDragOver(true);\n\t\t\t}\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка dragOver — предотвращаем дефолтное поведение браузера\n\t * (иначе drop-событие не сработает).\n\t */\n\tconst handleDragOver = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\te.dataTransfer.dropEffect = \"copy\";\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка dragLeave — уменьшаем счётчик, выключаем подсветку при 0.\n\t */\n\tconst handleDragLeave = useCallback(\n\t\t(e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tif (disabled) return;\n\n\t\t\tdragCounter.current -= 1;\n\t\t\tif (dragCounter.current === 0) {\n\t\t\t\tsetIsDragOver(false);\n\t\t\t}\n\t\t},\n\t\t[disabled]\n\t);\n\n\t/**\n\t * Обработка drop — читаем сброшенные файлы через общую логику.\n\t */\n\tconst handleDrop = useCallback(\n\t\tasync (e: React.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// Сбрасываем состояние drag\n\t\t\tdragCounter.current = 0;\n\t\t\tsetIsDragOver(false);\n\n\t\t\tif (disabled) return;\n\n\t\t\tconst droppedFiles = Array.from(e.dataTransfer.files);\n\t\t\tawait processFiles(droppedFiles);\n\t\t},\n\t\t[disabled, processFiles]\n\t);\n\n\tconst handleInputChange = useCallback(\n\t\tasync (e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst selectedFiles = Array.from(e.target.files ?? []);\n\t\t\tawait processFiles(selectedFiles);\n\n\t\t\t// Сбрасываем значение, чтобы повторный выбор того же файла тоже вызывал change.\n\t\t\te.target.value = \"\";\n\t\t},\n\t\t[processFiles]\n\t);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\thandleKeyboardActivation(e, openFileDialog, { disabled });\n\t\t},\n\t\t[disabled, openFileDialog]\n\t);\n\n\treturn (\n\t\t<div>\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\thidden\n\t\t\t\tdisabled={disabled}\n\t\t\t\tmultiple={multiple}\n\t\t\t\taccept={acceptAttr}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tclassName={cn(styles.zone, isDragOver && styles.dragOver, disabled && styles.disabled, className)}\n\t\t\t\tonClick={openFileDialog}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonDragEnter={handleDragEnter}\n\t\t\t\tonDragOver={handleDragOver}\n\t\t\t\tonDragLeave={handleDragLeave}\n\t\t\t\tonDrop={handleDrop}\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\taria-disabled={disabled}>\n\t\t\t\t{children ?? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* Иконка загрузки по умолчанию */}\n\t\t\t\t\t\t<UploadIcon className={styles.icon} />\n\t\t\t\t\t\t{/* Текст подсказки */}\n\t\t\t\t\t\t<span className={styles.hint}>\n\t\t\t\t\t\t\t{multiple ? \"Перетащите файлы сюда или нажмите для выбора\" : \"Перетащите файл сюда или нажмите для выбора\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Список выбранных файлов */}\n\t\t\t<InputFilesList files={value} onChange={onChange} />\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}