@uifn/core 0.0.1
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/CHANGELOG.md +8 -0
- package/README.md +46 -0
- package/dist/aria/index.d.mts +1 -0
- package/dist/aria/index.d.ts +1 -0
- package/dist/aria/index.js +13 -0
- package/dist/aria/index.js.map +1 -0
- package/dist/aria/index.mjs +4 -0
- package/dist/aria/index.mjs.map +1 -0
- package/dist/aria/keys.d.mts +17 -0
- package/dist/aria/keys.d.ts +17 -0
- package/dist/aria/keys.js +12 -0
- package/dist/aria/keys.js.map +1 -0
- package/dist/aria/keys.mjs +3 -0
- package/dist/aria/keys.mjs.map +1 -0
- package/dist/chunk-2HLCA7I5.mjs +42 -0
- package/dist/chunk-2HLCA7I5.mjs.map +1 -0
- package/dist/chunk-2S7OX5K7.mjs +143 -0
- package/dist/chunk-2S7OX5K7.mjs.map +1 -0
- package/dist/chunk-2ZNFHW2P.js +125 -0
- package/dist/chunk-2ZNFHW2P.js.map +1 -0
- package/dist/chunk-3DNFBRAZ.mjs +49 -0
- package/dist/chunk-3DNFBRAZ.mjs.map +1 -0
- package/dist/chunk-3U3PAOFD.mjs +3 -0
- package/dist/chunk-3U3PAOFD.mjs.map +1 -0
- package/dist/chunk-4J6CNDHI.js +109 -0
- package/dist/chunk-4J6CNDHI.js.map +1 -0
- package/dist/chunk-4KISNBSY.mjs +403 -0
- package/dist/chunk-4KISNBSY.mjs.map +1 -0
- package/dist/chunk-4QGZXLQV.js +13 -0
- package/dist/chunk-4QGZXLQV.js.map +1 -0
- package/dist/chunk-4YPFHTID.js +136 -0
- package/dist/chunk-4YPFHTID.js.map +1 -0
- package/dist/chunk-5C57AF3A.js +247 -0
- package/dist/chunk-5C57AF3A.js.map +1 -0
- package/dist/chunk-5DK6IIIL.mjs +209 -0
- package/dist/chunk-5DK6IIIL.mjs.map +1 -0
- package/dist/chunk-6RG3QJLI.mjs +347 -0
- package/dist/chunk-6RG3QJLI.mjs.map +1 -0
- package/dist/chunk-6Y53W77O.mjs +101 -0
- package/dist/chunk-6Y53W77O.mjs.map +1 -0
- package/dist/chunk-75SPLZPF.js +192 -0
- package/dist/chunk-75SPLZPF.js.map +1 -0
- package/dist/chunk-7OJWGNKW.js +211 -0
- package/dist/chunk-7OJWGNKW.js.map +1 -0
- package/dist/chunk-7PJQFLC4.mjs +107 -0
- package/dist/chunk-7PJQFLC4.mjs.map +1 -0
- package/dist/chunk-A662QRP2.js +63 -0
- package/dist/chunk-A662QRP2.js.map +1 -0
- package/dist/chunk-AAUYPAHO.js +4 -0
- package/dist/chunk-AAUYPAHO.js.map +1 -0
- package/dist/chunk-ACCONS6L.mjs +245 -0
- package/dist/chunk-ACCONS6L.mjs.map +1 -0
- package/dist/chunk-ARTLWFX3.js +51 -0
- package/dist/chunk-ARTLWFX3.js.map +1 -0
- package/dist/chunk-B2LLTIQ3.js +27 -0
- package/dist/chunk-B2LLTIQ3.js.map +1 -0
- package/dist/chunk-BFYV3H52.mjs +236 -0
- package/dist/chunk-BFYV3H52.mjs.map +1 -0
- package/dist/chunk-BIIT67Q2.mjs +377 -0
- package/dist/chunk-BIIT67Q2.mjs.map +1 -0
- package/dist/chunk-CH6WMHOM.mjs +216 -0
- package/dist/chunk-CH6WMHOM.mjs.map +1 -0
- package/dist/chunk-CIAQQ7JN.js +209 -0
- package/dist/chunk-CIAQQ7JN.js.map +1 -0
- package/dist/chunk-CMK53PYC.mjs +125 -0
- package/dist/chunk-CMK53PYC.mjs.map +1 -0
- package/dist/chunk-CQIXWQ3S.js +59 -0
- package/dist/chunk-CQIXWQ3S.js.map +1 -0
- package/dist/chunk-DB2757V5.mjs +3 -0
- package/dist/chunk-DB2757V5.mjs.map +1 -0
- package/dist/chunk-DJ2J36FP.js +44 -0
- package/dist/chunk-DJ2J36FP.js.map +1 -0
- package/dist/chunk-EKEJS6NR.js +4 -0
- package/dist/chunk-EKEJS6NR.js.map +1 -0
- package/dist/chunk-EKMJ2G7A.js +149 -0
- package/dist/chunk-EKMJ2G7A.js.map +1 -0
- package/dist/chunk-EXE4FKQZ.js +349 -0
- package/dist/chunk-EXE4FKQZ.js.map +1 -0
- package/dist/chunk-FXWTTAZE.mjs +155 -0
- package/dist/chunk-FXWTTAZE.mjs.map +1 -0
- package/dist/chunk-GBZEXGFI.mjs +261 -0
- package/dist/chunk-GBZEXGFI.mjs.map +1 -0
- package/dist/chunk-HFNYFUZ3.mjs +207 -0
- package/dist/chunk-HFNYFUZ3.mjs.map +1 -0
- package/dist/chunk-HTTKRX7S.mjs +139 -0
- package/dist/chunk-HTTKRX7S.mjs.map +1 -0
- package/dist/chunk-II5OGIRE.mjs +179 -0
- package/dist/chunk-II5OGIRE.mjs.map +1 -0
- package/dist/chunk-JBMGXJ55.js +136 -0
- package/dist/chunk-JBMGXJ55.js.map +1 -0
- package/dist/chunk-K3WYDUIN.js +60 -0
- package/dist/chunk-K3WYDUIN.js.map +1 -0
- package/dist/chunk-K626K7M2.mjs +3 -0
- package/dist/chunk-K626K7M2.mjs.map +1 -0
- package/dist/chunk-KUFZSXA5.js +149 -0
- package/dist/chunk-KUFZSXA5.js.map +1 -0
- package/dist/chunk-KW66AOEN.mjs +134 -0
- package/dist/chunk-KW66AOEN.mjs.map +1 -0
- package/dist/chunk-L67UQEPI.js +98 -0
- package/dist/chunk-L67UQEPI.js.map +1 -0
- package/dist/chunk-LJHGAEQO.mjs +243 -0
- package/dist/chunk-LJHGAEQO.mjs.map +1 -0
- package/dist/chunk-LNJ2UKA3.mjs +54 -0
- package/dist/chunk-LNJ2UKA3.mjs.map +1 -0
- package/dist/chunk-LYO42ETL.mjs +147 -0
- package/dist/chunk-LYO42ETL.mjs.map +1 -0
- package/dist/chunk-LZYTPMPO.js +174 -0
- package/dist/chunk-LZYTPMPO.js.map +1 -0
- package/dist/chunk-N4UTITU6.mjs +61 -0
- package/dist/chunk-N4UTITU6.mjs.map +1 -0
- package/dist/chunk-O5IWF7DZ.js +238 -0
- package/dist/chunk-O5IWF7DZ.js.map +1 -0
- package/dist/chunk-OLT6LMNW.js +4 -0
- package/dist/chunk-OLT6LMNW.js.map +1 -0
- package/dist/chunk-ONDX6FX7.js +225 -0
- package/dist/chunk-ONDX6FX7.js.map +1 -0
- package/dist/chunk-PMZEYBN3.mjs +167 -0
- package/dist/chunk-PMZEYBN3.mjs.map +1 -0
- package/dist/chunk-QHZXEKPJ.mjs +123 -0
- package/dist/chunk-QHZXEKPJ.mjs.map +1 -0
- package/dist/chunk-QT3WNPTI.js +157 -0
- package/dist/chunk-QT3WNPTI.js.map +1 -0
- package/dist/chunk-RFARH4U4.js +105 -0
- package/dist/chunk-RFARH4U4.js.map +1 -0
- package/dist/chunk-RISAMVRI.mjs +3 -0
- package/dist/chunk-RISAMVRI.mjs.map +1 -0
- package/dist/chunk-RIUSFFXM.mjs +34 -0
- package/dist/chunk-RIUSFFXM.mjs.map +1 -0
- package/dist/chunk-RK5FMDPE.mjs +172 -0
- package/dist/chunk-RK5FMDPE.mjs.map +1 -0
- package/dist/chunk-RMSI52UT.js +263 -0
- package/dist/chunk-RMSI52UT.js.map +1 -0
- package/dist/chunk-RPH4AAZZ.mjs +94 -0
- package/dist/chunk-RPH4AAZZ.mjs.map +1 -0
- package/dist/chunk-RR4UBSEY.js +128 -0
- package/dist/chunk-RR4UBSEY.js.map +1 -0
- package/dist/chunk-T5JIC6TN.js +36 -0
- package/dist/chunk-T5JIC6TN.js.map +1 -0
- package/dist/chunk-TC53AKSZ.mjs +11 -0
- package/dist/chunk-TC53AKSZ.mjs.map +1 -0
- package/dist/chunk-TWTQ2Y7N.mjs +254 -0
- package/dist/chunk-TWTQ2Y7N.mjs.map +1 -0
- package/dist/chunk-TXH2KTET.js +256 -0
- package/dist/chunk-TXH2KTET.js.map +1 -0
- package/dist/chunk-U7PMCTVQ.js +4 -0
- package/dist/chunk-U7PMCTVQ.js.map +1 -0
- package/dist/chunk-UCVUVOZA.mjs +57 -0
- package/dist/chunk-UCVUVOZA.mjs.map +1 -0
- package/dist/chunk-UF33V3RN.mjs +130 -0
- package/dist/chunk-UF33V3RN.mjs.map +1 -0
- package/dist/chunk-UJI3VD2G.mjs +19 -0
- package/dist/chunk-UJI3VD2G.mjs.map +1 -0
- package/dist/chunk-UYK6N72M.js +169 -0
- package/dist/chunk-UYK6N72M.js.map +1 -0
- package/dist/chunk-VIEGALP5.js +46 -0
- package/dist/chunk-VIEGALP5.js.map +1 -0
- package/dist/chunk-W3EUJ2EQ.mjs +132 -0
- package/dist/chunk-W3EUJ2EQ.mjs.map +1 -0
- package/dist/chunk-WEMPFMHX.js +379 -0
- package/dist/chunk-WEMPFMHX.js.map +1 -0
- package/dist/chunk-WJKHFUXF.js +245 -0
- package/dist/chunk-WJKHFUXF.js.map +1 -0
- package/dist/chunk-WV2D7BZS.js +221 -0
- package/dist/chunk-WV2D7BZS.js.map +1 -0
- package/dist/chunk-YUHQTWI5.js +145 -0
- package/dist/chunk-YUHQTWI5.js.map +1 -0
- package/dist/chunk-Z4Q2AFMC.js +21 -0
- package/dist/chunk-Z4Q2AFMC.js.map +1 -0
- package/dist/chunk-ZBIA3D6U.js +137 -0
- package/dist/chunk-ZBIA3D6U.js.map +1 -0
- package/dist/chunk-ZGNMHRPN.mjs +25 -0
- package/dist/chunk-ZGNMHRPN.mjs.map +1 -0
- package/dist/chunk-ZL6VCAWV.mjs +223 -0
- package/dist/chunk-ZL6VCAWV.mjs.map +1 -0
- package/dist/chunk-ZMGHFIKQ.mjs +43 -0
- package/dist/chunk-ZMGHFIKQ.mjs.map +1 -0
- package/dist/chunk-ZWRLJ63J.js +405 -0
- package/dist/chunk-ZWRLJ63J.js.map +1 -0
- package/dist/errors.d.mts +45 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.mjs +3 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/index.d.mts +37 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +332 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +43 -0
- package/dist/index.mjs.map +1 -0
- package/dist/primitives/accordion.d.mts +44 -0
- package/dist/primitives/accordion.d.ts +44 -0
- package/dist/primitives/accordion.js +17 -0
- package/dist/primitives/accordion.js.map +1 -0
- package/dist/primitives/accordion.mjs +8 -0
- package/dist/primitives/accordion.mjs.map +1 -0
- package/dist/primitives/alert-dialog.d.mts +19 -0
- package/dist/primitives/alert-dialog.d.ts +19 -0
- package/dist/primitives/alert-dialog.js +19 -0
- package/dist/primitives/alert-dialog.js.map +1 -0
- package/dist/primitives/alert-dialog.mjs +10 -0
- package/dist/primitives/alert-dialog.mjs.map +1 -0
- package/dist/primitives/avatar.d.mts +17 -0
- package/dist/primitives/avatar.d.ts +17 -0
- package/dist/primitives/avatar.js +12 -0
- package/dist/primitives/avatar.js.map +1 -0
- package/dist/primitives/avatar.mjs +3 -0
- package/dist/primitives/avatar.mjs.map +1 -0
- package/dist/primitives/checkbox.d.mts +41 -0
- package/dist/primitives/checkbox.d.ts +41 -0
- package/dist/primitives/checkbox.js +16 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/checkbox.mjs +7 -0
- package/dist/primitives/checkbox.mjs.map +1 -0
- package/dist/primitives/collapsible.d.mts +42 -0
- package/dist/primitives/collapsible.d.ts +42 -0
- package/dist/primitives/collapsible.js +19 -0
- package/dist/primitives/collapsible.js.map +1 -0
- package/dist/primitives/collapsible.mjs +6 -0
- package/dist/primitives/collapsible.mjs.map +1 -0
- package/dist/primitives/combobox.d.mts +83 -0
- package/dist/primitives/combobox.d.ts +83 -0
- package/dist/primitives/combobox.js +18 -0
- package/dist/primitives/combobox.js.map +1 -0
- package/dist/primitives/combobox.mjs +9 -0
- package/dist/primitives/combobox.mjs.map +1 -0
- package/dist/primitives/context-menu.d.mts +48 -0
- package/dist/primitives/context-menu.d.ts +48 -0
- package/dist/primitives/context-menu.js +19 -0
- package/dist/primitives/context-menu.js.map +1 -0
- package/dist/primitives/context-menu.mjs +10 -0
- package/dist/primitives/context-menu.mjs.map +1 -0
- package/dist/primitives/dialog.d.mts +69 -0
- package/dist/primitives/dialog.d.ts +69 -0
- package/dist/primitives/dialog.js +18 -0
- package/dist/primitives/dialog.js.map +1 -0
- package/dist/primitives/dialog.mjs +9 -0
- package/dist/primitives/dialog.mjs.map +1 -0
- package/dist/primitives/dropdown-menu.d.mts +66 -0
- package/dist/primitives/dropdown-menu.d.ts +66 -0
- package/dist/primitives/dropdown-menu.js +18 -0
- package/dist/primitives/dropdown-menu.js.map +1 -0
- package/dist/primitives/dropdown-menu.mjs +9 -0
- package/dist/primitives/dropdown-menu.mjs.map +1 -0
- package/dist/primitives/hover-card.d.mts +73 -0
- package/dist/primitives/hover-card.d.ts +73 -0
- package/dist/primitives/hover-card.js +18 -0
- package/dist/primitives/hover-card.js.map +1 -0
- package/dist/primitives/hover-card.mjs +9 -0
- package/dist/primitives/hover-card.mjs.map +1 -0
- package/dist/primitives/index.d.mts +28 -0
- package/dist/primitives/index.d.ts +28 -0
- package/dist/primitives/index.js +146 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/index.mjs +37 -0
- package/dist/primitives/index.mjs.map +1 -0
- package/dist/primitives/menu-bar.d.mts +39 -0
- package/dist/primitives/menu-bar.d.ts +39 -0
- package/dist/primitives/menu-bar.js +16 -0
- package/dist/primitives/menu-bar.js.map +1 -0
- package/dist/primitives/menu-bar.mjs +7 -0
- package/dist/primitives/menu-bar.mjs.map +1 -0
- package/dist/primitives/popover.d.mts +89 -0
- package/dist/primitives/popover.d.ts +89 -0
- package/dist/primitives/popover.js +20 -0
- package/dist/primitives/popover.js.map +1 -0
- package/dist/primitives/popover.mjs +11 -0
- package/dist/primitives/popover.mjs.map +1 -0
- package/dist/primitives/progress.d.mts +28 -0
- package/dist/primitives/progress.d.ts +28 -0
- package/dist/primitives/progress.js +13 -0
- package/dist/primitives/progress.js.map +1 -0
- package/dist/primitives/progress.mjs +4 -0
- package/dist/primitives/progress.mjs.map +1 -0
- package/dist/primitives/radio-group.d.mts +45 -0
- package/dist/primitives/radio-group.d.ts +45 -0
- package/dist/primitives/radio-group.js +17 -0
- package/dist/primitives/radio-group.js.map +1 -0
- package/dist/primitives/radio-group.mjs +8 -0
- package/dist/primitives/radio-group.mjs.map +1 -0
- package/dist/primitives/scroll-area.d.mts +53 -0
- package/dist/primitives/scroll-area.d.ts +53 -0
- package/dist/primitives/scroll-area.js +14 -0
- package/dist/primitives/scroll-area.js.map +1 -0
- package/dist/primitives/scroll-area.mjs +5 -0
- package/dist/primitives/scroll-area.mjs.map +1 -0
- package/dist/primitives/select.d.mts +78 -0
- package/dist/primitives/select.d.ts +78 -0
- package/dist/primitives/select.js +18 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/select.mjs +9 -0
- package/dist/primitives/select.mjs.map +1 -0
- package/dist/primitives/separator.d.mts +16 -0
- package/dist/primitives/separator.d.ts +16 -0
- package/dist/primitives/separator.js +12 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/separator.mjs +3 -0
- package/dist/primitives/separator.mjs.map +1 -0
- package/dist/primitives/slider.d.mts +46 -0
- package/dist/primitives/slider.d.ts +46 -0
- package/dist/primitives/slider.js +15 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/slider.mjs +6 -0
- package/dist/primitives/slider.mjs.map +1 -0
- package/dist/primitives/switch.d.mts +41 -0
- package/dist/primitives/switch.d.ts +41 -0
- package/dist/primitives/switch.js +16 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/switch.mjs +7 -0
- package/dist/primitives/switch.mjs.map +1 -0
- package/dist/primitives/tabs.d.mts +44 -0
- package/dist/primitives/tabs.d.ts +44 -0
- package/dist/primitives/tabs.js +17 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/tabs.mjs +8 -0
- package/dist/primitives/tabs.mjs.map +1 -0
- package/dist/primitives/toast.d.mts +24 -0
- package/dist/primitives/toast.d.ts +24 -0
- package/dist/primitives/toast.js +12 -0
- package/dist/primitives/toast.js.map +1 -0
- package/dist/primitives/toast.mjs +3 -0
- package/dist/primitives/toast.mjs.map +1 -0
- package/dist/primitives/toggle-group.d.mts +42 -0
- package/dist/primitives/toggle-group.d.ts +42 -0
- package/dist/primitives/toggle-group.js +16 -0
- package/dist/primitives/toggle-group.js.map +1 -0
- package/dist/primitives/toggle-group.mjs +7 -0
- package/dist/primitives/toggle-group.mjs.map +1 -0
- package/dist/primitives/toggle.d.mts +30 -0
- package/dist/primitives/toggle.d.ts +30 -0
- package/dist/primitives/toggle.js +15 -0
- package/dist/primitives/toggle.js.map +1 -0
- package/dist/primitives/toggle.mjs +6 -0
- package/dist/primitives/toggle.mjs.map +1 -0
- package/dist/primitives/toolbar.d.mts +34 -0
- package/dist/primitives/toolbar.d.ts +34 -0
- package/dist/primitives/toolbar.js +16 -0
- package/dist/primitives/toolbar.js.map +1 -0
- package/dist/primitives/toolbar.mjs +7 -0
- package/dist/primitives/toolbar.mjs.map +1 -0
- package/dist/primitives/tooltip.d.mts +63 -0
- package/dist/primitives/tooltip.d.ts +63 -0
- package/dist/primitives/tooltip.js +16 -0
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/primitives/tooltip.mjs +7 -0
- package/dist/primitives/tooltip.mjs.map +1 -0
- package/dist/shared-Sdeyo6Vu.d.mts +10 -0
- package/dist/shared-Sdeyo6Vu.d.ts +10 -0
- package/dist/state/index.d.mts +1 -0
- package/dist/state/index.d.ts +1 -0
- package/dist/state/index.js +21 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +4 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/state/machine.d.mts +62 -0
- package/dist/state/machine.d.ts +62 -0
- package/dist/state/machine.js +20 -0
- package/dist/state/machine.js.map +1 -0
- package/dist/state/machine.mjs +3 -0
- package/dist/state/machine.mjs.map +1 -0
- package/dist/utils/escape-key.d.mts +12 -0
- package/dist/utils/escape-key.d.ts +12 -0
- package/dist/utils/escape-key.js +13 -0
- package/dist/utils/escape-key.js.map +1 -0
- package/dist/utils/escape-key.mjs +4 -0
- package/dist/utils/escape-key.mjs.map +1 -0
- package/dist/utils/focus-trap.d.mts +39 -0
- package/dist/utils/focus-trap.d.ts +39 -0
- package/dist/utils/focus-trap.js +25 -0
- package/dist/utils/focus-trap.js.map +1 -0
- package/dist/utils/focus-trap.mjs +4 -0
- package/dist/utils/focus-trap.mjs.map +1 -0
- package/dist/utils/id.d.mts +54 -0
- package/dist/utils/id.d.ts +54 -0
- package/dist/utils/id.js +57 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.mjs +4 -0
- package/dist/utils/id.mjs.map +1 -0
- package/dist/utils/index.d.mts +9 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +147 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +14 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/outside-click.d.mts +15 -0
- package/dist/utils/outside-click.d.ts +15 -0
- package/dist/utils/outside-click.js +12 -0
- package/dist/utils/outside-click.js.map +1 -0
- package/dist/utils/outside-click.mjs +3 -0
- package/dist/utils/outside-click.mjs.map +1 -0
- package/dist/utils/portal.d.mts +10 -0
- package/dist/utils/portal.d.ts +10 -0
- package/dist/utils/portal.js +16 -0
- package/dist/utils/portal.js.map +1 -0
- package/dist/utils/portal.mjs +3 -0
- package/dist/utils/portal.mjs.map +1 -0
- package/dist/utils/position.d.mts +46 -0
- package/dist/utils/position.d.ts +46 -0
- package/dist/utils/position.js +25 -0
- package/dist/utils/position.js.map +1 -0
- package/dist/utils/position.mjs +4 -0
- package/dist/utils/position.mjs.map +1 -0
- package/dist/utils/presence.d.mts +40 -0
- package/dist/utils/presence.d.ts +40 -0
- package/dist/utils/presence.js +28 -0
- package/dist/utils/presence.js.map +1 -0
- package/dist/utils/presence.mjs +3 -0
- package/dist/utils/presence.mjs.map +1 -0
- package/dist/utils/roving-focus.d.mts +27 -0
- package/dist/utils/roving-focus.d.ts +27 -0
- package/dist/utils/roving-focus.js +21 -0
- package/dist/utils/roving-focus.js.map +1 -0
- package/dist/utils/roving-focus.mjs +4 -0
- package/dist/utils/roving-focus.mjs.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var CANONICAL_UIFN_ERROR_CODES = [
|
|
3
|
+
"UIFN_ERR_A11Y_GATE_FAILURE",
|
|
4
|
+
"UIFN_ERR_CONTEXT_MISSING",
|
|
5
|
+
"UIFN_ERR_CONTROLLED_STATE_DIVERGENCE",
|
|
6
|
+
"UIFN_ERR_DETERMINISTIC_ID_MISMATCH",
|
|
7
|
+
"UIFN_ERR_DOCS_DRIFT",
|
|
8
|
+
"UIFN_ERR_DUPLICATE_PUBLIC_ID",
|
|
9
|
+
"UIFN_ERR_EXPORT_SURFACE_MISMATCH",
|
|
10
|
+
"UIFN_ERR_FILES_SCOPE_DRIFT",
|
|
11
|
+
"UIFN_ERR_HYDRATION_MISMATCH",
|
|
12
|
+
"UIFN_ERR_INVALID_VALUE",
|
|
13
|
+
"UIFN_ERR_MANUAL_EVIDENCE_INVALID",
|
|
14
|
+
"UIFN_ERR_MENU_NAVIGATION",
|
|
15
|
+
"UIFN_ERR_PACK_ARTIFACT_LEAK",
|
|
16
|
+
"UIFN_ERR_POSITIONING_OVERFLOW",
|
|
17
|
+
"UIFN_ERR_PUBLIC_SURFACE_DRIFT",
|
|
18
|
+
"UIFN_ERR_RANGE_OUT_OF_BOUNDS",
|
|
19
|
+
"UIFN_ERR_SCROLL_SYNC",
|
|
20
|
+
"UIFN_ERR_TEST_MATRIX_GAP",
|
|
21
|
+
"UIFN_ERR_TOOLCHAIN_MISCONFIG",
|
|
22
|
+
"UIFN_ERR_UNSUPPORTED_ENVIRONMENT",
|
|
23
|
+
"UIFN_ERR_UNSUPPORTED_PUBLIC_CLAIM",
|
|
24
|
+
"UIFN_ERR_WARNING_SUPPRESSED",
|
|
25
|
+
"UIFN_ERR_CONSUMER_SMOKE_FAILURE",
|
|
26
|
+
"UIFN_ERR_DIALOG_MODAL_INCOMPLETE"
|
|
27
|
+
];
|
|
28
|
+
var LEGACY_UIFN_ERROR_CODES = [
|
|
29
|
+
"UIFN_ERR_ASCHILD_CONTRACT",
|
|
30
|
+
"UIFN_ERR_COMBOBOX_FILTER_STATE",
|
|
31
|
+
"UIFN_ERR_DISABLED_INTERACTION",
|
|
32
|
+
"UIFN_ERR_SVELTE_REACTIVITY_SNAPSHOT"
|
|
33
|
+
];
|
|
34
|
+
var UIFN_ERROR_CODES = [
|
|
35
|
+
...CANONICAL_UIFN_ERROR_CODES,
|
|
36
|
+
...LEGACY_UIFN_ERROR_CODES
|
|
37
|
+
];
|
|
38
|
+
var DEFAULT_MESSAGES = {
|
|
39
|
+
UIFN_ERR_CONTEXT_MISSING: "Required UI context is missing.",
|
|
40
|
+
UIFN_ERR_DETERMINISTIC_ID_MISMATCH: "Public IDs MUST be deterministic across runtimes.",
|
|
41
|
+
UIFN_ERR_DUPLICATE_PUBLIC_ID: "GA surfaces MUST NOT share fixed instance-scoped IDs.",
|
|
42
|
+
UIFN_ERR_INVALID_VALUE: "Invalid public value for this surface.",
|
|
43
|
+
UIFN_ERR_RANGE_OUT_OF_BOUNDS: "Public value is outside the supported range.",
|
|
44
|
+
UIFN_ERR_TOOLCHAIN_MISCONFIG: "Verification failed due to toolchain misconfiguration.",
|
|
45
|
+
UIFN_ERR_UNSUPPORTED_ENVIRONMENT: "Unsupported environment matrix for this package."
|
|
46
|
+
};
|
|
47
|
+
var UIFnError = class extends Error {
|
|
48
|
+
constructor(options) {
|
|
49
|
+
const message = options.message ?? DEFAULT_MESSAGES[options.code] ?? options.code;
|
|
50
|
+
super(message);
|
|
51
|
+
this.name = "UIFnError";
|
|
52
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
53
|
+
this.code = options.code;
|
|
54
|
+
this.package = options.package ?? "@uifn/core";
|
|
55
|
+
this.component = options.component;
|
|
56
|
+
this.details = options.details;
|
|
57
|
+
this.recoverable = options.recoverable ?? false;
|
|
58
|
+
this.cause = options.cause;
|
|
59
|
+
}
|
|
60
|
+
toJSON() {
|
|
61
|
+
return {
|
|
62
|
+
name: this.name,
|
|
63
|
+
code: this.code,
|
|
64
|
+
package: this.package,
|
|
65
|
+
component: this.component,
|
|
66
|
+
message: this.message,
|
|
67
|
+
recoverable: this.recoverable,
|
|
68
|
+
details: this.details
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
function createUIFnError(options) {
|
|
73
|
+
return new UIFnError(options);
|
|
74
|
+
}
|
|
75
|
+
function isUIFnError(error) {
|
|
76
|
+
return error instanceof UIFnError;
|
|
77
|
+
}
|
|
78
|
+
function toUIFnErrorPayload(error, fallback = {}) {
|
|
79
|
+
if (isUIFnError(error)) {
|
|
80
|
+
return error.toJSON();
|
|
81
|
+
}
|
|
82
|
+
return createUIFnError({
|
|
83
|
+
code: fallback.code ?? "UIFN_ERR_TOOLCHAIN_MISCONFIG",
|
|
84
|
+
package: fallback.package ?? "@uifn/core",
|
|
85
|
+
component: fallback.component,
|
|
86
|
+
message: fallback.message ?? (error instanceof Error ? error.message : DEFAULT_MESSAGES.UIFN_ERR_TOOLCHAIN_MISCONFIG),
|
|
87
|
+
details: fallback.details ?? (error instanceof Error ? { originalErrorName: error.name } : error !== void 0 ? { originalError: error } : void 0),
|
|
88
|
+
recoverable: fallback.recoverable ?? false,
|
|
89
|
+
cause: fallback.cause ?? error
|
|
90
|
+
}).toJSON();
|
|
91
|
+
}
|
|
92
|
+
function assertContext(value, options = {}) {
|
|
93
|
+
if (value === null || value === void 0) {
|
|
94
|
+
throw createUIFnError({
|
|
95
|
+
code: "UIFN_ERR_CONTEXT_MISSING",
|
|
96
|
+
...options,
|
|
97
|
+
recoverable: options.recoverable ?? false
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
function assertValidValue(condition, options = {}) {
|
|
103
|
+
if (!condition) {
|
|
104
|
+
throw createUIFnError({
|
|
105
|
+
code: "UIFN_ERR_INVALID_VALUE",
|
|
106
|
+
...options,
|
|
107
|
+
recoverable: options.recoverable ?? false
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function assertInRange(value, range, options = {}) {
|
|
112
|
+
const belowMin = range.min !== void 0 && value < range.min;
|
|
113
|
+
const aboveMax = range.max !== void 0 && value > range.max;
|
|
114
|
+
if (belowMin || aboveMax) {
|
|
115
|
+
throw createUIFnError({
|
|
116
|
+
code: "UIFN_ERR_RANGE_OUT_OF_BOUNDS",
|
|
117
|
+
...options,
|
|
118
|
+
details: {
|
|
119
|
+
value,
|
|
120
|
+
min: range.min,
|
|
121
|
+
max: range.max,
|
|
122
|
+
...options.details
|
|
123
|
+
},
|
|
124
|
+
recoverable: options.recoverable ?? false
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
function runIfEnabled(enabled, fn) {
|
|
130
|
+
if (!enabled) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
fn();
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { UIFN_ERROR_CODES, UIFnError, assertContext, assertInRange, assertValidValue, createUIFnError, isUIFnError, runIfEnabled, toUIFnErrorPayload };
|
|
138
|
+
//# sourceMappingURL=chunk-HTTKRX7S.mjs.map
|
|
139
|
+
//# sourceMappingURL=chunk-HTTKRX7S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"names":[],"mappings":"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","file":"chunk-HTTKRX7S.mjs","sourcesContent":["export type UIFnPackageName =\n | '@uifn/core'\n | '@uifn/react'\n | '@uifn/svelte'\n | '@uifn/vue'\n | '@uifn/files';\n\nconst CANONICAL_UIFN_ERROR_CODES = [\n 'UIFN_ERR_A11Y_GATE_FAILURE',\n 'UIFN_ERR_CONTEXT_MISSING',\n 'UIFN_ERR_CONTROLLED_STATE_DIVERGENCE',\n 'UIFN_ERR_DETERMINISTIC_ID_MISMATCH',\n 'UIFN_ERR_DOCS_DRIFT',\n 'UIFN_ERR_DUPLICATE_PUBLIC_ID',\n 'UIFN_ERR_EXPORT_SURFACE_MISMATCH',\n 'UIFN_ERR_FILES_SCOPE_DRIFT',\n 'UIFN_ERR_HYDRATION_MISMATCH',\n 'UIFN_ERR_INVALID_VALUE',\n 'UIFN_ERR_MANUAL_EVIDENCE_INVALID',\n 'UIFN_ERR_MENU_NAVIGATION',\n 'UIFN_ERR_PACK_ARTIFACT_LEAK',\n 'UIFN_ERR_POSITIONING_OVERFLOW',\n 'UIFN_ERR_PUBLIC_SURFACE_DRIFT',\n 'UIFN_ERR_RANGE_OUT_OF_BOUNDS',\n 'UIFN_ERR_SCROLL_SYNC',\n 'UIFN_ERR_TEST_MATRIX_GAP',\n 'UIFN_ERR_TOOLCHAIN_MISCONFIG',\n 'UIFN_ERR_UNSUPPORTED_ENVIRONMENT',\n 'UIFN_ERR_UNSUPPORTED_PUBLIC_CLAIM',\n 'UIFN_ERR_WARNING_SUPPRESSED',\n 'UIFN_ERR_CONSUMER_SMOKE_FAILURE',\n 'UIFN_ERR_DIALOG_MODAL_INCOMPLETE',\n] as const;\n\n// Legacy codes still used by existing core primitives until later phases migrate those call sites.\nconst LEGACY_UIFN_ERROR_CODES = [\n 'UIFN_ERR_ASCHILD_CONTRACT',\n 'UIFN_ERR_COMBOBOX_FILTER_STATE',\n 'UIFN_ERR_DISABLED_INTERACTION',\n 'UIFN_ERR_SVELTE_REACTIVITY_SNAPSHOT',\n] as const;\n\nexport const UIFN_ERROR_CODES = [\n ...CANONICAL_UIFN_ERROR_CODES,\n ...LEGACY_UIFN_ERROR_CODES,\n] as const;\n\nexport type UIFnErrorCode = (typeof UIFN_ERROR_CODES)[number];\n\nexport interface UIFnErrorPayload {\n name: 'UIFnError';\n code: UIFnErrorCode;\n package: UIFnPackageName;\n component?: string;\n message: string;\n recoverable: boolean;\n details?: Record<string, unknown>;\n}\n\nexport interface UIFnErrorOptions {\n code: UIFnErrorCode;\n package?: UIFnPackageName;\n component?: string;\n message?: string;\n details?: Record<string, unknown>;\n recoverable?: boolean;\n cause?: unknown;\n}\n\nconst DEFAULT_MESSAGES: Partial<Record<UIFnErrorCode, string>> = {\n UIFN_ERR_CONTEXT_MISSING: 'Required UI context is missing.',\n UIFN_ERR_DETERMINISTIC_ID_MISMATCH: 'Public IDs MUST be deterministic across runtimes.',\n UIFN_ERR_DUPLICATE_PUBLIC_ID: 'GA surfaces MUST NOT share fixed instance-scoped IDs.',\n UIFN_ERR_INVALID_VALUE: 'Invalid public value for this surface.',\n UIFN_ERR_RANGE_OUT_OF_BOUNDS: 'Public value is outside the supported range.',\n UIFN_ERR_TOOLCHAIN_MISCONFIG: 'Verification failed due to toolchain misconfiguration.',\n UIFN_ERR_UNSUPPORTED_ENVIRONMENT: 'Unsupported environment matrix for this package.',\n};\n\nexport class UIFnError extends Error {\n readonly name = 'UIFnError';\n readonly code: UIFnErrorCode;\n readonly package: UIFnPackageName;\n readonly component?: string;\n readonly details?: Record<string, unknown>;\n readonly recoverable: boolean;\n readonly cause?: unknown;\n\n constructor(options: UIFnErrorOptions) {\n const message = options.message ?? DEFAULT_MESSAGES[options.code] ?? options.code;\n super(message);\n\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.code = options.code;\n this.package = options.package ?? '@uifn/core';\n this.component = options.component;\n this.details = options.details;\n this.recoverable = options.recoverable ?? false;\n this.cause = options.cause;\n }\n\n toJSON(): UIFnErrorPayload {\n return {\n name: this.name,\n code: this.code,\n package: this.package,\n component: this.component,\n message: this.message,\n recoverable: this.recoverable,\n details: this.details,\n };\n }\n}\n\nexport function createUIFnError(options: UIFnErrorOptions): UIFnError {\n return new UIFnError(options);\n}\n\nexport function isUIFnError(error: unknown): error is UIFnError {\n return error instanceof UIFnError;\n}\n\nexport function toUIFnErrorPayload(\n error: unknown,\n fallback: Partial<UIFnErrorOptions> = {}\n): UIFnErrorPayload {\n if (isUIFnError(error)) {\n return error.toJSON();\n }\n\n return createUIFnError({\n code: fallback.code ?? 'UIFN_ERR_TOOLCHAIN_MISCONFIG',\n package: fallback.package ?? '@uifn/core',\n component: fallback.component,\n message:\n fallback.message ??\n (error instanceof Error ? error.message : DEFAULT_MESSAGES.UIFN_ERR_TOOLCHAIN_MISCONFIG),\n details:\n fallback.details ??\n (error instanceof Error\n ? { originalErrorName: error.name }\n : error !== undefined\n ? { originalError: error }\n : undefined),\n recoverable: fallback.recoverable ?? false,\n cause: fallback.cause ?? error,\n }).toJSON();\n}\n\ntype AssertionOptions = Omit<UIFnErrorOptions, 'code'>;\n\nexport function assertContext<T>(\n value: T | null | undefined,\n options: AssertionOptions = {}\n): T {\n if (value === null || value === undefined) {\n throw createUIFnError({\n code: 'UIFN_ERR_CONTEXT_MISSING',\n ...options,\n recoverable: options.recoverable ?? false,\n });\n }\n\n return value;\n}\n\nexport function assertValidValue(\n condition: boolean,\n options: AssertionOptions = {}\n): void {\n if (!condition) {\n throw createUIFnError({\n code: 'UIFN_ERR_INVALID_VALUE',\n ...options,\n recoverable: options.recoverable ?? false,\n });\n }\n}\n\nexport function assertInRange(\n value: number,\n range: { min?: number; max?: number },\n options: AssertionOptions = {}\n): number {\n const belowMin = range.min !== undefined && value < range.min;\n const aboveMax = range.max !== undefined && value > range.max;\n\n if (belowMin || aboveMax) {\n throw createUIFnError({\n code: 'UIFN_ERR_RANGE_OUT_OF_BOUNDS',\n ...options,\n details: {\n value,\n min: range.min,\n max: range.max,\n ...options.details,\n },\n recoverable: options.recoverable ?? false,\n });\n }\n\n return value;\n}\n\nexport function runIfEnabled(enabled: boolean, fn: () => void): boolean {\n if (!enabled) {\n return false;\n }\n\n fn();\n return true;\n}\n"]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createUIFnError } from './chunk-HTTKRX7S.mjs';
|
|
2
|
+
|
|
3
|
+
// src/utils/id.ts
|
|
4
|
+
var DEFAULT_NAMESPACE = "uifn";
|
|
5
|
+
var DEFAULT_PREFIX = "id";
|
|
6
|
+
var TOKEN_SANITIZER = /[^a-z0-9-]+/g;
|
|
7
|
+
var REPEATED_DASHES = /-+/g;
|
|
8
|
+
function normalizeToken(token) {
|
|
9
|
+
return token.trim().toLowerCase().replace(TOKEN_SANITIZER, "-").replace(REPEATED_DASHES, "-").replace(/^-|-$/g, "");
|
|
10
|
+
}
|
|
11
|
+
function normalizeNamespace(namespace) {
|
|
12
|
+
return normalizeToken(namespace ?? DEFAULT_NAMESPACE) || DEFAULT_NAMESPACE;
|
|
13
|
+
}
|
|
14
|
+
function normalizePrefix(prefix) {
|
|
15
|
+
return normalizeToken(prefix ?? DEFAULT_PREFIX) || DEFAULT_PREFIX;
|
|
16
|
+
}
|
|
17
|
+
function normalizeExistingId(id) {
|
|
18
|
+
const normalized = normalizeToken(id);
|
|
19
|
+
if (!normalized) {
|
|
20
|
+
throw createUIFnError({
|
|
21
|
+
code: "UIFN_ERR_INVALID_VALUE",
|
|
22
|
+
package: "@uifn/core",
|
|
23
|
+
component: "PublicId",
|
|
24
|
+
message: "Public IDs MUST contain at least one non-empty segment.",
|
|
25
|
+
details: { id }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return normalized;
|
|
29
|
+
}
|
|
30
|
+
function normalizePublicIdInput(input) {
|
|
31
|
+
if (typeof input === "string") {
|
|
32
|
+
return {
|
|
33
|
+
prefix: normalizePrefix(input),
|
|
34
|
+
slot: ""
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
prefix: normalizePrefix(input?.prefix),
|
|
39
|
+
slot: normalizeToken(input?.slot ?? "")
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function composePublicIdBase(namespace, input) {
|
|
43
|
+
const normalized = normalizePublicIdInput(input);
|
|
44
|
+
const segments = normalized.prefix === namespace || normalized.prefix.startsWith(`${namespace}-`) ? [normalized.prefix] : [namespace, normalized.prefix];
|
|
45
|
+
if (normalized.slot) {
|
|
46
|
+
segments.push(normalized.slot);
|
|
47
|
+
}
|
|
48
|
+
return segments.join("-");
|
|
49
|
+
}
|
|
50
|
+
function createPublicIdRegistry() {
|
|
51
|
+
const issued = /* @__PURE__ */ new Set();
|
|
52
|
+
return {
|
|
53
|
+
has(id) {
|
|
54
|
+
return issued.has(normalizeExistingId(id));
|
|
55
|
+
},
|
|
56
|
+
register(id) {
|
|
57
|
+
const normalized = normalizeExistingId(id);
|
|
58
|
+
issued.add(normalized);
|
|
59
|
+
return normalized;
|
|
60
|
+
},
|
|
61
|
+
reset(prefix) {
|
|
62
|
+
if (!prefix) {
|
|
63
|
+
issued.clear();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const normalizedPrefix = normalizeExistingId(prefix);
|
|
67
|
+
for (const id of issued) {
|
|
68
|
+
if (id === normalizedPrefix || id.startsWith(`${normalizedPrefix}-`)) {
|
|
69
|
+
issued.delete(id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
snapshot() {
|
|
74
|
+
return Array.from(issued).sort();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function assertUniquePublicId(id, registry = createPublicIdRegistry(), options = {}) {
|
|
79
|
+
const normalized = normalizeExistingId(id);
|
|
80
|
+
if (registry.has(normalized)) {
|
|
81
|
+
throw createUIFnError({
|
|
82
|
+
code: "UIFN_ERR_DUPLICATE_PUBLIC_ID",
|
|
83
|
+
package: options.package ?? "@uifn/core",
|
|
84
|
+
component: options.component,
|
|
85
|
+
message: "GA surfaces MUST NOT share fixed instance-scoped IDs.",
|
|
86
|
+
details: {
|
|
87
|
+
id: normalized,
|
|
88
|
+
...options.details
|
|
89
|
+
},
|
|
90
|
+
recoverable: options.recoverable ?? false
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
registry.register(normalized);
|
|
94
|
+
return normalized;
|
|
95
|
+
}
|
|
96
|
+
function createDeterministicIdFactory(options = {}) {
|
|
97
|
+
const namespace = normalizeNamespace(options.namespace);
|
|
98
|
+
const counters = /* @__PURE__ */ new Map();
|
|
99
|
+
const registry = options.registry ?? createPublicIdRegistry();
|
|
100
|
+
const compose = (input) => composePublicIdBase(namespace, input);
|
|
101
|
+
return {
|
|
102
|
+
compose,
|
|
103
|
+
create(input = DEFAULT_PREFIX) {
|
|
104
|
+
const base = compose(input);
|
|
105
|
+
const nextCount = (counters.get(base) ?? 0) + 1;
|
|
106
|
+
counters.set(base, nextCount);
|
|
107
|
+
return assertUniquePublicId(`${base}-${nextCount}`, registry);
|
|
108
|
+
},
|
|
109
|
+
reuse(existingId, input = DEFAULT_PREFIX) {
|
|
110
|
+
if (existingId) {
|
|
111
|
+
return assertUniquePublicId(existingId, registry);
|
|
112
|
+
}
|
|
113
|
+
return this.create(input);
|
|
114
|
+
},
|
|
115
|
+
register(id, assertionOptions = {}) {
|
|
116
|
+
return assertUniquePublicId(id, registry, assertionOptions);
|
|
117
|
+
},
|
|
118
|
+
reset(input) {
|
|
119
|
+
if (!input) {
|
|
120
|
+
counters.clear();
|
|
121
|
+
registry.reset();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const base = compose(input);
|
|
125
|
+
counters.delete(base);
|
|
126
|
+
registry.reset(base);
|
|
127
|
+
},
|
|
128
|
+
snapshot() {
|
|
129
|
+
return {
|
|
130
|
+
counters: Object.fromEntries(counters.entries()),
|
|
131
|
+
issued: registry.snapshot()
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function composePublicId(input, options = {}) {
|
|
137
|
+
return composePublicIdBase(normalizeNamespace(options.namespace), input);
|
|
138
|
+
}
|
|
139
|
+
function createIdFactory(options = {}) {
|
|
140
|
+
const factory = createDeterministicIdFactory(options);
|
|
141
|
+
return {
|
|
142
|
+
next(token = DEFAULT_PREFIX) {
|
|
143
|
+
return factory.create(token);
|
|
144
|
+
},
|
|
145
|
+
reset(token) {
|
|
146
|
+
factory.reset(token);
|
|
147
|
+
},
|
|
148
|
+
snapshot() {
|
|
149
|
+
return factory.snapshot().counters;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
var createIdScope = createIdFactory;
|
|
154
|
+
var globalIdRegistry = createPublicIdRegistry();
|
|
155
|
+
var globalIdFactory = createDeterministicIdFactory({
|
|
156
|
+
registry: globalIdRegistry
|
|
157
|
+
});
|
|
158
|
+
function generateId(token = DEFAULT_PREFIX) {
|
|
159
|
+
return globalIdFactory.create(token);
|
|
160
|
+
}
|
|
161
|
+
function reusePublicId(existingId, input) {
|
|
162
|
+
return globalIdFactory.reuse(existingId, input);
|
|
163
|
+
}
|
|
164
|
+
function registerPublicId(id, options = {}) {
|
|
165
|
+
return globalIdFactory.register(id, options);
|
|
166
|
+
}
|
|
167
|
+
function resetIdCounters(token) {
|
|
168
|
+
globalIdFactory.reset(token);
|
|
169
|
+
}
|
|
170
|
+
function getIdCounterSnapshot() {
|
|
171
|
+
return globalIdFactory.snapshot().counters;
|
|
172
|
+
}
|
|
173
|
+
function getPublicIdSnapshot() {
|
|
174
|
+
return globalIdFactory.snapshot();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { assertUniquePublicId, composePublicId, createDeterministicIdFactory, createIdFactory, createIdScope, createPublicIdRegistry, generateId, getIdCounterSnapshot, getPublicIdSnapshot, registerPublicId, resetIdCounters, reusePublicId };
|
|
178
|
+
//# sourceMappingURL=chunk-II5OGIRE.mjs.map
|
|
179
|
+
//# sourceMappingURL=chunk-II5OGIRE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/id.ts"],"names":[],"mappings":"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","file":"chunk-II5OGIRE.mjs","sourcesContent":["import { createUIFnError, type UIFnPackageName } from '../errors';\n\nconst DEFAULT_NAMESPACE = 'uifn';\nconst DEFAULT_PREFIX = 'id';\nconst TOKEN_SANITIZER = /[^a-z0-9-]+/g;\nconst REPEATED_DASHES = /-+/g;\n\nexport interface IdFactoryOptions {\n namespace?: string;\n}\n\nexport interface IdFactory {\n next: (token?: string) => string;\n reset: (token?: string) => void;\n snapshot: () => Record<string, number>;\n}\n\nexport interface PublicIdInput {\n prefix?: string;\n slot?: string;\n}\n\nexport interface PublicIdAssertionOptions {\n package?: UIFnPackageName;\n component?: string;\n details?: Record<string, unknown>;\n recoverable?: boolean;\n}\n\nexport interface PublicIdSnapshot {\n counters: Record<string, number>;\n issued: string[];\n}\n\nexport interface PublicIdRegistry {\n has: (id: string) => boolean;\n register: (id: string) => string;\n reset: (prefix?: string) => void;\n snapshot: () => string[];\n}\n\nexport interface DeterministicIdFactory {\n compose: (input?: string | PublicIdInput) => string;\n create: (input?: string | PublicIdInput) => string;\n reuse: (existingId: string | null | undefined, input?: string | PublicIdInput) => string;\n register: (id: string, options?: PublicIdAssertionOptions) => string;\n reset: (input?: string | PublicIdInput) => void;\n snapshot: () => PublicIdSnapshot;\n}\n\nfunction normalizeToken(token: string): string {\n return token\n .trim()\n .toLowerCase()\n .replace(TOKEN_SANITIZER, '-')\n .replace(REPEATED_DASHES, '-')\n .replace(/^-|-$/g, '');\n}\n\nfunction normalizeNamespace(namespace?: string): string {\n return normalizeToken(namespace ?? DEFAULT_NAMESPACE) || DEFAULT_NAMESPACE;\n}\n\nfunction normalizePrefix(prefix?: string): string {\n return normalizeToken(prefix ?? DEFAULT_PREFIX) || DEFAULT_PREFIX;\n}\n\nfunction normalizeExistingId(id: string): string {\n const normalized = normalizeToken(id);\n if (!normalized) {\n throw createUIFnError({\n code: 'UIFN_ERR_INVALID_VALUE',\n package: '@uifn/core',\n component: 'PublicId',\n message: 'Public IDs MUST contain at least one non-empty segment.',\n details: { id },\n });\n }\n\n return normalized;\n}\n\nfunction normalizePublicIdInput(input?: string | PublicIdInput): Required<PublicIdInput> {\n if (typeof input === 'string') {\n return {\n prefix: normalizePrefix(input),\n slot: '',\n };\n }\n\n return {\n prefix: normalizePrefix(input?.prefix),\n slot: normalizeToken(input?.slot ?? ''),\n };\n}\n\nfunction composePublicIdBase(namespace: string, input?: string | PublicIdInput): string {\n const normalized = normalizePublicIdInput(input);\n const segments = normalized.prefix === namespace || normalized.prefix.startsWith(`${namespace}-`)\n ? [normalized.prefix]\n : [namespace, normalized.prefix];\n\n if (normalized.slot) {\n segments.push(normalized.slot);\n }\n\n return segments.join('-');\n}\n\nexport function createPublicIdRegistry(): PublicIdRegistry {\n const issued = new Set<string>();\n\n return {\n has(id) {\n return issued.has(normalizeExistingId(id));\n },\n register(id) {\n const normalized = normalizeExistingId(id);\n issued.add(normalized);\n return normalized;\n },\n reset(prefix) {\n if (!prefix) {\n issued.clear();\n return;\n }\n\n const normalizedPrefix = normalizeExistingId(prefix);\n for (const id of issued) {\n if (id === normalizedPrefix || id.startsWith(`${normalizedPrefix}-`)) {\n issued.delete(id);\n }\n }\n },\n snapshot() {\n return Array.from(issued).sort();\n },\n };\n}\n\nexport function assertUniquePublicId(\n id: string,\n registry: PublicIdRegistry = createPublicIdRegistry(),\n options: PublicIdAssertionOptions = {}\n): string {\n const normalized = normalizeExistingId(id);\n\n if (registry.has(normalized)) {\n throw createUIFnError({\n code: 'UIFN_ERR_DUPLICATE_PUBLIC_ID',\n package: options.package ?? '@uifn/core',\n component: options.component,\n message: 'GA surfaces MUST NOT share fixed instance-scoped IDs.',\n details: {\n id: normalized,\n ...options.details,\n },\n recoverable: options.recoverable ?? false,\n });\n }\n\n registry.register(normalized);\n return normalized;\n}\n\nexport function createDeterministicIdFactory(\n options: IdFactoryOptions & { registry?: PublicIdRegistry } = {}\n): DeterministicIdFactory {\n const namespace = normalizeNamespace(options.namespace);\n const counters = new Map<string, number>();\n const registry = options.registry ?? createPublicIdRegistry();\n\n const compose = (input?: string | PublicIdInput) => composePublicIdBase(namespace, input);\n\n return {\n compose,\n create(input = DEFAULT_PREFIX) {\n const base = compose(input);\n const nextCount = (counters.get(base) ?? 0) + 1;\n counters.set(base, nextCount);\n return assertUniquePublicId(`${base}-${nextCount}`, registry);\n },\n reuse(existingId, input = DEFAULT_PREFIX) {\n if (existingId) {\n return assertUniquePublicId(existingId, registry);\n }\n\n return this.create(input);\n },\n register(id, assertionOptions = {}) {\n return assertUniquePublicId(id, registry, assertionOptions);\n },\n reset(input) {\n if (!input) {\n counters.clear();\n registry.reset();\n return;\n }\n\n const base = compose(input);\n counters.delete(base);\n registry.reset(base);\n },\n snapshot() {\n return {\n counters: Object.fromEntries(counters.entries()),\n issued: registry.snapshot(),\n };\n },\n };\n}\n\nexport function composePublicId(\n input?: string | PublicIdInput,\n options: IdFactoryOptions = {}\n): string {\n return composePublicIdBase(normalizeNamespace(options.namespace), input);\n}\n\nexport function createIdFactory(options: IdFactoryOptions = {}): IdFactory {\n const factory = createDeterministicIdFactory(options);\n\n return {\n next(token = DEFAULT_PREFIX) {\n return factory.create(token);\n },\n reset(token?: string) {\n factory.reset(token);\n },\n snapshot() {\n return factory.snapshot().counters;\n },\n };\n}\n\nexport const createIdScope = createIdFactory;\n\nconst globalIdRegistry = createPublicIdRegistry();\nconst globalIdFactory = createDeterministicIdFactory({\n registry: globalIdRegistry,\n});\n\nexport function generateId(token = DEFAULT_PREFIX): string {\n return globalIdFactory.create(token);\n}\n\nexport function reusePublicId(\n existingId: string | null | undefined,\n input?: string | PublicIdInput\n): string {\n return globalIdFactory.reuse(existingId, input);\n}\n\nexport function registerPublicId(\n id: string,\n options: PublicIdAssertionOptions = {}\n): string {\n return globalIdFactory.register(id, options);\n}\n\nexport function resetIdCounters(token?: string): void {\n globalIdFactory.reset(token);\n}\n\nexport function getIdCounterSnapshot(): Record<string, number> {\n return globalIdFactory.snapshot().counters;\n}\n\nexport function getPublicIdSnapshot(): PublicIdSnapshot {\n return globalIdFactory.snapshot();\n}\n"]}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils/presence.ts
|
|
4
|
+
function parseTimeListMs(value) {
|
|
5
|
+
const tokens = value.split(",").map((entry) => entry.trim()).filter(Boolean);
|
|
6
|
+
if (tokens.length === 0) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
return tokens.reduce((max, token) => {
|
|
10
|
+
const duration = token.endsWith("ms") ? Number.parseFloat(token) : Number.parseFloat(token) * 1e3;
|
|
11
|
+
return Number.isFinite(duration) ? Math.max(max, duration) : max;
|
|
12
|
+
}, 0);
|
|
13
|
+
}
|
|
14
|
+
function detectMotionFromStyles(styles) {
|
|
15
|
+
const animationDurationMs = parseTimeListMs(styles.animationDuration || "0s");
|
|
16
|
+
const transitionDurationMs = parseTimeListMs(styles.transitionDuration || "0s");
|
|
17
|
+
const hasAnimation = styles.animationName !== "none" && styles.animationName !== "" && animationDurationMs > 0;
|
|
18
|
+
const hasTransition = transitionDurationMs > 0;
|
|
19
|
+
return {
|
|
20
|
+
hasAnimation,
|
|
21
|
+
hasTransition,
|
|
22
|
+
animationDurationMs,
|
|
23
|
+
transitionDurationMs
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function detectNodeMotion(node) {
|
|
27
|
+
const ownerWindow = node.ownerDocument.defaultView;
|
|
28
|
+
if (!ownerWindow) {
|
|
29
|
+
return {
|
|
30
|
+
hasAnimation: false,
|
|
31
|
+
hasTransition: false,
|
|
32
|
+
animationDurationMs: 0,
|
|
33
|
+
transitionDurationMs: 0
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return detectMotionFromStyles(ownerWindow.getComputedStyle(node));
|
|
37
|
+
}
|
|
38
|
+
function shouldSuspendUnmount(snapshot) {
|
|
39
|
+
return snapshot.wasPresent && !snapshot.present && (snapshot.hasAnimation || snapshot.hasTransition);
|
|
40
|
+
}
|
|
41
|
+
function resolvePresenceState(snapshot) {
|
|
42
|
+
if (snapshot.present) {
|
|
43
|
+
return "mounted";
|
|
44
|
+
}
|
|
45
|
+
if (shouldSuspendUnmount(snapshot)) {
|
|
46
|
+
return "unmount-suspended";
|
|
47
|
+
}
|
|
48
|
+
return "unmounted";
|
|
49
|
+
}
|
|
50
|
+
function createPresenceManager(present, options = {}) {
|
|
51
|
+
let state = {
|
|
52
|
+
present,
|
|
53
|
+
state: present ? "mounted" : "unmounted",
|
|
54
|
+
reducedMotion: options.reducedMotion ?? false,
|
|
55
|
+
timers: 0,
|
|
56
|
+
listeners: 0,
|
|
57
|
+
cleanupComplete: !present
|
|
58
|
+
};
|
|
59
|
+
const getState = () => ({ ...state });
|
|
60
|
+
const updateCleanupState = () => {
|
|
61
|
+
state = {
|
|
62
|
+
...state,
|
|
63
|
+
cleanupComplete: !state.present && state.timers === 0 && state.listeners === 0
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
getState,
|
|
68
|
+
setPresent(nextPresent, motion) {
|
|
69
|
+
const hasAnimation = state.reducedMotion ? false : motion?.hasAnimation ?? false;
|
|
70
|
+
const hasTransition = state.reducedMotion ? false : motion?.hasTransition ?? false;
|
|
71
|
+
const nextPresenceState = resolvePresenceState({
|
|
72
|
+
present: nextPresent,
|
|
73
|
+
wasPresent: state.present,
|
|
74
|
+
hasAnimation,
|
|
75
|
+
hasTransition
|
|
76
|
+
});
|
|
77
|
+
state = {
|
|
78
|
+
...state,
|
|
79
|
+
present: nextPresent,
|
|
80
|
+
state: nextPresenceState
|
|
81
|
+
};
|
|
82
|
+
updateCleanupState();
|
|
83
|
+
return getState();
|
|
84
|
+
},
|
|
85
|
+
registerTimer() {
|
|
86
|
+
state = {
|
|
87
|
+
...state,
|
|
88
|
+
timers: state.timers + 1
|
|
89
|
+
};
|
|
90
|
+
updateCleanupState();
|
|
91
|
+
return getState();
|
|
92
|
+
},
|
|
93
|
+
clearTimer() {
|
|
94
|
+
state = {
|
|
95
|
+
...state,
|
|
96
|
+
timers: Math.max(0, state.timers - 1)
|
|
97
|
+
};
|
|
98
|
+
updateCleanupState();
|
|
99
|
+
return getState();
|
|
100
|
+
},
|
|
101
|
+
registerListener() {
|
|
102
|
+
state = {
|
|
103
|
+
...state,
|
|
104
|
+
listeners: state.listeners + 1
|
|
105
|
+
};
|
|
106
|
+
updateCleanupState();
|
|
107
|
+
return getState();
|
|
108
|
+
},
|
|
109
|
+
clearListener() {
|
|
110
|
+
state = {
|
|
111
|
+
...state,
|
|
112
|
+
listeners: Math.max(0, state.listeners - 1)
|
|
113
|
+
};
|
|
114
|
+
updateCleanupState();
|
|
115
|
+
return getState();
|
|
116
|
+
},
|
|
117
|
+
cleanup() {
|
|
118
|
+
state = {
|
|
119
|
+
...state,
|
|
120
|
+
timers: 0,
|
|
121
|
+
listeners: 0,
|
|
122
|
+
state: state.present ? "mounted" : "unmounted"
|
|
123
|
+
};
|
|
124
|
+
updateCleanupState();
|
|
125
|
+
return getState();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
exports.createPresenceManager = createPresenceManager;
|
|
131
|
+
exports.detectMotionFromStyles = detectMotionFromStyles;
|
|
132
|
+
exports.detectNodeMotion = detectNodeMotion;
|
|
133
|
+
exports.resolvePresenceState = resolvePresenceState;
|
|
134
|
+
exports.shouldSuspendUnmount = shouldSuspendUnmount;
|
|
135
|
+
//# sourceMappingURL=chunk-JBMGXJ55.js.map
|
|
136
|
+
//# sourceMappingURL=chunk-JBMGXJ55.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/presence.ts"],"names":[],"mappings":"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","file":"chunk-JBMGXJ55.js","sourcesContent":["export interface PresenceSnapshot {\n present: boolean;\n wasPresent: boolean;\n hasAnimation: boolean;\n hasTransition: boolean;\n}\n\nexport type PresenceState = 'mounted' | 'unmount-suspended' | 'unmounted';\n\nexport interface MotionInfo {\n hasAnimation: boolean;\n hasTransition: boolean;\n animationDurationMs: number;\n transitionDurationMs: number;\n}\n\nexport interface PresenceManagerState {\n present: boolean;\n state: PresenceState;\n reducedMotion: boolean;\n timers: number;\n listeners: number;\n cleanupComplete: boolean;\n}\n\nexport interface PresenceManager {\n getState: () => PresenceManagerState;\n setPresent: (\n present: boolean,\n motion?: Pick<MotionInfo, 'hasAnimation' | 'hasTransition'>\n ) => PresenceManagerState;\n registerTimer: () => PresenceManagerState;\n clearTimer: () => PresenceManagerState;\n registerListener: () => PresenceManagerState;\n clearListener: () => PresenceManagerState;\n cleanup: () => PresenceManagerState;\n}\n\nexport interface PresenceManagerOptions {\n reducedMotion?: boolean;\n}\n\nfunction parseTimeListMs(value: string): number {\n const tokens = value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n if (tokens.length === 0) {\n return 0;\n }\n\n return tokens.reduce((max, token) => {\n const duration = token.endsWith('ms')\n ? Number.parseFloat(token)\n : Number.parseFloat(token) * 1000;\n return Number.isFinite(duration) ? Math.max(max, duration) : max;\n }, 0);\n}\n\nexport function detectMotionFromStyles(\n styles: Pick<\n CSSStyleDeclaration,\n 'animationName' | 'animationDuration' | 'transitionDuration'\n >\n): MotionInfo {\n const animationDurationMs = parseTimeListMs(styles.animationDuration || '0s');\n const transitionDurationMs = parseTimeListMs(styles.transitionDuration || '0s');\n\n const hasAnimation =\n styles.animationName !== 'none' &&\n styles.animationName !== '' &&\n animationDurationMs > 0;\n const hasTransition = transitionDurationMs > 0;\n\n return {\n hasAnimation,\n hasTransition,\n animationDurationMs,\n transitionDurationMs,\n };\n}\n\nexport function detectNodeMotion(node: HTMLElement): MotionInfo {\n const ownerWindow = node.ownerDocument.defaultView;\n if (!ownerWindow) {\n return {\n hasAnimation: false,\n hasTransition: false,\n animationDurationMs: 0,\n transitionDurationMs: 0,\n };\n }\n\n return detectMotionFromStyles(ownerWindow.getComputedStyle(node));\n}\n\nexport function shouldSuspendUnmount(snapshot: PresenceSnapshot): boolean {\n return (\n snapshot.wasPresent &&\n !snapshot.present &&\n (snapshot.hasAnimation || snapshot.hasTransition)\n );\n}\n\nexport function resolvePresenceState(snapshot: PresenceSnapshot): PresenceState {\n if (snapshot.present) {\n return 'mounted';\n }\n\n if (shouldSuspendUnmount(snapshot)) {\n return 'unmount-suspended';\n }\n\n return 'unmounted';\n}\n\nexport function createPresenceManager(\n present: boolean,\n options: PresenceManagerOptions = {}\n): PresenceManager {\n let state: PresenceManagerState = {\n present,\n state: present ? 'mounted' : 'unmounted',\n reducedMotion: options.reducedMotion ?? false,\n timers: 0,\n listeners: 0,\n cleanupComplete: !present,\n };\n\n const getState = (): PresenceManagerState => ({ ...state });\n\n const updateCleanupState = () => {\n state = {\n ...state,\n cleanupComplete: !state.present && state.timers === 0 && state.listeners === 0,\n };\n };\n\n return {\n getState,\n setPresent(nextPresent, motion) {\n const hasAnimation = state.reducedMotion ? false : motion?.hasAnimation ?? false;\n const hasTransition = state.reducedMotion ? false : motion?.hasTransition ?? false;\n const nextPresenceState = resolvePresenceState({\n present: nextPresent,\n wasPresent: state.present,\n hasAnimation,\n hasTransition,\n });\n\n state = {\n ...state,\n present: nextPresent,\n state: nextPresenceState,\n };\n\n updateCleanupState();\n return getState();\n },\n registerTimer() {\n state = {\n ...state,\n timers: state.timers + 1,\n };\n\n updateCleanupState();\n return getState();\n },\n clearTimer() {\n state = {\n ...state,\n timers: Math.max(0, state.timers - 1),\n };\n\n updateCleanupState();\n return getState();\n },\n registerListener() {\n state = {\n ...state,\n listeners: state.listeners + 1,\n };\n\n updateCleanupState();\n return getState();\n },\n clearListener() {\n state = {\n ...state,\n listeners: Math.max(0, state.listeners - 1),\n };\n\n updateCleanupState();\n return getState();\n },\n cleanup() {\n state = {\n ...state,\n timers: 0,\n listeners: 0,\n state: state.present ? 'mounted' : 'unmounted',\n };\n\n updateCleanupState();\n return getState();\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/primitives/shared.ts
|
|
4
|
+
function createStore(initialState) {
|
|
5
|
+
let state = initialState;
|
|
6
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
7
|
+
const getState = () => state;
|
|
8
|
+
const setState = (nextState, meta) => {
|
|
9
|
+
state = nextState;
|
|
10
|
+
listeners.forEach((listener) => listener(state, meta));
|
|
11
|
+
};
|
|
12
|
+
const patchState = (partial, meta) => {
|
|
13
|
+
setState({ ...state, ...partial }, meta);
|
|
14
|
+
};
|
|
15
|
+
const subscribe = (listener) => {
|
|
16
|
+
listeners.add(listener);
|
|
17
|
+
return () => {
|
|
18
|
+
listeners.delete(listener);
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
getState,
|
|
23
|
+
setState,
|
|
24
|
+
patchState,
|
|
25
|
+
subscribe
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function uniqueStrings(values) {
|
|
29
|
+
return Array.from(new Set(values.filter(Boolean)));
|
|
30
|
+
}
|
|
31
|
+
function clamp(value, min, max) {
|
|
32
|
+
return Math.min(Math.max(value, min), max);
|
|
33
|
+
}
|
|
34
|
+
function alignToStep(value, min, step) {
|
|
35
|
+
if (step <= 0) {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
const distance = value - min;
|
|
39
|
+
const steps = Math.round(distance / step);
|
|
40
|
+
return min + steps * step;
|
|
41
|
+
}
|
|
42
|
+
function shallowArrayEqual(a, b) {
|
|
43
|
+
if (a.length !== b.length) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
for (let index = 0; index < a.length; index += 1) {
|
|
47
|
+
if (a[index] !== b[index]) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
exports.alignToStep = alignToStep;
|
|
55
|
+
exports.clamp = clamp;
|
|
56
|
+
exports.createStore = createStore;
|
|
57
|
+
exports.shallowArrayEqual = shallowArrayEqual;
|
|
58
|
+
exports.uniqueStrings = uniqueStrings;
|
|
59
|
+
//# sourceMappingURL=chunk-K3WYDUIN.js.map
|
|
60
|
+
//# sourceMappingURL=chunk-K3WYDUIN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/shared.ts"],"names":[],"mappings":";;;AAeO,SAAS,YAAsC,YAAA,EAAsB;AAC1E,EAAA,IAAI,KAAA,GAAQ,YAAA;AACZ,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgC;AAEtD,EAAA,MAAM,WAAW,MAAM,KAAA;AAEvB,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,EAAmB,IAAA,KAA8B;AACjE,IAAA,KAAA,GAAQ,SAAA;AACR,IAAA,SAAA,CAAU,QAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,EAA0B,IAAA,KAA8B;AAC1E,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,IAAW,IAAI,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAAyC;AAC1D,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,cAAc,MAAA,EAA4B;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,GAAA,CAAI,OAAO,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AACnD;AAEO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC3C;AAEO,SAAS,WAAA,CAAY,KAAA,EAAe,GAAA,EAAa,IAAA,EAAsB;AAC5E,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,KAAA,GAAQ,GAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAI,CAAA;AACxC,EAAA,OAAO,MAAM,KAAA,GAAQ,IAAA;AACvB;AAEO,SAAS,iBAAA,CAAqB,GAAQ,CAAA,EAAiB;AAC5D,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,MAAA,EAAQ,SAAS,CAAA,EAAG;AAChD,IAAA,IAAI,CAAA,CAAE,KAAK,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT","file":"chunk-K3WYDUIN.js","sourcesContent":["export type ChangeSource = 'user' | 'programmatic' | 'controlled-sync';\n\nexport interface ChangeMeta<TValue = unknown> {\n source: ChangeSource;\n reason: string;\n previousValue: TValue;\n nextValue: TValue;\n inputModality?: 'keyboard' | 'pointer' | 'touch' | 'virtual';\n}\n\nexport type Subscriber<TState, TValue = unknown> = (\n state: TState,\n meta?: ChangeMeta<TValue>\n) => void;\n\nexport function createStore<TState, TValue = unknown>(initialState: TState) {\n let state = initialState;\n const listeners = new Set<Subscriber<TState, TValue>>();\n\n const getState = () => state;\n\n const setState = (nextState: TState, meta?: ChangeMeta<TValue>) => {\n state = nextState;\n listeners.forEach((listener) => listener(state, meta));\n };\n\n const patchState = (partial: Partial<TState>, meta?: ChangeMeta<TValue>) => {\n setState({ ...state, ...partial }, meta);\n };\n\n const subscribe = (listener: Subscriber<TState, TValue>) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return {\n getState,\n setState,\n patchState,\n subscribe,\n };\n}\n\nexport function uniqueStrings(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function alignToStep(value: number, min: number, step: number): number {\n if (step <= 0) {\n return value;\n }\n\n const distance = value - min;\n const steps = Math.round(distance / step);\n return min + steps * step;\n}\n\nexport function shallowArrayEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let index = 0; index < a.length; index += 1) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n\n return true;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-K626K7M2.mjs"}
|