@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.
- package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -1
- package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
- package/dist/chunks/select-MN6zDPKM.js.map +1 -1
- package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
- package/dist/select/model/useODataSelect.d.ts +1 -1
- package/dist/select/model/useODataSelect.d.ts.map +1 -1
- package/dist/select/model/useODataSelectBase.d.ts +1 -1
- package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
- package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
- package/package.json +3 -3
- package/storybook-static/assets/{Badge-BojMuOws.js → Badge-BFhBl7yM.js} +1 -1
- package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-BEu55X4s.js} +1 -1
- package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-mqmnGtRR.js} +1 -1
- package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-CESdnWrO.js} +1 -1
- package/storybook-static/assets/{Button-CrTHXWYk.js → Button-_YPAu9sd.js} +1 -1
- package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-B0Y_T17B.js} +1 -1
- package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-DLuO2Ywz.js} +1 -1
- package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-CGiNmAPT.js} +1 -1
- package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-l0pbBm9z.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-ROPAnqh8.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
- package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-Bob4DtRn.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-DxfUAeJS.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-DuEz9CXt.js} +1 -1
- package/storybook-static/assets/DateInput-BQ8SoeLE.js +1 -0
- package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DmNLD4Dz.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-sTpYf7Ob.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
- package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CJniLn1R.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-BXjdNaL-.js} +1 -1
- package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-D6a_qzr3.js} +1 -1
- package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DOYnnXlU.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-B1cZLRK3.js} +1 -1
- package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-Chh5o_0s.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-CRnQOgVj.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
- package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-Bm5gqdi9.js} +1 -1
- package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-C4L7JAlq.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-BhA9q8Qv.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-DtZNSUHF.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
- package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CJlia-8f.js} +1 -1
- package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-DCvfi1EY.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-CsnfPiwV.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
- package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-C-KwTRAM.js} +1 -1
- package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-CzbqknNR.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-IsNCXCrZ.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DY0UITYz.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories--9q9b9nv.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
- package/storybook-static/assets/{Input-op4j7Beh.js → Input-DLubbE7P.js} +1 -1
- package/storybook-static/assets/{Input-BUDNR96c.js → Input-Dw2JblYt.js} +1 -1
- package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-DQeyDULG.js} +1 -1
- package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-BRzl8Vrt.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
- package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-B8UroZji.js} +1 -1
- package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-DPftxjGw.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-C7yyqHqc.js} +1 -1
- package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-BQVXHVLy.js} +1 -1
- package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-UD_9S7-N.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-BNjijD3Y.js} +1 -1
- package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-C-pHr-Sx.js} +1 -1
- package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-DbcbqIhY.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-D-TC9r9t.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-DbhWgM9y.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-BoV_E3qt.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-w1EsRpYP.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
- package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-CzZRsr6a.js} +1 -1
- package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-qZdTi11b.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-C9k_1850.js} +1 -1
- package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-DCpul8QM.js} +1 -1
- package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-Cy0Xd4LF.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
- package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-BEQdl-F4.js} +1 -1
- package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-Dy4X94E2.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-FuzejJmz.js} +1 -1
- package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-BsQ9EfkA.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-BSrODvw7.js} +1 -1
- package/storybook-static/assets/NotificationsHost.stories-DeiWspcY.js +29 -0
- package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-BwMgAkbE.js} +2 -2
- package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-BgC7GHOv.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-DEIRAB-s.js} +2 -2
- package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-DycQ3RuL.js} +1 -1
- package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-taxbFfjo.js} +1 -1
- package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-Q0QaPCII.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DUJ2nF3F.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-DnM7x-uC.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
- package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-B6oidz5p.js} +1 -1
- package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-Tbhf8T81.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-DE1LxZvv.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-BPtAknAr.js} +1 -1
- package/storybook-static/assets/README--TpGcM95.js +110 -0
- package/storybook-static/assets/{README-MzcO5Z_P.js → README-4iBHWAP5.js} +1 -1
- package/storybook-static/assets/README-98KIgy5G.js +75 -0
- package/storybook-static/assets/README-B6II8p0W.js +154 -0
- package/storybook-static/assets/{README-CkWglKbS.js → README-B6vU5_7I.js} +1 -1
- package/storybook-static/assets/README-BFJVjjZR.js +325 -0
- package/storybook-static/assets/README-BIT4HlFP.js +441 -0
- package/storybook-static/assets/{README-DqQDgJN-.js → README-BK6Epio1.js} +1 -1
- package/storybook-static/assets/{README-DRnlD7y8.js → README-BRlPB5_k.js} +1 -1
- package/storybook-static/assets/README-BTFpEaXG.js +64 -0
- package/storybook-static/assets/README-BWhXgC_o.js +226 -0
- package/storybook-static/assets/README-BbNHvOoR.js +101 -0
- package/storybook-static/assets/README-BbunUo8b.js +118 -0
- package/storybook-static/assets/README-BmYpfZKr.js +1844 -0
- package/storybook-static/assets/README-Bu5uvhAT.js +230 -0
- package/storybook-static/assets/README-Bx6fvSBE.js +1282 -0
- package/storybook-static/assets/README-Bx6gIGiA.js +69 -0
- package/storybook-static/assets/README-ByhxsX44.js +324 -0
- package/storybook-static/assets/README-Byi1FFpw.js +98 -0
- package/storybook-static/assets/README-C3Is3a3B.js +208 -0
- package/storybook-static/assets/{README-C0BwTe5N.js → README-C6prwAXw.js} +1 -1
- package/storybook-static/assets/{README-BzVni2ve.js → README-C9S83J_G.js} +1 -1
- package/storybook-static/assets/{README-BHw6MVjD.js → README-CGgxP5Zo.js} +1 -1
- package/storybook-static/assets/README-CJ2ZVG2U.js +2124 -0
- package/storybook-static/assets/README-CNGCAm5d.js +95 -0
- package/storybook-static/assets/README-Cb_q420B.js +90 -0
- package/storybook-static/assets/README-CtIDPNJ3.js +186 -0
- package/storybook-static/assets/README-CzO3Dchr.js +64 -0
- package/storybook-static/assets/README-D0rzQthv.js +264 -0
- package/storybook-static/assets/README-DEQu7djz.js +1704 -0
- package/storybook-static/assets/README-DFihT_sm.js +296 -0
- package/storybook-static/assets/{README-CTIBG4zH.js → README-DMiWsyv_.js} +1 -1
- package/storybook-static/assets/README-DOx8lXXk.js +82 -0
- package/storybook-static/assets/{README-DzTc6XmY.js → README-DPhDjr43.js} +1 -1
- package/storybook-static/assets/{README-Dki94Nf2.js → README-D_NqWPa9.js} +1 -1
- package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
- package/storybook-static/assets/README-DlwhWCvQ.js +1146 -0
- package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
- package/storybook-static/assets/README-Dycov6NP.js +583 -0
- package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
- package/storybook-static/assets/README-Gfd9tLTw.js +672 -0
- package/storybook-static/assets/{README-B4zYJg6u.js → README-Kfawetke.js} +1 -1
- package/storybook-static/assets/{README-BzVHwvgo.js → README-UDBM7ZMT.js} +1 -1
- package/storybook-static/assets/{README-D-XjRtAE.js → README-VTWQxLm_.js} +1 -1
- package/storybook-static/assets/README-YHNWrTZv.js +400 -0
- package/storybook-static/assets/README-_0Otw0eD.js +448 -0
- package/storybook-static/assets/README-aw2Xu9xu.js +158 -0
- package/storybook-static/assets/README-eg1emlll.js +192 -0
- package/storybook-static/assets/README-iqQHdhZ4.js +416 -0
- package/storybook-static/assets/{README-BdPlV5nA.js → README-llxZAtCj.js} +1 -1
- package/storybook-static/assets/README-wFnEIGl4.js +95 -0
- package/storybook-static/assets/{README-Dx3cpFMr.js → README-webB1yH0.js} +1 -1
- package/storybook-static/assets/README-wtreGRCe.js +208 -0
- package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-CNOLDk_o.js} +1 -1
- package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-Ce05_q7s.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-CPd4lTl0.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BtfD5Szd.js} +1 -1
- package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-Ccm7G-dv.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
- package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-DvdBIeig.js} +1 -1
- package/storybook-static/assets/{Select-DQMoVjn4.js → Select-8PV9PBKF.js} +1 -1
- package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-G04B41FM.js} +1 -1
- package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-Cf6CBhV8.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-CdQdHIVp.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-DattLt6w.js} +1 -1
- package/storybook-static/assets/SingleDateTimeInput.stories-BLJV3jzV.js +48 -0
- package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-DKEI4cDd.js} +1 -1
- package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-Dci-mJt_.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-Dp7oQueF.js} +1 -1
- package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-BGPQmlgY.js} +1 -1
- package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BhjqGOKt.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-DXNhRU3X.js} +1 -1
- package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CMd9l1Gd.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-BN1cFEFJ.js} +1 -1
- package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-GL65TlI9.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-q5PlI6rB.js} +1 -1
- package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-Byik5-iZ.js} +1 -1
- package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-CT0JF2V6.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-pPEPmgnN.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-BQlFmCE7.js} +1 -1
- package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch--xGPiYk-.js} +1 -1
- package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-DhaLI9CG.js} +1 -1
- package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-5DisgIyj.js} +1 -1
- package/storybook-static/assets/{Table-BFAEcUde.js → Table-Bf6MicdG.js} +1 -1
- package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-CS7rQgj9.js} +2 -2
- package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-B4y4y8Ap.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-C0SpdGkh.js} +1 -1
- package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-C5LLLhnj.js} +1 -1
- package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-D4BpuCoH.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-rn2wtZP_.js} +1 -1
- package/storybook-static/assets/{Text-DK4jN26J.js → Text-BhBt9e7C.js} +1 -1
- package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-B-Hz7ujq.js} +1 -1
- package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-BHHxY5sd.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-CZ2kWz20.js} +1 -1
- package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-Cg8fgFsn.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-BxdwtK2e.js} +1 -1
- package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-BWwfk9fi.js} +1 -1
- package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-Ce9rbjBc.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-0fzcmzKy.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-qU2xPlar.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-BIHydJFy.js} +1 -1
- package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-BKnWu0C7.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
- package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-pVXjU9dG.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-CV_8Ui6R.js} +2 -2
- package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-BY40djCc.js} +3 -3
- package/storybook-static/assets/{check-CLkTJVXe.js → check-CVkPTDzp.js} +1 -1
- package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-BtNO4Vhe.js} +1 -1
- package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-kceSK3sZ.js} +1 -1
- package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-BA_LO2El.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
- package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B2m4a1zz.js} +1 -1
- package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-Cfjhotlm.js} +1 -1
- package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-D6yV8PLX.js} +3 -3
- package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B0pQBIW0.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
- package/storybook-static/assets/{download-eAKjms6q.js → download-Lba8elK9.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-BFNvfMpU.js} +1 -1
- package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
- package/storybook-static/assets/foundationApi-DZhnQ2cC.js +59 -0
- package/storybook-static/assets/foundationLib-CoVTo22U.js +30 -0
- package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-Cc6eXN6U.js} +1 -1
- package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
- package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-o7sH2IXC.js} +4 -4
- package/storybook-static/assets/{info-DhJTzwcL.js → info-BpsVP_dM.js} +1 -1
- package/storybook-static/assets/odata-CXsbxsRY.js +1 -0
- package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
- package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
- package/storybook-static/assets/{react-YFbUKK0m.js → react-DeJ0JTHb.js} +1 -1
- package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-BvGyjEXe.js} +1 -1
- package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-BdXxnHos.js} +1 -1
- package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-XkyN-9r5.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
- package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-uPH9-fND.js} +1 -1
- package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-tT01vSMw.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
- package/storybook-static/assets/useODataTreeData-CU7Rqcb9.js +1 -0
- package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-D8GHQ6KR.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
- package/storybook-static/assets/{x-CqPSvWfo.js → x-BlAURbAH.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
- package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
- package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
- package/storybook-static/assets/async-SjiCjIjO.js +0 -625
- package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
- package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
- package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
- package/storybook-static/assets/odata-DhISMZkE.js +0 -1
- package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
- package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
- package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
- package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
|
@@ -0,0 +1,95 @@
|
|
|
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`,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/React/Virtualizer Pagination`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`дозагрузка-virtualized-списка-через-ryuzaki13react-foundation-libvirtualizer`,children:[`Дозагрузка virtualized списка через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/virtualizer`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useFetchNextPageEffect`}),` вызывает `,(0,c.jsx)(t.code,{children:`fetchNextPage`}),`, когда последняя отрендеренная virtual item достигает конца уже загруженного списка.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
5
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install react @tanstack/react-virtual @ryuzaki13/react-foundation-lib
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { useFetchNextPageEffect } from "@ryuzaki13/react-foundation-lib/virtualizer";
|
|
8
|
+
`})}),`
|
|
9
|
+
`,(0,c.jsxs)(t.p,{children:[`Host должен использовать совместимые peer dependencies React `,(0,c.jsx)(t.code,{children:`>=19.2 <20`}),` и `,(0,c.jsx)(t.code,{children:`@tanstack/react-virtual >=3.14 <4`}),`.`]}),`
|
|
10
|
+
`,(0,c.jsx)(t.h2,{id:`назначение-и-границы`,children:`Назначение и границы`}),`
|
|
11
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`virtualItems (видимый диапазон)
|
|
12
|
+
currentItemsCount (сколько уже загружено)
|
|
13
|
+
hasNextPage
|
|
14
|
+
│
|
|
15
|
+
последний virtual index >= currentItemsCount - 1
|
|
16
|
+
│
|
|
17
|
+
▼
|
|
18
|
+
fetchNextPage() один раз до завершения Promise
|
|
19
|
+
`})}),`
|
|
20
|
+
`,(0,c.jsx)(t.p,{children:`Hook не создаёт virtualizer, не хранит backend data, не строит query key и не решает server pagination. TanStack Query должен оставаться владельцем server snapshot.`}),`
|
|
21
|
+
`,(0,c.jsx)(t.h2,{id:`сигнатура`,children:`Сигнатура`}),`
|
|
22
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`useFetchNextPageEffect({
|
|
23
|
+
virtualItems,
|
|
24
|
+
currentItemsCount,
|
|
25
|
+
fetchNextPage,
|
|
26
|
+
hasNextPage
|
|
27
|
+
});
|
|
28
|
+
`})}),`
|
|
29
|
+
`,(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:`virtualItems`})}),(0,c.jsxs)(t.td,{children:[`Текущий массив `,(0,c.jsx)(t.code,{children:`VirtualItem[]`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`currentItemsCount`})}),(0,c.jsx)(t.td,{children:`Число реально загруженных data items`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`hasNextPage`})}),(0,c.jsx)(t.td,{children:`Есть ли следующая server page`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchNextPage`})}),(0,c.jsx)(t.td,{children:`Stable функция, возвращающая Promise`})]})]})]}),`
|
|
30
|
+
`,(0,c.jsx)(t.p,{children:`Hook ничего не возвращает.`}),`
|
|
31
|
+
`,(0,c.jsx)(t.h2,{id:`пример-с-tanstack-queryvirtual`,children:`Пример с TanStack Query/Virtual`}),`
|
|
32
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const rows = query.data?.pages.flatMap((page) => page.rows) ?? [];
|
|
33
|
+
const virtualItems = virtualizer.getVirtualItems();
|
|
34
|
+
|
|
35
|
+
useFetchNextPageEffect({
|
|
36
|
+
virtualItems,
|
|
37
|
+
currentItemsCount: rows.length,
|
|
38
|
+
hasNextPage: query.hasNextPage,
|
|
39
|
+
fetchNextPage: async () => {
|
|
40
|
+
await query.fetchNextPage();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
`})}),`
|
|
44
|
+
`,(0,c.jsx)(t.p,{children:`Передавайте количество загруженных строк, а не virtual total с loader row, group headers или estimated backend count.`}),`
|
|
45
|
+
`,(0,c.jsx)(t.h2,{id:`точный-trigger`,children:`Точный trigger`}),`
|
|
46
|
+
`,(0,c.jsx)(t.p,{children:`Fetch не запускается, если:`}),`
|
|
47
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
48
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`virtualItems`}),` пуст;`]}),`
|
|
49
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`currentItemsCount`}),` равен `,(0,c.jsx)(t.code,{children:`0`}),`;`]}),`
|
|
50
|
+
`,(0,c.jsxs)(t.li,{children:[`последняя virtual item ещё не достигла `,(0,c.jsx)(t.code,{children:`currentItemsCount - 1`}),`;`]}),`
|
|
51
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`hasNextPage === false`}),`;`]}),`
|
|
52
|
+
`,(0,c.jsx)(t.li,{children:`предыдущий вызов ещё не завершился.`}),`
|
|
53
|
+
`]}),`
|
|
54
|
+
`,(0,c.jsx)(t.p,{children:`Trigger происходит строго на последнем загруженном индексе. Preload threshold «за N строк до конца» в API отсутствует.`}),`
|
|
55
|
+
`,(0,c.jsx)(t.h2,{id:`защита-от-параллельного-fetch`,children:`Защита от параллельного fetch`}),`
|
|
56
|
+
`,(0,c.jsxs)(t.p,{children:[`Внутренний `,(0,c.jsx)(t.code,{children:`useRef(false)`}),` устанавливается до вызова и сбрасывается в `,(0,c.jsx)(t.code,{children:`.finally()`}),`:`]}),`
|
|
57
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`idle ── trigger ──► fetchingRef=true
|
|
58
|
+
│
|
|
59
|
+
Promise pending
|
|
60
|
+
│
|
|
61
|
+
resolve или reject
|
|
62
|
+
▼
|
|
63
|
+
fetchingRef=false
|
|
64
|
+
`})}),`
|
|
65
|
+
`,(0,c.jsx)(t.p,{children:`Защита действует только внутри одного mounted hook instance. TanStack Query также должен владеть дедупликацией/network state.`}),`
|
|
66
|
+
`,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`fetchNextPage`}),` отклоняет Promise, hook не добавляет `,(0,c.jsx)(t.code,{children:`.catch`}),`; rejection может стать unhandled. Передавайте функцию с принятой error policy или wrapper, который корректно обрабатывает ожидаемую ошибку.`]}),`
|
|
67
|
+
`,(0,c.jsx)(t.h2,{id:`referential-stability`,children:`Referential stability`}),`
|
|
68
|
+
`,(0,c.jsxs)(t.p,{children:[`Effect зависит от `,(0,c.jsx)(t.code,{children:`virtualItems`}),`, `,(0,c.jsx)(t.code,{children:`currentItemsCount`}),`, `,(0,c.jsx)(t.code,{children:`hasNextPage`}),`, `,(0,c.jsx)(t.code,{children:`fetchNextPage`}),`.`]}),`
|
|
69
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
70
|
+
`,(0,c.jsx)(t.li,{children:`Используйте значение virtualizer как предусмотрено его API.`}),`
|
|
71
|
+
`,(0,c.jsx)(t.li,{children:`Не создавайте лишний async callback с новой identity без причины.`}),`
|
|
72
|
+
`,(0,c.jsx)(t.li,{children:`React Compiler не отменяет необходимость stable external contract.`}),`
|
|
73
|
+
`,(0,c.jsxs)(t.li,{children:[`После увеличения `,(0,c.jsx)(t.code,{children:`currentItemsCount`}),` новый fetch произойдёт только когда virtual range достигнет нового конца.`]}),`
|
|
74
|
+
`]}),`
|
|
75
|
+
`,(0,c.jsx)(t.h2,{id:`browser-ssr-и-lifecycle`,children:`Browser, SSR и lifecycle`}),`
|
|
76
|
+
`,(0,c.jsxs)(t.p,{children:[`Сам hook не читает `,(0,c.jsx)(t.code,{children:`window`}),`, но является React effect и не выполняет fetch во время server render. В browser effect запускается после commit.`]}),`
|
|
77
|
+
`,(0,c.jsxs)(t.p,{children:[`При unmount Promise не отменяется. Abort/cancel должен быть реализован query/transport owner. `,(0,c.jsx)(t.code,{children:`fetchingRef`}),` больше не влияет после удаления hook instance.`]}),`
|
|
78
|
+
`,(0,c.jsx)(t.h2,{id:`типичные-ошибки`,children:`Типичные ошибки`}),`
|
|
79
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
80
|
+
`,(0,c.jsx)(t.li,{children:`Передать total backend rows вместо количества загруженного массива.`}),`
|
|
81
|
+
`,(0,c.jsx)(t.li,{children:`Включить client-side sorting/filtering одной страницы при server-side модели.`}),`
|
|
82
|
+
`,(0,c.jsxs)(t.li,{children:[`Добавить фиктивный loader row в `,(0,c.jsx)(t.code,{children:`currentItemsCount`}),`.`]}),`
|
|
83
|
+
`,(0,c.jsx)(t.li,{children:`Ожидать preload заранее — trigger находится на самом конце.`}),`
|
|
84
|
+
`,(0,c.jsx)(t.li,{children:`Передать rejecting Promise без error handling.`}),`
|
|
85
|
+
`,(0,c.jsx)(t.li,{children:`Выполнять fetch прямо в row render вместо effect.`}),`
|
|
86
|
+
`,(0,c.jsx)(t.li,{children:`Использовать изменяемый index как domain identity строки.`}),`
|
|
87
|
+
`]}),`
|
|
88
|
+
`,(0,c.jsx)(t.h2,{id:`api`,children:`API`}),`
|
|
89
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function useFetchNextPageEffect(args: {
|
|
90
|
+
virtualItems: VirtualItem[];
|
|
91
|
+
currentItemsCount: number;
|
|
92
|
+
hasNextPage: boolean;
|
|
93
|
+
fetchNextPage: () => Promise<unknown>;
|
|
94
|
+
}): void;
|
|
95
|
+
`})})]})}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};
|
|
@@ -0,0 +1,90 @@
|
|
|
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`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,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/HTTP/Headers and Text Response`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`http-headers-и-текстовые-ответы-через-ryuzaki13react-foundation-libhttp`,children:[`HTTP headers и текстовые ответы через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/http`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль создаёт стандартный набор HTTP-заголовков запрета кеширования и обычный `,(0,c.jsx)(t.code,{children:`Response`}),` с UTF-8 plain text.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
5
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
6
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B`,children:`Назначение и границы`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Установка и импорт`})}),`
|
|
8
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#createnostoreheaders`,children:(0,c.jsx)(t.code,{children:`createNoStoreHeaders`})})}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#createtexthttpresponse`,children:(0,c.jsx)(t.code,{children:`createTextHttpResponse`})})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#runtime-%D0%B8-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C`,children:`Runtime и безопасность`})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#api`,children:`API`})}),`
|
|
12
|
+
`]}),`
|
|
13
|
+
`,(0,c.jsx)(t.h2,{id:`назначение-и-границы`,children:`Назначение и границы`}),`
|
|
14
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`HeadersInit + text + status
|
|
15
|
+
│
|
|
16
|
+
▼
|
|
17
|
+
Headers с no-store + Response(text/plain; charset=UTF-8)
|
|
18
|
+
`})}),`
|
|
19
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль не выполняет `,(0,c.jsx)(t.code,{children:`fetch`}),`, не сериализует JSON, не задаёт CORS, CSP, cookies или authorization и не превращает ошибки transport в response автоматически.`]}),`
|
|
20
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
21
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { createNoStoreHeaders, createTextHttpResponse } from "@ryuzaki13/react-foundation-lib/http";
|
|
22
|
+
|
|
23
|
+
import type { NoStoreHeadersInit, TextHttpResponseOptions } from "@ryuzaki13/react-foundation-lib/http";
|
|
24
|
+
`})}),`
|
|
25
|
+
`,(0,c.jsxs)(t.p,{children:[`Нужны стандартные Web API `,(0,c.jsx)(t.code,{children:`Headers`}),` и `,(0,c.jsx)(t.code,{children:`Response`}),`. Они есть в браузерах, Service Worker и современных server runtimes, но могут отсутствовать в старом Node.js без polyfill.`]}),`
|
|
26
|
+
`,(0,c.jsx)(t.h2,{id:`createnostoreheaders`,children:(0,c.jsx)(t.code,{children:`createNoStoreHeaders`})}),`
|
|
27
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const headers = createNoStoreHeaders({
|
|
28
|
+
"X-Request-Id": "request-1"
|
|
29
|
+
});
|
|
30
|
+
`})}),`
|
|
31
|
+
`,(0,c.jsxs)(t.p,{children:[`Функция создаёт новый `,(0,c.jsx)(t.code,{children:`Headers`}),` и устанавливает:`]}),`
|
|
32
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate
|
|
33
|
+
Pragma: no-cache
|
|
34
|
+
Expires: 0
|
|
35
|
+
`})}),`
|
|
36
|
+
`,(0,c.jsxs)(t.p,{children:[`Поддерживаются все стандартные формы `,(0,c.jsx)(t.code,{children:`HeadersInit`}),`:`]}),`
|
|
37
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createNoStoreHeaders();
|
|
38
|
+
createNoStoreHeaders(new Headers({ "X-Test": "1" }));
|
|
39
|
+
createNoStoreHeaders({ "X-Test": "1" });
|
|
40
|
+
createNoStoreHeaders([["X-Test", "1"]]);
|
|
41
|
+
`})}),`
|
|
42
|
+
`,(0,c.jsxs)(t.p,{children:[`Исходный `,(0,c.jsx)(t.code,{children:`Headers`}),` не изменяется: constructor создаёт новую коллекцию.`]}),`
|
|
43
|
+
`,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`init`}),` уже содержит `,(0,c.jsx)(t.code,{children:`Cache-Control`}),`, `,(0,c.jsx)(t.code,{children:`Pragma`}),` или `,(0,c.jsx)(t.code,{children:`Expires`}),`, библиотечное значение перезаписывает его.`]}),`
|
|
44
|
+
`,(0,c.jsxs)(t.blockquote,{children:[`
|
|
45
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`no-store`}),` — инструкция кешам, а не гарантия уничтожения уже сохранённых данных. Не помещайте секреты в response только потому, что добавлены эти headers.`]}),`
|
|
46
|
+
`]}),`
|
|
47
|
+
`,(0,c.jsx)(t.h2,{id:`createtexthttpresponse`,children:(0,c.jsx)(t.code,{children:`createTextHttpResponse`})}),`
|
|
48
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const response = createTextHttpResponse({
|
|
49
|
+
status: 400,
|
|
50
|
+
text: "Некорректный запрос",
|
|
51
|
+
headers: {
|
|
52
|
+
"X-Request-Id": "request-1"
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
`})}),`
|
|
56
|
+
`,(0,c.jsx)(t.p,{children:`Результат:`}),`
|
|
57
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
58
|
+
`,(0,c.jsxs)(t.li,{children:[`обычный экземпляр `,(0,c.jsx)(t.code,{children:`Response`}),`;`]}),`
|
|
59
|
+
`,(0,c.jsx)(t.li,{children:`переданный HTTP status;`}),`
|
|
60
|
+
`,(0,c.jsx)(t.li,{children:`body с исходной строкой;`}),`
|
|
61
|
+
`,(0,c.jsx)(t.li,{children:`no-store headers;`}),`
|
|
62
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Content-Type: text/plain; charset=UTF-8`}),`.`]}),`
|
|
63
|
+
`]}),`
|
|
64
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`console.log(response.status); // 400.
|
|
65
|
+
console.log(await response.text()); // "Некорректный запрос".
|
|
66
|
+
console.log(response.headers.get("Content-Type"));
|
|
67
|
+
// "text/plain; charset=UTF-8".
|
|
68
|
+
`})}),`
|
|
69
|
+
`,(0,c.jsxs)(t.p,{children:[`Переданный `,(0,c.jsx)(t.code,{children:`Content-Type`}),` перезаписывается. Для JSON, HTML, XML, file stream или redirect создайте специализированный response соответствующего владельца.`]}),`
|
|
70
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`Response`}),` сам проверяет допустимость status. Например, некорректное значение может привести к исключению конструктора; helper его не перехватывает.`]}),`
|
|
71
|
+
`,(0,c.jsx)(t.h2,{id:`runtime-и-безопасность`,children:`Runtime и безопасность`}),`
|
|
72
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
73
|
+
`,(0,c.jsxs)(t.li,{children:[`Функции синхронны; чтение body через `,(0,c.jsx)(t.code,{children:`response.text()`}),` асинхронно по стандарту Web API.`]}),`
|
|
74
|
+
`,(0,c.jsx)(t.li,{children:`Модуль подходит browser, worker и server runtime с Web Fetch API.`}),`
|
|
75
|
+
`,(0,c.jsx)(t.li,{children:`Текст вставляется как plain text, а не HTML.`}),`
|
|
76
|
+
`,(0,c.jsx)(t.li,{children:`CORS-заголовки не добавляются.`}),`
|
|
77
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Cache-Control`}),` не заменяет authorization и redaction.`]}),`
|
|
78
|
+
`,(0,c.jsx)(t.li,{children:`Не возвращайте пользователю stack trace, tokens или внутренний transport payload.`}),`
|
|
79
|
+
`,(0,c.jsx)(t.li,{children:`В Service Worker учитывайте общую cache policy: no-store response не должен вручную помещаться в Cache Storage.`}),`
|
|
80
|
+
`]}),`
|
|
81
|
+
`,(0,c.jsx)(t.h2,{id:`api`,children:`API`}),`
|
|
82
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type NoStoreHeadersInit = HeadersInit | undefined;
|
|
83
|
+
|
|
84
|
+
type TextHttpResponseOptions = {
|
|
85
|
+
readonly status: number;
|
|
86
|
+
readonly text: string;
|
|
87
|
+
readonly headers?: HeadersInit;
|
|
88
|
+
};
|
|
89
|
+
`})}),`
|
|
90
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(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:`createNoStoreHeaders`})}),(0,c.jsxs)(t.td,{children:[`Новый `,(0,c.jsx)(t.code,{children:`Headers`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createTextHttpResponse`})}),(0,c.jsxs)(t.td,{children:[`Новый `,(0,c.jsx)(t.code,{children:`Response`})]})]})]})]})]})}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};
|
|
@@ -0,0 +1,186 @@
|
|
|
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/Data/Bounded Copy Stack`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`ограниченный-стек-копий-через-ryuzaki13react-foundation-libbounded-copy-stack`,children:[`Ограниченный стек копий через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/bounded-copy-stack`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль хранит небольшой список последних скопированных сущностей. Новый элемент помещается в начало, повтор по `,(0,c.jsx)(t.code,{children:`fingerprint`}),` обновляет существующую запись, а старые записи удаляются при превышении лимита.`]}),`
|
|
4
|
+
`,(0,c.jsxs)(t.p,{children:[`Документ рассчитан на разработчика без доступа к исходникам пакета. Ниже объясняются структура элемента, различие `,(0,c.jsx)(t.code,{children:`id`}),` и `,(0,c.jsx)(t.code,{children:`fingerprint`}),`, порядок записей, ссылки на payload и все граничные случаи.`]}),`
|
|
5
|
+
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
6
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
7
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B`,children:`Назначение и границы`})}),`
|
|
8
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Установка и импорт`})}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D1%8F`,children:`Основные понятия`})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82`,children:`Быстрый старт`})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#pushboundedcopystackitem`,children:(0,c.jsx)(t.code,{children:`pushBoundedCopyStackItem`})})}),`
|
|
12
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#getboundedcopystackcandidates`,children:(0,c.jsx)(t.code,{children:`getBoundedCopyStackCandidates`})})}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F`,children:`Ссылки, хранение и сериализация`})}),`
|
|
14
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-api`,children:`Полный API`})}),`
|
|
15
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%82%D0%B8%D0%BF%D0%B8%D1%87%D0%BD%D1%8B%D0%B5-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8`,children:`Типичные ошибки`})}),`
|
|
16
|
+
`]}),`
|
|
17
|
+
`,(0,c.jsx)(t.h2,{id:`назначение-и-границы`,children:`Назначение и границы`}),`
|
|
18
|
+
`,(0,c.jsx)(t.p,{children:`Типичный сценарий — показать пользователю несколько последних вариантов для повторной вставки:`}),`
|
|
19
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`копирование A ──► [A]
|
|
20
|
+
копирование B ──► [B, A]
|
|
21
|
+
повтор A ──► [новая A, B]
|
|
22
|
+
копирование C ──► [C, новая A, B]
|
|
23
|
+
копирование D ──► [D, C, новая A] при maxSize = 3
|
|
24
|
+
`})}),`
|
|
25
|
+
`,(0,c.jsx)(t.p,{children:`Модуль:`}),`
|
|
26
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
27
|
+
`,(0,c.jsx)(t.li,{children:`не использует системный clipboard;`}),`
|
|
28
|
+
`,(0,c.jsx)(t.li,{children:`не сохраняет список в storage;`}),`
|
|
29
|
+
`,(0,c.jsx)(t.li,{children:`не создаёт React state или Zustand store;`}),`
|
|
30
|
+
`,(0,c.jsxs)(t.li,{children:[`не клонирует `,(0,c.jsx)(t.code,{children:`payload`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),`;`]}),`
|
|
31
|
+
`,(0,c.jsx)(t.li,{children:`не сравнивает payload глубоко;`}),`
|
|
32
|
+
`,(0,c.jsx)(t.li,{children:`не нормализует данные;`}),`
|
|
33
|
+
`,(0,c.jsx)(t.li,{children:`не выполняет вставку выбранного кандидата.`}),`
|
|
34
|
+
`]}),`
|
|
35
|
+
`,(0,c.jsxs)(t.p,{children:[`Clipboard helpers находятся в `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/copy`}),`. Владелец state/storage находится в host-приложении.`]}),`
|
|
36
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
37
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib
|
|
38
|
+
`})}),`
|
|
39
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
40
|
+
DEFAULT_BOUNDED_COPY_STACK_SIZE,
|
|
41
|
+
getBoundedCopyStackCandidates,
|
|
42
|
+
pushBoundedCopyStackItem
|
|
43
|
+
} from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
|
|
44
|
+
|
|
45
|
+
import type {
|
|
46
|
+
BoundedCopyStackItem,
|
|
47
|
+
BoundedCopyStackOptions,
|
|
48
|
+
BoundedCopyStackPushInput,
|
|
49
|
+
BoundedCopyStackPushResult
|
|
50
|
+
} from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
|
|
51
|
+
`})}),`
|
|
52
|
+
`,(0,c.jsx)(t.p,{children:`Корневой и глубокий импорты не поддерживаются. Модуль ESM, не зависит от React и browser APIs.`}),`
|
|
53
|
+
`,(0,c.jsx)(t.h2,{id:`основные-понятия`,children:`Основные понятия`}),`
|
|
54
|
+
`,(0,c.jsx)(t.h3,{id:`элемент-стека`,children:`Элемент стека`}),`
|
|
55
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type BoundedCopyStackItem<TPayload, TMeta = undefined> = {
|
|
56
|
+
id: string;
|
|
57
|
+
fingerprint: string;
|
|
58
|
+
payload: TPayload;
|
|
59
|
+
meta: TMeta;
|
|
60
|
+
copiedAt: number;
|
|
61
|
+
};
|
|
62
|
+
`})}),`
|
|
63
|
+
`,(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:`id`})}),(0,c.jsx)(t.td,{children:`Идентификатор конкретной записи/операции копирования`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fingerprint`})}),(0,c.jsx)(t.td,{children:`Идентичность содержимого для удаления повторов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`payload`})}),(0,c.jsx)(t.td,{children:`Данные, которые host затем сможет вставить`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`meta`})}),(0,c.jsx)(t.td,{children:`Подпись, тип, источник или другая информация для UI`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`copiedAt`})}),(0,c.jsx)(t.td,{children:`Время копирования в миллисекундах Unix; функция не сортирует по этому полю`})]})]})]}),`
|
|
64
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`id`}),` и `,(0,c.jsx)(t.code,{children:`fingerprint`}),` решают разные задачи. При повторном копировании содержимого `,(0,c.jsx)(t.code,{children:`fingerprint`}),` остаётся прежним, а `,(0,c.jsx)(t.code,{children:`id`}),`, `,(0,c.jsx)(t.code,{children:`payload`}),`, `,(0,c.jsx)(t.code,{children:`meta`}),` и `,(0,c.jsx)(t.code,{children:`copiedAt`}),` могут стать новыми.`]}),`
|
|
65
|
+
`,(0,c.jsx)(t.h3,{id:`порядок`,children:`Порядок`}),`
|
|
66
|
+
`,(0,c.jsxs)(t.p,{children:[`Индекс `,(0,c.jsx)(t.code,{children:`0`}),` всегда содержит элемент последней операции `,(0,c.jsx)(t.code,{children:`push`}),`. Функция доверяет входному порядку и не сортирует список по `,(0,c.jsx)(t.code,{children:`copiedAt`}),`.`]}),`
|
|
67
|
+
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
68
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ColumnCopy = {
|
|
69
|
+
columnId: string;
|
|
70
|
+
width: number;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
type ColumnCopyMeta = {
|
|
74
|
+
label: string;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
let stack: BoundedCopyStackItem<ColumnCopy, ColumnCopyMeta>[] = [];
|
|
78
|
+
|
|
79
|
+
const result = pushBoundedCopyStackItem(stack, {
|
|
80
|
+
id: crypto.randomUUID(),
|
|
81
|
+
fingerprint: "column:amount:width:120",
|
|
82
|
+
payload: { columnId: "amount", width: 120 },
|
|
83
|
+
meta: { label: "Сумма — ширина 120" }
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
stack = result.items;
|
|
87
|
+
console.log(result.updatedExisting); // false.
|
|
88
|
+
console.log(result.addedItem.copiedAt); // Date.now() на момент вызова.
|
|
89
|
+
`})}),`
|
|
90
|
+
`,(0,c.jsx)(t.h2,{id:`pushboundedcopystackitem`,children:(0,c.jsx)(t.code,{children:`pushBoundedCopyStackItem`})}),`
|
|
91
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = pushBoundedCopyStackItem(items, input, { maxSize: 3 });
|
|
92
|
+
`})}),`
|
|
93
|
+
`,(0,c.jsx)(t.p,{children:`Алгоритм:`}),`
|
|
94
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
95
|
+
`,(0,c.jsxs)(t.li,{children:[`Создаёт новый элемент из `,(0,c.jsx)(t.code,{children:`input`}),`.`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.li,{children:[`Если `,(0,c.jsx)(t.code,{children:`copiedAt`}),` отсутствует, подставляет `,(0,c.jsx)(t.code,{children:`Date.now()`}),`.`]}),`
|
|
97
|
+
`,(0,c.jsxs)(t.li,{children:[`Ищет любой элемент с точно равным `,(0,c.jsx)(t.code,{children:`fingerprint`}),`.`]}),`
|
|
98
|
+
`,(0,c.jsx)(t.li,{children:`Удаляет из старого списка все элементы с таким fingerprint.`}),`
|
|
99
|
+
`,(0,c.jsx)(t.li,{children:`Помещает новый элемент в начало.`}),`
|
|
100
|
+
`,(0,c.jsxs)(t.li,{children:[`Обрезает результат до `,(0,c.jsx)(t.code,{children:`maxSize`}),`.`]}),`
|
|
101
|
+
`]}),`
|
|
102
|
+
`,(0,c.jsx)(t.p,{children:`Входной массив не изменяется. Возвращается новый массив.`}),`
|
|
103
|
+
`,(0,c.jsx)(t.h3,{id:`повторный-fingerprint`,children:`Повторный fingerprint`}),`
|
|
104
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const oldItems = [
|
|
105
|
+
{
|
|
106
|
+
id: "old",
|
|
107
|
+
fingerprint: "same-content",
|
|
108
|
+
payload: { value: 1 },
|
|
109
|
+
meta: undefined,
|
|
110
|
+
copiedAt: 1
|
|
111
|
+
}
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
const result = pushBoundedCopyStackItem(oldItems, {
|
|
115
|
+
id: "new",
|
|
116
|
+
fingerprint: "same-content",
|
|
117
|
+
payload: { value: 2 },
|
|
118
|
+
meta: undefined,
|
|
119
|
+
copiedAt: 2
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
console.log(result.items.length); // 1.
|
|
123
|
+
console.log(result.items[0].id); // "new".
|
|
124
|
+
console.log(result.updatedExisting); // true.
|
|
125
|
+
`})}),`
|
|
126
|
+
`,(0,c.jsxs)(t.p,{children:[`Сравнение fingerprint регистрозависимое и использует `,(0,c.jsx)(t.code,{children:`===`}),`. Строки `,(0,c.jsx)(t.code,{children:`"A"`}),` и `,(0,c.jsx)(t.code,{children:`"a"`}),` различны.`]}),`
|
|
127
|
+
`,(0,c.jsxs)(t.h3,{id:`нормализация-maxsize`,children:[`Нормализация `,(0,c.jsx)(t.code,{children:`maxSize`})]}),`
|
|
128
|
+
`,(0,c.jsxs)(t.p,{children:[`Default `,(0,c.jsx)(t.code,{children:`DEFAULT_BOUNDED_COPY_STACK_SIZE`}),` равен `,(0,c.jsx)(t.code,{children:`3`}),`.`]}),`
|
|
129
|
+
`,(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,{style:{textAlign:`right`},children:`Фактический лимит`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`undefined`}),`, `,(0,c.jsx)(t.code,{children:`NaN`}),`, `,(0,c.jsx)(t.code,{children:`Infinity`})]}),(0,c.jsx)(t.td,{style:{textAlign:`right`},children:`3`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`5.9`})}),(0,c.jsx)(t.td,{style:{textAlign:`right`},children:`5`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`1`})}),(0,c.jsx)(t.td,{style:{textAlign:`right`},children:`1`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`0`}),`, отрицательное конечное значение`]}),(0,c.jsx)(t.td,{style:{textAlign:`right`},children:`1`})]})]})]}),`
|
|
130
|
+
`,(0,c.jsxs)(t.p,{children:[`Полностью отключить хранение через `,(0,c.jsx)(t.code,{children:`maxSize: 0`}),` нельзя. Если список не нужен, host должен не вызывать push или хранить пустой state самостоятельно.`]}),`
|
|
131
|
+
`,(0,c.jsx)(t.h3,{id:`результат`,children:`Результат`}),`
|
|
132
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type BoundedCopyStackPushResult<TPayload, TMeta> = {
|
|
133
|
+
items: BoundedCopyStackItem<TPayload, TMeta>[];
|
|
134
|
+
addedItem: BoundedCopyStackItem<TPayload, TMeta>;
|
|
135
|
+
updatedExisting: boolean;
|
|
136
|
+
};
|
|
137
|
+
`})}),`
|
|
138
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
139
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`items`}),` — итоговый ограниченный список;`]}),`
|
|
140
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`addedItem`}),` — созданная запись, даже если из-за будущей логики host её не сохранит;`]}),`
|
|
141
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`updatedExisting`}),` — был ли во входном списке такой fingerprint.`]}),`
|
|
142
|
+
`]}),`
|
|
143
|
+
`,(0,c.jsx)(t.h2,{id:`getboundedcopystackcandidates`,children:(0,c.jsx)(t.code,{children:`getBoundedCopyStackCandidates`})}),`
|
|
144
|
+
`,(0,c.jsx)(t.p,{children:`Функция фильтрует записи предикатом и сохраняет исходный порядок:`}),`
|
|
145
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const tableCandidates = getBoundedCopyStackCandidates(stack, (item) => item.meta.kind === "table-column");
|
|
146
|
+
`})}),`
|
|
147
|
+
`,(0,c.jsxs)(t.p,{children:[`Она эквивалентна типизированному `,(0,c.jsx)(t.code,{children:`items.filter(predicate)`}),`:`]}),`
|
|
148
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
149
|
+
`,(0,c.jsx)(t.li,{children:`возвращает новый массив;`}),`
|
|
150
|
+
`,(0,c.jsx)(t.li,{children:`не клонирует элементы;`}),`
|
|
151
|
+
`,(0,c.jsx)(t.li,{children:`не изменяет исходный массив;`}),`
|
|
152
|
+
`,(0,c.jsx)(t.li,{children:`не ограничивает количество дополнительно;`}),`
|
|
153
|
+
`,(0,c.jsx)(t.li,{children:`исключение из predicate пробрасывается вызывающему коду.`}),`
|
|
154
|
+
`]}),`
|
|
155
|
+
`,(0,c.jsx)(t.h2,{id:`ссылки-хранение-и-сериализация`,children:`Ссылки, хранение и сериализация`}),`
|
|
156
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`payload`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),` переносятся по ссылке:`]}),`
|
|
157
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const payload = { nested: { value: 1 } };
|
|
158
|
+
const result = pushBoundedCopyStackItem([], {
|
|
159
|
+
id: "1",
|
|
160
|
+
fingerprint: "one",
|
|
161
|
+
payload,
|
|
162
|
+
meta: undefined
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
console.log(result.addedItem.payload === payload); // true.
|
|
166
|
+
`})}),`
|
|
167
|
+
`,(0,c.jsxs)(t.p,{children:[`Если нужна независимая data-only копия, создайте её через `,(0,c.jsx)(t.code,{children:`deepCopyWithoutFunctions`}),` из `,(0,c.jsx)(t.code,{children:`/utils`}),` до push. Clone не должен нормализовать данные.`]}),`
|
|
168
|
+
`,(0,c.jsxs)(t.p,{children:[`Для `,(0,c.jsx)(t.code,{children:`localStorage`}),`/`,(0,c.jsx)(t.code,{children:`sessionStorage`}),` host самостоятельно отвечает за:`]}),`
|
|
169
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
170
|
+
`,(0,c.jsx)(t.li,{children:`JSON-compatible payload/meta;`}),`
|
|
171
|
+
`,(0,c.jsx)(t.li,{children:`версию persisted schema;`}),`
|
|
172
|
+
`,(0,c.jsx)(t.li,{children:`runtime-проверку восстановленных данных;`}),`
|
|
173
|
+
`,(0,c.jsx)(t.li,{children:`удаление устаревших записей;`}),`
|
|
174
|
+
`,(0,c.jsx)(t.li,{children:`отсутствие секретов и персональных данных.`}),`
|
|
175
|
+
`]}),`
|
|
176
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
177
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(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:`DEFAULT_BOUNDED_COPY_STACK_SIZE`})}),(0,c.jsxs)(t.td,{children:[`Default-лимит `,(0,c.jsx)(t.code,{children:`3`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`pushBoundedCopyStackItem`})}),(0,c.jsx)(t.td,{children:`Добавляет/обновляет запись и ограничивает список`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getBoundedCopyStackCandidates`})}),(0,c.jsx)(t.td,{children:`Фильтрует кандидатов`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`BoundedCopyStackItem`})}),(0,c.jsx)(t.td,{children:`Полная сохранённая запись`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`BoundedCopyStackPushInput`})}),(0,c.jsxs)(t.td,{children:[`Вход push; `,(0,c.jsx)(t.code,{children:`copiedAt`}),` optional`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`BoundedCopyStackOptions`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`{ maxSize?: number }`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`BoundedCopyStackPushResult`})}),(0,c.jsx)(t.td,{children:`Итоговый список и сведения об операции`})]})]})]}),`
|
|
178
|
+
`,(0,c.jsx)(t.h2,{id:`типичные-ошибки`,children:`Типичные ошибки`}),`
|
|
179
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
180
|
+
`,(0,c.jsxs)(t.li,{children:[`Использовать уникальный `,(0,c.jsx)(t.code,{children:`id`}),` как fingerprint: дубликаты содержимого никогда не объединятся.`]}),`
|
|
181
|
+
`,(0,c.jsxs)(t.li,{children:[`Ожидать сортировку по `,(0,c.jsx)(t.code,{children:`copiedAt`}),`: порядок определяется вызовами push.`]}),`
|
|
182
|
+
`,(0,c.jsxs)(t.li,{children:[`Мутировать `,(0,c.jsx)(t.code,{children:`payload`}),` после push и ожидать snapshot: ссылка общая.`]}),`
|
|
183
|
+
`,(0,c.jsxs)(t.li,{children:[`Передавать `,(0,c.jsx)(t.code,{children:`maxSize: 0`}),` для отключения: получится лимит `,(0,c.jsx)(t.code,{children:`1`}),`.`]}),`
|
|
184
|
+
`,(0,c.jsx)(t.li,{children:`Хранить callback/DOM node в persisted stack: модуль не делает данные сериализуемыми.`}),`
|
|
185
|
+
`,(0,c.jsx)(t.li,{children:`Вызывать helper вместо clipboard API: стек ничего не копирует в ОС.`}),`
|
|
186
|
+
`]})]})}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};
|
|
@@ -0,0 +1,64 @@
|
|
|
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`,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/Errors/Missing Context`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`ошибка-отсутствующего-react-context-через-ryuzaki13react-foundation-liberror`,children:[`Ошибка отсутствующего React context через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error`})]}),`
|
|
3
|
+
`,(0,c.jsx)(t.p,{children:`Модуль создаёт единообразное диагностическое сообщение, когда custom hook вызван вне нужного Provider.`}),`
|
|
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 { createMissingContextError, createMissingContextErrorMessage } from "@ryuzaki13/react-foundation-lib/error";
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.p,{children:`Модуль не импортирует React и может использоваться в любом TypeScript runtime. Типы объектов options выводятся из аргумента и отдельно не экспортируются.`}),`
|
|
8
|
+
`,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
|
|
9
|
+
`,(0,c.jsx)(t.p,{children:`Обычная схема context hook:`}),`
|
|
10
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const DemoContext = createContext<DemoValue | null>(null);
|
|
11
|
+
|
|
12
|
+
export function useDemo() {
|
|
13
|
+
const value = useContext(DemoContext);
|
|
14
|
+
|
|
15
|
+
if (value === null) {
|
|
16
|
+
throw createMissingContextError({
|
|
17
|
+
hookName: "useDemo",
|
|
18
|
+
providerName: "DemoProvider",
|
|
19
|
+
contextName: "DemoContext"
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
`})}),`
|
|
26
|
+
`,(0,c.jsx)(t.p,{children:`Ошибка должна выбрасываться при нарушении обязательного structural contract. Если отсутствие Provider является допустимым состоянием, возвращайте optional result по собственному явно названному API.`}),`
|
|
27
|
+
`,(0,c.jsx)(t.h2,{id:`createmissingcontexterrormessage`,children:(0,c.jsx)(t.code,{children:`createMissingContextErrorMessage`})}),`
|
|
28
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const message = createMissingContextErrorMessage({
|
|
29
|
+
hookName: "useDemo",
|
|
30
|
+
providerName: "DemoProvider",
|
|
31
|
+
contextName: "DemoContext"
|
|
32
|
+
});
|
|
33
|
+
`})}),`
|
|
34
|
+
`,(0,c.jsx)(t.p,{children:`Результат состоит из трёх предложений:`}),`
|
|
35
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
36
|
+
`,(0,c.jsx)(t.li,{children:`Где разрешено использовать hook.`}),`
|
|
37
|
+
`,(0,c.jsxs)(t.li,{children:[`Какой context оказался `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
|
|
38
|
+
`,(0,c.jsx)(t.li,{children:`Что Provider должен находиться выше вызывающего компонента.`}),`
|
|
39
|
+
`]}),`
|
|
40
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`contextName`}),` optional. Без него сообщение остаётся корректным, но менее конкретным.`]}),`
|
|
41
|
+
`,(0,c.jsx)(t.p,{children:`Поля вставляются буквально: функция не добавляет backticks, не проверяет имена и не локализует их.`}),`
|
|
42
|
+
`,(0,c.jsx)(t.h2,{id:`createmissingcontexterror`,children:(0,c.jsx)(t.code,{children:`createMissingContextError`})}),`
|
|
43
|
+
`,(0,c.jsxs)(t.p,{children:[`Возвращает обычный `,(0,c.jsx)(t.code,{children:`Error`}),` с тем же сообщением:`]}),`
|
|
44
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const error = createMissingContextError({
|
|
45
|
+
hookName: "useDemo",
|
|
46
|
+
providerName: "DemoProvider"
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
console.log(error.name); // "Error".
|
|
50
|
+
console.log(error.message); // Подробное русское сообщение.
|
|
51
|
+
`})}),`
|
|
52
|
+
`,(0,c.jsxs)(t.p,{children:[`Функция сама не делает `,(0,c.jsx)(t.code,{children:`throw`}),`:`]}),`
|
|
53
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`throw createMissingContextError(options);
|
|
54
|
+
`})}),`
|
|
55
|
+
`,(0,c.jsxs)(t.p,{children:[`Stack trace создаётся стандартным конструктором `,(0,c.jsx)(t.code,{children:`Error`}),` в месте вызова.`]}),`
|
|
56
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
57
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(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:`createMissingContextErrorMessage`})}),(0,c.jsx)(t.td,{children:`Возвращает только строку`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createMissingContextError`})}),(0,c.jsxs)(t.td,{children:[`Возвращает экземпляр `,(0,c.jsx)(t.code,{children:`Error`})]})]})]})]}),`
|
|
58
|
+
`,(0,c.jsx)(t.h2,{id:`типичные-ошибки`,children:`Типичные ошибки`}),`
|
|
59
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
60
|
+
`,(0,c.jsx)(t.li,{children:`Возвращать fallback-object после ошибки и скрывать неправильное дерево Provider.`}),`
|
|
61
|
+
`,(0,c.jsxs)(t.li,{children:[`Выбрасывать ошибку прямо в Provider вместо hook, который обнаружил `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
|
|
62
|
+
`,(0,c.jsx)(t.li,{children:`Передавать пустые имена: helper не валидирует строки.`}),`
|
|
63
|
+
`,(0,c.jsx)(t.li,{children:`Использовать этот модуль для сетевых/validation ошибок: он предназначен только для missing context contract.`}),`
|
|
64
|
+
`]})]})}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};
|