@ryuzaki13/react-foundation-ui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/advanced-search/index.d.ts +3 -0
  2. package/dist/advanced-search/index.d.ts.map +1 -0
  3. package/dist/advanced-search/index.js +361 -0
  4. package/dist/advanced-search/index.js.map +1 -0
  5. package/dist/advanced-search/lib/index.d.ts +2 -0
  6. package/dist/advanced-search/lib/index.d.ts.map +1 -0
  7. package/dist/advanced-search/lib/searchParts.d.ts +3 -0
  8. package/dist/advanced-search/lib/searchParts.d.ts.map +1 -0
  9. package/dist/advanced-search/model/index.d.ts +5 -0
  10. package/dist/advanced-search/model/index.d.ts.map +1 -0
  11. package/dist/advanced-search/model/types.d.ts +55 -0
  12. package/dist/advanced-search/model/types.d.ts.map +1 -0
  13. package/dist/advanced-search/model/useAdvancedSearch.d.ts +11 -0
  14. package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +1 -0
  15. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +6 -0
  16. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +1 -0
  17. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +13 -0
  18. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +1 -0
  19. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +13 -0
  20. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +1 -0
  21. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +8 -0
  22. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +1 -0
  23. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +9 -0
  24. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +1 -0
  25. package/dist/advanced-search/ui/index.d.ts +2 -0
  26. package/dist/advanced-search/ui/index.d.ts.map +1 -0
  27. package/dist/badge/index.js +1 -1
  28. package/dist/badge/stories/Badge.stories.js +22 -22
  29. package/dist/base-table/index.js +2 -2
  30. package/dist/button/index.js +7 -7
  31. package/dist/button/stories/Button.stories.js +1 -1
  32. package/dist/check-box/index.js +1 -1
  33. package/dist/check-box/stories/CheckBox.stories.js +25 -25
  34. package/dist/chunks/{BadgeList-6qL9oNAp.js → BadgeList-DYgun2rf.js} +16 -16
  35. package/dist/chunks/{BadgeList-6qL9oNAp.js.map → BadgeList-DYgun2rf.js.map} +1 -1
  36. package/dist/chunks/{Button-BZ_b-Kin.js → Button-CCWuggdA.js} +16 -16
  37. package/dist/chunks/{Button-BZ_b-Kin.js.map → Button-CCWuggdA.js.map} +1 -1
  38. package/dist/chunks/CalendarView-DjeTJkTT.js +435 -0
  39. package/dist/chunks/{CalendarView-DjShdvRD.js.map → CalendarView-DjeTJkTT.js.map} +1 -1
  40. package/dist/chunks/CheckBox-BowNqqd3.js +48 -0
  41. package/dist/chunks/{CheckBox-CulnjNvJ.js.map → CheckBox-BowNqqd3.js.map} +1 -1
  42. package/dist/chunks/{DateInput-LSSvObtg.js → DateInput--tfofQ2x.js} +68 -68
  43. package/dist/chunks/{DateInput-LSSvObtg.js.map → DateInput--tfofQ2x.js.map} +1 -1
  44. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js → DateRangePresetSelect-UgsfaOeM.js} +22 -22
  45. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js.map → DateRangePresetSelect-UgsfaOeM.js.map} +1 -1
  46. package/dist/chunks/Detail-DHDMsg8q.js +80 -0
  47. package/dist/chunks/{Detail-DKolHye4.js.map → Detail-DHDMsg8q.js.map} +1 -1
  48. package/dist/chunks/{Dialog-BPS4BeWZ.js → Dialog-CFIvGxER.js} +8 -8
  49. package/dist/chunks/{Dialog-BPS4BeWZ.js.map → Dialog-CFIvGxER.js.map} +1 -1
  50. package/dist/chunks/DisclosureGroup-CfRTkl6Z.js +49 -0
  51. package/dist/chunks/{DisclosureGroup-Plk2M_Vl.js.map → DisclosureGroup-CfRTkl6Z.js.map} +1 -1
  52. package/dist/chunks/{DropZone-DPGTpHI6.js → DropZone-kJfbZU5g.js} +22 -22
  53. package/dist/chunks/{DropZone-DPGTpHI6.js.map → DropZone-kJfbZU5g.js.map} +1 -1
  54. package/dist/chunks/{DropdownMenu-Ds-trH4M.js → DropdownMenu-DQeR3y7M.js} +138 -138
  55. package/dist/chunks/{DropdownMenu-Ds-trH4M.js.map → DropdownMenu-DQeR3y7M.js.map} +1 -1
  56. package/dist/chunks/{Flex-DbBdq336.js → Flex-DUYSL5TE.js} +16 -16
  57. package/dist/chunks/{Flex-DbBdq336.js.map → Flex-DUYSL5TE.js.map} +1 -1
  58. package/dist/chunks/Input-BmjlpA09.js +227 -0
  59. package/dist/chunks/{Input-Wrew1puH.js.map → Input-BmjlpA09.js.map} +1 -1
  60. package/dist/chunks/{InputDateTime-2PCX8an8.js → InputDateTime-CxfAFe2L.js} +56 -56
  61. package/dist/chunks/{InputDateTime-2PCX8an8.js.map → InputDateTime-CxfAFe2L.js.map} +1 -1
  62. package/dist/chunks/{InputFile-Ca-bRo93.js → InputFile-CyZu__B_.js} +17 -17
  63. package/dist/chunks/{InputFile-Ca-bRo93.js.map → InputFile-CyZu__B_.js.map} +1 -1
  64. package/dist/chunks/{InputFiles-pI9rQXOI.js → InputFiles-CrTJV27R.js} +31 -31
  65. package/dist/chunks/{InputFiles-pI9rQXOI.js.map → InputFiles-CrTJV27R.js.map} +1 -1
  66. package/dist/chunks/{InputImage-B522AQzl.js → InputImage-Cw8rPYQu.js} +18 -18
  67. package/dist/chunks/{InputImage-B522AQzl.js.map → InputImage-Cw8rPYQu.js.map} +1 -1
  68. package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js → LabeledExpandableActionPanel-D3kUvmFH.js} +26 -26
  69. package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js.map → LabeledExpandableActionPanel-D3kUvmFH.js.map} +1 -1
  70. package/dist/chunks/Listbox-BZlp5qHz.js +81 -0
  71. package/dist/chunks/{Listbox-B6F_IKQv.js.map → Listbox-BZlp5qHz.js.map} +1 -1
  72. package/dist/chunks/{MultiSelect-CUXA8gx-.js → MultiSelect-D1XYuwH1.js} +113 -113
  73. package/dist/chunks/{MultiSelect-CUXA8gx-.js.map → MultiSelect-D1XYuwH1.js.map} +1 -1
  74. package/dist/chunks/{NotificationsHost-Bnq7xFKO.js → NotificationsHost-_icJx4xR.js} +44 -44
  75. package/dist/chunks/{NotificationsHost-Bnq7xFKO.js.map → NotificationsHost-_icJx4xR.js.map} +1 -1
  76. package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js → PresetRangeDateInput-CapirptQ.js} +11 -11
  77. package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js.map → PresetRangeDateInput-CapirptQ.js.map} +1 -1
  78. package/dist/chunks/RadioButton-D0uA0rX_.js +48 -0
  79. package/dist/chunks/{RadioButton-D5vPW4Yr.js.map → RadioButton-D0uA0rX_.js.map} +1 -1
  80. package/dist/chunks/RadioGroup-B9XjkcOy.js +121 -0
  81. package/dist/chunks/{RadioGroup-BAhN1d1X.js.map → RadioGroup-B9XjkcOy.js.map} +1 -1
  82. package/dist/chunks/{Select-CoAYWNOn.js → Select-CXeVjVKA.js} +11 -11
  83. package/dist/chunks/{Select-CoAYWNOn.js.map → Select-CXeVjVKA.js.map} +1 -1
  84. package/dist/chunks/{SerializableSelect-awBOWKTj.js → SerializableSelect-DkYeJtAO.js} +2 -2
  85. package/dist/chunks/{SerializableSelect-awBOWKTj.js.map → SerializableSelect-DkYeJtAO.js.map} +1 -1
  86. package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js → SingleDateTimeInput-BmeuVGQT.js} +78 -78
  87. package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js.map → SingleDateTimeInput-BmeuVGQT.js.map} +1 -1
  88. package/dist/chunks/{Splitter-NjNFuEq4.js → Splitter-BFkVGVRb.js} +32 -32
  89. package/dist/chunks/{Splitter-NjNFuEq4.js.map → Splitter-BFkVGVRb.js.map} +1 -1
  90. package/dist/chunks/StateSelect-1jH3uLz9.js +78 -0
  91. package/dist/chunks/{StateSelect-abZq176J.js.map → StateSelect-1jH3uLz9.js.map} +1 -1
  92. package/dist/chunks/{Switch-DHMnZVmN.js → Switch-B57Qmy1z.js} +19 -19
  93. package/dist/chunks/{Switch-DHMnZVmN.js.map → Switch-B57Qmy1z.js.map} +1 -1
  94. package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js → TextEditorLexicalClient-DRhAswpP.js} +204 -204
  95. package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js.map → TextEditorLexicalClient-DRhAswpP.js.map} +1 -1
  96. package/dist/chunks/{Textarea-DOVrPH4I.js → Textarea-C9UdUueF.js} +2 -2
  97. package/dist/chunks/{Textarea-DOVrPH4I.js.map → Textarea-C9UdUueF.js.map} +1 -1
  98. package/dist/chunks/{TimePanel-_kF2RtHk.js → TimePanel-b4saqoUY.js} +27 -27
  99. package/dist/chunks/{TimePanel-_kF2RtHk.js.map → TimePanel-b4saqoUY.js.map} +1 -1
  100. package/dist/chunks/{Toggle-C_fE-bkM.js → Toggle-DVqOQXmt.js} +18 -18
  101. package/dist/chunks/{Toggle-C_fE-bkM.js.map → Toggle-DVqOQXmt.js.map} +1 -1
  102. package/dist/chunks/{TreeMultiSelect-C76RYavo.js → TreeMultiSelect-CfQhlfnC.js} +6 -6
  103. package/dist/chunks/{TreeMultiSelect-C76RYavo.js.map → TreeMultiSelect-CfQhlfnC.js.map} +1 -1
  104. package/dist/chunks/{TreePickerBase-qNHIWbYL.js → TreePickerBase-BBUOWsSu.js} +49 -49
  105. package/dist/chunks/{TreePickerBase-qNHIWbYL.js.map → TreePickerBase-BBUOWsSu.js.map} +1 -1
  106. package/dist/chunks/{TreeSelect-LEhNdPCX.js → TreeSelect-2wUXs90E.js} +6 -6
  107. package/dist/chunks/{TreeSelect-LEhNdPCX.js.map → TreeSelect-2wUXs90E.js.map} +1 -1
  108. package/dist/chunks/base-table-CoQlKABk.js +514 -0
  109. package/dist/chunks/{base-table-ij2guVMB.js.map → base-table-CoQlKABk.js.map} +1 -1
  110. package/dist/chunks/{floating-arrow-CdRV69sg.js → floating-arrow-BE-z4QkE.js} +7 -7
  111. package/dist/chunks/{floating-arrow-CdRV69sg.js.map → floating-arrow-BE-z4QkE.js.map} +1 -1
  112. package/dist/chunks/input-search-Dw4rnJBq.js +30 -0
  113. package/dist/chunks/input-search-Dw4rnJBq.js.map +1 -0
  114. package/dist/chunks/{layout-picker-CzZ8Xzkk.js → layout-picker-MWaImn3L.js} +34 -34
  115. package/dist/chunks/{layout-picker-CzZ8Xzkk.js.map → layout-picker-MWaImn3L.js.map} +1 -1
  116. package/dist/chunks/{misc-Bj0y3ERC.js → misc-DoqZBMof.js} +110 -110
  117. package/dist/chunks/{misc-Bj0y3ERC.js.map → misc-DoqZBMof.js.map} +1 -1
  118. package/dist/chunks/{modal-B4ivQb2h.js → modal-B3HY3laL.js} +40 -40
  119. package/dist/chunks/{modal-B4ivQb2h.js.map → modal-B3HY3laL.js.map} +1 -1
  120. package/dist/chunks/multi-select-BzYIviCU.js +1305 -0
  121. package/dist/chunks/multi-select-BzYIviCU.js.map +1 -0
  122. package/dist/chunks/{picker-gIUs0nE_.js → picker-Dg55Ss-B.js} +74 -74
  123. package/dist/chunks/{picker-gIUs0nE_.js.map → picker-Dg55Ss-B.js.map} +1 -1
  124. package/dist/chunks/{popover-C79P5bm2.js → popover-xJJqy1v6.js} +52 -52
  125. package/dist/chunks/{popover-C79P5bm2.js.map → popover-xJJqy1v6.js.map} +1 -1
  126. package/dist/chunks/{separator-CIqnk2z9.js → separator-B72Aq-6a.js} +2 -2
  127. package/dist/chunks/{separator-CIqnk2z9.js.map → separator-B72Aq-6a.js.map} +1 -1
  128. package/dist/chunks/{slider-CigVo4Ju.js → slider-CFKsfxFp.js} +83 -83
  129. package/dist/chunks/{slider-CigVo4Ju.js.map → slider-CFKsfxFp.js.map} +1 -1
  130. package/dist/chunks/sortable-DcTIAbjD.js +185 -0
  131. package/dist/chunks/{sortable-BZqnZ_LA.js.map → sortable-DcTIAbjD.js.map} +1 -1
  132. package/dist/chunks/{table-CK-CM2zD.js → table-Dc3AqMzP.js} +21 -21
  133. package/dist/chunks/{table-CK-CM2zD.js.map → table-Dc3AqMzP.js.map} +1 -1
  134. package/dist/chunks/{table-column-interactions-DPyJDD7P.js → table-column-interactions-6RGjmiI5.js} +24 -24
  135. package/dist/chunks/{table-column-interactions-DPyJDD7P.js.map → table-column-interactions-6RGjmiI5.js.map} +1 -1
  136. package/dist/chunks/{tabs-D5ikIIng.js → tabs-DlnVVMJl.js} +96 -96
  137. package/dist/chunks/{tabs-D5ikIIng.js.map → tabs-DlnVVMJl.js.map} +1 -1
  138. package/dist/chunks/{toolbar-C-Ziw_Uh.js → toolbar-BCZNdRXM.js} +2 -2
  139. package/dist/chunks/{toolbar-C-Ziw_Uh.js.map → toolbar-BCZNdRXM.js.map} +1 -1
  140. package/dist/chunks/{wheel-picker-DUHGy7wE.js → wheel-picker-FS58cRsQ.js} +23 -23
  141. package/dist/chunks/{wheel-picker-DUHGy7wE.js.map → wheel-picker-FS58cRsQ.js.map} +1 -1
  142. package/dist/context-menu/index.js +1 -1
  143. package/dist/context-menu/stories/ContextMenu.stories.js +45 -45
  144. package/dist/date-input/index.js +2 -2
  145. package/dist/date-input/stories/DateInput.stories.js +2 -2
  146. package/dist/date-range-preset-select/index.js +1 -1
  147. package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +8 -8
  148. package/dist/date-time-input/index.js +1 -1
  149. package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +38 -38
  150. package/dist/date-time-input/stories/TimePanel.stories.js +9 -9
  151. package/dist/detail/index.js +1 -1
  152. package/dist/detail/stories/Detail.stories.js +1 -1
  153. package/dist/dialog/index.js +1 -1
  154. package/dist/dialog/stories/Dialog.stories.js +16 -16
  155. package/dist/disclosure/index.js +1 -1
  156. package/dist/disclosure/stories/Disclosure.stories.js +1 -1
  157. package/dist/drop-zone/index.js +1 -1
  158. package/dist/drop-zone/stories/DropZone.stories.js +14 -14
  159. package/dist/errors/index.js +47 -47
  160. package/dist/expandable-action-panel/index.js +1 -1
  161. package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +28 -28
  162. package/dist/flex/index.js +2 -2
  163. package/dist/flex/stories/Flex.stories.js +2 -2
  164. package/dist/floating-arrow/index.js +1 -1
  165. package/dist/fullscreen-portal/index.js +6 -6
  166. package/dist/grid/stories/Grid.stories.js +1 -1
  167. package/dist/image/index.js +123 -123
  168. package/dist/input/index.js +1 -1
  169. package/dist/input/stories/Input.stories.js +11 -11
  170. package/dist/input-date-time/index.js +1 -1
  171. package/dist/input-date-time/stories/InputDateTime.stories.js +11 -11
  172. package/dist/input-file/index.js +1 -1
  173. package/dist/input-file/stories/InputFile.stories.js +9 -9
  174. package/dist/input-files/index.js +1 -1
  175. package/dist/input-files/stories/InputFiles.stories.js +9 -9
  176. package/dist/input-image/index.js +1 -1
  177. package/dist/input-image/stories/InputImage.stories.js +15 -15
  178. package/dist/input-search/index.js +2 -30
  179. package/dist/layout-picker/index.js +1 -1
  180. package/dist/layout-picker/stories/LayoutPicker.stories.js +52 -52
  181. package/dist/list/index.js +27 -27
  182. package/dist/listbox/index.js +1 -1
  183. package/dist/listbox/stories/Listbox.stories.js +19 -19
  184. package/dist/misc/index.js +1 -1
  185. package/dist/modal/index.js +1 -1
  186. package/dist/modal/stories/Modal.stories.js +55 -55
  187. package/dist/multi-select/index.js +3 -1141
  188. package/dist/multi-select/ui/stories/MultiSelect.stories.js +17 -17
  189. package/dist/notifications/index.js +1 -1
  190. package/dist/notifications/ui/stories/NotificationsHost.stories.js +59 -59
  191. package/dist/period-select/index.js +20 -20
  192. package/dist/period-select/stories/PeriodSelect.stories.js +17 -17
  193. package/dist/picker/index.js +1 -1
  194. package/dist/popover/index.js +1 -1
  195. package/dist/popover/stories/Popover.stories.js +16 -16
  196. package/dist/preset-range-date-input/index.js +1 -1
  197. package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +9 -9
  198. package/dist/preset-select/index.js +1 -1
  199. package/dist/radio-button/index.js +1 -1
  200. package/dist/radio-button/stories/RadioButton.stories.js +11 -11
  201. package/dist/radio-group/index.js +1 -1
  202. package/dist/radio-group/stories/RadioGroup.stories.js +21 -21
  203. package/dist/select/index.js +2 -2
  204. package/dist/select/stories/Select.stories.js +23 -23
  205. package/dist/select/stories/SerializableSelect.stories.js +22 -22
  206. package/dist/separator/index.js +1 -1
  207. package/dist/simple-table/index.js +5 -5
  208. package/dist/slider/index.js +1 -1
  209. package/dist/slider/stories/Slider.stories.js +32 -32
  210. package/dist/slider/stories/SliderInput.stories.js +39 -39
  211. package/dist/sortable/index.js +1 -1
  212. package/dist/sortable/stories/Sortable.stories.js +23 -23
  213. package/dist/splitter/index.js +1 -1
  214. package/dist/splitter/stories/Splitter.stories.js +1 -1
  215. package/dist/state-select/index.js +1 -1
  216. package/dist/state-select/stories/StateSelect.stories.js +23 -23
  217. package/dist/styles.css +1 -1
  218. package/dist/switch/index.js +1 -1
  219. package/dist/switch/stories/Switch.stories.js +11 -11
  220. package/dist/table/index.js +1 -1
  221. package/dist/table-column-interactions/index.js +1 -1
  222. package/dist/table-sorting/index.js +1 -1
  223. package/dist/tabs/index.js +1 -1
  224. package/dist/tabs/stories/Tabs.stories.js +39 -39
  225. package/dist/text/index.js +20 -20
  226. package/dist/text-editor/index.js +3 -3
  227. package/dist/text-editor/toolbar/index.js +1 -1
  228. package/dist/textarea/index.js +1 -1
  229. package/dist/textarea/stories/Textarea.stories.js +8 -8
  230. package/dist/three-scene/index.js +7 -7
  231. package/dist/toggle/index.js +1 -1
  232. package/dist/toggle/stories/Toggle.stories.js +7 -7
  233. package/dist/toolbar/index.js +16 -16
  234. package/dist/tree/index.js +24 -24
  235. package/dist/tree-select/index.js +2 -2
  236. package/dist/tree-select/stories/TreeMultiSelect.stories.js +9 -9
  237. package/dist/tree-select/stories/TreeSelect.stories.js +9 -9
  238. package/dist/tree-table/index.js +32 -32
  239. package/dist/wheel-picker/index.js +1 -1
  240. package/package.json +11 -1
  241. package/dist/chunks/CalendarView-DjShdvRD.js +0 -435
  242. package/dist/chunks/CheckBox-CulnjNvJ.js +0 -48
  243. package/dist/chunks/Detail-DKolHye4.js +0 -80
  244. package/dist/chunks/DisclosureGroup-Plk2M_Vl.js +0 -49
  245. package/dist/chunks/Input-Wrew1puH.js +0 -227
  246. package/dist/chunks/Listbox-B6F_IKQv.js +0 -81
  247. package/dist/chunks/RadioButton-D5vPW4Yr.js +0 -48
  248. package/dist/chunks/RadioGroup-BAhN1d1X.js +0 -121
  249. package/dist/chunks/StateSelect-abZq176J.js +0 -78
  250. package/dist/chunks/base-table-ij2guVMB.js +0 -514
  251. package/dist/chunks/sortable-BZqnZ_LA.js +0 -185
  252. package/dist/input-search/index.js.map +0 -1
  253. package/dist/multi-select/index.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { d as e, h as t, l as n } from "./misc-Bj0y3ERC.js";
