@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.13

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 (281) hide show
  1. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -1
  2. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
  3. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  4. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  5. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  6. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  7. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  8. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  9. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  10. package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
  11. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  12. package/dist/select/model/useODataSelect.d.ts +1 -1
  13. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  14. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  15. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  16. package/dist/tree-select/index.js.map +1 -1
  17. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  18. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  19. package/package.json +3 -3
  20. package/storybook-static/assets/{Badge-BojMuOws.js → Badge-BFhBl7yM.js} +1 -1
  21. package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-BEu55X4s.js} +1 -1
  22. package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-mqmnGtRR.js} +1 -1
  23. package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-CESdnWrO.js} +1 -1
  24. package/storybook-static/assets/{Button-CrTHXWYk.js → Button-_YPAu9sd.js} +1 -1
  25. package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-B0Y_T17B.js} +1 -1
  26. package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-DLuO2Ywz.js} +1 -1
  27. package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-CGiNmAPT.js} +1 -1
  28. package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-l0pbBm9z.js} +1 -1
  29. package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-ROPAnqh8.js} +1 -1
  30. package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
  31. package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-Bob4DtRn.js} +1 -1
  32. package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-DxfUAeJS.js} +1 -1
  33. package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
  34. package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-DuEz9CXt.js} +1 -1
  35. package/storybook-static/assets/DateInput-BQ8SoeLE.js +1 -0
  36. package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DmNLD4Dz.js} +1 -1
  37. package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-sTpYf7Ob.js} +1 -1
  38. package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
  39. package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
  40. package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
  41. package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CJniLn1R.js} +1 -1
  42. package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-BXjdNaL-.js} +1 -1
  43. package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-D6a_qzr3.js} +1 -1
  44. package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DOYnnXlU.js} +1 -1
  45. package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-B1cZLRK3.js} +1 -1
  46. package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-Chh5o_0s.js} +1 -1
  47. package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
  48. package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-CRnQOgVj.js} +1 -1
  49. package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
  50. package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-Bm5gqdi9.js} +1 -1
  51. package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-C4L7JAlq.js} +1 -1
  52. package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-BhA9q8Qv.js} +1 -1
  53. package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-DtZNSUHF.js} +1 -1
  54. package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
  55. package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
  56. package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CJlia-8f.js} +1 -1
  57. package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-DCvfi1EY.js} +1 -1
  58. package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-CsnfPiwV.js} +1 -1
  59. package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
  60. package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-C-KwTRAM.js} +1 -1
  61. package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-CzbqknNR.js} +1 -1
  62. package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
  63. package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-IsNCXCrZ.js} +1 -1
  64. package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
  65. package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DY0UITYz.js} +1 -1
  66. package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories--9q9b9nv.js} +2 -2
  67. package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
  68. package/storybook-static/assets/{Input-op4j7Beh.js → Input-DLubbE7P.js} +1 -1
  69. package/storybook-static/assets/{Input-BUDNR96c.js → Input-Dw2JblYt.js} +1 -1
  70. package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-DQeyDULG.js} +1 -1
  71. package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-BRzl8Vrt.js} +1 -1
  72. package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
  73. package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-B8UroZji.js} +1 -1
  74. package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-DPftxjGw.js} +1 -1
  75. package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-C7yyqHqc.js} +1 -1
  76. package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-BQVXHVLy.js} +1 -1
  77. package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-UD_9S7-N.js} +1 -1
  78. package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
  79. package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-BNjijD3Y.js} +1 -1
  80. package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-C-pHr-Sx.js} +1 -1
  81. package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-DbcbqIhY.js} +1 -1
  82. package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-D-TC9r9t.js} +1 -1
  83. package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-DbhWgM9y.js} +1 -1
  84. package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
  85. package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-BoV_E3qt.js} +1 -1
  86. package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-w1EsRpYP.js} +1 -1
  87. package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
  88. package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-CzZRsr6a.js} +1 -1
  89. package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-qZdTi11b.js} +1 -1
  90. package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-C9k_1850.js} +1 -1
  91. package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-DCpul8QM.js} +1 -1
  92. package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-Cy0Xd4LF.js} +1 -1
  93. package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
  94. package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-BEQdl-F4.js} +1 -1
  95. package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-Dy4X94E2.js} +1 -1
  96. package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-FuzejJmz.js} +1 -1
  97. package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-BsQ9EfkA.js} +1 -1
  98. package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-BSrODvw7.js} +1 -1
  99. package/storybook-static/assets/NotificationsHost.stories-DeiWspcY.js +29 -0
  100. package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
  101. package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-BwMgAkbE.js} +2 -2
  102. package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-BgC7GHOv.js} +1 -1
  103. package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-DEIRAB-s.js} +2 -2
  104. package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
  105. package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
  106. package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
  107. package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
  108. package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-DycQ3RuL.js} +1 -1
  109. package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-taxbFfjo.js} +1 -1
  110. package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-Q0QaPCII.js} +1 -1
  111. package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DUJ2nF3F.js} +1 -1
  112. package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-DnM7x-uC.js} +1 -1
  113. package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
  114. package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
  115. package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-B6oidz5p.js} +1 -1
  116. package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-Tbhf8T81.js} +1 -1
  117. package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-DE1LxZvv.js} +1 -1
  118. package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
  119. package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
  120. package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
  121. package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-BPtAknAr.js} +1 -1
  122. package/storybook-static/assets/README--TpGcM95.js +110 -0
  123. package/storybook-static/assets/{README-MzcO5Z_P.js → README-4iBHWAP5.js} +1 -1
  124. package/storybook-static/assets/README-98KIgy5G.js +75 -0
  125. package/storybook-static/assets/README-B6II8p0W.js +154 -0
  126. package/storybook-static/assets/{README-CkWglKbS.js → README-B6vU5_7I.js} +1 -1
  127. package/storybook-static/assets/README-BFJVjjZR.js +325 -0
  128. package/storybook-static/assets/README-BIT4HlFP.js +441 -0
  129. package/storybook-static/assets/{README-DqQDgJN-.js → README-BK6Epio1.js} +1 -1
  130. package/storybook-static/assets/{README-DRnlD7y8.js → README-BRlPB5_k.js} +1 -1
  131. package/storybook-static/assets/README-BTFpEaXG.js +64 -0
  132. package/storybook-static/assets/README-BWhXgC_o.js +226 -0
  133. package/storybook-static/assets/README-BbNHvOoR.js +101 -0
  134. package/storybook-static/assets/README-BbunUo8b.js +118 -0
  135. package/storybook-static/assets/README-BmYpfZKr.js +1844 -0
  136. package/storybook-static/assets/README-Bu5uvhAT.js +230 -0
  137. package/storybook-static/assets/README-Bx6fvSBE.js +1282 -0
  138. package/storybook-static/assets/README-Bx6gIGiA.js +69 -0
  139. package/storybook-static/assets/README-ByhxsX44.js +324 -0
  140. package/storybook-static/assets/README-Byi1FFpw.js +98 -0
  141. package/storybook-static/assets/README-C3Is3a3B.js +208 -0
  142. package/storybook-static/assets/{README-C0BwTe5N.js → README-C6prwAXw.js} +1 -1
  143. package/storybook-static/assets/{README-BzVni2ve.js → README-C9S83J_G.js} +1 -1
  144. package/storybook-static/assets/{README-BHw6MVjD.js → README-CGgxP5Zo.js} +1 -1
  145. package/storybook-static/assets/README-CJ2ZVG2U.js +2124 -0
  146. package/storybook-static/assets/README-CNGCAm5d.js +95 -0
  147. package/storybook-static/assets/README-Cb_q420B.js +90 -0
  148. package/storybook-static/assets/README-CtIDPNJ3.js +186 -0
  149. package/storybook-static/assets/README-CzO3Dchr.js +64 -0
  150. package/storybook-static/assets/README-D0rzQthv.js +264 -0
  151. package/storybook-static/assets/README-DEQu7djz.js +1704 -0
  152. package/storybook-static/assets/README-DFihT_sm.js +296 -0
  153. package/storybook-static/assets/{README-CTIBG4zH.js → README-DMiWsyv_.js} +1 -1
  154. package/storybook-static/assets/README-DOx8lXXk.js +82 -0
  155. package/storybook-static/assets/{README-DzTc6XmY.js → README-DPhDjr43.js} +1 -1
  156. package/storybook-static/assets/{README-Dki94Nf2.js → README-D_NqWPa9.js} +1 -1
  157. package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
  158. package/storybook-static/assets/README-DlwhWCvQ.js +1146 -0
  159. package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
  160. package/storybook-static/assets/README-Dycov6NP.js +583 -0
  161. package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
  162. package/storybook-static/assets/README-Gfd9tLTw.js +672 -0
  163. package/storybook-static/assets/{README-B4zYJg6u.js → README-Kfawetke.js} +1 -1
  164. package/storybook-static/assets/{README-BzVHwvgo.js → README-UDBM7ZMT.js} +1 -1
  165. package/storybook-static/assets/{README-D-XjRtAE.js → README-VTWQxLm_.js} +1 -1
  166. package/storybook-static/assets/README-YHNWrTZv.js +400 -0
  167. package/storybook-static/assets/README-_0Otw0eD.js +448 -0
  168. package/storybook-static/assets/README-aw2Xu9xu.js +158 -0
  169. package/storybook-static/assets/README-eg1emlll.js +192 -0
  170. package/storybook-static/assets/README-iqQHdhZ4.js +416 -0
  171. package/storybook-static/assets/{README-BdPlV5nA.js → README-llxZAtCj.js} +1 -1
  172. package/storybook-static/assets/README-wFnEIGl4.js +95 -0
  173. package/storybook-static/assets/{README-Dx3cpFMr.js → README-webB1yH0.js} +1 -1
  174. package/storybook-static/assets/README-wtreGRCe.js +208 -0
  175. package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-CNOLDk_o.js} +1 -1
  176. package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-Ce05_q7s.js} +1 -1
  177. package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-CPd4lTl0.js} +1 -1
  178. package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BtfD5Szd.js} +1 -1
  179. package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-Ccm7G-dv.js} +1 -1
  180. package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
  181. package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-DvdBIeig.js} +1 -1
  182. package/storybook-static/assets/{Select-DQMoVjn4.js → Select-8PV9PBKF.js} +1 -1
  183. package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-G04B41FM.js} +1 -1
  184. package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-Cf6CBhV8.js} +1 -1
  185. package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-CdQdHIVp.js} +1 -1
  186. package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
  187. package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
  188. package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-DattLt6w.js} +1 -1
  189. package/storybook-static/assets/SingleDateTimeInput.stories-BLJV3jzV.js +48 -0
  190. package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-DKEI4cDd.js} +1 -1
  191. package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-Dci-mJt_.js} +1 -1
  192. package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-Dp7oQueF.js} +1 -1
  193. package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-BGPQmlgY.js} +1 -1
  194. package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BhjqGOKt.js} +1 -1
  195. package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-DXNhRU3X.js} +1 -1
  196. package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CMd9l1Gd.js} +1 -1
  197. package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-BN1cFEFJ.js} +1 -1
  198. package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-GL65TlI9.js} +1 -1
  199. package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-q5PlI6rB.js} +1 -1
  200. package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-Byik5-iZ.js} +1 -1
  201. package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-CT0JF2V6.js} +1 -1
  202. package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-pPEPmgnN.js} +1 -1
  203. package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-BQlFmCE7.js} +1 -1
  204. package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch--xGPiYk-.js} +1 -1
  205. package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-DhaLI9CG.js} +1 -1
  206. package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-5DisgIyj.js} +1 -1
  207. package/storybook-static/assets/{Table-BFAEcUde.js → Table-Bf6MicdG.js} +1 -1
  208. package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-CS7rQgj9.js} +2 -2
  209. package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-B4y4y8Ap.js} +1 -1
  210. package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-C0SpdGkh.js} +1 -1
  211. package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-C5LLLhnj.js} +1 -1
  212. package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-D4BpuCoH.js} +1 -1
  213. package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-rn2wtZP_.js} +1 -1
  214. package/storybook-static/assets/{Text-DK4jN26J.js → Text-BhBt9e7C.js} +1 -1
  215. package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-B-Hz7ujq.js} +1 -1
  216. package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-BHHxY5sd.js} +1 -1
  217. package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-CZ2kWz20.js} +1 -1
  218. package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-Cg8fgFsn.js} +1 -1
  219. package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-BxdwtK2e.js} +1 -1
  220. package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-BWwfk9fi.js} +1 -1
  221. package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-Ce9rbjBc.js} +1 -1
  222. package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-0fzcmzKy.js} +1 -1
  223. package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
  224. package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
  225. package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
  226. package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-qU2xPlar.js} +1 -1
  227. package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-BIHydJFy.js} +1 -1
  228. package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-BKnWu0C7.js} +1 -1
  229. package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
  230. package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-pVXjU9dG.js} +1 -1
  231. package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-CV_8Ui6R.js} +2 -2
  232. package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-BY40djCc.js} +3 -3
  233. package/storybook-static/assets/{check-CLkTJVXe.js → check-CVkPTDzp.js} +1 -1
  234. package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-BtNO4Vhe.js} +1 -1
  235. package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-kceSK3sZ.js} +1 -1
  236. package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-BA_LO2El.js} +1 -1
  237. package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
  238. package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B2m4a1zz.js} +1 -1
  239. package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-Cfjhotlm.js} +1 -1
  240. package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-D6yV8PLX.js} +3 -3
  241. package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B0pQBIW0.js} +1 -1
  242. package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
  243. package/storybook-static/assets/{download-eAKjms6q.js → download-Lba8elK9.js} +1 -1
  244. package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-BFNvfMpU.js} +1 -1
  245. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  246. package/storybook-static/assets/foundationApi-DZhnQ2cC.js +59 -0
  247. package/storybook-static/assets/foundationLib-CoVTo22U.js +30 -0
  248. package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-Cc6eXN6U.js} +1 -1
  249. package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
  250. package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-o7sH2IXC.js} +4 -4
  251. package/storybook-static/assets/{info-DhJTzwcL.js → info-BpsVP_dM.js} +1 -1
  252. package/storybook-static/assets/odata-CXsbxsRY.js +1 -0
  253. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  254. package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
  255. package/storybook-static/assets/{react-YFbUKK0m.js → react-DeJ0JTHb.js} +1 -1
  256. package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-BvGyjEXe.js} +1 -1
  257. package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-BdXxnHos.js} +1 -1
  258. package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-XkyN-9r5.js} +1 -1
  259. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
  260. package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-uPH9-fND.js} +1 -1
  261. package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-tT01vSMw.js} +1 -1
  262. package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
  263. package/storybook-static/assets/useODataTreeData-CU7Rqcb9.js +1 -0
  264. package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-D8GHQ6KR.js} +1 -1
  265. package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
  266. package/storybook-static/assets/{x-CqPSvWfo.js → x-BlAURbAH.js} +1 -1
  267. package/storybook-static/iframe.html +2 -2
  268. package/storybook-static/index.json +1 -1
  269. package/storybook-static/project.json +1 -1
  270. package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
  271. package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
  272. package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
  273. package/storybook-static/assets/async-SjiCjIjO.js +0 -625
  274. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  275. package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
  276. package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
  277. package/storybook-static/assets/odata-DhISMZkE.js +0 -1
  278. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  279. package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
  280. package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
  281. package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
