@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-o7sH2IXC.js";import{n as i,t as a}from"./Popover-B6oidz5p.js";import{n as o,t as s}from"./Button-_YPAu9sd.js";import{n as c,t as l}from"./createControlledStoryRender-BouhvX-R.js";import{l as u,t as d}from"./Input-DLubbE7P.js";var f=t({AnchorPlacement:()=>w,Controlled:()=>C,Default:()=>S,WithInteractiveContent:()=>T,__namedExportsOrder:()=>E,default:()=>x});function p({args:e,updateArgs:t,trigger:n,children:r}){return(0,_.jsxs)(a,{placement:e.placement,open:e.open,defaultOpen:e.defaultOpen,onOpenChange:n=>{e.onOpenChange?.(n),t({open:n})},children:[(0,_.jsx)(a.Trigger,{passive:e.passive,children:n(e.open===!0)}),(0,_.jsx)(a.Content,{onClose:()=>e.onClose?.(),closeOnOutside:e.closeOnOutside,closeOnEscape:e.closeOnEscape,disableOutsideClick:e.disableOutsideClick,background:e.background,children:r})]})}function m(e,t){return l((n,r)=>(0,_.jsx)(p,{args:n,updateArgs:r,trigger:e,children:t}))}function h({args:e,updateArgs:t}){let[n,r]=(0,g.useState)(``);return(0,_.jsx)(p,{args:e,updateArgs:t,trigger:()=>(0,_.jsx)(`button`,{type:`button`,children:`Форма`}),children:e=>(0,_.jsxs)(`form`,{onSubmit:t=>{t.preventDefault(),e.setClose()},style:{display:`flex`,flexDirection:`column`,gap:8,padding:12,width:180},children:[(0,_.jsx)(d,{label:`Имя`,placeholder:`Введите имя`,value:n,onChange:r}),(0,_.jsx)(s,{children:`Отправить`})]})})}var g,_,v,y,b,x,S,C,w,T,E;function D(){return(D=e((()=>{g=n(),o(),c(),u(),i(),_=r(),{useArgs:v}=__STORYBOOK_MODULE_PREVIEW_API__,{fn:y}=__STORYBOOK_MODULE_TEST__,b=[`top`,`top-start`,`top-end`,`right`,`right-start`,`right-end`,`bottom`,`bottom-start`,`bottom-end`,`left`,`left-start`,`left-end`],x={title:`Shared/UI/Popover`,component:a,args:{children:null,placement:`bottom`,open:!1,defaultOpen:!1,onOpenChange:y(),onClose:y(),closeOnOutside:!0,closeOnEscape:!0,disableOutsideClick:!1,background:`secondary`},parameters:{atomicCanvas:!0,layout:`centered`},argTypes:{children:{description:"Композиция из `Popover.Trigger` и `Popover.Content`.",control:!1},placement:{description:`Предпочтительное положение панели относительно trigger.`,control:`select`,options:b},open:{description:`Контролируемая видимость popover.`,control:`boolean`},defaultOpen:{description:`Начальная видимость в uncontrolled-режиме.`,control:`boolean`},onOpenChange:{description:`Вызывается при открытии и закрытии popover.`,control:!1},passive:{description:`Оставляет trigger пассивным: он получает reference, но не переключает popover по клику.`,control:`boolean`},onClose:{description:"Вызывается после закрытия Content через Escape, клик снаружи или `setClose`.",control:!1},closeOnOutside:{description:`Закрывает Content по клику снаружи.`,control:`boolean`},closeOnEscape:{description:`Закрывает Content по клавише Escape.`,control:`boolean`},disableOutsideClick:{description:`Игнорирует клики снаружи Content.`,control:`boolean`},background:{description:`Тема фона Content.`,control:`inline-radio`,options:[`primary`,`secondary`]}}},S={render:m(()=>(0,_.jsx)(`button`,{type:`button`,children:`Открыть`}),e=>(0,_.jsxs)(`div`,{style:{padding:12,maxWidth:160},children:[(0,_.jsx)(`p`,{children:`Пример простого поповера`}),(0,_.jsx)(`button`,{type:`button`,onClick:e.setClose,children:`Закрыть`})]}))},C={render:m(e=>(0,_.jsx)(`button`,{type:`button`,children:e?`Закрыть`:`Открыть`}),(0,_.jsx)(`div`,{style:{padding:12},children:`Контролируемый режим`}))},w={render:function(){let[e,t]=v(),n=(n,r)=>{e.onOpenChange?.(n),t(n?{open:!0,placement:r}:{open:!1})};return(0,_.jsx)(`div`,{style:{display:`flex`,gap:32,flexWrap:`wrap`,justifyContent:`center`},children:b.map(t=>(0,_.jsxs)(a,{placement:t,open:e.open===!0&&e.placement===t,defaultOpen:e.defaultOpen,onOpenChange:e=>n(e,t),children:[(0,_.jsx)(a.Trigger,{passive:e.passive,children:(0,_.jsx)(`button`,{type:`button`,children:t})}),(0,_.jsx)(a.Content,{onClose:()=>e.onClose?.(),closeOnOutside:e.closeOnOutside,closeOnEscape:e.closeOnEscape,disableOutsideClick:e.disableOutsideClick,background:e.background,children:(0,_.jsx)(`div`,{style:{padding:8},children:t})})]},t))})}},T={render:l((e,t)=>(0,_.jsx)(h,{args:e,updateArgs:t}))},S.parameters={...S.parameters,docs:{...S.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: createPopoverStoryRender(() => <button type="button">Открыть</button>, ctx => <div style={{
|
|
3
3
|
padding: 12,
|
|
4
4
|
maxWidth: 160
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n}from"./iframe-o7sH2IXC.js";import{n as r,t as i}from"./FlexContainer-BWyPlTMB.js";import{r as a,t as o}from"./DateInput-BQ8SoeLE.js";import{a as s,c,l,n as u,o as d,r as f,s as p,t as m}from"./DateRangePresetSelect-fgJfLaLO.js";function h(e){return e??`__empty__`}function g({value:e,onChange:t,presetId:n,onPresetIdChange:r,referenceDate:a,presetIds:s,presetOptions:u,presetLabel:g,presetDescription:y,presetPlaceholder:b=`Выберите пресет диапазона`,presetDisabled:x,...S}){let[C]=(0,_.useState)(()=>new Date),w=a??C,T=(0,_.useMemo)(()=>u??c(d(s,f)),[s,u]),E=e??null,D=(0,_.useMemo)(()=>p(E,w,T),[E,T,w]),O=n??D??void 0,k=(0,_.useRef)(``),A=(0,_.useCallback)(e=>{if(!r)return;let t=h(e);t!==k.current&&(k.current=t,r(e))},[r]),j=e=>{let n=l(e,w,T);if(!n){A(null);return}A(n.id),t(n.range)},M=e=>{t(e),A(p(e,w,T))};return(0,v.jsxs)(i,{gap:`sm`,align:`end`,children:[(0,v.jsx)(m,{size:S.size,label:g,description:y,placeholder:b,disabled:x??S.disabled,value:O,onChange:j,options:T,referenceDate:w}),(0,v.jsx)(o,{...S,value:E,onChange:M})]})}var _,v;function y(){return(y=e((()=>{_=t(),a(),u(),s(),r(),v=n(),g.__docgenInfo={description:`Составной компонент выбора диапазона дат через пресет или ручной ввод.`,methods:[],displayName:`PresetRangeDateInput`,props:{presetId:{required:!1,tsType:{name:`union`,raw:`DateRangePresetOption["id"] | null`,elements:[{name:`DateRangePresetOption["id"]`,raw:`DateRangePresetOption["id"]`},{name:`null`}]},description:``},onPresetIdChange:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(presetId: DateRangePresetOption["id"] | null) => void`,signature:{arguments:[{type:{name:`union`,raw:`DateRangePresetOption["id"] | null`,elements:[{name:`DateRangePresetOption["id"]`,raw:`DateRangePresetOption["id"]`},{name:`null`}]},name:`presetId`}],return:{name:`void`}}},description:``},referenceDate:{required:!1,tsType:{name:`Date`},description:``},presetIds:{required:!1,tsType:{name:`unknown`},description:``},presetOptions:{required:!1,tsType:{name:`unknown`},description:``},presetLabel:{required:!1,tsType:{name:`ReactNode`},description:``},presetDescription:{required:!1,tsType:{name:`string`},description:``},presetPlaceholder:{required:!1,tsType:{name:`string`},description:``,defaultValue:{value:`"Выберите пресет диапазона"`,computed:!1}},presetDisabled:{required:!1,tsType:{name:`boolean`},description:``}},composes:[`Omit`]}})))()}export{y as n,g as t};
|
|
@@ -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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{n as p,r as m,t as h}from"./PresetRangeDateInput.stories-CgoYAYBG.js";function g(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(s,{of:p,parameters:{docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,v.jsx)(u,{children:`PresetRangeDateInput`}),`
|
|
3
3
|
`,(0,v.jsx)(o,{children:`Составной контрол диапазона дат с синхронизацией ручного ввода и готовых пресетов`}),`
|
|
4
4
|
`,(0,v.jsx)(t.p,{children:`PresetRangeDateInput уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{a as n,i as r,r as i}from"./CalendarView-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{a as n,i as r,r as i}from"./CalendarView-DLuO2Ywz.js";import{n as a}from"./iframe-o7sH2IXC.js";import{n as o,t as s}from"./Text-BhBt9e7C.js";import{n as c,t as l}from"./FlexContainer-BWyPlTMB.js";import{n as u,t as d}from"./createControlledStoryRender-BouhvX-R.js";import{a as f,r as p}from"./DateRangePresetSelect-fgJfLaLO.js";import{n as m,t as h}from"./PresetRangeDateInput-CQ5FfmrL.js";var g=t({Default:()=>x,__namedExportsOrder:()=>S,default:()=>y}),_,v,y,b,x,S;function C(){return(C=e((()=>{n(),f(),u(),c(),o(),m(),_=a(),{fn:v}=__STORYBOOK_MODULE_TEST__,y={title:`Shared/UI/PresetRangeDateInput`,component:h,args:{label:`Диапазон дат`,placeholder:`дд.мм.гггг - дд.мм.гггг`,value:[new Date(2026,2,10,0,0,0),new Date(2026,2,10,23,59,59)],onChange:v(),presetId:`today`,onPresetIdChange:v(),referenceDate:new Date(2026,2,10,12,0,0),presetLabel:`Быстрый диапазон`,size:`md`},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{presetId:{description:"Контролируемый ID выбранного быстрого пресета. `null` снимает внешний выбор.",control:`select`,options:[...p,null]},onPresetIdChange:{description:`Вызывается, когда выбор пресета меняется из-за preset или ручного диапазона.`,control:!1},referenceDate:{description:`Опорная дата для вычисления встроенных быстрых диапазонов.`,control:`date`},presetIds:{description:"Разрешённые встроенные ID пресетов, если не передан `presetOptions`.",control:`check`,options:p},presetOptions:{description:`Кастомный каталог быстрых диапазонов с функциями вычисления.`,control:!1},presetLabel:{description:`Заголовок поля быстрого выбора.`,control:`text`},presetDescription:{description:`Описание под полем быстрого выбора.`,control:`text`},presetPlaceholder:{description:`Текст до выбора быстрого диапазона.`,control:`text`},presetDisabled:{description:`Блокирует только выбор быстрого пресета.`,control:`boolean`},label:{description:`Заголовок ручного поля диапазона.`,control:`text`},description:{description:`Описание ручного поля диапазона.`,control:`text`},placeholder:{description:`Текст до выбора ручного диапазона.`,control:`text`},value:{description:`Текущий ручной диапазон дат.`,control:!1},onChange:{description:`Вызывается при изменении ручного диапазона или выборе пресета.`,control:!1},error:{description:`Текст внешней ошибки ручного поля.`,control:`text`},onClearError:{description:`Сбрасывает внешнюю ошибку после ввода или выбора.`,control:!1},minDate:{description:`Минимально доступная дата ручного диапазона.`,control:`date`},maxDate:{description:`Максимально доступная дата ручного диапазона.`,control:`date`},datePreset:{description:`Пресет форматирования выбранного ручного диапазона.`,control:`text`},datePickerLevel:{description:`Минимальный уровень навигации календаря ручного поля.`,control:`select`,options:[`day`,`month`,`year`]},selectionMode:{description:`Размер периода, который выбирает ручное поле.`,control:`select`,options:i},weekEndDay:{description:`Последний включённый день недели в режиме week.`,control:`select`,options:r},allowSelectionModeChange:{description:`Показывает runtime-переключатель размера периода.`,control:`boolean`},selectionModeOptions:{description:`Ограничивает доступные режимы в runtime-переключателе.`,control:`check`,options:i},onSelectionModeChange:{description:`Вызывается при runtime-смене размера периода.`,control:!1},disabled:{description:"Блокирует ручное поле и, если `presetDisabled` не задан, быстрый выбор.",control:`boolean`},size:{description:`Размер обоих полей.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]}}},b=d((e,t)=>(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(l,{gap:`sm`,align:`end`,children:(0,_.jsx)(h,{...e,value:e.value??null,onChange:n=>{e.onChange(n),t({value:n})},onPresetIdChange:n=>{e.onPresetIdChange?.(n),t({presetId:n})},onSelectionModeChange:n=>{e.onSelectionModeChange?.(n),t({selectionMode:n})},onClearError:()=>{e.onClearError?.(),t({error:void 0})}})}),(0,_.jsxs)(s,{as:`p`,className:`marginBlockSm`,children:[`Активный presetId: `,(0,_.jsx)(s,{as:`code`,children:e.presetId??`null`})]})]})),x={render:b},x.parameters={...x.parameters,docs:{...x.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: renderPresetRangeDateInputStory
|
|
3
3
|
}`,...x.parameters?.docs?.source},description:{story:`Демонстрирует совместную работу пресета и ручного диапазона.`,...x.parameters?.docs?.description}}},S=[`Default`]})))()}export{g as n,C as r,x as t};
|
|
@@ -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-o7sH2IXC.js";import{n,t as r}from"./Select-G04B41FM.js";function i(e,t,n=[]){if(!Array.isArray(e))return[...n];let r=[];for(let n of e)!t(n)||r.includes(n)||r.push(n);return r}function a(e,t){let n=new Map(t.map(e=>[e.id,e])),r=[],i=new Set;for(let t of e){if(i.has(t))continue;let e=n.get(t);e&&(r.push(e),i.add(t))}return r}function o(e,t){return e?t.find(t=>t.id===e)??null:null}function s(){return(s=e((()=>{})))()}function c({options:e,value:t,onChange:n,getOptionDisabled:i,getOptionCode:a,getOptionAriaLabel:s,renderOption:c,renderValue:u,className:d,buttonClassName:f,optionsClassName:p,clearable:m,...h}){let g=o(t,e)??void 0;return(0,l.jsx)(r,{...h,options:e,value:g,onChange:e=>n(e?.id),getOptionKey:e=>e.id,getOptionLabel:e=>e.label,getOptionCode:a,getOptionDisabled:i,getOptionAriaLabel:s,renderOption:c,renderValue:u,className:d,buttonClassName:f,optionsClassName:p,clearable:m})}var l;function u(){return(u=e((()=>{n(),l=t(),c.__docgenInfo={description:"Базовый Select для пресетов с контрактом `id/label`.",methods:[],displayName:`PresetSelect`,props:{label:{required:!1,tsType:{name:`ReactNode`},description:``},description:{required:!1,tsType:{name:`string`},description:``},placeholder:{required:!1,tsType:{name:`string`},description:``},disabled:{required:!1,tsType:{name:`boolean`},description:``},size:{required:!1,tsType:{name:`union`,raw:`"xs" | "sm" | "md" | "lg" | "xl"`,elements:[{name:`literal`,value:`"xs"`},{name:`literal`,value:`"sm"`},{name:`literal`,value:`"md"`},{name:`literal`,value:`"lg"`},{name:`literal`,value:`"xl"`}]},description:``},value:{required:!0,tsType:{name:`V`},description:"Если начальное состояние может быть `null | undefined`\nзначит `onChange` тоже должен ументь сбрасывать.\nПоэтому такой контрол явно должен передавать `UiBaseProps<AnyType | undefined>`"},onChange:{required:!0,tsType:{name:`signature`,type:`function`,raw:`(value: T) => void`,signature:{arguments:[{type:{name:`C`},name:`value`}],return:{name:`void`}}},description:``},options:{required:!0,tsType:{name:`unknown`},description:``},getOptionDisabled:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => boolean`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`boolean`}}},description:``},getOptionCode:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => string`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`string`}}},description:``},getOptionAriaLabel:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption) => string`,signature:{arguments:[{type:{name:`TOption`},name:`option`}],return:{name:`string`}}},description:``},renderOption:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(option: TOption, state: SelectOptionState) => ReactNode`,signature:{arguments:[{type:{name:`TOption`},name:`option`},{type:{name:`signature`,type:`object`,raw:`{
|
|
2
2
|
active: boolean;
|
|
3
3
|
selected: boolean;
|
|
4
4
|
disabled: boolean;
|
|
@@ -0,0 +1,110 @@
|
|
|
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`,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/Range Output`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`подстановка-открытых-границ-через-ryuzaki13react-foundation-librange-output`,children:[`Подстановка открытых границ через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/range-output`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль хранит в UI открытые границы диапазона как `,(0,c.jsx)(t.code,{children:`null`}),`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.`]}),`
|
|
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`,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:`#%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82%D1%8B`,children:`Контракты`})}),`
|
|
9
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#readrangeoutputvaluefallback`,children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#resolverangeoutputvalue`,children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-boundary`,children:`Правильная boundary`})}),`
|
|
12
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#api-%D0%B8-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8`,children:`API и ошибки`})}),`
|
|
13
|
+
`]}),`
|
|
14
|
+
`,(0,c.jsx)(t.h2,{id:`назначение`,children:`Назначение`}),`
|
|
15
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`UI range [null, 6]
|
|
16
|
+
fallback { start: 0, end: 12 }
|
|
17
|
+
│
|
|
18
|
+
▼
|
|
19
|
+
external output [0, 6]
|
|
20
|
+
`})}),`
|
|
21
|
+
`,(0,c.jsxs)(t.p,{children:[`Исходное UI-значение не изменяется. `,(0,c.jsx)(t.code,{children:`null`}),` заменяется только при построении отдельного output tuple.`]}),`
|
|
22
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
23
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { readRangeOutputValueFallback, resolveRangeOutputValue } from "@ryuzaki13/react-foundation-lib/range-output";
|
|
24
|
+
|
|
25
|
+
import type { RangeOutputFallbackEndpointParser, RangeOutputValueFallback } from "@ryuzaki13/react-foundation-lib/range-output";
|
|
26
|
+
`})}),`
|
|
27
|
+
`,(0,c.jsx)(t.p,{children:`Модуль pure, не требует React/browser APIs.`}),`
|
|
28
|
+
`,(0,c.jsx)(t.h2,{id:`контракты`,children:`Контракты`}),`
|
|
29
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RangeOutputValueFallback<TValue extends BaseType> = {
|
|
30
|
+
start?: TValue | null;
|
|
31
|
+
end?: TValue | null;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type RangeOutputFallbackEndpointParser<TValue extends BaseType> = (value: unknown) => TValue | null | undefined;
|
|
35
|
+
`})}),`
|
|
36
|
+
`,(0,c.jsx)(t.p,{children:`Смысл результата parser:`}),`
|
|
37
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Результат parser`}),(0,c.jsx)(t.th,{children:`Что происходит`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`конкретное value`}),(0,c.jsx)(t.td,{children:`сохраняется как fallback`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})}),(0,c.jsx)(t.td,{children:`явная пустая fallback-граница`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`undefined`})}),(0,c.jsx)(t.td,{children:`поле отсутствует/невалидно и не входит в result`})]})]})]}),`
|
|
38
|
+
`,(0,c.jsx)(t.h2,{id:`readrangeoutputvaluefallback`,children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})}),`
|
|
39
|
+
`,(0,c.jsx)(t.p,{children:`Функция читает только форму:`}),`
|
|
40
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
|
|
41
|
+
outputValueFallback: {
|
|
42
|
+
start: unknown,
|
|
43
|
+
end: unknown
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
`})}),`
|
|
47
|
+
`,(0,c.jsx)(t.p,{children:`Пример числового parser:`}),`
|
|
48
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function parseFiniteNumber(value: unknown): number | undefined {
|
|
49
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
50
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const fallback = readRangeOutputValueFallback({ outputValueFallback: { start: "1", end: "bad" } }, parseFiniteNumber);
|
|
54
|
+
|
|
55
|
+
console.log(fallback); // { start: 1 }.
|
|
56
|
+
`})}),`
|
|
57
|
+
`,(0,c.jsxs)(t.p,{children:[`Функция возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, если:`]}),`
|
|
58
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
59
|
+
`,(0,c.jsxs)(t.li,{children:[`верхний `,(0,c.jsx)(t.code,{children:`props`}),` не object-like record;`]}),`
|
|
60
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`outputValueFallback`}),` не object-like record;`]}),`
|
|
61
|
+
`,(0,c.jsxs)(t.li,{children:[`оба parser-result равны `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
62
|
+
`]}),`
|
|
63
|
+
`,(0,c.jsxs)(t.p,{children:[`Parser вызывается отдельно для `,(0,c.jsx)(t.code,{children:`start`}),` и `,(0,c.jsx)(t.code,{children:`end`}),`, в том числе когда raw field отсутствует. Он не должен иметь side effects.`]}),`
|
|
64
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`isRecord`}),` здесь допускает не только plain object, но исключает arrays/null. Runtime schema конкретного значения полностью задаёт parser.`]}),`
|
|
65
|
+
`,(0,c.jsx)(t.h2,{id:`resolverangeoutputvalue`,children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})}),`
|
|
66
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveRangeOutputValue([null, 6], { start: 0, end: 12 });
|
|
67
|
+
// [0, 6].
|
|
68
|
+
|
|
69
|
+
resolveRangeOutputValue([3, null], { start: 0, end: 12 });
|
|
70
|
+
// [3, 12].
|
|
71
|
+
`})}),`
|
|
72
|
+
`,(0,c.jsx)(t.p,{children:`Правила для каждой позиции:`}),`
|
|
73
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
74
|
+
`,(0,c.jsxs)(t.li,{children:[`Если UI endpoint не `,(0,c.jsx)(t.code,{children:`null`}),`, он возвращается буквально.`]}),`
|
|
75
|
+
`,(0,c.jsxs)(t.li,{children:[`Если endpoint равен `,(0,c.jsx)(t.code,{children:`null`}),`, используется соответствующий fallback.`]}),`
|
|
76
|
+
`,(0,c.jsxs)(t.li,{children:[`Если fallback отсутствует или равен `,(0,c.jsx)(t.code,{children:`null`}),`, output остаётся `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
|
|
77
|
+
`]}),`
|
|
78
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveRangeOutputValue([null, null], { end: 12 });
|
|
79
|
+
// [null, 12].
|
|
80
|
+
|
|
81
|
+
resolveRangeOutputValue([null, null], undefined);
|
|
82
|
+
// [null, null].
|
|
83
|
+
`})}),`
|
|
84
|
+
`,(0,c.jsxs)(t.p,{children:[`Всегда создаётся новый tuple. Вложенные ссылочные `,(0,c.jsx)(t.code,{children:`Date`}),` не клонируются.`]}),`
|
|
85
|
+
`,(0,c.jsx)(t.h2,{id:`правильная-boundary`,children:`Правильная boundary`}),`
|
|
86
|
+
`,(0,c.jsx)(t.p,{children:`Helper специально отделяет UI draft и внешний snapshot:`}),`
|
|
87
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draftRange: readonly [number | null, number | null] = [null, 6];
|
|
88
|
+
|
|
89
|
+
function getConfig() {
|
|
90
|
+
return {
|
|
91
|
+
range: resolveRangeOutputValue(draftRange, outputFallback)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
`})}),`
|
|
95
|
+
`,(0,c.jsx)(t.p,{children:`Не записывайте output обратно в draft:`}),`
|
|
96
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`draft [null, 6] ───────────────► UI продолжает показывать открытую границу
|
|
97
|
+
│
|
|
98
|
+
└─ save boundary ───────► snapshot [0, 6]
|
|
99
|
+
`})}),`
|
|
100
|
+
`,(0,c.jsx)(t.p,{children:`Это output substitution, а не общая нормализация диапазона: порядок start/end, min/max и domain validation не проверяются.`}),`
|
|
101
|
+
`,(0,c.jsx)(t.h2,{id:`api-и-ошибки`,children:`API и ошибки`}),`
|
|
102
|
+
`,(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:`RangeOutputValueFallback`})}),(0,c.jsx)(t.td,{children:`Optional start/end fallback`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`RangeOutputFallbackEndpointParser`})}),(0,c.jsx)(t.td,{children:`Parser одного endpoint`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`readRangeOutputValueFallback`})}),(0,c.jsxs)(t.td,{children:[`Parsed fallback или `,(0,c.jsx)(t.code,{children:`undefined`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveRangeOutputValue`})}),(0,c.jsx)(t.td,{children:`Новый output tuple`})]})]})]}),`
|
|
103
|
+
`,(0,c.jsx)(t.p,{children:`Типичные ошибки:`}),`
|
|
104
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
105
|
+
`,(0,c.jsxs)(t.li,{children:[`Считать `,(0,c.jsx)(t.code,{children:`0`}),`, `,(0,c.jsx)(t.code,{children:`false`}),` или `,(0,c.jsx)(t.code,{children:`""`}),` отсутствующими: используется nullish logic, эти значения сохраняются.`]}),`
|
|
106
|
+
`,(0,c.jsxs)(t.li,{children:[`Передавать `,(0,c.jsx)(t.code,{children:`undefined`}),` как UI endpoint при generic `,(0,c.jsx)(t.code,{children:`TValue`}),`, включающем undefined: заменяется только строго `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
|
|
107
|
+
`,(0,c.jsx)(t.li,{children:`Мутировать draft результатом output resolver.`}),`
|
|
108
|
+
`,(0,c.jsx)(t.li,{children:`Ожидать, что helper поменяет местами границы или проверит диапазон.`}),`
|
|
109
|
+
`,(0,c.jsxs)(t.li,{children:[`Делать parser через unsafe cast внешнего `,(0,c.jsx)(t.code,{children:`unknown`}),`.`]}),`
|
|
110
|
+
`]})]})}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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/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:[`
|
|
@@ -0,0 +1,75 @@
|
|
|
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`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Forms/Form Errors`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`чтение-первой-ошибки-формы-через-ryuzaki13react-foundation-libform`,children:[`Чтение первой ошибки формы через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/form`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит одну функцию `,(0,c.jsx)(t.code,{children:`readFirstFormError`}),`. Она получает неоднородный массив ошибок и возвращает первое найденное текстовое сообщение.`]}),`
|
|
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 { readFirstFormError } from "@ryuzaki13/react-foundation-lib/form";
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.p,{children:`Модуль ESM, не зависит от React и не привязан к конкретной form library.`}),`
|
|
8
|
+
`,(0,c.jsx)(t.h2,{id:`поддерживаемые-формы-ошибки`,children:`Поддерживаемые формы ошибки`}),`
|
|
9
|
+
`,(0,c.jsx)(t.p,{children:`Функция понимает:`}),`
|
|
10
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:`Строку.`}),`
|
|
12
|
+
`,(0,c.jsxs)(t.li,{children:[`Объект с непустым строковым полем `,(0,c.jsx)(t.code,{children:`message`}),`.`]}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:`Вложенный массив таких значений.`}),`
|
|
14
|
+
`]}),`
|
|
15
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readFirstFormError([undefined, { message: "Поле обязательно" }]);
|
|
16
|
+
// "Поле обязательно".
|
|
17
|
+
|
|
18
|
+
readFirstFormError([[null, "Неверный формат"], "Другая ошибка"]);
|
|
19
|
+
// "Неверный формат".
|
|
20
|
+
`})}),`
|
|
21
|
+
`,(0,c.jsxs)(t.p,{children:[`Обычный `,(0,c.jsx)(t.code,{children:`Error`}),` также подходит, потому что имеет строковое поле `,(0,c.jsx)(t.code,{children:`message`}),`:`]}),`
|
|
22
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readFirstFormError([new Error("Ошибка проверки")]);
|
|
23
|
+
// "Ошибка проверки".
|
|
24
|
+
`})}),`
|
|
25
|
+
`,(0,c.jsx)(t.h2,{id:`алгоритм`,children:`Алгоритм`}),`
|
|
26
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`errors отсутствует ──► undefined
|
|
27
|
+
│
|
|
28
|
+
▼
|
|
29
|
+
обход слева направо
|
|
30
|
+
│
|
|
31
|
+
├─ string ─────────► вернуть строку
|
|
32
|
+
├─ array ──────────► рекурсивно найти первую строку
|
|
33
|
+
├─ { message } ────► вернуть непустой string message
|
|
34
|
+
└─ другое ─────────► пропустить
|
|
35
|
+
`})}),`
|
|
36
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const message = readFirstFormError(errors);
|
|
37
|
+
|
|
38
|
+
if (message) {
|
|
39
|
+
showFieldError(message);
|
|
40
|
+
}
|
|
41
|
+
`})}),`
|
|
42
|
+
`,(0,c.jsx)(t.h2,{id:`точные-правила`,children:`Точные правила`}),`
|
|
43
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
44
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`undefined`}),` вместо массива возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
45
|
+
`,(0,c.jsxs)(t.li,{children:[`Пустой массив возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
46
|
+
`,(0,c.jsx)(t.li,{children:`Поиск идёт в исходном порядке.`}),`
|
|
47
|
+
`,(0,c.jsx)(t.li,{children:`Пустая строка не является результатом и поиск продолжается.`}),`
|
|
48
|
+
`,(0,c.jsx)(t.li,{children:`Строка из пробелов считается непустой и возвращается буквально.`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.li,{children:[`Числа, boolean, functions, `,(0,c.jsx)(t.code,{children:`null`}),` и объекты без string `,(0,c.jsx)(t.code,{children:`message`}),` пропускаются.`]}),`
|
|
50
|
+
`,(0,c.jsx)(t.li,{children:`Массивы обходятся рекурсивно без ограничения глубины.`}),`
|
|
51
|
+
`,(0,c.jsx)(t.li,{children:`Входные массивы и objects не изменяются.`}),`
|
|
52
|
+
`]}),`
|
|
53
|
+
`,(0,c.jsx)(t.h2,{id:`пример-в-react`,children:`Пример в React`}),`
|
|
54
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`type FieldErrorProps = {
|
|
55
|
+
errors?: readonly unknown[];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export function FieldError({ errors }: FieldErrorProps) {
|
|
59
|
+
const message = readFirstFormError(errors);
|
|
60
|
+
|
|
61
|
+
return message ? <p role="alert">{message}</p> : null;
|
|
62
|
+
}
|
|
63
|
+
`})}),`
|
|
64
|
+
`,(0,c.jsx)(t.p,{children:`Для нескольких ошибок, summary списка, локализации и сопоставления ошибки конкретному field нужен отдельный form-layer host-приложения.`}),`
|
|
65
|
+
`,(0,c.jsx)(t.h2,{id:`ограничения-и-ошибки`,children:`Ограничения и ошибки`}),`
|
|
66
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
67
|
+
`,(0,c.jsx)(t.li,{children:`Функция не выполняет trim или перевод сообщений.`}),`
|
|
68
|
+
`,(0,c.jsx)(t.li,{children:`Она не проверяет schema form-library.`}),`
|
|
69
|
+
`,(0,c.jsx)(t.li,{children:`Возвращается только первое сообщение; остальные теряются для этого вызова.`}),`
|
|
70
|
+
`,(0,c.jsx)(t.li,{children:`Циклический массив приведёт к бесконечной рекурсии/ошибке call stack.`}),`
|
|
71
|
+
`,(0,c.jsx)(t.li,{children:`Не передавайте backend payload напрямую без runtime-проверки и безопасного отображения.`}),`
|
|
72
|
+
`]}),`
|
|
73
|
+
`,(0,c.jsx)(t.h2,{id:`api`,children:`API`}),`
|
|
74
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function readFirstFormError(errors: readonly unknown[] | undefined): string | undefined;
|
|
75
|
+
`})})]})}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,154 @@
|
|
|
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`,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/Validation/Runtime Guards`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`runtime-guards-и-validators-через-ryuzaki13react-foundation-libvalidators`,children:[`Runtime guards и validators через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/validators`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит небольшие проверки для `,(0,c.jsx)(t.code,{children:`unknown`}),`, object-like значений, image extensions, positive integer, URL и Floating UI DOM reference.`]}),`
|
|
4
|
+
`,(0,c.jsxs)(t.blockquote,{children:[`
|
|
5
|
+
`,(0,c.jsxs)(t.p,{children:[`Название функции не расширяет её контракт. Например, `,(0,c.jsx)(t.code,{children:`isSafe`}),` проверяет только отсутствие `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),`, а `,(0,c.jsx)(t.code,{children:`isRecord`}),` допускает `,(0,c.jsx)(t.code,{children:`Date`}),` и `,(0,c.jsx)(t.code,{children:`Map`}),`. Ниже указано точное поведение каждой проверки.`]}),`
|
|
6
|
+
`]}),`
|
|
7
|
+
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
8
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
9
|
+
`,(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:`Установка и импорт`})}),`
|
|
10
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BA%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%8E%D1%82-type-guards`,children:`Как работают type guards`})}),`
|
|
11
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#issafe`,children:(0,c.jsx)(t.code,{children:`isSafe`})})}),`
|
|
12
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsxs)(t.a,{href:`#isobject-isrecord-asrecord`,children:[(0,c.jsx)(t.code,{children:`isObject`}),`, `,(0,c.jsx)(t.code,{children:`isRecord`}),`, `,(0,c.jsx)(t.code,{children:`asRecord`})]})}),`
|
|
13
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#isplainobject`,children:(0,c.jsx)(t.code,{children:`isPlainObject`})})}),`
|
|
14
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#readpositiveinteger`,children:(0,c.jsx)(t.code,{children:`readPositiveInteger`})})}),`
|
|
15
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#image-extensions`,children:`Image extensions`})}),`
|
|
16
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#isdomreference`,children:(0,c.jsx)(t.code,{children:`isDomReference`})})}),`
|
|
17
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#validateurl`,children:(0,c.jsx)(t.code,{children:`validateUrl`})})}),`
|
|
18
|
+
`,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#security-boundary`,children:`Security boundary`})}),`
|
|
19
|
+
`,(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`})}),`
|
|
20
|
+
`]}),`
|
|
21
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
22
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
23
|
+
asRecord,
|
|
24
|
+
IMAGE_EXTENSIONS,
|
|
25
|
+
isDomReference,
|
|
26
|
+
isImageExtension,
|
|
27
|
+
isObject,
|
|
28
|
+
isPlainObject,
|
|
29
|
+
isRecord,
|
|
30
|
+
isSafe,
|
|
31
|
+
readPositiveInteger,
|
|
32
|
+
validateUrl
|
|
33
|
+
} from "@ryuzaki13/react-foundation-lib/validators";
|
|
34
|
+
`})}),`
|
|
35
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`isDomReference`}),` использует type из `,(0,c.jsx)(t.code,{children:`@floating-ui/react`}),`; host entrypoint должен разрешить совместимую peer dependency. Остальные функции не требуют React.`]}),`
|
|
36
|
+
`,(0,c.jsx)(t.h2,{id:`как-работают-type-guards`,children:`Как работают type guards`}),`
|
|
37
|
+
`,(0,c.jsx)(t.p,{children:`Type guard возвращает boolean и помогает TypeScript сузить значение:`}),`
|
|
38
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function readCode(value: unknown): string | undefined {
|
|
39
|
+
if (!isRecord(value)) return undefined;
|
|
40
|
+
return typeof value.code === "string" ? value.code : undefined;
|
|
41
|
+
}
|
|
42
|
+
`})}),`
|
|
43
|
+
`,(0,c.jsx)(t.p,{children:`Guard не преобразует значение и не гарантирует поля, которые сам не проверил.`}),`
|
|
44
|
+
`,(0,c.jsx)(t.h2,{id:`issafe`,children:(0,c.jsx)(t.code,{children:`isSafe`})}),`
|
|
45
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function isSafe<T>(value: T | null | undefined): value is T;
|
|
46
|
+
`})}),`
|
|
47
|
+
`,(0,c.jsxs)(t.p,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`false`}),` только для `,(0,c.jsx)(t.code,{children:`null`}),` и `,(0,c.jsx)(t.code,{children:`undefined`}),`:`]}),`
|
|
48
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`[0, "", false, null, undefined, "ok"].filter(isSafe);
|
|
49
|
+
// [0, "", false, "ok"].
|
|
50
|
+
`})}),`
|
|
51
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`0`}),`, пустая строка и `,(0,c.jsx)(t.code,{children:`false`}),` являются безопасными в смысле этой функции. `,(0,c.jsx)(t.code,{children:`isSafe`}),` не проверяет XSS, SQL, URL, число, object schema или authorization.`]}),`
|
|
52
|
+
`,(0,c.jsxs)(t.h2,{id:`isobject-isrecord-asrecord`,children:[(0,c.jsx)(t.code,{children:`isObject`}),`, `,(0,c.jsx)(t.code,{children:`isRecord`}),`, `,(0,c.jsx)(t.code,{children:`asRecord`})]}),`
|
|
53
|
+
`,(0,c.jsxs)(t.p,{children:[`Три функции используют одинаковую базовую проверку: значение truthy, `,(0,c.jsx)(t.code,{children:`typeof === "object"`}),`, не array.`]}),`
|
|
54
|
+
`,(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.jsxs)(t.th,{style:{textAlign:`center`},children:[(0,c.jsx)(t.code,{children:`isObject`}),` / `,(0,c.jsx)(t.code,{children:`isRecord`})]}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`asRecord`})})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`{}`})}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`тот же object`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`new Date()`})}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`тот же Date, типизированный как record`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`new Map()`})}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`тот же Map`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`DOM element`}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`true`})}),(0,c.jsx)(t.td,{children:`тот же element`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`[]`})}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`false`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`false`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{style:{textAlign:`center`},children:(0,c.jsx)(t.code,{children:`false`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})})]})]})]}),`
|
|
55
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`isObject`}),` сужает до `,(0,c.jsx)(t.code,{children:`object`}),`, `,(0,c.jsx)(t.code,{children:`isRecord`}),` — до `,(0,c.jsx)(t.code,{children:`Record<string, unknown>`}),`, `,(0,c.jsx)(t.code,{children:`asRecord`}),` возвращает record или `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
|
|
56
|
+
`,(0,c.jsx)(t.p,{children:`Они не проверяют plain object и не гарантируют JSON-compatible данные.`}),`
|
|
57
|
+
`,(0,c.jsx)(t.h2,{id:`isplainobject`,children:(0,c.jsx)(t.code,{children:`isPlainObject`})}),`
|
|
58
|
+
`,(0,c.jsxs)(t.p,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`true`}),`, только если prototype равен `,(0,c.jsx)(t.code,{children:`Object.prototype`}),` или `,(0,c.jsx)(t.code,{children:`null`}),`:`]}),`
|
|
59
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isPlainObject({}); // true.
|
|
60
|
+
isPlainObject(Object.create(null)); // true.
|
|
61
|
+
isPlainObject(new Date()); // false.
|
|
62
|
+
isPlainObject(new Map()); // false.
|
|
63
|
+
`})}),`
|
|
64
|
+
`,(0,c.jsxs)(t.p,{children:[`Сигнатура принимает `,(0,c.jsx)(t.code,{children:`object`}),`, поэтому сначала сузьте `,(0,c.jsx)(t.code,{children:`unknown`}),`:`]}),`
|
|
65
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`if (isObject(value) && isPlainObject(value)) {
|
|
66
|
+
// Plain record-like object.
|
|
67
|
+
}
|
|
68
|
+
`})}),`
|
|
69
|
+
`,(0,c.jsxs)(t.p,{children:[`Прямой runtime-вызов `,(0,c.jsx)(t.code,{children:`isPlainObject(null as never)`}),` приведёт к ошибке `,(0,c.jsx)(t.code,{children:`Object.getPrototypeOf`}),`. TypeScript contract запрещает такой аргумент.`]}),`
|
|
70
|
+
`,(0,c.jsx)(t.h2,{id:`readpositiveinteger`,children:(0,c.jsx)(t.code,{children:`readPositiveInteger`})}),`
|
|
71
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readPositiveInteger(12); // 12.
|
|
72
|
+
readPositiveInteger("12"); // 12.
|
|
73
|
+
readPositiveInteger(" 12 "); // 12.
|
|
74
|
+
readPositiveInteger(0); // undefined.
|
|
75
|
+
readPositiveInteger(-1); // undefined.
|
|
76
|
+
readPositiveInteger(1.5); // undefined.
|
|
77
|
+
readPositiveInteger("bad"); // undefined.
|
|
78
|
+
`})}),`
|
|
79
|
+
`,(0,c.jsxs)(t.p,{children:[`String преобразуется стандартным `,(0,c.jsx)(t.code,{children:`Number(value)`}),`, затем проверяются:`]}),`
|
|
80
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
81
|
+
`,(0,c.jsx)(t.li,{children:`runtime type number;`}),`
|
|
82
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Number.isInteger`}),`;`]}),`
|
|
83
|
+
`,(0,c.jsxs)(t.li,{children:[`значение строго больше `,(0,c.jsx)(t.code,{children:`0`}),`.`]}),`
|
|
84
|
+
`]}),`
|
|
85
|
+
`,(0,c.jsxs)(t.p,{children:[`Следствия стандартного `,(0,c.jsx)(t.code,{children:`Number`}),`:`]}),`
|
|
86
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`readPositiveInteger("1e2"); // 100.
|
|
87
|
+
readPositiveInteger("0x10"); // 16.
|
|
88
|
+
readPositiveInteger(""); // undefined, потому что Number("") = 0.
|
|
89
|
+
`})}),`
|
|
90
|
+
`,(0,c.jsx)(t.p,{children:`Если формат input должен быть только decimal digits, дополнительно проверьте строковую грамматику на своей boundary.`}),`
|
|
91
|
+
`,(0,c.jsx)(t.h2,{id:`image-extensions`,children:`Image extensions`}),`
|
|
92
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isImageExtension("PNG"); // true.
|
|
93
|
+
isImageExtension("svg"); // true.
|
|
94
|
+
isImageExtension("pdf"); // false.
|
|
95
|
+
`})}),`
|
|
96
|
+
`,(0,c.jsx)(t.p,{children:`Список:`}),`
|
|
97
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`["png", "jpg", "jpeg", "gif", "webp", "svg"];
|
|
98
|
+
`})}),`
|
|
99
|
+
`,(0,c.jsxs)(t.p,{children:[`Проверка регистронезависима через `,(0,c.jsx)(t.code,{children:`toLowerCase`}),`, но не делает trim и ожидает расширение без точки:`]}),`
|
|
100
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isImageExtension(".png"); // false.
|
|
101
|
+
isImageExtension(" png "); // false.
|
|
102
|
+
`})}),`
|
|
103
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`IMAGE_EXTENSIONS`}),` экспортирован как изменяемый array по текущему типу. Рассматривайте его как библиотечную константу и не вызывайте `,(0,c.jsx)(t.code,{children:`push/splice`}),`.`]}),`
|
|
104
|
+
`,(0,c.jsxs)(t.p,{children:[`Расширение имени не доказывает MIME/type и безопасность содержимого. Для file/image boundary используйте `,(0,c.jsx)(t.code,{children:`/file`}),` и server-side validation.`]}),`
|
|
105
|
+
`,(0,c.jsx)(t.h2,{id:`isdomreference`,children:(0,c.jsx)(t.code,{children:`isDomReference`})}),`
|
|
106
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`if (isDomReference(floatingReference)) {
|
|
107
|
+
floatingReference.focus();
|
|
108
|
+
}
|
|
109
|
+
`})}),`
|
|
110
|
+
`,(0,c.jsxs)(t.p,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`true`}),`, только если reference является browser `,(0,c.jsx)(t.code,{children:`Element`}),`. Virtual element Floating UI и `,(0,c.jsx)(t.code,{children:`null`}),` возвращают `,(0,c.jsx)(t.code,{children:`false`}),`.`]}),`
|
|
111
|
+
`,(0,c.jsxs)(t.p,{children:[`Функция выполняет `,(0,c.jsx)(t.code,{children:`ref instanceof Element`}),`. В server runtime без global `,(0,c.jsx)(t.code,{children:`Element`}),` её вызов может привести к `,(0,c.jsx)(t.code,{children:`ReferenceError`}),`; вызывайте только в browser boundary или после проверки DOM environment.`]}),`
|
|
112
|
+
`,(0,c.jsx)(t.h2,{id:`validateurl`,children:(0,c.jsx)(t.code,{children:`validateUrl`})}),`
|
|
113
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = validateUrl("https://example.com/path");
|
|
114
|
+
|
|
115
|
+
if (!result.isValid) {
|
|
116
|
+
showError(result.error);
|
|
117
|
+
}
|
|
118
|
+
`})}),`
|
|
119
|
+
`,(0,c.jsx)(t.p,{children:`Возможные результаты:`}),`
|
|
120
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{ isValid: true, error: "" }
|
|
121
|
+
{ isValid: false, error: "URL не может быть пустым" }
|
|
122
|
+
{ isValid: false, error: "URL слишком длинный" }
|
|
123
|
+
{ isValid: false, error: "URL содержит недопустимые символы" }
|
|
124
|
+
{ isValid: false, error: "Некорректный формат URL" }
|
|
125
|
+
`})}),`
|
|
126
|
+
`,(0,c.jsx)(t.p,{children:`Алгоритм:`}),`
|
|
127
|
+
`,(0,c.jsxs)(t.ol,{children:[`
|
|
128
|
+
`,(0,c.jsx)(t.li,{children:`Отклоняет пустую строку.`}),`
|
|
129
|
+
`,(0,c.jsxs)(t.li,{children:[`Если строка не начинается с lowercase `,(0,c.jsx)(t.code,{children:`http`}),`, временно добавляет `,(0,c.jsx)(t.code,{children:`https://`}),` для `,(0,c.jsx)(t.code,{children:`new URL`}),`.`]}),`
|
|
130
|
+
`,(0,c.jsxs)(t.li,{children:[`Проверяет длину исходной строки не больше `,(0,c.jsx)(t.code,{children:`2048`}),`.`]}),`
|
|
131
|
+
`,(0,c.jsx)(t.li,{children:`Применяет консервативное регулярное выражение.`}),`
|
|
132
|
+
`]}),`
|
|
133
|
+
`,(0,c.jsx)(t.p,{children:`Поддерживаемая грамматика намеренно узкая:`}),`
|
|
134
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
135
|
+
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`http://`}),` или `,(0,c.jsx)(t.code,{children:`https://`}),`;`]}),`
|
|
136
|
+
`,(0,c.jsx)(t.li,{children:`domain с точкой;`}),`
|
|
137
|
+
`,(0,c.jsx)(t.li,{children:`lowercase TLD длиной 2–6 по regex;`}),`
|
|
138
|
+
`,(0,c.jsx)(t.li,{children:`простой path из ограниченного набора символов.`}),`
|
|
139
|
+
`]}),`
|
|
140
|
+
`,(0,c.jsx)(t.p,{children:`Query string, hash, port, localhost, IP-адреса, internationalized domains, многие валидные Unicode/path characters и длинные современные TLD могут быть отклонены.`}),`
|
|
141
|
+
`,(0,c.jsx)(t.h2,{id:`security-boundary`,children:`Security boundary`}),`
|
|
142
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`validateUrl`}),` — UI-проверка формата, не security policy. Она не:`]}),`
|
|
143
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
144
|
+
`,(0,c.jsx)(t.li,{children:`проверяет allowlist host/protocol;`}),`
|
|
145
|
+
`,(0,c.jsx)(t.li,{children:`делает DNS resolution;`}),`
|
|
146
|
+
`,(0,c.jsx)(t.li,{children:`защищает backend от SSRF;`}),`
|
|
147
|
+
`,(0,c.jsx)(t.li,{children:`гарантирует отсутствие redirect на опасный host;`}),`
|
|
148
|
+
`,(0,c.jsx)(t.li,{children:`проверяет доступность ресурса;`}),`
|
|
149
|
+
`,(0,c.jsx)(t.li,{children:`санитизирует HTML;`}),`
|
|
150
|
+
`,(0,c.jsx)(t.li,{children:`подтверждает, что URL ведёт на изображение.`}),`
|
|
151
|
+
`]}),`
|
|
152
|
+
`,(0,c.jsx)(t.p,{children:`Для внешней навигации/запроса применяйте отдельную security policy владельца boundary.`}),`
|
|
153
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
154
|
+
`,(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:`isSafe`})}),(0,c.jsxs)(t.td,{children:[`Исключает `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isObject`})}),(0,c.jsx)(t.td,{children:`Non-array truthy object`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isRecord`})}),(0,c.jsx)(t.td,{children:`Та же runtime-проверка с record type`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`asRecord`})}),(0,c.jsxs)(t.td,{children:[`Record или `,(0,c.jsx)(t.code,{children:`null`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isPlainObject`})}),(0,c.jsx)(t.td,{children:`Проверяет prototype`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`readPositiveInteger`})}),(0,c.jsxs)(t.td,{children:[`Positive integer number или `,(0,c.jsx)(t.code,{children:`undefined`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`IMAGE_EXTENSIONS`})}),(0,c.jsx)(t.td,{children:`Список поддерживаемых extensions`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isImageExtension`})}),(0,c.jsx)(t.td,{children:`Регистронезависимая проверка extension`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isDomReference`})}),(0,c.jsxs)(t.td,{children:[`Floating reference является `,(0,c.jsx)(t.code,{children:`Element`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`validateUrl`})}),(0,c.jsx)(t.td,{children:`Консервативный UI URL result`})]})]})]})]})}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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Binary`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`работа-с-бинарными-данными-через-ryuzaki13react-foundation-libbinary`,children:[`Работа с бинарными данными через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/binary`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`binary`}),` преобразует строковое бинарное содержимое в браузерный `,(0,c.jsx)(t.code,{children:`Blob`}),`, определяет предполагаемый MIME-тип документа и предоставляет React hook для типового сценария «base64 → `,(0,c.jsx)(t.code,{children:`{ blob, mime }`}),`».`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Основной сценарий:`}),`
|