@ryuzaki13/react-foundation-ui 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/dist/badge/Badge.d.ts.map +1 -1
  2. package/dist/badge/index.js +1 -1
  3. package/dist/badge/stories/Badge.stories.js +1 -1
  4. package/dist/base-table/index.js +1 -1
  5. package/dist/base-table/lib/columnPinning.d.ts.map +1 -1
  6. package/dist/base-table/model/useTableColumnOrder.d.ts +1 -1
  7. package/dist/base-table/model/useTableColumnOrder.d.ts.map +1 -1
  8. package/dist/base-table/model/useTableColumnSizing.d.ts +1 -1
  9. package/dist/base-table/model/useTableColumnSizing.d.ts.map +1 -1
  10. package/dist/base-table/ui/BaseTable.d.ts +2 -2
  11. package/dist/base-table/ui/BaseTable.d.ts.map +1 -1
  12. package/dist/base-table/ui/BaseTableHeaderCell.d.ts.map +1 -1
  13. package/dist/base-table/ui/FormattedTableCell.d.ts.map +1 -1
  14. package/dist/check-box/CheckBox.d.ts.map +1 -1
  15. package/dist/check-box/index.js +1 -1
  16. package/dist/check-box/stories/CheckBox.stories.js +1 -1
  17. package/dist/chunks/{BadgeList-DHW_Ktr3.js → BadgeList-6qL9oNAp.js} +5 -5
  18. package/dist/chunks/BadgeList-6qL9oNAp.js.map +1 -0
  19. package/dist/chunks/{CalendarView-B75faWIU.js → CalendarView-DjShdvRD.js} +42 -42
  20. package/dist/chunks/{CalendarView-B75faWIU.js.map → CalendarView-DjShdvRD.js.map} +1 -1
  21. package/dist/chunks/{CheckBox-Cck5w1Ud.js → CheckBox-CulnjNvJ.js} +9 -9
  22. package/dist/chunks/CheckBox-CulnjNvJ.js.map +1 -0
  23. package/dist/chunks/{DateInput-CINDYueM.js → DateInput-LSSvObtg.js} +3 -3
  24. package/dist/chunks/DateInput-LSSvObtg.js.map +1 -0
  25. package/dist/chunks/Dialog-BPS4BeWZ.js.map +1 -1
  26. package/dist/chunks/{DisclosureGroup-0BtaXO54.js → DisclosureGroup-Plk2M_Vl.js} +9 -9
  27. package/dist/chunks/DisclosureGroup-Plk2M_Vl.js.map +1 -0
  28. package/dist/chunks/{DropZone-hf7Em__0.js → DropZone-DPGTpHI6.js} +7 -7
  29. package/dist/chunks/DropZone-DPGTpHI6.js.map +1 -0
  30. package/dist/chunks/DropdownMenu-Ds-trH4M.js.map +1 -1
  31. package/dist/chunks/Flex-DbBdq336.js.map +1 -1
  32. package/dist/chunks/Grid-ByIIytjh.js.map +1 -1
  33. package/dist/chunks/{Input-Ce2HXBUc.js → Input-Wrew1puH.js} +30 -30
  34. package/dist/chunks/Input-Wrew1puH.js.map +1 -0
  35. package/dist/chunks/{InputDateTime-DPtY_4Od.js → InputDateTime-2PCX8an8.js} +2 -2
  36. package/dist/chunks/{InputDateTime-DPtY_4Od.js.map → InputDateTime-2PCX8an8.js.map} +1 -1
  37. package/dist/chunks/{InputFile-ga5yJmdZ.js → InputFile-Ca-bRo93.js} +2 -2
  38. package/dist/chunks/InputFile-Ca-bRo93.js.map +1 -0
  39. package/dist/chunks/{InputFiles-Or2Nvfgk.js → InputFiles-pI9rQXOI.js} +22 -22
  40. package/dist/chunks/InputFiles-pI9rQXOI.js.map +1 -0
  41. package/dist/chunks/{InputImage-BeA5WJz1.js → InputImage-B522AQzl.js} +2 -2
  42. package/dist/chunks/{InputImage-BeA5WJz1.js.map → InputImage-B522AQzl.js.map} +1 -1
  43. package/dist/chunks/{LabeledExpandableActionPanel-Bx-DWmYz.js → LabeledExpandableActionPanel-CWmOSWeS.js} +12 -12
  44. package/dist/chunks/LabeledExpandableActionPanel-CWmOSWeS.js.map +1 -0
  45. package/dist/chunks/{Listbox-CY1wQOCP.js → Listbox-B6F_IKQv.js} +22 -22
  46. package/dist/chunks/Listbox-B6F_IKQv.js.map +1 -0
  47. package/dist/chunks/{MultiSelect-CBqTylqO.js → MultiSelect-CUXA8gx-.js} +12 -12
  48. package/dist/chunks/{MultiSelect-CBqTylqO.js.map → MultiSelect-CUXA8gx-.js.map} +1 -1
  49. package/dist/chunks/{NotificationsHost-BQc-zOr2.js → NotificationsHost-Bnq7xFKO.js} +24 -24
  50. package/dist/chunks/NotificationsHost-Bnq7xFKO.js.map +1 -0
  51. package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js → PresetRangeDateInput-B_8jsilZ.js} +2 -2
  52. package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js.map → PresetRangeDateInput-B_8jsilZ.js.map} +1 -1
  53. package/dist/chunks/{RadioButton-DJp31HFR.js → RadioButton-D5vPW4Yr.js} +8 -8
  54. package/dist/chunks/RadioButton-D5vPW4Yr.js.map +1 -0
  55. package/dist/chunks/{Select-B7k_8_Lf.js → Select-CoAYWNOn.js} +10 -10
  56. package/dist/chunks/Select-CoAYWNOn.js.map +1 -0
  57. package/dist/chunks/{SerializableSelect-53uNCqdE.js → SerializableSelect-awBOWKTj.js} +2 -2
  58. package/dist/chunks/{SerializableSelect-53uNCqdE.js.map → SerializableSelect-awBOWKTj.js.map} +1 -1
  59. package/dist/chunks/{SingleDateTimeInput-CwvIbwje.js → SingleDateTimeInput-o44Vlwdk.js} +19 -19
  60. package/dist/chunks/SingleDateTimeInput-o44Vlwdk.js.map +1 -0
  61. package/dist/chunks/{StateSelect-D0wuUdT9.js → StateSelect-abZq176J.js} +2 -2
  62. package/dist/chunks/{StateSelect-D0wuUdT9.js.map → StateSelect-abZq176J.js.map} +1 -1
  63. package/dist/chunks/{Switch-B476FBUD.js → Switch-DHMnZVmN.js} +9 -9
  64. package/dist/chunks/Switch-DHMnZVmN.js.map +1 -0
  65. package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js → TextEditorLexicalClient-Dt4eaPA3.js} +4 -4
  66. package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js.map → TextEditorLexicalClient-Dt4eaPA3.js.map} +1 -1
  67. package/dist/chunks/{Textarea-DeJJjjkI.js → Textarea-DOVrPH4I.js} +2 -2
  68. package/dist/chunks/{Textarea-DeJJjjkI.js.map → Textarea-DOVrPH4I.js.map} +1 -1
  69. package/dist/chunks/TimePanel-_kF2RtHk.js.map +1 -1
  70. package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js → TreeMultiSelect-C76RYavo.js} +2 -2
  71. package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js.map → TreeMultiSelect-C76RYavo.js.map} +1 -1
  72. package/dist/chunks/{TreePickerBase-DYzTsSBQ.js → TreePickerBase-qNHIWbYL.js} +155 -155
  73. package/dist/chunks/TreePickerBase-qNHIWbYL.js.map +1 -0
  74. package/dist/chunks/{TreeSelect-DGLDu6qc.js → TreeSelect-LEhNdPCX.js} +2 -2
  75. package/dist/chunks/{TreeSelect-DGLDu6qc.js.map → TreeSelect-LEhNdPCX.js.map} +1 -1
  76. package/dist/chunks/{base-table-DVje02Zi.js → base-table-ij2guVMB.js} +3 -3
  77. package/dist/chunks/base-table-ij2guVMB.js.map +1 -0
  78. package/dist/chunks/{layout-picker-BA9vA8JI.js → layout-picker-CzZ8Xzkk.js} +9 -9
  79. package/dist/chunks/layout-picker-CzZ8Xzkk.js.map +1 -0
  80. package/dist/chunks/{misc-DrmMj8GO.js → misc-Bj0y3ERC.js} +54 -54
  81. package/dist/chunks/misc-Bj0y3ERC.js.map +1 -0
  82. package/dist/chunks/{modal-DqVcZws_.js → modal-B4ivQb2h.js} +10 -10
  83. package/dist/chunks/modal-B4ivQb2h.js.map +1 -0
  84. package/dist/chunks/{picker-Cj4RnJh6.js → picker-gIUs0nE_.js} +13 -13
  85. package/dist/chunks/picker-gIUs0nE_.js.map +1 -0
  86. package/dist/chunks/popover-C79P5bm2.js.map +1 -1
  87. package/dist/chunks/{slider-34wxzKkG.js → slider-CigVo4Ju.js} +3 -3
  88. package/dist/chunks/slider-CigVo4Ju.js.map +1 -0
  89. package/dist/chunks/{sortable-CwDHC3CA.js → sortable-BZqnZ_LA.js} +10 -10
  90. package/dist/chunks/sortable-BZqnZ_LA.js.map +1 -0
  91. package/dist/chunks/{table-BYA0hCj7.js → table-CK-CM2zD.js} +2 -2
  92. package/dist/chunks/table-CK-CM2zD.js.map +1 -0
  93. package/dist/chunks/table-column-interactions-DPyJDD7P.js.map +1 -1
  94. package/dist/chunks/{tabs-CjU2KCgs.js → tabs-D5ikIIng.js} +2 -2
  95. package/dist/chunks/{tabs-CjU2KCgs.js.map → tabs-D5ikIIng.js.map} +1 -1
  96. package/dist/context-menu/components/MenuContent.d.ts.map +1 -1
  97. package/dist/context-menu/components/MenuContext.d.ts.map +1 -1
  98. package/dist/context-menu/components/MenuRoot.d.ts.map +1 -1
  99. package/dist/context-menu/components/RadialMenuContent.d.ts.map +1 -1
  100. package/dist/date-input/index.js +2 -2
  101. package/dist/date-input/lib/types.d.ts.map +1 -1
  102. package/dist/date-input/stories/DateInput.stories.js +2 -2
  103. package/dist/date-input/ui/CalendarView.d.ts.map +1 -1
  104. package/dist/date-input/ui/DateInput.d.ts.map +1 -1
  105. package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +1 -1
  106. package/dist/date-time-input/index.js +1 -1
  107. package/dist/date-time-input/lib/dateTimeValue.d.ts.map +1 -1
  108. package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +1 -1
  109. package/dist/date-time-input/ui/SingleDateTimeInput.d.ts.map +1 -1
  110. package/dist/dialog/Dialog.d.ts.map +1 -1
  111. package/dist/disclosure/Disclosure.d.ts.map +1 -1
  112. package/dist/disclosure/index.js +1 -1
  113. package/dist/disclosure/stories/Disclosure.stories.js +1 -1
  114. package/dist/drop-zone/DropZone.d.ts.map +1 -1
  115. package/dist/drop-zone/index.js +1 -1
  116. package/dist/drop-zone/stories/DropZone.stories.d.ts.map +1 -1
  117. package/dist/drop-zone/stories/DropZone.stories.js +1 -1
  118. package/dist/drop-zone/stories/DropZone.stories.js.map +1 -1
  119. package/dist/errors/ErrorDisplay.d.ts.map +1 -1
  120. package/dist/errors/index.js.map +1 -1
  121. package/dist/expandable-action-panel/ExpandableActionPanel.d.ts.map +1 -1
  122. package/dist/expandable-action-panel/index.js +1 -1
  123. package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +4 -4
  124. package/dist/image/index.js +3 -3
  125. package/dist/image/index.js.map +1 -1
  126. package/dist/image/ui/ImageSelection.d.ts.map +1 -1
  127. package/dist/input/Input.d.ts.map +1 -1
  128. package/dist/input/index.js +1 -1
  129. package/dist/input/stories/Input.stories.js +1 -1
  130. package/dist/input-date-time/index.js +1 -1
  131. package/dist/input-date-time/stories/InputDateTime.stories.js +1 -1
  132. package/dist/input-file/InputFile.d.ts.map +1 -1
  133. package/dist/input-file/index.js +1 -1
  134. package/dist/input-file/stories/InputFile.stories.d.ts.map +1 -1
  135. package/dist/input-file/stories/InputFile.stories.js +1 -1
  136. package/dist/input-file/stories/InputFile.stories.js.map +1 -1
  137. package/dist/input-files/InputFilesList.d.ts.map +1 -1
  138. package/dist/input-files/index.js +1 -1
  139. package/dist/input-files/stories/InputFiles.stories.d.ts +1 -1
  140. package/dist/input-files/stories/InputFiles.stories.d.ts.map +1 -1
  141. package/dist/input-files/stories/InputFiles.stories.js +1 -1
  142. package/dist/input-files/stories/InputFiles.stories.js.map +1 -1
  143. package/dist/input-image/index.js +1 -1
  144. package/dist/input-image/stories/InputImage.stories.d.ts.map +1 -1
  145. package/dist/input-image/stories/InputImage.stories.js +1 -1
  146. package/dist/input-image/stories/InputImage.stories.js.map +1 -1
  147. package/dist/input-search/index.js +1 -1
  148. package/dist/layout-picker/index.js +1 -1
  149. package/dist/layout-picker/stories/LayoutPicker.stories.js +1 -1
  150. package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
  151. package/dist/list/List.d.ts.map +1 -1
  152. package/dist/list/index.js +5 -5
  153. package/dist/list/index.js.map +1 -1
  154. package/dist/listbox/Listbox.d.ts.map +1 -1
  155. package/dist/listbox/index.js +1 -1
  156. package/dist/listbox/stories/Listbox.stories.js +1 -1
  157. package/dist/misc/CopyTextWrapper.d.ts.map +1 -1
  158. package/dist/misc/OneStepScroller.d.ts.map +1 -1
  159. package/dist/misc/StateIcon.d.ts.map +1 -1
  160. package/dist/misc/index.js +1 -1
  161. package/dist/modal/Modal.d.ts +5 -1
  162. package/dist/modal/Modal.d.ts.map +1 -1
  163. package/dist/modal/index.js +1 -1
  164. package/dist/modal/stories/Modal.stories.js +2 -2
  165. package/dist/multi-select/index.js +1130 -24
  166. package/dist/multi-select/index.js.map +1 -1
  167. package/dist/multi-select/model/useODataMultiSelect.d.ts +23 -0
  168. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -0
  169. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  170. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  171. package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts +20 -0
  172. package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts.map +1 -0
  173. package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts +21 -0
  174. package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts.map +1 -0
  175. package/dist/multi-select/ui/ODataMultiSelect.d.ts +7 -0
  176. package/dist/multi-select/ui/ODataMultiSelect.d.ts.map +1 -0
  177. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  178. package/dist/multi-select/ui/index.d.ts +3 -0
  179. package/dist/multi-select/ui/index.d.ts.map +1 -1
  180. package/dist/multi-select/ui/stories/MultiSelect.stories.js +1 -1
  181. package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts +44 -0
  182. package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts.map +1 -0
  183. package/dist/notifications/index.js +1 -1
  184. package/dist/notifications/model/NotificationsProvider.d.ts.map +1 -1
  185. package/dist/notifications/ui/NotificationsHost.d.ts.map +1 -1
  186. package/dist/notifications/ui/stories/NotificationsHost.stories.js +1 -1
  187. package/dist/period-select/PeriodSelect.d.ts +1 -1
  188. package/dist/period-select/PeriodSelect.d.ts.map +1 -1
  189. package/dist/period-select/index.js.map +1 -1
  190. package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
  191. package/dist/period-select/stories/PeriodSelect.stories.d.ts.map +1 -1
  192. package/dist/period-select/stories/PeriodSelect.stories.js +1 -1
  193. package/dist/period-select/stories/PeriodSelect.stories.js.map +1 -1
  194. package/dist/picker/PickerPopup.d.ts.map +1 -1
  195. package/dist/picker/PickerTriggerActions.d.ts.map +1 -1
  196. package/dist/picker/index.js +1 -1
  197. package/dist/picker/model/usePickerFloatingListbox.d.ts.map +1 -1
  198. package/dist/popover/FloatingPopover.d.ts.map +1 -1
  199. package/dist/popover/components/PopoverContent.d.ts.map +1 -1
  200. package/dist/popover/components/PopoverContext.d.ts.map +1 -1
  201. package/dist/popover/stories/Popover.stories.js +1 -1
  202. package/dist/preset-range-date-input/index.js +1 -1
  203. package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +1 -1
  204. package/dist/preset-select/index.js +1 -1
  205. package/dist/radio-button/RadioButton.d.ts.map +1 -1
  206. package/dist/radio-button/index.js +1 -1
  207. package/dist/radio-button/stories/RadioButton.stories.js +1 -1
  208. package/dist/select/ODataSelect.d.ts +9 -0
  209. package/dist/select/ODataSelect.d.ts.map +1 -0
  210. package/dist/select/Select.d.ts.map +1 -1
  211. package/dist/select/index.js +2 -2
  212. package/dist/select/model/useODataSelect.d.ts +25 -0
  213. package/dist/select/model/useODataSelect.d.ts.map +1 -0
  214. package/dist/select/model/useODataSelectBase.d.ts +24 -0
  215. package/dist/select/model/useODataSelectBase.d.ts.map +1 -0
  216. package/dist/select/stories/ODataSelect.stories.d.ts +46 -0
  217. package/dist/select/stories/ODataSelect.stories.d.ts.map +1 -0
  218. package/dist/select/stories/Select.stories.js +1 -1
  219. package/dist/select/stories/SerializableSelect.stories.js +1 -1
  220. package/dist/select/stories/odataStoryFixtures.d.ts +35 -0
  221. package/dist/select/stories/odataStoryFixtures.d.ts.map +1 -0
  222. package/dist/simple-table/index.js +1 -1
  223. package/dist/simple-table/index.js.map +1 -1
  224. package/dist/slider/Slider.d.ts.map +1 -1
  225. package/dist/slider/index.js +1 -1
  226. package/dist/slider/stories/Slider.stories.js +1 -1
  227. package/dist/slider/stories/SliderInput.stories.js +1 -1
  228. package/dist/sortable/Sortable.d.ts.map +1 -1
  229. package/dist/sortable/SortableDragHandle.d.ts.map +1 -1
  230. package/dist/sortable/index.js +1 -1
  231. package/dist/sortable/stories/Sortable.stories.js +1 -1
  232. package/dist/state-select/index.js +1 -1
  233. package/dist/state-select/stories/StateSelect.stories.d.ts.map +1 -1
  234. package/dist/state-select/stories/StateSelect.stories.js +1 -1
  235. package/dist/state-select/stories/StateSelect.stories.js.map +1 -1
  236. package/dist/switch/Switch.d.ts.map +1 -1
  237. package/dist/switch/index.js +1 -1
  238. package/dist/switch/stories/Switch.stories.js +1 -1
  239. package/dist/table/Table.d.ts +1 -1
  240. package/dist/table/Table.d.ts.map +1 -1
  241. package/dist/table/index.js +1 -1
  242. package/dist/table/stories/Table.stories.d.ts +155 -0
  243. package/dist/table/stories/Table.stories.d.ts.map +1 -0
  244. package/dist/table-column-interactions/TableHeaderInteractionCell.d.ts.map +1 -1
  245. package/dist/tabs/index.js +1 -1
  246. package/dist/tabs/stories/Tabs.stories.d.ts.map +1 -1
  247. package/dist/tabs/stories/Tabs.stories.js +2 -2
  248. package/dist/tabs/stories/Tabs.stories.js.map +1 -1
  249. package/dist/text/TextOverflow.d.ts.map +1 -1
  250. package/dist/text/index.js.map +1 -1
  251. package/dist/text-editor/TextEditorLexicalClient.d.ts.map +1 -1
  252. package/dist/text-editor/index.js +2 -2
  253. package/dist/textarea/index.js +1 -1
  254. package/dist/textarea/stories/Textarea.stories.js +1 -1
  255. package/dist/tree-select/ODataTreeMultiSelect.d.ts +12 -0
  256. package/dist/tree-select/ODataTreeMultiSelect.d.ts.map +1 -0
  257. package/dist/tree-select/ODataTreeSelect.d.ts +13 -0
  258. package/dist/tree-select/ODataTreeSelect.d.ts.map +1 -0
  259. package/dist/tree-select/TreeNodeContent.d.ts.map +1 -1
  260. package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
  261. package/dist/tree-select/index.js +2 -2
  262. package/dist/tree-select/model/buildODataTreeNodes.d.ts +12 -0
  263. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -0
  264. package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts +4 -0
  265. package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts.map +1 -0
  266. package/dist/tree-select/model/useODataTreeData.d.ts +11 -0
  267. package/dist/tree-select/model/useODataTreeData.d.ts.map +1 -0
  268. package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts +55 -0
  269. package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts.map +1 -0
  270. package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts +54 -0
  271. package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts.map +1 -0
  272. package/dist/tree-select/stories/TreeMultiSelect.stories.js +1 -1
  273. package/dist/tree-select/stories/TreeSelect.stories.js +1 -1
  274. package/dist/tree-table/TreeTable.d.ts +1 -1
  275. package/dist/tree-table/TreeTable.d.ts.map +1 -1
  276. package/dist/tree-table/index.js +2 -2
  277. package/dist/tree-table/index.js.map +1 -1
  278. package/dist/tree-table/stories/TreeTable.stories.d.ts +158 -0
  279. package/dist/tree-table/stories/TreeTable.stories.d.ts.map +1 -0
  280. package/package.json +5 -4
  281. package/dist/chunks/BadgeList-DHW_Ktr3.js.map +0 -1
  282. package/dist/chunks/CheckBox-Cck5w1Ud.js.map +0 -1
  283. package/dist/chunks/DateInput-CINDYueM.js.map +0 -1
  284. package/dist/chunks/DisclosureGroup-0BtaXO54.js.map +0 -1
  285. package/dist/chunks/DropZone-hf7Em__0.js.map +0 -1
  286. package/dist/chunks/Input-Ce2HXBUc.js.map +0 -1
  287. package/dist/chunks/InputFile-ga5yJmdZ.js.map +0 -1
  288. package/dist/chunks/InputFiles-Or2Nvfgk.js.map +0 -1
  289. package/dist/chunks/LabeledExpandableActionPanel-Bx-DWmYz.js.map +0 -1
  290. package/dist/chunks/Listbox-CY1wQOCP.js.map +0 -1
  291. package/dist/chunks/NotificationsHost-BQc-zOr2.js.map +0 -1
  292. package/dist/chunks/RadioButton-DJp31HFR.js.map +0 -1
  293. package/dist/chunks/Select-B7k_8_Lf.js.map +0 -1
  294. package/dist/chunks/SingleDateTimeInput-CwvIbwje.js.map +0 -1
  295. package/dist/chunks/Switch-B476FBUD.js.map +0 -1
  296. package/dist/chunks/TreePickerBase-DYzTsSBQ.js.map +0 -1
  297. package/dist/chunks/base-table-DVje02Zi.js.map +0 -1
  298. package/dist/chunks/layout-picker-BA9vA8JI.js.map +0 -1
  299. package/dist/chunks/misc-DrmMj8GO.js.map +0 -1
  300. package/dist/chunks/modal-DqVcZws_.js.map +0 -1
  301. package/dist/chunks/picker-Cj4RnJh6.js.map +0 -1
  302. package/dist/chunks/slider-34wxzKkG.js.map +0 -1
  303. package/dist/chunks/sortable-CwDHC3CA.js.map +0 -1
  304. package/dist/chunks/table-BYA0hCj7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone.stories.js","names":[],"sources":["../../../src/drop-zone/stories/DropZone.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport { UploadCloudIcon } from \"lucide-react\";\n\nimport type { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\n\nimport { DropZone } from \"../DropZone\";\n\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst meta = {\n\ttitle: \"Shared/UI/DropZone\",\n\tcomponent: DropZone,\n\targs: {\n\t\tvalue: [],\n\t\tonChange: () => {},\n\t\tmultiple: true,\n\t\treadMode: \"data-url\",\n\t\tdisabled: false\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается с массивом успешно прочитанных файлов.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChangeError: {\n\t\t\tdescription: \"Вызывается при ошибке валидации или чтения файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Список допустимых MIME-типов для проверки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер одного файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения файлов: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\tmultiple: {\n\t\t\tdescription: \"Разрешает принимать несколько файлов за один drop.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует зону и обработку drop-событий.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tchildren: {\n\t\t\tdescription: \"Кастомный контент внутри drop-зоны.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tclassName: {\n\t\t\tdescription: \"Дополнительный CSS-класс контейнера.\",\n\t\t\tcontrol: \"text\"\n\t\t}\n\t}\n} satisfies Meta<typeof DropZone>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Basic: Story = {\n\trender: (args) => {\n\t\tconst [files, setFiles] = useState<ReadFileResult[]>([]);\n\n\t\treturn (\n\t\t\t<div style={{ display: \"grid\", gap: 12 }}>\n\t\t\t\t<DropZone {...args} onChange={(results) => setFiles(results)} />\n\t\t\t\t<div style={{ fontSize: 14 }}>\n\t\t\t\t\t{files.length > 0 ? `Получено файлов: ${files.length}` : \"Перетащите файл(ы) в область выше\"}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n};\n\nexport const SingleFile: Story = {\n\trender: (args) => (\n\t\t<DropZone {...args} multiple={false}>\n\t\t\t<div style={{ display: \"grid\", placeItems: \"center\", gap: 6, minHeight: 120 }}>\n\t\t\t\t<UploadCloudIcon />\n\t\t\t\t<span>Перетащите один файл</span>\n\t\t\t</div>\n\t\t</DropZone>\n\t),\n\targs: {\n\t\tmultiple: false\n\t}\n};\n\nexport const Disabled: Story = {\n\targs: {\n\t\tdisabled: true,\n\t\tmultiple: true\n\t}\n};\n"],"mappings":";;;;;AAUA,IAAM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,CAAC;EACR,gBAAgB,CAAC;EACjB,UAAU;EACV,UAAU;EACV,UAAU;CACX;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,eAAe;GACd,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,WAAW;GACV,aAAa;GACb,SAAS;EACV;CACD;AACD,GAKa,IAAe,EAC3B,SAAS,MAAS;CACjB,IAAM,CAAC,GAAO,KAAY,EAA2B,CAAC,CAAC;CAEvD,OACC,kBAAC,OAAD;EAAK,OAAO;GAAE,SAAS;GAAQ,KAAK;EAAG;YAAvC,CACC,kBAAC,GAAD;GAAU,GAAI;GAAM,WAAW,MAAY,EAAS,CAAO;EAAI,CAAA,GAC/D,kBAAC,OAAD;GAAK,OAAO,EAAE,UAAU,GAAG;aACzB,EAAM,SAAS,IAAI,oBAAoB,EAAM,WAAW;EACrD,CAAA,CACD;;AAEP,EACD,GAEa,IAAoB;CAChC,SAAS,MACR,kBAAC,GAAD;EAAU,GAAI;EAAM,UAAU;YAC7B,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAG,WAAW;GAAI;aAA5E,CACC,kBAAC,GAAD,CAAkB,CAAA,GAClB,kBAAC,QAAD,EAAA,UAAM,uBAA0B,CAAA,CAC5B;;CACI,CAAA;CAEX,MAAM,EACL,UAAU,GACX;AACD,GAEa,IAAkB,EAC9B,MAAM;CACL,UAAU;CACV,UAAU;AACX,EACD"}
