@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.12
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-CveIo2LZ.js} +1 -1
- package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-Bd8M64xJ.js} +1 -1
- package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-xT41a0VL.js} +1 -1
- package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-C5bBSb3k.js} +1 -1
- package/storybook-static/assets/{Button-CrTHXWYk.js → Button-DkDgfpHL.js} +1 -1
- package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-CeKPeGK5.js} +1 -1
- package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-CEqcrblx.js} +1 -1
- package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-DKeFkdOt.js} +1 -1
- package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-OVvAarW-.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-CfZ0p1yo.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-BWW7zrfs.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-kia7is1N.js} +1 -1
- package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-xn2GtiLR.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-CYuy9uXF.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-C4w-APws.js} +1 -1
- package/storybook-static/assets/DateInput-BiUFIihm.js +1 -0
- package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DAzE5mCE.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-BcowGCRD.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-CQm4dNLR.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-RIyqNBk9.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ypGyuGfy.js} +1 -1
- package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CEypL2Nh.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-DNkT7B-u.js} +1 -1
- package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-BVFFQJDH.js} +1 -1
- package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DD0grLG3.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-DSCypHqR.js} +1 -1
- package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-DauUgrev.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-B1qB8vQZ.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-D9oCCeHf.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-CmSf6tXp.js} +1 -1
- package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-D42ueN1w.js} +1 -1
- package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-D8hbPCAv.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-DO-T_Bh4.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-CknJDoji.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-Dqi_bo3c.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-BD9QZGZN.js} +1 -1
- package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CaVn1IOP.js} +1 -1
- package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-Bp9Y6q6b.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-U7tx-Jlw.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-pmmhsAbN.js} +1 -1
- package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-CEpMNurH.js} +1 -1
- package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-BM-gO5DN.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-BWz5XU6U.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-BTYZEX5t.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-Dz2STM95.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DBVe0an3.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories-C4Px97lD.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-TJtlJVfa.js} +1 -1
- package/storybook-static/assets/{Input-op4j7Beh.js → Input-CIPgijvW.js} +1 -1
- package/storybook-static/assets/{Input-BUDNR96c.js → Input-D8io9jVS.js} +1 -1
- package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-SUk3aYaC.js} +1 -1
- package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-DA5pIDuE.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-DeudzDSU.js} +1 -1
- package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-C5mp5Y5I.js} +1 -1
- package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-CGAC7ruP.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-Cx1xQ6PE.js} +1 -1
- package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-B7OBcPJN.js} +1 -1
- package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-Hzl89Ghf.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-CG6QjDZH.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-B6htWHF1.js} +1 -1
- package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-BTa4S4Wp.js} +1 -1
- package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-CQnoblAE.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-CEI44Eyz.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-B0ypWz1x.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-BadApta9.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-COB9GlV_.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-C_Uz7Tnj.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories-Btp0IcaL.js} +1 -1
- package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-AAaZGSAl.js} +1 -1
- package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-CyfuZw7w.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-NDKQmjyQ.js} +1 -1
- package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-BJDnJ4zv.js} +1 -1
- package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-D_X5lTLO.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-ShDjozpW.js} +1 -1
- package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-B5CElQ3-.js} +1 -1
- package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-DqXfrjcH.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-fB3mcFmx.js} +1 -1
- package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-DDb0G7T8.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-CIGL-pKX.js} +1 -1
- package/storybook-static/assets/NotificationsHost.stories-B_MRb3fs.js +29 -0
- package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-DQAitH4N.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-DwW221S9.js} +2 -2
- package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-tiZhOIhE.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-BhaatPjK.js} +2 -2
- package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-B9WqJ-Un.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-CAfKuhfU.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-Cel1phxZ.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-BpBCpBA9.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-BSeGbz02.js} +1 -1
- package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-BBtQ3GdK.js} +1 -1
- package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-B9nZuqqW.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-BGvhR3to.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DA_zjcdA.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-DDP1eXyM.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-BgvzqRBd.js} +1 -1
- package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-BQql18MF.js} +1 -1
- package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-C0NebUMz.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-CIyDUtlz.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-BsgzPwCV.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-htbxc3ni.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-ClHM5Kah.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-Dcx0BOTx.js} +1 -1
- package/storybook-static/assets/README--LCKbep-.js +110 -0
- package/storybook-static/assets/{README-DRnlD7y8.js → README-5M8ajrJp.js} +1 -1
- package/storybook-static/assets/README-5NhzH8VL.js +95 -0
- package/storybook-static/assets/README-Am6Fa6-b.js +69 -0
- package/storybook-static/assets/README-B3bFglqG.js +82 -0
- package/storybook-static/assets/README-B45Cwj2a.js +95 -0
- package/storybook-static/assets/README-B6Nq7NCU.js +416 -0
- package/storybook-static/assets/{README-B4zYJg6u.js → README-B6ltJiw3.js} +1 -1
- package/storybook-static/assets/{README-BdPlV5nA.js → README-BB_JPejH.js} +1 -1
- package/storybook-static/assets/README-BIq-FXcN.js +2124 -0
- package/storybook-static/assets/README-BSh5XUR9.js +110 -0
- package/storybook-static/assets/README-BXJneZAJ.js +147 -0
- package/storybook-static/assets/README-BYSgTTZt.js +296 -0
- package/storybook-static/assets/{README-BzVni2ve.js → README-BmhhWWEk.js} +1 -1
- package/storybook-static/assets/README-Bqnqu1bC.js +118 -0
- package/storybook-static/assets/README-BuMMG4_N.js +192 -0
- package/storybook-static/assets/README-BxjYCoYA.js +186 -0
- package/storybook-static/assets/{README-MzcO5Z_P.js → README-ByALXSEH.js} +1 -1
- package/storybook-static/assets/README-Byo6DxIF.js +101 -0
- package/storybook-static/assets/README-C3UcjOGB.js +208 -0
- package/storybook-static/assets/README-C6BOdXNV.js +322 -0
- package/storybook-static/assets/README-C8E1O7DQ.js +230 -0
- package/storybook-static/assets/README-C9eh0JLs.js +64 -0
- package/storybook-static/assets/README-CAGQnLsv.js +90 -0
- package/storybook-static/assets/README-CC00hlZK.js +527 -0
- package/storybook-static/assets/README-CH_6ZIO2.js +64 -0
- package/storybook-static/assets/README-CHbo4O3Z.js +75 -0
- package/storybook-static/assets/{README-CTIBG4zH.js → README-CIGfHKKE.js} +1 -1
- package/storybook-static/assets/{README-BHw6MVjD.js → README-CM-7E-Jf.js} +1 -1
- package/storybook-static/assets/{README-C0BwTe5N.js → README-CNHemCS2.js} +1 -1
- package/storybook-static/assets/{README-DzTc6XmY.js → README-CWfPiPIB.js} +1 -1
- package/storybook-static/assets/{README-Dx3cpFMr.js → README-CeK4kfFO.js} +1 -1
- package/storybook-static/assets/README-Cj2e6HrF.js +178 -0
- package/storybook-static/assets/README-CsoHGRve.js +1844 -0
- package/storybook-static/assets/README-D9OypaFB.js +208 -0
- package/storybook-static/assets/{README-CkWglKbS.js → README-DDBqoI-T.js} +1 -1
- package/storybook-static/assets/README-DE2wk9-v.js +1282 -0
- package/storybook-static/assets/README-DEj2wSK0.js +264 -0
- package/storybook-static/assets/{README-D-XjRtAE.js → README-DIbfpC-2.js} +1 -1
- package/storybook-static/assets/{README-Dki94Nf2.js → README-DJHVgrpj.js} +1 -1
- package/storybook-static/assets/README-DN9HKtp_.js +124 -0
- package/storybook-static/assets/README-DNricOkt.js +136 -0
- package/storybook-static/assets/README-DV4fCpqN.js +1146 -0
- package/storybook-static/assets/{README-BzVHwvgo.js → README-DjCArsA5.js} +1 -1
- package/storybook-static/assets/README-Dl92E69Z.js +1704 -0
- package/storybook-static/assets/README-DnA-4W65.js +226 -0
- package/storybook-static/assets/README-DoCA4JXf.js +273 -0
- package/storybook-static/assets/{README-DqQDgJN-.js → README-DvAlDsh9.js} +1 -1
- package/storybook-static/assets/README-Ss-3t1nX.js +158 -0
- package/storybook-static/assets/README-eHCINzP3.js +154 -0
- package/storybook-static/assets/README-qHKxXU95.js +98 -0
- package/storybook-static/assets/README-tm9QH9cF.js +103 -0
- package/storybook-static/assets/README-ui-uanyg.js +672 -0
- package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-CWtjclwT.js} +1 -1
- package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-YIQXt0wx.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-Ah-CBpeC.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BnO-GL7A.js} +1 -1
- package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-CUS0etBD.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-DGwCawtU.js} +1 -1
- package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-D85fA6pO.js} +1 -1
- package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-CGCxJjL9.js} +1 -1
- package/storybook-static/assets/{Select-DQMoVjn4.js → Select-gRnfvfGh.js} +1 -1
- package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-CMwt4F9i.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-BLXfKJ38.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-Bca1a9ZU.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-CyeQN0Rd.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-xrmZckzw.js} +1 -1
- package/storybook-static/assets/SingleDateTimeInput.stories-BYFTQM9z.js +48 -0
- package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-1yJ3uVeR.js} +1 -1
- package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-D8GtXVGI.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-CyQ3ns_C.js} +1 -1
- package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BOzHhEUA.js} +1 -1
- package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-ISSx9vH_.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-7ooTghrS.js} +1 -1
- package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CCLiMmfZ.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-B36szI6t.js} +1 -1
- package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-DQGhgRwx.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-Hsq1wYaq.js} +1 -1
- package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-C6hldFgO.js} +1 -1
- package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-DieNn4VC.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-CvAhDMix.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-CUT1tvt-.js} +1 -1
- package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch-CX9p_uYU.js} +1 -1
- package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-nEMRtcWe.js} +1 -1
- package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-CPsHa2_m.js} +1 -1
- package/storybook-static/assets/{Table-BFAEcUde.js → Table-BhtITVtj.js} +1 -1
- package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-nWNhSydG.js} +2 -2
- package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-DMQFh2BJ.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-D23_xvom.js} +1 -1
- package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-B5BsD_j_.js} +1 -1
- package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-DO17z100.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-CMMFnIzb.js} +1 -1
- package/storybook-static/assets/{Text-DK4jN26J.js → Text-ClnbDqRk.js} +1 -1
- package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-C2IO_zsP.js} +1 -1
- package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-DkhohiNc.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-NL6Aq8Vc.js} +1 -1
- package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-DNEPDlSW.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-DlfdPsz1.js} +1 -1
- package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-3U5CceQN.js} +1 -1
- package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-Cc6Ca-HI.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-BR-hVLDp.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-B0oBc-4y.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-D9hMQN2O.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CslpbvPR.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-B_dMCe45.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-2lj0Q8gm.js} +1 -1
- package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-DEKNYF2b.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-CVDxn8Vm.js} +1 -1
- package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-CBIpzYRL.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-BMzrr2Kc.js} +2 -2
- package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-B5YBxaaS.js} +3 -3
- package/storybook-static/assets/{check-CLkTJVXe.js → check-BjtdCRaW.js} +1 -1
- package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-B4u-y8Z1.js} +1 -1
- package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-BQfWs7Ah.js} +1 -1
- package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-ChokKd-f.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-meOkhzk4.js} +1 -1
- package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B1AnDRf_.js} +1 -1
- package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-JYnlcC1F.js} +1 -1
- package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-C_wl1sL5.js} +3 -3
- package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B-TUGs_1.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
- package/storybook-static/assets/{download-eAKjms6q.js → download-eR3X8I-h.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-D95VPQ0b.js} +1 -1
- package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
- package/storybook-static/assets/foundationApi-QhHXpYLB.js +59 -0
- package/storybook-static/assets/foundationLib-CEAjnstw.js +30 -0
- package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-awde7r2r.js} +1 -1
- package/storybook-static/assets/iframe-DzQq_POR.js +1 -0
- package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-FSp_AjJa.js} +4 -4
- package/storybook-static/assets/{info-DhJTzwcL.js → info-12vmb1sT.js} +1 -1
- package/storybook-static/assets/odata-C0Kpvttz.js +1 -0
- package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
- package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-BXZnk_C7.js} +1 -1
- package/storybook-static/assets/{react-YFbUKK0m.js → react-BlCqWuXr.js} +1 -1
- package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-Bf5ufPte.js} +1 -1
- package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-DR-dTXIC.js} +1 -1
- package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-B5e5yb_-.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-EVJARTec.js} +1 -1
- package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-QP7TS18H.js} +1 -1
- package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-qw19mxHr.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-Csu_Cct9.js} +1 -1
- package/storybook-static/assets/useODataTreeData-BAv-Twqf.js +1 -0
- package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-Da-XM_Y0.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-C0TdC2Pz.js} +1 -1
- package/storybook-static/assets/{x-CqPSvWfo.js → x-aCjYTirW.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,118 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={a:`a`,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/Contracts/Common Types`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`общие-технические-типы-ryuzaki13react-foundation-libtypes`,children:[`Общие технические типы `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/types`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит небольшие общие TypeScript-контракты для value state, ABAP boolean, базовых значений, диапазонов и строк таблицы. Единственная runtime-функция — `,(0,c.jsx)(t.code,{children:`isBaseType`}),`.`]}),`
|
|
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:`#%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:`Установка и импорт`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#state`,children:(0,c.jsx)(t.code,{children:`State`})})}),`
|
|
8
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#abapboolean`,children:(0,c.jsx)(t.code,{children:`AbapBoolean`})})}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsxs)(t.a,{href:`#primitive-%D0%B8-basetype`,children:[(0,c.jsx)(t.code,{children:`Primitive`}),` и `,(0,c.jsx)(t.code,{children:`BaseType`})]})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#isbasetype`,children:(0,c.jsx)(t.code,{children:`isBaseType`})})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsxs)(t.a,{href:`#arraytype-objecttype-inputtype`,children:[(0,c.jsx)(t.code,{children:`ArrayType`}),`, `,(0,c.jsx)(t.code,{children:`ObjectType`}),`, `,(0,c.jsx)(t.code,{children:`InputType`})]})}),`
|
|
12
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#rangetype`,children:(0,c.jsx)(t.code,{children:`RangeType`})})}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#rowrecord`,children:(0,c.jsx)(t.code,{children:`RowRecord`})})}),`
|
|
14
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F`,children:`Ошибки проектирования`})}),`
|
|
15
|
+
`]}),`
|
|
16
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
17
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { isBaseType } from "@ryuzaki13/react-foundation-lib/types";
|
|
18
|
+
|
|
19
|
+
import type {
|
|
20
|
+
AbapBoolean,
|
|
21
|
+
ArrayType,
|
|
22
|
+
BaseType,
|
|
23
|
+
InputType,
|
|
24
|
+
ObjectType,
|
|
25
|
+
Primitive,
|
|
26
|
+
RangeType,
|
|
27
|
+
RowRecord,
|
|
28
|
+
State
|
|
29
|
+
} from "@ryuzaki13/react-foundation-lib/types";
|
|
30
|
+
`})}),`
|
|
31
|
+
`,(0,c.jsxs)(t.p,{children:[`Типы исчезают после компиляции TypeScript. Не пытайтесь использовать `,(0,c.jsx)(t.code,{children:`State`}),` или `,(0,c.jsx)(t.code,{children:`RowRecord`}),` как runtime validator.`]}),`
|
|
32
|
+
`,(0,c.jsx)(t.h2,{id:`state`,children:(0,c.jsx)(t.code,{children:`State`})}),`
|
|
33
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type State = "" | "none" | "information" | "success" | "warning" | "error";
|
|
34
|
+
`})}),`
|
|
35
|
+
`,(0,c.jsx)(t.p,{children:`Это общий display/value state, а не HTTP status и не состояние async request.`}),`
|
|
36
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const state: State = "warning";
|
|
37
|
+
`})}),`
|
|
38
|
+
`,(0,c.jsxs)(t.p,{children:[`Пустая строка и `,(0,c.jsx)(t.code,{children:`"none"`}),` являются разными допустимыми значениями. Не сжимайте их автоматически в `,(0,c.jsx)(t.code,{children:`undefined`}),`, если contract этого не требует.`]}),`
|
|
39
|
+
`,(0,c.jsx)(t.h2,{id:`abapboolean`,children:(0,c.jsx)(t.code,{children:`AbapBoolean`})}),`
|
|
40
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type AbapBoolean = "X" | " ";
|
|
41
|
+
`})}),`
|
|
42
|
+
`,(0,c.jsxs)(t.p,{children:[`ABAP-style boolean использует `,(0,c.jsx)(t.code,{children:`"X"`}),` для истины и строку из одного пробела для лжи. Это не JavaScript boolean:`]}),`
|
|
43
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`Boolean(" "); // true, потому что непустая строка.
|
|
44
|
+
`})}),`
|
|
45
|
+
`,(0,c.jsxs)(t.p,{children:[`Для преобразования используйте boolean formatters, а не `,(0,c.jsx)(t.code,{children:`Boolean(value)`}),`.`]}),`
|
|
46
|
+
`,(0,c.jsxs)(t.h2,{id:`primitive-и-basetype`,children:[(0,c.jsx)(t.code,{children:`Primitive`}),` и `,(0,c.jsx)(t.code,{children:`BaseType`})]}),`
|
|
47
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type Primitive = string | number | boolean | null | undefined;
|
|
48
|
+
type BaseType = Date | Primitive;
|
|
49
|
+
`})}),`
|
|
50
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`BaseType`}),` добавляет `,(0,c.jsx)(t.code,{children:`Date`}),` к primitive values. Тип `,(0,c.jsx)(t.code,{children:`number`}),` статически включает `,(0,c.jsx)(t.code,{children:`NaN`}),`/`,(0,c.jsx)(t.code,{children:`Infinity`}),`, но runtime guard их отклоняет.`]}),`
|
|
51
|
+
`,(0,c.jsx)(t.h2,{id:`isbasetype`,children:(0,c.jsx)(t.code,{children:`isBaseType`})}),`
|
|
52
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isBaseType("text"); // true.
|
|
53
|
+
isBaseType(10); // true.
|
|
54
|
+
isBaseType(false); // true.
|
|
55
|
+
isBaseType(null); // true.
|
|
56
|
+
isBaseType(undefined); // true.
|
|
57
|
+
isBaseType(new Date()); // true.
|
|
58
|
+
|
|
59
|
+
isBaseType(Number.NaN); // false.
|
|
60
|
+
isBaseType(Infinity); // false.
|
|
61
|
+
isBaseType(new Date("bad")); // false.
|
|
62
|
+
isBaseType([]); // false.
|
|
63
|
+
isBaseType({}); // false.
|
|
64
|
+
`})}),`
|
|
65
|
+
`,(0,c.jsx)(t.p,{children:`Сигнатура является type guard:`}),`
|
|
66
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function acceptUnknown(value: unknown) {
|
|
67
|
+
if (!isBaseType(value)) return;
|
|
68
|
+
|
|
69
|
+
// Здесь value имеет тип BaseType.
|
|
70
|
+
}
|
|
71
|
+
`})}),`
|
|
72
|
+
`,(0,c.jsx)(t.p,{children:`Guard проверяет только форму базового значения, а не бизнес-ограничения строки/числа/даты.`}),`
|
|
73
|
+
`,(0,c.jsxs)(t.h2,{id:`arraytype-objecttype-inputtype`,children:[(0,c.jsx)(t.code,{children:`ArrayType`}),`, `,(0,c.jsx)(t.code,{children:`ObjectType`}),`, `,(0,c.jsx)(t.code,{children:`InputType`})]}),`
|
|
74
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ArrayType = BaseType[];
|
|
75
|
+
type ObjectType = Readonly<Record<string, BaseType>> | object;
|
|
76
|
+
type InputType = BaseType | ArrayType | ObjectType;
|
|
77
|
+
`})}),`
|
|
78
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ArrayType`}),` — изменяемый массив базовых значений.`]}),`
|
|
79
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ObjectType`}),` намеренно широкий: union с `,(0,c.jsx)(t.code,{children:`object`}),` допускает практически любой non-primitive object. Он не означает JSON-compatible record и не является runtime-проверкой.`]}),`
|
|
80
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`InputType`}),` объединяет базовые значения, массивы и objects для generic formatter/input contracts. Не используйте его вместо точного domain DTO.`]}),`
|
|
81
|
+
`,(0,c.jsx)(t.h2,{id:`rangetype`,children:(0,c.jsx)(t.code,{children:`RangeType`})}),`
|
|
82
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RangeType = readonly [BaseType | null, BaseType | null];
|
|
83
|
+
`})}),`
|
|
84
|
+
`,(0,c.jsx)(t.p,{children:`Tuple всегда имеет две позиции:`}),`
|
|
85
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const range: RangeType = [new Date(2026, 0, 1), null];
|
|
86
|
+
`})}),`
|
|
87
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
88
|
+
`,(0,c.jsxs)(t.li,{children:[`индекс `,(0,c.jsx)(t.code,{children:`0`}),` — начало;`]}),`
|
|
89
|
+
`,(0,c.jsxs)(t.li,{children:[`индекс `,(0,c.jsx)(t.code,{children:`1`}),` — конец;`]}),`
|
|
90
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),` обычно означает открытую/незаполненную границу;`]}),`
|
|
91
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`readonly`}),` запрещает присваивание через TypeScript, но не вызывает `,(0,c.jsx)(t.code,{children:`Object.freeze`}),`.`]}),`
|
|
92
|
+
`]}),`
|
|
93
|
+
`,(0,c.jsxs)(t.p,{children:[`Поскольку `,(0,c.jsx)(t.code,{children:`BaseType`}),` уже включает `,(0,c.jsx)(t.code,{children:`null`}),` и `,(0,c.jsx)(t.code,{children:`undefined`}),`, тип исторически широкий. Конкретный UI/domain contract должен задавать более точный `,(0,c.jsx)(t.code,{children:`readonly [T | null, T | null]`}),`.`]}),`
|
|
94
|
+
`,(0,c.jsx)(t.h2,{id:`rowrecord`,children:(0,c.jsx)(t.code,{children:`RowRecord`})}),`
|
|
95
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RowRecord = Record<string, unknown>;
|
|
96
|
+
`})}),`
|
|
97
|
+
`,(0,c.jsx)(t.p,{children:`Это строка таблицы с неизвестными полями. Перед использованием значения его нужно сузить:`}),`
|
|
98
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function readName(row: RowRecord): string | undefined {
|
|
99
|
+
return typeof row.name === "string" ? row.name : undefined;
|
|
100
|
+
}
|
|
101
|
+
`})}),`
|
|
102
|
+
`,(0,c.jsx)(t.p,{children:`Если структура известна, объявляйте точный тип:`}),`
|
|
103
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type EmployeeRow = {
|
|
104
|
+
id: string;
|
|
105
|
+
name: string;
|
|
106
|
+
salary: number;
|
|
107
|
+
};
|
|
108
|
+
`})}),`
|
|
109
|
+
`,(0,c.jsx)(t.h2,{id:`ошибки-проектирования`,children:`Ошибки проектирования`}),`
|
|
110
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
111
|
+
`,(0,c.jsxs)(t.li,{children:[`Использовать `,(0,c.jsx)(t.code,{children:`InputType`}),` как замену schema внешнего JSON.`]}),`
|
|
112
|
+
`,(0,c.jsxs)(t.li,{children:[`Считать `,(0,c.jsx)(t.code,{children:`ObjectType`}),` plain object.`]}),`
|
|
113
|
+
`,(0,c.jsxs)(t.li,{children:[`Приводить `,(0,c.jsx)(t.code,{children:`AbapBoolean`}),` через `,(0,c.jsx)(t.code,{children:`Boolean()`}),`.`]}),`
|
|
114
|
+
`,(0,c.jsxs)(t.li,{children:[`Считать `,(0,c.jsx)(t.code,{children:`readonly`}),` runtime-заморозкой.`]}),`
|
|
115
|
+
`,(0,c.jsxs)(t.li,{children:[`Использовать `,(0,c.jsx)(t.code,{children:`RowRecord`}),` там, где известны поля сущности.`]}),`
|
|
116
|
+
`,(0,c.jsxs)(t.li,{children:[`Считать `,(0,c.jsx)(t.code,{children:`isBaseType`}),` проверкой диапазона, длины или разрешённых business values.`]}),`
|
|
117
|
+
`,(0,c.jsxs)(t.li,{children:[`Нормализовать `,(0,c.jsx)(t.code,{children:`""`}),`, `,(0,c.jsx)(t.code,{children:`false`}),`, `,(0,c.jsx)(t.code,{children:`[]`}),` и `,(0,c.jsx)(t.code,{children:`null`}),` только из-за широкого общего типа.`]}),`
|
|
118
|
+
`]})]})}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,192 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={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/HTTP/SEO`}),`
|
|
2
|
+
`,(0,c.jsx)(t.h1,{id:`seo`,children:`SEO`}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/seo`}),` собирает единый набор SEO-описаний страницы:`]}),`
|
|
4
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
5
|
+
`,(0,c.jsx)(t.li,{children:`title и обычные meta tags;`}),`
|
|
6
|
+
`,(0,c.jsx)(t.li,{children:`Open Graph;`}),`
|
|
7
|
+
`,(0,c.jsx)(t.li,{children:`Twitter Card;`}),`
|
|
8
|
+
`,(0,c.jsx)(t.li,{children:`canonical link;`}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:`JSON-LD по Schema.org.`}),`
|
|
10
|
+
`]}),`
|
|
11
|
+
`,(0,c.jsxs)(t.p,{children:[`Он не меняет `,(0,c.jsx)(t.code,{children:`document.head`}),` напрямую. Результат передаётся роутеру, SSR-фреймворку или собственному renderer head-тегов.`]}),`
|
|
12
|
+
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
13
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { createRouteHead, createSeoHead, type SeoContentType, type SeoHeadOptions } from "@ryuzaki13/react-foundation-lib/seo";
|
|
14
|
+
`})}),`
|
|
15
|
+
`,(0,c.jsx)(t.p,{children:`Функции синхронные и не требуют DOM, поэтому подходят для server rendering.`}),`
|
|
16
|
+
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
17
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const head = createSeoHead({
|
|
18
|
+
pathname: "/articles/odata-guide",
|
|
19
|
+
baseUrl: "https://example.ru",
|
|
20
|
+
caption: "Практический гайд по OData",
|
|
21
|
+
description: "Разбираем фильтры, сортировку и пагинацию OData.",
|
|
22
|
+
type: "Article",
|
|
23
|
+
keywords: ["OData", "TypeScript", "SAP"],
|
|
24
|
+
image: {
|
|
25
|
+
url: "/images/odata-guide.webp",
|
|
26
|
+
alt: "Схема OData-запроса",
|
|
27
|
+
width: 1200,
|
|
28
|
+
height: 630
|
|
29
|
+
},
|
|
30
|
+
publishedAt: "2026-08-01T10:00:00+05:00",
|
|
31
|
+
modifiedAt: "2026-08-20T12:30:00+05:00"
|
|
32
|
+
});
|
|
33
|
+
`})}),`
|
|
34
|
+
`,(0,c.jsx)(t.p,{children:`Результат имеет три массива:`}),`
|
|
35
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
|
|
36
|
+
meta: (Record < string, string > []);
|
|
37
|
+
links: (Record < string, string > []);
|
|
38
|
+
scripts: Array<{
|
|
39
|
+
type: "application/ld+json";
|
|
40
|
+
children: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
`})}),`
|
|
44
|
+
`,(0,c.jsx)(t.p,{children:`Форма совместима с распространённым route-head подходом, но конкретное подключение зависит от фреймворка.`}),`
|
|
45
|
+
`,(0,c.jsx)(t.h2,{id:`createseoheadoptions`,children:(0,c.jsx)(t.code,{children:`createSeoHead(options)`})}),`
|
|
46
|
+
`,(0,c.jsx)(t.h3,{id:`параметры`,children:`Параметры`}),`
|
|
47
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type SeoContentType = "WebSite" | "WebPage" | "Article" | "NewsArticle";
|
|
48
|
+
|
|
49
|
+
type SeoHeadOptions = {
|
|
50
|
+
pathname: string;
|
|
51
|
+
caption: string;
|
|
52
|
+
description: string;
|
|
53
|
+
type: SeoContentType;
|
|
54
|
+
baseUrl?: string;
|
|
55
|
+
keywords?: string[];
|
|
56
|
+
image?: {
|
|
57
|
+
url: string;
|
|
58
|
+
alt?: string | null;
|
|
59
|
+
width?: number | null;
|
|
60
|
+
height?: number | null;
|
|
61
|
+
};
|
|
62
|
+
publishedAt?: string;
|
|
63
|
+
modifiedAt?: string;
|
|
64
|
+
noIndex?: boolean;
|
|
65
|
+
};
|
|
66
|
+
`})}),`
|
|
67
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`caption`}),` и `,(0,c.jsx)(t.code,{children:`description`}),` обязательны даже для пустой страницы. Библиотека не подставляет название сайта и не обрезает текст под лимиты поисковых систем.`]}),`
|
|
68
|
+
`,(0,c.jsx)(t.h3,{id:`canonical-url`,children:`Canonical URL`}),`
|
|
69
|
+
`,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`pathname`}),` уже абсолютный URL, он нормализуется через `,(0,c.jsx)(t.code,{children:`new URL()`}),`.`]}),`
|
|
70
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createSeoHead({
|
|
71
|
+
pathname: "https://example.ru/catalog",
|
|
72
|
+
// baseUrl не нужен
|
|
73
|
+
caption: "Каталог",
|
|
74
|
+
description: "Каталог товаров",
|
|
75
|
+
type: "WebPage"
|
|
76
|
+
});
|
|
77
|
+
`})}),`
|
|
78
|
+
`,(0,c.jsxs)(t.p,{children:[`Для относительного пути рекомендуется обязательно передавать абсолютный `,(0,c.jsx)(t.code,{children:`baseUrl`}),`:`]}),`
|
|
79
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`pathname: "/catalog",
|
|
80
|
+
baseUrl: "https://example.ru",
|
|
81
|
+
// canonical: https://example.ru/catalog
|
|
82
|
+
`})}),`
|
|
83
|
+
`,(0,c.jsxs)(t.p,{children:[`Без `,(0,c.jsx)(t.code,{children:`baseUrl`}),` относительный путь сохраняется как есть. Это может быть приемлемо для некоторых head-renderer, но canonical URL по стандартной практике должен быть абсолютным.`]}),`
|
|
84
|
+
`,(0,c.jsxs)(t.p,{children:[`Неверный `,(0,c.jsx)(t.code,{children:`baseUrl`}),` вместе с относительным `,(0,c.jsx)(t.code,{children:`pathname`}),` приводит к исключению `,(0,c.jsx)(t.code,{children:`new URL`}),`. Проверяйте конфигурацию origin при старте приложения.`]}),`
|
|
85
|
+
`,(0,c.jsx)(t.h3,{id:`meta-tags`,children:`Meta tags`}),`
|
|
86
|
+
`,(0,c.jsx)(t.p,{children:`Всегда создаются:`}),`
|
|
87
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
88
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`{ title: caption }`}),`;`]}),`
|
|
89
|
+
`,(0,c.jsx)(t.li,{children:`description;`}),`
|
|
90
|
+
`,(0,c.jsx)(t.li,{children:`robots;`}),`
|
|
91
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`og:type`}),`, `,(0,c.jsx)(t.code,{children:`og:title`}),`, `,(0,c.jsx)(t.code,{children:`og:description`}),`, `,(0,c.jsx)(t.code,{children:`og:url`}),`, `,(0,c.jsx)(t.code,{children:`og:locale`}),`;`]}),`
|
|
92
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`twitter:card`}),`, `,(0,c.jsx)(t.code,{children:`twitter:title`}),`, `,(0,c.jsx)(t.code,{children:`twitter:description`}),`.`]}),`
|
|
93
|
+
`]}),`
|
|
94
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`Article`}),` и `,(0,c.jsx)(t.code,{children:`NewsArticle`}),` получают Open Graph type `,(0,c.jsx)(t.code,{children:`article`}),`. `,(0,c.jsx)(t.code,{children:`WebSite`}),` и `,(0,c.jsx)(t.code,{children:`WebPage`}),` получают `,(0,c.jsx)(t.code,{children:`website`}),`.`]}),`
|
|
95
|
+
`,(0,c.jsxs)(t.p,{children:[`Локаль фиксирована как `,(0,c.jsx)(t.code,{children:`ru_RU`}),` для Open Graph и `,(0,c.jsx)(t.code,{children:`ru-RU`}),` для JSON-LD.`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.p,{children:[`Если есть изображение, Twitter Card становится `,(0,c.jsx)(t.code,{children:`summary_large_image`}),`; без изображения — `,(0,c.jsx)(t.code,{children:`summary`}),`.`]}),`
|
|
97
|
+
`,(0,c.jsx)(t.h3,{id:`индексация`,children:`Индексация`}),`
|
|
98
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`noIndex: true;
|
|
99
|
+
// robots: "noindex, nofollow"
|
|
100
|
+
`})}),`
|
|
101
|
+
`,(0,c.jsxs)(t.p,{children:[`По умолчанию используется `,(0,c.jsx)(t.code,{children:`index, follow`}),`. `,(0,c.jsx)(t.code,{children:`noIndex`}),` формирует meta-инструкцию, но не заменяет серверные заголовки, robots.txt, авторизацию и запрет выдачи приватных страниц.`]}),`
|
|
102
|
+
`,(0,c.jsx)(t.h3,{id:`keywords`,children:`Keywords`}),`
|
|
103
|
+
`,(0,c.jsxs)(t.p,{children:[`Непустой массив соединяется через `,(0,c.jsx)(t.code,{children:`", "`}),` и добавляется одновременно в обычный meta keywords и JSON-LD.`]}),`
|
|
104
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`keywords: ["React", "TypeScript"];
|
|
105
|
+
// "React, TypeScript"
|
|
106
|
+
`})}),`
|
|
107
|
+
`,(0,c.jsx)(t.p,{children:`Пустые строки внутри массива не удаляются автоматически.`}),`
|
|
108
|
+
`,(0,c.jsx)(t.h3,{id:`изображение`,children:`Изображение`}),`
|
|
109
|
+
`,(0,c.jsxs)(t.p,{children:[`Относительный `,(0,c.jsx)(t.code,{children:`image.url`}),` преобразуется с тем же `,(0,c.jsx)(t.code,{children:`baseUrl`}),`. Создаются `,(0,c.jsx)(t.code,{children:`og:image`}),` и `,(0,c.jsx)(t.code,{children:`twitter:image`}),`; при наличии `,(0,c.jsx)(t.code,{children:`alt`}),` дополнительно создаётся `,(0,c.jsx)(t.code,{children:`og:image:alt`}),`.`]}),`
|
|
110
|
+
`,(0,c.jsxs)(t.p,{children:[`В JSON-LD формируется `,(0,c.jsx)(t.code,{children:`ImageObject`}),`. Неуказанные `,(0,c.jsx)(t.code,{children:`width`}),`, `,(0,c.jsx)(t.code,{children:`height`}),` и `,(0,c.jsx)(t.code,{children:`alt`}),` остаются `,(0,c.jsx)(t.code,{children:`undefined`}),` либо `,(0,c.jsx)(t.code,{children:`null`}),` согласно исходным данным и поведению `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),`.`]}),`
|
|
111
|
+
`,(0,c.jsx)(t.h3,{id:`даты`,children:`Даты`}),`
|
|
112
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`publishedAt`}),` и `,(0,c.jsx)(t.code,{children:`modifiedAt`}),` разбираются через стандартный `,(0,c.jsx)(t.code,{children:`Date`}),` и записываются в ISO UTC:`]}),`
|
|
113
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`publishedAt: "2026-08-01T10:00:00+05:00";
|
|
114
|
+
// datePublished: "2026-08-01T05:00:00.000Z"
|
|
115
|
+
`})}),`
|
|
116
|
+
`,(0,c.jsx)(t.p,{children:`Пустая или неверная дата молча не добавляется. Для предсказуемости передавайте ISO 8601 со временной зоной.`}),`
|
|
117
|
+
`,(0,c.jsx)(t.h2,{id:`json-ld`,children:`JSON-LD`}),`
|
|
118
|
+
`,(0,c.jsx)(t.p,{children:`Каждый вызов создаёт один script descriptor:`}),`
|
|
119
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
|
|
120
|
+
type: "application/ld+json",
|
|
121
|
+
children: JSON.stringify({
|
|
122
|
+
"@context": "https://schema.org",
|
|
123
|
+
"@type": type,
|
|
124
|
+
mainEntityOfPage: { "@type": "WebPage", "@id": canonicalUrl },
|
|
125
|
+
headline: caption,
|
|
126
|
+
description,
|
|
127
|
+
url: canonicalUrl,
|
|
128
|
+
inLanguage: "ru-RU",
|
|
129
|
+
}),
|
|
130
|
+
}
|
|
131
|
+
`})}),`
|
|
132
|
+
`,(0,c.jsxs)(t.p,{children:[`Библиотека возвращает строку, а не готовый React-элемент. Следуйте API head-renderer. Если вручную вставляете строку в HTML script, учитывайте XSS-границу: SEO-текст должен быть доверенным или безопасно экранированным renderer. Простого `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),` недостаточно для произвольного пользовательского текста, содержащего последовательности вроде закрывающего `,(0,c.jsx)(t.code,{children:`script`}),`-тега.`]}),`
|
|
133
|
+
`,(0,c.jsx)(t.h2,{id:`createrouteheadtype-path-params`,children:(0,c.jsx)(t.code,{children:`createRouteHead(type, path, params)`})}),`
|
|
134
|
+
`,(0,c.jsx)(t.p,{children:`Упрощённый адаптер для данных route loader/CMS:`}),`
|
|
135
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type SeoHeadParams = {
|
|
136
|
+
caption: string;
|
|
137
|
+
description: string;
|
|
138
|
+
previewImage: string | null;
|
|
139
|
+
previewImageAlt: string | null;
|
|
140
|
+
created: string;
|
|
141
|
+
updated: string;
|
|
142
|
+
};
|
|
143
|
+
`})}),`
|
|
144
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const head = createRouteHead("NewsArticle", "/news/42", loaderData?.seo);
|
|
145
|
+
`})}),`
|
|
146
|
+
`,(0,c.jsx)(t.p,{children:`Адаптер:`}),`
|
|
147
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
148
|
+
`,(0,c.jsxs)(t.li,{children:[`передаёт `,(0,c.jsx)(t.code,{children:`path`}),` как `,(0,c.jsx)(t.code,{children:`pathname`}),`;`]}),`
|
|
149
|
+
`,(0,c.jsxs)(t.li,{children:[`при `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),` params подставляет пустые `,(0,c.jsx)(t.code,{children:`caption`}),` и `,(0,c.jsx)(t.code,{children:`description`}),`;`]}),`
|
|
150
|
+
`,(0,c.jsxs)(t.li,{children:[`превращает `,(0,c.jsx)(t.code,{children:`previewImage`}),` в `,(0,c.jsx)(t.code,{children:`image`}),`;`]}),`
|
|
151
|
+
`,(0,c.jsxs)(t.li,{children:[`сопоставляет `,(0,c.jsx)(t.code,{children:`created`}),` с `,(0,c.jsx)(t.code,{children:`publishedAt`}),`, `,(0,c.jsx)(t.code,{children:`updated`}),` с `,(0,c.jsx)(t.code,{children:`modifiedAt`}),`;`]}),`
|
|
152
|
+
`,(0,c.jsxs)(t.li,{children:[`не передаёт `,(0,c.jsx)(t.code,{children:`baseUrl`}),`, keywords или `,(0,c.jsx)(t.code,{children:`noIndex`}),`.`]}),`
|
|
153
|
+
`]}),`
|
|
154
|
+
`,(0,c.jsxs)(t.p,{children:[`Поэтому URL результата останется относительным, если `,(0,c.jsx)(t.code,{children:`path`}),` относительный. Когда нужен абсолютный canonical, используйте полный `,(0,c.jsx)(t.code,{children:`createSeoHead`}),` либо передавайте абсолютный `,(0,c.jsx)(t.code,{children:`path`}),`.`]}),`
|
|
155
|
+
`,(0,c.jsx)(t.h2,{id:`пример-с-tanstack-router`,children:`Пример с TanStack Router`}),`
|
|
156
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`export const Route = createFileRoute("/articles/$slug")({
|
|
157
|
+
loader: loadArticle,
|
|
158
|
+
head: ({ loaderData, params }) =>
|
|
159
|
+
createSeoHead({
|
|
160
|
+
pathname: \`/articles/\${params.slug}\`,
|
|
161
|
+
baseUrl: "https://example.ru",
|
|
162
|
+
caption: loaderData.title,
|
|
163
|
+
description: loaderData.description,
|
|
164
|
+
type: "Article",
|
|
165
|
+
image: loaderData.image ? { url: loaderData.image, alt: loaderData.title } : undefined
|
|
166
|
+
})
|
|
167
|
+
});
|
|
168
|
+
`})}),`
|
|
169
|
+
`,(0,c.jsxs)(t.p,{children:[`Проверьте точную форму `,(0,c.jsx)(t.code,{children:`head`}),` вашей версии роутера: библиотека возвращает структурные данные, но не связывается с router напрямую.`]}),`
|
|
170
|
+
`,(0,c.jsx)(t.h2,{id:`проверка-результата`,children:`Проверка результата`}),`
|
|
171
|
+
`,(0,c.jsx)(t.p,{children:`Для каждой важной страницы проверьте:`}),`
|
|
172
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
173
|
+
`,(0,c.jsx)(t.li,{children:`canonical абсолютный и соответствует публичному URL;`}),`
|
|
174
|
+
`,(0,c.jsx)(t.li,{children:`title и description не пусты;`}),`
|
|
175
|
+
`,(0,c.jsx)(t.li,{children:`Open Graph image доступно без авторизации;`}),`
|
|
176
|
+
`,(0,c.jsx)(t.li,{children:`JSON-LD проходит validator Schema.org/поисковой системы;`}),`
|
|
177
|
+
`,(0,c.jsx)(t.li,{children:`preview SSR HTML содержит теги до выполнения JavaScript;`}),`
|
|
178
|
+
`,(0,c.jsx)(t.li,{children:`приватные страницы имеют правильную политику индексации.`}),`
|
|
179
|
+
`]}),`
|
|
180
|
+
`,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
|
|
181
|
+
`,(0,c.jsxs)(t.h3,{id:`передавать-относительный-путь-без-baseurl`,children:[`Передавать относительный путь без `,(0,c.jsx)(t.code,{children:`baseUrl`})]}),`
|
|
182
|
+
`,(0,c.jsx)(t.p,{children:`Функция не знает публичный origin приложения и оставит URL относительным.`}),`
|
|
183
|
+
`,(0,c.jsxs)(t.h3,{id:`считать-createroutehead-полным-аналогом-createseohead`,children:[`Считать `,(0,c.jsx)(t.code,{children:`createRouteHead`}),` полным аналогом `,(0,c.jsx)(t.code,{children:`createSeoHead`})]}),`
|
|
184
|
+
`,(0,c.jsxs)(t.p,{children:[`Адаптер специально узкий и не принимает base URL, keywords, размеры image и `,(0,c.jsx)(t.code,{children:`noIndex`}),`.`]}),`
|
|
185
|
+
`,(0,c.jsx)(t.h3,{id:`передавать-локальную-дату-без-timezone`,children:`Передавать локальную дату без timezone`}),`
|
|
186
|
+
`,(0,c.jsxs)(t.p,{children:[`Результат стандартного `,(0,c.jsx)(t.code,{children:`Date`}),` может зависеть от окружения. Используйте полный ISO 8601.`]}),`
|
|
187
|
+
`,(0,c.jsx)(t.h3,{id:`генерировать-seo-только-после-client-fetch`,children:`Генерировать SEO только после client fetch`}),`
|
|
188
|
+
`,(0,c.jsx)(t.p,{children:`Для надёжной индексации head должен появляться в SSR/pre-render HTML, если архитектура приложения это поддерживает.`}),`
|
|
189
|
+
`,(0,c.jsx)(t.h3,{id:`передавать-недоверенный-текст-напрямую-в-json-ld-script`,children:`Передавать недоверенный текст напрямую в JSON-LD script`}),`
|
|
190
|
+
`,(0,c.jsx)(t.p,{children:`Используйте безопасный renderer и контролируйте источник SEO-полей.`}),`
|
|
191
|
+
`,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
|
|
192
|
+
`,(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:`createSeoHead(options)`})}),(0,c.jsx)(t.td,{children:`Собрать полный meta/link/JSON-LD набор`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createRouteHead(type, path, params)`})}),(0,c.jsx)(t.td,{children:`Адаптировать типичные route SEO-поля`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SeoContentType`})}),(0,c.jsx)(t.td,{children:`Допустимый Schema.org content type`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SeoHeadOptions`})}),(0,c.jsx)(t.td,{children:`Полная конфигурация страницы`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SeoHeadParams`})}),(0,c.jsx)(t.td,{children:`Входные данные упрощённого route adapter`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SeoImage`})}),(0,c.jsx)(t.td,{children:`URL и описательные размеры preview-изображения`})]})]})]})]})}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-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.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/DOM`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`browser-dom-и-focus-helpers-через-ryuzaki13react-foundation-libdom`,children:[`Browser DOM и focus helpers через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/dom`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`dom`}),` содержит небольшие browser helpers и React hooks для типовых инфраструктурных задач:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|