@@ -0,0 +1,296 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Excel`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`excel`,children:`Excel`}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/excel`}),` формирует и скачивает `,(0,c.jsx)(t.code,{children:`.xlsx`}),`-файлы в браузере. Он поддерживает:`]}),`
4
+ `,(0,c.jsxs)(t.ul,{children:[`
5
+ `,(0,c.jsx)(t.li,{children:`одну или несколько таблиц-листов;`}),`
6
+ `,(0,c.jsxs)(t.li,{children:[`типизированные ячейки `,(0,c.jsx)(t.code,{children:`String`}),`, `,(0,c.jsx)(t.code,{children:`Number`}),`, `,(0,c.jsx)(t.code,{children:`Date`}),`, `,(0,c.jsx)(t.code,{children:`Boolean`}),`;`]}),`
7
+ `,(0,c.jsx)(t.li,{children:`Excel number/date formats;`}),`
8
+ `,(0,c.jsx)(t.li,{children:`ширину колонок;`}),`
9
+ `,(0,c.jsx)(t.li,{children:`стили отдельных ячеек;`}),`
10
+ `,(0,c.jsx)(t.li,{children:`auto-filter;`}),`
11
+ `,(0,c.jsx)(t.li,{children:`адаптацию OData/table-описаний к Excel.`}),`
12
+ `]}),`
13
+ `,(0,c.jsxs)(t.p,{children:[`Модуль строится поверх `,(0,c.jsx)(t.code,{children:`write-excel-file/browser`}),` и не предназначен для Node.js/SSR-скачивания.`]}),`
14
+ `,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
15
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib write-excel-file
16
+ `})}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Версия `,(0,c.jsx)(t.code,{children:`write-excel-file`}),` должна соответствовать peer dependency пакета.`]}),`
18
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
19
+ buildExcelSheetData,
20
+ downloadExcelFile,
21
+ downloadExcelWorkbook,
22
+ type ExcelColumn,
23
+ type ExcelRow
24
+ } from "@ryuzaki13/react-foundation-lib/excel";
25
+ `})}),`
26
+ `,(0,c.jsx)(t.h2,{id:`самый-простой-экспорт`,children:`Самый простой экспорт`}),`
27
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadExcelFile({
28
+ fileName: "orders.xlsx",
29
+ columns: [
30
+ { id: "ID", header: "Номер", type: String, width: 18 },
31
+ {
32
+ id: "AMOUNT",
33
+ header: "Сумма",
34
+ type: Number,
35
+ format: "#,##0.00",
36
+ width: 14
37
+ },
38
+ {
39
+ id: "CREATED_AT",
40
+ header: "Создан",
41
+ type: Date,
42
+ format: "dd.mm.yyyy hh:mm",
43
+ width: 20
44
+ }
45
+ ],
46
+ rows: [
47
+ {
48
+ ID: "A-100",
49
+ AMOUNT: 1250.5,
50
+ CREATED_AT: "2026-08-21T09:30:00+05:00"
51
+ }
52
+ ],
53
+ autoFilter: true
54
+ });
55
+ `})}),`
56
+ `,(0,c.jsxs)(t.p,{children:[`Браузер скачает книгу с единственным листом `,(0,c.jsx)(t.code,{children:`Sheet1`}),`.`]}),`
57
+ `,(0,c.jsx)(t.h2,{id:`базовая-модель`,children:`Базовая модель`}),`
58
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ExcelColumn = {
59
+ id: string;
60
+ header: string;
61
+ width?: number;
62
+ type?: StringConstructor | NumberConstructor | DateConstructor | BooleanConstructor;
63
+ format?: string;
64
+ };
65
+
66
+ type ExcelRow = Record<string, unknown>;
67
+ `})}),`
68
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`column.id`}),` — ключ, по которому значение читается из строки. Если в row такого ключа нет, ячейка будет пустой.`]}),`
69
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`header`}),` попадает в первую строку. Заголовок автоматически получает жирный шрифт и тонкую серую нижнюю границу.`]}),`
70
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`width`}),` передаётся writer как ширина Excel-колонки. Единица соответствует API `,(0,c.jsx)(t.code,{children:`write-excel-file`}),`, а не CSS-пикселям.`]}),`
71
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`format`}),` — маска Excel, например `,(0,c.jsx)(t.code,{children:`#,##0.00`}),`, `,(0,c.jsx)(t.code,{children:`dd.mm.yyyy`}),`, `,(0,c.jsx)(t.code,{children:`hh:mm:ss`}),`. Это не `,(0,c.jsx)(t.code,{children:`Intl`}),`-формат и не строковый formatter: Excel применяет маску к настоящему числу или дате.`]}),`
72
+ `,(0,c.jsx)(t.h2,{id:`почему-тип-ячейки-важен`,children:`Почему тип ячейки важен`}),`
73
+ `,(0,c.jsx)(t.p,{children:`Неправильно передавать заранее отформатированную сумму:`}),`
74
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
75
+ AMOUNT: "1 250,50 ₽";
76
+ }
77
+ `})}),`
78
+ `,(0,c.jsx)(t.p,{children:`Excel увидит текст и не сможет корректно суммировать, сортировать и применять числовую маску.`}),`
79
+ `,(0,c.jsx)(t.p,{children:`Правильно:`}),`
80
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`columns: [{ id: "AMOUNT", header: "Сумма", type: Number, format: "#,##0.00" }],
81
+ rows: [{ AMOUNT: 1250.5 }],
82
+ `})}),`
83
+ `,(0,c.jsx)(t.h2,{id:`нормализация-значений`,children:`Нормализация значений`}),`
84
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildExcelSheetData`}),` приводит данные согласно `,(0,c.jsx)(t.code,{children:`column.type`}),`.`]}),`
85
+ `,(0,c.jsx)(t.h3,{id:`пустые-значения`,children:`Пустые значения`}),`
86
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`null`}),`, `,(0,c.jsx)(t.code,{children:`undefined`}),` и пустая строка `,(0,c.jsx)(t.code,{children:`""`}),` становятся пустой ячейкой. Строка из пробелов не считается пустой.`]}),`
87
+ `,(0,c.jsx)(t.h3,{id:`number`,children:(0,c.jsx)(t.code,{children:`Number`})}),`
88
+ `,(0,c.jsxs)(t.p,{children:[`Число сохраняется как есть. Другое значение проходит через `,(0,c.jsx)(t.code,{children:`Number(value)`}),` и принимается только при конечном результате.`]}),`
89
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`"125.5"; // 125.5
90
+ ""; // пустая ячейка
91
+ "not a number"; // пустая ячейка
92
+ Infinity; // пустая ячейка
93
+ `})}),`
94
+ `,(0,c.jsxs)(t.p,{children:[`Учитывайте стандартные правила JavaScript: строки `,(0,c.jsx)(t.code,{children:`"0x10"`}),` и `,(0,c.jsx)(t.code,{children:`"1e2"`}),` преобразуются в `,(0,c.jsx)(t.code,{children:`16`}),` и `,(0,c.jsx)(t.code,{children:`100`}),`.`]}),`
95
+ `,(0,c.jsx)(t.h3,{id:`string`,children:(0,c.jsx)(t.code,{children:`String`})}),`
96
+ `,(0,c.jsxs)(t.p,{children:[`Используется `,(0,c.jsx)(t.code,{children:`String(value)`}),`. Объект без собственного осмысленного `,(0,c.jsx)(t.code,{children:`toString`}),` станет строкой `,(0,c.jsx)(t.code,{children:`"[object Object]"`}),`, поэтому сложные данные подготавливайте заранее.`]}),`
97
+ `,(0,c.jsx)(t.h3,{id:`boolean`,children:(0,c.jsx)(t.code,{children:`Boolean`})}),`
98
+ `,(0,c.jsxs)(t.p,{children:[`Используется `,(0,c.jsx)(t.code,{children:`Boolean(value)`}),`. Непустая строка `,(0,c.jsx)(t.code,{children:`"false"`}),` является `,(0,c.jsx)(t.code,{children:`true`}),`. Если backend присылает строковые флаги, сначала преобразуйте их в реальный boolean.`]}),`
99
+ `,(0,c.jsx)(t.h3,{id:`date`,children:(0,c.jsx)(t.code,{children:`Date`})}),`
100
+ `,(0,c.jsxs)(t.p,{children:[`Готовый `,(0,c.jsx)(t.code,{children:`Date`}),` используется напрямую. Остальное разбирается общим `,(0,c.jsx)(t.code,{children:`parseDate`}),` из formatters. Нераспознанное значение становится пустым.`]}),`
101
+ `,(0,c.jsx)(t.p,{children:`Для предсказуемого времени используйте ISO/OData-формат с явной временной зоной. Excel хранит дату как значение, а отображение дополнительно зависит от format и настроек программы пользователя.`}),`
102
+ `,(0,c.jsxs)(t.h3,{id:`без-type`,children:[`Без `,(0,c.jsx)(t.code,{children:`type`})]}),`
103
+ `,(0,c.jsxs)(t.p,{children:[`Значение передаётся writer почти без преобразования. Этот режим требует, чтобы вызывающий код уже подготовил тип, поддерживаемый `,(0,c.jsx)(t.code,{children:`write-excel-file`}),`.`]}),`
104
+ `,(0,c.jsx)(t.h2,{id:`buildexcelsheetdataargs`,children:(0,c.jsx)(t.code,{children:`buildExcelSheetData(args)`})}),`
105
+ `,(0,c.jsxs)(t.p,{children:[`Создаёт `,(0,c.jsx)(t.code,{children:`SheetData`}),` без скачивания файла. Полезно для тестов и собственного вызова writer.`]}),`
106
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const data = buildExcelSheetData({
107
+ columns,
108
+ rows,
109
+ getCellStyle: ({ row, column, rowIndex, columnIndex }) => {
110
+ if (column.id === "AMOUNT" && Number(row.AMOUNT) < 0) {
111
+ return { textColor: "#C50F1F", fontWeight: "bold" };
112
+ }
113
+
114
+ return undefined;
115
+ }
116
+ });
117
+ `})}),`
118
+ `,(0,c.jsxs)(t.p,{children:[`Первая строка результата — header, затем строки данных. `,(0,c.jsx)(t.code,{children:`rowIndex`}),` и `,(0,c.jsx)(t.code,{children:`columnIndex`}),` в callback начинаются с нуля `,(0,c.jsx)(t.strong,{children:`для данных`}),`, не включая header.`]}),`
119
+ `,(0,c.jsxs)(t.p,{children:[`Стиль объединяется после `,(0,c.jsx)(t.code,{children:`value`}),`, `,(0,c.jsx)(t.code,{children:`type`}),` и `,(0,c.jsx)(t.code,{children:`format`}),`. Тип `,(0,c.jsx)(t.code,{children:`ExcelCellStyle`}),` специально исключает эти три поля, поэтому callback предназначен только для визуальных параметров writer.`]}),`
120
+ `,(0,c.jsx)(t.h2,{id:`стили-по-value-state`,children:`Стили по value state`}),`
121
+ `,(0,c.jsx)(t.h3,{id:`resolveexcelcellstylefromstatestate`,children:(0,c.jsx)(t.code,{children:`resolveExcelCellStyleFromState(state)`})}),`
122
+ `,(0,c.jsxs)(t.p,{children:[`Преобразует общий `,(0,c.jsx)(t.code,{children:`State`}),` в цвет текста:`]}),`
123
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`State`}),(0,c.jsx)(t.th,{children:`Цвет`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`information`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#2563EB`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`success`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#107C10`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`warning`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#B7791F`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`error`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`#C50F1F`})})]})]})]}),`
124
+ `,(0,c.jsxs)(t.p,{children:[`Для `,(0,c.jsx)(t.code,{children:`none`}),`, пустой строки и `,(0,c.jsx)(t.code,{children:`undefined`}),` возвращается `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
125
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getCellStyle: ({ row }) =>
126
+ resolveExcelCellStyleFromState(row.STATE as State),
127
+ `})}),`
128
+ `,(0,c.jsxs)(t.p,{children:[`Helper задаёт только `,(0,c.jsx)(t.code,{children:`textColor`}),`. При необходимости объедините результат со своим стилем.`]}),`
129
+ `,(0,c.jsx)(t.h2,{id:`auto-filter`,children:`Auto-filter`}),`
130
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`autoFilter: true;
131
+ `})}),`
132
+ `,(0,c.jsx)(t.p,{children:`Фильтр охватывает header и все строки данных. Он добавляется через низкоуровневую OpenXML transform-feature, потому что используемый writer не предоставляет отдельной высокоуровневой опции.`}),`
133
+ `,(0,c.jsx)(t.h3,{id:`buildexcelautofilterrefcolumncount-rowcount`,children:(0,c.jsx)(t.code,{children:`buildExcelAutoFilterRef(columnCount, rowCount)`})}),`
134
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`buildExcelAutoFilterRef(1, 2); // "A1:A2"
135
+ buildExcelAutoFilterRef(28, 10); // "A1:AB10"
136
+ buildExcelAutoFilterRef(0, 10); // undefined
137
+ `})}),`
138
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`rowCount`}),` должен включать строку header. `,(0,c.jsx)(t.code,{children:`downloadExcelFile`}),` и workbook API вычисляют его автоматически.`]}),`
139
+ `,(0,c.jsx)(t.h2,{id:`несколько-листов`,children:`Несколько листов`}),`
140
+ `,(0,c.jsx)(t.h3,{id:`downloadexcelworkbookargs`,children:(0,c.jsx)(t.code,{children:`downloadExcelWorkbook(args)`})}),`
141
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadExcelWorkbook({
142
+ fileName: "report.xlsx",
143
+ sheets: [
144
+ {
145
+ name: "Заказы",
146
+ columns: orderColumns,
147
+ rows: orders,
148
+ autoFilter: true
149
+ },
150
+ {
151
+ name: "Справочник статусов",
152
+ columns: statusColumns,
153
+ rows: statuses,
154
+ autoFilter: false
155
+ }
156
+ ]
157
+ });
158
+ `})}),`
159
+ `,(0,c.jsx)(t.p,{children:`Каждый лист имеет собственные колонки, ширины, строки, стили и filter. Порядок массива — порядок вкладок Excel.`}),`
160
+ `,(0,c.jsxs)(t.p,{children:[`Пустой массив `,(0,c.jsx)(t.code,{children:`sheets`}),` приводит к ошибке: «Для формирования Excel-книги нужен минимум один лист».`]}),`
161
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fileName`}),` передаётся browser writer. Рекомендуется явно добавлять расширение `,(0,c.jsx)(t.code,{children:`.xlsx`}),` и заранее очищать пользовательский ввод от нежелательных символов имени файла.`]}),`
162
+ `,(0,c.jsx)(t.h2,{id:`имена-листов`,children:`Имена листов`}),`
163
+ `,(0,c.jsx)(t.h3,{id:`resolveexcelsheetnamesnames`,children:(0,c.jsx)(t.code,{children:`resolveExcelSheetNames(names)`})}),`
164
+ `,(0,c.jsxs)(t.p,{children:[`Excel ограничивает имя листа 31 символом и запрещает управляющие символы, `,(0,c.jsx)(t.code,{children:`[ ] / \\ : * ?`}),`. Helper:`]}),`
165
+ `,(0,c.jsxs)(t.ul,{children:[`
166
+ `,(0,c.jsx)(t.li,{children:`заменяет запрещённые группы пробелом;`}),`
167
+ `,(0,c.jsx)(t.li,{children:`схлопывает пробелы;`}),`
168
+ `,(0,c.jsx)(t.li,{children:`удаляет апострофы по краям;`}),`
169
+ `,(0,c.jsxs)(t.li,{children:[`использует `,(0,c.jsx)(t.code,{children:`Лист N`}),` для пустого результата;`]}),`
170
+ `,(0,c.jsx)(t.li,{children:`обрезает до 31 символа;`}),`
171
+ `,(0,c.jsxs)(t.li,{children:[`делает имена уникальными без учёта регистра через суффиксы `,(0,c.jsx)(t.code,{children:` (2)`}),`, `,(0,c.jsx)(t.code,{children:` (3)`}),`.`]}),`
172
+ `]}),`
173
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveExcelSheetNames(["Продажи/Россия", "продажи россия", ""]);
174
+
175
+ // ["Продажи Россия", "продажи россия (2)", "Лист 3"]
176
+ `})}),`
177
+ `,(0,c.jsx)(t.p,{children:`Функция возвращает новый массив и не меняет входные строки.`}),`
178
+ `,(0,c.jsx)(t.h2,{id:`tableodata-адаптер`,children:`Table/OData-адаптер`}),`
179
+ `,(0,c.jsxs)(t.p,{children:[`Вторая часть модуля помогает экспортировать таблицу, описание колонок которой использует `,(0,c.jsx)(t.code,{children:`ColumnRole`}),`, `,(0,c.jsx)(t.code,{children:`ODataMetaType`}),` и formatter pipeline.`]}),`
180
+ `,(0,c.jsx)(t.h3,{id:`tableexcelcolumndescriptor`,children:(0,c.jsx)(t.code,{children:`TableExcelColumnDescriptor`})}),`
181
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type TableExcelColumnDescriptor = {
182
+ id: string;
183
+ header: string;
184
+ width?: number;
185
+ role?: ColumnRole;
186
+ odataType?: ODataMetaType;
187
+ clientOnly?: boolean;
188
+ formattersPipeline?: FormattersPipelineConfig;
189
+ };
190
+ `})}),`
191
+ `,(0,c.jsx)(t.h3,{id:`resolvetableexcelcolumntypedescriptor`,children:(0,c.jsx)(t.code,{children:`resolveTableExcelColumnType(descriptor)`})}),`
192
+ `,(0,c.jsx)(t.p,{children:`Тип определяется в следующем порядке:`}),`
193
+ `,(0,c.jsxs)(t.ol,{children:[`
194
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`clientOnly: true`}),` → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
195
+ `,(0,c.jsxs)(t.li,{children:[`OData date/time type → `,(0,c.jsx)(t.code,{children:`Date`}),`;`]}),`
196
+ `,(0,c.jsxs)(t.li,{children:[`OData boolean type → `,(0,c.jsx)(t.code,{children:`Boolean`}),`;`]}),`
197
+ `,(0,c.jsxs)(t.li,{children:[`OData numeric type → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
198
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`role: "measure"`}),` → `,(0,c.jsx)(t.code,{children:`Number`}),`;`]}),`
199
+ `,(0,c.jsxs)(t.li,{children:[`иначе → `,(0,c.jsx)(t.code,{children:`String`}),`.`]}),`
200
+ `]}),`
201
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`clientOnly`}),` здесь предполагает вычисляемую числовую колонку. Если приложение создаёт client-only текст, generic descriptor не сможет вывести его автоматически — сформируйте `,(0,c.jsx)(t.code,{children:`ExcelColumn`}),` вручную.`]}),`
202
+ `,(0,c.jsx)(t.h3,{id:`createtableexcelcolumndescriptor`,children:(0,c.jsx)(t.code,{children:`createTableExcelColumn(descriptor)`})}),`
203
+ `,(0,c.jsxs)(t.p,{children:[`Создаёт `,(0,c.jsx)(t.code,{children:`ExcelColumn`}),`, включая тип и format.`]}),`
204
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const column = createTableExcelColumn({
205
+ id: "NET_AMOUNT",
206
+ header: "Сумма",
207
+ odataType: "decimal",
208
+ role: "measure",
209
+ width: 16,
210
+ formattersPipeline: {
211
+ steps: [
212
+ {
213
+ type: "typedValueFormat",
214
+ config: { numberPresetName: "currency" }
215
+ }
216
+ ]
217
+ }
218
+ });
219
+ `})}),`
220
+ `,(0,c.jsxs)(t.p,{children:[`Точная структура pipeline описана в документации `,(0,c.jsx)(t.code,{children:`/formatters`}),`. Excel использует первый валидированный step `,(0,c.jsx)(t.code,{children:`typedValueFormat`}),`.`]}),`
221
+ `,(0,c.jsx)(t.h3,{id:`числовые-форматы-из-presets`,children:`Числовые форматы из presets`}),`
222
+ `,(0,c.jsxs)(t.p,{children:[`Если pipeline содержит существующий `,(0,c.jsx)(t.code,{children:`numberPresetName`}),`, число получает столько десятичных нулей, сколько указано в preset:`]}),`
223
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`decimals = 0 → #,##0
224
+ decimals = 2 → #,##0.00
225
+ `})}),`
226
+ `,(0,c.jsxs)(t.p,{children:[`Для OData integer по умолчанию выбирается preset `,(0,c.jsx)(t.code,{children:`integer`}),`, для других чисел — `,(0,c.jsx)(t.code,{children:`decimal`}),`. Неизвестное имя preset игнорируется и заменяется подходящим default.`]}),`
227
+ `,(0,c.jsx)(t.h3,{id:`форматы-дат-из-presets`,children:`Форматы дат из presets`}),`
228
+ `,(0,c.jsx)(t.p,{children:`По умолчанию:`}),`
229
+ `,(0,c.jsxs)(t.ul,{children:[`
230
+ `,(0,c.jsxs)(t.li,{children:[`OData `,(0,c.jsx)(t.code,{children:`time`}),` → time preset;`]}),`
231
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`datetime`}),`/`,(0,c.jsx)(t.code,{children:`datetimeOffset`}),` → datetime preset;`]}),`
232
+ `,(0,c.jsx)(t.li,{children:`остальные date types → date preset.`}),`
233
+ `]}),`
234
+ `,(0,c.jsxs)(t.p,{children:[`Встроенные presets переводятся в Excel-маски, включая варианты `,(0,c.jsx)(t.code,{children:`dd.mm`}),`, `,(0,c.jsx)(t.code,{children:`d mmm`}),`, `,(0,c.jsx)(t.code,{children:`mmm yyyy`}),`, `,(0,c.jsx)(t.code,{children:`hh:mm`}),` и форматы с секундами.`]}),`
235
+ `,(0,c.jsxs)(t.p,{children:[`Для пользовательского date pattern токены нормализуются для Excel: `,(0,c.jsx)(t.code,{children:`H`}),` заменяется на `,(0,c.jsx)(t.code,{children:`h`}),`, `,(0,c.jsx)(t.code,{children:`M`}),` — на `,(0,c.jsx)(t.code,{children:`m`}),`. Если `,(0,c.jsx)(t.code,{children:`datePresetName`}),` не найден в registry, он исторически трактуется как ручной pattern.`]}),`
236
+ `,(0,c.jsx)(t.p,{children:`Форматы даты в JavaScript formatter и Excel не полностью взаимозаменяемы. Всегда проверяйте пользовательские patterns в реальном Excel/LibreOffice.`}),`
237
+ `,(0,c.jsx)(t.h2,{id:`подготовленная-таблица`,children:`Подготовленная таблица`}),`
238
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ResolvedExcelTable = {
239
+ columns: ExcelColumn[];
240
+ rows: ExcelRow[];
241
+ cellStyles?: ReadonlyArray<Readonly<Record<string, ExcelCellStyle | undefined>>>;
242
+ };
243
+ `})}),`
244
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`cellStyles[rowIndex][columnId]`}),` задаёт стиль конкретной ячейки. Индекс соответствует массиву `,(0,c.jsx)(t.code,{children:`rows`}),`.`]}),`
245
+ `,(0,c.jsx)(t.h3,{id:`downloadresolvedexceltableargs`,children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelTable(args)`})}),`
246
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadResolvedExcelTable({
247
+ fileName: "table.xlsx",
248
+ table: {
249
+ columns,
250
+ rows,
251
+ cellStyles: [{ AMOUNT: { textColor: "#107C10" } }, { AMOUNT: { textColor: "#C50F1F" } }]
252
+ }
253
+ });
254
+ `})}),`
255
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`autoFilter`}),` по умолчанию `,(0,c.jsx)(t.code,{children:`true`}),`.`]}),`
256
+ `,(0,c.jsx)(t.h3,{id:`downloadresolvedexcelworkbookargs`,children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelWorkbook(args)`})}),`
257
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await downloadResolvedExcelWorkbook({
258
+ fileName: "analytics.xlsx",
259
+ sheets: [
260
+ { name: "План", table: planTable },
261
+ { name: "Факт", table: factTable, autoFilter: false }
262
+ ]
263
+ });
264
+ `})}),`
265
+ `,(0,c.jsx)(t.p,{children:`Для каждого resolved sheet auto-filter тоже включён по умолчанию.`}),`
266
+ `,(0,c.jsx)(t.h2,{id:`browser-boundary-и-обработка-ошибок`,children:`Browser boundary и обработка ошибок`}),`
267
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`downloadExcelFile`}),`, `,(0,c.jsx)(t.code,{children:`downloadExcelWorkbook`}),` и resolved download-функции используют browser bundle writer и инициируют сохранение файла. Вызывайте их из пользовательского действия в клиентском коде.`]}),`
268
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function onExportClick() {
269
+ setExporting(true);
270
+
271
+ try {
272
+ await downloadExcelFile(args);
273
+ } catch (error) {
274
+ showExportError(error);
275
+ } finally {
276
+ setExporting(false);
277
+ }
278
+ }
279
+ `})}),`
280
+ `,(0,c.jsxs)(t.p,{children:[`Promise завершается после `,(0,c.jsx)(t.code,{children:`toFile`}),`. Ошибки writer, нехватка памяти и запрет скачивания браузером не подавляются.`]}),`
281
+ `,(0,c.jsx)(t.p,{children:`Для больших таблиц построение всей книги происходит в памяти главного потока и может временно заблокировать UI. Модуль не реализует streaming, worker и серверную генерацию.`}),`
282
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
283
+ `,(0,c.jsx)(t.h3,{id:`передавать-display-строки-вместо-typed-values`,children:`Передавать display-строки вместо typed values`}),`
284
+ `,(0,c.jsxs)(t.p,{children:[`Excel теряет возможность вычислять и сортировать данные. Передавайте настоящие `,(0,c.jsx)(t.code,{children:`number`}),`, `,(0,c.jsx)(t.code,{children:`boolean`}),` и `,(0,c.jsx)(t.code,{children:`Date`}),`.`]}),`
285
+ `,(0,c.jsxs)(t.h3,{id:`ожидать-javascript-формат-в-поле-format`,children:[`Ожидать JavaScript-формат в поле `,(0,c.jsx)(t.code,{children:`format`})]}),`
286
+ `,(0,c.jsxs)(t.p,{children:[`Это маска Excel. `,(0,c.jsx)(t.code,{children:`Intl.DateTimeFormat`}),` options и formatter preset напрямую туда не подходят.`]}),`
287
+ `,(0,c.jsxs)(t.h3,{id:`экспортировать-false-как-boolean`,children:[`Экспортировать `,(0,c.jsx)(t.code,{children:`"false"`}),` как Boolean`]}),`
288
+ `,(0,c.jsxs)(t.p,{children:[`Непустая строка истинна. Нормализуйте transport-значение до `,(0,c.jsx)(t.code,{children:`false`}),`.`]}),`
289
+ `,(0,c.jsx)(t.h3,{id:`использовать-api-на-сервере`,children:`Использовать API на сервере`}),`
290
+ `,(0,c.jsxs)(t.p,{children:[`Импорт идёт из `,(0,c.jsx)(t.code,{children:`write-excel-file/browser`}),`. Для server-side Excel нужен другой owner/адаптер.`]}),`
291
+ `,(0,c.jsx)(t.h3,{id:`передавать-пустой-workbook`,children:`Передавать пустой workbook`}),`
292
+ `,(0,c.jsx)(t.p,{children:`Многолистовая книга требует минимум один sheet. Пустой лист с header допустим, если есть columns.`}),`
293
+ `,(0,c.jsx)(t.h3,{id:`полагаться-на-исходные-имена-листов`,children:`Полагаться на исходные имена листов`}),`
294
+ `,(0,c.jsxs)(t.p,{children:[`Они нормализуются и могут получить суффикс. Если имя нужно показывать пользователю заранее, вызовите `,(0,c.jsx)(t.code,{children:`resolveExcelSheetNames`}),` до download.`]}),`
295
+ `,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
296
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Экспорт`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildExcelSheetData`})}),(0,c.jsx)(t.td,{children:`Собрать типизированные ячейки без скачивания`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadExcelFile`})}),(0,c.jsxs)(t.td,{children:[`Скачать книгу с одним листом `,(0,c.jsx)(t.code,{children:`Sheet1`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadExcelWorkbook`})}),(0,c.jsx)(t.td,{children:`Скачать книгу из нескольких независимых листов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildExcelAutoFilterRef`})}),(0,c.jsx)(t.td,{children:`Построить Excel-диапазон фильтра`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveExcelSheetNames`})}),(0,c.jsx)(t.td,{children:`Нормализовать и дедуплицировать имена листов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveExcelCellStyleFromState`})}),(0,c.jsx)(t.td,{children:`Получить цвет текста из общего value state`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveTableExcelColumnType`})}),(0,c.jsx)(t.td,{children:`Вывести Excel type из OData/table descriptor`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createTableExcelColumn`})}),(0,c.jsx)(t.td,{children:`Создать колонку с type и format`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelTable`})}),(0,c.jsx)(t.td,{children:`Скачать заранее подготовленную таблицу`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`downloadResolvedExcelWorkbook`})}),(0,c.jsx)(t.td,{children:`Скачать несколько подготовленных таблиц`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ExcelColumn`}),`, `,(0,c.jsx)(t.code,{children:`ExcelRow`}),`, `,(0,c.jsx)(t.code,{children:`ExcelCellStyle`})]}),(0,c.jsx)(t.td,{children:`Базовые generic-типы`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ResolvedExcelTable`})}),(0,c.jsx)(t.td,{children:`Таблица с optional map стилей`})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Sr0umHM6.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-DndFRxxW.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Array`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Array`}),`
2
2
  `,(0,c.jsxs)(t.h1,{id:`работа-с-массивами-через-ryuzaki13react-foundation-libarray`,children:[`Работа с массивами через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/array`})]}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`array`}),` содержит небольшие типизированные функции для типовых операций с массивами:`]}),`
4
4
  `,(0,c.jsxs)(t.ul,{children:[`
@@ -0,0 +1,82 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Browser/Session Storage ID`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`идентификатор-вкладочной-сессии-через-ryuzaki13react-foundation-libsession-storage`,children:[`Идентификатор вкладочной сессии через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/session-storage`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`getSessionStorageId`}),` возвращает стабильный id в пределах одной browser-вкладки. При первом вызове id создаётся и сохраняется в `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`, при следующих — читается по тому же ключу.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
5
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { getSessionStorageId } from "@ryuzaki13/react-foundation-lib/session-storage";
6
+ `})}),`
7
+ `,(0,c.jsxs)(t.p,{children:[`Default generator — `,(0,c.jsx)(t.code,{children:`uuidv4`}),` из `,(0,c.jsx)(t.code,{children:`/crypto`}),`.`]}),`
8
+ `,(0,c.jsx)(t.h2,{id:`базовый-пример`,children:`Базовый пример`}),`
9
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const sessionId = getSessionStorageId("sales-app.error-report.session.v1");
10
+ `})}),`
11
+ `,(0,c.jsx)(t.p,{children:`Повторный вызов в той же вкладке:`}),`
12
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const first = getSessionStorageId("sales-app.session.v1");
13
+ const second = getSessionStorageId("sales-app.session.v1");
14
+
15
+ console.log(first === second); // true, если storage доступен.
16
+ `})}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Другая вкладка имеет отдельный `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` и обычно получит другой id.`]}),`
18
+ `,(0,c.jsx)(t.h2,{id:`алгоритм`,children:`Алгоритм`}),`
19
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`sessionStorage недоступен ──► createId() без сохранения
20
+
21
+
22
+ getItem(key)
23
+ ├─ непустая строка ──────► вернуть её
24
+ └─ нет значения ─────────► createId() → setItem → вернуть id
25
+
26
+ ошибка getItem/setItem ─────► fallback createId()
27
+ `})}),`
28
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const id = getSessionStorageId("demo.session", () => "known-id");
29
+ `})}),`
30
+ `,(0,c.jsx)(t.p,{children:`Второй аргумент удобен для теста или другого генератора.`}),`
31
+ `,(0,c.jsx)(t.h2,{id:`граница-стабильности`,children:`Граница стабильности`}),`
32
+ `,(0,c.jsx)(t.p,{children:`Идентификатор стабилен только при успешном storage:`}),`
33
+ `,(0,c.jsxs)(t.ul,{children:[`
34
+ `,(0,c.jsx)(t.li,{children:`reload той же вкладки обычно сохраняет значение;`}),`
35
+ `,(0,c.jsx)(t.li,{children:`новая вкладка получает своё storage;`}),`
36
+ `,(0,c.jsx)(t.li,{children:`закрытие вкладки удаляет session storage по правилам браузера;`}),`
37
+ `,(0,c.jsx)(t.li,{children:`privacy policy, sandbox iframe или переполнение могут запретить доступ;`}),`
38
+ `,(0,c.jsx)(t.li,{children:`если storage недоступен, каждый вызов может создать новый fallback id.`}),`
39
+ `]}),`
40
+ `,(0,c.jsx)(t.p,{children:`Функция ловит ошибки чтения/записи и не ломает основной пользовательский сценарий.`}),`
41
+ `,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`setItem`}),` выбросил ошибку после первого вызова generator, fallback generator может быть вызван повторно. Не используйте `,(0,c.jsx)(t.code,{children:`createId`}),` с внешними необратимыми side effects.`]}),`
42
+ `,(0,c.jsx)(t.h2,{id:`ключ-storage`,children:`Ключ storage`}),`
43
+ `,(0,c.jsx)(t.p,{children:`Ключ полностью задаёт host. Рекомендуемый формат:`}),`
44
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`<app-id>.<purpose>.v<schema-version>
45
+ `})}),`
46
+ `,(0,c.jsx)(t.p,{children:`Примеры:`}),`
47
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`sales-app.error-report.session.v1
48
+ warehouse.telemetry.tab-session.v2
49
+ `})}),`
50
+ `,(0,c.jsx)(t.p,{children:`Не используйте один ключ для несвязанных подсистем. При изменении семантики меняйте версию.`}),`
51
+ `,(0,c.jsx)(t.h2,{id:`ssr-и-безопасность`,children:`SSR и безопасность`}),`
52
+ `,(0,c.jsxs)(t.p,{children:[`Вне browser `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` отсутствует, поэтому функция просто возвращает новый id generator-а. Она не пытается создать server session.`]}),`
53
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const id = getSessionStorageId("demo", () => "server-fallback");
54
+ `})}),`
55
+ `,(0,c.jsx)(t.p,{children:`Идентификатор:`}),`
56
+ `,(0,c.jsxs)(t.ul,{children:[`
57
+ `,(0,c.jsx)(t.li,{children:`не является authentication token;`}),`
58
+ `,(0,c.jsx)(t.li,{children:`не подтверждает пользователя;`}),`
59
+ `,(0,c.jsx)(t.li,{children:`не должен давать доступ к данным;`}),`
60
+ `,(0,c.jsx)(t.li,{children:`не является cross-tab device id;`}),`
61
+ `,(0,c.jsx)(t.li,{children:`не должен включать персональные данные.`}),`
62
+ `]}),`
63
+ `,(0,c.jsxs)(t.p,{children:[`Для долговременного client fingerprint используйте отдельный `,(0,c.jsx)(t.code,{children:`/fingerprint`}),`, понимая его privacy-границы.`]}),`
64
+ `,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
65
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`sessionStorage.clear();
66
+
67
+ const createId = vi.fn(() => "session-1");
68
+
69
+ expect(getSessionStorageId("test.session", createId)).toBe("session-1");
70
+ expect(getSessionStorageId("test.session", () => "session-2")).toBe("session-1");
71
+ expect(createId).toHaveBeenCalledOnce();
72
+ `})}),`
73
+ `,(0,c.jsxs)(t.p,{children:[`Очищайте `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` между тестами.`]}),`
74
+ `,(0,c.jsx)(t.h2,{id:`api-и-ошибки`,children:`API и ошибки`}),`
75
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function getSessionStorageId(key: string, createId?: () => string): string;
76
+ `})}),`
77
+ `,(0,c.jsxs)(t.ul,{children:[`
78
+ `,(0,c.jsx)(t.li,{children:`Пустой сохранённый string считается отсутствующим и заменяется.`}),`
79
+ `,(0,c.jsx)(t.li,{children:`Ключ и результат generator не валидируются.`}),`
80
+ `,(0,c.jsx)(t.li,{children:`Исключение самого fallback generator может быть проброшено.`}),`
81
+ `,(0,c.jsx)(t.li,{children:`Функция ничего не удаляет из storage.`}),`
82
+ `]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Sr0umHM6.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-DndFRxxW.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Strings`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Strings`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`строковые-форматтеры`,children:`Строковые форматтеры`}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Модуль содержит небольшие предсказуемые функции для подготовки пользовательского текста: обрезки пробелов, безопасного преобразования в строку, удаления ведущих нулей, сокращения длинного текста и выбора русской формы слова.`}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Все функции экспортируются через один публичный entrypoint:`}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Sr0umHM6.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-DndFRxxW.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Pipeline`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Pipeline`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`formatter-pipeline`,children:`Formatter pipeline`}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Formatter pipeline — конфигурируемая последовательность преобразований значения ячейки. Она умеет:`}),`
4
4
  `,(0,c.jsxs)(t.ul,{children:[`