1
+ {"version":3,"file":"DropZone.stories.js","names":[],"sources":["../../../src/drop-zone/stories/DropZone.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport { UploadCloudIcon } from \"lucide-react\";\n\nimport { DropZone } from \"../DropZone\";\n\nimport type { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst meta = {\n\ttitle: \"Shared/UI/DropZone\",\n\tcomponent: DropZone,\n\targs: {\n\t\tvalue: [],\n\t\tonChange: () => {},\n\t\tmultiple: true,\n\t\treadMode: \"data-url\",\n\t\tdisabled: false\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается с массивом успешно прочитанных файлов.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChangeError: {\n\t\t\tdescription: \"Вызывается при ошибке валидации или чтения файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Список допустимых MIME-типов для проверки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер одного файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения файлов: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\tmultiple: {\n\t\t\tdescription: \"Разрешает принимать несколько файлов за один drop.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует зону и обработку drop-событий.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tchildren: {\n\t\t\tdescription: \"Кастомный контент внутри drop-зоны.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tclassName: {\n\t\t\tdescription: \"Дополнительный CSS-класс контейнера.\",\n\t\t\tcontrol: \"text\"\n\t\t}\n\t}\n} satisfies Meta<typeof DropZone>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Basic: Story = {\n\trender: (args) => {\n\t\tconst [files, setFiles] = useState<ReadFileResult[]>([]);\n\n\t\treturn (\n\t\t\t<div style={{ display: \"grid\", gap: 12 }}>\n\t\t\t\t<DropZone {...args} onChange={(results) => setFiles(results)} />\n\t\t\t\t<div style={{ fontSize: 14 }}>\n\t\t\t\t\t{files.length > 0 ? `Получено файлов: ${files.length}` : \"Перетащите файл(ы) в область выше\"}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n};\n\nexport const SingleFile: Story = {\n\trender: (args) => (\n\t\t<DropZone {...args} multiple={false}>\n\t\t\t<div style={{ display: \"grid\", placeItems: \"center\", gap: 6, minHeight: 120 }}>\n\t\t\t\t<UploadCloudIcon />\n\t\t\t\t<span>Перетащите один файл</span>\n\t\t\t</div>\n\t\t</DropZone>\n\t),\n\targs: {\n\t\tmultiple: false\n\t}\n};\n\nexport const Disabled: Story = {\n\targs: {\n\t\tdisabled: true,\n\t\tmultiple: true\n\t}\n};\n"],"mappings":";;;;;AASA,IAAM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,CAAC;EACR,gBAAgB,CAAC;EACjB,UAAU;EACV,UAAU;EACV,UAAU;CACX;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,eAAe;GACd,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,WAAW;GACV,aAAa;GACb,SAAS;EACV;CACD;AACD,GAKa,IAAe,EAC3B,SAAS,MAAS;CACjB,IAAM,CAAC,GAAO,KAAY,EAA2B,CAAC,CAAC;CAEvD,OACC,kBAAC,OAAD;EAAK,OAAO;GAAE,SAAS;GAAQ,KAAK;EAAG;YAAvC,CACC,kBAAC,GAAD;GAAU,GAAI;GAAM,WAAW,MAAY,EAAS,CAAO;EAAI,CAAA,GAC/D,kBAAC,OAAD;GAAK,OAAO,EAAE,UAAU,GAAG;aACzB,EAAM,SAAS,IAAI,oBAAoB,EAAM,WAAW;EACrD,CAAA,CACD;;AAEP,EACD,GAEa,IAAoB;CAChC,SAAS,MACR,kBAAC,GAAD;EAAU,GAAI;EAAM,UAAU;YAC7B,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAG,WAAW;GAAI;aAA5E,CACC,kBAAC,GAAD,CAAkB,CAAA,GAClB,kBAAC,QAAD,EAAA,UAAM,uBAA0B,CAAA,CAC5B;;CACI,CAAA;CAEX,MAAM,EACL,UAAU,GACX;AACD,GAEa,IAAkB,EAC9B,MAAM;CACL,UAAU;CACV,UAAU;AACX,EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorDisplay.d.ts","sourceRoot":"","sources":["../../src/errors/ErrorDisplay.tsx"],"names":[],"mappings":"AAkBA,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA0DrG,CAAC"}
1
+ {"version":3,"file":"ErrorDisplay.d.ts","sourceRoot":"","sources":["../../src/errors/ErrorDisplay.tsx"],"names":[],"mappings":"AAiBA,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA0DrG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/errors/PageError.tsx","../../src/errors/BadRequestPage.tsx","../../src/errors/BoomExplosion.tsx","../../src/errors/constants.ts","../../src/errors/ForbiddenPage.tsx","../../src/errors/NotFoundPage.tsx","../../src/errors/ErrorDisplay.tsx","../../src/errors/ErrorBoundary.tsx","../../src/errors/ErrorExplosion.tsx","../../src/errors/SimpleErrorDisplay.tsx","../../src/errors/UnauthorizedPage.tsx","../../src/errors/ViewNotChanged.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flex } from \"../flex\";\n\ninterface PageErrorProps {\n\tcode: string | number;\n\ttitle: string;\n\tdescription: string;\n}\n\nexport const PageError: React.FC<PageErrorProps> = ({ code, title, description }) => {\n\treturn (\n\t\t<Flex.Predefined variant=\"columnCenter\" className=\"paddingXl\">\n\t\t\t<div aria-hidden=\"true\" className=\"content2 fontBolded\" style={{ fontSize: \"5em\" }}>\n\t\t\t\t{code}\n\t\t\t</div>\n\t\t\t<h2>{title}</h2>\n\t\t\t<p>{description}</p>\n\t\t\t{/* <Link to=\"/\">Вернуться на главную</Link> */}\n\t\t</Flex.Predefined>\n\t);\n};\n","import { PageError } from \"./PageError\";\n\nexport const BadRequestPage: React.FC = () => {\n\treturn (\n\t\t<PageError\n\t\t\tcode={400}\n\t\t\ttitle=\"Некорректный запрос\"\n\t\t\tdescription=\"Похоже, что запрос был сформирован неверно. Попробуйте обновить страницу или вернуться на главную.\"\n\t\t/>\n\t);\n};\n","import { useState } from \"react\";\n\nexport function BoomExplosion() {\n\tconst [transform] = useState(() => {\n\t\tconst scale = 0.7 + Math.random() * 0.3;\n\t\tconst rotate = Math.random() * 45 - 15;\n\t\treturn `scale(${scale}) rotateZ(${rotate}deg)`;\n\t});\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 300 300\"\n\t\t\twidth=\"300\"\n\t\t\theight=\"300\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: \"50%\",\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: `translate(-50%, -50%) ${transform}`,\n\t\t\t\tzIndex: 0,\n\t\t\t\topacity: 0.5\n\t\t\t}}>\n\t\t\t<polygon\n\t\t\t\tpoints=\"\n150,10 170,60 230,40 200,100 270,110 210,150 270,190 200,200 230,260 170,240 150,290 130,240\n70,260 100,200 30,190 90,150 30,110 100,100 70,40 130,60\"\n\t\t\t\tfill=\"var(--status-error-on-fill)\"\n\t\t\t\tstroke=\"var(--status-error-fill)\"\n\t\t\t\tstrokeWidth=\"5\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","export const ERROR_BOOM_MESSAGES = [\"Упс!\", \"Ой!\", \"Эх!\", \"Ай-ай-ай!\", \"Бах!\", \"Бум!\", \"Ого!\", \"Облом!\", \"Ёлки-палки!\", \"Хлоп!\"];\n","import { PageError } from \"./PageError\";\n\nexport const ForbiddenPage: React.FC = () => {\n\treturn <PageError code={403} title=\"Доступ запрещён\" description=\"У вас нет прав для просмотра этой страницы.\" />;\n};\n","import { PageError } from \"./PageError\";\n\nexport const NotFoundPage: React.FC = () => {\n\treturn <PageError code={404} title=\"Страница не найдена\" description=\"Извините, запрашиваемая страница не существует\" />;\n};\n","import { useEffect, useState } from \"react\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nimport { captureRuntimeErrorReport } from \"@ryuzaki13/react-foundation-lib/error-report\";\nimport { logError } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { BadRequestPage } from \"./BadRequestPage\";\nimport { BoomExplosion } from \"./BoomExplosion\";\nimport { ERROR_BOOM_MESSAGES } from \"./constants\";\nimport { ForbiddenPage } from \"./ForbiddenPage\";\nimport { NotFoundPage } from \"./NotFoundPage\";\n\nfunction getHttpStatusCode(error: Error): number | undefined {\n\tif (!(\"status\" in error) || typeof error.status !== \"number\") return undefined;\n\treturn error.status;\n}\n\nexport const ErrorDisplay: React.FC<{ error: Error; componentStack?: string; draftId?: string | null }> = ({\n\terror,\n\tcomponentStack,\n\tdraftId\n}) => {\n\tconst [randomValue] = useState(() => Math.random());\n\tconst queryClient = useQueryClient();\n\n\tuseEffect(() => {\n\t\tif (draftId !== undefined) return;\n\n\t\tvoid captureRuntimeErrorReport(\n\t\t\terror,\n\t\t\t{\n\t\t\t\tcategory: \"react\",\n\t\t\t\tcomponentStack\n\t\t\t},\n\t\t\tqueryClient\n\t\t);\n\t}, [componentStack, draftId, error, queryClient]);\n\n\tconst httpStatusCode = getHttpStatusCode(error);\n\n\tif (httpStatusCode) {\n\t\tswitch (httpStatusCode) {\n\t\t\tcase 400:\n\t\t\t\treturn <BadRequestPage />;\n\t\t\tcase 403:\n\t\t\t\treturn <ForbiddenPage />;\n\t\t\tcase 404:\n\t\t\t\treturn <NotFoundPage />;\n\t\t}\n\t}\n\n\tlogError(error.stack);\n\n\treturn (\n\t\t<section className=\"w100 h100 flexColumn justifyContentCenter paddingMd\">\n\t\t\t<div aria-hidden=\"true\" className=\"textCenter relative fontBolded statusError\" style={{ fontSize: \"4em\", marginBlock: \"2em\" }}>\n\t\t\t\t<BoomExplosion />\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttextShadow: \"1px -1px 1px var(--status-warning-border-focus), -1px 1px 1px var(--status-info-border-focus)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{ERROR_BOOM_MESSAGES[Math.floor(randomValue * ERROR_BOOM_MESSAGES.length)]}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"textCenter\">\n\t\t\t\t<h2 className=\"statusError\">Критическая ошибка</h2>\n\t\t\t\t<p className=\"statusError fontSizeLg\">\n\t\t\t\t\t<code>{error.message}</code>\n\t\t\t\t</p>\n\t\t\t\t<p>Попробуйте перезагрузить страницу или вернуться позже.</p>\n\t\t\t</div>\n\t\t</section>\n\t);\n};\n","import React, { Component } from \"react\";\n\nimport { captureRuntimeErrorReport } from \"@ryuzaki13/react-foundation-lib/error-report\";\n\nimport { ErrorDisplay } from \"./ErrorDisplay\";\n\ninterface ErrorBoundaryProps {\n\tchildren: React.ReactNode;\n\tcustomComponent?: React.ComponentType<{ error: Error }>;\n}\n\ntype ErrorBoundaryState = {\n\terror: Error | null;\n\tcomponentStack?: string;\n\tdraftId?: string | null;\n};\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error) {\n\t\treturn { error };\n\t}\n\n\tcomponentDidUpdate(prevProps: ErrorBoundaryProps) {\n\t\t// Сбрасываем ошибку при изменении children\n\t\tif (this.state.error && prevProps.children !== this.props.children) {\n\t\t\tthis.setState({ error: null, componentStack: undefined, draftId: undefined });\n\t\t}\n\t}\n\n\tcomponentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n\t\tthis.setState({ componentStack: errorInfo.componentStack ?? undefined, draftId: null });\n\n\t\tcaptureRuntimeErrorReport(error, {\n\t\t\tcategory: \"react\",\n\t\t\tcomponentStack: errorInfo.componentStack ?? undefined\n\t\t}).then((draft) => {\n\t\t\tif (draft && this.state.error === error) {\n\t\t\t\tthis.setState({ draftId: draft.reportId });\n\t\t\t}\n\t\t});\n\t}\n\n\trender() {\n\t\tif (this.state.error) {\n\t\t\tconst CustomComponent = this.props.customComponent;\n\t\t\treturn CustomComponent ? (\n\t\t\t\t<CustomComponent error={this.state.error} />\n\t\t\t) : (\n\t\t\t\t<ErrorDisplay error={this.state.error} componentStack={this.state.componentStack} draftId={this.state.draftId} />\n\t\t\t);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n","import React, { useState } from \"react\";\n\nimport { BoomExplosion } from \"./BoomExplosion\";\nimport { ERROR_BOOM_MESSAGES } from \"./constants\";\n\ninterface ErrorExplosionProps {\n\theader?: string;\n\tdescription?: string;\n}\n\nexport const ErrorExplosion: React.FC<ErrorExplosionProps> = ({ header, description }) => {\n\tconst [randomValue] = useState(() => Math.random());\n\n\treturn (\n\t\t<div className=\"container marginBlockLg\">\n\t\t\t<div aria-hidden=\"true\" className={\"textCenter relative fontBolded statusWarning marginBlockMd\"} style={{ fontSize: \"6em\" }}>\n\t\t\t\t<BoomExplosion />\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttextShadow: \"1px 0 1px var(--status-error-fill), -1px 0 1px var(--status-info-fill)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{ERROR_BOOM_MESSAGES[Math.floor(randomValue * ERROR_BOOM_MESSAGES.length)]}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flexColumn alignItemsCenter textCenter marginBlockMd\">\n\t\t\t\t{header && <h2 className=\"statusWarning\">{header}</h2>}\n\t\t\t\t{description && <p>{description}</p>}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { logError } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Text } from \"../text\";\n\nexport function SimpleErrorDisplay({ error }: { error: Error }) {\n\tlogError(error.stack);\n\n\treturn (\n\t\t<Text color=\"error\">\n\t\t\t<code>{error.message}</code>\n\t\t</Text>\n\t);\n}\n","import { PageError } from \"./PageError\";\n\nexport const UnauthorizedPage: React.FC = () => {\n\treturn (\n\t\t<PageError\n\t\t\tcode={401}\n\t\t\ttitle=\"Необходима авторизация\"\n\t\t\tdescription=\"Для доступа к этой странице нужно войти в систему. Пожалуйста, авторизуйтесь и попробуйте снова.\"\n\t\t/>\n\t);\n};\n","import React from \"react\";\n\nimport { Flex } from \"../flex\";\n\nexport const ViewNotChanged: React.FC = () => {\n\treturn (\n\t\t<Flex.Predefined variant=\"columnCenter\" className=\"paddingXl\">\n\t\t\t<h2 className=\"content2\">Выберите ракурс</h2>\n\t\t</Flex.Predefined>\n\t);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/errors/PageError.tsx","../../src/errors/BadRequestPage.tsx","../../src/errors/BoomExplosion.tsx","../../src/errors/constants.ts","../../src/errors/ForbiddenPage.tsx","../../src/errors/NotFoundPage.tsx","../../src/errors/ErrorDisplay.tsx","../../src/errors/ErrorBoundary.tsx","../../src/errors/ErrorExplosion.tsx","../../src/errors/SimpleErrorDisplay.tsx","../../src/errors/UnauthorizedPage.tsx","../../src/errors/ViewNotChanged.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flex } from \"../flex\";\n\ninterface PageErrorProps {\n\tcode: string | number;\n\ttitle: string;\n\tdescription: string;\n}\n\nexport const PageError: React.FC<PageErrorProps> = ({ code, title, description }) => {\n\treturn (\n\t\t<Flex.Predefined variant=\"columnCenter\" className=\"paddingXl\">\n\t\t\t<div aria-hidden=\"true\" className=\"content2 fontBolded\" style={{ fontSize: \"5em\" }}>\n\t\t\t\t{code}\n\t\t\t</div>\n\t\t\t<h2>{title}</h2>\n\t\t\t<p>{description}</p>\n\t\t\t{/* <Link to=\"/\">Вернуться на главную</Link> */}\n\t\t</Flex.Predefined>\n\t);\n};\n","import { PageError } from \"./PageError\";\n\nexport const BadRequestPage: React.FC = () => {\n\treturn (\n\t\t<PageError\n\t\t\tcode={400}\n\t\t\ttitle=\"Некорректный запрос\"\n\t\t\tdescription=\"Похоже, что запрос был сформирован неверно. Попробуйте обновить страницу или вернуться на главную.\"\n\t\t/>\n\t);\n};\n","import { useState } from \"react\";\n\nexport function BoomExplosion() {\n\tconst [transform] = useState(() => {\n\t\tconst scale = 0.7 + Math.random() * 0.3;\n\t\tconst rotate = Math.random() * 45 - 15;\n\t\treturn `scale(${scale}) rotateZ(${rotate}deg)`;\n\t});\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"0 0 300 300\"\n\t\t\twidth=\"300\"\n\t\t\theight=\"300\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\ttop: \"50%\",\n\t\t\t\tleft: \"50%\",\n\t\t\t\ttransform: `translate(-50%, -50%) ${transform}`,\n\t\t\t\tzIndex: 0,\n\t\t\t\topacity: 0.5\n\t\t\t}}>\n\t\t\t<polygon\n\t\t\t\tpoints=\"\n150,10 170,60 230,40 200,100 270,110 210,150 270,190 200,200 230,260 170,240 150,290 130,240\n70,260 100,200 30,190 90,150 30,110 100,100 70,40 130,60\"\n\t\t\t\tfill=\"var(--status-error-on-fill)\"\n\t\t\t\tstroke=\"var(--status-error-fill)\"\n\t\t\t\tstrokeWidth=\"5\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","export const ERROR_BOOM_MESSAGES = [\"Упс!\", \"Ой!\", \"Эх!\", \"Ай-ай-ай!\", \"Бах!\", \"Бум!\", \"Ого!\", \"Облом!\", \"Ёлки-палки!\", \"Хлоп!\"];\n","import { PageError } from \"./PageError\";\n\nexport const ForbiddenPage: React.FC = () => {\n\treturn <PageError code={403} title=\"Доступ запрещён\" description=\"У вас нет прав для просмотра этой страницы.\" />;\n};\n","import { PageError } from \"./PageError\";\n\nexport const NotFoundPage: React.FC = () => {\n\treturn <PageError code={404} title=\"Страница не найдена\" description=\"Извините, запрашиваемая страница не существует\" />;\n};\n","import { useEffect, useState } from \"react\";\n\nimport { captureRuntimeErrorReport } from \"@ryuzaki13/react-foundation-lib/error-report\";\nimport { logError } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nimport { BadRequestPage } from \"./BadRequestPage\";\nimport { BoomExplosion } from \"./BoomExplosion\";\nimport { ERROR_BOOM_MESSAGES } from \"./constants\";\nimport { ForbiddenPage } from \"./ForbiddenPage\";\nimport { NotFoundPage } from \"./NotFoundPage\";\n\nfunction getHttpStatusCode(error: Error): number | undefined {\n\tif (!(\"status\" in error) || typeof error.status !== \"number\") return undefined;\n\treturn error.status;\n}\n\nexport const ErrorDisplay: React.FC<{ error: Error; componentStack?: string; draftId?: string | null }> = ({\n\terror,\n\tcomponentStack,\n\tdraftId\n}) => {\n\tconst [randomValue] = useState(() => Math.random());\n\tconst queryClient = useQueryClient();\n\n\tuseEffect(() => {\n\t\tif (draftId !== undefined) return;\n\n\t\tvoid captureRuntimeErrorReport(\n\t\t\terror,\n\t\t\t{\n\t\t\t\tcategory: \"react\",\n\t\t\t\tcomponentStack\n\t\t\t},\n\t\t\tqueryClient\n\t\t);\n\t}, [componentStack, draftId, error, queryClient]);\n\n\tconst httpStatusCode = getHttpStatusCode(error);\n\n\tif (httpStatusCode) {\n\t\tswitch (httpStatusCode) {\n\t\t\tcase 400:\n\t\t\t\treturn <BadRequestPage />;\n\t\t\tcase 403:\n\t\t\t\treturn <ForbiddenPage />;\n\t\t\tcase 404:\n\t\t\t\treturn <NotFoundPage />;\n\t\t}\n\t}\n\n\tlogError(error.stack);\n\n\treturn (\n\t\t<section className=\"w100 h100 flexColumn justifyContentCenter paddingMd\">\n\t\t\t<div aria-hidden=\"true\" className=\"textCenter relative fontBolded statusError\" style={{ fontSize: \"4em\", marginBlock: \"2em\" }}>\n\t\t\t\t<BoomExplosion />\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttextShadow: \"1px -1px 1px var(--status-warning-border-focus), -1px 1px 1px var(--status-info-border-focus)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{ERROR_BOOM_MESSAGES[Math.floor(randomValue * ERROR_BOOM_MESSAGES.length)]}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"textCenter\">\n\t\t\t\t<h2 className=\"statusError\">Критическая ошибка</h2>\n\t\t\t\t<p className=\"statusError fontSizeLg\">\n\t\t\t\t\t<code>{error.message}</code>\n\t\t\t\t</p>\n\t\t\t\t<p>Попробуйте перезагрузить страницу или вернуться позже.</p>\n\t\t\t</div>\n\t\t</section>\n\t);\n};\n","import React, { Component } from \"react\";\n\nimport { captureRuntimeErrorReport } from \"@ryuzaki13/react-foundation-lib/error-report\";\n\nimport { ErrorDisplay } from \"./ErrorDisplay\";\n\ninterface ErrorBoundaryProps {\n\tchildren: React.ReactNode;\n\tcustomComponent?: React.ComponentType<{ error: Error }>;\n}\n\ntype ErrorBoundaryState = {\n\terror: Error | null;\n\tcomponentStack?: string;\n\tdraftId?: string | null;\n};\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error) {\n\t\treturn { error };\n\t}\n\n\tcomponentDidUpdate(prevProps: ErrorBoundaryProps) {\n\t\t// Сбрасываем ошибку при изменении children\n\t\tif (this.state.error && prevProps.children !== this.props.children) {\n\t\t\tthis.setState({ error: null, componentStack: undefined, draftId: undefined });\n\t\t}\n\t}\n\n\tcomponentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n\t\tthis.setState({ componentStack: errorInfo.componentStack ?? undefined, draftId: null });\n\n\t\tcaptureRuntimeErrorReport(error, {\n\t\t\tcategory: \"react\",\n\t\t\tcomponentStack: errorInfo.componentStack ?? undefined\n\t\t}).then((draft) => {\n\t\t\tif (draft && this.state.error === error) {\n\t\t\t\tthis.setState({ draftId: draft.reportId });\n\t\t\t}\n\t\t});\n\t}\n\n\trender() {\n\t\tif (this.state.error) {\n\t\t\tconst CustomComponent = this.props.customComponent;\n\t\t\treturn CustomComponent ? (\n\t\t\t\t<CustomComponent error={this.state.error} />\n\t\t\t) : (\n\t\t\t\t<ErrorDisplay error={this.state.error} componentStack={this.state.componentStack} draftId={this.state.draftId} />\n\t\t\t);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n","import React, { useState } from \"react\";\n\nimport { BoomExplosion } from \"./BoomExplosion\";\nimport { ERROR_BOOM_MESSAGES } from \"./constants\";\n\ninterface ErrorExplosionProps {\n\theader?: string;\n\tdescription?: string;\n}\n\nexport const ErrorExplosion: React.FC<ErrorExplosionProps> = ({ header, description }) => {\n\tconst [randomValue] = useState(() => Math.random());\n\n\treturn (\n\t\t<div className=\"container marginBlockLg\">\n\t\t\t<div aria-hidden=\"true\" className={\"textCenter relative fontBolded statusWarning marginBlockMd\"} style={{ fontSize: \"6em\" }}>\n\t\t\t\t<BoomExplosion />\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tzIndex: 1,\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\ttextShadow: \"1px 0 1px var(--status-error-fill), -1px 0 1px var(--status-info-fill)\"\n\t\t\t\t\t}}>\n\t\t\t\t\t{ERROR_BOOM_MESSAGES[Math.floor(randomValue * ERROR_BOOM_MESSAGES.length)]}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flexColumn alignItemsCenter textCenter marginBlockMd\">\n\t\t\t\t{header && <h2 className=\"statusWarning\">{header}</h2>}\n\t\t\t\t{description && <p>{description}</p>}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { logError } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Text } from \"../text\";\n\nexport function SimpleErrorDisplay({ error }: { error: Error }) {\n\tlogError(error.stack);\n\n\treturn (\n\t\t<Text color=\"error\">\n\t\t\t<code>{error.message}</code>\n\t\t</Text>\n\t);\n}\n","import { PageError } from \"./PageError\";\n\nexport const UnauthorizedPage: React.FC = () => {\n\treturn (\n\t\t<PageError\n\t\t\tcode={401}\n\t\t\ttitle=\"Необходима авторизация\"\n\t\t\tdescription=\"Для доступа к этой странице нужно войти в систему. Пожалуйста, авторизуйтесь и попробуйте снова.\"\n\t\t/>\n\t);\n};\n","import React from \"react\";\n\nimport { Flex } from \"../flex\";\n\nexport const ViewNotChanged: React.FC = () => {\n\treturn (\n\t\t<Flex.Predefined variant=\"columnCenter\" className=\"paddingXl\">\n\t\t\t<h2 className=\"content2\">Выберите ракурс</h2>\n\t\t</Flex.Predefined>\n\t);\n};\n"],"mappings":";;;;;;;;AAUA,IAAa,KAAuC,EAAE,SAAM,UAAO,qBAEjE,kBAAC,EAAK,YAAN;CAAiB,SAAQ;CAAe,WAAU;WAAlD;EACC,kBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAAsB,OAAO,EAAE,UAAU,MAAM;aAC/E;EACG,CAAA;EACL,kBAAC,MAAD,EAAA,UAAK,EAAU,CAAA;EACf,kBAAC,KAAD,EAAA,UAAI,EAAe,CAAA;CAEH;ICjBN,UAEX,kBAAC,GAAD;CACC,MAAM;CACN,OAAM;CACN,aAAY;AACZ,CAAA;;;ACNH,SAAgB,IAAgB;CAC/B,IAAM,CAAC,KAAa,QAGZ,SAFO,KAAM,KAAK,OAAO,IAAI,GAEd,YADP,KAAK,OAAO,IAAI,KAAK,GACK,KACzC;CAED,OACC,kBAAC,OAAD;EACC,SAAQ;EACR,OAAM;EACN,QAAO;EACP,OAAO;GACN,UAAU;GACV,KAAK;GACL,MAAM;GACN,WAAW,yBAAyB;GACpC,QAAQ;GACR,SAAS;EACV;YACA,kBAAC,WAAD;GACC,QAAO;GAGP,MAAK;GACL,QAAO;GACP,aAAY;GACZ,gBAAe;EACf,CAAA;CACG,CAAA;AAEP;;;ACjCA,IAAa,IAAsB;CAAC;CAAQ;CAAO;CAAO;CAAa;CAAQ;CAAQ;CAAQ;CAAU;CAAe;AAAO,GCElH,UACL,kBAAC,GAAD;CAAW,MAAM;CAAK,OAAM;CAAkB,aAAY;AAA+C,CAAA,GCDpG,UACL,kBAAC,GAAD;CAAW,MAAM;CAAK,OAAM;CAAsB,aAAY;AAAkD,CAAA;;;ACSxH,SAAS,EAAkB,GAAkC;CACxD,QAAE,YAAY,MAAU,OAAO,EAAM,UAAW,WACpD,OAAO,EAAM;AACd;AAEA,IAAa,KAA8F,EAC1G,UACA,mBACA,iBACK;CACL,IAAM,CAAC,KAAe,QAAe,KAAK,OAAO,CAAC,GAC5C,IAAc,EAAe;CAEnC,QAAgB;EACX,MAAY,KAAA,KAEhB,EACC,GACA;GACC,UAAU;GACV;EACD,GACA,CACD;CACD,GAAG;EAAC;EAAgB;EAAS;EAAO;CAAW,CAAC;CAEhD,IAAM,IAAiB,EAAkB,CAAK;CAE9C,IAAI,GACH,QAAQ,GAAR;EACC,KAAK,KACJ,OAAO,kBAAC,GAAD,CAAiB,CAAA;EACzB,KAAK,KACJ,OAAO,kBAAC,GAAD,CAAgB,CAAA;EACxB,KAAK,KACJ,OAAO,kBAAC,GAAD,CAAe,CAAA;CACxB;CAKD,OAFA,EAAS,EAAM,KAAK,GAGnB,kBAAC,WAAD;EAAS,WAAU;YAAnB,CACC,kBAAC,OAAD;GAAK,eAAY;GAAO,WAAU;GAA6C,OAAO;IAAE,UAAU;IAAO,aAAa;GAAM;aAA5H,CACC,kBAAC,GAAD,CAAgB,CAAA,GAChB,kBAAC,OAAD;IACC,OAAO;KACN,QAAQ;KACR,UAAU;KACV,YAAY;IACb;cACC,EAAoB,KAAK,MAAM,IAAc,EAAoB,MAAM;GACpE,CAAA,CACD;MACL,kBAAC,OAAD;GAAK,WAAU;aAAf;IACC,kBAAC,MAAD;KAAI,WAAU;eAAc;IAAsB,CAAA;IAClD,kBAAC,KAAD;KAAG,WAAU;eACZ,kBAAC,QAAD,EAAA,UAAO,EAAM,QAAc,CAAA;IACzB,CAAA;IACH,kBAAC,KAAD,EAAA,UAAG,yDAAyD,CAAA;GACxD;IACG;;AAEX,GC1Da,IAAb,cAAmC,EAAkD;CACpF,YAAY,GAA2B;EAEtC,AADA,MAAM,CAAK,GACX,KAAK,QAAQ,EAAE,OAAO,KAAK;CAC5B;CAEA,OAAO,yBAAyB,GAAc;EAC7C,OAAO,EAAE,SAAM;CAChB;CAEA,mBAAmB,GAA+B;EAEjD,AAAI,KAAK,MAAM,SAAS,EAAU,aAAa,KAAK,MAAM,YACzD,KAAK,SAAS;GAAE,OAAO;GAAM,gBAAgB,KAAA;GAAW,SAAS,KAAA;EAAU,CAAC;CAE9E;CAEA,kBAAkB,GAAc,GAA4B;EAG3D,AAFA,KAAK,SAAS;GAAE,gBAAgB,EAAU,kBAAkB,KAAA;GAAW,SAAS;EAAK,CAAC,GAEtF,EAA0B,GAAO;GAChC,UAAU;GACV,gBAAgB,EAAU,kBAAkB,KAAA;EAC7C,CAAC,CAAC,CAAC,MAAM,MAAU;GAClB,AAAI,KAAS,KAAK,MAAM,UAAU,KACjC,KAAK,SAAS,EAAE,SAAS,EAAM,SAAS,CAAC;EAE3C,CAAC;CACF;CAEA,SAAS;EACR,IAAI,KAAK,MAAM,OAAO;GACrB,IAAM,IAAkB,KAAK,MAAM;GACnC,OAAO,IACN,kBAAC,GAAD,EAAiB,OAAO,KAAK,MAAM,MAAQ,CAAA,IAE3C,kBAAC,GAAD;IAAc,OAAO,KAAK,MAAM;IAAO,gBAAgB,KAAK,MAAM;IAAgB,SAAS,KAAK,MAAM;GAAU,CAAA;EAElH;EAEA,OAAO,KAAK,MAAM;CACnB;AACD,GCjDa,KAAiD,EAAE,WAAQ,qBAAkB;CACzF,IAAM,CAAC,KAAe,QAAe,KAAK,OAAO,CAAC;CAElD,OACC,kBAAC,OAAD;EAAK,WAAU;YAAf,CACC,kBAAC,OAAD;GAAK,eAAY;GAAO,WAAW;GAA8D,OAAO,EAAE,UAAU,MAAM;aAA1H,CACC,kBAAC,GAAD,CAAgB,CAAA,GAChB,kBAAC,OAAD;IACC,OAAO;KACN,QAAQ;KACR,UAAU;KACV,YAAY;IACb;cACC,EAAoB,KAAK,MAAM,IAAc,EAAoB,MAAM;GACpE,CAAA,CACD;MACL,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,KAAU,kBAAC,MAAD;IAAI,WAAU;cAAiB;GAAW,CAAA,GACpD,KAAe,kBAAC,KAAD,EAAA,UAAI,EAAe,CAAA,CAC/B;IACD;;AAEP;;;AC5BA,SAAgB,EAAmB,EAAE,YAA2B;CAG/D,OAFA,EAAS,EAAM,KAAK,GAGnB,kBAAC,GAAD;EAAM,OAAM;YACX,kBAAC,QAAD,EAAA,UAAO,EAAM,QAAc,CAAA;CACtB,CAAA;AAER;;;ACVA,IAAa,UAEX,kBAAC,GAAD;CACC,MAAM;CACN,OAAM;CACN,aAAY;AACZ,CAAA,GCJU,UAEX,kBAAC,EAAK,YAAN;CAAiB,SAAQ;CAAe,WAAU;WACjD,kBAAC,MAAD;EAAI,WAAU;YAAW;CAAmB,CAAA;AAC5B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandableActionPanel.d.ts","sourceRoot":"","sources":["../../src/expandable-action-panel/ExpandableActionPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAgC,MAAM,OAAO,CAAC;AAW/E,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACrC,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,IAAI,EAAE,cAAc,EACpB,WAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,WAA8C,EAC9C,aAA0C,EAC1C,UAA8B,EAC9B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,EAAE,0BAA0B,qBAkD5B"}
1
+ {"version":3,"file":"ExpandableActionPanel.d.ts","sourceRoot":"","sources":["../../src/expandable-action-panel/ExpandableActionPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAgC,MAAM,OAAO,CAAC;AAU/E,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACrC,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,IAAI,EAAE,cAAc,EACpB,WAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,WAA8C,EAC9C,aAA0C,EAC1C,UAA8B,EAC9B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,EAAE,0BAA0B,qBAkD5B"}
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/LabeledExpandableActionPanel-Bx-DWmYz.js";
1
+ import { n as e, t } from "../chunks/LabeledExpandableActionPanel-CWmOSWeS.js";
2
2
  export { e as ExpandableActionPanel, t as LabeledExpandableActionPanel };
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "../../chunks/Button-BZ_b-Kin.js";
2
- import { t } from "../../chunks/CheckBox-Cck5w1Ud.js";
3
- import { a as n } from "../../chunks/Input-Ce2HXBUc.js";
4
- import { t as r } from "../../chunks/Select-B7k_8_Lf.js";
5
- import { n as i, t as a } from "../../chunks/LabeledExpandableActionPanel-Bx-DWmYz.js";
2
+ import { t } from "../../chunks/CheckBox-CulnjNvJ.js";
3
+ import { a as n } from "../../chunks/Input-Wrew1puH.js";
4
+ import { t as r } from "../../chunks/Select-CoAYWNOn.js";
5
+ import { n as i, t as a } from "../../chunks/LabeledExpandableActionPanel-CWmOSWeS.js";
6
6
  import { CheckIcon as o, RefreshCwIcon as s, SearchIcon as c, Settings2Icon as l } from "lucide-react";
7
7
  import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
8
8
  import { useState as p } from "react";
@@ -1,8 +1,8 @@
1
1
  import { r as e } from "../chunks/Grid-ByIIytjh.js";
2
2
  import { t } from "../chunks/Button-BZ_b-Kin.js";
3
- import { a as n } from "../chunks/Input-Ce2HXBUc.js";
4
- import { t as r } from "../chunks/InputFiles-Or2Nvfgk.js";
5
- import { i, n as a, r as o } from "../chunks/modal-DqVcZws_.js";
3
+ import { a as n } from "../chunks/Input-Wrew1puH.js";
4
+ import { t as r } from "../chunks/InputFiles-pI9rQXOI.js";
5
+ import { i, n as a, r as o } from "../chunks/modal-B4ivQb2h.js";
6
6
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
8
8
  import h from "react-easy-crop";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/image/ui/ImageCropper.tsx","../../src/image/ui/ImagePlaceholder.tsx","../../src/image/ui/ImageRenderer.tsx","../../src/image/ui/ImageSelection.tsx","../../src/image/ui/ImageView.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\nimport Cropper from \"react-easy-crop\";\n\nexport type CroppedAreaPixels = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n};\n\nexport function ImageCropper({\n\timage,\n\taspect = 1200 / 630,\n\twidth,\n\tonCropComplete\n}: {\n\timage: string;\n\taspect?: number;\n\twidth?: number;\n\tonCropComplete?: (croppedAreaPixels: CroppedAreaPixels) => void;\n}) {\n\tconst [crop, setCrop] = useState({ x: 0, y: 0 });\n\tconst [zoom, setZoom] = useState(1);\n\n\tconst handleCropComplete = useCallback(\n\t\t(_croppedArea: unknown, croppedAreaPixels: CroppedAreaPixels) => {\n\t\t\tonCropComplete?.(croppedAreaPixels);\n\t\t},\n\t\t[onCropComplete]\n\t);\n\n\treturn (\n\t\t<div style={{ position: \"relative\", width: width ?? \"100%\", aspectRatio: aspect }}>\n\t\t\t<Cropper\n\t\t\t\timage={image}\n\t\t\t\tcrop={crop}\n\t\t\t\tzoom={zoom}\n\t\t\t\taspect={aspect}\n\t\t\t\tonCropChange={setCrop}\n\t\t\t\tonZoomChange={setZoom}\n\t\t\t\tonCropComplete={handleCropComplete}\n\t\t\t\tzoomSpeed={0.1}\n\t\t\t\tobjectFit=\"contain\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","interface ImagePlaceholderProps {\n\twidth?: number | string;\n\theight?: number | string;\n\taspectRatio?: string | \"unset\";\n\tclassName?: string;\n}\n\nexport function ImagePlaceholder({ width = \"100%\", height = \"100%\", aspectRatio = \"16 / 9\", className }: ImagePlaceholderProps) {\n\treturn (\n\t\t<div style={{ width, height, aspectRatio }} className={className}>\n\t\t\t<svg\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\tviewBox=\"0 0 200 200\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\trole=\"img\"\n\t\t\t\tfill=\"none\"\n\t\t\t\trx=\"10\"\n\t\t\t\try=\"10\"\n\t\t\t\tstyle={{ display: \"block\" }}\n\t\t\t\taria-label=\"Изображение недоступно\">\n\t\t\t\t{/* <rect width=\"200\" height=\"200\" fill=\"var(--surface-2)\" rx=\"10\" ry=\"10\" /> */}\n\t\t\t\t<g fill=\"var(--surface-0)\">\n\t\t\t\t\t<rect x=\"40\" y=\"50\" width=\"120\" height=\"100\" rx=\"10\" />\n\n\t\t\t\t\t<circle cx=\"60\" cy=\"70\" r=\"8\" fill=\"var(--surface-2)\" />\n\n\t\t\t\t\t<path d=\"M50 130 L75 100 L100 130 Z\" fill=\"var(--surface-2)\" />\n\t\t\t\t\t<path d=\"M90 130 L120 90 L150 130 Z\" fill=\"var(--surface-2)\" />\n\n\t\t\t\t\t<line x1=\"160\" y1=\"40\" x2=\"40\" y2=\"160\" stroke=\"var(--surface-0)\" strokeWidth=\"15\" strokeLinecap=\"round\" />\n\t\t\t\t\t<line x1=\"160\" y1=\"40\" x2=\"40\" y2=\"160\" stroke=\"var(--surface-2)\" strokeWidth=\"5\" strokeLinecap=\"round\" />\n\t\t\t\t</g>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import { type CSSProperties, type ImgHTMLAttributes, type ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { ImagePlaceholder } from \"./ImagePlaceholder\";\n\nexport type ImageSource = {\n\tsrcSet: string;\n\ttype?: string;\n\tsizes?: string;\n};\n\nexport interface ImageRendererProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n\tsrc: string;\n\tsources?: readonly ImageSource[];\n\talt?: string;\n\trole?: string;\n\tariaLabel?: string;\n\tcaption?: string;\n\tfallback?: ReactNode;\n\tuseFigure?: boolean;\n\taspectRatio?: string | \"unset\";\n\twrapperStyle?: CSSProperties;\n}\n\n/**\n * Базовый рендер изображения: lazy-появление, placeholder, обработка ошибки и figure/caption.\n * Компонент не знает, как устроено хранилище и какие форматы/размеры доступны.\n */\nexport function ImageRenderer({\n\tsrc,\n\tsources,\n\talt,\n\trole,\n\tariaLabel,\n\tcaption,\n\tfallback,\n\tuseFigure = false,\n\twidth = \"100%\",\n\theight = \"100%\",\n\taspectRatio = \"16 / 9\",\n\tstyle,\n\twrapperStyle,\n\t...imgProps\n}: ImageRendererProps) {\n\tconst wrapperRef = useRef<HTMLDivElement | null>(null);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [hasLoaded, setHasLoaded] = useState(false);\n\tconst [hasError, setHasError] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst observer = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tconst parentWidth = Math.round(entry.boundingClientRect.width);\n\n\t\t\t\t\tsetContainerWidth(parentWidth);\n\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"100px\", threshold: 0.01 }\n\t\t);\n\n\t\tif (wrapperRef.current) {\n\t\t\tobserver.observe(wrapperRef.current);\n\t\t}\n\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tconst sizesAttr = containerWidth ? `${containerWidth}px` : \"100vw\";\n\tconst defaultFallback = <ImagePlaceholder width={width} height={height} aspectRatio={aspectRatio} />;\n\n\tconst content = (\n\t\t<>\n\t\t\t{!hasLoaded && !hasError && (fallback || defaultFallback)}\n\t\t\t{isVisible && !hasError && (\n\t\t\t\t<picture>\n\t\t\t\t\t{sources?.map((source) => (\n\t\t\t\t\t\t<source\n\t\t\t\t\t\t\tkey={`${source.type ?? \"source\"}-${source.srcSet}`}\n\t\t\t\t\t\t\tsrcSet={source.srcSet}\n\t\t\t\t\t\t\ttype={source.type}\n\t\t\t\t\t\t\tsizes={source.sizes ?? sizesAttr}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\trole={role}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tonLoad={() => setHasLoaded(true)}\n\t\t\t\t\t\tonError={() => setHasError(true)}\n\t\t\t\t\t\tstyle={!hasLoaded ? { display: \"none\" } : { width: \"100%\", height: \"100%\", objectFit: \"cover\", ...style }}\n\t\t\t\t\t\taria-busy={!hasLoaded}\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t{...imgProps}\n\t\t\t\t\t/>\n\t\t\t\t</picture>\n\t\t\t)}\n\t\t\t{hasError && defaultFallback}\n\t\t</>\n\t);\n\n\tconst wrapped = (\n\t\t<div ref={wrapperRef} style={{ width, height, aspectRatio, ...wrapperStyle }}>\n\t\t\t{content}\n\t\t</div>\n\t);\n\n\treturn useFigure ? (\n\t\t<figure className=\"relative\">\n\t\t\t{wrapped}\n\t\t\t{caption && (\n\t\t\t\t<figcaption\n\t\t\t\t\tstyle={{ bottom: 2, right: 2, maxWidth: \"calc(100% - 4px)\" }}\n\t\t\t\t\tclassName=\"absolute paddingInlineMd textRight radiusSm fontSizeSm\">\n\t\t\t\t\t{caption}\n\t\t\t\t</figcaption>\n\t\t\t)}\n\t\t</figure>\n\t) : (\n\t\twrapped\n\t);\n}\n","import { CSSProperties, ReactNode, useCallback, useMemo, useState } from \"react\";\n\nimport Cropper from \"react-easy-crop\";\n\nimport { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\n\nimport { Button } from \"../../button\";\nimport { GridContainer } from \"../../grid\";\nimport { InputText } from \"../../input\";\nimport { InputFiles } from \"../../input-files\";\nimport { Modal, ModalContent, ModalFooter } from \"../../modal\";\n\nimport { CroppedAreaPixels } from \"./ImageCropper\";\n\ntype SelectedImageFile = Extract<ReadFileResult, { mode: \"data-url\" }>;\n\n/**\n * Данные одного выбранного изображения, которые нужны вызывающему коду:\n * исходный файл, пользовательское описание и выбранная область обрезки.\n */\nexport type SelectedImageData = {\n\tfile: SelectedImageFile;\n\talt: string;\n\tcrop?: CroppedAreaPixels;\n};\n\ninterface ImageSelectionPanelProps {\n\taspect?: number;\n\tdisabled?: boolean;\n\tvalue?: SelectedImageData[];\n\tdefaultValue?: SelectedImageData[];\n\tonChange?: (data: SelectedImageData[]) => void;\n\tonApply?: (data: SelectedImageData[]) => void;\n\trenderActions?: (data: ImageSelectionActionsData) => ReactNode;\n}\n\ninterface ImageSelectionModalProps extends ImageSelectionPanelProps {\n\tisOpen?: boolean;\n\tonClose?: () => void;\n\ttitle?: string;\n}\n\ninterface ImageSelectionActionsData {\n\tvalue: SelectedImageData[];\n\tactiveIndex: number;\n\thasSelected: boolean;\n\tcanApply: boolean;\n\tapply: () => void;\n}\n\ninterface ImageSelectionState extends ImageSelectionActionsData {\n\tfiles: SelectedImageFile[];\n\tactiveImage?: SelectedImageData;\n\tactiveCropperState: ImageCropperState;\n\tsetFiles: (files: SelectedImageFile[]) => void;\n\tsetActiveIndex: (index: number) => void;\n\tsetActiveAlt: (alt: string) => void;\n\tsetActiveCrop: (crop: CroppedAreaPixels) => void;\n\tsetActiveCropperCrop: (crop: CropperPoint) => void;\n\tsetActiveCropperZoom: (zoom: number) => void;\n}\n\ntype ImageSize = {\n\twidth: number;\n\theight: number;\n};\n\ntype CropperPoint = {\n\tx: number;\n\ty: number;\n};\n\ntype ImageCropperState = {\n\tcrop: CropperPoint;\n\tzoom: number;\n};\n\nfunction getImageKey(image: SelectedImageData, index: number) {\n\treturn `${image.file.meta.name}-${image.file.meta.size}-${image.file.meta.lastModified}-${index}`;\n}\n\n/**\n * Хранит черновик выбора изображений локально даже в controlled-режиме.\n * Это позволяет не дергать внешний onChange на каждый onCropComplete,\n * а отправлять готовый массив только при явном применении.\n */\nfunction useImageSelectionState({\n\tvalue,\n\tdefaultValue,\n\tdisabled,\n\tonChange,\n\tonApply\n}: Pick<ImageSelectionPanelProps, \"value\" | \"defaultValue\" | \"disabled\" | \"onChange\" | \"onApply\">): ImageSelectionState {\n\tconst isControlled = value !== undefined;\n\tconst [draftValue, setDraftValue] = useState<SelectedImageData[]>(value ?? defaultValue ?? []);\n\tconst [controlledValueSnapshot, setControlledValueSnapshot] = useState(value);\n\tconst [requestedActiveIndex, setActiveIndex] = useState(0);\n\tconst [cropperStateByImage, setCropperStateByImage] = useState<Record<string, ImageCropperState>>({});\n\n\tif (isControlled && value !== controlledValueSnapshot) {\n\t\tsetControlledValueSnapshot(value);\n\t\tsetDraftValue(value ?? []);\n\t}\n\n\tconst updateDraftValue = useCallback((updater: (currentValue: SelectedImageData[]) => SelectedImageData[]) => {\n\t\tsetDraftValue((currentValue) => updater(currentValue));\n\t}, []);\n\n\tconst files = useMemo(() => draftValue.map((image) => image.file), [draftValue]);\n\tconst activeIndex = draftValue.length === 0 ? 0 : Math.min(requestedActiveIndex, draftValue.length - 1);\n\tconst activeImage = draftValue[activeIndex];\n\tconst activeImageKey = activeImage ? getImageKey(activeImage, activeIndex) : undefined;\n\tconst activeCropperState = activeImageKey\n\t\t? (cropperStateByImage[activeImageKey] ?? { crop: { x: 0, y: 0 }, zoom: 1 })\n\t\t: { crop: { x: 0, y: 0 }, zoom: 1 };\n\tconst hasSelected = draftValue.length > 0;\n\tconst canApply = !disabled && hasSelected && draftValue.every((image) => image.alt.trim() && image.crop);\n\n\tconst setFiles = useCallback(\n\t\t(nextFiles: SelectedImageFile[]) => {\n\t\t\tupdateDraftValue((currentValue) =>\n\t\t\t\tnextFiles.map((file) => {\n\t\t\t\t\t// Сохраняем alt и crop при переключении, удалении и добавлении файлов.\n\t\t\t\t\tconst existingImage = currentValue.find((image) => image.file.file === file.file);\n\n\t\t\t\t\tif (existingImage) {\n\t\t\t\t\t\treturn { ...existingImage, file };\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { file, alt: \"\" };\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[updateDraftValue]\n\t);\n\n\tconst setActiveAlt = useCallback(\n\t\t(alt: string) => {\n\t\t\tupdateDraftValue((currentValue) => currentValue.map((image, index) => (index === activeIndex ? { ...image, alt } : image)));\n\t\t},\n\t\t[activeIndex, updateDraftValue]\n\t);\n\n\tconst setActiveCrop = useCallback(\n\t\t(crop: CroppedAreaPixels) => {\n\t\t\tupdateDraftValue((currentValue) => currentValue.map((image, index) => (index === activeIndex ? { ...image, crop } : image)));\n\t\t},\n\t\t[activeIndex, updateDraftValue]\n\t);\n\n\tconst setActiveCropperCrop = useCallback(\n\t\t(crop: CropperPoint) => {\n\t\t\tif (!activeImageKey) return;\n\n\t\t\tsetCropperStateByImage((currentState) => ({\n\t\t\t\t...currentState,\n\t\t\t\t[activeImageKey]: {\n\t\t\t\t\tcrop,\n\t\t\t\t\tzoom: currentState[activeImageKey]?.zoom ?? 1\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\t[activeImageKey]\n\t);\n\n\tconst setActiveCropperZoom = useCallback(\n\t\t(zoom: number) => {\n\t\t\tif (!activeImageKey) return;\n\n\t\t\tsetCropperStateByImage((currentState) => ({\n\t\t\t\t...currentState,\n\t\t\t\t[activeImageKey]: {\n\t\t\t\t\tcrop: currentState[activeImageKey]?.crop ?? { x: 0, y: 0 },\n\t\t\t\t\tzoom\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\t[activeImageKey]\n\t);\n\n\tconst apply = useCallback(() => {\n\t\tonChange?.(draftValue);\n\t\tonApply?.(draftValue);\n\t}, [draftValue, onApply, onChange]);\n\n\treturn {\n\t\tvalue: draftValue,\n\t\tfiles,\n\t\tactiveIndex,\n\t\tactiveImage,\n\t\tactiveCropperState,\n\t\thasSelected,\n\t\tcanApply,\n\t\tapply,\n\t\tsetFiles,\n\t\tsetActiveIndex,\n\t\tsetActiveAlt,\n\t\tsetActiveCrop,\n\t\tsetActiveCropperCrop,\n\t\tsetActiveCropperZoom\n\t};\n}\n\nfunction resolveImageUploadMaxBytes(): number | undefined {\n\tif (typeof __IMAGE_UPLOAD_MAX_BYTES__ !== \"number\") return undefined;\n\treturn __IMAGE_UPLOAD_MAX_BYTES__;\n}\n\nfunction getPreviewImageStyle(image: SelectedImageData, size: ImageSize | undefined, aspect: number): CSSProperties {\n\tif (!image.crop || !size) {\n\t\treturn {\n\t\t\twidth: \"100%\",\n\t\t\taspectRatio: aspect,\n\t\t\tobjectFit: \"cover\",\n\t\t\tdisplay: \"block\"\n\t\t};\n\t}\n\n\tconst crop = image.crop;\n\n\t// Миниатюра масштабирует исходник так, чтобы видимой оставалась только выбранная область crop.\n\treturn {\n\t\tposition: \"absolute\",\n\t\tleft: `${-(crop.x / crop.width) * 100}%`,\n\t\ttop: `${-(crop.y / crop.height) * 100}%`,\n\t\twidth: `${(size.width / crop.width) * 100}%`,\n\t\theight: `${(size.height / crop.height) * 100}%`,\n\t\tmaxWidth: \"none\"\n\t};\n}\n\nfunction ImageSelectionFields({ aspect = 16 / 9, disabled, state }: { aspect?: number; disabled?: boolean; state: ImageSelectionState }) {\n\tconst area = state.activeImage?.crop;\n\tconst [imageSizes, setImageSizes] = useState<Record<string, ImageSize>>({});\n\n\treturn (\n\t\t<GridContainer gap=\"md\">\n\t\t\t<InputFiles\n\t\t\t\tlabel=\"Файл изображения\"\n\t\t\t\tallowedMime={[\"image/jpeg\", \"image/png\", \"image/webp\", \"image/avif\"]}\n\t\t\t\tvalue={state.files}\n\t\t\t\tonChange={state.setFiles}\n\t\t\t\tmaxBytes={resolveImageUploadMaxBytes()}\n\t\t\t\tonReadError={(e) => console.log(\"e\", e)}\n\t\t\t/>\n\n\t\t\t{state.hasSelected && state.activeImage && (\n\t\t\t\t<div>\n\t\t\t\t\t<GridContainer templateColumns=\"repeat(auto-fill, minmax(10em, 1fr))\" gap=\"xs\">\n\t\t\t\t\t\t{state.value.map((image, index) => {\n\t\t\t\t\t\t\tconst imageKey = getImageKey(image, index);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={imageKey}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonClick={() => state.setActiveIndex(index)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\tborder: index === state.activeIndex ? \"2px solid var(--border-accent)\" : \"2px solid transparent\",\n\t\t\t\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t\t\t\t\tcursor: disabled ? \"default\" : \"pointer\"\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: aspect,\n\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\"\n\t\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\tsrc={image.file.dataUrl}\n\t\t\t\t\t\t\t\t\t\t\tstyle={getPreviewImageStyle(image, imageSizes[imageKey], aspect)}\n\t\t\t\t\t\t\t\t\t\t\tonLoad={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\n\n\t\t\t\t\t\t\t\t\t\t\t\tsetImageSizes((currentSizes) => ({\n\t\t\t\t\t\t\t\t\t\t\t\t\t...currentSizes,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[imageKey]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: target.naturalWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: target.naturalHeight\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</GridContainer>\n\t\t\t\t\t<div>\n\t\t\t\t\t\tВыберите область изображения{\" \"}\n\t\t\t\t\t\t{area &&\n\t\t\t\t\t\t\t(area.width < 1200 ? (\n\t\t\t\t\t\t\t\t<code className=\"statusError\">\n\t\t\t\t\t\t\t\t\t{area.width}x{area.height} - низкое качество изображения!\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<code className=\"statusSuccess\">\n\t\t\t\t\t\t\t\t\t{area.width}x{area.height}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div style={{ position: \"relative\", width: \"100%\", aspectRatio: aspect }}>\n\t\t\t\t\t\t<Cropper\n\t\t\t\t\t\t\tkey={getImageKey(state.activeImage, state.activeIndex)}\n\t\t\t\t\t\t\timage={state.activeImage.file.dataUrl}\n\t\t\t\t\t\t\tcrop={state.activeCropperState.crop}\n\t\t\t\t\t\t\tzoom={state.activeCropperState.zoom}\n\t\t\t\t\t\t\taspect={aspect}\n\t\t\t\t\t\t\tonCropChange={state.setActiveCropperCrop}\n\t\t\t\t\t\t\tonZoomChange={state.setActiveCropperZoom}\n\t\t\t\t\t\t\tonCropComplete={(_croppedArea, croppedAreaPixels) => state.setActiveCrop(croppedAreaPixels)}\n\t\t\t\t\t\t\tzoomSpeed={0.1}\n\t\t\t\t\t\t\tobjectFit=\"contain\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<InputText\n\t\t\t\trequired\n\t\t\t\tdisabled={!state.hasSelected || disabled}\n\t\t\t\tlabel=\"Краткое описание изображения\"\n\t\t\t\tplaceholder=\"\"\n\t\t\t\tvalue={state.activeImage?.alt ?? \"\"}\n\t\t\t\tonChange={state.setActiveAlt}\n\t\t\t/>\n\t\t</GridContainer>\n\t);\n}\n\nexport function ImageSelectionPanel({ aspect = 16 / 9, disabled, renderActions, ...props }: ImageSelectionPanelProps) {\n\tconst state = useImageSelectionState({ ...props, disabled });\n\tconst actionsData = {\n\t\tvalue: state.value,\n\t\tactiveIndex: state.activeIndex,\n\t\thasSelected: state.hasSelected,\n\t\tcanApply: state.canApply,\n\t\tapply: state.apply\n\t};\n\tconst hasApplyHandler = props.onChange !== undefined || props.onApply !== undefined;\n\n\treturn (\n\t\t<>\n\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t{renderActions\n\t\t\t\t? renderActions(actionsData)\n\t\t\t\t: hasApplyHandler && (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Button disabled={!state.canApply} tone=\"success\" onClick={state.apply}>\n\t\t\t\t\t\t\t\tПрименить\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t</>\n\t);\n}\n\nexport function ImageSelectionModal({\n\taspect = 16 / 9,\n\tdisabled,\n\tisOpen = true,\n\tonClose = () => {},\n\ttitle = \"Загрузка нового изображения\",\n\t...props\n}: ImageSelectionModalProps) {\n\tconst state = useImageSelectionState({ ...props, disabled });\n\tconst hasApplyHandler = props.onChange !== undefined || props.onApply !== undefined;\n\n\tif (!hasApplyHandler) {\n\t\treturn (\n\t\t\t<Modal isOpen={isOpen} onClose={onClose} title={title} size=\"xl\">\n\t\t\t\t<ModalContent scrollable>\n\t\t\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t\t</ModalContent>\n\t\t\t</Modal>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={title} size=\"xl\">\n\t\t\t<ModalContent scrollable>\n\t\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button disabled={!state.canApply} tone=\"success\" onClick={state.apply}>\n\t\t\t\t\tПрименить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type ImgHTMLAttributes, type ReactNode } from \"react\";\n\nimport { ImageRenderer, type ImageSource } from \"./ImageRenderer\";\n\nexport type ImageFormat = \"avif\" | \"webp\" | \"jpeg\" | \"jpg\" | \"png\";\n\nconst DEFAULT_SET_WIDTHS = [2880, 1920, 1280, 640, 320] as const;\nconst DEFAULT_SET_FORMATS = [\"avif\", \"webp\"] as const satisfies readonly ImageFormat[];\n\nexport type StoredImageData = {\n\tfilename: string;\n\tpath: string;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n\thasSet?: boolean;\n};\n\ninterface ImageViewProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"alt\"> {\n\t/** Запись из таблицы Image. Предпочтительный способ передать изображение из БД. */\n\timage?: StoredImageData;\n\t/** Базовое имя файла из БД. Для новых изображений это md5 без расширения. */\n\tsrc?: string;\n\t/** Путь из БД относительно публичного корня, например `images/articles`. */\n\tpath?: string;\n\talt?: string;\n\trole?: string;\n\tariaLabel?: string;\n\tcaption?: string;\n\tfallback?: ReactNode;\n\tuseFigure?: boolean;\n\taspectRatio?: string | \"unset\";\n\t/** Форматы, которые реально лежат в хранилище для текущего изображения. */\n\tformats?: readonly ImageFormat[];\n\t/** Формат для img.src. Должен существовать в хранилище. */\n\tfallbackFormat?: ImageFormat;\n\t/** Набор размеров для файлов вида base@width.format. */\n\tvariantWidths?: readonly number[];\n\t/** Признак наличия responsive-набора. Если false, @size srcSet не строится. */\n\thasSet?: boolean;\n}\n\nfunction getImageMime(format: ImageFormat): string {\n\tif (format === \"jpg\" || format === \"jpeg\") {\n\t\treturn \"image/jpeg\";\n\t}\n\n\treturn `image/${format}`;\n}\n\nfunction normalizeImagePath(path?: string): string {\n\tif (!path) return \"\";\n\n\treturn path.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction buildImageBasePath(path: string | undefined, filename: string): string {\n\tconst normalizedPath = normalizeImagePath(path);\n\n\treturn normalizedPath ? `/${normalizedPath}/${filename}` : `/${filename}`;\n}\n\nfunction buildImageSources({\n\tbasePath,\n\tformats,\n\tvariantWidths,\n\thasSet\n}: {\n\tbasePath: string;\n\tformats: readonly ImageFormat[];\n\tvariantWidths: readonly number[];\n\thasSet: boolean;\n}): ImageSource[] {\n\tif (!hasSet) {\n\t\treturn formats.map((format) => ({\n\t\t\tsrcSet: `${basePath}.${format}`,\n\t\t\ttype: getImageMime(format)\n\t\t}));\n\t}\n\n\treturn formats.map((format) => ({\n\t\tsrcSet: variantWidths.map((width) => `${basePath}@${width}.${format} ${width}w`).join(\", \"),\n\t\ttype: getImageMime(format)\n\t}));\n}\n\n/**\n * Адаптер для изображений из таблицы Image.\n * Компонент строит пути только из данных БД: path + filename + формат/размер.\n */\nexport function ImageView({\n\timage,\n\tsrc,\n\tpath,\n\talt,\n\tformats = DEFAULT_SET_FORMATS,\n\tfallbackFormat,\n\tvariantWidths = DEFAULT_SET_WIDTHS,\n\thasSet,\n\taspectRatio,\n\t...props\n}: ImageViewProps) {\n\tconst filename = image?.filename ?? src;\n\n\tif (!filename) {\n\t\treturn <ImageRenderer src=\"\" alt={alt ?? image?.alt} {...props} />;\n\t}\n\n\tconst resolvedPath = image?.path ?? path;\n\tconst resolvedHasSet = hasSet ?? image?.hasSet ?? true;\n\tconst resolvedFormats = formats.length > 0 ? formats : DEFAULT_SET_FORMATS;\n\tconst resolvedFallbackFormat = fallbackFormat ?? resolvedFormats[resolvedFormats.length - 1] ?? \"webp\";\n\tconst basePath = buildImageBasePath(resolvedPath, filename);\n\tconst resolvedAspectRatio = aspectRatio ?? (image?.width && image.height ? `${image.width} / ${image.height}` : undefined);\n\tconst sources = buildImageSources({\n\t\tbasePath,\n\t\tformats: resolvedFormats,\n\t\tvariantWidths,\n\t\thasSet: resolvedHasSet\n\t});\n\n\treturn (\n\t\t<ImageRenderer\n\t\t\tsrc={`${basePath}.${resolvedFallbackFormat}`}\n\t\t\tsources={sources}\n\t\t\talt={alt ?? image?.alt}\n\t\t\taspectRatio={resolvedAspectRatio}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/image/ui/ImageCropper.tsx","../../src/image/ui/ImagePlaceholder.tsx","../../src/image/ui/ImageRenderer.tsx","../../src/image/ui/ImageSelection.tsx","../../src/image/ui/ImageView.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\nimport Cropper from \"react-easy-crop\";\n\nexport type CroppedAreaPixels = {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n};\n\nexport function ImageCropper({\n\timage,\n\taspect = 1200 / 630,\n\twidth,\n\tonCropComplete\n}: {\n\timage: string;\n\taspect?: number;\n\twidth?: number;\n\tonCropComplete?: (croppedAreaPixels: CroppedAreaPixels) => void;\n}) {\n\tconst [crop, setCrop] = useState({ x: 0, y: 0 });\n\tconst [zoom, setZoom] = useState(1);\n\n\tconst handleCropComplete = useCallback(\n\t\t(_croppedArea: unknown, croppedAreaPixels: CroppedAreaPixels) => {\n\t\t\tonCropComplete?.(croppedAreaPixels);\n\t\t},\n\t\t[onCropComplete]\n\t);\n\n\treturn (\n\t\t<div style={{ position: \"relative\", width: width ?? \"100%\", aspectRatio: aspect }}>\n\t\t\t<Cropper\n\t\t\t\timage={image}\n\t\t\t\tcrop={crop}\n\t\t\t\tzoom={zoom}\n\t\t\t\taspect={aspect}\n\t\t\t\tonCropChange={setCrop}\n\t\t\t\tonZoomChange={setZoom}\n\t\t\t\tonCropComplete={handleCropComplete}\n\t\t\t\tzoomSpeed={0.1}\n\t\t\t\tobjectFit=\"contain\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","interface ImagePlaceholderProps {\n\twidth?: number | string;\n\theight?: number | string;\n\taspectRatio?: string | \"unset\";\n\tclassName?: string;\n}\n\nexport function ImagePlaceholder({ width = \"100%\", height = \"100%\", aspectRatio = \"16 / 9\", className }: ImagePlaceholderProps) {\n\treturn (\n\t\t<div style={{ width, height, aspectRatio }} className={className}>\n\t\t\t<svg\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\tviewBox=\"0 0 200 200\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\trole=\"img\"\n\t\t\t\tfill=\"none\"\n\t\t\t\trx=\"10\"\n\t\t\t\try=\"10\"\n\t\t\t\tstyle={{ display: \"block\" }}\n\t\t\t\taria-label=\"Изображение недоступно\">\n\t\t\t\t{/* <rect width=\"200\" height=\"200\" fill=\"var(--surface-2)\" rx=\"10\" ry=\"10\" /> */}\n\t\t\t\t<g fill=\"var(--surface-0)\">\n\t\t\t\t\t<rect x=\"40\" y=\"50\" width=\"120\" height=\"100\" rx=\"10\" />\n\n\t\t\t\t\t<circle cx=\"60\" cy=\"70\" r=\"8\" fill=\"var(--surface-2)\" />\n\n\t\t\t\t\t<path d=\"M50 130 L75 100 L100 130 Z\" fill=\"var(--surface-2)\" />\n\t\t\t\t\t<path d=\"M90 130 L120 90 L150 130 Z\" fill=\"var(--surface-2)\" />\n\n\t\t\t\t\t<line x1=\"160\" y1=\"40\" x2=\"40\" y2=\"160\" stroke=\"var(--surface-0)\" strokeWidth=\"15\" strokeLinecap=\"round\" />\n\t\t\t\t\t<line x1=\"160\" y1=\"40\" x2=\"40\" y2=\"160\" stroke=\"var(--surface-2)\" strokeWidth=\"5\" strokeLinecap=\"round\" />\n\t\t\t\t</g>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import { type CSSProperties, type ImgHTMLAttributes, type ReactNode, useEffect, useRef, useState } from \"react\";\n\nimport { ImagePlaceholder } from \"./ImagePlaceholder\";\n\nexport type ImageSource = {\n\tsrcSet: string;\n\ttype?: string;\n\tsizes?: string;\n};\n\nexport interface ImageRendererProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n\tsrc: string;\n\tsources?: readonly ImageSource[];\n\talt?: string;\n\trole?: string;\n\tariaLabel?: string;\n\tcaption?: string;\n\tfallback?: ReactNode;\n\tuseFigure?: boolean;\n\taspectRatio?: string | \"unset\";\n\twrapperStyle?: CSSProperties;\n}\n\n/**\n * Базовый рендер изображения: lazy-появление, placeholder, обработка ошибки и figure/caption.\n * Компонент не знает, как устроено хранилище и какие форматы/размеры доступны.\n */\nexport function ImageRenderer({\n\tsrc,\n\tsources,\n\talt,\n\trole,\n\tariaLabel,\n\tcaption,\n\tfallback,\n\tuseFigure = false,\n\twidth = \"100%\",\n\theight = \"100%\",\n\taspectRatio = \"16 / 9\",\n\tstyle,\n\twrapperStyle,\n\t...imgProps\n}: ImageRendererProps) {\n\tconst wrapperRef = useRef<HTMLDivElement | null>(null);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [hasLoaded, setHasLoaded] = useState(false);\n\tconst [hasError, setHasError] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst observer = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tconst parentWidth = Math.round(entry.boundingClientRect.width);\n\n\t\t\t\t\tsetContainerWidth(parentWidth);\n\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"100px\", threshold: 0.01 }\n\t\t);\n\n\t\tif (wrapperRef.current) {\n\t\t\tobserver.observe(wrapperRef.current);\n\t\t}\n\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tconst sizesAttr = containerWidth ? `${containerWidth}px` : \"100vw\";\n\tconst defaultFallback = <ImagePlaceholder width={width} height={height} aspectRatio={aspectRatio} />;\n\n\tconst content = (\n\t\t<>\n\t\t\t{!hasLoaded && !hasError && (fallback || defaultFallback)}\n\t\t\t{isVisible && !hasError && (\n\t\t\t\t<picture>\n\t\t\t\t\t{sources?.map((source) => (\n\t\t\t\t\t\t<source\n\t\t\t\t\t\t\tkey={`${source.type ?? \"source\"}-${source.srcSet}`}\n\t\t\t\t\t\t\tsrcSet={source.srcSet}\n\t\t\t\t\t\t\ttype={source.type}\n\t\t\t\t\t\t\tsizes={source.sizes ?? sizesAttr}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\trole={role}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\tonLoad={() => setHasLoaded(true)}\n\t\t\t\t\t\tonError={() => setHasError(true)}\n\t\t\t\t\t\tstyle={!hasLoaded ? { display: \"none\" } : { width: \"100%\", height: \"100%\", objectFit: \"cover\", ...style }}\n\t\t\t\t\t\taria-busy={!hasLoaded}\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t{...imgProps}\n\t\t\t\t\t/>\n\t\t\t\t</picture>\n\t\t\t)}\n\t\t\t{hasError && defaultFallback}\n\t\t</>\n\t);\n\n\tconst wrapped = (\n\t\t<div ref={wrapperRef} style={{ width, height, aspectRatio, ...wrapperStyle }}>\n\t\t\t{content}\n\t\t</div>\n\t);\n\n\treturn useFigure ? (\n\t\t<figure className=\"relative\">\n\t\t\t{wrapped}\n\t\t\t{caption && (\n\t\t\t\t<figcaption\n\t\t\t\t\tstyle={{ bottom: 2, right: 2, maxWidth: \"calc(100% - 4px)\" }}\n\t\t\t\t\tclassName=\"absolute paddingInlineMd textRight radiusSm fontSizeSm\">\n\t\t\t\t\t{caption}\n\t\t\t\t</figcaption>\n\t\t\t)}\n\t\t</figure>\n\t) : (\n\t\twrapped\n\t);\n}\n","import { CSSProperties, ReactNode, useCallback, useMemo, useState } from \"react\";\n\nimport { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\nimport Cropper from \"react-easy-crop\";\n\nimport { Button } from \"../../button\";\nimport { GridContainer } from \"../../grid\";\nimport { InputText } from \"../../input\";\nimport { InputFiles } from \"../../input-files\";\nimport { Modal, ModalContent, ModalFooter } from \"../../modal\";\n\nimport { CroppedAreaPixels } from \"./ImageCropper\";\n\ntype SelectedImageFile = Extract<ReadFileResult, { mode: \"data-url\" }>;\n\n/**\n * Данные одного выбранного изображения, которые нужны вызывающему коду:\n * исходный файл, пользовательское описание и выбранная область обрезки.\n */\nexport type SelectedImageData = {\n\tfile: SelectedImageFile;\n\talt: string;\n\tcrop?: CroppedAreaPixels;\n};\n\ninterface ImageSelectionPanelProps {\n\taspect?: number;\n\tdisabled?: boolean;\n\tvalue?: SelectedImageData[];\n\tdefaultValue?: SelectedImageData[];\n\tonChange?: (data: SelectedImageData[]) => void;\n\tonApply?: (data: SelectedImageData[]) => void;\n\trenderActions?: (data: ImageSelectionActionsData) => ReactNode;\n}\n\ninterface ImageSelectionModalProps extends ImageSelectionPanelProps {\n\tisOpen?: boolean;\n\tonClose?: () => void;\n\ttitle?: string;\n}\n\ninterface ImageSelectionActionsData {\n\tvalue: SelectedImageData[];\n\tactiveIndex: number;\n\thasSelected: boolean;\n\tcanApply: boolean;\n\tapply: () => void;\n}\n\ninterface ImageSelectionState extends ImageSelectionActionsData {\n\tfiles: SelectedImageFile[];\n\tactiveImage?: SelectedImageData;\n\tactiveCropperState: ImageCropperState;\n\tsetFiles: (files: SelectedImageFile[]) => void;\n\tsetActiveIndex: (index: number) => void;\n\tsetActiveAlt: (alt: string) => void;\n\tsetActiveCrop: (crop: CroppedAreaPixels) => void;\n\tsetActiveCropperCrop: (crop: CropperPoint) => void;\n\tsetActiveCropperZoom: (zoom: number) => void;\n}\n\ntype ImageSize = {\n\twidth: number;\n\theight: number;\n};\n\ntype CropperPoint = {\n\tx: number;\n\ty: number;\n};\n\ntype ImageCropperState = {\n\tcrop: CropperPoint;\n\tzoom: number;\n};\n\nfunction getImageKey(image: SelectedImageData, index: number) {\n\treturn `${image.file.meta.name}-${image.file.meta.size}-${image.file.meta.lastModified}-${index}`;\n}\n\n/**\n * Хранит черновик выбора изображений локально даже в controlled-режиме.\n * Это позволяет не дергать внешний onChange на каждый onCropComplete,\n * а отправлять готовый массив только при явном применении.\n */\nfunction useImageSelectionState({\n\tvalue,\n\tdefaultValue,\n\tdisabled,\n\tonChange,\n\tonApply\n}: Pick<ImageSelectionPanelProps, \"value\" | \"defaultValue\" | \"disabled\" | \"onChange\" | \"onApply\">): ImageSelectionState {\n\tconst isControlled = value !== undefined;\n\tconst [draftValue, setDraftValue] = useState<SelectedImageData[]>(value ?? defaultValue ?? []);\n\tconst [controlledValueSnapshot, setControlledValueSnapshot] = useState(value);\n\tconst [requestedActiveIndex, setActiveIndex] = useState(0);\n\tconst [cropperStateByImage, setCropperStateByImage] = useState<Record<string, ImageCropperState>>({});\n\n\tif (isControlled && value !== controlledValueSnapshot) {\n\t\tsetControlledValueSnapshot(value);\n\t\tsetDraftValue(value ?? []);\n\t}\n\n\tconst updateDraftValue = useCallback((updater: (currentValue: SelectedImageData[]) => SelectedImageData[]) => {\n\t\tsetDraftValue((currentValue) => updater(currentValue));\n\t}, []);\n\n\tconst files = useMemo(() => draftValue.map((image) => image.file), [draftValue]);\n\tconst activeIndex = draftValue.length === 0 ? 0 : Math.min(requestedActiveIndex, draftValue.length - 1);\n\tconst activeImage = draftValue[activeIndex];\n\tconst activeImageKey = activeImage ? getImageKey(activeImage, activeIndex) : undefined;\n\tconst activeCropperState = activeImageKey\n\t\t? (cropperStateByImage[activeImageKey] ?? { crop: { x: 0, y: 0 }, zoom: 1 })\n\t\t: { crop: { x: 0, y: 0 }, zoom: 1 };\n\tconst hasSelected = draftValue.length > 0;\n\tconst canApply = !disabled && hasSelected && draftValue.every((image) => image.alt.trim() && image.crop);\n\n\tconst setFiles = useCallback(\n\t\t(nextFiles: SelectedImageFile[]) => {\n\t\t\tupdateDraftValue((currentValue) =>\n\t\t\t\tnextFiles.map((file) => {\n\t\t\t\t\t// Сохраняем alt и crop при переключении, удалении и добавлении файлов.\n\t\t\t\t\tconst existingImage = currentValue.find((image) => image.file.file === file.file);\n\n\t\t\t\t\tif (existingImage) {\n\t\t\t\t\t\treturn { ...existingImage, file };\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { file, alt: \"\" };\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[updateDraftValue]\n\t);\n\n\tconst setActiveAlt = useCallback(\n\t\t(alt: string) => {\n\t\t\tupdateDraftValue((currentValue) => currentValue.map((image, index) => (index === activeIndex ? { ...image, alt } : image)));\n\t\t},\n\t\t[activeIndex, updateDraftValue]\n\t);\n\n\tconst setActiveCrop = useCallback(\n\t\t(crop: CroppedAreaPixels) => {\n\t\t\tupdateDraftValue((currentValue) => currentValue.map((image, index) => (index === activeIndex ? { ...image, crop } : image)));\n\t\t},\n\t\t[activeIndex, updateDraftValue]\n\t);\n\n\tconst setActiveCropperCrop = useCallback(\n\t\t(crop: CropperPoint) => {\n\t\t\tif (!activeImageKey) return;\n\n\t\t\tsetCropperStateByImage((currentState) => ({\n\t\t\t\t...currentState,\n\t\t\t\t[activeImageKey]: {\n\t\t\t\t\tcrop,\n\t\t\t\t\tzoom: currentState[activeImageKey]?.zoom ?? 1\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\t[activeImageKey]\n\t);\n\n\tconst setActiveCropperZoom = useCallback(\n\t\t(zoom: number) => {\n\t\t\tif (!activeImageKey) return;\n\n\t\t\tsetCropperStateByImage((currentState) => ({\n\t\t\t\t...currentState,\n\t\t\t\t[activeImageKey]: {\n\t\t\t\t\tcrop: currentState[activeImageKey]?.crop ?? { x: 0, y: 0 },\n\t\t\t\t\tzoom\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\t[activeImageKey]\n\t);\n\n\tconst apply = useCallback(() => {\n\t\tonChange?.(draftValue);\n\t\tonApply?.(draftValue);\n\t}, [draftValue, onApply, onChange]);\n\n\treturn {\n\t\tvalue: draftValue,\n\t\tfiles,\n\t\tactiveIndex,\n\t\tactiveImage,\n\t\tactiveCropperState,\n\t\thasSelected,\n\t\tcanApply,\n\t\tapply,\n\t\tsetFiles,\n\t\tsetActiveIndex,\n\t\tsetActiveAlt,\n\t\tsetActiveCrop,\n\t\tsetActiveCropperCrop,\n\t\tsetActiveCropperZoom\n\t};\n}\n\nfunction resolveImageUploadMaxBytes(): number | undefined {\n\tif (typeof __IMAGE_UPLOAD_MAX_BYTES__ !== \"number\") return undefined;\n\treturn __IMAGE_UPLOAD_MAX_BYTES__;\n}\n\nfunction getPreviewImageStyle(image: SelectedImageData, size: ImageSize | undefined, aspect: number): CSSProperties {\n\tif (!image.crop || !size) {\n\t\treturn {\n\t\t\twidth: \"100%\",\n\t\t\taspectRatio: aspect,\n\t\t\tobjectFit: \"cover\",\n\t\t\tdisplay: \"block\"\n\t\t};\n\t}\n\n\tconst crop = image.crop;\n\n\t// Миниатюра масштабирует исходник так, чтобы видимой оставалась только выбранная область crop.\n\treturn {\n\t\tposition: \"absolute\",\n\t\tleft: `${-(crop.x / crop.width) * 100}%`,\n\t\ttop: `${-(crop.y / crop.height) * 100}%`,\n\t\twidth: `${(size.width / crop.width) * 100}%`,\n\t\theight: `${(size.height / crop.height) * 100}%`,\n\t\tmaxWidth: \"none\"\n\t};\n}\n\nfunction ImageSelectionFields({ aspect = 16 / 9, disabled, state }: { aspect?: number; disabled?: boolean; state: ImageSelectionState }) {\n\tconst area = state.activeImage?.crop;\n\tconst [imageSizes, setImageSizes] = useState<Record<string, ImageSize>>({});\n\n\treturn (\n\t\t<GridContainer gap=\"md\">\n\t\t\t<InputFiles\n\t\t\t\tlabel=\"Файл изображения\"\n\t\t\t\tallowedMime={[\"image/jpeg\", \"image/png\", \"image/webp\", \"image/avif\"]}\n\t\t\t\tvalue={state.files}\n\t\t\t\tonChange={state.setFiles}\n\t\t\t\tmaxBytes={resolveImageUploadMaxBytes()}\n\t\t\t\tonReadError={(e) => console.log(\"e\", e)}\n\t\t\t/>\n\n\t\t\t{state.hasSelected && state.activeImage && (\n\t\t\t\t<div>\n\t\t\t\t\t<GridContainer templateColumns=\"repeat(auto-fill, minmax(10em, 1fr))\" gap=\"xs\">\n\t\t\t\t\t\t{state.value.map((image, index) => {\n\t\t\t\t\t\t\tconst imageKey = getImageKey(image, index);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={imageKey}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonClick={() => state.setActiveIndex(index)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\tborder: index === state.activeIndex ? \"2px solid var(--border-accent)\" : \"2px solid transparent\",\n\t\t\t\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t\t\t\t\tcursor: disabled ? \"default\" : \"pointer\"\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"block\",\n\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\t\t\taspectRatio: aspect,\n\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\"\n\t\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\tsrc={image.file.dataUrl}\n\t\t\t\t\t\t\t\t\t\t\tstyle={getPreviewImageStyle(image, imageSizes[imageKey], aspect)}\n\t\t\t\t\t\t\t\t\t\t\tonLoad={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst target = event.currentTarget;\n\n\t\t\t\t\t\t\t\t\t\t\t\tsetImageSizes((currentSizes) => ({\n\t\t\t\t\t\t\t\t\t\t\t\t\t...currentSizes,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[imageKey]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: target.naturalWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: target.naturalHeight\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</GridContainer>\n\t\t\t\t\t<div>\n\t\t\t\t\t\tВыберите область изображения{\" \"}\n\t\t\t\t\t\t{area &&\n\t\t\t\t\t\t\t(area.width < 1200 ? (\n\t\t\t\t\t\t\t\t<code className=\"statusError\">\n\t\t\t\t\t\t\t\t\t{area.width}x{area.height} - низкое качество изображения!\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<code className=\"statusSuccess\">\n\t\t\t\t\t\t\t\t\t{area.width}x{area.height}\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div style={{ position: \"relative\", width: \"100%\", aspectRatio: aspect }}>\n\t\t\t\t\t\t<Cropper\n\t\t\t\t\t\t\tkey={getImageKey(state.activeImage, state.activeIndex)}\n\t\t\t\t\t\t\timage={state.activeImage.file.dataUrl}\n\t\t\t\t\t\t\tcrop={state.activeCropperState.crop}\n\t\t\t\t\t\t\tzoom={state.activeCropperState.zoom}\n\t\t\t\t\t\t\taspect={aspect}\n\t\t\t\t\t\t\tonCropChange={state.setActiveCropperCrop}\n\t\t\t\t\t\t\tonZoomChange={state.setActiveCropperZoom}\n\t\t\t\t\t\t\tonCropComplete={(_croppedArea, croppedAreaPixels) => state.setActiveCrop(croppedAreaPixels)}\n\t\t\t\t\t\t\tzoomSpeed={0.1}\n\t\t\t\t\t\t\tobjectFit=\"contain\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<InputText\n\t\t\t\trequired\n\t\t\t\tdisabled={!state.hasSelected || disabled}\n\t\t\t\tlabel=\"Краткое описание изображения\"\n\t\t\t\tplaceholder=\"\"\n\t\t\t\tvalue={state.activeImage?.alt ?? \"\"}\n\t\t\t\tonChange={state.setActiveAlt}\n\t\t\t/>\n\t\t</GridContainer>\n\t);\n}\n\nexport function ImageSelectionPanel({ aspect = 16 / 9, disabled, renderActions, ...props }: ImageSelectionPanelProps) {\n\tconst state = useImageSelectionState({ ...props, disabled });\n\tconst actionsData = {\n\t\tvalue: state.value,\n\t\tactiveIndex: state.activeIndex,\n\t\thasSelected: state.hasSelected,\n\t\tcanApply: state.canApply,\n\t\tapply: state.apply\n\t};\n\tconst hasApplyHandler = props.onChange !== undefined || props.onApply !== undefined;\n\n\treturn (\n\t\t<>\n\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t{renderActions\n\t\t\t\t? renderActions(actionsData)\n\t\t\t\t: hasApplyHandler && (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Button disabled={!state.canApply} tone=\"success\" onClick={state.apply}>\n\t\t\t\t\t\t\t\tПрименить\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t</>\n\t);\n}\n\nexport function ImageSelectionModal({\n\taspect = 16 / 9,\n\tdisabled,\n\tisOpen = true,\n\tonClose = () => {},\n\ttitle = \"Загрузка нового изображения\",\n\t...props\n}: ImageSelectionModalProps) {\n\tconst state = useImageSelectionState({ ...props, disabled });\n\tconst hasApplyHandler = props.onChange !== undefined || props.onApply !== undefined;\n\n\tif (!hasApplyHandler) {\n\t\treturn (\n\t\t\t<Modal isOpen={isOpen} onClose={onClose} title={title} size=\"xl\">\n\t\t\t\t<ModalContent scrollable>\n\t\t\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t\t</ModalContent>\n\t\t\t</Modal>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={title} size=\"xl\">\n\t\t\t<ModalContent scrollable>\n\t\t\t\t<ImageSelectionFields aspect={aspect} disabled={disabled} state={state} />\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button disabled={!state.canApply} tone=\"success\" onClick={state.apply}>\n\t\t\t\t\tПрименить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type ImgHTMLAttributes, type ReactNode } from \"react\";\n\nimport { ImageRenderer, type ImageSource } from \"./ImageRenderer\";\n\nexport type ImageFormat = \"avif\" | \"webp\" | \"jpeg\" | \"jpg\" | \"png\";\n\nconst DEFAULT_SET_WIDTHS = [2880, 1920, 1280, 640, 320] as const;\nconst DEFAULT_SET_FORMATS = [\"avif\", \"webp\"] as const satisfies readonly ImageFormat[];\n\nexport type StoredImageData = {\n\tfilename: string;\n\tpath: string;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n\thasSet?: boolean;\n};\n\ninterface ImageViewProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"alt\"> {\n\t/** Запись из таблицы Image. Предпочтительный способ передать изображение из БД. */\n\timage?: StoredImageData;\n\t/** Базовое имя файла из БД. Для новых изображений это md5 без расширения. */\n\tsrc?: string;\n\t/** Путь из БД относительно публичного корня, например `images/articles`. */\n\tpath?: string;\n\talt?: string;\n\trole?: string;\n\tariaLabel?: string;\n\tcaption?: string;\n\tfallback?: ReactNode;\n\tuseFigure?: boolean;\n\taspectRatio?: string | \"unset\";\n\t/** Форматы, которые реально лежат в хранилище для текущего изображения. */\n\tformats?: readonly ImageFormat[];\n\t/** Формат для img.src. Должен существовать в хранилище. */\n\tfallbackFormat?: ImageFormat;\n\t/** Набор размеров для файлов вида base@width.format. */\n\tvariantWidths?: readonly number[];\n\t/** Признак наличия responsive-набора. Если false, @size srcSet не строится. */\n\thasSet?: boolean;\n}\n\nfunction getImageMime(format: ImageFormat): string {\n\tif (format === \"jpg\" || format === \"jpeg\") {\n\t\treturn \"image/jpeg\";\n\t}\n\n\treturn `image/${format}`;\n}\n\nfunction normalizeImagePath(path?: string): string {\n\tif (!path) return \"\";\n\n\treturn path.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction buildImageBasePath(path: string | undefined, filename: string): string {\n\tconst normalizedPath = normalizeImagePath(path);\n\n\treturn normalizedPath ? `/${normalizedPath}/${filename}` : `/${filename}`;\n}\n\nfunction buildImageSources({\n\tbasePath,\n\tformats,\n\tvariantWidths,\n\thasSet\n}: {\n\tbasePath: string;\n\tformats: readonly ImageFormat[];\n\tvariantWidths: readonly number[];\n\thasSet: boolean;\n}): ImageSource[] {\n\tif (!hasSet) {\n\t\treturn formats.map((format) => ({\n\t\t\tsrcSet: `${basePath}.${format}`,\n\t\t\ttype: getImageMime(format)\n\t\t}));\n\t}\n\n\treturn formats.map((format) => ({\n\t\tsrcSet: variantWidths.map((width) => `${basePath}@${width}.${format} ${width}w`).join(\", \"),\n\t\ttype: getImageMime(format)\n\t}));\n}\n\n/**\n * Адаптер для изображений из таблицы Image.\n * Компонент строит пути только из данных БД: path + filename + формат/размер.\n */\nexport function ImageView({\n\timage,\n\tsrc,\n\tpath,\n\talt,\n\tformats = DEFAULT_SET_FORMATS,\n\tfallbackFormat,\n\tvariantWidths = DEFAULT_SET_WIDTHS,\n\thasSet,\n\taspectRatio,\n\t...props\n}: ImageViewProps) {\n\tconst filename = image?.filename ?? src;\n\n\tif (!filename) {\n\t\treturn <ImageRenderer src=\"\" alt={alt ?? image?.alt} {...props} />;\n\t}\n\n\tconst resolvedPath = image?.path ?? path;\n\tconst resolvedHasSet = hasSet ?? image?.hasSet ?? true;\n\tconst resolvedFormats = formats.length > 0 ? formats : DEFAULT_SET_FORMATS;\n\tconst resolvedFallbackFormat = fallbackFormat ?? resolvedFormats[resolvedFormats.length - 1] ?? \"webp\";\n\tconst basePath = buildImageBasePath(resolvedPath, filename);\n\tconst resolvedAspectRatio = aspectRatio ?? (image?.width && image.height ? `${image.width} / ${image.height}` : undefined);\n\tconst sources = buildImageSources({\n\t\tbasePath,\n\t\tformats: resolvedFormats,\n\t\tvariantWidths,\n\t\thasSet: resolvedHasSet\n\t});\n\n\treturn (\n\t\t<ImageRenderer\n\t\t\tsrc={`${basePath}.${resolvedFallbackFormat}`}\n\t\t\tsources={sources}\n\t\t\talt={alt ?? image?.alt}\n\t\t\taspectRatio={resolvedAspectRatio}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageSelection.d.ts","sourceRoot":"","sources":["../../../src/image/ui/ImageSelection.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAkC,MAAM,OAAO,CAAC;AAIjF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAQtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,KAAK,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,UAAU,wBAAwB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,SAAS,CAAC;CAC/D;AAED,UAAU,wBAAyB,SAAQ,wBAAwB;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,yBAAyB;IAClC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AA+RD,wBAAgB,mBAAmB,CAAC,EAAE,MAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,+BAyBnH;AAED,wBAAgB,mBAAmB,CAAC,EACnC,MAAe,EACf,QAAQ,EACR,MAAa,EACb,OAAkB,EAClB,KAAqC,EACrC,GAAG,KAAK,EACR,EAAE,wBAAwB,+BA0B1B"}
1
+ {"version":3,"file":"ImageSelection.d.ts","sourceRoot":"","sources":["../../../src/image/ui/ImageSelection.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAkC,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAStE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,KAAK,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,UAAU,wBAAwB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,SAAS,CAAC;CAC/D;AAED,UAAU,wBAAyB,SAAQ,wBAAwB;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,yBAAyB;IAClC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AA+RD,wBAAgB,mBAAmB,CAAC,EAAE,MAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,+BAyBnH;AAED,wBAAgB,mBAAmB,CAAC,EACnC,MAAe,EACf,QAAQ,EACR,MAAa,EACb,OAAkB,EAClB,KAAqC,EACrC,GAAG,KAAK,EACR,EAAE,wBAAwB,+BA0B1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,mBAAmB,EAAE,SAAS,EAAuC,MAAM,OAAO,CAAC;AAOlH,OAAO,EAAE,WAAW,EAAU,MAAM,UAAU,CAAC;AAM/C,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,cAAc,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC,qBAmBjF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACvB,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,EACb,OAAO,EACP,QAAQ,EACR,EAAE,YAAY,qBA4Bd;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAW9H;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAA+B,EAAE,EAAE,qBAAqB,qBAWxH;AA+BD,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAC/D,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/H,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,MAAM,CAAC;IAC7D,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAEhE;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACzB,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,IAAa,EACb,GAAG,KAAK,EACR,EAAE,cAAc,qBA6DhB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,GAAG,KAAK,EACP,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,qBAuF7C;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,kBAAY,CAAC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../src/input/Input.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../chunks/Input-Ce2HXBUc.js";
1
+ import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../chunks/Input-Wrew1puH.js";
2
2
  export { s as Input, r as InputClearButton, a as InputControl, n as InputNumber, e as InputText, i as InputUI, o as InputUILoading, t as useInputFieldIds };
@@ -1,4 +1,4 @@
1
- import { a as e, i as t } from "../../chunks/Input-Ce2HXBUc.js";
1
+ import { a as e, i as t } from "../../chunks/Input-Wrew1puH.js";
2
2
  import { jsx as n } from "react/jsx-runtime";
3
3
  import { useState as r } from "react";
4
4
  //#region src/input/stories/Input.stories.tsx
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "../chunks/InputDateTime-DPtY_4Od.js";
1
+ import { n as e, r as t, t as n } from "../chunks/InputDateTime-2PCX8an8.js";
2
2
  export { n as InputDate, e as InputDateTime, t as InputTime };
@@ -1,4 +1,4 @@
1
- import { n as e, r as t, t as n } from "../../chunks/InputDateTime-DPtY_4Od.js";
1
+ import { n as e, r as t, t as n } from "../../chunks/InputDateTime-2PCX8an8.js";
2
2
  import { jsx as r } from "react/jsx-runtime";
3
3
  import { useState as i } from "react";
4
4
  //#region src/input-date-time/stories/InputDateTime.stories.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"InputFile.d.ts","sourceRoot":"","sources":["../../src/input-file/InputFile.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuD,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAIpJ,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAKvC,UAAU,oBAAqB,SAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACxF,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,gFAAgF;IAChF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C,0FAA0F;IAC1F,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,yEAAyE;IACzE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,sBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAC5E,KAAK,0BAA0B,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC;AAEpF;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACvB,CAAC,oBAAoB,GAAG;IACxB,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC,GACF,CAAC,oBAAoB,GAAG;IACxB,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,cAAc,CAAC;CACxB,CAAC,CAAC;AAEN;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAoH9C"}
1
+ {"version":3,"file":"InputFile.d.ts","sourceRoot":"","sources":["../../src/input-file/InputFile.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIN,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAM,sCAAsC,CAAC;AAI9C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAKvC,UAAU,oBAAqB,SAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACxF,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,gFAAgF;IAChF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C,0FAA0F;IAC1F,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,yEAAyE;IACzE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,sBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAC5E,KAAK,0BAA0B,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC;AAEpF;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACvB,CAAC,oBAAoB,GAAG;IACxB,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC,GACF,CAAC,oBAAoB,GAAG;IACxB,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,cAAc,CAAC;CACxB,CAAC,CAAC;AAEN;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAoH9C"}
@@ -1,2 +1,2 @@
1
- import { t as e } from "../chunks/InputFile-ga5yJmdZ.js";
1
+ import { t as e } from "../chunks/InputFile-Ca-bRo93.js";
2
2
  export { e as InputFile };
@@ -1 +1 @@
1
- {"version":3,"file":"InputFile.stories.d.ts","sourceRoot":"","sources":["../../../src/input-file/stories/InputFile.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAwBxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC"}
1
+ {"version":3,"file":"InputFile.stories.d.ts","sourceRoot":"","sources":["../../../src/input-file/stories/InputFile.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAwBxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/InputFile-ga5yJmdZ.js";
1
+ import { t as e } from "../../chunks/InputFile-Ca-bRo93.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { useState as n } from "react";
4
4
  //#region src/input-file/stories/InputFile.stories.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"InputFile.stories.js","names":[],"sources":["../../../src/input-file/stories/InputFile.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport type { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\n\nimport { InputFile } from \"../InputFile\";\n\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadFileResult = (name: string, mime: string = \"application/pdf\"): ReadFileResult => {\n\tconst file = new File([\"demo-file\"], name, { type: mime, lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: `data:${mime};base64,ZGVtby1maWxl`,\n\t\tfile\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputFile\",\n\tcomponent: InputFile,\n\targs: {\n\t\tvalue: undefined,\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля загрузки.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст в поле, пока файл не выбран.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Текущий результат чтения выбранного файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается после успешного чтения файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке чтения или валидации файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonClear: {\n\t\t\tdescription: \"Очищает выбранный файл и показывает кнопку очистки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\taccept: {\n\t\t\tdescription: \"HTML `accept` для нативного диалога выбора файла.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Белый список MIME-типов для readFile-валидации.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения файла: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Callback сброса ошибки при повторном выборе файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует выбор файла.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputFile>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(args.value);\n\t\tconst [error, setError] = useState(args.error ?? \"\");\n\n\t\treturn (\n\t\t\t<InputFile\n\t\t\t\t{...args}\n\t\t\t\tvalue={value}\n\t\t\t\terror={error || undefined}\n\t\t\t\tonChange={setValue}\n\t\t\t\tonClear={() => setValue(undefined)}\n\t\t\t\tonClearError={() => setError(\"\")}\n\t\t\t/>\n\t\t);\n\t},\n\targs: {\n\t\tlabel: \"Документ\",\n\t\tdescription: \"Загрузите один файл.\",\n\t\tplaceholder: \"Выберите файл\",\n\t\taccept: [\".pdf\", \".docx\"],\n\t\treadMode: \"data-url\",\n\t\tvalue: undefined\n\t}\n};\n\nexport const WithInitialValue: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(createMockReadFileResult(\"report.pdf\"));\n\t\treturn <InputFile {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Файл с предзаполнением\",\n\t\tdescription: \"Демонстрация состояния после успешной загрузки.\"\n\t}\n};\n\nexport const ArrayBufferMode: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(undefined);\n\t\treturn <InputFile {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Двоичное чтение\",\n\t\tdescription: \"Режим `array-buffer` для дальнейшей бинарной обработки.\",\n\t\treadMode: \"array-buffer\",\n\t\taccept: [\".zip\", \".pdf\"],\n\t\tvalue: undefined\n\t}\n};\n"],"mappings":";;;;AAQA,IAAM,KAA4B,GAAc,IAAe,sBAAsC;CACpG,IAAM,IAAO,IAAI,KAAK,CAAC,WAAW,GAAG,GAAM;EAAE,MAAM;EAAM,cAAc;CAAc,CAAC;CAEtF,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS,QAAQ,EAAK;EACtB;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,KAAA;EACP,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,SAAS;GACR,aAAa;GACb,SAAS;EACV;EACA,QAAQ;GACP,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,EAAK,KAAK,GACnE,CAAC,GAAO,KAAY,EAAS,EAAK,SAAS,EAAE;EAEnD,OACC,kBAAC,GAAD;GACC,GAAI;GACG;GACP,OAAO,KAAS,KAAA;GAChB,UAAU;GACV,eAAe,EAAS,KAAA,CAAS;GACjC,oBAAoB,EAAS,EAAE;EAC/B,CAAA;CAEH;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,QAAQ,CAAC,QAAQ,OAAO;EACxB,UAAU;EACV,OAAO,KAAA;CACR;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,EAAyB,YAAY,CAAC;EACrG,OAAO,kBAAC,GAAD;GAAW,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACpG;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAyB;CACrC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,KAAA,CAAS;EACxE,OAAO,kBAAC,GAAD;GAAW,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACpG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;EACV,QAAQ,CAAC,QAAQ,MAAM;EACvB,OAAO,KAAA;CACR;AACD"}
1
+ {"version":3,"file":"InputFile.stories.js","names":[],"sources":["../../../src/input-file/stories/InputFile.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport { InputFile } from \"../InputFile\";\n\nimport type { ReadFileResult } from \"@ryuzaki13/react-foundation-lib/file\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadFileResult = (name: string, mime: string = \"application/pdf\"): ReadFileResult => {\n\tconst file = new File([\"demo-file\"], name, { type: mime, lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: `data:${mime};base64,ZGVtby1maWxl`,\n\t\tfile\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputFile\",\n\tcomponent: InputFile,\n\targs: {\n\t\tvalue: undefined,\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля загрузки.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст в поле, пока файл не выбран.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Текущий результат чтения выбранного файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается после успешного чтения файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке чтения или валидации файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonClear: {\n\t\t\tdescription: \"Очищает выбранный файл и показывает кнопку очистки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\taccept: {\n\t\t\tdescription: \"HTML `accept` для нативного диалога выбора файла.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Белый список MIME-типов для readFile-валидации.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения файла: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Callback сброса ошибки при повторном выборе файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует выбор файла.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputFile>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(args.value);\n\t\tconst [error, setError] = useState(args.error ?? \"\");\n\n\t\treturn (\n\t\t\t<InputFile\n\t\t\t\t{...args}\n\t\t\t\tvalue={value}\n\t\t\t\terror={error || undefined}\n\t\t\t\tonChange={setValue}\n\t\t\t\tonClear={() => setValue(undefined)}\n\t\t\t\tonClearError={() => setError(\"\")}\n\t\t\t/>\n\t\t);\n\t},\n\targs: {\n\t\tlabel: \"Документ\",\n\t\tdescription: \"Загрузите один файл.\",\n\t\tplaceholder: \"Выберите файл\",\n\t\taccept: [\".pdf\", \".docx\"],\n\t\treadMode: \"data-url\",\n\t\tvalue: undefined\n\t}\n};\n\nexport const WithInitialValue: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(createMockReadFileResult(\"report.pdf\"));\n\t\treturn <InputFile {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Файл с предзаполнением\",\n\t\tdescription: \"Демонстрация состояния после успешной загрузки.\"\n\t}\n};\n\nexport const ArrayBufferMode: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileResult | undefined>(undefined);\n\t\treturn <InputFile {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Двоичное чтение\",\n\t\tdescription: \"Режим `array-buffer` для дальнейшей бинарной обработки.\",\n\t\treadMode: \"array-buffer\",\n\t\taccept: [\".zip\", \".pdf\"],\n\t\tvalue: undefined\n\t}\n};\n"],"mappings":";;;;AAOA,IAAM,KAA4B,GAAc,IAAe,sBAAsC;CACpG,IAAM,IAAO,IAAI,KAAK,CAAC,WAAW,GAAG,GAAM;EAAE,MAAM;EAAM,cAAc;CAAc,CAAC;CAEtF,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS,QAAQ,EAAK;EACtB;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,KAAA;EACP,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,SAAS;GACR,aAAa;GACb,SAAS;EACV;EACA,QAAQ;GACP,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,EAAK,KAAK,GACnE,CAAC,GAAO,KAAY,EAAS,EAAK,SAAS,EAAE;EAEnD,OACC,kBAAC,GAAD;GACC,GAAI;GACG;GACP,OAAO,KAAS,KAAA;GAChB,UAAU;GACV,eAAe,EAAS,KAAA,CAAS;GACjC,oBAAoB,EAAS,EAAE;EAC/B,CAAA;CAEH;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,QAAQ,CAAC,QAAQ,OAAO;EACxB,UAAU;EACV,OAAO,KAAA;CACR;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,EAAyB,YAAY,CAAC;EACrG,OAAO,kBAAC,GAAD;GAAW,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACpG;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAyB;CACrC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAqC,KAAA,CAAS;EACxE,OAAO,kBAAC,GAAD;GAAW,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACpG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;EACV,QAAQ,CAAC,QAAQ,MAAM;EACvB,OAAO,KAAA;CACR;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputFilesList.d.ts","sourceRoot":"","sources":["../../src/input-files/InputFilesList.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAKtE,UAAU,mBAAmB,CAAC,KAAK,SAAS,cAAc;IACzD,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAS,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,sCA0B3G"}
1
+ {"version":3,"file":"InputFilesList.d.ts","sourceRoot":"","sources":["../../src/input-files/InputFilesList.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAMtE,UAAU,mBAAmB,CAAC,KAAK,SAAS,cAAc;IACzD,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAS,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,sCA0B3G"}
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/InputFiles-Or2Nvfgk.js";
1
+ import { n as e, t } from "../chunks/InputFiles-pI9rQXOI.js";
2
2
  export { t as InputFiles, e as InputFilesList };
@@ -1,5 +1,5 @@
1
- import type { ReadFileAsDataUrlResult } from "@ryuzaki13/react-foundation-lib/file";
2
1
  import { InputFiles } from "../InputFiles";
2
+ import type { ReadFileAsDataUrlResult } from "@ryuzaki13/react-foundation-lib/file";
3
3
  import type { StoryObj } from "@storybook/react-vite";
4
4
  declare const meta: {
5
5
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"InputFiles.stories.d.ts","sourceRoot":"","sources":["../../../src/input-files/stories/InputFiles.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,QAAA,MAAM,IAAI;;;;eAIK,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEL,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAa9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC"}
1
+ {"version":3,"file":"InputFiles.stories.d.ts","sourceRoot":"","sources":["../../../src/input-files/stories/InputFiles.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkB5D,QAAA,MAAM,IAAI;;;;eAIK,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEL,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAa9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/InputFiles-Or2Nvfgk.js";
1
+ import { t as e } from "../../chunks/InputFiles-pI9rQXOI.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { useState as n } from "react";
4
4
  //#region src/input-files/stories/InputFiles.stories.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"InputFiles.stories.js","names":[],"sources":["../../../src/input-files/stories/InputFiles.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport type { ReadFileAsDataUrlResult } from \"@ryuzaki13/react-foundation-lib/file\";\n\nimport { InputFiles } from \"../InputFiles\";\n\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadFileResult = (name: string, mime: string = \"application/pdf\"): ReadFileAsDataUrlResult => {\n\tconst file = new File([\"demo-file\"], name, { type: mime, lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: `data:${mime};base64,ZGVtby1maWxl`,\n\t\tfile\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputFiles\",\n\tcomponent: InputFiles,\n\targs: {\n\t\tvalue: [] as ReadFileAsDataUrlResult[],\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля множественной загрузки.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст в поле, пока список файлов пуст.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Массив результатов чтения выбранных файлов.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается с новым массивом файлов после добавления/удаления.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке чтения отдельного файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\taccept: {\n\t\t\tdescription: \"HTML `accept` для диалога выбора файлов.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Список допустимых MIME-типов при валидации.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер одного файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\tmaxFiles: {\n\t\t\tdescription: \"Лимит количества файлов в списке.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Вызывается при выборе новых файлов для сброса ошибки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Полностью блокирует выбор файлов.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputFiles>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([]);\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Вложения\",\n\t\tdescription: \"Можно выбрать несколько файлов.\",\n\t\tplaceholder: \"Выберите файлы\",\n\t\taccept: [\".pdf\", \".png\", \".jpg\"],\n\t\tmaxFiles: 5,\n\t\tvalue: []\n\t}\n};\n\nexport const WithInitialFiles: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([\n\t\t\tcreateMockReadFileResult(\"contract.pdf\"),\n\t\t\tcreateMockReadFileResult(\"diagram.png\", \"image/png\")\n\t\t]);\n\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Предзаполненный список\",\n\t\tdescription: \"Иллюстрация удаления файлов из уже заполненного значения.\"\n\t}\n};\n\nexport const LimitReached: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([\n\t\t\tcreateMockReadFileResult(\"first.pdf\"),\n\t\t\tcreateMockReadFileResult(\"second.pdf\")\n\t\t]);\n\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Лимит файлов\",\n\t\tdescription: \"После достижения лимита поле выбора блокируется.\",\n\t\tmaxFiles: 2\n\t}\n};\n"],"mappings":";;;;AAQA,IAAM,KAA4B,GAAc,IAAe,sBAA+C;CAC7G,IAAM,IAAO,IAAI,KAAK,CAAC,WAAW,GAAG,GAAM;EAAE,MAAM;EAAM,cAAc;CAAc,CAAC;CAEtF,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS,QAAQ,EAAK;EACtB;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,CAAC;EACR,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,QAAQ;GACP,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAAC,CAAC;EAChE,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,QAAQ;GAAC;GAAQ;GAAQ;EAAM;EAC/B,UAAU;EACV,OAAO,CAAC;CACT;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAC7D,EAAyB,cAAc,GACvC,EAAyB,eAAe,WAAW,CACpD,CAAC;EAED,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAsB;CAClC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAC7D,EAAyB,WAAW,GACpC,EAAyB,YAAY,CACtC,CAAC;EAED,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;CACX;AACD"}
1
+ {"version":3,"file":"InputFiles.stories.js","names":[],"sources":["../../../src/input-files/stories/InputFiles.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport { InputFiles } from \"../InputFiles\";\n\nimport type { ReadFileAsDataUrlResult } from \"@ryuzaki13/react-foundation-lib/file\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadFileResult = (name: string, mime: string = \"application/pdf\"): ReadFileAsDataUrlResult => {\n\tconst file = new File([\"demo-file\"], name, { type: mime, lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: `data:${mime};base64,ZGVtby1maWxl`,\n\t\tfile\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputFiles\",\n\tcomponent: InputFiles,\n\targs: {\n\t\tvalue: [] as ReadFileAsDataUrlResult[],\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля множественной загрузки.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст в поле, пока список файлов пуст.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Массив результатов чтения выбранных файлов.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается с новым массивом файлов после добавления/удаления.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке чтения отдельного файла.\",\n\t\t\tcontrol: false\n\t\t},\n\t\taccept: {\n\t\t\tdescription: \"HTML `accept` для диалога выбора файлов.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Список допустимых MIME-типов при валидации.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер одного файла в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\tmaxFiles: {\n\t\t\tdescription: \"Лимит количества файлов в списке.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Вызывается при выборе новых файлов для сброса ошибки.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Полностью блокирует выбор файлов.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputFiles>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([]);\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Вложения\",\n\t\tdescription: \"Можно выбрать несколько файлов.\",\n\t\tplaceholder: \"Выберите файлы\",\n\t\taccept: [\".pdf\", \".png\", \".jpg\"],\n\t\tmaxFiles: 5,\n\t\tvalue: []\n\t}\n};\n\nexport const WithInitialFiles: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([\n\t\t\tcreateMockReadFileResult(\"contract.pdf\"),\n\t\t\tcreateMockReadFileResult(\"diagram.png\", \"image/png\")\n\t\t]);\n\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Предзаполненный список\",\n\t\tdescription: \"Иллюстрация удаления файлов из уже заполненного значения.\"\n\t}\n};\n\nexport const LimitReached: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadFileAsDataUrlResult[]>([\n\t\t\tcreateMockReadFileResult(\"first.pdf\"),\n\t\t\tcreateMockReadFileResult(\"second.pdf\")\n\t\t]);\n\n\t\treturn <InputFiles {...args} readMode=\"data-url\" value={value} onChange={setValue} />;\n\t},\n\targs: {\n\t\tlabel: \"Лимит файлов\",\n\t\tdescription: \"После достижения лимита поле выбора блокируется.\",\n\t\tmaxFiles: 2\n\t}\n};\n"],"mappings":";;;;AAOA,IAAM,KAA4B,GAAc,IAAe,sBAA+C;CAC7G,IAAM,IAAO,IAAI,KAAK,CAAC,WAAW,GAAG,GAAM;EAAE,MAAM;EAAM,cAAc;CAAc,CAAC;CAEtF,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS,QAAQ,EAAK;EACtB;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,CAAC;EACR,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,QAAQ;GACP,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAAC,CAAC;EAChE,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,QAAQ;GAAC;GAAQ;GAAQ;EAAM;EAC/B,UAAU;EACV,OAAO,CAAC;CACT;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAC7D,EAAyB,cAAc,GACvC,EAAyB,eAAe,WAAW,CACpD,CAAC;EAED,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAsB;CAClC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAoC,CAC7D,EAAyB,WAAW,GACpC,EAAyB,YAAY,CACtC,CAAC;EAED,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAM,UAAS;GAAkB;GAAO,UAAU;EAAW,CAAA;CACrF;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;CACX;AACD"}
@@ -1,2 +1,2 @@
1
- import { t as e } from "../chunks/InputImage-BeA5WJz1.js";
1
+ import { t as e } from "../chunks/InputImage-B522AQzl.js";
2
2
  export { e as InputImage };
@@ -1 +1 @@
1
- {"version":3,"file":"InputImage.stories.d.ts","sourceRoot":"","sources":["../../../src/input-image/stories/InputImage.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAsB5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEyB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAqB9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC"}
1
+ {"version":3,"file":"InputImage.stories.d.ts","sourceRoot":"","sources":["../../../src/input-image/stories/InputImage.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAsB5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEyB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAqB9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/InputImage-BeA5WJz1.js";
1
+ import { t as e } from "../../chunks/InputImage-B522AQzl.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  import { useState as r } from "react";
4
4
  //#region src/input-image/stories/InputImage.stories.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"InputImage.stories.js","names":[],"sources":["../../../src/input-image/stories/InputImage.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport type { ReadImageResult } from \"@ryuzaki13/react-foundation-lib/file\";\n\nimport { InputImage } from \"../InputImage\";\n\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadImageResult = (name: string = \"avatar.png\"): ReadImageResult => {\n\tconst file = new File([\"image-demo\"], name, { type: \"image/png\", lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9YxM9a0AAAAASUVORK5CYII=\",\n\t\tfile,\n\t\tdimensions: {\n\t\t\twidth: 1,\n\t\t\theight: 1\n\t\t}\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputImage\",\n\tcomponent: InputImage,\n\targs: {\n\t\tvalue: undefined,\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля выбора изображения.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст до выбора изображения.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Результат чтения выбранного изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается после успешного чтения изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке валидации или чтения изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonClear: {\n\t\t\tdescription: \"Очищает выбранное изображение.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Разрешенные MIME-типы изображений.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер изображения в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Сброс ошибки при повторном выборе изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует взаимодействие с полем.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputImage>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(args.value);\n\t\treturn <InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Аватар\",\n\t\tdescription: \"Выберите одно изображение профиля.\",\n\t\tplaceholder: \"Выберите изображение\",\n\t\treadMode: \"data-url\",\n\t\tallowedMime: [\"image/png\", \"image/jpeg\", \"image/webp\"],\n\t\tvalue: undefined\n\t}\n};\n\nexport const WithInitialImage: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(createMockReadImageResult());\n\n\t\treturn (\n\t\t\t<div style={{ display: \"grid\", gap: 12 }}>\n\t\t\t\t<InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />\n\t\t\t\t{value?.mode === \"data-url\" && (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={value.dataUrl}\n\t\t\t\t\t\talt=\"Предпросмотр\"\n\t\t\t\t\t\tstyle={{ width: 96, height: 96, objectFit: \"cover\", border: \"1px solid var(--border-0)\" }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n\targs: {\n\t\tlabel: \"Изображение с предпросмотром\",\n\t\tdescription: \"Сторис показывает, что значение можно использовать для preview.\"\n\t}\n};\n\nexport const ArrayBufferMode: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(undefined);\n\t\treturn <InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Двоичный режим\",\n\t\tdescription: \"Используется, когда изображение нужно обработать как бинарные данные.\",\n\t\treadMode: \"array-buffer\",\n\t\tvalue: undefined\n\t}\n};\n"],"mappings":";;;;AAQA,IAAM,KAA6B,IAAe,iBAAkC;CACnF,IAAM,IAAO,IAAI,KAAK,CAAC,YAAY,GAAG,GAAM;EAAE,MAAM;EAAa,cAAc;CAAc,CAAC;CAE9F,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS;EACT;EACA,YAAY;GACX,OAAO;GACP,QAAQ;EACT;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,KAAA;EACP,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,SAAS;GACR,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,EAAK,KAAK;EAC1E,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACrG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,UAAU;EACV,aAAa;GAAC;GAAa;GAAc;EAAY;EACrD,OAAO,KAAA;CACR;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,EAA0B,CAAC;EAE3F,OACC,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,KAAK;GAAG;aAAvC,CACC,kBAAC,GAAD;IAAY,GAAI;IAAa;IAAO,UAAU;IAAU,eAAe,EAAS,KAAA,CAAS;GAAI,CAAA,GAC5F,GAAO,SAAS,cAChB,kBAAC,OAAD;IACC,KAAK,EAAM;IACX,KAAI;IACJ,OAAO;KAAE,OAAO;KAAI,QAAQ;KAAI,WAAW;KAAS,QAAQ;IAA4B;GACxF,CAAA,CAEE;;CAEP;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAyB;CACrC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,KAAA,CAAS;EACzE,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACrG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;EACV,OAAO,KAAA;CACR;AACD"}
1
+ {"version":3,"file":"InputImage.stories.js","names":[],"sources":["../../../src/input-image/stories/InputImage.stories.tsx"],"sourcesContent":["import { useState } from \"react\";\n\nimport { InputImage } from \"../InputImage\";\n\nimport type { ReadImageResult } from \"@ryuzaki13/react-foundation-lib/file\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\n\nconst createMockReadImageResult = (name: string = \"avatar.png\"): ReadImageResult => {\n\tconst file = new File([\"image-demo\"], name, { type: \"image/png\", lastModified: 1704067200000 });\n\n\treturn {\n\t\tmode: \"data-url\",\n\t\tmeta: {\n\t\t\tname: file.name,\n\t\t\tmime: file.type,\n\t\t\tsize: file.size,\n\t\t\tlastModified: file.lastModified\n\t\t},\n\t\tdataUrl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9YxM9a0AAAAASUVORK5CYII=\",\n\t\tfile,\n\t\tdimensions: {\n\t\t\twidth: 1,\n\t\t\theight: 1\n\t\t}\n\t};\n};\n\nconst meta = {\n\ttitle: \"Shared/UI/InputImage\",\n\tcomponent: InputImage,\n\targs: {\n\t\tvalue: undefined,\n\t\tonChange: () => {}\n\t},\n\tparameters: {\n\t\tatomicCanvas: true,\n\t\tlayout: \"padded\"\n\t},\n\ttags: [\"autodocs\"],\n\targTypes: {\n\t\tlabel: {\n\t\t\tdescription: \"Заголовок поля выбора изображения.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tdescription: {\n\t\t\tdescription: \"Описание под заголовком.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tplaceholder: {\n\t\t\tdescription: \"Текст до выбора изображения.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tvalue: {\n\t\t\tdescription: \"Результат чтения выбранного изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonChange: {\n\t\t\tdescription: \"Вызывается после успешного чтения изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonReadError: {\n\t\t\tdescription: \"Вызывается при ошибке валидации или чтения изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tonClear: {\n\t\t\tdescription: \"Очищает выбранное изображение.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tallowedMime: {\n\t\t\tdescription: \"Разрешенные MIME-типы изображений.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tmaxBytes: {\n\t\t\tdescription: \"Максимальный размер изображения в байтах.\",\n\t\t\tcontrol: \"number\"\n\t\t},\n\t\treadMode: {\n\t\t\tdescription: \"Режим чтения: data-url или array-buffer.\",\n\t\t\tcontrol: \"inline-radio\",\n\t\t\toptions: [\"data-url\", \"array-buffer\"]\n\t\t},\n\t\terror: {\n\t\t\tdescription: \"Текст ошибки под полем.\",\n\t\t\tcontrol: \"text\"\n\t\t},\n\t\tonClearError: {\n\t\t\tdescription: \"Сброс ошибки при повторном выборе изображения.\",\n\t\t\tcontrol: false\n\t\t},\n\t\tdisabled: {\n\t\t\tdescription: \"Блокирует взаимодействие с полем.\",\n\t\t\tcontrol: \"boolean\"\n\t\t},\n\t\tsize: {\n\t\t\tdescription: \"Размер визуального контрола.\",\n\t\t\tcontrol: \"select\",\n\t\t\toptions: [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]\n\t\t}\n\t}\n} satisfies Meta<typeof InputImage>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Controlled: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(args.value);\n\t\treturn <InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Аватар\",\n\t\tdescription: \"Выберите одно изображение профиля.\",\n\t\tplaceholder: \"Выберите изображение\",\n\t\treadMode: \"data-url\",\n\t\tallowedMime: [\"image/png\", \"image/jpeg\", \"image/webp\"],\n\t\tvalue: undefined\n\t}\n};\n\nexport const WithInitialImage: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(createMockReadImageResult());\n\n\t\treturn (\n\t\t\t<div style={{ display: \"grid\", gap: 12 }}>\n\t\t\t\t<InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />\n\t\t\t\t{value?.mode === \"data-url\" && (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={value.dataUrl}\n\t\t\t\t\t\talt=\"Предпросмотр\"\n\t\t\t\t\t\tstyle={{ width: 96, height: 96, objectFit: \"cover\", border: \"1px solid var(--border-0)\" }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n\targs: {\n\t\tlabel: \"Изображение с предпросмотром\",\n\t\tdescription: \"Сторис показывает, что значение можно использовать для preview.\"\n\t}\n};\n\nexport const ArrayBufferMode: Story = {\n\trender: (args) => {\n\t\tconst [value, setValue] = useState<ReadImageResult | undefined>(undefined);\n\t\treturn <InputImage {...args} value={value} onChange={setValue} onClear={() => setValue(undefined)} />;\n\t},\n\targs: {\n\t\tlabel: \"Двоичный режим\",\n\t\tdescription: \"Используется, когда изображение нужно обработать как бинарные данные.\",\n\t\treadMode: \"array-buffer\",\n\t\tvalue: undefined\n\t}\n};\n"],"mappings":";;;;AAOA,IAAM,KAA6B,IAAe,iBAAkC;CACnF,IAAM,IAAO,IAAI,KAAK,CAAC,YAAY,GAAG,GAAM;EAAE,MAAM;EAAa,cAAc;CAAc,CAAC;CAE9F,OAAO;EACN,MAAM;EACN,MAAM;GACL,MAAM,EAAK;GACX,MAAM,EAAK;GACX,MAAM,EAAK;GACX,cAAc,EAAK;EACpB;EACA,SAAS;EACT;EACA,YAAY;GACX,OAAO;GACP,QAAQ;EACT;CACD;AACD,GAEM,IAAO;CACZ,OAAO;CACP,WAAW;CACX,MAAM;EACL,OAAO,KAAA;EACP,gBAAgB,CAAC;CAClB;CACA,YAAY;EACX,cAAc;EACd,QAAQ;CACT;CACA,MAAM,CAAC,UAAU;CACjB,UAAU;EACT,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,SAAS;GACR,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;GACT,SAAS,CAAC,YAAY,cAAc;EACrC;EACA,OAAO;GACN,aAAa;GACb,SAAS;EACV;EACA,cAAc;GACb,aAAa;GACb,SAAS;EACV;EACA,UAAU;GACT,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,aAAa;GACb,SAAS;GACT,SAAS;IAAC;IAAM;IAAM;IAAM;IAAM;GAAI;EACvC;CACD;AACD,GAKa,IAAoB;CAChC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,EAAK,KAAK;EAC1E,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACrG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,aAAa;EACb,UAAU;EACV,aAAa;GAAC;GAAa;GAAc;EAAY;EACrD,OAAO,KAAA;CACR;AACD,GAEa,IAA0B;CACtC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,EAA0B,CAAC;EAE3F,OACC,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,KAAK;GAAG;aAAvC,CACC,kBAAC,GAAD;IAAY,GAAI;IAAa;IAAO,UAAU;IAAU,eAAe,EAAS,KAAA,CAAS;GAAI,CAAA,GAC5F,GAAO,SAAS,cAChB,kBAAC,OAAD;IACC,KAAK,EAAM;IACX,KAAI;IACJ,OAAO;KAAE,OAAO;KAAI,QAAQ;KAAI,WAAW;KAAS,QAAQ;IAA4B;GACxF,CAAA,CAEE;;CAEP;CACA,MAAM;EACL,OAAO;EACP,aAAa;CACd;AACD,GAEa,IAAyB;CACrC,SAAS,MAAS;EACjB,IAAM,CAAC,GAAO,KAAY,EAAsC,KAAA,CAAS;EACzE,OAAO,kBAAC,GAAD;GAAY,GAAI;GAAa;GAAO,UAAU;GAAU,eAAe,EAAS,KAAA,CAAS;EAAI,CAAA;CACrG;CACA,MAAM;EACL,OAAO;EACP,aAAa;EACb,UAAU;EACV,OAAO,KAAA;CACR;AACD"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../chunks/Input-Ce2HXBUc.js";
1
+ import { t as e } from "../chunks/Input-Wrew1puH.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { useState as n } from "react";
4
4
  //#region src/input-search/InputSearch.tsx