2
- import { cn as r, getRovingFocusTargetIndex as i } from "@ryuzaki13/react-foundation-lib/utils";
3
- import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
4
- import { Children as c, isValidElement as l, useId as u, useMemo as d, useRef as f, useState as p } from "react";
1
+ import { d as e, h as t, l as n } from "./misc-DoqZBMof.js";
2
+ import { Children as r, isValidElement as i, useId as a, useMemo as o, useRef as s, useState as c } from "react";
3
+ import { cn as l, getRovingFocusTargetIndex as u } from "@ryuzaki13/react-foundation-lib/utils";
4
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
5
5
  //#region src/tabs/lib/tabs.ts
6
6
  function m(e) {
7
7
  return e.find((e) => !e.disabled)?.id ?? null;
@@ -17,8 +17,8 @@ function _({ mountStrategy: e, isSelected: t, isVisited: n }) {
17
17
  }
18
18
  //#endregion
19
19
  //#region src/tabs/model/useTabsState.ts
20
- function v({ items: e, value: t, defaultValue: n, onValueChange: r, orientation: a = "horizontal", activationMode: o = "automatic", loop: s = !0 }) {
21
- let c = t !== void 0, l = d(() => g(e), [e]), m = l[0]?.id ?? null, [_, v] = p(() => h(e, n)), [y, b] = p(() => h(e, t ?? n)), x = h(e, t ?? n), [S, C] = p(() => x ? /* @__PURE__ */ new Set([x]) : /* @__PURE__ */ new Set()), w = u(), T = f({}), E = h(e, c ? t : _), D = h(e, y) ?? E ?? m, O = d(() => {
20
+ function v({ items: e, value: t, defaultValue: n, onValueChange: r, orientation: i = "horizontal", activationMode: l = "automatic", loop: d = !0 }) {
21
+ let f = t !== void 0, p = o(() => g(e), [e]), m = p[0]?.id ?? null, [_, v] = c(() => h(e, n)), [y, b] = c(() => h(e, t ?? n)), x = h(e, t ?? n), [S, C] = c(() => x ? /* @__PURE__ */ new Set([x]) : /* @__PURE__ */ new Set()), w = a(), T = s({}), E = h(e, f ? t : _), D = h(e, y) ?? E ?? m, O = o(() => {
22
22
  if (!E || S.has(E)) return S;
23
23
  let e = new Set(S);
24
24
  return e.add(E), e;
@@ -28,29 +28,29 @@ function v({ items: e, value: t, defaultValue: n, onValueChange: r, orientation:
28
28
  if (e.has(n)) return e;
29
29
  let t = new Set(e);
30
30
  return t.add(n), t;
31
- }), c || v(n), r?.(n));
31
+ }), f || v(n), r?.(n));
32
32
  }, A = (e) => {
33
33
  T.current[e]?.focus();
34
34
  }, j = (e) => {
35
- if (l.length < 2) return;
36
- let t = i({
37
- currentIndex: Math.max(0, l.findIndex((e) => e.id === (D ?? E ?? m))),
38
- itemCount: l.length,
35
+ if (p.length < 2) return;
36
+ let t = u({
37
+ currentIndex: Math.max(0, p.findIndex((e) => e.id === (D ?? E ?? m))),
38
+ itemCount: p.length,
39
39
  key: e.key,
40
- orientation: a,
41
- wrap: s
40
+ orientation: i,
41
+ wrap: d
42
42
  });
43
43
  if (t === null) return;
44
44
  e.preventDefault();
45
- let n = l[t]?.id;
46
- n && (b(n), A(n), o === "automatic" && k(n));
45
+ let n = p[t]?.id;
46
+ n && (b(n), A(n), l === "automatic" && k(n));
47
47
  }, M = (e) => {
48
48
  let t = e.relatedTarget;
49
49
  t instanceof Node && e.currentTarget.contains(t) || b(E ?? m);
50
50
  }, N = (e) => `${w}-tab-${e}`, P = (e) => `${w}-panel-${e}`;
51
51
  return {
52
- activationMode: o,
53
- orientation: a,
52
+ activationMode: l,
53
+ orientation: i,
54
54
  selectedTabId: E,
55
55
  tabbableTabId: D,
56
56
  onTabListKeyDown: j,
@@ -98,28 +98,28 @@ var y = {
98
98
  };
99
99
  //#endregion
100
100
  //#region src/tabs/ui/TabsLoadingState.tsx
101
- function b({ containerClassName: e, tabListClassName: n, panelsClassName: i, panelClassName: a, panelBodyClassName: c, loadingText: l }) {
102
- return /* @__PURE__ */ s("div", {
101
+ function b({ containerClassName: e, tabListClassName: n, panelsClassName: r, panelClassName: i, panelBodyClassName: a, loadingText: o }) {
102
+ return /* @__PURE__ */ p("div", {
103
103
  className: e,
104
- children: [/* @__PURE__ */ o("div", {
104
+ children: [/* @__PURE__ */ f("div", {
105
105
  className: n,
106
106
  "aria-hidden": "true",
107
- children: /* @__PURE__ */ o("button", {
107
+ children: /* @__PURE__ */ f("button", {
108
108
  type: "button",
109
109
  disabled: !0,
110
110
  "data-disabled": "",
111
- className: r(y.tab, "skeletonLine"),
111
+ className: l(y.tab, "skeletonLine"),
112
112
  children: "Загрузка..."
113
113
  })
114
- }), /* @__PURE__ */ o("div", {
115
- className: i,
114
+ }), /* @__PURE__ */ f("div", {
115
+ className: r,
116
116
  "aria-busy": "true",
117
- children: /* @__PURE__ */ o("div", {
118
- className: a,
119
- children: /* @__PURE__ */ o("div", {
120
- className: c,
121
- children: /* @__PURE__ */ o(t, {
122
- text: l,
117
+ children: /* @__PURE__ */ f("div", {
118
+ className: i,
119
+ children: /* @__PURE__ */ f("div", {
120
+ className: a,
121
+ children: /* @__PURE__ */ f(t, {
122
+ text: o,
123
123
  className: "radiusSm"
124
124
  })
125
125
  })
@@ -130,15 +130,15 @@ function b({ containerClassName: e, tabListClassName: n, panelsClassName: i, pan
130
130
  //#endregion
131
131
  //#region src/tabs/ui/TabsNoDataState.tsx
132
132
  function x({ containerClassName: t, panelsClassName: n, panelClassName: r, panelBodyClassName: i }) {
133
- return /* @__PURE__ */ o("div", {
133
+ return /* @__PURE__ */ f("div", {
134
134
  className: t,
135
- children: /* @__PURE__ */ o("div", {
135
+ children: /* @__PURE__ */ f("div", {
136
136
  className: n,
137
- children: /* @__PURE__ */ o("div", {
137
+ children: /* @__PURE__ */ f("div", {
138
138
  className: r,
139
- children: /* @__PURE__ */ o("div", {
139
+ children: /* @__PURE__ */ f("div", {
140
140
  className: i,
141
- children: /* @__PURE__ */ o(e, { className: "radiusSm" })
141
+ children: /* @__PURE__ */ f(e, { className: "radiusSm" })
142
142
  })
143
143
  })
144
144
  })
@@ -147,7 +147,7 @@ function x({ containerClassName: t, panelsClassName: n, panelClassName: r, panel
147
147
  //#endregion
148
148
  //#region src/tabs/ui/TabsPanel.tsx
149
149
  function S({ tabId: e, isSelected: t, className: n, getTabElementId: r, getPanelElementId: i, children: a }) {
150
- return /* @__PURE__ */ o("div", {
150
+ return /* @__PURE__ */ f("div", {
151
151
  role: "tabpanel",
152
152
  id: i(e),
153
153
  "aria-labelledby": r(e),
@@ -158,52 +158,52 @@ function S({ tabId: e, isSelected: t, className: n, getTabElementId: r, getPanel
158
158
  }
159
159
  //#endregion
160
160
  //#region src/tabs/ui/TabsTabList.tsx
161
- function C({ items: e, state: t, className: i, ariaLabel: s, ariaLabelledBy: c }) {
162
- return /* @__PURE__ */ o("div", {
163
- className: i,
161
+ function C({ items: e, state: t, className: r, ariaLabel: i, ariaLabelledBy: a }) {
162
+ return /* @__PURE__ */ f("div", {
163
+ className: r,
164
164
  role: "tablist",
165
165
  "aria-orientation": t.orientation,
166
- "aria-label": s,
167
- "aria-labelledby": c,
166
+ "aria-label": i,
167
+ "aria-labelledby": a,
168
168
  onKeyDown: t.onTabListKeyDown,
169
169
  onBlur: t.onTabListBlur,
170
- children: ((e) => t.orientation === "horizontal" ? /* @__PURE__ */ o(n, { children: e }) : /* @__PURE__ */ o(a, { children: e }))(e.map((e) => /* @__PURE__ */ o("button", {
170
+ children: ((e) => t.orientation === "horizontal" ? /* @__PURE__ */ f(n, { children: e }) : /* @__PURE__ */ f(d, { children: e }))(e.map((e) => /* @__PURE__ */ f("button", {
171
171
  ...t.getTabButtonProps(e),
172
172
  "data-ui": "tabs-tab",
173
173
  "data-action": "select-tab",
174
- className: r(y.tab, "textWrap", e.id === t.selectedTabId && y.selected),
174
+ className: l(y.tab, "textWrap", e.id === t.selectedTabId && y.selected),
175
175
  children: e.title
176
176
  }, e.id)))
177
177
  });
178
178
  }
179
179
  //#endregion
180
180
  //#region src/tabs/ui/TabsBox.tsx
181
- function w({ items: e, value: t, defaultValue: n, onValueChange: i, className: a, isLoading: c, loadingText: l, cleanPanel: u, bordered: d = !1, orientation: f = "horizontal", activationMode: p = "automatic", mountStrategy: m = "unmount", loop: h = !0, "aria-label": g, "aria-labelledby": w }) {
181
+ function w({ items: e, value: t, defaultValue: n, onValueChange: r, className: i, isLoading: a, loadingText: o, cleanPanel: s, bordered: c = !1, orientation: u = "horizontal", activationMode: d = "automatic", mountStrategy: m = "unmount", loop: h = !0, "aria-label": g, "aria-labelledby": w }) {
182
182
  let T = v({
183
183
  items: e,
184
184
  value: t,
185
185
  defaultValue: n,
186
- onValueChange: i,
187
- orientation: f,
188
- activationMode: p,
186
+ onValueChange: r,
187
+ orientation: u,
188
+ activationMode: d,
189
189
  loop: h
190
- }), E = r(y.tabsContainer, y[f], d && y.bordered, u && y.cleanPanel, a), D = y.tabs, O = r(y.panels, y.panelScrollable, "scrollable overscroll"), k = y.panel, A = y.panelBody;
191
- return c ? /* @__PURE__ */ o(b, {
190
+ }), E = l(y.tabsContainer, y[u], c && y.bordered, s && y.cleanPanel, i), D = y.tabs, O = l(y.panels, y.panelScrollable, "scrollable overscroll"), k = y.panel, A = y.panelBody;
191
+ return a ? /* @__PURE__ */ f(b, {
192
192
  containerClassName: E,
193
193
  tabListClassName: D,
194
194
  panelsClassName: O,
195
195
  panelClassName: k,
196
196
  panelBodyClassName: A,
197
- loadingText: l
198
- }) : e.length ? /* @__PURE__ */ s("div", {
197
+ loadingText: o
198
+ }) : e.length ? /* @__PURE__ */ p("div", {
199
199
  className: E,
200
- children: [/* @__PURE__ */ o(C, {
200
+ children: [/* @__PURE__ */ f(C, {
201
201
  items: e,
202
202
  state: T,
203
203
  className: D,
204
204
  ariaLabel: g,
205
205
  ariaLabelledBy: w
206
- }), /* @__PURE__ */ o("div", {
206
+ }), /* @__PURE__ */ f("div", {
207
207
  className: O,
208
208
  children: e.map((e) => {
209
209
  let t = e.id === T.selectedTabId;
@@ -211,20 +211,20 @@ function w({ items: e, value: t, defaultValue: n, onValueChange: i, className: a
211
211
  mountStrategy: m,
212
212
  isSelected: t,
213
213
  isVisited: T.isVisited(e.id)
214
- }) ? /* @__PURE__ */ o(S, {
214
+ }) ? /* @__PURE__ */ f(S, {
215
215
  tabId: e.id,
216
216
  isSelected: t,
217
217
  className: k,
218
218
  getTabElementId: T.getTabElementId,
219
219
  getPanelElementId: T.getPanelElementId,
220
- children: /* @__PURE__ */ o("div", {
220
+ children: /* @__PURE__ */ f("div", {
221
221
  className: A,
222
222
  children: e.content
223
223
  })
224
224
  }, e.id) : null;
225
225
  })
226
226
  })]
227
- }) : /* @__PURE__ */ o(x, {
227
+ }) : /* @__PURE__ */ f(x, {
228
228
  containerClassName: E,
229
229
  panelsClassName: O,
230
230
  panelClassName: k,
@@ -234,7 +234,7 @@ function w({ items: e, value: t, defaultValue: n, onValueChange: i, className: a
234
234
  //#endregion
235
235
  //#region src/tabs/ui/Tabs.tsx
236
236
  function T({ onChange: e, onValueChange: t, ...n }) {
237
- return /* @__PURE__ */ o(w, {
237
+ return /* @__PURE__ */ f(w, {
238
238
  ...n,
239
239
  onValueChange: (n) => {
240
240
  t?.(n), e?.(n);
@@ -257,54 +257,54 @@ function A(e) {
257
257
  return null;
258
258
  }
259
259
  function j(e, t) {
260
- return l(e) && A(e) === t;
260
+ return i(e) && A(e) === t;
261
261
  }
262
262
  function M({ children: e }) {
263
- return /* @__PURE__ */ o(a, { children: e });
263
+ return /* @__PURE__ */ f(d, { children: e });
264
264
  }
265
265
  M.displayName = E;
266
266
  function N({ children: e }) {
267
- return /* @__PURE__ */ o(a, { children: e });
267
+ return /* @__PURE__ */ f(d, { children: e });
268
268
  }
269
269
  N.displayName = D;
270
270
  function P({ children: e }) {
271
- return /* @__PURE__ */ o(a, { children: e });
271
+ return /* @__PURE__ */ f(d, { children: e });
272
272
  }
273
273
  P.displayName = O;
274
274
  function F({ children: e }) {
275
- return /* @__PURE__ */ o(a, { children: e });
275
+ return /* @__PURE__ */ f(d, { children: e });
276
276
  }
277
277
  F.displayName = k;
278
278
  function I(e, t) {
279
- let n = null, r = null, i = null;
280
- for (let a of c.toArray(e)) {
281
- if (!l(a)) throw Error(`TabsLayout.Tab "${t}" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`);
282
- if (j(a, D)) {
279
+ let n = null, a = null, o = null;
280
+ for (let s of r.toArray(e)) {
281
+ if (!i(s)) throw Error(`TabsLayout.Tab "${t}" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`);
282
+ if (j(s, D)) {
283
283
  if (n) throw Error(`TabsLayout.Tab "${t}" содержит более одного блока TabsLayout.Toolbar.`);
284
- n = a.props;
284
+ n = s.props;
285
285
  continue;
286
286
  }
287
- if (j(a, O)) {
288
- if (r) throw Error(`TabsLayout.Tab "${t}" содержит более одного блока TabsLayout.Content.`);
289
- r = a.props;
287
+ if (j(s, O)) {
288
+ if (a) throw Error(`TabsLayout.Tab "${t}" содержит более одного блока TabsLayout.Content.`);
289
+ a = s.props;
290
290
  continue;
291
291
  }
292
- if (j(a, k)) {
293
- if (i) throw Error(`TabsLayout.Tab "${t}" содержит более одного блока TabsLayout.Footer.`);
294
- i = a.props;
292
+ if (j(s, k)) {
293
+ if (o) throw Error(`TabsLayout.Tab "${t}" содержит более одного блока TabsLayout.Footer.`);
294
+ o = s.props;
295
295
  continue;
296
296
  }
297
297
  throw Error(`TabsLayout.Tab "${t}" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`);
298
298
  }
299
- if (!r) throw Error(`TabsLayout.Tab "${t}" должен содержать блок TabsLayout.Content.`);
299
+ if (!a) throw Error(`TabsLayout.Tab "${t}" должен содержать блок TabsLayout.Content.`);
300
300
  return {
301
301
  toolbar: n,
302
- content: r,
303
- footer: i
302
+ content: a,
303
+ footer: o
304
304
  };
305
305
  }
306
306
  function L(e) {
307
- return c.toArray(e).map((e) => {
307
+ return r.toArray(e).map((e) => {
308
308
  if (!j(e, E)) throw Error("TabsLayout принимает только дочерние элементы TabsLayout.Tab.");
309
309
  return {
310
310
  id: e.props.id,
@@ -314,54 +314,54 @@ function L(e) {
314
314
  };
315
315
  });
316
316
  }
317
- var R = ({ children: e, value: t, defaultValue: n, onValueChange: i, className: a, bordered: c, cleanPanel: l, orientation: u = "horizontal", activationMode: f = "manual", mountStrategy: p = "lazy", loop: m = !0, "aria-label": h, "aria-labelledby": g }) => {
318
- let b = d(() => L(e), [e]), x = v({
317
+ var R = ({ children: e, value: t, defaultValue: n, onValueChange: r, className: i, bordered: a, cleanPanel: s, orientation: c = "horizontal", activationMode: u = "manual", mountStrategy: d = "lazy", loop: m = !0, "aria-label": h, "aria-labelledby": g }) => {
318
+ let b = o(() => L(e), [e]), x = v({
319
319
  items: b,
320
320
  value: t,
321
321
  defaultValue: n,
322
- onValueChange: i,
323
- orientation: u,
324
- activationMode: f,
322
+ onValueChange: r,
323
+ orientation: c,
324
+ activationMode: u,
325
325
  loop: m
326
- }), w = r(y.tabsContainer, y[u], c && y.bordered, l && y.cleanPanel, a), T = r(y.panels, y.layoutPanels);
327
- return /* @__PURE__ */ s("div", {
326
+ }), w = l(y.tabsContainer, y[c], a && y.bordered, s && y.cleanPanel, i), T = l(y.panels, y.layoutPanels);
327
+ return /* @__PURE__ */ p("div", {
328
328
  className: w,
329
- children: [/* @__PURE__ */ o(C, {
329
+ children: [/* @__PURE__ */ f(C, {
330
330
  items: b,
331
331
  state: x,
332
332
  className: y.tabs,
333
333
  ariaLabel: h,
334
334
  ariaLabelledBy: g
335
- }), /* @__PURE__ */ o("div", {
335
+ }), /* @__PURE__ */ f("div", {
336
336
  className: T,
337
337
  children: b.map((e) => {
338
338
  let t = e.id === x.selectedTabId;
339
339
  if (!_({
340
- mountStrategy: p,
340
+ mountStrategy: d,
341
341
  isSelected: t,
342
342
  isVisited: x.isVisited(e.id)
343
343
  })) return null;
344
344
  let n = `${e.toolbar ? "auto " : ""}minmax(0, 1fr)${e.footer ? " auto" : ""}`;
345
- return /* @__PURE__ */ o(S, {
345
+ return /* @__PURE__ */ f(S, {
346
346
  tabId: e.id,
347
347
  isSelected: t,
348
348
  className: y.panel,
349
349
  getTabElementId: x.getTabElementId,
350
350
  getPanelElementId: x.getPanelElementId,
351
- children: /* @__PURE__ */ s("div", {
351
+ children: /* @__PURE__ */ p("div", {
352
352
  className: y.layoutPanel,
353
353
  style: { gridTemplateRows: n },
354
354
  children: [
355
- e.toolbar ? /* @__PURE__ */ o("div", {
356
- className: r(y.layoutSection, e.toolbar.className),
355
+ e.toolbar ? /* @__PURE__ */ f("div", {
356
+ className: l(y.layoutSection, e.toolbar.className),
357
357
  children: e.toolbar.children
358
358
  }) : null,
359
- /* @__PURE__ */ o("div", {
360
- className: r(y.layoutSection, y.layoutContent, e.content.className),
359
+ /* @__PURE__ */ f("div", {
360
+ className: l(y.layoutSection, y.layoutContent, e.content.className),
361
361
  children: e.content.children
362
362
  }),
363
- e.footer ? /* @__PURE__ */ o("div", {
364
- className: r(y.layoutSection, e.footer.className),
363
+ e.footer ? /* @__PURE__ */ f("div", {
364
+ className: l(y.layoutSection, e.footer.className),
365
365
  children: e.footer.children
366
366
  }) : null
367
367
  ]
@@ -381,4 +381,4 @@ var z = Object.assign(R, {
381
381
  //#endregion
382
382
  export { T as n, w as r, z as t };
383
383
 
384
- //# sourceMappingURL=tabs-D5ikIIng.js.map
384
+ //# sourceMappingURL=tabs-DlnVVMJl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-D5ikIIng.js","names":[],"sources":["../../src/tabs/lib/tabs.ts","../../src/tabs/model/useTabsState.ts","../../src/tabs/ui/Tabs.module.scss","../../src/tabs/ui/TabsLoadingState.tsx","../../src/tabs/ui/TabsNoDataState.tsx","../../src/tabs/ui/TabsPanel.tsx","../../src/tabs/ui/TabsTabList.tsx","../../src/tabs/ui/TabsBox.tsx","../../src/tabs/ui/Tabs.tsx","../../src/tabs/ui/TabsLayout.tsx"],"sourcesContent":["import type { TabsDescriptor, TabsMountStrategy } from \"../model/types\";\n\n/**\n * Возвращает идентификатор первой доступной вкладки.\n */\nexport function getFirstEnabledTabId(items: TabsDescriptor[]) {\n\treturn items.find((item) => !item.disabled)?.id ?? null;\n}\n\n/**\n * Возвращает безопасный идентификатор вкладки.\n * Если переданный `candidate` недоступен, выбирается первая доступная вкладка.\n */\nexport function getSafeTabId(items: TabsDescriptor[], candidate: string | undefined | null) {\n\tif (!candidate) {\n\t\treturn getFirstEnabledTabId(items);\n\t}\n\n\tconst matchedItem = items.find((item) => item.id === candidate && !item.disabled);\n\treturn matchedItem?.id ?? getFirstEnabledTabId(items);\n}\n\n/**\n * Возвращает только доступные вкладки для roving focus и клавиатурной навигации.\n */\nexport function getEnabledTabs(items: TabsDescriptor[]) {\n\treturn items.filter((item) => !item.disabled);\n}\n\ninterface ShouldMountTabPanelOptions {\n\tmountStrategy: TabsMountStrategy;\n\tisSelected: boolean;\n\tisVisited: boolean;\n}\n\n/**\n * Определяет, должна ли панель оставаться смонтированной с учётом стратегии монтирования.\n */\nexport function shouldMountTabPanel({ mountStrategy, isSelected, isVisited }: ShouldMountTabPanelOptions) {\n\treturn mountStrategy === \"keep-mounted\" || isSelected || (mountStrategy === \"lazy\" && isVisited);\n}\n","import type React from \"react\";\nimport { FocusEvent, KeyboardEvent, useId, useMemo, useRef, useState } from \"react\";\n\nimport { getRovingFocusTargetIndex } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { getEnabledTabs, getSafeTabId } from \"../lib/tabs\";\n\nimport type { TabsActivationMode, TabsDescriptor, TabsOrientation } from \"./types\";\n\ninterface UseTabsStateOptions {\n\titems: TabsDescriptor[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\torientation?: TabsOrientation;\n\tactivationMode?: TabsActivationMode;\n\tloop?: boolean;\n}\n\n/**\n * Публичная часть модели, необходимая визуальным подкомпонентам tabs.\n */\nexport interface TabsStateModel {\n\tactivationMode: TabsActivationMode;\n\torientation: TabsOrientation;\n\tselectedTabId: string | null;\n\ttabbableTabId: string | null;\n\tonTabListKeyDown: (event: KeyboardEvent<HTMLDivElement>) => void;\n\tonTabListBlur: (event: FocusEvent<HTMLDivElement>) => void;\n\tgetTabElementId: (tabId: string) => string;\n\tgetPanelElementId: (tabId: string) => string;\n\tgetTabButtonProps: (item: TabsDescriptor) => React.ButtonHTMLAttributes<HTMLButtonElement> & {\n\t\tref: (node: HTMLButtonElement | null) => void;\n\t};\n\tisVisited: (tabId: string) => boolean;\n}\n\n/**\n * Инкапсулирует state, a11y-связки и клавиатурную навигацию для всех оболочек tabs.\n */\nexport function useTabsState({\n\titems,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\torientation = \"horizontal\",\n\tactivationMode = \"automatic\",\n\tloop = true\n}: UseTabsStateOptions): TabsStateModel {\n\tconst isControlled = value !== undefined;\n\tconst enabledTabs = useMemo(() => getEnabledTabs(items), [items]);\n\tconst fallbackTabId = enabledTabs[0]?.id ?? null;\n\tconst [internalValue, setInternalValue] = useState(() => getSafeTabId(items, defaultValue));\n\tconst [focusedTabId, setFocusedTabId] = useState<string | null>(() => getSafeTabId(items, value ?? defaultValue));\n\tconst initialVisitedTabId = getSafeTabId(items, value ?? defaultValue);\n\tconst [visitedTabsState, setVisitedTabsState] = useState<Set<string>>(() =>\n\t\tinitialVisitedTabId ? new Set([initialVisitedTabId]) : new Set()\n\t);\n\tconst tabsId = useId();\n\tconst tabRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n\tconst selectedTabId = getSafeTabId(items, isControlled ? value : internalValue);\n\tconst nextTabbableTabId = getSafeTabId(items, focusedTabId) ?? selectedTabId ?? fallbackTabId;\n\tconst visitedTabs = useMemo(() => {\n\t\tif (!selectedTabId || visitedTabsState.has(selectedTabId)) {\n\t\t\treturn visitedTabsState;\n\t\t}\n\n\t\tconst next = new Set(visitedTabsState);\n\t\tnext.add(selectedTabId);\n\t\treturn next;\n\t}, [selectedTabId, visitedTabsState]);\n\n\tconst activateTab = (nextTabId: string) => {\n\t\tconst safeNextTabId = getSafeTabId(items, nextTabId);\n\t\tif (!safeNextTabId) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetVisitedTabsState((prev) => {\n\t\t\tif (prev.has(safeNextTabId)) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tconst next = new Set(prev);\n\t\t\tnext.add(safeNextTabId);\n\t\t\treturn next;\n\t\t});\n\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(safeNextTabId);\n\t\t}\n\n\t\tonValueChange?.(safeNextTabId);\n\t};\n\n\tconst focusTab = (nextTabId: string) => {\n\t\ttabRefs.current[nextTabId]?.focus();\n\t};\n\n\tconst onTabListKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (enabledTabs.length < 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeFocusIndex = Math.max(\n\t\t\t0,\n\t\t\tenabledTabs.findIndex((item) => item.id === (nextTabbableTabId ?? selectedTabId ?? fallbackTabId))\n\t\t);\n\t\tconst nextEnabledIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex: activeFocusIndex,\n\t\t\titemCount: enabledTabs.length,\n\t\t\tkey: event.key,\n\t\t\torientation,\n\t\t\twrap: loop\n\t\t});\n\n\t\tif (nextEnabledIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst nextTabId = enabledTabs[nextEnabledIndex]?.id;\n\t\tif (!nextTabId) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetFocusedTabId(nextTabId);\n\t\tfocusTab(nextTabId);\n\n\t\tif (activationMode === \"automatic\") {\n\t\t\tactivateTab(nextTabId);\n\t\t}\n\t};\n\n\tconst onTabListBlur = (event: FocusEvent<HTMLDivElement>) => {\n\t\tconst nextTarget = event.relatedTarget;\n\n\t\tif (nextTarget instanceof Node && event.currentTarget.contains(nextTarget)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetFocusedTabId(selectedTabId ?? fallbackTabId);\n\t};\n\n\tconst getTabElementId = (tabId: string) => `${tabsId}-tab-${tabId}`;\n\tconst getPanelElementId = (tabId: string) => `${tabsId}-panel-${tabId}`;\n\n\tconst getTabButtonProps = (item: TabsDescriptor) => {\n\t\tconst isSelected = item.id === selectedTabId;\n\t\tconst isTabbable = item.id === nextTabbableTabId;\n\n\t\treturn {\n\t\t\tref: (node: HTMLButtonElement | null) => {\n\t\t\t\ttabRefs.current[item.id] = node;\n\t\t\t},\n\t\t\ttype: \"button\" as const,\n\t\t\trole: \"tab\" as const,\n\t\t\tid: getTabElementId(item.id),\n\t\t\tdisabled: item.disabled,\n\t\t\t\"aria-selected\": isSelected,\n\t\t\t\"aria-controls\": getPanelElementId(item.id),\n\t\t\t\"aria-disabled\": item.disabled || undefined,\n\t\t\ttabIndex: item.disabled ? -1 : isTabbable ? 0 : -1,\n\t\t\tonFocus: () => setFocusedTabId(item.id),\n\t\t\tonClick: () => activateTab(item.id)\n\t\t};\n\t};\n\n\treturn {\n\t\tactivationMode,\n\t\torientation,\n\t\tselectedTabId,\n\t\ttabbableTabId: nextTabbableTabId,\n\t\tonTabListKeyDown,\n\t\tonTabListBlur,\n\t\tgetTabElementId,\n\t\tgetPanelElementId,\n\t\tgetTabButtonProps,\n\t\tisVisited: (tabId: string) => visitedTabs.has(tabId)\n\t};\n}\n",".tabsContainer {\n\t--tabs-border: none;\n\t--tabs-panel-border: none;\n\t--tabs-panel-padding: var(--space-md);\n\t--tabs-panel-bg: var(--surface-1);\n\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.bordered {\n\t--tabs-border: var(--border);\n\t--tabs-panel-border: var(--border);\n}\n\n.cleanPanel {\n\t--tabs-panel-padding: 0;\n\t--tabs-panel-bg: none;\n\t--tabs-panel-border: none;\n}\n\n.tabs {\n\tdisplay: flex;\n\tgap: var(--space-xs);\n\tmin-width: 0;\n\n\tborder: var(--tabs-border);\n\tbackground-color: var(--surface-1);\n\tpadding: var(--space-xs);\n}\n\n.panels {\n\tmin-width: 0;\n\tmin-height: 0;\n\tborder: var(--tabs-panel-border);\n\tbackground-color: var(--tabs-panel-bg);\n}\n\n.tabs,\n.panels {\n\tborder-radius: var(--radius-sm);\n}\n\n.horizontal {\n\tgrid-template-rows: auto minmax(0, 1fr);\n\n\t// .tabs {\n\t// \tflex-wrap: wrap;\n\t// }\n}\n\n.vertical {\n\tgrid-template-columns: 10em minmax(0, 1fr);\n\tmin-height: 0;\n\n\t.tabs {\n\t\tflex-direction: column;\n\t}\n}\n\n.panelScrollable {\n\toverflow: auto;\n}\n\n.tab {\n\ttext-align: left;\n\n\tposition: relative;\n\tmin-height: var(--control-height);\n\tpadding: var(--space-xs) var(--space-md);\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-sm);\n\tfont-weight: 700;\n\tfont-variation-settings: \"wght\" 700;\n\n\tflex-shrink: 0;\n\n\t&:hover {\n\t\tcursor: pointer;\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-accent);\n\t}\n\n\t&.selected {\n\t\tcolor: var(--status-neutral-on-fill);\n\t\tbackground-color: var(--status-neutral-fill);\n\t\tborder-color: var(--border-0);\n\n\t\tbox-shadow: var(--shadow-xs);\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\tcolor: var(--content-2);\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n\n.panel {\n\tpadding: 0;\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n}\n\n.panelBody {\n\tmin-width: 0;\n\tmin-height: 0;\n\n\theight: 100%;\n\tpadding: var(--tabs-panel-padding);\n}\n\n.layoutPanels {\n\toverflow: hidden;\n}\n\n.layoutPanel {\n\tdisplay: grid;\n\tgap: var(--space-md);\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\tpadding: var(--tabs-panel-padding);\n}\n\n.layoutSection {\n\tmin-width: 0;\n}\n\n.layoutContent {\n\tmin-height: 0;\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { LoadingMessage } from \"../../misc\";\n\nimport styles from \"./Tabs.module.scss\";\n\ninterface TabsLoadingStateProps {\n\tcontainerClassName: string;\n\ttabListClassName: string;\n\tpanelsClassName: string;\n\tpanelClassName: string;\n\tpanelBodyClassName: string;\n\tloadingText?: string;\n}\n\n/**\n * Служебное loading-состояние для `TabsBox`.\n */\nexport function TabsLoadingState({\n\tcontainerClassName,\n\ttabListClassName,\n\tpanelsClassName,\n\tpanelClassName,\n\tpanelBodyClassName,\n\tloadingText\n}: TabsLoadingStateProps) {\n\treturn (\n\t\t<div className={containerClassName}>\n\t\t\t<div className={tabListClassName} aria-hidden=\"true\">\n\t\t\t\t<button type=\"button\" disabled data-disabled=\"\" className={cn(styles.tab, \"skeletonLine\")}>\n\t\t\t\t\tЗагрузка...\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className={panelsClassName} aria-busy=\"true\">\n\t\t\t\t<div className={panelClassName}>\n\t\t\t\t\t<div className={panelBodyClassName}>\n\t\t\t\t\t\t<LoadingMessage text={loadingText} className=\"radiusSm\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { NoData } from \"../../misc\";\n\ninterface TabsNoDataStateProps {\n\tcontainerClassName: string;\n\tpanelsClassName: string;\n\tpanelClassName: string;\n\tpanelBodyClassName: string;\n}\n\n/**\n * Служебное empty-состояние для `TabsBox`.\n */\nexport function TabsNoDataState({ containerClassName, panelsClassName, panelClassName, panelBodyClassName }: TabsNoDataStateProps) {\n\treturn (\n\t\t<div className={containerClassName}>\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t<div className={panelClassName}>\n\t\t\t\t\t<div className={panelBodyClassName}>\n\t\t\t\t\t\t<NoData className=\"radiusSm\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\n/**\n * Унифицированная ARIA-обёртка для содержимого активной панели tabs.\n */\ninterface TabsPanelProps {\n\ttabId: string;\n\tisSelected: boolean;\n\tclassName?: string;\n\tgetTabElementId: (tabId: string) => string;\n\tgetPanelElementId: (tabId: string) => string;\n\tchildren: React.ReactNode;\n}\n\nexport function TabsPanel({ tabId, isSelected, className, getTabElementId, getPanelElementId, children }: TabsPanelProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"tabpanel\"\n\t\t\tid={getPanelElementId(tabId)}\n\t\t\taria-labelledby={getTabElementId(tabId)}\n\t\t\thidden={!isSelected}\n\t\t\tclassName={className}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { OneStepScroller } from \"../../misc\";\n\nimport styles from \"./Tabs.module.scss\";\n\nimport type { TabsDescriptor } from \"../model/types\";\nimport type { TabsStateModel } from \"../model/useTabsState\";\n\n/**\n * Рендерит tablist и кнопки вкладок поверх общей модели tabs.\n */\ninterface TabsTabListProps {\n\titems: TabsDescriptor[];\n\tstate: TabsStateModel;\n\tclassName?: string;\n\tariaLabel?: string;\n\tariaLabelledBy?: string;\n}\n\nexport function TabsTabList({ items, state, className, ariaLabel, ariaLabelledBy }: TabsTabListProps) {\n\tconst wrapItems = (children: ReactNode) => {\n\t\tif (state.orientation === \"horizontal\") {\n\t\t\treturn <OneStepScroller>{children}</OneStepScroller>;\n\t\t}\n\n\t\treturn <>{children}</>;\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\trole=\"tablist\"\n\t\t\taria-orientation={state.orientation}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\tonKeyDown={state.onTabListKeyDown}\n\t\t\tonBlur={state.onTabListBlur}>\n\t\t\t{wrapItems(\n\t\t\t\titems.map((item) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t{...state.getTabButtonProps(item)}\n\t\t\t\t\t\tdata-ui=\"tabs-tab\"\n\t\t\t\t\t\tdata-action=\"select-tab\"\n\t\t\t\t\t\tclassName={cn(styles.tab, \"textWrap\", item.id === state.selectedTabId && styles.selected)}>\n\t\t\t\t\t\t{item.title}\n\t\t\t\t\t</button>\n\t\t\t\t))\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { shouldMountTabPanel } from \"../lib/tabs\";\nimport { TabsBoxProps } from \"../model/types\";\nimport { useTabsState } from \"../model/useTabsState\";\n\nimport styles from \"./Tabs.module.scss\";\nimport { TabsLoadingState } from \"./TabsLoadingState\";\nimport { TabsNoDataState } from \"./TabsNoDataState\";\nimport { TabsPanel } from \"./TabsPanel\";\nimport { TabsTabList } from \"./TabsTabList\";\n\n/**\n * Простой items-based tabs-компонент.\n * Сам управляет областью панели и её прокруткой.\n */\nexport function TabsBox({\n\titems,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tclassName,\n\tisLoading,\n\tloadingText,\n\tcleanPanel,\n\tbordered = false,\n\torientation = \"horizontal\",\n\tactivationMode = \"automatic\",\n\tmountStrategy = \"unmount\",\n\tloop = true,\n\t\"aria-label\": ariaLabel,\n\t\"aria-labelledby\": ariaLabelledBy\n}: TabsBoxProps) {\n\tconst state = useTabsState({\n\t\titems,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\torientation,\n\t\tactivationMode,\n\t\tloop\n\t});\n\n\tconst rootClassName = cn(\n\t\tstyles.tabsContainer,\n\t\tstyles[orientation],\n\t\tbordered && styles.bordered,\n\t\tcleanPanel && styles.cleanPanel,\n\t\tclassName\n\t);\n\tconst tabListClassName = styles.tabs;\n\tconst panelsClassName = cn(styles.panels, styles.panelScrollable, \"scrollable overscroll\");\n\tconst panelClassName = styles.panel;\n\tconst panelBodyClassName = styles.panelBody;\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<TabsLoadingState\n\t\t\t\tcontainerClassName={rootClassName}\n\t\t\t\ttabListClassName={tabListClassName}\n\t\t\t\tpanelsClassName={panelsClassName}\n\t\t\t\tpanelClassName={panelClassName}\n\t\t\t\tpanelBodyClassName={panelBodyClassName}\n\t\t\t\tloadingText={loadingText}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (!items.length) {\n\t\treturn (\n\t\t\t<TabsNoDataState\n\t\t\t\tcontainerClassName={rootClassName}\n\t\t\t\tpanelsClassName={panelsClassName}\n\t\t\t\tpanelClassName={panelClassName}\n\t\t\t\tpanelBodyClassName={panelBodyClassName}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={rootClassName}>\n\t\t\t<TabsTabList items={items} state={state} className={tabListClassName} ariaLabel={ariaLabel} ariaLabelledBy={ariaLabelledBy} />\n\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t{items.map((item) => {\n\t\t\t\t\tconst isSelected = item.id === state.selectedTabId;\n\t\t\t\t\tconst isMounted = shouldMountTabPanel({\n\t\t\t\t\t\tmountStrategy,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisVisited: state.isVisited(item.id)\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isMounted) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TabsPanel\n\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\ttabId={item.id}\n\t\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\t\tclassName={panelClassName}\n\t\t\t\t\t\t\tgetTabElementId={state.getTabElementId}\n\t\t\t\t\t\t\tgetPanelElementId={state.getPanelElementId}>\n\t\t\t\t\t\t\t<div className={panelBodyClassName}>{item.content}</div>\n\t\t\t\t\t\t</TabsPanel>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { TabsBox } from \"./TabsBox\";\n\nimport type { TabsBoxItem, TabsBoxProps } from \"../model/types\";\n\n/**\n * Элемент вкладки для устаревшего совместимого API `Tabs`.\n */\nexport type TabsItem = TabsBoxItem;\n\n/**\n * @deprecated Используйте `TabsBox` для простого сценария и `TabsLayout` для составных layout-сценариев.\n */\nexport interface TabsProps extends TabsBoxProps {\n\tonChange?: (value: string) => void;\n}\n\n/**\n * @deprecated Используйте `TabsBox` для простого сценария и `TabsLayout` для составных layout-сценариев.\n */\nexport function Tabs({ onChange, onValueChange, ...props }: TabsProps) {\n\treturn (\n\t\t<TabsBox\n\t\t\t{...props}\n\t\t\tonValueChange={(nextValue) => {\n\t\t\t\tonValueChange?.(nextValue);\n\t\t\t\tonChange?.(nextValue);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { Children, isValidElement, useMemo } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { shouldMountTabPanel } from \"../lib/tabs\";\nimport { useTabsState } from \"../model/useTabsState\";\n\nimport styles from \"./Tabs.module.scss\";\nimport { TabsPanel } from \"./TabsPanel\";\nimport { TabsTabList } from \"./TabsTabList\";\n\nimport type { TabsDescriptor, TabsLayoutProps, TabsLayoutSectionProps, TabsLayoutTabProps } from \"../model/types\";\n\ninterface ParsedTabsLayoutTab extends TabsDescriptor {\n\ttoolbar: TabsLayoutSectionProps | null;\n\tcontent: TabsLayoutSectionProps;\n\tfooter: TabsLayoutSectionProps | null;\n}\n\nconst tabsLayoutTabDisplayName = \"TabsLayout.Tab\";\nconst tabsLayoutToolbarDisplayName = \"TabsLayout.Toolbar\";\nconst tabsLayoutContentDisplayName = \"TabsLayout.Content\";\nconst tabsLayoutFooterDisplayName = \"TabsLayout.Footer\";\n\n/**\n * Возвращает стабильный displayName compound-элемента.\n * Это нужно для корректной работы HMR, где ссылочное сравнение `child.type` может ломаться.\n */\nfunction getTabsLayoutElementDisplayName(child: React.ReactElement) {\n\tconst { type } = child;\n\n\tif (typeof type === \"function\") {\n\t\tconst componentType = type as React.JSXElementConstructor<unknown> & {\n\t\t\tdisplayName?: string;\n\t\t\tname?: string;\n\t\t};\n\n\t\treturn componentType.displayName ?? componentType.name ?? null;\n\t}\n\n\tif (typeof type === \"object\" && type !== null && \"displayName\" in type) {\n\t\tconst componentType = type as {\n\t\t\tdisplayName?: string;\n\t\t};\n\n\t\treturn typeof componentType.displayName === \"string\" ? componentType.displayName : null;\n\t}\n\n\treturn null;\n}\n\nfunction isTabsLayoutElement<Props>(child: React.ReactNode, displayName: string): child is React.ReactElement<Props> {\n\treturn isValidElement<Props>(child) && getTabsLayoutElementDisplayName(child) === displayName;\n}\n\n/**\n * Маркер верхнеуровневой вкладки в compound-режиме `TabsLayout`.\n */\nfunction TabsLayoutTab({ children }: TabsLayoutTabProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutTab.displayName = tabsLayoutTabDisplayName;\n\n/**\n * Верхняя секция панели, исключённая из прокручиваемого содержимого.\n */\nfunction TabsLayoutToolbar({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutToolbar.displayName = tabsLayoutToolbarDisplayName;\n\n/**\n * Основное содержимое панели, которое само управляет своим layout и scroll.\n */\nfunction TabsLayoutContent({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutContent.displayName = tabsLayoutContentDisplayName;\n\n/**\n * Нижняя секция панели, исключённая из прокручиваемого содержимого.\n */\nfunction TabsLayoutFooter({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutFooter.displayName = tabsLayoutFooterDisplayName;\n\nfunction parseTabsLayoutSections(children: React.ReactNode, tabId: string) {\n\tlet toolbar: TabsLayoutSectionProps | null = null;\n\tlet content: TabsLayoutSectionProps | null = null;\n\tlet footer: TabsLayoutSectionProps | null = null;\n\n\tfor (const child of Children.toArray(children)) {\n\t\tif (!isValidElement(child)) {\n\t\t\tthrow new Error(\n\t\t\t\t`TabsLayout.Tab \"${tabId}\" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`\n\t\t\t);\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutToolbarDisplayName)) {\n\t\t\tif (toolbar) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Toolbar.`);\n\t\t\t}\n\n\t\t\ttoolbar = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutContentDisplayName)) {\n\t\t\tif (content) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Content.`);\n\t\t\t}\n\n\t\t\tcontent = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutFooterDisplayName)) {\n\t\t\tif (footer) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Footer.`);\n\t\t\t}\n\n\t\t\tfooter = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`TabsLayout.Tab \"${tabId}\" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`\n\t\t);\n\t}\n\n\tif (!content) {\n\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" должен содержать блок TabsLayout.Content.`);\n\t}\n\n\treturn { toolbar, content, footer };\n}\n\nfunction parseTabsLayoutChildren(children: React.ReactNode): ParsedTabsLayoutTab[] {\n\treturn Children.toArray(children).map((child) => {\n\t\tif (!isTabsLayoutElement<TabsLayoutTabProps>(child, tabsLayoutTabDisplayName)) {\n\t\t\tthrow new Error(\"TabsLayout принимает только дочерние элементы TabsLayout.Tab.\");\n\t\t}\n\n\t\treturn {\n\t\t\tid: child.props.id,\n\t\t\ttitle: child.props.title,\n\t\t\tdisabled: child.props.disabled,\n\t\t\t...parseTabsLayoutSections(child.props.children, child.props.id)\n\t\t};\n\t});\n}\n\ntype TabsLayoutComposition = React.FC<TabsLayoutProps> & {\n\tTab: typeof TabsLayoutTab;\n\tToolbar: typeof TabsLayoutToolbar;\n\tContent: typeof TabsLayoutContent;\n\tFooter: typeof TabsLayoutFooter;\n};\n\n/**\n * Compound-оболочка tabs для составных panel-layout сценариев.\n * Сам компонент управляет только переключением и каркасом панели.\n */\nconst TabsLayoutRoot: React.FC<TabsLayoutProps> = ({\n\tchildren,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tclassName,\n\tbordered,\n\tcleanPanel,\n\torientation = \"horizontal\",\n\tactivationMode = \"manual\",\n\tmountStrategy = \"lazy\",\n\tloop = true,\n\t\"aria-label\": ariaLabel,\n\t\"aria-labelledby\": ariaLabelledBy\n}) => {\n\tconst tabs = useMemo(() => parseTabsLayoutChildren(children), [children]);\n\tconst state = useTabsState({\n\t\titems: tabs,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\torientation,\n\t\tactivationMode,\n\t\tloop\n\t});\n\tconst rootClassName = cn(\n\t\tstyles.tabsContainer,\n\t\tstyles[orientation],\n\t\tbordered && styles.bordered,\n\t\tcleanPanel && styles.cleanPanel,\n\t\tclassName\n\t);\n\tconst panelsClassName = cn(styles.panels, styles.layoutPanels);\n\n\treturn (\n\t\t<div className={rootClassName}>\n\t\t\t<TabsTabList items={tabs} state={state} className={styles.tabs} ariaLabel={ariaLabel} ariaLabelledBy={ariaLabelledBy} />\n\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst isSelected = tab.id === state.selectedTabId;\n\t\t\t\t\tconst isMounted = shouldMountTabPanel({\n\t\t\t\t\t\tmountStrategy,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisVisited: state.isVisited(tab.id)\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isMounted) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst templateRows = `${tab.toolbar ? \"auto \" : \"\"}minmax(0, 1fr)${tab.footer ? \" auto\" : \"\"}`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TabsPanel\n\t\t\t\t\t\t\tkey={tab.id}\n\t\t\t\t\t\t\ttabId={tab.id}\n\t\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\t\tclassName={styles.panel}\n\t\t\t\t\t\t\tgetTabElementId={state.getTabElementId}\n\t\t\t\t\t\t\tgetPanelElementId={state.getPanelElementId}>\n\t\t\t\t\t\t\t<div className={styles.layoutPanel} style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t\t\t\t\t{tab.toolbar ? (\n\t\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, tab.toolbar.className)}>{tab.toolbar.children}</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, styles.layoutContent, tab.content.className)}>\n\t\t\t\t\t\t\t\t\t{tab.content.children}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{tab.footer ? (\n\t\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, tab.footer.className)}>{tab.footer.children}</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TabsPanel>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTabsLayoutRoot.displayName = \"TabsLayout\";\n\nexport const TabsLayout = Object.assign(TabsLayoutRoot, {\n\tTab: TabsLayoutTab,\n\tToolbar: TabsLayoutToolbar,\n\tContent: TabsLayoutContent,\n\tFooter: TabsLayoutFooter\n}) as TabsLayoutComposition;\n"],"mappings":"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"}
1
+ {"version":3,"file":"tabs-DlnVVMJl.js","names":[],"sources":["../../src/tabs/lib/tabs.ts","../../src/tabs/model/useTabsState.ts","../../src/tabs/ui/Tabs.module.scss","../../src/tabs/ui/TabsLoadingState.tsx","../../src/tabs/ui/TabsNoDataState.tsx","../../src/tabs/ui/TabsPanel.tsx","../../src/tabs/ui/TabsTabList.tsx","../../src/tabs/ui/TabsBox.tsx","../../src/tabs/ui/Tabs.tsx","../../src/tabs/ui/TabsLayout.tsx"],"sourcesContent":["import type { TabsDescriptor, TabsMountStrategy } from \"../model/types\";\n\n/**\n * Возвращает идентификатор первой доступной вкладки.\n */\nexport function getFirstEnabledTabId(items: TabsDescriptor[]) {\n\treturn items.find((item) => !item.disabled)?.id ?? null;\n}\n\n/**\n * Возвращает безопасный идентификатор вкладки.\n * Если переданный `candidate` недоступен, выбирается первая доступная вкладка.\n */\nexport function getSafeTabId(items: TabsDescriptor[], candidate: string | undefined | null) {\n\tif (!candidate) {\n\t\treturn getFirstEnabledTabId(items);\n\t}\n\n\tconst matchedItem = items.find((item) => item.id === candidate && !item.disabled);\n\treturn matchedItem?.id ?? getFirstEnabledTabId(items);\n}\n\n/**\n * Возвращает только доступные вкладки для roving focus и клавиатурной навигации.\n */\nexport function getEnabledTabs(items: TabsDescriptor[]) {\n\treturn items.filter((item) => !item.disabled);\n}\n\ninterface ShouldMountTabPanelOptions {\n\tmountStrategy: TabsMountStrategy;\n\tisSelected: boolean;\n\tisVisited: boolean;\n}\n\n/**\n * Определяет, должна ли панель оставаться смонтированной с учётом стратегии монтирования.\n */\nexport function shouldMountTabPanel({ mountStrategy, isSelected, isVisited }: ShouldMountTabPanelOptions) {\n\treturn mountStrategy === \"keep-mounted\" || isSelected || (mountStrategy === \"lazy\" && isVisited);\n}\n","import type React from \"react\";\nimport { FocusEvent, KeyboardEvent, useId, useMemo, useRef, useState } from \"react\";\n\nimport { getRovingFocusTargetIndex } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { getEnabledTabs, getSafeTabId } from \"../lib/tabs\";\n\nimport type { TabsActivationMode, TabsDescriptor, TabsOrientation } from \"./types\";\n\ninterface UseTabsStateOptions {\n\titems: TabsDescriptor[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\torientation?: TabsOrientation;\n\tactivationMode?: TabsActivationMode;\n\tloop?: boolean;\n}\n\n/**\n * Публичная часть модели, необходимая визуальным подкомпонентам tabs.\n */\nexport interface TabsStateModel {\n\tactivationMode: TabsActivationMode;\n\torientation: TabsOrientation;\n\tselectedTabId: string | null;\n\ttabbableTabId: string | null;\n\tonTabListKeyDown: (event: KeyboardEvent<HTMLDivElement>) => void;\n\tonTabListBlur: (event: FocusEvent<HTMLDivElement>) => void;\n\tgetTabElementId: (tabId: string) => string;\n\tgetPanelElementId: (tabId: string) => string;\n\tgetTabButtonProps: (item: TabsDescriptor) => React.ButtonHTMLAttributes<HTMLButtonElement> & {\n\t\tref: (node: HTMLButtonElement | null) => void;\n\t};\n\tisVisited: (tabId: string) => boolean;\n}\n\n/**\n * Инкапсулирует state, a11y-связки и клавиатурную навигацию для всех оболочек tabs.\n */\nexport function useTabsState({\n\titems,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\torientation = \"horizontal\",\n\tactivationMode = \"automatic\",\n\tloop = true\n}: UseTabsStateOptions): TabsStateModel {\n\tconst isControlled = value !== undefined;\n\tconst enabledTabs = useMemo(() => getEnabledTabs(items), [items]);\n\tconst fallbackTabId = enabledTabs[0]?.id ?? null;\n\tconst [internalValue, setInternalValue] = useState(() => getSafeTabId(items, defaultValue));\n\tconst [focusedTabId, setFocusedTabId] = useState<string | null>(() => getSafeTabId(items, value ?? defaultValue));\n\tconst initialVisitedTabId = getSafeTabId(items, value ?? defaultValue);\n\tconst [visitedTabsState, setVisitedTabsState] = useState<Set<string>>(() =>\n\t\tinitialVisitedTabId ? new Set([initialVisitedTabId]) : new Set()\n\t);\n\tconst tabsId = useId();\n\tconst tabRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n\tconst selectedTabId = getSafeTabId(items, isControlled ? value : internalValue);\n\tconst nextTabbableTabId = getSafeTabId(items, focusedTabId) ?? selectedTabId ?? fallbackTabId;\n\tconst visitedTabs = useMemo(() => {\n\t\tif (!selectedTabId || visitedTabsState.has(selectedTabId)) {\n\t\t\treturn visitedTabsState;\n\t\t}\n\n\t\tconst next = new Set(visitedTabsState);\n\t\tnext.add(selectedTabId);\n\t\treturn next;\n\t}, [selectedTabId, visitedTabsState]);\n\n\tconst activateTab = (nextTabId: string) => {\n\t\tconst safeNextTabId = getSafeTabId(items, nextTabId);\n\t\tif (!safeNextTabId) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetVisitedTabsState((prev) => {\n\t\t\tif (prev.has(safeNextTabId)) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tconst next = new Set(prev);\n\t\t\tnext.add(safeNextTabId);\n\t\t\treturn next;\n\t\t});\n\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(safeNextTabId);\n\t\t}\n\n\t\tonValueChange?.(safeNextTabId);\n\t};\n\n\tconst focusTab = (nextTabId: string) => {\n\t\ttabRefs.current[nextTabId]?.focus();\n\t};\n\n\tconst onTabListKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (enabledTabs.length < 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeFocusIndex = Math.max(\n\t\t\t0,\n\t\t\tenabledTabs.findIndex((item) => item.id === (nextTabbableTabId ?? selectedTabId ?? fallbackTabId))\n\t\t);\n\t\tconst nextEnabledIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex: activeFocusIndex,\n\t\t\titemCount: enabledTabs.length,\n\t\t\tkey: event.key,\n\t\t\torientation,\n\t\t\twrap: loop\n\t\t});\n\n\t\tif (nextEnabledIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst nextTabId = enabledTabs[nextEnabledIndex]?.id;\n\t\tif (!nextTabId) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetFocusedTabId(nextTabId);\n\t\tfocusTab(nextTabId);\n\n\t\tif (activationMode === \"automatic\") {\n\t\t\tactivateTab(nextTabId);\n\t\t}\n\t};\n\n\tconst onTabListBlur = (event: FocusEvent<HTMLDivElement>) => {\n\t\tconst nextTarget = event.relatedTarget;\n\n\t\tif (nextTarget instanceof Node && event.currentTarget.contains(nextTarget)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetFocusedTabId(selectedTabId ?? fallbackTabId);\n\t};\n\n\tconst getTabElementId = (tabId: string) => `${tabsId}-tab-${tabId}`;\n\tconst getPanelElementId = (tabId: string) => `${tabsId}-panel-${tabId}`;\n\n\tconst getTabButtonProps = (item: TabsDescriptor) => {\n\t\tconst isSelected = item.id === selectedTabId;\n\t\tconst isTabbable = item.id === nextTabbableTabId;\n\n\t\treturn {\n\t\t\tref: (node: HTMLButtonElement | null) => {\n\t\t\t\ttabRefs.current[item.id] = node;\n\t\t\t},\n\t\t\ttype: \"button\" as const,\n\t\t\trole: \"tab\" as const,\n\t\t\tid: getTabElementId(item.id),\n\t\t\tdisabled: item.disabled,\n\t\t\t\"aria-selected\": isSelected,\n\t\t\t\"aria-controls\": getPanelElementId(item.id),\n\t\t\t\"aria-disabled\": item.disabled || undefined,\n\t\t\ttabIndex: item.disabled ? -1 : isTabbable ? 0 : -1,\n\t\t\tonFocus: () => setFocusedTabId(item.id),\n\t\t\tonClick: () => activateTab(item.id)\n\t\t};\n\t};\n\n\treturn {\n\t\tactivationMode,\n\t\torientation,\n\t\tselectedTabId,\n\t\ttabbableTabId: nextTabbableTabId,\n\t\tonTabListKeyDown,\n\t\tonTabListBlur,\n\t\tgetTabElementId,\n\t\tgetPanelElementId,\n\t\tgetTabButtonProps,\n\t\tisVisited: (tabId: string) => visitedTabs.has(tabId)\n\t};\n}\n",".tabsContainer {\n\t--tabs-border: none;\n\t--tabs-panel-border: none;\n\t--tabs-panel-padding: var(--space-md);\n\t--tabs-panel-bg: var(--surface-1);\n\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.bordered {\n\t--tabs-border: var(--border);\n\t--tabs-panel-border: var(--border);\n}\n\n.cleanPanel {\n\t--tabs-panel-padding: 0;\n\t--tabs-panel-bg: none;\n\t--tabs-panel-border: none;\n}\n\n.tabs {\n\tdisplay: flex;\n\tgap: var(--space-xs);\n\tmin-width: 0;\n\n\tborder: var(--tabs-border);\n\tbackground-color: var(--surface-1);\n\tpadding: var(--space-xs);\n}\n\n.panels {\n\tmin-width: 0;\n\tmin-height: 0;\n\tborder: var(--tabs-panel-border);\n\tbackground-color: var(--tabs-panel-bg);\n}\n\n.tabs,\n.panels {\n\tborder-radius: var(--radius-sm);\n}\n\n.horizontal {\n\tgrid-template-rows: auto minmax(0, 1fr);\n\n\t// .tabs {\n\t// \tflex-wrap: wrap;\n\t// }\n}\n\n.vertical {\n\tgrid-template-columns: 10em minmax(0, 1fr);\n\tmin-height: 0;\n\n\t.tabs {\n\t\tflex-direction: column;\n\t}\n}\n\n.panelScrollable {\n\toverflow: auto;\n}\n\n.tab {\n\ttext-align: left;\n\n\tposition: relative;\n\tmin-height: var(--control-height);\n\tpadding: var(--space-xs) var(--space-md);\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-sm);\n\tfont-weight: 700;\n\tfont-variation-settings: \"wght\" 700;\n\n\tflex-shrink: 0;\n\n\t&:hover {\n\t\tcursor: pointer;\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-accent);\n\t}\n\n\t&.selected {\n\t\tcolor: var(--status-neutral-on-fill);\n\t\tbackground-color: var(--status-neutral-fill);\n\t\tborder-color: var(--border-0);\n\n\t\tbox-shadow: var(--shadow-xs);\n\t}\n\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\tcolor: var(--content-2);\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n\n.panel {\n\tpadding: 0;\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n}\n\n.panelBody {\n\tmin-width: 0;\n\tmin-height: 0;\n\n\theight: 100%;\n\tpadding: var(--tabs-panel-padding);\n}\n\n.layoutPanels {\n\toverflow: hidden;\n}\n\n.layoutPanel {\n\tdisplay: grid;\n\tgap: var(--space-md);\n\tmin-width: 0;\n\tmin-height: 0;\n\theight: 100%;\n\tpadding: var(--tabs-panel-padding);\n}\n\n.layoutSection {\n\tmin-width: 0;\n}\n\n.layoutContent {\n\tmin-height: 0;\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { LoadingMessage } from \"../../misc\";\n\nimport styles from \"./Tabs.module.scss\";\n\ninterface TabsLoadingStateProps {\n\tcontainerClassName: string;\n\ttabListClassName: string;\n\tpanelsClassName: string;\n\tpanelClassName: string;\n\tpanelBodyClassName: string;\n\tloadingText?: string;\n}\n\n/**\n * Служебное loading-состояние для `TabsBox`.\n */\nexport function TabsLoadingState({\n\tcontainerClassName,\n\ttabListClassName,\n\tpanelsClassName,\n\tpanelClassName,\n\tpanelBodyClassName,\n\tloadingText\n}: TabsLoadingStateProps) {\n\treturn (\n\t\t<div className={containerClassName}>\n\t\t\t<div className={tabListClassName} aria-hidden=\"true\">\n\t\t\t\t<button type=\"button\" disabled data-disabled=\"\" className={cn(styles.tab, \"skeletonLine\")}>\n\t\t\t\t\tЗагрузка...\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className={panelsClassName} aria-busy=\"true\">\n\t\t\t\t<div className={panelClassName}>\n\t\t\t\t\t<div className={panelBodyClassName}>\n\t\t\t\t\t\t<LoadingMessage text={loadingText} className=\"radiusSm\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { NoData } from \"../../misc\";\n\ninterface TabsNoDataStateProps {\n\tcontainerClassName: string;\n\tpanelsClassName: string;\n\tpanelClassName: string;\n\tpanelBodyClassName: string;\n}\n\n/**\n * Служебное empty-состояние для `TabsBox`.\n */\nexport function TabsNoDataState({ containerClassName, panelsClassName, panelClassName, panelBodyClassName }: TabsNoDataStateProps) {\n\treturn (\n\t\t<div className={containerClassName}>\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t<div className={panelClassName}>\n\t\t\t\t\t<div className={panelBodyClassName}>\n\t\t\t\t\t\t<NoData className=\"radiusSm\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\n/**\n * Унифицированная ARIA-обёртка для содержимого активной панели tabs.\n */\ninterface TabsPanelProps {\n\ttabId: string;\n\tisSelected: boolean;\n\tclassName?: string;\n\tgetTabElementId: (tabId: string) => string;\n\tgetPanelElementId: (tabId: string) => string;\n\tchildren: React.ReactNode;\n}\n\nexport function TabsPanel({ tabId, isSelected, className, getTabElementId, getPanelElementId, children }: TabsPanelProps) {\n\treturn (\n\t\t<div\n\t\t\trole=\"tabpanel\"\n\t\t\tid={getPanelElementId(tabId)}\n\t\t\taria-labelledby={getTabElementId(tabId)}\n\t\t\thidden={!isSelected}\n\t\t\tclassName={className}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { OneStepScroller } from \"../../misc\";\n\nimport styles from \"./Tabs.module.scss\";\n\nimport type { TabsDescriptor } from \"../model/types\";\nimport type { TabsStateModel } from \"../model/useTabsState\";\n\n/**\n * Рендерит tablist и кнопки вкладок поверх общей модели tabs.\n */\ninterface TabsTabListProps {\n\titems: TabsDescriptor[];\n\tstate: TabsStateModel;\n\tclassName?: string;\n\tariaLabel?: string;\n\tariaLabelledBy?: string;\n}\n\nexport function TabsTabList({ items, state, className, ariaLabel, ariaLabelledBy }: TabsTabListProps) {\n\tconst wrapItems = (children: ReactNode) => {\n\t\tif (state.orientation === \"horizontal\") {\n\t\t\treturn <OneStepScroller>{children}</OneStepScroller>;\n\t\t}\n\n\t\treturn <>{children}</>;\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\trole=\"tablist\"\n\t\t\taria-orientation={state.orientation}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\tonKeyDown={state.onTabListKeyDown}\n\t\t\tonBlur={state.onTabListBlur}>\n\t\t\t{wrapItems(\n\t\t\t\titems.map((item) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t{...state.getTabButtonProps(item)}\n\t\t\t\t\t\tdata-ui=\"tabs-tab\"\n\t\t\t\t\t\tdata-action=\"select-tab\"\n\t\t\t\t\t\tclassName={cn(styles.tab, \"textWrap\", item.id === state.selectedTabId && styles.selected)}>\n\t\t\t\t\t\t{item.title}\n\t\t\t\t\t</button>\n\t\t\t\t))\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { shouldMountTabPanel } from \"../lib/tabs\";\nimport { TabsBoxProps } from \"../model/types\";\nimport { useTabsState } from \"../model/useTabsState\";\n\nimport styles from \"./Tabs.module.scss\";\nimport { TabsLoadingState } from \"./TabsLoadingState\";\nimport { TabsNoDataState } from \"./TabsNoDataState\";\nimport { TabsPanel } from \"./TabsPanel\";\nimport { TabsTabList } from \"./TabsTabList\";\n\n/**\n * Простой items-based tabs-компонент.\n * Сам управляет областью панели и её прокруткой.\n */\nexport function TabsBox({\n\titems,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tclassName,\n\tisLoading,\n\tloadingText,\n\tcleanPanel,\n\tbordered = false,\n\torientation = \"horizontal\",\n\tactivationMode = \"automatic\",\n\tmountStrategy = \"unmount\",\n\tloop = true,\n\t\"aria-label\": ariaLabel,\n\t\"aria-labelledby\": ariaLabelledBy\n}: TabsBoxProps) {\n\tconst state = useTabsState({\n\t\titems,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\torientation,\n\t\tactivationMode,\n\t\tloop\n\t});\n\n\tconst rootClassName = cn(\n\t\tstyles.tabsContainer,\n\t\tstyles[orientation],\n\t\tbordered && styles.bordered,\n\t\tcleanPanel && styles.cleanPanel,\n\t\tclassName\n\t);\n\tconst tabListClassName = styles.tabs;\n\tconst panelsClassName = cn(styles.panels, styles.panelScrollable, \"scrollable overscroll\");\n\tconst panelClassName = styles.panel;\n\tconst panelBodyClassName = styles.panelBody;\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<TabsLoadingState\n\t\t\t\tcontainerClassName={rootClassName}\n\t\t\t\ttabListClassName={tabListClassName}\n\t\t\t\tpanelsClassName={panelsClassName}\n\t\t\t\tpanelClassName={panelClassName}\n\t\t\t\tpanelBodyClassName={panelBodyClassName}\n\t\t\t\tloadingText={loadingText}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (!items.length) {\n\t\treturn (\n\t\t\t<TabsNoDataState\n\t\t\t\tcontainerClassName={rootClassName}\n\t\t\t\tpanelsClassName={panelsClassName}\n\t\t\t\tpanelClassName={panelClassName}\n\t\t\t\tpanelBodyClassName={panelBodyClassName}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={rootClassName}>\n\t\t\t<TabsTabList items={items} state={state} className={tabListClassName} ariaLabel={ariaLabel} ariaLabelledBy={ariaLabelledBy} />\n\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t{items.map((item) => {\n\t\t\t\t\tconst isSelected = item.id === state.selectedTabId;\n\t\t\t\t\tconst isMounted = shouldMountTabPanel({\n\t\t\t\t\t\tmountStrategy,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisVisited: state.isVisited(item.id)\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isMounted) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TabsPanel\n\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\ttabId={item.id}\n\t\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\t\tclassName={panelClassName}\n\t\t\t\t\t\t\tgetTabElementId={state.getTabElementId}\n\t\t\t\t\t\t\tgetPanelElementId={state.getPanelElementId}>\n\t\t\t\t\t\t\t<div className={panelBodyClassName}>{item.content}</div>\n\t\t\t\t\t\t</TabsPanel>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { TabsBox } from \"./TabsBox\";\n\nimport type { TabsBoxItem, TabsBoxProps } from \"../model/types\";\n\n/**\n * Элемент вкладки для устаревшего совместимого API `Tabs`.\n */\nexport type TabsItem = TabsBoxItem;\n\n/**\n * @deprecated Используйте `TabsBox` для простого сценария и `TabsLayout` для составных layout-сценариев.\n */\nexport interface TabsProps extends TabsBoxProps {\n\tonChange?: (value: string) => void;\n}\n\n/**\n * @deprecated Используйте `TabsBox` для простого сценария и `TabsLayout` для составных layout-сценариев.\n */\nexport function Tabs({ onChange, onValueChange, ...props }: TabsProps) {\n\treturn (\n\t\t<TabsBox\n\t\t\t{...props}\n\t\t\tonValueChange={(nextValue) => {\n\t\t\t\tonValueChange?.(nextValue);\n\t\t\t\tonChange?.(nextValue);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { Children, isValidElement, useMemo } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { shouldMountTabPanel } from \"../lib/tabs\";\nimport { useTabsState } from \"../model/useTabsState\";\n\nimport styles from \"./Tabs.module.scss\";\nimport { TabsPanel } from \"./TabsPanel\";\nimport { TabsTabList } from \"./TabsTabList\";\n\nimport type { TabsDescriptor, TabsLayoutProps, TabsLayoutSectionProps, TabsLayoutTabProps } from \"../model/types\";\n\ninterface ParsedTabsLayoutTab extends TabsDescriptor {\n\ttoolbar: TabsLayoutSectionProps | null;\n\tcontent: TabsLayoutSectionProps;\n\tfooter: TabsLayoutSectionProps | null;\n}\n\nconst tabsLayoutTabDisplayName = \"TabsLayout.Tab\";\nconst tabsLayoutToolbarDisplayName = \"TabsLayout.Toolbar\";\nconst tabsLayoutContentDisplayName = \"TabsLayout.Content\";\nconst tabsLayoutFooterDisplayName = \"TabsLayout.Footer\";\n\n/**\n * Возвращает стабильный displayName compound-элемента.\n * Это нужно для корректной работы HMR, где ссылочное сравнение `child.type` может ломаться.\n */\nfunction getTabsLayoutElementDisplayName(child: React.ReactElement) {\n\tconst { type } = child;\n\n\tif (typeof type === \"function\") {\n\t\tconst componentType = type as React.JSXElementConstructor<unknown> & {\n\t\t\tdisplayName?: string;\n\t\t\tname?: string;\n\t\t};\n\n\t\treturn componentType.displayName ?? componentType.name ?? null;\n\t}\n\n\tif (typeof type === \"object\" && type !== null && \"displayName\" in type) {\n\t\tconst componentType = type as {\n\t\t\tdisplayName?: string;\n\t\t};\n\n\t\treturn typeof componentType.displayName === \"string\" ? componentType.displayName : null;\n\t}\n\n\treturn null;\n}\n\nfunction isTabsLayoutElement<Props>(child: React.ReactNode, displayName: string): child is React.ReactElement<Props> {\n\treturn isValidElement<Props>(child) && getTabsLayoutElementDisplayName(child) === displayName;\n}\n\n/**\n * Маркер верхнеуровневой вкладки в compound-режиме `TabsLayout`.\n */\nfunction TabsLayoutTab({ children }: TabsLayoutTabProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutTab.displayName = tabsLayoutTabDisplayName;\n\n/**\n * Верхняя секция панели, исключённая из прокручиваемого содержимого.\n */\nfunction TabsLayoutToolbar({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutToolbar.displayName = tabsLayoutToolbarDisplayName;\n\n/**\n * Основное содержимое панели, которое само управляет своим layout и scroll.\n */\nfunction TabsLayoutContent({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutContent.displayName = tabsLayoutContentDisplayName;\n\n/**\n * Нижняя секция панели, исключённая из прокручиваемого содержимого.\n */\nfunction TabsLayoutFooter({ children }: TabsLayoutSectionProps) {\n\treturn <>{children}</>;\n}\n\nTabsLayoutFooter.displayName = tabsLayoutFooterDisplayName;\n\nfunction parseTabsLayoutSections(children: React.ReactNode, tabId: string) {\n\tlet toolbar: TabsLayoutSectionProps | null = null;\n\tlet content: TabsLayoutSectionProps | null = null;\n\tlet footer: TabsLayoutSectionProps | null = null;\n\n\tfor (const child of Children.toArray(children)) {\n\t\tif (!isValidElement(child)) {\n\t\t\tthrow new Error(\n\t\t\t\t`TabsLayout.Tab \"${tabId}\" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`\n\t\t\t);\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutToolbarDisplayName)) {\n\t\t\tif (toolbar) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Toolbar.`);\n\t\t\t}\n\n\t\t\ttoolbar = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutContentDisplayName)) {\n\t\t\tif (content) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Content.`);\n\t\t\t}\n\n\t\t\tcontent = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isTabsLayoutElement<TabsLayoutSectionProps>(child, tabsLayoutFooterDisplayName)) {\n\t\t\tif (footer) {\n\t\t\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" содержит более одного блока TabsLayout.Footer.`);\n\t\t\t}\n\n\t\t\tfooter = child.props;\n\t\t\tcontinue;\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`TabsLayout.Tab \"${tabId}\" поддерживает только дочерние элементы TabsLayout.Toolbar, TabsLayout.Content и TabsLayout.Footer.`\n\t\t);\n\t}\n\n\tif (!content) {\n\t\tthrow new Error(`TabsLayout.Tab \"${tabId}\" должен содержать блок TabsLayout.Content.`);\n\t}\n\n\treturn { toolbar, content, footer };\n}\n\nfunction parseTabsLayoutChildren(children: React.ReactNode): ParsedTabsLayoutTab[] {\n\treturn Children.toArray(children).map((child) => {\n\t\tif (!isTabsLayoutElement<TabsLayoutTabProps>(child, tabsLayoutTabDisplayName)) {\n\t\t\tthrow new Error(\"TabsLayout принимает только дочерние элементы TabsLayout.Tab.\");\n\t\t}\n\n\t\treturn {\n\t\t\tid: child.props.id,\n\t\t\ttitle: child.props.title,\n\t\t\tdisabled: child.props.disabled,\n\t\t\t...parseTabsLayoutSections(child.props.children, child.props.id)\n\t\t};\n\t});\n}\n\ntype TabsLayoutComposition = React.FC<TabsLayoutProps> & {\n\tTab: typeof TabsLayoutTab;\n\tToolbar: typeof TabsLayoutToolbar;\n\tContent: typeof TabsLayoutContent;\n\tFooter: typeof TabsLayoutFooter;\n};\n\n/**\n * Compound-оболочка tabs для составных panel-layout сценариев.\n * Сам компонент управляет только переключением и каркасом панели.\n */\nconst TabsLayoutRoot: React.FC<TabsLayoutProps> = ({\n\tchildren,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tclassName,\n\tbordered,\n\tcleanPanel,\n\torientation = \"horizontal\",\n\tactivationMode = \"manual\",\n\tmountStrategy = \"lazy\",\n\tloop = true,\n\t\"aria-label\": ariaLabel,\n\t\"aria-labelledby\": ariaLabelledBy\n}) => {\n\tconst tabs = useMemo(() => parseTabsLayoutChildren(children), [children]);\n\tconst state = useTabsState({\n\t\titems: tabs,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\torientation,\n\t\tactivationMode,\n\t\tloop\n\t});\n\tconst rootClassName = cn(\n\t\tstyles.tabsContainer,\n\t\tstyles[orientation],\n\t\tbordered && styles.bordered,\n\t\tcleanPanel && styles.cleanPanel,\n\t\tclassName\n\t);\n\tconst panelsClassName = cn(styles.panels, styles.layoutPanels);\n\n\treturn (\n\t\t<div className={rootClassName}>\n\t\t\t<TabsTabList items={tabs} state={state} className={styles.tabs} ariaLabel={ariaLabel} ariaLabelledBy={ariaLabelledBy} />\n\n\t\t\t<div className={panelsClassName}>\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst isSelected = tab.id === state.selectedTabId;\n\t\t\t\t\tconst isMounted = shouldMountTabPanel({\n\t\t\t\t\t\tmountStrategy,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisVisited: state.isVisited(tab.id)\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isMounted) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst templateRows = `${tab.toolbar ? \"auto \" : \"\"}minmax(0, 1fr)${tab.footer ? \" auto\" : \"\"}`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TabsPanel\n\t\t\t\t\t\t\tkey={tab.id}\n\t\t\t\t\t\t\ttabId={tab.id}\n\t\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\t\tclassName={styles.panel}\n\t\t\t\t\t\t\tgetTabElementId={state.getTabElementId}\n\t\t\t\t\t\t\tgetPanelElementId={state.getPanelElementId}>\n\t\t\t\t\t\t\t<div className={styles.layoutPanel} style={{ gridTemplateRows: templateRows }}>\n\t\t\t\t\t\t\t\t{tab.toolbar ? (\n\t\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, tab.toolbar.className)}>{tab.toolbar.children}</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, styles.layoutContent, tab.content.className)}>\n\t\t\t\t\t\t\t\t\t{tab.content.children}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{tab.footer ? (\n\t\t\t\t\t\t\t\t\t<div className={cn(styles.layoutSection, tab.footer.className)}>{tab.footer.children}</div>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TabsPanel>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nTabsLayoutRoot.displayName = \"TabsLayout\";\n\nexport const TabsLayout = Object.assign(TabsLayoutRoot, {\n\tTab: TabsLayoutTab,\n\tToolbar: TabsLayoutToolbar,\n\tContent: TabsLayoutContent,\n\tFooter: TabsLayoutFooter\n}) as TabsLayoutComposition;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./Button-BZ_b-Kin.js";
1
+ import { t as e } from "./Button-CCWuggdA.js";
2
2
  import { AlignCenter as t, AlignJustify as n, AlignLeft as r, AlignRight as i, AtSign as a, Bold as o, BookType as s, BrushCleaning as c, Clock as l, Code as u, ExternalLink as d, Heading1 as f, Heading2 as p, Heading3 as m, Heading4 as h, Heading5 as g, Heading6 as _, Highlighter as v, Italic as y, Languages as b, Link as x, List as S, ListOrdered as C, MessageSquareQuote as w, Phone as T, PictureInPicture as E, Pilcrow as D, Redo as O, Save as k, Shredder as A, Strikethrough as j, TextQuote as M, Type as N, Underline as P, Undo as F } from "lucide-react";
3
3
  import { Fragment as I, jsx as L, jsxs as R } from "react/jsx-runtime";
4
4
  var z = {
@@ -366,4 +366,4 @@ function ee({ toolbarComponents: e, state: t, onBlockStyleToggle: n, onInlineSty
366
366
  //#endregion
367
367
  export { q as a, G as c, H as d, V as f, Z as i, K as l, Q as n, J as o, B as p, X as r, Y as s, ee as t, U as u };
368
368
 
369
- //# sourceMappingURL=toolbar-C-Ziw_Uh.js.map
369
+ //# sourceMappingURL=toolbar-BCZNdRXM.js.map