@vireo-ai/trellis-ui 0.1.54 → 0.1.55
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/package.json +22 -22
- package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.css +413 -1077
- package/packages/server/trellis_ui/static/trellis_ui/assets/css/trellis.min.css +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/bridge.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +823 -793
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/motion.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/resizable.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/resizable.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/shortcut.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/alpine-data-Dvc_bXq6.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{alpine-machine-9HwatUrm.js → alpine-machine-CE2UN4Qu.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{alpine-machine-9HwatUrm.js.map → alpine-machine-CE2UN4Qu.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/anchored-popover-BwQbt4V2.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/anchored-popover-BwQbt4V2.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/bridge-DMrvM3JE.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{bridge-TcE7HSvq.js.map → bridge-DMrvM3JE.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cally-B-msaaMx.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cally-B-msaaMx.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-motion-C3q5Xzv2.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-motion-C3q5Xzv2.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-resizable-ByUbMIHF.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-resizable-ByUbMIHF.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-shortcut-CGpfLNL-.js → capability-shortcut-BwvEqEbL.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-shortcut-CGpfLNL-.js.map → capability-shortcut-BwvEqEbL.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-sortable-Bh6pkITu.js +5 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-sortable-Bh6pkITu.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cleanup-manager-D9QiZF_Q.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{codecs-Cb1ns_47.js → codecs-CQ7olTJL.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{codecs-Cb1ns_47.js.map → codecs-CQ7olTJL.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{collection-navigation-CfTZUJrL.js → collection-navigation-BbxUBQFs.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{collection-navigation-CfTZUJrL.js.map → collection-navigation-BbxUBQFs.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/controlled-open-Hy4-OT-6.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{controller-CzqwFGEd.js → controller-crMEr9_l.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{controller-CzqwFGEd.js.map → controller-crMEr9_l.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-DOHj5fa1.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{core-CogF8tNb.js.map → core-DOHj5fa1.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-FA9FLGtB.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{cursor-data-source-B2mQNyzN.js.map → cursor-data-source-FA9FLGtB.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/dismissable-layer-BROE-Ln2.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/dom-DiTFTWeR.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/element-adapter-native-data-key-DrqJDAVH.js +6 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/element-adapter-native-data-key-DrqJDAVH.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B41qiwNq.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B41qiwNq.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-x0moHcUM.js → entry.generated-B7n4iFyw.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-x0moHcUM.js.map → entry.generated-B7n4iFyw.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BCTWp6Xu.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CmvKWs0J.js → entry.generated-BLduYCHm.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CmvKWs0J.js.map → entry.generated-BLduYCHm.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-QV-az1in.js → entry.generated-BeNK2EFl.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-QV-az1in.js.map → entry.generated-BeNK2EFl.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BmVGptdJ.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BOk2j8j3.js.map → entry.generated-BmVGptdJ.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BnqcHAaF.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-DTRN8-Ks.js.map → entry.generated-BnqcHAaF.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CnFggOc8.js → entry.generated-Bq2KAnfO.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CnFggOc8.js.map → entry.generated-Bq2KAnfO.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BBuJrkhp.js → entry.generated-C3cRWutN.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-C3cRWutN.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CnY5J5bD.js → entry.generated-C3y5qBcc.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CnY5J5bD.js.map → entry.generated-C3y5qBcc.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B3hMqvMn.js → entry.generated-CC6pQ0nu.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-B3hMqvMn.js.map → entry.generated-CC6pQ0nu.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CGasYxmV.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-De9SwKec.js.map → entry.generated-CGasYxmV.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CvL196IN.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CvL196IN.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CyynUmGS.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CyynUmGS.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry2.generated-dkzHCN26.js → entry.generated-D8iA1e6i.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-D8iA1e6i.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C-4OkQdv.js → entry.generated-DDJEGHq-.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DDJEGHq-.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DScbsE6-.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DScbsE6-.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Bqy0wCWo.js → entry.generated-DVOBR4CK.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Bqy0wCWo.js.map → entry.generated-DVOBR4CK.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-Dcm3s3ey.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CuZffmX3.js.map → entry.generated-Dcm3s3ey.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DjKX5KuB.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BMLdOzZs.js.map → entry.generated-DjKX5KuB.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Da6pELhK.js → entry.generated-O0hEhk-2.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-Da6pELhK.js.map → entry.generated-O0hEhk-2.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-R1BlPlZW.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BMeqWpPy.js.map → entry.generated-R1BlPlZW.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BhINWOfZ.js → entry.generated-iMJrYzAB.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-BhINWOfZ.js.map → entry.generated-iMJrYzAB.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-n_t4T8XC.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-sKnD2JaT.js.map → entry.generated-n_t4T8XC.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C-lyYGbo.js → entry.generated-oJwO9fIY.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-C-lyYGbo.js.map → entry.generated-oJwO9fIY.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-ollD3I52.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{entry.generated-CfkH92RS.js.map → entry.generated-ollD3I52.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/flip-XeJ05afl.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/flip-XeJ05afl.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/focus-handoff-BE3g0swK.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/focus-scope-DtaPVNl5.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{fragment-BzHC-hAJ.js → fragment-9OT0mn7F.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{fragment-BzHC-hAJ.js.map → fragment-9OT0mn7F.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/machine-CNnHDbyo.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{machine-DQfpKM3w.js.map → machine-CNnHDbyo.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{merge-bindings-C8ewA_FD.js → merge-bindings-BtqW3UgP.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{merge-bindings-C8ewA_FD.js.map → merge-bindings-BtqW3UgP.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/morph-Cq3V_23_.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-CbwLBhMt.js +3 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-CbwLBhMt.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/object-SRW-YaCA.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/pdd-BG5sXFGF.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/pdd-BG5sXFGF.js.map +1 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/props-change-2xfsIAEN.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/semantic-observer-CIoriWtV.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{styles-BstOueoe.js → styles-C9PrQrca.js} +2 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{styles-BstOueoe.js.map → styles-C9PrQrca.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/styles-CX2j92ex.js +2 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{styles-TfvwVPGw.js.map → styles-CX2j92ex.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CGwc8KXJ.js +4 -0
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{ui-BGfrCghL.js.map → ui-CGwc8KXJ.js.map} +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/accordion.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/button.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/checkbox.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/date-picker.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/direct-upload.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/dropdown.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/field.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/file-upload.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/formset.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/index.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/input.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/keybinding.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/modal.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/panels.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/radio.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/scroll-area.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/select.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/sidebar.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/slider.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/switch.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/table.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tabs.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/toast.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/tooltip.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/virtualizer.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/index.js.map +1 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +327 -324
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.js +11 -9
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/trellis.min.js +11 -9
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/anchored-popover-CSBqS_MK.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/anchored-popover-CSBqS_MK.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/bridge-TcE7HSvq.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cally-Z6G-rzr-.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cally-Z6G-rzr-.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-motion-DAUyPPWa.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-motion-DAUyPPWa.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-resizable-BQgJCSHn.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-resizable-BQgJCSHn.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-sortable-BLyIVEh9.js +0 -3
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/capability-sortable-BLyIVEh9.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/core-CogF8tNb.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/cursor-data-source-B2mQNyzN.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/drag-and-drop-cns3DNcf.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/drag-and-drop-cns3DNcf.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/element-adapter-native-data-key-CW8suC9A.js +0 -6
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/element-adapter-native-data-key-CW8suC9A.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B1wGmQth.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-B1wGmQth.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BBuJrkhp.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BMLdOzZs.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BMeqWpPy.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-BOk2j8j3.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-C-4OkQdv.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CfkH92RS.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-CuZffmX3.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-DTRN8-Ks.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-De9SwKec.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry.generated-sKnD2JaT.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Bu7BMlbI.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Bu7BMlbI.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Bxu-sgBm.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-Bxu-sgBm.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-dkzHCN26.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-g1AVE90L.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/entry2.generated-g1AVE90L.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/machine-DQfpKM3w.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-mw9QhBgu.js +0 -3
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/motion-mw9QhBgu.js.map +0 -1
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/styles-TfvwVPGw.js +0 -2
- package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-BGfrCghL.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-data-source-B2mQNyzN.js","names":[],"sources":["../../../../../../../../client/src/runtime/virtualizer-fragment.ts","../../../../../../../../client/src/runtime/virtual-window.ts","../../../../../../../../client/src/runtime/virtualizer-schema.ts","../../../../../../../../client/src/runtime/virtualizer.ts","../../../../../../../../client/src/runtime/cursor-data-source.ts"],"sourcesContent":["import {parseAssetDescriptors, type AssetDescriptor} from '../assets/bridge';\n\ntype VirtualizerFragmentOptions = {\n totalHeader: string;\n assetsHeader: string;\n metaSelector: string;\n};\n\ntype VirtualizerFragmentPayload = {\n html: string;\n assets: AssetDescriptor[];\n totalItems: number | null;\n};\n\nconst integer = (value: number): number => Math.max(0, Math.floor(value));\n\nconst parseAssets = (raw: string | null): AssetDescriptor[] => {\n if (raw === null) return [];\n return parseAssetDescriptors(JSON.parse(raw) as unknown);\n};\n\nconst parseVirtualizerFragmentResponse = async (\n response: Response,\n options: VirtualizerFragmentOptions,\n): Promise<VirtualizerFragmentPayload> => {\n const html = response.status === 204 ? '' : await response.text();\n const template = document.createElement('template');\n template.innerHTML = html;\n let totalItems: number | null = null;\n const rawHeaderTotal = response.headers.get(options.totalHeader);\n const headerTotal = rawHeaderTotal === null || rawHeaderTotal.trim() === ''\n ? Number.NaN\n : Number(rawHeaderTotal);\n if (Number.isFinite(headerTotal) && headerTotal >= 0) totalItems = integer(headerTotal);\n\n const meta = template.content.querySelector<HTMLTemplateElement>(options.metaSelector);\n if (meta) {\n if (totalItems === null) {\n try {\n const parsed = JSON.parse(meta.innerHTML) as {totalItems?: unknown};\n const inlineTotal = Number(parsed.totalItems);\n if (Number.isFinite(inlineTotal) && inlineTotal >= 0) totalItems = integer(inlineTotal);\n } catch {\n // Invalid optional metadata does not invalidate otherwise usable fragment HTML.\n }\n }\n meta.remove();\n }\n\n const container = document.createElement('div');\n container.append(template.content);\n return {\n html: container.innerHTML,\n assets: parseAssets(response.headers.get(options.assetsHeader)),\n totalItems,\n };\n};\n\nexport {parseVirtualizerFragmentResponse};\nexport type {VirtualizerFragmentOptions, VirtualizerFragmentPayload};\n","type VirtualWindowKind = string;\n\ntype VirtualWindowBase = {\n kind: VirtualWindowKind;\n key: string;\n};\n\ntype VirtualWindowAdapter<Input, Window extends VirtualWindowBase> = {\n compute(input: Input): Window;\n covers(mounted: Window, desired: Window): boolean;\n serialize(window: Window): Record<string, string>;\n};\n\ntype VirtualAxis = 'x' | 'y';\ntype VirtualScrollAlign = 'start' | 'center' | 'end' | 'auto';\n\ntype FixedAxisInputDetail = {\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n overscan?: number;\n};\n\ntype FixedAxisWindowInput = {\n axes: Partial<Record<VirtualAxis, FixedAxisInputDetail>>;\n};\n\ntype VirtualAxisWindow = {\n axis: VirtualAxis;\n start: number;\n count: number;\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n visibleStart: number;\n visibleCount: number;\n guardStart: number;\n guardEnd: number;\n translateOffset: number;\n spacerSize: number;\n};\n\ntype FixedAxisWindow = VirtualWindowBase & {\n kind: 'fixed-axis';\n axes: Partial<Record<VirtualAxis, VirtualAxisWindow>>;\n};\n\ntype FixedAxisScrollTarget = {\n axis: VirtualAxis;\n index: number;\n align?: VirtualScrollAlign;\n};\n\ntype FixedAxisWindowAdapter = VirtualWindowAdapter<FixedAxisWindowInput, FixedAxisWindow> & {\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number;\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number;\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput;\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number;\n};\n\ntype VirtualWindowRequest<Window extends VirtualWindowBase> = {\n block: string;\n window: Window;\n generation: number;\n requestGeneration: number;\n};\n\ntype VirtualWindowSnapshot<Window extends VirtualWindowBase> = {\n generation: number;\n mounted: ReadonlyMap<string, Window>;\n pending: ReadonlyMap<string, VirtualWindowRequest<Window>>;\n latestDesired: ReadonlyMap<string, Window>;\n};\n\ntype VirtualWindowControllerOptions<Window extends VirtualWindowBase> = {\n onChange?(snapshot: VirtualWindowSnapshot<Window>): void;\n};\n\ntype VirtualWindowController<Input, Window extends VirtualWindowBase> = {\n computeWindow(input: Input): Window;\n shouldLoad(desired: Window, mounted?: Window | null): boolean;\n begin(block: string, desired: Window): VirtualWindowRequest<Window> | null;\n commit(request: VirtualWindowRequest<Window>, mounted?: Window): boolean;\n fail(request: VirtualWindowRequest<Window>): boolean;\n next(block: string): Window | null;\n mounted(block: string): Window | null;\n pending(block: string): VirtualWindowRequest<Window> | null;\n invalidate(): void;\n snapshot(): VirtualWindowSnapshot<Window>;\n};\n\nconst finite = (value: number, fallback = 0): number => (\n Number.isFinite(value) ? value : fallback\n);\n\nconst nonNegativeInteger = (value: number): number => (\n Math.max(0, Math.floor(finite(value)))\n);\n\nconst positive = (value: number, fallback = 1): number => (\n Math.max(Number.EPSILON, finite(value, fallback))\n);\n\nconst clamp = (value: number, minimum: number, maximum: number): number => (\n Math.min(maximum, Math.max(minimum, value))\n);\n\nconst computeAxis = (axis: VirtualAxis, input: FixedAxisInputDetail): VirtualAxisWindow => {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const buffer = nonNegativeInteger(input.buffer);\n const visibleCount = Math.min(total, Math.max(1, Math.ceil(viewportSize / itemSize)));\n const maximumVisibleStart = Math.max(0, total - visibleCount);\n const scrollOffset = clamp(\n Math.max(0, finite(input.scrollOffset)),\n 0,\n Math.max(0, total * itemSize - viewportSize),\n );\n const visibleStart = clamp(Math.floor(scrollOffset / itemSize), 0, maximumVisibleStart);\n const count = Math.min(total, visibleCount + (buffer * 2));\n const start = clamp(visibleStart - buffer, 0, Math.max(0, total - count));\n\n return {\n axis,\n start,\n count,\n total,\n itemSize,\n viewportSize,\n scrollOffset,\n buffer,\n visibleStart,\n visibleCount,\n guardStart: Math.min(total, start + buffer),\n guardEnd: Math.max(0, start + count - buffer),\n translateOffset: start * itemSize,\n spacerSize: total * itemSize,\n };\n};\n\nconst fixedAxisWindowAdapter: FixedAxisWindowAdapter = {\n compute(input: FixedAxisWindowInput): FixedAxisWindow {\n const axes: FixedAxisWindow['axes'] = {};\n if (input.axes.x) axes.x = computeAxis('x', input.axes.x);\n if (input.axes.y) axes.y = computeAxis('y', input.axes.y);\n const key = (['x', 'y'] as const)\n .map((axis) => {\n const detail = axes[axis];\n return detail ? `${axis}:${detail.start}:${detail.count}:${detail.total}` : '';\n })\n .filter(Boolean)\n .join('|');\n return {kind: 'fixed-axis', key, axes};\n },\n\n covers(mounted: FixedAxisWindow, desired: FixedAxisWindow): boolean {\n return (['x', 'y'] as const).every((axis) => {\n const wanted = desired.axes[axis];\n if (!wanted) return true;\n const current = mounted.axes[axis];\n if (!current || current.total !== wanted.total || current.itemSize !== wanted.itemSize) return false;\n const desiredEnd = wanted.visibleStart + wanted.visibleCount;\n return wanted.visibleStart >= current.guardStart && desiredEnd <= current.guardEnd;\n });\n },\n\n serialize(window: FixedAxisWindow): Record<string, string> {\n const axes: Record<string, {start: number; count: number; total: number}> = {};\n (['x', 'y'] as const).forEach((axis) => {\n const detail = window.axes[axis];\n if (detail) axes[axis] = {start: detail.start, count: detail.count, total: detail.total};\n });\n return {window: JSON.stringify(axes)};\n },\n\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.spacerSize ?? 0;\n },\n\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.translateOffset ?? 0;\n },\n\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput {\n const current = input.axes[axis];\n if (!current) return input;\n return {...input, axes: {...input.axes, [axis]: {...current, total: nonNegativeInteger(total)}}};\n },\n\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const index = clamp(nonNegativeInteger(target.index), 0, Math.max(0, total - 1));\n const itemStart = index * itemSize;\n const itemEnd = itemStart + itemSize;\n const maximum = Math.max(0, total * itemSize - viewportSize);\n let offset = itemStart;\n if (target.align === 'center') offset = itemStart - ((viewportSize - itemSize) / 2);\n else if (target.align === 'end') offset = itemEnd - viewportSize;\n else if (target.align === 'auto') {\n const current = Math.max(0, finite(input.scrollOffset));\n if (itemStart >= current && itemEnd <= current + viewportSize) return clamp(current, 0, maximum);\n offset = itemStart < current ? itemStart : itemEnd - viewportSize;\n }\n return clamp(offset, 0, maximum);\n },\n};\n\nconst createVirtualWindowController = <Input, Window extends VirtualWindowBase>(\n adapter: VirtualWindowAdapter<Input, Window>,\n options: VirtualWindowControllerOptions<Window> = {},\n): VirtualWindowController<Input, Window> => {\n let generation = 0;\n let requestGeneration = 0;\n const mountedWindows = new Map<string, Window>();\n const pendingWindows = new Map<string, VirtualWindowRequest<Window>>();\n const latestDesired = new Map<string, Window>();\n\n const snapshot = (): VirtualWindowSnapshot<Window> => ({\n generation,\n mounted: new Map(mountedWindows),\n pending: new Map(pendingWindows),\n latestDesired: new Map(latestDesired),\n });\n const notify = (): void => options.onChange?.(snapshot());\n const isCurrent = (request: VirtualWindowRequest<Window>): boolean => {\n const pending = pendingWindows.get(request.block);\n return request.generation === generation\n && pending?.requestGeneration === request.requestGeneration;\n };\n\n return {\n computeWindow: (input) => adapter.compute(input),\n shouldLoad: (desired, mounted) => !mounted || !adapter.covers(mounted, desired),\n begin(block, desired) {\n latestDesired.set(block, desired);\n if (pendingWindows.has(block) || !this.shouldLoad(desired, mountedWindows.get(block))) {\n notify();\n return null;\n }\n const request = {\n block,\n window: desired,\n generation,\n requestGeneration: ++requestGeneration,\n };\n pendingWindows.set(block, request);\n notify();\n return request;\n },\n commit(request, mounted = request.window) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n mountedWindows.set(request.block, mounted);\n notify();\n return true;\n },\n fail(request) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n notify();\n return true;\n },\n next(block) {\n if (pendingWindows.has(block)) return null;\n const desired = latestDesired.get(block);\n if (!desired) return null;\n const mounted = mountedWindows.get(block);\n if (mounted && adapter.covers(mounted, desired)) return null;\n return desired;\n },\n mounted: (block) => mountedWindows.get(block) ?? null,\n pending: (block) => pendingWindows.get(block) ?? null,\n invalidate() {\n generation += 1;\n mountedWindows.clear();\n pendingWindows.clear();\n latestDesired.clear();\n notify();\n },\n snapshot,\n };\n};\n\nexport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n};\nexport type {\n FixedAxisInputDetail,\n FixedAxisScrollTarget,\n FixedAxisWindowAdapter,\n FixedAxisWindow,\n FixedAxisWindowInput,\n VirtualAxis,\n VirtualAxisWindow,\n VirtualScrollAlign,\n VirtualWindowAdapter,\n VirtualWindowBase,\n VirtualWindowController,\n VirtualWindowControllerOptions,\n VirtualWindowKind,\n VirtualWindowRequest,\n VirtualWindowSnapshot,\n};\n","import {bool, number, oneOf, string, type SchemaToProps} from './codecs';\n\nconst VIRTUALIZER_AXES = ['vertical'] as const;\ntype VirtualizerAxis = typeof VIRTUALIZER_AXES[number];\n\nconst virtualizerSchema = {\n fetchUrl: string,\n cursor: bool,\n totalItems: number.min(0).default(0),\n itemSize: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n axis: oneOf(VIRTUALIZER_AXES, 'vertical' as VirtualizerAxis),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n windowParam: string.default('window'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n scrollArea: bool.default(true),\n fill: bool.default(true),\n class: string,\n scrollAreaClass: string,\n viewportClass: string,\n spacerClass: string,\n blockClass: string,\n};\n\ntype VirtualizerProps = SchemaToProps<typeof virtualizerSchema>;\n\nexport {VIRTUALIZER_AXES, virtualizerSchema};\nexport type {VirtualizerAxis, VirtualizerProps};\n","import type Alpine from 'alpinejs';\n\nimport {defineProps, type PropState} from './codecs';\nimport {registerDomInvalidationOwner} from './dom-invalidation';\nimport {replaceFragmentChildren} from './engine/fragment';\nimport type {TrellisAlpineComponent} from './index';\nimport {\n parseVirtualizerFragmentResponse,\n type VirtualizerFragmentPayload,\n} from './virtualizer-fragment';\nimport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n type FixedAxisWindow,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from './virtual-window';\nimport {virtualizerSchema} from './virtualizer-schema';\nimport type {\n CursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\n\ntype ResetOptions = {scrollTop?: number};\ntype SetUrlOptions = {reset?: boolean};\n\n/** Public Alpine API for `ui.virtualizer`. @public */\ninterface UiVirtualizerApi<Query = unknown> {\n /** Whether the configured cursor data source supports arbitrary index seeks. */\n readonly supportsSeek: boolean;\n /** Scrolls a logical item into the requested vertical alignment. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replaces the known logical item count and reloads mounted ranges. */\n setTotalItems(count: number): void;\n /** Replaces the fragment endpoint and optionally resets to the top. */\n setUrl(url: string, options?: SetUrlOptions): void;\n /** Replaces cursor-mode query state and resets to the first cursor. */\n setQuery(query: Query): void;\n /** Invalidates all blocks and reloads them around a scroll position. */\n reset(options?: ResetOptions): void;\n /** Reloads all blocks without changing the fragment endpoint. */\n reload(options?: ResetOptions): void;\n}\n\ntype VirtualizerData<Query = unknown> = UiVirtualizerApi<Query> & {\n props: PropState<typeof virtualizerSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {\n key: string;\n element: HTMLElement;\n};\n\ntype VirtualizerOptions<Query, Content> = {\n cursor?: CursorVirtualizerOptions<Query, Content>;\n};\n\ntype CursorMounted<Content> = {\n block: BlockRecord;\n page: CursorPage<Content>;\n startIndex: number;\n count: number;\n};\n\ntype CursorRequest = {\n generation: number;\n id: number;\n aborter: AbortController;\n};\n\ntype CursorPageKind = 'page' | 'seek';\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst UiVirtualizer = <Query = unknown, Content = unknown>(\n AlpineInstance: Alpine.Alpine,\n options: VirtualizerOptions<Query, Content> = {},\n): TrellisAlpineComponent<VirtualizerData<Query>> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let blocks: BlockRecord[] = [];\n let totalItems = 0;\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let scrollFrame = 0;\n let loading = 0;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let unregisterDomInvalidation: (() => void) | null = null;\n let suppressPropReload = false;\n const aborters = new Map<string, AbortController>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n const cursor = options.cursor;\n let cursorQuery = cursor?.query;\n let cursorGeneration = 0;\n let cursorRequestId = 0;\n let cursorPaging = false;\n let cursorFailed = false;\n let cursorLatestScrollTop: number | null = null;\n let cursorSeekTimer = 0;\n let cursorSeekIndex: number | null = null;\n let cursorActiveSeekIndex: number | null = null;\n let cursorSeekAborter: AbortController | null = null;\n const cursorRequests = new Map<string, CursorRequest>();\n const cursorMounted = new Map<string, CursorMounted<Content>>();\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n const cursorExtent = cursorMounted.size === 0\n ? 0\n : Math.max(...[...cursorMounted.values()].map(({startIndex, count}) => startIndex + count));\n const cursorHasNext = [...cursorMounted.values()].some(({page, startIndex, count}) => (\n startIndex + count === cursorExtent && page.next.available\n ));\n const spacerItems = cursor && totalItems === 0\n ? cursorExtent + (cursorHasNext ? integer(component.props.bufferSize, 1) : 0)\n : totalItems;\n root.toggleAttribute('data-loading', loading > 0);\n root.toggleAttribute('data-empty', cursor ? cursorMounted.size === 0 && loading === 0 : totalItems === 0);\n spacer.style.height = `${Math.max(spacerItems * component.props.itemSize, component.props.itemSize)}px`;\n };\n const updateTotal = (next: number): boolean => {\n const normalized = integer(next);\n if (normalized === totalItems) return false;\n totalItems = normalized;\n syncState();\n dispatch('ui:virtualizer-total-change', {totalItems});\n dispatch('ui:virtualizer-axis-total-change', {axis: 'y', total: totalItems, window: null});\n return true;\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {\n y: {\n total: totalItems,\n itemSize: component.props.itemSize,\n viewportSize: component.props.bufferSize * component.props.itemSize,\n scrollOffset: start * component.props.itemSize,\n buffer: 0,\n },\n }});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalItems === 0 || (!cursor && !component.props.fetchUrl.trim())) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalItems - 1) / size) * size;\n const starts = [center - size, center, center + size]\n .map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Vertical virtualizer requires a y window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const replaceBlock = async (\n block: BlockRecord,\n payload: VirtualizerFragmentPayload,\n shouldReplace: () => boolean,\n ): Promise<boolean> => {\n const hadFocus = block.element.contains(document.activeElement);\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace,\n });\n if (replaced && hadFocus) viewport?.focus({preventScroll: true});\n return replaced;\n };\n const positionBlock = (block: BlockRecord, startIndex: number, count: number): void => {\n block.element.style.height = `${count * component.props.itemSize}px`;\n block.element.style.transform = `translateY(${startIndex * component.props.itemSize}px)`;\n };\n const settle = (): void => {\n loading = Math.max(0, loading - 1);\n syncState();\n if (loading > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n aborters.set(block.key, aborter);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {\n method: 'GET',\n headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n },\n signal: aborter.signal,\n });\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceBlock(\n block,\n payload,\n () => controller.pending(block.key) === request && !destroyed,\n );\n if (!replaced) return;\n const totalChanged = payload.totalItems !== null && updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n positionBlock(block, axis.start, axis.count);\n dispatch('ui:virtualizer-load', {block: block.key, window});\n if (totalChanged) latestScrollTop = viewport?.scrollTop ?? 0;\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, window, status: 0, error});\n } finally {\n if (aborters.get(block.key) === aborter) aborters.delete(block.key);\n settle();\n }\n };\n const cursorLimit = (): number => integer(component.props.bufferSize, 1);\n const cursorRecords = (): CursorMounted<Content>[] => (\n [...cursorMounted.values()].sort((left, right) => left.startIndex - right.startIndex)\n );\n const cursorRequestIsCurrent = (block: BlockRecord, request: CursorRequest): boolean => (\n !destroyed\n && request.generation === cursorGeneration\n && cursorRequests.get(block.key)?.id === request.id\n );\n const loadCursorPage = async (\n block: BlockRecord,\n getPage: (signal: AbortSignal) => Promise<CursorPage<Content>>,\n fallbackStartIndex: number,\n suppliedAborter?: AbortController,\n kind: CursorPageKind = 'page',\n ): Promise<CursorMounted<Content> | null> => {\n if (!cursor || cursorRequests.has(block.key)) return null;\n const aborter = suppliedAborter ?? new AbortController();\n const request: CursorRequest = {\n generation: cursorGeneration,\n id: ++cursorRequestId,\n aborter,\n };\n cursorRequests.set(block.key, request);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, mode: 'cursor'});\n try {\n const page = await getPage(aborter.signal);\n if (!cursorRequestIsCurrent(block, request)) return null;\n if (kind === 'seek' && page.startIndex === undefined) {\n throw new Error('Cursor seek response requires startIndex.');\n }\n const payload = await cursor.responseAdapter(page.content, page);\n if (!cursorRequestIsCurrent(block, request)) return null;\n const startIndex = page.startIndex === undefined\n ? integer(fallbackStartIndex)\n : integer(page.startIndex);\n const pageTotal = payload.totalItems ?? totalItems;\n const returnedCount = payload.itemCount === undefined\n ? cursorLimit()\n : integer(payload.itemCount);\n const count = pageTotal > 0\n ? Math.min(cursorLimit(), Math.max(0, pageTotal - startIndex))\n : returnedCount;\n const replaced = await replaceBlock(\n block,\n payload,\n () => cursorRequestIsCurrent(block, request),\n );\n if (!replaced || !cursorRequestIsCurrent(block, request)) return null;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n else if (!page.next.available) updateTotal(startIndex + count);\n const mounted = {block, page, startIndex, count};\n cursorMounted.set(block.key, mounted);\n positionBlock(block, startIndex, count);\n dispatch('ui:virtualizer-load', {\n block: block.key,\n mode: 'cursor',\n page: {\n previous: page.previous,\n next: page.next,\n ...(page.startIndex === undefined ? {} : {startIndex: page.startIndex}),\n },\n startIndex,\n });\n return mounted;\n } catch (error) {\n if (aborter.signal.aborted || !cursorRequestIsCurrent(block, request)) return null;\n cursorFailed = true;\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, mode: 'cursor', status: 0, error});\n return null;\n } finally {\n if (cursorRequests.get(block.key) === request) cursorRequests.delete(block.key);\n loading = Math.max(0, loading - 1);\n syncState();\n }\n };\n const finishCursorPaging = (): void => {\n cursorPaging = false;\n const scrollTop = cursorLatestScrollTop ?? viewport?.scrollTop ?? 0;\n cursorLatestScrollTop = null;\n reconcileCursor(scrollTop);\n };\n const loadInitialCursorPages = async (): Promise<void> => {\n if (!cursor || cursorPaging || cursorFailed || cursorMounted.size > 0) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n try {\n const first = await loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.first({limit: cursorLimit(), query: cursorQuery as Query, signal}),\n 0,\n );\n if (!first || generation !== cursorGeneration) return;\n let current = first;\n for (const block of blocks.slice(1)) {\n if (!current.page.next.available) break;\n const nextCursor = current.page.next.cursor;\n const next = await loadCursorPage(\n block,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n current.startIndex + current.count,\n );\n if (!next || generation !== cursorGeneration) break;\n current = next;\n }\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadNextCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const last = records.at(-1);\n if (!last?.page.next.available) return;\n const recycled = records[0]?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const nextCursor = last.page.next.cursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n last.startIndex + last.count,\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadPreviousCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const first = records[0];\n if (!first?.page.previous.available) return;\n const recycled = records.at(-1)?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const previousCursor = first.page.previous.cursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.previous({\n cursor: previousCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, first.startIndex - cursorLimit()),\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const clearCursorSeekTimer = (): void => {\n if (cursorSeekTimer) window.clearTimeout(cursorSeekTimer);\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n };\n const performCursorSeek = async (index: number): Promise<void> => {\n const seek = cursor?.dataSource.seek;\n if (!cursor || !seek) return;\n cursorSeekAborter?.abort();\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorPaging = true;\n const generation = cursorGeneration;\n const aborter = new AbortController();\n cursorSeekAborter = aborter;\n cursorActiveSeekIndex = index;\n const middle = blocks[1]!;\n cursorMounted.clear();\n blocks.forEach((block) => {\n if (block !== middle) void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n try {\n const resolved = await loadCursorPage(\n middle,\n (signal) => seek({index, limit: cursorLimit(), query: cursorQuery as Query, signal}),\n index,\n aborter,\n 'seek',\n );\n if (!resolved || generation !== cursorGeneration || cursorSeekAborter !== aborter) return;\n const adjacent: Array<Promise<CursorMounted<Content> | null>> = [];\n if (resolved.page.previous.available) {\n const previousCursor = resolved.page.previous.cursor;\n adjacent.push(loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.previous({\n cursor: previousCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, resolved.startIndex - cursorLimit()),\n ));\n }\n if (resolved.page.next.available) {\n const nextCursor = resolved.page.next.cursor;\n adjacent.push(loadCursorPage(\n blocks[2]!,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n resolved.startIndex + resolved.count,\n ));\n }\n await Promise.all(adjacent);\n } finally {\n if (cursorSeekAborter === aborter) {\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n if (generation === cursorGeneration) finishCursorPaging();\n }\n }\n };\n const scheduleCursorSeek = (index: number): void => {\n if (!cursor?.dataSource.seek) return;\n const clamped = totalItems > 0 ? Math.min(Math.max(0, totalItems - 1), integer(index)) : integer(index);\n if (cursorRecords().some((record) => (\n clamped >= record.startIndex && clamped < record.startIndex + record.count\n ))) return;\n if (cursorSeekIndex === clamped || cursorActiveSeekIndex === clamped) return;\n clearCursorSeekTimer();\n cursorSeekIndex = clamped;\n cursorSeekTimer = window.setTimeout(() => {\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n void performCursorSeek(clamped);\n }, integer(cursor.seekDebounce ?? 100));\n };\n const reconcileCursor = (scrollTop: number): void => {\n if (!cursor) return;\n const index = totalItems > 0\n ? Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize))\n : Math.floor(Math.max(0, scrollTop) / component.props.itemSize);\n if (cursorSeekAborter && cursor.dataSource.seek && cursorActiveSeekIndex !== index) {\n cursorLatestScrollTop = scrollTop;\n scheduleCursorSeek(index);\n return;\n }\n if (cursorPaging || loading > 0) {\n cursorLatestScrollTop = scrollTop;\n return;\n }\n const records = cursorRecords();\n if (records.length === 0) {\n void loadInitialCursorPages();\n return;\n }\n const covered = records.find((record) => (\n index >= record.startIndex && index < record.startIndex + record.count\n ));\n if (covered) {\n clearCursorSeekTimer();\n if (covered === records[0] && covered.page.previous.available) void loadPreviousCursorPage();\n else if (covered === records.at(-1) && covered.page.next.available) void loadNextCursorPage();\n return;\n }\n if (cursor.dataSource.seek) {\n scheduleCursorSeek(index);\n return;\n }\n if (index < records[0]!.startIndex) void loadPreviousCursorPage();\n else void loadNextCursorPage();\n };\n const reconcile = (scrollTop: number): void => {\n if (cursor) {\n reconcileCursor(scrollTop);\n return;\n }\n if (loading > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const signature = desired.map((window) => window.key).join(',');\n const logicalIndex = Math.min(\n Math.max(0, totalItems - 1),\n Math.floor(Math.max(0, scrollTop) / component.props.itemSize),\n );\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:virtualizer-window', {window: center});\n dispatch('ui:virtualizer-range', {\n start: axis.start,\n count: axis.count,\n end: axis.start + axis.count,\n window: center,\n });\n }\n if (!signature) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n aborters.forEach((aborter) => aborter.abort());\n aborters.clear();\n loading = 0;\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n cursorGeneration += 1;\n clearCursorSeekTimer();\n cursorSeekAborter?.abort();\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorMounted.clear();\n cursorPaging = false;\n cursorFailed = false;\n cursorLatestScrollTop = null;\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n\n const component: TrellisAlpineComponent<VirtualizerData<Query>> = {\n supportsSeek: Boolean(cursor?.dataSource.seek),\n props: null as unknown as PropState<typeof virtualizerSchema>,\n init(): void {\n root = this.$el;\n destroyed = false;\n this.props = defineProps({\n el: root,\n schema: virtualizerSchema,\n onChange: (_state, changes) => {\n if (suppressPropReload) return;\n if (changes.some(({key}) => key === 'totalItems')) {\n updateTotal(this.props.totalItems);\n if (!cursor) this.reload();\n } else if (changes.some(({key}) => ['fetchUrl', 'itemSize', 'bufferSize'].includes(key))) {\n this.reload();\n }\n },\n });\n totalItems = cursor\n ? integer(this.props.totalItems)\n : this.props.fetchUrl.trim()\n ? Math.max(1, integer(this.props.totalItems))\n : 0;\n viewport = root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]') ?? root;\n spacer = root.querySelector<HTMLElement>('[data-ui-virtualizer-spacer]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-virtualizer-block]'))\n .slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!spacer || blocks.length !== 3) throw new Error('Virtualizer requires one spacer and three block containers.');\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => {\n if (scrollFrame) return;\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = 0;\n if (viewport) reconcile(viewport.scrollTop);\n });\n }, {passive: true, signal: listenerAborter.signal});\n unregisterDomInvalidation = registerDomInvalidationOwner(root, {\n invalidateDom: () => component.reload(),\n });\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: 0,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index: this.props.initialIndex});\n syncState();\n reconcile(viewport.scrollTop);\n },\n destroy(): void {\n destroyed = true;\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n listenerAborter?.abort();\n listenerAborter = null;\n unregisterDomInvalidation?.();\n unregisterDomInvalidation = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n spacer = null;\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (!viewport) return;\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: viewport.scrollTop,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index, align});\n reconcile(viewport.scrollTop);\n },\n setTotalItems(count): void {\n updateTotal(count);\n if (cursor) {\n if (viewport) reconcileCursor(viewport.scrollTop);\n return;\n }\n const scrollTop = viewport?.scrollTop;\n this.reload(scrollTop === undefined ? {} : {scrollTop});\n },\n setUrl(url, options = {}): void {\n const nextUrl = String(url).trim();\n suppressPropReload = true;\n this.props.fetchUrl = nextUrl;\n suppressPropReload = false;\n updateTotal(nextUrl ? Math.max(1, integer(this.props.totalItems)) : 0);\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n setQuery(query): void {\n if (!cursor) return;\n cursorQuery = query;\n this.reset();\n },\n reset(options = {}): void {\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n const scrollTop = options.scrollTop ?? viewport?.scrollTop ?? 0;\n invalidate();\n if (viewport) viewport.scrollTop = Math.max(0, scrollTop);\n reconcile(scrollTop);\n },\n };\n return component;\n};\n\nexport {UiVirtualizer};\nexport type {\n CursorContinuation,\n CursorDataSource,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\nexport type {\n ResetOptions,\n SetUrlOptions,\n UiVirtualizerApi,\n VirtualizerOptions,\n VirtualizerData,\n VirtualScrollAlign,\n};\n","import {parseAssetDescriptors, type AssetDescriptor} from '../assets/bridge';\n\ntype CursorContinuation =\n | {available: false}\n | {available: true; cursor: string};\n\ntype CursorPage<Content> = {\n content: Content;\n previous: CursorContinuation;\n next: CursorContinuation;\n startIndex?: number;\n};\n\ntype CursorRenderPayload = {\n html: string;\n assets: AssetDescriptor[];\n totalItems: number | null;\n itemCount?: number;\n};\n\ntype SoughtCursorPage<Content> = CursorPage<Content> & {\n startIndex: number;\n};\n\ntype CursorFirstArgs<Query> = {\n limit: number;\n query: Query;\n signal: AbortSignal;\n};\n\ntype CursorMoveArgs<Query> = CursorFirstArgs<Query> & {\n cursor: string;\n};\n\ntype CursorSeekArgs<Query> = CursorFirstArgs<Query> & {\n index: number;\n};\n\ntype CursorDataSource<Query, Content> = {\n first(args: CursorFirstArgs<Query>): Promise<CursorPage<Content>>;\n next(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n previous(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n seek?(args: CursorSeekArgs<Query>): Promise<SoughtCursorPage<Content>>;\n};\n\ntype CursorResponseAdapter<Content> = (\n content: Content,\n page: CursorPage<Content>,\n) => CursorRenderPayload | Promise<CursorRenderPayload>;\n\ntype CursorVirtualizerOptions<Query, Content> = {\n dataSource: CursorDataSource<Query, Content>;\n query: Query;\n responseAdapter: CursorResponseAdapter<Content>;\n seekDebounce?: number;\n};\n\ntype ServerCursorResponse = {\n content: string;\n assets: AssetDescriptor[];\n previous: CursorContinuation;\n next: CursorContinuation;\n startIndex?: number;\n total?: number;\n count?: number;\n};\n\nconst serverCursorResponse = (value: unknown): ServerCursorResponse => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new TypeError('Cursor response must be an object.');\n }\n const response = value as Record<string, unknown>;\n const fields = new Set(['content', 'assets', 'previous', 'next', 'startIndex', 'total', 'count']);\n for (const name of Object.keys(response)) {\n if (!fields.has(name)) {\n throw new TypeError(`Cursor response contains unexpected field ${name}.`);\n }\n }\n const continuation = (name: 'previous' | 'next'): CursorContinuation => {\n const candidate = response[name];\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new TypeError(`Cursor response ${name} must be a continuation object.`);\n }\n const record = candidate as Record<string, unknown>;\n const available = record.available;\n if (available !== false && available !== true) {\n throw new TypeError(`Cursor response ${name}.available must be a boolean.`);\n }\n if (!available && Object.hasOwn(record, 'cursor')) {\n throw new TypeError(`Unavailable cursor response ${name} cannot contain a cursor.`);\n }\n const fields = new Set(available ? ['available', 'cursor'] : ['available']);\n for (const field of Object.keys(record)) {\n if (!fields.has(field)) {\n throw new TypeError(`Cursor response ${name} contains unexpected field ${field}.`);\n }\n }\n if (!available) {\n return {available: false};\n }\n if (typeof record.cursor !== 'string' || record.cursor.length === 0) {\n throw new TypeError(`Available cursor response ${name} requires a non-empty cursor.`);\n }\n return {available: true, cursor: record.cursor};\n };\n const optionalInteger = (name: 'startIndex' | 'total' | 'count'): number | undefined => {\n const candidate = response[name];\n if (candidate === undefined) return undefined;\n if (!Number.isInteger(candidate) || Number(candidate) < 0) {\n throw new TypeError(`Cursor response ${name} must be a non-negative integer.`);\n }\n return Number(candidate);\n };\n if (typeof response.content !== 'string') {\n throw new TypeError('Cursor response content must be a string.');\n }\n const startIndex = optionalInteger('startIndex');\n const total = optionalInteger('total');\n const count = optionalInteger('count');\n return {\n content: response.content,\n assets: Object.hasOwn(response, 'assets') ? parseAssetDescriptors(response.assets) : [],\n previous: continuation('previous'),\n next: continuation('next'),\n ...(startIndex === undefined ? {} : {startIndex}),\n ...(total === undefined ? {} : {total}),\n ...(count === undefined ? {} : {count}),\n };\n};\n\nconst serverCursorOptions = (\n element: () => HTMLElement,\n): CursorVirtualizerOptions<null, ServerCursorResponse> => {\n const requestPage = async ({\n cursor,\n direction,\n limit,\n signal,\n index,\n }: {\n cursor: string | null;\n direction: 'forward' | 'backward';\n limit: number;\n signal: AbortSignal;\n index?: number;\n }): Promise<CursorPage<ServerCursorResponse>> => {\n const fetchUrl = element().dataset.fetchUrl ?? '';\n const url = new URL(fetchUrl, document.baseURI);\n url.searchParams.set('cursor', cursor ?? '');\n url.searchParams.set('direction', direction);\n url.searchParams.set('limit', String(limit));\n if (index !== undefined) url.searchParams.set('index', String(index));\n const href = /^[a-z][a-z\\d+.-]*:/i.test(fetchUrl) || fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n const response = await fetch(href, {signal});\n if (!response.ok) throw new Error(`Cursor request failed (${response.status}).`);\n const page = serverCursorResponse(await response.json());\n return {...page, content: page};\n };\n return {\n query: null,\n dataSource: {\n first: ({limit, signal}) => requestPage({cursor: null, direction: 'forward', limit, signal}),\n next: ({cursor, limit, signal}) => requestPage({cursor, direction: 'forward', limit, signal}),\n previous: ({cursor, limit, signal}) => requestPage({cursor, direction: 'backward', limit, signal}),\n seek: ({index, limit, signal}) => requestPage({\n cursor: null, direction: 'forward', index, limit, signal,\n }).then((page) => {\n if (page.startIndex === undefined) throw new Error('Cursor seek response is missing startIndex.');\n return {...page, startIndex: page.startIndex};\n }),\n },\n responseAdapter: (page) => ({\n html: page.content,\n assets: page.assets,\n totalItems: page.total ?? null,\n ...(page.count === undefined ? {} : {itemCount: page.count}),\n }),\n };\n};\n\nexport {serverCursorOptions};\n\nexport type {\n CursorDataSource,\n CursorContinuation,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n ServerCursorResponse,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cursor-data-source-FA9FLGtB.js","names":[],"sources":["../../../../../../../../client/src/runtime/virtualizer-fragment.ts","../../../../../../../../client/src/runtime/virtual-window.ts","../../../../../../../../client/src/runtime/virtualizer-schema.ts","../../../../../../../../client/src/runtime/virtualizer.ts","../../../../../../../../client/src/runtime/cursor-data-source.ts"],"sourcesContent":["import {parseAssetDescriptors, type AssetDescriptor} from '../assets/bridge';\n\ntype VirtualizerFragmentOptions = {\n totalHeader: string;\n assetsHeader: string;\n metaSelector: string;\n};\n\ntype VirtualizerFragmentPayload = {\n html: string;\n assets: AssetDescriptor[];\n totalItems: number | null;\n};\n\nconst integer = (value: number): number => Math.max(0, Math.floor(value));\n\nconst parseAssets = (raw: string | null): AssetDescriptor[] => {\n if (raw === null) return [];\n return parseAssetDescriptors(JSON.parse(raw) as unknown);\n};\n\nconst parseVirtualizerFragmentResponse = async (\n response: Response,\n options: VirtualizerFragmentOptions,\n): Promise<VirtualizerFragmentPayload> => {\n const html = response.status === 204 ? '' : await response.text();\n const template = document.createElement('template');\n template.innerHTML = html;\n let totalItems: number | null = null;\n const rawHeaderTotal = response.headers.get(options.totalHeader);\n const headerTotal = rawHeaderTotal === null || rawHeaderTotal.trim() === ''\n ? Number.NaN\n : Number(rawHeaderTotal);\n if (Number.isFinite(headerTotal) && headerTotal >= 0) totalItems = integer(headerTotal);\n\n const meta = template.content.querySelector<HTMLTemplateElement>(options.metaSelector);\n if (meta) {\n if (totalItems === null) {\n try {\n const parsed = JSON.parse(meta.innerHTML) as {totalItems?: unknown};\n const inlineTotal = Number(parsed.totalItems);\n if (Number.isFinite(inlineTotal) && inlineTotal >= 0) totalItems = integer(inlineTotal);\n } catch {\n // Invalid optional metadata does not invalidate otherwise usable fragment HTML.\n }\n }\n meta.remove();\n }\n\n const container = document.createElement('div');\n container.append(template.content);\n return {\n html: container.innerHTML,\n assets: parseAssets(response.headers.get(options.assetsHeader)),\n totalItems,\n };\n};\n\nexport {parseVirtualizerFragmentResponse};\nexport type {VirtualizerFragmentOptions, VirtualizerFragmentPayload};\n","type VirtualWindowKind = string;\n\ntype VirtualWindowBase = {\n kind: VirtualWindowKind;\n key: string;\n};\n\ntype VirtualWindowAdapter<Input, Window extends VirtualWindowBase> = {\n compute(input: Input): Window;\n covers(mounted: Window, desired: Window): boolean;\n serialize(window: Window): Record<string, string>;\n};\n\ntype VirtualAxis = 'x' | 'y';\ntype VirtualScrollAlign = 'start' | 'center' | 'end' | 'auto';\n\ntype FixedAxisInputDetail = {\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n overscan?: number;\n};\n\ntype FixedAxisWindowInput = {\n axes: Partial<Record<VirtualAxis, FixedAxisInputDetail>>;\n};\n\ntype VirtualAxisWindow = {\n axis: VirtualAxis;\n start: number;\n count: number;\n total: number;\n itemSize: number;\n viewportSize: number;\n scrollOffset: number;\n buffer: number;\n visibleStart: number;\n visibleCount: number;\n guardStart: number;\n guardEnd: number;\n translateOffset: number;\n spacerSize: number;\n};\n\ntype FixedAxisWindow = VirtualWindowBase & {\n kind: 'fixed-axis';\n axes: Partial<Record<VirtualAxis, VirtualAxisWindow>>;\n};\n\ntype FixedAxisScrollTarget = {\n axis: VirtualAxis;\n index: number;\n align?: VirtualScrollAlign;\n};\n\ntype FixedAxisWindowAdapter = VirtualWindowAdapter<FixedAxisWindowInput, FixedAxisWindow> & {\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number;\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number;\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput;\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number;\n};\n\ntype VirtualWindowRequest<Window extends VirtualWindowBase> = {\n block: string;\n window: Window;\n generation: number;\n requestGeneration: number;\n};\n\ntype VirtualWindowSnapshot<Window extends VirtualWindowBase> = {\n generation: number;\n mounted: ReadonlyMap<string, Window>;\n pending: ReadonlyMap<string, VirtualWindowRequest<Window>>;\n latestDesired: ReadonlyMap<string, Window>;\n};\n\ntype VirtualWindowControllerOptions<Window extends VirtualWindowBase> = {\n onChange?(snapshot: VirtualWindowSnapshot<Window>): void;\n};\n\ntype VirtualWindowController<Input, Window extends VirtualWindowBase> = {\n computeWindow(input: Input): Window;\n shouldLoad(desired: Window, mounted?: Window | null): boolean;\n begin(block: string, desired: Window): VirtualWindowRequest<Window> | null;\n commit(request: VirtualWindowRequest<Window>, mounted?: Window): boolean;\n fail(request: VirtualWindowRequest<Window>): boolean;\n next(block: string): Window | null;\n mounted(block: string): Window | null;\n pending(block: string): VirtualWindowRequest<Window> | null;\n invalidate(): void;\n snapshot(): VirtualWindowSnapshot<Window>;\n};\n\nconst finite = (value: number, fallback = 0): number => (\n Number.isFinite(value) ? value : fallback\n);\n\nconst nonNegativeInteger = (value: number): number => (\n Math.max(0, Math.floor(finite(value)))\n);\n\nconst positive = (value: number, fallback = 1): number => (\n Math.max(Number.EPSILON, finite(value, fallback))\n);\n\nconst clamp = (value: number, minimum: number, maximum: number): number => (\n Math.min(maximum, Math.max(minimum, value))\n);\n\nconst computeAxis = (axis: VirtualAxis, input: FixedAxisInputDetail): VirtualAxisWindow => {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const buffer = nonNegativeInteger(input.buffer);\n const visibleCount = Math.min(total, Math.max(1, Math.ceil(viewportSize / itemSize)));\n const maximumVisibleStart = Math.max(0, total - visibleCount);\n const scrollOffset = clamp(\n Math.max(0, finite(input.scrollOffset)),\n 0,\n Math.max(0, total * itemSize - viewportSize),\n );\n const visibleStart = clamp(Math.floor(scrollOffset / itemSize), 0, maximumVisibleStart);\n const count = Math.min(total, visibleCount + (buffer * 2));\n const start = clamp(visibleStart - buffer, 0, Math.max(0, total - count));\n\n return {\n axis,\n start,\n count,\n total,\n itemSize,\n viewportSize,\n scrollOffset,\n buffer,\n visibleStart,\n visibleCount,\n guardStart: Math.min(total, start + buffer),\n guardEnd: Math.max(0, start + count - buffer),\n translateOffset: start * itemSize,\n spacerSize: total * itemSize,\n };\n};\n\nconst fixedAxisWindowAdapter: FixedAxisWindowAdapter = {\n compute(input: FixedAxisWindowInput): FixedAxisWindow {\n const axes: FixedAxisWindow['axes'] = {};\n if (input.axes.x) axes.x = computeAxis('x', input.axes.x);\n if (input.axes.y) axes.y = computeAxis('y', input.axes.y);\n const key = (['x', 'y'] as const)\n .map((axis) => {\n const detail = axes[axis];\n return detail ? `${axis}:${detail.start}:${detail.count}:${detail.total}` : '';\n })\n .filter(Boolean)\n .join('|');\n return {kind: 'fixed-axis', key, axes};\n },\n\n covers(mounted: FixedAxisWindow, desired: FixedAxisWindow): boolean {\n return (['x', 'y'] as const).every((axis) => {\n const wanted = desired.axes[axis];\n if (!wanted) return true;\n const current = mounted.axes[axis];\n if (!current || current.total !== wanted.total || current.itemSize !== wanted.itemSize) return false;\n const desiredEnd = wanted.visibleStart + wanted.visibleCount;\n return wanted.visibleStart >= current.guardStart && desiredEnd <= current.guardEnd;\n });\n },\n\n serialize(window: FixedAxisWindow): Record<string, string> {\n const axes: Record<string, {start: number; count: number; total: number}> = {};\n (['x', 'y'] as const).forEach((axis) => {\n const detail = window.axes[axis];\n if (detail) axes[axis] = {start: detail.start, count: detail.count, total: detail.total};\n });\n return {window: JSON.stringify(axes)};\n },\n\n spacerSize(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.spacerSize ?? 0;\n },\n\n translateOffset(window: FixedAxisWindow, axis: VirtualAxis): number {\n return window.axes[axis]?.translateOffset ?? 0;\n },\n\n setAxisTotal(input: FixedAxisWindowInput, axis: VirtualAxis, total: number): FixedAxisWindowInput {\n const current = input.axes[axis];\n if (!current) return input;\n return {...input, axes: {...input.axes, [axis]: {...current, total: nonNegativeInteger(total)}}};\n },\n\n scrollTo(input: FixedAxisInputDetail, target: FixedAxisScrollTarget): number {\n const total = nonNegativeInteger(input.total);\n const itemSize = positive(input.itemSize);\n const viewportSize = Math.max(0, finite(input.viewportSize));\n const index = clamp(nonNegativeInteger(target.index), 0, Math.max(0, total - 1));\n const itemStart = index * itemSize;\n const itemEnd = itemStart + itemSize;\n const maximum = Math.max(0, total * itemSize - viewportSize);\n let offset = itemStart;\n if (target.align === 'center') offset = itemStart - ((viewportSize - itemSize) / 2);\n else if (target.align === 'end') offset = itemEnd - viewportSize;\n else if (target.align === 'auto') {\n const current = Math.max(0, finite(input.scrollOffset));\n if (itemStart >= current && itemEnd <= current + viewportSize) return clamp(current, 0, maximum);\n offset = itemStart < current ? itemStart : itemEnd - viewportSize;\n }\n return clamp(offset, 0, maximum);\n },\n};\n\nconst createVirtualWindowController = <Input, Window extends VirtualWindowBase>(\n adapter: VirtualWindowAdapter<Input, Window>,\n options: VirtualWindowControllerOptions<Window> = {},\n): VirtualWindowController<Input, Window> => {\n let generation = 0;\n let requestGeneration = 0;\n const mountedWindows = new Map<string, Window>();\n const pendingWindows = new Map<string, VirtualWindowRequest<Window>>();\n const latestDesired = new Map<string, Window>();\n\n const snapshot = (): VirtualWindowSnapshot<Window> => ({\n generation,\n mounted: new Map(mountedWindows),\n pending: new Map(pendingWindows),\n latestDesired: new Map(latestDesired),\n });\n const notify = (): void => options.onChange?.(snapshot());\n const isCurrent = (request: VirtualWindowRequest<Window>): boolean => {\n const pending = pendingWindows.get(request.block);\n return request.generation === generation\n && pending?.requestGeneration === request.requestGeneration;\n };\n\n return {\n computeWindow: (input) => adapter.compute(input),\n shouldLoad: (desired, mounted) => !mounted || !adapter.covers(mounted, desired),\n begin(block, desired) {\n latestDesired.set(block, desired);\n if (pendingWindows.has(block) || !this.shouldLoad(desired, mountedWindows.get(block))) {\n notify();\n return null;\n }\n const request = {\n block,\n window: desired,\n generation,\n requestGeneration: ++requestGeneration,\n };\n pendingWindows.set(block, request);\n notify();\n return request;\n },\n commit(request, mounted = request.window) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n mountedWindows.set(request.block, mounted);\n notify();\n return true;\n },\n fail(request) {\n if (!isCurrent(request)) return false;\n pendingWindows.delete(request.block);\n notify();\n return true;\n },\n next(block) {\n if (pendingWindows.has(block)) return null;\n const desired = latestDesired.get(block);\n if (!desired) return null;\n const mounted = mountedWindows.get(block);\n if (mounted && adapter.covers(mounted, desired)) return null;\n return desired;\n },\n mounted: (block) => mountedWindows.get(block) ?? null,\n pending: (block) => pendingWindows.get(block) ?? null,\n invalidate() {\n generation += 1;\n mountedWindows.clear();\n pendingWindows.clear();\n latestDesired.clear();\n notify();\n },\n snapshot,\n };\n};\n\nexport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n};\nexport type {\n FixedAxisInputDetail,\n FixedAxisScrollTarget,\n FixedAxisWindowAdapter,\n FixedAxisWindow,\n FixedAxisWindowInput,\n VirtualAxis,\n VirtualAxisWindow,\n VirtualScrollAlign,\n VirtualWindowAdapter,\n VirtualWindowBase,\n VirtualWindowController,\n VirtualWindowControllerOptions,\n VirtualWindowKind,\n VirtualWindowRequest,\n VirtualWindowSnapshot,\n};\n","import {bool, number, oneOf, string, type SchemaToProps} from './codecs';\n\nconst VIRTUALIZER_AXES = ['vertical'] as const;\ntype VirtualizerAxis = typeof VIRTUALIZER_AXES[number];\n\nconst virtualizerSchema = {\n fetchUrl: string,\n cursor: bool,\n totalItems: number.min(0).default(0),\n itemSize: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n axis: oneOf(VIRTUALIZER_AXES, 'vertical' as VirtualizerAxis),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n windowParam: string.default('window'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n scrollArea: bool.default(true),\n fill: bool.default(true),\n class: string,\n scrollAreaClass: string,\n viewportClass: string,\n spacerClass: string,\n blockClass: string,\n};\n\ntype VirtualizerProps = SchemaToProps<typeof virtualizerSchema>;\n\nexport {VIRTUALIZER_AXES, virtualizerSchema};\nexport type {VirtualizerAxis, VirtualizerProps};\n","import type Alpine from 'alpinejs';\n\nimport {defineProps, type PropState} from './codecs';\nimport {registerDomInvalidationOwner} from './dom-invalidation';\nimport {replaceFragmentChildren} from './engine/fragment';\nimport type {TrellisAlpineComponent} from './index';\nimport {\n parseVirtualizerFragmentResponse,\n type VirtualizerFragmentPayload,\n} from './virtualizer-fragment';\nimport {\n createVirtualWindowController,\n fixedAxisWindowAdapter,\n type FixedAxisWindow,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from './virtual-window';\nimport {virtualizerSchema} from './virtualizer-schema';\nimport type {\n CursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\n\ntype ResetOptions = {scrollTop?: number};\ntype SetUrlOptions = {reset?: boolean};\n\n/** Public Alpine API for `ui.virtualizer`. @public */\ninterface UiVirtualizerApi<Query = unknown> {\n /** Whether the configured cursor data source supports arbitrary index seeks. */\n readonly supportsSeek: boolean;\n /** Scrolls a logical item into the requested vertical alignment. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replaces the known logical item count and reloads mounted ranges. */\n setTotalItems(count: number): void;\n /** Replaces the fragment endpoint and optionally resets to the top. */\n setUrl(url: string, options?: SetUrlOptions): void;\n /** Replaces cursor-mode query state and resets to the first cursor. */\n setQuery(query: Query): void;\n /** Invalidates all blocks and reloads them around a scroll position. */\n reset(options?: ResetOptions): void;\n /** Reloads all blocks without changing the fragment endpoint. */\n reload(options?: ResetOptions): void;\n}\n\ntype VirtualizerData<Query = unknown> = UiVirtualizerApi<Query> & {\n props: PropState<typeof virtualizerSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {\n key: string;\n element: HTMLElement;\n};\n\ntype VirtualizerOptions<Query, Content> = {\n cursor?: CursorVirtualizerOptions<Query, Content>;\n};\n\ntype CursorMounted<Content> = {\n block: BlockRecord;\n page: CursorPage<Content>;\n startIndex: number;\n count: number;\n};\n\ntype CursorRequest = {\n generation: number;\n id: number;\n aborter: AbortController;\n};\n\ntype CursorPageKind = 'page' | 'seek';\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst UiVirtualizer = <Query = unknown, Content = unknown>(\n AlpineInstance: Alpine.Alpine,\n options: VirtualizerOptions<Query, Content> = {},\n): TrellisAlpineComponent<VirtualizerData<Query>> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let blocks: BlockRecord[] = [];\n let totalItems = 0;\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let scrollFrame = 0;\n let loading = 0;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let unregisterDomInvalidation: (() => void) | null = null;\n let suppressPropReload = false;\n const aborters = new Map<string, AbortController>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n const cursor = options.cursor;\n let cursorQuery = cursor?.query;\n let cursorGeneration = 0;\n let cursorRequestId = 0;\n let cursorPaging = false;\n let cursorFailed = false;\n let cursorLatestScrollTop: number | null = null;\n let cursorSeekTimer = 0;\n let cursorSeekIndex: number | null = null;\n let cursorActiveSeekIndex: number | null = null;\n let cursorSeekAborter: AbortController | null = null;\n const cursorRequests = new Map<string, CursorRequest>();\n const cursorMounted = new Map<string, CursorMounted<Content>>();\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n const cursorExtent = cursorMounted.size === 0\n ? 0\n : Math.max(...[...cursorMounted.values()].map(({startIndex, count}) => startIndex + count));\n const cursorHasNext = [...cursorMounted.values()].some(({page, startIndex, count}) => (\n startIndex + count === cursorExtent && page.next.available\n ));\n const spacerItems = cursor && totalItems === 0\n ? cursorExtent + (cursorHasNext ? integer(component.props.bufferSize, 1) : 0)\n : totalItems;\n root.toggleAttribute('data-loading', loading > 0);\n root.toggleAttribute('data-empty', cursor ? cursorMounted.size === 0 && loading === 0 : totalItems === 0);\n spacer.style.height = `${Math.max(spacerItems * component.props.itemSize, component.props.itemSize)}px`;\n };\n const updateTotal = (next: number): boolean => {\n const normalized = integer(next);\n if (normalized === totalItems) return false;\n totalItems = normalized;\n syncState();\n dispatch('ui:virtualizer-total-change', {totalItems});\n dispatch('ui:virtualizer-axis-total-change', {axis: 'y', total: totalItems, window: null});\n return true;\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {\n y: {\n total: totalItems,\n itemSize: component.props.itemSize,\n viewportSize: component.props.bufferSize * component.props.itemSize,\n scrollOffset: start * component.props.itemSize,\n buffer: 0,\n },\n }});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalItems === 0 || (!cursor && !component.props.fetchUrl.trim())) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalItems - 1) / size) * size;\n const starts = [center - size, center, center + size]\n .map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Vertical virtualizer requires a y window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const replaceBlock = async (\n block: BlockRecord,\n payload: VirtualizerFragmentPayload,\n shouldReplace: () => boolean,\n ): Promise<boolean> => {\n const hadFocus = block.element.contains(document.activeElement);\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace,\n });\n if (replaced && hadFocus) viewport?.focus({preventScroll: true});\n return replaced;\n };\n const positionBlock = (block: BlockRecord, startIndex: number, count: number): void => {\n block.element.style.height = `${count * component.props.itemSize}px`;\n block.element.style.transform = `translateY(${startIndex * component.props.itemSize}px)`;\n };\n const settle = (): void => {\n loading = Math.max(0, loading - 1);\n syncState();\n if (loading > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n aborters.set(block.key, aborter);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {\n method: 'GET',\n headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n },\n signal: aborter.signal,\n });\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceBlock(\n block,\n payload,\n () => controller.pending(block.key) === request && !destroyed,\n );\n if (!replaced) return;\n const totalChanged = payload.totalItems !== null && updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n positionBlock(block, axis.start, axis.count);\n dispatch('ui:virtualizer-load', {block: block.key, window});\n if (totalChanged) latestScrollTop = viewport?.scrollTop ?? 0;\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, window, status: 0, error});\n } finally {\n if (aborters.get(block.key) === aborter) aborters.delete(block.key);\n settle();\n }\n };\n const cursorLimit = (): number => integer(component.props.bufferSize, 1);\n const cursorRecords = (): CursorMounted<Content>[] => (\n [...cursorMounted.values()].sort((left, right) => left.startIndex - right.startIndex)\n );\n const cursorRequestIsCurrent = (block: BlockRecord, request: CursorRequest): boolean => (\n !destroyed\n && request.generation === cursorGeneration\n && cursorRequests.get(block.key)?.id === request.id\n );\n const loadCursorPage = async (\n block: BlockRecord,\n getPage: (signal: AbortSignal) => Promise<CursorPage<Content>>,\n fallbackStartIndex: number,\n suppliedAborter?: AbortController,\n kind: CursorPageKind = 'page',\n ): Promise<CursorMounted<Content> | null> => {\n if (!cursor || cursorRequests.has(block.key)) return null;\n const aborter = suppliedAborter ?? new AbortController();\n const request: CursorRequest = {\n generation: cursorGeneration,\n id: ++cursorRequestId,\n aborter,\n };\n cursorRequests.set(block.key, request);\n loading += 1;\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:virtualizer-load-start', {block: block.key, mode: 'cursor'});\n try {\n const page = await getPage(aborter.signal);\n if (!cursorRequestIsCurrent(block, request)) return null;\n if (kind === 'seek' && page.startIndex === undefined) {\n throw new Error('Cursor seek response requires startIndex.');\n }\n const payload = await cursor.responseAdapter(page.content, page);\n if (!cursorRequestIsCurrent(block, request)) return null;\n const startIndex = page.startIndex === undefined\n ? integer(fallbackStartIndex)\n : integer(page.startIndex);\n const pageTotal = payload.totalItems ?? totalItems;\n const returnedCount = payload.itemCount === undefined\n ? cursorLimit()\n : integer(payload.itemCount);\n const count = pageTotal > 0\n ? Math.min(cursorLimit(), Math.max(0, pageTotal - startIndex))\n : returnedCount;\n const replaced = await replaceBlock(\n block,\n payload,\n () => cursorRequestIsCurrent(block, request),\n );\n if (!replaced || !cursorRequestIsCurrent(block, request)) return null;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n else if (!page.next.available) updateTotal(startIndex + count);\n const mounted = {block, page, startIndex, count};\n cursorMounted.set(block.key, mounted);\n positionBlock(block, startIndex, count);\n dispatch('ui:virtualizer-load', {\n block: block.key,\n mode: 'cursor',\n page: {\n previous: page.previous,\n next: page.next,\n ...(page.startIndex === undefined ? {} : {startIndex: page.startIndex}),\n },\n startIndex,\n });\n return mounted;\n } catch (error) {\n if (aborter.signal.aborted || !cursorRequestIsCurrent(block, request)) return null;\n cursorFailed = true;\n root?.setAttribute('data-error', '');\n dispatch('ui:virtualizer-error', {block: block.key, mode: 'cursor', status: 0, error});\n return null;\n } finally {\n if (cursorRequests.get(block.key) === request) cursorRequests.delete(block.key);\n loading = Math.max(0, loading - 1);\n syncState();\n }\n };\n const finishCursorPaging = (): void => {\n cursorPaging = false;\n const scrollTop = cursorLatestScrollTop ?? viewport?.scrollTop ?? 0;\n cursorLatestScrollTop = null;\n reconcileCursor(scrollTop);\n };\n const loadInitialCursorPages = async (): Promise<void> => {\n if (!cursor || cursorPaging || cursorFailed || cursorMounted.size > 0) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n try {\n const first = await loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.first({limit: cursorLimit(), query: cursorQuery as Query, signal}),\n 0,\n );\n if (!first || generation !== cursorGeneration) return;\n let current = first;\n for (const block of blocks.slice(1)) {\n if (!current.page.next.available) break;\n const nextCursor = current.page.next.cursor;\n const next = await loadCursorPage(\n block,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n current.startIndex + current.count,\n );\n if (!next || generation !== cursorGeneration) break;\n current = next;\n }\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadNextCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const last = records.at(-1);\n if (!last?.page.next.available) return;\n const recycled = records[0]?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const nextCursor = last.page.next.cursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n last.startIndex + last.count,\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const loadPreviousCursorPage = async (): Promise<void> => {\n if (!cursor || cursorPaging) return;\n const records = cursorRecords();\n const first = records[0];\n if (!first?.page.previous.available) return;\n const recycled = records.at(-1)?.block;\n if (!recycled) return;\n cursorPaging = true;\n const generation = cursorGeneration;\n const previousCursor = first.page.previous.cursor;\n try {\n await loadCursorPage(\n recycled,\n (signal) => cursor.dataSource.previous({\n cursor: previousCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, first.startIndex - cursorLimit()),\n );\n } finally {\n if (generation === cursorGeneration) finishCursorPaging();\n }\n };\n const clearCursorSeekTimer = (): void => {\n if (cursorSeekTimer) window.clearTimeout(cursorSeekTimer);\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n };\n const performCursorSeek = async (index: number): Promise<void> => {\n const seek = cursor?.dataSource.seek;\n if (!cursor || !seek) return;\n cursorSeekAborter?.abort();\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorPaging = true;\n const generation = cursorGeneration;\n const aborter = new AbortController();\n cursorSeekAborter = aborter;\n cursorActiveSeekIndex = index;\n const middle = blocks[1]!;\n cursorMounted.clear();\n blocks.forEach((block) => {\n if (block !== middle) void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n try {\n const resolved = await loadCursorPage(\n middle,\n (signal) => seek({index, limit: cursorLimit(), query: cursorQuery as Query, signal}),\n index,\n aborter,\n 'seek',\n );\n if (!resolved || generation !== cursorGeneration || cursorSeekAborter !== aborter) return;\n const adjacent: Array<Promise<CursorMounted<Content> | null>> = [];\n if (resolved.page.previous.available) {\n const previousCursor = resolved.page.previous.cursor;\n adjacent.push(loadCursorPage(\n blocks[0]!,\n (signal) => cursor.dataSource.previous({\n cursor: previousCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n Math.max(0, resolved.startIndex - cursorLimit()),\n ));\n }\n if (resolved.page.next.available) {\n const nextCursor = resolved.page.next.cursor;\n adjacent.push(loadCursorPage(\n blocks[2]!,\n (signal) => cursor.dataSource.next({\n cursor: nextCursor,\n limit: cursorLimit(),\n query: cursorQuery as Query,\n signal,\n }),\n resolved.startIndex + resolved.count,\n ));\n }\n await Promise.all(adjacent);\n } finally {\n if (cursorSeekAborter === aborter) {\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n if (generation === cursorGeneration) finishCursorPaging();\n }\n }\n };\n const scheduleCursorSeek = (index: number): void => {\n if (!cursor?.dataSource.seek) return;\n const clamped = totalItems > 0 ? Math.min(Math.max(0, totalItems - 1), integer(index)) : integer(index);\n if (cursorRecords().some((record) => (\n clamped >= record.startIndex && clamped < record.startIndex + record.count\n ))) return;\n if (cursorSeekIndex === clamped || cursorActiveSeekIndex === clamped) return;\n clearCursorSeekTimer();\n cursorSeekIndex = clamped;\n cursorSeekTimer = window.setTimeout(() => {\n cursorSeekTimer = 0;\n cursorSeekIndex = null;\n void performCursorSeek(clamped);\n }, integer(cursor.seekDebounce ?? 100));\n };\n const reconcileCursor = (scrollTop: number): void => {\n if (!cursor) return;\n const index = totalItems > 0\n ? Math.min(totalItems - 1, Math.floor(Math.max(0, scrollTop) / component.props.itemSize))\n : Math.floor(Math.max(0, scrollTop) / component.props.itemSize);\n if (cursorSeekAborter && cursor.dataSource.seek && cursorActiveSeekIndex !== index) {\n cursorLatestScrollTop = scrollTop;\n scheduleCursorSeek(index);\n return;\n }\n if (cursorPaging || loading > 0) {\n cursorLatestScrollTop = scrollTop;\n return;\n }\n const records = cursorRecords();\n if (records.length === 0) {\n void loadInitialCursorPages();\n return;\n }\n const covered = records.find((record) => (\n index >= record.startIndex && index < record.startIndex + record.count\n ));\n if (covered) {\n clearCursorSeekTimer();\n if (covered === records[0] && covered.page.previous.available) void loadPreviousCursorPage();\n else if (covered === records.at(-1) && covered.page.next.available) void loadNextCursorPage();\n return;\n }\n if (cursor.dataSource.seek) {\n scheduleCursorSeek(index);\n return;\n }\n if (index < records[0]!.startIndex) void loadPreviousCursorPage();\n else void loadNextCursorPage();\n };\n const reconcile = (scrollTop: number): void => {\n if (cursor) {\n reconcileCursor(scrollTop);\n return;\n }\n if (loading > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const signature = desired.map((window) => window.key).join(',');\n const logicalIndex = Math.min(\n Math.max(0, totalItems - 1),\n Math.floor(Math.max(0, scrollTop) / component.props.itemSize),\n );\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:virtualizer-window', {window: center});\n dispatch('ui:virtualizer-range', {\n start: axis.start,\n count: axis.count,\n end: axis.start + axis.count,\n window: center,\n });\n }\n if (!signature) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n aborters.forEach((aborter) => aborter.abort());\n aborters.clear();\n loading = 0;\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n cursorGeneration += 1;\n clearCursorSeekTimer();\n cursorSeekAborter?.abort();\n cursorSeekAborter = null;\n cursorActiveSeekIndex = null;\n cursorRequests.forEach(({aborter}) => aborter.abort());\n cursorRequests.clear();\n cursorMounted.clear();\n cursorPaging = false;\n cursorFailed = false;\n cursorLatestScrollTop = null;\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n\n const component: TrellisAlpineComponent<VirtualizerData<Query>> = {\n supportsSeek: Boolean(cursor?.dataSource.seek),\n props: null as unknown as PropState<typeof virtualizerSchema>,\n init(): void {\n root = this.$el;\n destroyed = false;\n this.props = defineProps({\n el: root,\n schema: virtualizerSchema,\n onChange: (_state, changes) => {\n if (suppressPropReload) return;\n if (changes.some(({key}) => key === 'totalItems')) {\n updateTotal(this.props.totalItems);\n if (!cursor) this.reload();\n } else if (changes.some(({key}) => ['fetchUrl', 'itemSize', 'bufferSize'].includes(key))) {\n this.reload();\n }\n },\n });\n totalItems = cursor\n ? integer(this.props.totalItems)\n : this.props.fetchUrl.trim()\n ? Math.max(1, integer(this.props.totalItems))\n : 0;\n viewport = root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]') ?? root;\n spacer = root.querySelector<HTMLElement>('[data-ui-virtualizer-spacer]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-virtualizer-block]'))\n .slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!spacer || blocks.length !== 3) throw new Error('Virtualizer requires one spacer and three block containers.');\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => {\n if (scrollFrame) return;\n scrollFrame = requestAnimationFrame(() => {\n scrollFrame = 0;\n if (viewport) reconcile(viewport.scrollTop);\n });\n }, {passive: true, signal: listenerAborter.signal});\n unregisterDomInvalidation = registerDomInvalidationOwner(root, {\n invalidateDom: () => component.reload(),\n });\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: 0,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index: this.props.initialIndex});\n syncState();\n reconcile(viewport.scrollTop);\n },\n destroy(): void {\n destroyed = true;\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n listenerAborter?.abort();\n listenerAborter = null;\n unregisterDomInvalidation?.();\n unregisterDomInvalidation = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n spacer = null;\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (!viewport) return;\n viewport.scrollTop = fixedAxisWindowAdapter.scrollTo({\n total: totalItems,\n itemSize: this.props.itemSize,\n viewportSize: viewport.clientHeight,\n scrollOffset: viewport.scrollTop,\n buffer: this.props.bufferSize,\n }, {axis: 'y', index, align});\n reconcile(viewport.scrollTop);\n },\n setTotalItems(count): void {\n updateTotal(count);\n if (cursor) {\n if (viewport) reconcileCursor(viewport.scrollTop);\n return;\n }\n const scrollTop = viewport?.scrollTop;\n this.reload(scrollTop === undefined ? {} : {scrollTop});\n },\n setUrl(url, options = {}): void {\n const nextUrl = String(url).trim();\n suppressPropReload = true;\n this.props.fetchUrl = nextUrl;\n suppressPropReload = false;\n updateTotal(nextUrl ? Math.max(1, integer(this.props.totalItems)) : 0);\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n setQuery(query): void {\n if (!cursor) return;\n cursorQuery = query;\n this.reset();\n },\n reset(options = {}): void {\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n const scrollTop = options.scrollTop ?? viewport?.scrollTop ?? 0;\n invalidate();\n if (viewport) viewport.scrollTop = Math.max(0, scrollTop);\n reconcile(scrollTop);\n },\n };\n return component;\n};\n\nexport {UiVirtualizer};\nexport type {\n CursorContinuation,\n CursorDataSource,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n} from './cursor-data-source';\nexport type {\n ResetOptions,\n SetUrlOptions,\n UiVirtualizerApi,\n VirtualizerOptions,\n VirtualizerData,\n VirtualScrollAlign,\n};\n","import {parseAssetDescriptors, type AssetDescriptor} from '../assets/bridge';\n\ntype CursorContinuation =\n | {available: false}\n | {available: true; cursor: string};\n\ntype CursorPage<Content> = {\n content: Content;\n previous: CursorContinuation;\n next: CursorContinuation;\n startIndex?: number;\n};\n\ntype CursorRenderPayload = {\n html: string;\n assets: AssetDescriptor[];\n totalItems: number | null;\n itemCount?: number;\n};\n\ntype SoughtCursorPage<Content> = CursorPage<Content> & {\n startIndex: number;\n};\n\ntype CursorFirstArgs<Query> = {\n limit: number;\n query: Query;\n signal: AbortSignal;\n};\n\ntype CursorMoveArgs<Query> = CursorFirstArgs<Query> & {\n cursor: string;\n};\n\ntype CursorSeekArgs<Query> = CursorFirstArgs<Query> & {\n index: number;\n};\n\ntype CursorDataSource<Query, Content> = {\n first(args: CursorFirstArgs<Query>): Promise<CursorPage<Content>>;\n next(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n previous(args: CursorMoveArgs<Query>): Promise<CursorPage<Content>>;\n seek?(args: CursorSeekArgs<Query>): Promise<SoughtCursorPage<Content>>;\n};\n\ntype CursorResponseAdapter<Content> = (\n content: Content,\n page: CursorPage<Content>,\n) => CursorRenderPayload | Promise<CursorRenderPayload>;\n\ntype CursorVirtualizerOptions<Query, Content> = {\n dataSource: CursorDataSource<Query, Content>;\n query: Query;\n responseAdapter: CursorResponseAdapter<Content>;\n seekDebounce?: number;\n};\n\ntype ServerCursorResponse = {\n content: string;\n assets: AssetDescriptor[];\n previous: CursorContinuation;\n next: CursorContinuation;\n startIndex?: number;\n total?: number;\n count?: number;\n};\n\nconst serverCursorResponse = (value: unknown): ServerCursorResponse => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new TypeError('Cursor response must be an object.');\n }\n const response = value as Record<string, unknown>;\n const fields = new Set(['content', 'assets', 'previous', 'next', 'startIndex', 'total', 'count']);\n for (const name of Object.keys(response)) {\n if (!fields.has(name)) {\n throw new TypeError(`Cursor response contains unexpected field ${name}.`);\n }\n }\n const continuation = (name: 'previous' | 'next'): CursorContinuation => {\n const candidate = response[name];\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new TypeError(`Cursor response ${name} must be a continuation object.`);\n }\n const record = candidate as Record<string, unknown>;\n const available = record.available;\n if (available !== false && available !== true) {\n throw new TypeError(`Cursor response ${name}.available must be a boolean.`);\n }\n if (!available && Object.hasOwn(record, 'cursor')) {\n throw new TypeError(`Unavailable cursor response ${name} cannot contain a cursor.`);\n }\n const fields = new Set(available ? ['available', 'cursor'] : ['available']);\n for (const field of Object.keys(record)) {\n if (!fields.has(field)) {\n throw new TypeError(`Cursor response ${name} contains unexpected field ${field}.`);\n }\n }\n if (!available) {\n return {available: false};\n }\n if (typeof record.cursor !== 'string' || record.cursor.length === 0) {\n throw new TypeError(`Available cursor response ${name} requires a non-empty cursor.`);\n }\n return {available: true, cursor: record.cursor};\n };\n const optionalInteger = (name: 'startIndex' | 'total' | 'count'): number | undefined => {\n const candidate = response[name];\n if (candidate === undefined) return undefined;\n if (!Number.isInteger(candidate) || Number(candidate) < 0) {\n throw new TypeError(`Cursor response ${name} must be a non-negative integer.`);\n }\n return Number(candidate);\n };\n if (typeof response.content !== 'string') {\n throw new TypeError('Cursor response content must be a string.');\n }\n const startIndex = optionalInteger('startIndex');\n const total = optionalInteger('total');\n const count = optionalInteger('count');\n return {\n content: response.content,\n assets: Object.hasOwn(response, 'assets') ? parseAssetDescriptors(response.assets) : [],\n previous: continuation('previous'),\n next: continuation('next'),\n ...(startIndex === undefined ? {} : {startIndex}),\n ...(total === undefined ? {} : {total}),\n ...(count === undefined ? {} : {count}),\n };\n};\n\nconst serverCursorOptions = (\n element: () => HTMLElement,\n): CursorVirtualizerOptions<null, ServerCursorResponse> => {\n const requestPage = async ({\n cursor,\n direction,\n limit,\n signal,\n index,\n }: {\n cursor: string | null;\n direction: 'forward' | 'backward';\n limit: number;\n signal: AbortSignal;\n index?: number;\n }): Promise<CursorPage<ServerCursorResponse>> => {\n const fetchUrl = element().dataset.fetchUrl ?? '';\n const url = new URL(fetchUrl, document.baseURI);\n url.searchParams.set('cursor', cursor ?? '');\n url.searchParams.set('direction', direction);\n url.searchParams.set('limit', String(limit));\n if (index !== undefined) url.searchParams.set('index', String(index));\n const href = /^[a-z][a-z\\d+.-]*:/i.test(fetchUrl) || fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n const response = await fetch(href, {signal});\n if (!response.ok) throw new Error(`Cursor request failed (${response.status}).`);\n const page = serverCursorResponse(await response.json());\n return {...page, content: page};\n };\n return {\n query: null,\n dataSource: {\n first: ({limit, signal}) => requestPage({cursor: null, direction: 'forward', limit, signal}),\n next: ({cursor, limit, signal}) => requestPage({cursor, direction: 'forward', limit, signal}),\n previous: ({cursor, limit, signal}) => requestPage({cursor, direction: 'backward', limit, signal}),\n seek: ({index, limit, signal}) => requestPage({\n cursor: null, direction: 'forward', index, limit, signal,\n }).then((page) => {\n if (page.startIndex === undefined) throw new Error('Cursor seek response is missing startIndex.');\n return {...page, startIndex: page.startIndex};\n }),\n },\n responseAdapter: (page) => ({\n html: page.content,\n assets: page.assets,\n totalItems: page.total ?? null,\n ...(page.count === undefined ? {} : {itemCount: page.count}),\n }),\n };\n};\n\nexport {serverCursorOptions};\n\nexport type {\n CursorDataSource,\n CursorContinuation,\n CursorFirstArgs,\n CursorMoveArgs,\n CursorPage,\n CursorResponseAdapter,\n CursorRenderPayload,\n CursorSeekArgs,\n ServerCursorResponse,\n SoughtCursorPage,\n CursorVirtualizerOptions,\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dismissable-layer-BROE-Ln2.js","names":[],"sources":["../../../../../../../../client/src/runtime/dismissable-layer.ts"],"sourcesContent":["type DismissableLayerOptions = {\n isEnabled: () => boolean;\n roots: () => Array<EventTarget | null | undefined>;\n onDismiss: (event: PointerEvent) => void;\n};\n\nconst eventPathIncludes = (path: EventTarget[], root: EventTarget): boolean => path.includes(root);\n\nconst addDismissableLayer = ({\n isEnabled,\n roots,\n onDismiss,\n}: DismissableLayerOptions): (() => void) => {\n const handlePointerDown = (event: PointerEvent): void => {\n if (!isEnabled()) return;\n\n const path = event.composedPath();\n const isInsideLayer = roots()\n .filter((root): root is EventTarget => root !== null && root !== undefined)\n .some((root) => eventPathIncludes(path, root));\n\n if (!isInsideLayer) onDismiss(event);\n };\n\n document.addEventListener('pointerdown', handlePointerDown, {capture: true});\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, {capture: true});\n };\n};\n\nexport {addDismissableLayer};\nexport type {DismissableLayerOptions};\n"],"mappings":"AAMA,IAAM,GAAqB,EAAqB,IAA+B,EAAK,SAAS,CAAI,EAE3F,GAAuB,CACzB,YACA,QACA,eACyC,CACzC,IAAM,EAAqB,GAA8B,CACrD,GAAI,CAAC,EAAU,EAAG,OAElB,IAAM,EAAO,EAAM,aAAa,EACV,EAAM,
|
|
1
|
+
{"version":3,"file":"dismissable-layer-BROE-Ln2.js","names":[],"sources":["../../../../../../../../client/src/runtime/dismissable-layer.ts"],"sourcesContent":["type DismissableLayerOptions = {\n isEnabled: () => boolean;\n roots: () => Array<EventTarget | null | undefined>;\n onDismiss: (event: PointerEvent) => void;\n};\n\nconst eventPathIncludes = (path: EventTarget[], root: EventTarget): boolean => path.includes(root);\n\nconst addDismissableLayer = ({\n isEnabled,\n roots,\n onDismiss,\n}: DismissableLayerOptions): (() => void) => {\n const handlePointerDown = (event: PointerEvent): void => {\n if (!isEnabled()) return;\n\n const path = event.composedPath();\n const isInsideLayer = roots()\n .filter((root): root is EventTarget => root !== null && root !== undefined)\n .some((root) => eventPathIncludes(path, root));\n\n if (!isInsideLayer) onDismiss(event);\n };\n\n document.addEventListener('pointerdown', handlePointerDown, {capture: true});\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown, {capture: true});\n };\n};\n\nexport {addDismissableLayer};\nexport type {DismissableLayerOptions};\n"],"mappings":"AAMA,IAAM,GAAqB,EAAqB,IAA+B,EAAK,SAAS,CAAI,EAE3F,GAAuB,CACzB,YACA,QACA,eACyC,CACzC,IAAM,EAAqB,GAA8B,CACrD,GAAI,CAAC,EAAU,EAAG,OAElB,IAAM,EAAO,EAAM,aAAa,EACV,EAAM,CAAC,CACxB,OAAQ,GAA8B,GAAS,IAA0B,CAAC,CAC1E,KAAM,GAAS,EAAkB,EAAM,CAAI,CAE3C,GAAe,EAAU,CAAK,CACvC,EAIA,OAFA,SAAS,iBAAiB,cAAe,EAAmB,CAAC,QAAS,EAAI,CAAC,MAE9D,CACT,SAAS,oBAAoB,cAAe,EAAmB,CAAC,QAAS,EAAI,CAAC,CAClF,CACJ"}
|
package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/dom-DiTFTWeR.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-DiTFTWeR.js","names":[],"sources":["../../../../../../../../client/src/utils/dom.ts"],"sourcesContent":["import type {CleanupManager} from '../runtime/cleanup-manager';\n\ntype DispatchOptions<T> = {\n el: HTMLElement;\n name: string;\n detail?: T;\n composed?: boolean;\n};\n\ntype AddListenerOptions = {\n target: EventTarget;\n event: string;\n handler: EventListener;\n cleanup?: CleanupManager;\n options?: globalThis.AddEventListenerOptions;\n};\n\ntype PresenceOptions = {\n el: HTMLElement;\n attr: string;\n present: boolean;\n value?: string;\n};\n\ntype AttributeOptions = {\n el: HTMLElement;\n attr: string;\n value: string;\n};\n\ntype ElementOptions = {\n el: HTMLElement;\n};\n\ntype BoolOptions = {\n value: string | undefined;\n};\n\nconst TRUE_STRINGS = ['true', '1', 'yes', 'on'];\n\nconst asBool = ({value}: BoolOptions): boolean => (\n value !== undefined && (value === '' || TRUE_STRINGS.includes(value.toLowerCase()))\n);\n\nconst dispatch = <T = unknown>({el, name, detail, composed = false}: DispatchOptions<T>): void => {\n const eventInit: CustomEventInit<T> = {bubbles: true, composed};\n if (detail !== undefined) eventInit.detail = detail;\n el.dispatchEvent(new CustomEvent(name, eventInit));\n};\n\nconst addListener = ({\n target,\n event,\n handler,\n cleanup,\n options,\n}: AddListenerOptions): (() => void) => {\n target.addEventListener(event, handler, options);\n const remove = (): void => target.removeEventListener(event, handler, options);\n const deregister = cleanup?.add(remove);\n return () => {\n deregister?.();\n remove();\n };\n};\n\nconst setPresence = ({el, attr, present, value = ''}: PresenceOptions): void => {\n if (present) {\n if (el.getAttribute(attr) !== value) el.setAttribute(attr, value);\n return;\n }\n\n el.removeAttribute(attr);\n};\n\nconst setAttribute = ({el, attr, value}: AttributeOptions): void => {\n if (el.getAttribute(attr) !== value) el.setAttribute(attr, value);\n};\n\nconst removeAttribute = ({el, attr}: Omit<AttributeOptions, 'value'>): void => {\n if (el.hasAttribute(attr)) el.removeAttribute(attr);\n};\n\nconst isRtl = ({el}: ElementOptions): boolean => {\n const closestDir = el.closest<HTMLElement>('[dir]');\n return (closestDir?.dir || document.dir).toLowerCase() === 'rtl';\n};\n\nexport {addListener, asBool, dispatch, isRtl, removeAttribute, setAttribute, setPresence};\nexport type {AddListenerOptions, AttributeOptions, BoolOptions, DispatchOptions, ElementOptions, PresenceOptions};\n"],"mappings":"AAsCA,IAAM,EAAe,CAAC,OAAQ,IAAK,MAAO,IAAI,EAExC,GAAU,CAAC,WACb,IAAU,IAAA,KAAc,IAAU,IAAM,EAAa,SAAS,EAAM,YAAY,CAAC,GAG/E,GAAyB,CAAC,KAAI,OAAM,SAAQ,WAAW,MAAqC,CAC9F,IAAM,EAAgC,CAAC,QAAS,GAAM,UAAQ,EAC1D,IAAW,IAAA,KAAW,EAAU,OAAS,GAC7C,EAAG,cAAc,IAAI,YAAY,EAAM,CAAS,CAAC,CACrD,EAEM,GAAe,CACjB,SACA,QACA,UACA,UACA,aACoC,CACpC,EAAO,iBAAiB,EAAO,EAAS,CAAO,EAC/C,IAAM,MAAqB,EAAO,oBAAoB,EAAO,EAAS,CAAO,EACvE,EAAa,GAAS,IAAI,CAAM,EACtC,UAAa,CACT,IAAa,EACb,EAAO,CACX,CACJ,EAEM,GAAe,CAAC,KAAI,OAAM,UAAS,QAAQ,MAA+B,CAC5E,GAAI,EAAS,CACL,EAAG,aAAa,CAAI,IAAM,GAAO,EAAG,aAAa,EAAM,CAAK,EAChE,MACJ,CAEA,EAAG,gBAAgB,CAAI,CAC3B,EAEM,GAAgB,CAAC,KAAI,OAAM,WAAmC,CAC5D,EAAG,aAAa,CAAI,IAAM,GAAO,EAAG,aAAa,EAAM,CAAK,CACpE,EAEM,GAAmB,CAAC,KAAI,UAAiD,CACvE,EAAG,aAAa,CAAI,GAAG,EAAG,gBAAgB,CAAI,CACtD,EAEM,GAAS,CAAC,SACO,EAAG,QAAqB,OACnC,
|
|
1
|
+
{"version":3,"file":"dom-DiTFTWeR.js","names":[],"sources":["../../../../../../../../client/src/utils/dom.ts"],"sourcesContent":["import type {CleanupManager} from '../runtime/cleanup-manager';\n\ntype DispatchOptions<T> = {\n el: HTMLElement;\n name: string;\n detail?: T;\n composed?: boolean;\n};\n\ntype AddListenerOptions = {\n target: EventTarget;\n event: string;\n handler: EventListener;\n cleanup?: CleanupManager;\n options?: globalThis.AddEventListenerOptions;\n};\n\ntype PresenceOptions = {\n el: HTMLElement;\n attr: string;\n present: boolean;\n value?: string;\n};\n\ntype AttributeOptions = {\n el: HTMLElement;\n attr: string;\n value: string;\n};\n\ntype ElementOptions = {\n el: HTMLElement;\n};\n\ntype BoolOptions = {\n value: string | undefined;\n};\n\nconst TRUE_STRINGS = ['true', '1', 'yes', 'on'];\n\nconst asBool = ({value}: BoolOptions): boolean => (\n value !== undefined && (value === '' || TRUE_STRINGS.includes(value.toLowerCase()))\n);\n\nconst dispatch = <T = unknown>({el, name, detail, composed = false}: DispatchOptions<T>): void => {\n const eventInit: CustomEventInit<T> = {bubbles: true, composed};\n if (detail !== undefined) eventInit.detail = detail;\n el.dispatchEvent(new CustomEvent(name, eventInit));\n};\n\nconst addListener = ({\n target,\n event,\n handler,\n cleanup,\n options,\n}: AddListenerOptions): (() => void) => {\n target.addEventListener(event, handler, options);\n const remove = (): void => target.removeEventListener(event, handler, options);\n const deregister = cleanup?.add(remove);\n return () => {\n deregister?.();\n remove();\n };\n};\n\nconst setPresence = ({el, attr, present, value = ''}: PresenceOptions): void => {\n if (present) {\n if (el.getAttribute(attr) !== value) el.setAttribute(attr, value);\n return;\n }\n\n el.removeAttribute(attr);\n};\n\nconst setAttribute = ({el, attr, value}: AttributeOptions): void => {\n if (el.getAttribute(attr) !== value) el.setAttribute(attr, value);\n};\n\nconst removeAttribute = ({el, attr}: Omit<AttributeOptions, 'value'>): void => {\n if (el.hasAttribute(attr)) el.removeAttribute(attr);\n};\n\nconst isRtl = ({el}: ElementOptions): boolean => {\n const closestDir = el.closest<HTMLElement>('[dir]');\n return (closestDir?.dir || document.dir).toLowerCase() === 'rtl';\n};\n\nexport {addListener, asBool, dispatch, isRtl, removeAttribute, setAttribute, setPresence};\nexport type {AddListenerOptions, AttributeOptions, BoolOptions, DispatchOptions, ElementOptions, PresenceOptions};\n"],"mappings":"AAsCA,IAAM,EAAe,CAAC,OAAQ,IAAK,MAAO,IAAI,EAExC,GAAU,CAAC,WACb,IAAU,IAAA,KAAc,IAAU,IAAM,EAAa,SAAS,EAAM,YAAY,CAAC,GAG/E,GAAyB,CAAC,KAAI,OAAM,SAAQ,WAAW,MAAqC,CAC9F,IAAM,EAAgC,CAAC,QAAS,GAAM,UAAQ,EAC1D,IAAW,IAAA,KAAW,EAAU,OAAS,GAC7C,EAAG,cAAc,IAAI,YAAY,EAAM,CAAS,CAAC,CACrD,EAEM,GAAe,CACjB,SACA,QACA,UACA,UACA,aACoC,CACpC,EAAO,iBAAiB,EAAO,EAAS,CAAO,EAC/C,IAAM,MAAqB,EAAO,oBAAoB,EAAO,EAAS,CAAO,EACvE,EAAa,GAAS,IAAI,CAAM,EACtC,UAAa,CACT,IAAa,EACb,EAAO,CACX,CACJ,EAEM,GAAe,CAAC,KAAI,OAAM,UAAS,QAAQ,MAA+B,CAC5E,GAAI,EAAS,CACL,EAAG,aAAa,CAAI,IAAM,GAAO,EAAG,aAAa,EAAM,CAAK,EAChE,MACJ,CAEA,EAAG,gBAAgB,CAAI,CAC3B,EAEM,GAAgB,CAAC,KAAI,OAAM,WAAmC,CAC5D,EAAG,aAAa,CAAI,IAAM,GAAO,EAAG,aAAa,EAAM,CAAK,CACpE,EAEM,GAAmB,CAAC,KAAI,UAAiD,CACvE,EAAG,aAAa,CAAI,GAAG,EAAG,gBAAgB,CAAI,CACtD,EAEM,GAAS,CAAC,SACO,EAAG,QAAqB,OACnC,CAAA,EAAY,KAAO,SAAS,IAAA,CAAK,YAAY,IAAM"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);function t(e){if(Array.isArray(e))return e}function n(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function r(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function i(e,t){if(e){if(typeof e==`string`)return r(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}function a(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
2
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function o(e,r){return t(e)||n(e,r)||i(e,r)||a()}var s=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bind=void 0;function t(e,t){var n=t.type,r=t.listener,i=t.options;return e.addEventListener(n,r,i),function(){e.removeEventListener(n,r,i)}}e.bind=t})),c=e((e=>{var t=e&&e.__assign||function(){return t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},t.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.bindAll=void 0;var n=s();function r(e){if(e!==void 0)return typeof e==`boolean`?{capture:e}:e}function i(e,n){return n==null?e:t(t({},e),{options:t(t({},r(n)),r(e.options))})}function a(e,t,r){var a=t.map(function(t){var a=i(t,r);return(0,n.bind)(e,a)});return function(){a.forEach(function(e){return e()})}}e.bindAll=a})),l=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bindAll=e.bind=void 0;var t=s();Object.defineProperty(e,"bind",{enumerable:!0,get:function(){return t.bind}});var n=c();Object.defineProperty(e,"bindAll",{enumerable:!0,get:function(){return n.bindAll}})})),u=l(),d=`data-pdnd-honey-pot`;function f(e){return e instanceof Element&&e.hasAttribute(`data-pdnd-honey-pot`)}function p(e){var t=o(document.elementsFromPoint(e.x,e.y),2),n=t[0],r=t[1];return n?f(n)?r??null:n:null}function m(e){"@babel/helpers - typeof";return m=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},m(e)}function h(e,t){if(m(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(m(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function g(e){var t=h(e,`string`);return m(t)==`symbol`?t:t+``}function _(e,t,n){return(t=g(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function v(e){var t=null;return function(){if(!t){var n=[...arguments];t={result:e.apply(this,n)}}return t.result}}function y(e){if(Array.isArray(e))return r(e)}function b(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iterator`]!=null)return Array.from(e)}function x(){throw TypeError(`Invalid attempt to spread non-iterable instance.
|
|
3
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function S(e){return y(e)||b(e)||i(e)||x()}var C=v(function(){return navigator.userAgent.includes(`Firefox`)}),w=v(function(){var e=navigator.userAgent;return e.includes(`AppleWebKit`)&&!e.includes(`Chrome`)}),T={isLeavingWindow:Symbol(`leaving`),isEnteringWindow:Symbol(`entering`)};function ee(e){var t=e.dragEnter;return w()?t.hasOwnProperty(T.isEnteringWindow):!1}function te(e){var t=e.dragLeave;return w()?t.hasOwnProperty(T.isLeavingWindow):!1}(function(){if(typeof window>`u`||!w())return;function e(){return{enterCount:0,isOverWindow:!1}}var t=e();function n(){t=e()}(0,u.bindAll)(window,[{type:`dragstart`,listener:function(){t.enterCount=0,t.isOverWindow=!0}},{type:`drop`,listener:n},{type:`dragend`,listener:n},{type:`dragenter`,listener:function(e){!t.isOverWindow&&t.enterCount===0&&(e[T.isEnteringWindow]=!0),t.isOverWindow=!0,t.enterCount++}},{type:`dragleave`,listener:function(e){t.enterCount--,t.isOverWindow&&t.enterCount===0&&(e[T.isLeavingWindow]=!0,t.isOverWindow=!1)}}],{capture:!0})})();function E(e){return`nodeName`in e}function D(e){return E(e)&&e.ownerDocument!==document}function O(e){var t=e.dragLeave,n=t.type,r=t.relatedTarget;return n===`dragleave`?w()?te({dragLeave:t}):r==null?!0:C()?D(r):r instanceof HTMLIFrameElement:!1}function k(e){var t=e.onDragEnd;return[{type:`pointermove`,listener:function(){var e=0;return function(){if(e<20){e++;return}t()}}()},{type:`pointerdown`,listener:t}]}function A(e){return{altKey:e.altKey,button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,clientX:e.clientX,clientY:e.clientY,pageX:e.pageX,pageY:e.pageY}}var j=function(e){var t=[],n=null,r=function(){t=[...arguments],!n&&(n=requestAnimationFrame(function(){n=null,e.apply(void 0,t)}))};return r.cancel=function(){n&&=(cancelAnimationFrame(n),null)},r},M=j(function(e){return e()}),N=function(){var e=null;function t(t){e={frameId:requestAnimationFrame(function(){e=null,t()}),fn:t}}function n(){e&&=(cancelAnimationFrame(e.frameId),e.fn(),null)}return{schedule:t,flush:n}}();function P(e){var t=e.source,n=e.initial,r=e.dispatchEvent,i={dropTargets:[]};function a(e){r(e),i={dropTargets:e.payload.location.current.dropTargets}}return{start:function(e){var r=e.nativeSetDragImage,o={current:n,previous:i,initial:n};a({eventName:`onGenerateDragPreview`,payload:{source:t,location:o,nativeSetDragImage:r}}),N.schedule(function(){a({eventName:`onDragStart`,payload:{source:t,location:o}})})},dragUpdate:function(e){var r=e.current;N.flush(),M.cancel(),a({eventName:`onDropTargetChange`,payload:{source:t,location:{initial:n,previous:i,current:r}}})},drag:function(e){var r=e.current;M(function(){N.flush(),a({eventName:`onDrag`,payload:{source:t,location:{initial:n,previous:i,current:r}}})})},drop:function(e){var r=e.current,o=e.updatedSourcePayload;N.flush(),M.cancel(),a({eventName:`onDrop`,payload:{source:o??t,location:{current:r,previous:i,initial:n}}})}}}var F={isActive:!1};function I(){return!F.isActive}function L(e){return e.dataTransfer?e.dataTransfer.setDragImage.bind(e.dataTransfer):null}function ne(e){var t=e.current,n=e.next;if(t.length!==n.length)return!0;for(var r=0;r<t.length;r++)if(t[r].element!==n[r].element)return!0;return!1}function re(e){var t=e.event,n=e.dragType,r=e.getDropTargetsOver,i=e.dispatchEvent;if(!I())return;var a=ie({event:t,dragType:n,getDropTargetsOver:r});F.isActive=!0;var o={current:a};R({event:t,current:a.dropTargets});var s=P({source:n.payload,dispatchEvent:i,initial:a});function c(e){var t=ne({current:o.current.dropTargets,next:e.dropTargets});o.current=e,t&&s.dragUpdate({current:o.current})}function l(e){var t=A(e),i=r({target:f(e.target)?p({x:t.clientX,y:t.clientY}):e.target,input:t,source:n.payload,current:o.current.dropTargets});i.length&&(e.preventDefault(),R({event:e,current:i})),c({dropTargets:i,input:t})}function d(){o.current.dropTargets.length&&c({dropTargets:[],input:o.current.input}),s.drop({current:o.current,updatedSourcePayload:null}),m()}function m(){F.isActive=!1,h()}var h=(0,u.bindAll)(window,[{type:`dragover`,listener:function(e){l(e),s.drag({current:o.current})}},{type:`dragenter`,listener:l},{type:`dragleave`,listener:function(e){O({dragLeave:e})&&(c({input:o.current.input,dropTargets:[]}),n.startedFrom===`external`&&d())}},{type:`drop`,listener:function(e){if(o.current={dropTargets:o.current.dropTargets,input:A(e)},!o.current.dropTargets.length){d();return}e.preventDefault(),R({event:e,current:o.current.dropTargets}),s.drop({current:o.current,updatedSourcePayload:n.type===`external`?n.getDropPayload(e):null}),m()}},{type:`dragend`,listener:function(e){o.current={dropTargets:o.current.dropTargets,input:A(e)},d()}}].concat(S(k({onDragEnd:d}))),{capture:!0});s.start({nativeSetDragImage:L(t)})}function R(e){var t=e.event,n=e.current[0]?.dropEffect;n!=null&&t.dataTransfer&&(t.dataTransfer.dropEffect=n)}function ie(e){var t=e.event,n=e.dragType,r=e.getDropTargetsOver,i=A(t);return n.startedFrom===`external`?{input:i,dropTargets:[]}:{input:i,dropTargets:r({input:i,source:n.payload,target:t.target,current:[]})}}var z={canStart:I,start:re},B=new Map;function V(e){var t=e.typeKey,n=e.mount,r=B.get(t);if(r)return r.usageCount++,r;var i={typeKey:t,unmount:n(),usageCount:1};return B.set(t,i),i}function H(e){var t=V(e);return function(){t.usageCount--,!(t.usageCount>0)&&(t.unmount(),B.delete(e.typeKey))}}function U(){var e=[...arguments];return function(){e.forEach(function(e){return e()})}}function W(e,t){var n=t.attribute,r=t.value;return e.setAttribute(n,r),function(){return e.removeAttribute(n)}}function G(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function K(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?G(Object(n),!0).forEach(function(t){_(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):G(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function q(e,t){var n=typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(!n){if(Array.isArray(e)||(n=J(e))||t&&e&&typeof e.length==`number`){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
4
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||n.return==null||n.return()}finally{if(s)throw a}}}}function J(e,t){if(e){if(typeof e==`string`)return Y(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Y(e,t):void 0}}function Y(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function X(e){return e.slice(0).reverse()}function ae(e){var t=e.typeKey,n=e.defaultDropEffect,r=new WeakMap,i=`data-drop-target-for-${t}`,a=`[${i}]`;function o(e){return r.set(e.element,e),function(){return r.delete(e.element)}}function s(e){return v(U(W(e.element,{attribute:i,value:`true`}),o(e)))}function c(e){var t=e.source,i=e.target,o=e.input,s=e.result,l=s===void 0?[]:s;if(i==null)return l;if(!(i instanceof Element))return i instanceof Node?c({source:t,target:i.parentElement,input:o,result:l}):l;var u=i.closest(a);if(u==null)return l;var d=r.get(u);if(d==null)return l;var f={input:o,source:t,element:d.element};if(d.canDrop&&!d.canDrop(f))return c({source:t,target:d.element.parentElement,input:o,result:l});var p=d.getData?.call(d,f)??{},m=d.getDropEffect?.call(d,f)??n,h={data:p,element:d.element,dropEffect:m,isActiveDueToStickiness:!1};return c({source:t,target:d.element.parentElement,input:o,result:[].concat(S(l),[h])})}function l(e){var t=e.eventName,n=e.payload,i=q(n.location.current.dropTargets),a;try{for(i.s();!(a=i.n()).done;){var o,s=a.value,c=r.get(s.element),l=K(K({},n),{},{self:s});c==null||(o=c[t])==null||o.call(c,l)}}catch(e){i.e(e)}finally{i.f()}}var u={onGenerateDragPreview:l,onDrag:l,onDragStart:l,onDrop:l,onDropTargetChange:function(e){var t=e.payload,n=new Set(t.location.current.dropTargets.map(function(e){return e.element})),i=new Set,a=q(t.location.previous.dropTargets),o;try{for(a.s();!(o=a.n()).done;){var s,c=o.value;i.add(c.element);var l=r.get(c.element),u=n.has(c.element),d=K(K({},t),{},{self:c});if(l==null||(s=l.onDropTargetChange)==null||s.call(l,d),!u){var f;l==null||(f=l.onDragLeave)==null||f.call(l,d)}}}catch(e){a.e(e)}finally{a.f()}var p=q(t.location.current.dropTargets),m;try{for(p.s();!(m=p.n()).done;){var h,g,_=m.value;if(!i.has(_.element)){var v=K(K({},t),{},{self:_}),y=r.get(_.element);y==null||(h=y.onDropTargetChange)==null||h.call(y,v),y==null||(g=y.onDragEnter)==null||g.call(y,v)}}}catch(e){p.e(e)}finally{p.f()}}};function d(e){u[e.eventName](e)}function f(e){var t=e.source,n=e.target,i=e.input,a=e.current,o=c({source:t,target:n,input:i});if(o.length>=a.length)return o;for(var s=X(a),l=X(o),u=[],d=0;d<s.length;d++){var f,p=s[d],m=l[d];if(m!=null){u.push(m);continue}var h=u[d-1],g=s[d-1];if(h?.element!==g?.element)break;var _=r.get(p.element);if(!_)break;var v={input:i,source:t,element:_.element};if(_.canDrop&&!_.canDrop(v)||!((f=_.getIsSticky)!=null&&f.call(_,v)))break;u.push(K(K({},p),{},{isActiveDueToStickiness:!0}))}return X(u)}return{dropTargetForConsumers:s,getIsOver:f,dispatchEvent:d}}function oe(e,t){var n=typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(!n){if(Array.isArray(e)||(n=se(e))||t&&e&&typeof e.length==`number`){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
5
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||n.return==null||n.return()}finally{if(s)throw a}}}}function se(e,t){if(e){if(typeof e==`string`)return Z(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Z(e,t):void 0}}function Z(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Q(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function ce(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?Q(Object(n),!0).forEach(function(t){_(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Q(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function le(){var e=new Set,t=null;function n(e){t&&(!e.canMonitor||e.canMonitor(t.canMonitorArgs))&&t.active.add(e)}function r(r){var i=ce({},r);e.add(i),n(i);function a(){e.delete(i),t&&t.active.delete(i)}return v(a)}function i(r){var i=r.eventName,a=r.payload;if(i===`onGenerateDragPreview`){t={canMonitorArgs:{initial:a.location.initial,source:a.source},active:new Set};var o=oe(e),s;try{for(o.s();!(s=o.n()).done;){var c=s.value;n(c)}}catch(e){o.e(e)}finally{o.f()}}if(t){for(var l=Array.from(t.active),u=0,d=l;u<d.length;u++){var f=d[u];if(t.active.has(f)){var p;(p=f[i])==null||p.call(f,a)}}i===`onDrop`&&(t.active.clear(),t=null)}}return{dispatchEvent:i,monitorForConsumers:r}}function $(e){var t=e.typeKey,n=e.mount,r=e.dispatchEventToSource,i=e.onPostDispatch,a=e.defaultDropEffect,o=le(),s=ae({typeKey:t,defaultDropEffect:a});function c(e){r?.(e),s.dispatchEvent(e),o.dispatchEvent(e),i?.(e)}function l(e){var t=e.event,n=e.dragType;z.start({event:t,dragType:n,getDropTargetsOver:s.getIsOver,dispatchEvent:c})}function u(){function e(){return n({canStart:z.canStart,start:l})}return H({typeKey:t,mount:e})}return{registerUsage:u,dropTarget:s.dropTargetForConsumers,monitor:o.monitorForConsumers}}var ue=v(function(){return navigator.userAgent.toLocaleLowerCase().includes(`android`)}),de=`pdnd:android-fallback`,fe=`text/plain`,pe=`application/vnd.pdnd`;export{_,$ as a,l as b,j as c,D as d,ee as f,v as g,S as h,ue as i,A as l,C as m,fe as n,W as o,w as p,de as r,U as s,pe as t,k as u,p as v,o as x,d as y};
|
|
6
|
+
//# sourceMappingURL=element-adapter-native-data-key-DrqJDAVH.js.map
|