@remix-run/ui 0.3.0 → 0.5.0
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/README.md +116 -157
- package/dist/accordion/index.d.ts +46 -0
- package/dist/accordion/index.js +142 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/accordion/primitives.d.ts +104 -0
- package/dist/accordion/primitives.js +312 -0
- package/dist/accordion/primitives.js.map +1 -0
- package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
- package/dist/anchor/index.js.map +1 -0
- package/dist/animation/animate-layout-mixin.js +1 -1
- package/dist/animation/animate-layout-mixin.js.map +1 -1
- package/dist/animation/animate-mixins.js +2 -2
- package/dist/animation/animate-mixins.js.map +1 -1
- package/dist/animation/demos/color-interpolation.js +1 -1
- package/dist/animation/demos/color-interpolation.js.map +1 -1
- package/dist/animation/demos/drag-release.d.ts +1 -1
- package/dist/animation/demos/hold-to-confirm.d.ts +3 -3
- package/dist/animation/demos/material-ripple.js +1 -3
- package/dist/animation/demos/material-ripple.js.map +1 -1
- package/dist/animation/demos/reordering.js +9 -6
- package/dist/animation/demos/reordering.js.map +1 -1
- package/dist/animation/index.js +4 -4
- package/dist/animation/spring.js.map +1 -1
- package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
- package/dist/breadcrumbs/index.js.map +1 -0
- package/dist/button/index.d.ts +15 -0
- package/dist/button/index.js +128 -0
- package/dist/button/index.js.map +1 -0
- package/dist/checkbox/index.d.ts +14 -0
- package/dist/checkbox/index.js +127 -0
- package/dist/checkbox/index.js.map +1 -0
- package/dist/combobox/index.d.ts +21 -0
- package/dist/combobox/index.js +58 -0
- package/dist/combobox/index.js.map +1 -0
- package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +4 -8
- package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
- package/dist/combobox/primitives.js.map +1 -0
- package/dist/dev/refresh.d.ts +1 -0
- package/dist/dev/refresh.js +2 -0
- package/dist/dev/refresh.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +14 -14
- package/dist/input/index.d.ts +13 -0
- package/dist/input/index.js +121 -0
- package/dist/input/index.js.map +1 -0
- package/dist/jsx-runtime.js +2 -2
- package/dist/listbox/flash-attribute.js.map +1 -0
- package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
- package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
- package/dist/listbox/index.js.map +1 -0
- package/dist/menu/hover-aim.js.map +1 -0
- package/dist/menu/index.d.ts +42 -0
- package/dist/menu/index.js +250 -0
- package/dist/menu/index.js.map +1 -0
- package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +4 -33
- package/dist/{components/menu/menu.js → menu/primitives.js} +98 -315
- package/dist/menu/primitives.js.map +1 -0
- package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
- package/dist/{components/popover/popover.js → popover/index.js} +5 -48
- package/dist/popover/index.js.map +1 -0
- package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
- package/dist/popover/outside-click.js.map +1 -0
- package/dist/popover/scroll-lock.d.ts +1 -0
- package/dist/{utils → popover}/scroll-lock.js +0 -18
- package/dist/popover/scroll-lock.js.map +1 -0
- package/dist/radio/index.d.ts +12 -0
- package/dist/radio/index.js +77 -0
- package/dist/radio/index.js.map +1 -0
- package/dist/runtime/client-entry-boundary.d.ts +14 -0
- package/dist/runtime/client-entry-boundary.js +29 -0
- package/dist/runtime/client-entry-boundary.js.map +1 -0
- package/dist/runtime/component.d.ts +19 -4
- package/dist/runtime/component.js +39 -9
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/core/attributes.js +36 -3
- package/dist/runtime/core/attributes.js.map +1 -1
- package/dist/runtime/core/children.d.ts +2 -0
- package/dist/runtime/core/children.js +26 -2
- package/dist/runtime/core/children.js.map +1 -1
- package/dist/runtime/core/props.js +2 -2
- package/dist/runtime/core/vnode.d.ts +3 -3
- package/dist/runtime/core/vnode.js +22 -1
- package/dist/runtime/core/vnode.js.map +1 -1
- package/dist/runtime/create-element.d.ts +2 -2
- package/dist/runtime/create-element.js +3 -2
- package/dist/runtime/create-element.js.map +1 -1
- package/dist/runtime/diff-dom.js +294 -219
- package/dist/runtime/diff-dom.js.map +1 -1
- package/dist/runtime/diff-props.js +3 -3
- package/dist/runtime/dom.d.ts +12 -0
- package/dist/runtime/element-function.d.ts +3 -0
- package/dist/runtime/element-function.js +2 -0
- package/dist/runtime/element-function.js.map +1 -0
- package/dist/runtime/form-navigation.d.ts +25 -0
- package/dist/runtime/form-navigation.js +132 -0
- package/dist/runtime/form-navigation.js.map +1 -0
- package/dist/runtime/frame-resolution.d.ts +5 -0
- package/dist/runtime/frame-resolution.js +10 -0
- package/dist/runtime/frame-resolution.js.map +1 -0
- package/dist/runtime/frame.d.ts +58 -15
- package/dist/runtime/frame.js +367 -114
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/jsx.d.ts +1 -1
- package/dist/runtime/jsx.js +1 -1
- package/dist/runtime/jsx.js.map +1 -1
- package/dist/runtime/key.d.ts +1 -0
- package/dist/runtime/key.js +2 -0
- package/dist/runtime/key.js.map +1 -0
- package/dist/runtime/mixins/attrs-mixin.js +2 -2
- package/dist/runtime/mixins/link-mixin.js +4 -3
- package/dist/runtime/mixins/link-mixin.js.map +1 -1
- package/dist/runtime/mixins/mixin.d.ts +15 -10
- package/dist/runtime/mixins/mixin.js +4 -4
- package/dist/runtime/mixins/mixin.js.map +1 -1
- package/dist/runtime/mixins/on-mixin.js +1 -1
- package/dist/runtime/mixins/ref-mixin.js +1 -1
- package/dist/runtime/navigation.d.ts +4 -1
- package/dist/runtime/navigation.js +157 -32
- package/dist/runtime/navigation.js.map +1 -1
- package/dist/runtime/reconcile.d.ts +11 -10
- package/dist/runtime/reconcile.js +557 -423
- package/dist/runtime/reconcile.js.map +1 -1
- package/dist/runtime/refresh.d.ts +28 -0
- package/dist/runtime/refresh.js +31 -0
- package/dist/runtime/refresh.js.map +1 -0
- package/dist/runtime/render.js +1 -1
- package/dist/runtime/render.js.map +1 -1
- package/dist/runtime/run.d.ts +3 -1
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/scheduler.js +8 -16
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/to-vnode.d.ts +2 -2
- package/dist/runtime/to-vnode.js +68 -20
- package/dist/runtime/to-vnode.js.map +1 -1
- package/dist/runtime/vdom.d.ts +4 -2
- package/dist/runtime/vdom.js +89 -41
- package/dist/runtime/vdom.js.map +1 -1
- package/dist/runtime/vnode.d.ts +138 -67
- package/dist/runtime/vnode.js +17 -12
- package/dist/runtime/vnode.js.map +1 -1
- package/dist/select/index.d.ts +19 -0
- package/dist/select/index.js +95 -0
- package/dist/select/index.js.map +1 -0
- package/dist/select/keydown.js.map +1 -0
- package/dist/{components/select/select.d.ts → select/primitives.d.ts} +5 -7
- package/dist/{components/select/select.js → select/primitives.js} +11 -63
- package/dist/select/primitives.js.map +1 -0
- package/dist/server/stream.js +22 -29
- package/dist/server/stream.js.map +1 -1
- package/dist/shared/focus-styles.d.ts +1 -0
- package/dist/shared/focus-styles.js +2 -0
- package/dist/shared/focus-styles.js.map +1 -0
- package/dist/shared/icons.d.ts +9 -0
- package/dist/shared/icons.js +42 -0
- package/dist/shared/icons.js.map +1 -0
- package/dist/shared/listbox-popover-styles.d.ts +6 -0
- package/dist/shared/listbox-popover-styles.js +137 -0
- package/dist/shared/listbox-popover-styles.js.map +1 -0
- package/dist/shared/style-values.d.ts +78 -0
- package/dist/shared/style-values.js +88 -0
- package/dist/shared/style-values.js.map +1 -0
- package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
- package/dist/shared/typeahead.js.map +1 -0
- package/dist/shared/wait-for-css-transition.js.map +1 -0
- package/dist/shared/wait.js.map +1 -0
- package/dist/style/css-mixin.js +3 -3
- package/dist/style/index.js +2 -2
- package/dist/style/style.js +25 -6
- package/dist/style/style.js.map +1 -1
- package/dist/style/stylesheet.d.ts +0 -1
- package/dist/style/stylesheet.js +13 -54
- package/dist/style/stylesheet.js.map +1 -1
- package/dist/tabs/index.d.ts +32 -0
- package/dist/tabs/index.js +157 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/primitives.d.ts +57 -0
- package/dist/tabs/primitives.js +238 -0
- package/dist/tabs/primitives.js.map +1 -0
- package/dist/test.js +1 -1
- package/dist/toggle/index.d.ts +9 -0
- package/dist/toggle/index.js +108 -0
- package/dist/toggle/index.js.map +1 -0
- package/dist/toggle/primitives.d.ts +29 -0
- package/dist/toggle/primitives.js +127 -0
- package/dist/toggle/primitives.js.map +1 -0
- package/package.json +81 -49
- package/src/{components/accordion → accordion}/README.md +50 -14
- package/src/accordion/index.tsx +285 -0
- package/src/accordion/primitives.tsx +512 -0
- package/src/{components/anchor → anchor}/README.md +37 -2
- package/src/animation/animate-mixins.ts +3 -3
- package/src/animation/demos/color-interpolation.tsx +1 -1
- package/src/animation/demos/reordering.tsx +9 -6
- package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
- package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
- package/src/button/README.md +44 -0
- package/src/button/index.ts +168 -0
- package/src/checkbox/README.md +59 -0
- package/src/checkbox/index.ts +164 -0
- package/src/{components/combobox → combobox}/README.md +58 -9
- package/src/combobox/index.tsx +112 -0
- package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
- package/src/dev/refresh.ts +1 -0
- package/src/index.ts +1 -1
- package/src/input/README.md +52 -0
- package/src/input/index.ts +147 -0
- package/src/{components/listbox → listbox}/README.md +9 -41
- package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
- package/src/{components/menu → menu}/README.md +55 -14
- package/src/menu/index.tsx +354 -0
- package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
- package/src/{components/popover → popover}/README.md +20 -39
- package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
- package/src/{utils → popover}/scroll-lock.ts +0 -28
- package/src/radio/README.md +53 -0
- package/src/radio/index.ts +101 -0
- package/src/runtime/client-entry-boundary.ts +54 -0
- package/src/runtime/component.ts +65 -16
- package/src/runtime/core/attributes.ts +35 -1
- package/src/runtime/core/children.ts +24 -2
- package/src/runtime/core/vnode.ts +25 -4
- package/src/runtime/create-element.ts +6 -5
- package/src/runtime/demos/readme.demo.tsx +20 -18
- package/src/runtime/diff-dom.ts +358 -243
- package/src/runtime/dom.ts +331 -214
- package/src/runtime/element-function.ts +1 -0
- package/src/runtime/event-listeners.ts +1 -1
- package/src/runtime/form-navigation.ts +184 -0
- package/src/runtime/frame-resolution.ts +13 -0
- package/src/runtime/frame.ts +482 -124
- package/src/runtime/jsx.ts +3 -5
- package/src/runtime/key.ts +1 -0
- package/src/runtime/mixins/link-mixin.ts +1 -0
- package/src/runtime/mixins/mixin.ts +21 -18
- package/src/runtime/navigation.ts +204 -30
- package/src/runtime/reconcile.ts +769 -760
- package/src/runtime/refresh.ts +46 -0
- package/src/runtime/run.ts +12 -2
- package/src/runtime/scheduler.ts +9 -29
- package/src/runtime/to-vnode.ts +85 -23
- package/src/runtime/vdom.ts +91 -69
- package/src/runtime/vnode.ts +192 -88
- package/src/{components/select → select}/README.md +29 -19
- package/src/select/index.tsx +159 -0
- package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
- package/src/server/stream.ts +25 -31
- package/src/shared/focus-styles.ts +2 -0
- package/src/shared/icons.tsx +62 -0
- package/src/shared/listbox-popover-styles.ts +146 -0
- package/src/shared/style-values.ts +165 -0
- package/src/style/style.ts +25 -6
- package/src/style/stylesheet.ts +32 -57
- package/src/tabs/README.md +141 -0
- package/src/tabs/index.tsx +245 -0
- package/src/tabs/primitives.ts +365 -0
- package/src/test/README.md +151 -60
- package/src/toggle/README.md +56 -0
- package/src/toggle/index.tsx +136 -0
- package/src/toggle/primitives.ts +192 -0
- package/dist/animation/demos/animation.demo.d.ts +0 -5
- package/dist/animation/demos/animation.demo.js +0 -92
- package/dist/animation/demos/animation.demo.js.map +0 -1
- package/dist/animation/demos/spring.demo.d.ts +0 -6
- package/dist/animation/demos/spring.demo.js +0 -304
- package/dist/animation/demos/spring.demo.js.map +0 -1
- package/dist/components/accordion/accordion.d.ts +0 -92
- package/dist/components/accordion/accordion.js +0 -335
- package/dist/components/accordion/accordion.js.map +0 -1
- package/dist/components/accordion/demos/card.demo.d.ts +0 -7
- package/dist/components/accordion/demos/card.demo.js +0 -59
- package/dist/components/accordion/demos/card.demo.js.map +0 -1
- package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
- package/dist/components/accordion/demos/multiple.demo.js +0 -20
- package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
- package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
- package/dist/components/accordion/demos/overview.demo.js +0 -20
- package/dist/components/accordion/demos/overview.demo.js.map +0 -1
- package/dist/components/anchor/anchor.js.map +0 -1
- package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
- package/dist/components/breadcrumbs/basic.demo.js +0 -15
- package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
- package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
- package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
- package/dist/components/breadcrumbs/separator.demo.js +0 -15
- package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
- package/dist/components/button/button.d.ts +0 -105
- package/dist/components/button/button.js +0 -207
- package/dist/components/button/button.js.map +0 -1
- package/dist/components/button/demos/aliases.demo.d.ts +0 -7
- package/dist/components/button/demos/aliases.demo.js +0 -19
- package/dist/components/button/demos/aliases.demo.js.map +0 -1
- package/dist/components/button/demos/basic.demo.d.ts +0 -7
- package/dist/components/button/demos/basic.demo.js +0 -20
- package/dist/components/button/demos/basic.demo.js.map +0 -1
- package/dist/components/button/demos/states.demo.d.ts +0 -7
- package/dist/components/button/demos/states.demo.js +0 -30
- package/dist/components/button/demos/states.demo.js.map +0 -1
- package/dist/components/combobox/combobox.js.map +0 -1
- package/dist/components/combobox/overview.demo.d.ts +0 -7
- package/dist/components/combobox/overview.demo.js +0 -154
- package/dist/components/combobox/overview.demo.js.map +0 -1
- package/dist/components/glyph/glyph.d.ts +0 -14
- package/dist/components/glyph/glyph.js +0 -65
- package/dist/components/glyph/glyph.js.map +0 -1
- package/dist/components/listbox/listbox.js.map +0 -1
- package/dist/components/listbox/overview.demo.d.ts +0 -7
- package/dist/components/listbox/overview.demo.js +0 -65
- package/dist/components/listbox/overview.demo.js.map +0 -1
- package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
- package/dist/components/menu/demos/bubbling.demo.js +0 -16
- package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
- package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
- package/dist/components/menu/demos/context-trigger.demo.js +0 -87
- package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
- package/dist/components/menu/demos/overview.demo.d.ts +0 -7
- package/dist/components/menu/demos/overview.demo.js +0 -33
- package/dist/components/menu/demos/overview.demo.js.map +0 -1
- package/dist/components/menu/hover-aim.js.map +0 -1
- package/dist/components/menu/menu.js.map +0 -1
- package/dist/components/popover/overview.demo.d.ts +0 -7
- package/dist/components/popover/overview.demo.js +0 -65
- package/dist/components/popover/overview.demo.js.map +0 -1
- package/dist/components/popover/popover.js.map +0 -1
- package/dist/components/select/deconstructed.demo.d.ts +0 -7
- package/dist/components/select/deconstructed.demo.js +0 -54
- package/dist/components/select/deconstructed.demo.js.map +0 -1
- package/dist/components/select/overview.demo.d.ts +0 -6
- package/dist/components/select/overview.demo.js +0 -28
- package/dist/components/select/overview.demo.js.map +0 -1
- package/dist/components/select/select.js.map +0 -1
- package/dist/components/separator/separator.d.ts +0 -2
- package/dist/components/separator/separator.js +0 -15
- package/dist/components/separator/separator.js.map +0 -1
- package/dist/components/tabs/tabs.d.ts +0 -78
- package/dist/components/tabs/tabs.js +0 -339
- package/dist/components/tabs/tabs.js.map +0 -1
- package/dist/interactions/keydown/keydown.js.map +0 -1
- package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
- package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
- package/dist/runtime/demos/basic.demo.d.ts +0 -6
- package/dist/runtime/demos/basic.demo.js +0 -16
- package/dist/runtime/demos/basic.demo.js.map +0 -1
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
- package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
- package/dist/runtime/demos/keyed-list.demo.js +0 -62
- package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
- package/dist/runtime/demos/readme.demo.d.ts +0 -5
- package/dist/runtime/demos/readme.demo.js +0 -396
- package/dist/runtime/demos/readme.demo.js.map +0 -1
- package/dist/theme/contract.d.ts +0 -61
- package/dist/theme/contract.js +0 -131
- package/dist/theme/contract.js.map +0 -1
- package/dist/theme/glyph-contract.d.ts +0 -11
- package/dist/theme/glyph-contract.js +0 -34
- package/dist/theme/glyph-contract.js.map +0 -1
- package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
- package/dist/theme/presets/rmx-01/glyphs.js +0 -252
- package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
- package/dist/theme/presets/rmx-01/index.d.ts +0 -4
- package/dist/theme/presets/rmx-01/index.js +0 -119
- package/dist/theme/presets/rmx-01/index.js.map +0 -1
- package/dist/theme/runtime.d.ts +0 -2
- package/dist/theme/runtime.js +0 -84
- package/dist/theme/runtime.js.map +0 -1
- package/dist/theme/theme.d.ts +0 -6
- package/dist/theme/theme.js +0 -5
- package/dist/theme/theme.js.map +0 -1
- package/dist/utils/flash-attribute.js.map +0 -1
- package/dist/utils/scroll-lock.d.ts +0 -3
- package/dist/utils/scroll-lock.js.map +0 -1
- package/dist/utils/wait-for-css-transition.js.map +0 -1
- package/dist/utils/wait.js.map +0 -1
- package/src/animation/demos/animation.demo.tsx +0 -194
- package/src/animation/demos/spring.demo.tsx +0 -385
- package/src/components/accordion/accordion.tsx +0 -565
- package/src/components/accordion/demos/card.demo.tsx +0 -114
- package/src/components/accordion/demos/multiple.demo.tsx +0 -57
- package/src/components/accordion/demos/overview.demo.tsx +0 -57
- package/src/components/breadcrumbs/basic.demo.tsx +0 -18
- package/src/components/breadcrumbs/separator.demo.tsx +0 -19
- package/src/components/button/README.md +0 -44
- package/src/components/button/button.tsx +0 -286
- package/src/components/button/demos/aliases.demo.tsx +0 -28
- package/src/components/button/demos/basic.demo.tsx +0 -31
- package/src/components/button/demos/states.demo.tsx +0 -53
- package/src/components/combobox/overview.demo.tsx +0 -200
- package/src/components/glyph/README.md +0 -72
- package/src/components/glyph/glyph.tsx +0 -110
- package/src/components/listbox/overview.demo.tsx +0 -102
- package/src/components/menu/demos/bubbling.demo.tsx +0 -35
- package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
- package/src/components/menu/demos/overview.demo.tsx +0 -77
- package/src/components/popover/overview.demo.tsx +0 -144
- package/src/components/select/deconstructed.demo.tsx +0 -96
- package/src/components/select/overview.demo.tsx +0 -52
- package/src/components/separator/separator.ts +0 -19
- package/src/components/tabs/README.md +0 -105
- package/src/components/tabs/tabs.tsx +0 -504
- package/src/runtime/demos/basic.demo.tsx +0 -21
- package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
- package/src/runtime/demos/keyed-list.demo.tsx +0 -94
- package/src/theme/README.md +0 -103
- package/src/theme/contract.ts +0 -215
- package/src/theme/glyph-contract.ts +0 -59
- package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
- package/src/theme/presets/rmx-01/index.ts +0 -123
- package/src/theme/runtime.ts +0 -119
- package/src/theme/theme.ts +0 -15
- package/src/utils/scroll-lock/README.md +0 -33
- /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
- /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
- /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
- /package/dist/{utils → listbox}/flash-attribute.js +0 -0
- /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
- /package/dist/{components/menu → menu}/hover-aim.js +0 -0
- /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
- /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
- /package/dist/{interactions/keydown → select}/keydown.js +0 -0
- /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
- /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
- /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
- /package/dist/{utils → shared}/wait.d.ts +0 -0
- /package/dist/{utils → shared}/wait.js +0 -0
- /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
- /package/src/{utils → listbox}/flash-attribute.ts +0 -0
- /package/src/{components/menu → menu}/hover-aim.ts +0 -0
- /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
- /package/src/{interactions/keydown → select}/keydown.ts +0 -0
- /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
- /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
- /package/src/{utils → shared}/wait.ts +0 -0
package/dist/runtime/frame.js
CHANGED
|
@@ -1,14 +1,36 @@
|
|
|
1
|
-
import { jsx } from
|
|
2
|
-
import { Frame, createFrameHandle } from
|
|
3
|
-
import { createComponentErrorEvent, getComponentError } from
|
|
4
|
-
import { invariant } from
|
|
5
|
-
import { createRangeRoot, createRoot } from
|
|
6
|
-
import { diffNodes } from
|
|
7
|
-
import { createStyleManager } from
|
|
8
|
-
import { findFlushMarker } from
|
|
1
|
+
import { jsx } from './jsx.js';
|
|
2
|
+
import { Frame, createFrameHandle } from './component.js';
|
|
3
|
+
import { createComponentErrorEvent, getComponentError } from './error-event.js';
|
|
4
|
+
import { invariant } from './invariant.js';
|
|
5
|
+
import { createRangeRoot, createRoot } from './vdom.js';
|
|
6
|
+
import { diffNodes } from './diff-dom.js';
|
|
7
|
+
import { createStyleManager } from '../style/index.js';
|
|
8
|
+
import { findFlushMarker } from './stream-protocol.js';
|
|
9
|
+
import { unwrapFrameResolution } from './frame-resolution.js';
|
|
10
|
+
import { disposeClientEntryBoundary, getClientEntryBoundaryOwner, setClientEntryBoundaryOwner, } from './client-entry-boundary.js';
|
|
9
11
|
const bufferedFrameTemplates = new Map();
|
|
10
12
|
const frameTemplateListeners = new Map();
|
|
11
13
|
const DOCTYPE_PATTERN = /<!doctype(?:\s[^>]*)?>/gi;
|
|
14
|
+
function createLinkedAbortController(first, second) {
|
|
15
|
+
let controller = new AbortController();
|
|
16
|
+
let signals = second ? [first, second] : [first];
|
|
17
|
+
let abort = () => controller.abort();
|
|
18
|
+
for (let signal of signals) {
|
|
19
|
+
if (signal.aborted) {
|
|
20
|
+
controller.abort();
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
controller,
|
|
27
|
+
disconnect() {
|
|
28
|
+
for (let signal of signals) {
|
|
29
|
+
signal.removeEventListener('abort', abort);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
12
34
|
function stripDoctypeMarkup(html) {
|
|
13
35
|
return html.replace(DOCTYPE_PATTERN, '');
|
|
14
36
|
}
|
|
@@ -24,10 +46,33 @@ function syncElementAttributes(target, source) {
|
|
|
24
46
|
}
|
|
25
47
|
}
|
|
26
48
|
}
|
|
49
|
+
const FRAME_RUNTIME = Symbol('FrameRuntime');
|
|
50
|
+
export function isFrameRuntime(value) {
|
|
51
|
+
return isRecord(value) && Reflect.get(value, FRAME_RUNTIME) === true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reloads a frame and returns response metadata used by the navigation runtime.
|
|
55
|
+
*
|
|
56
|
+
* @param frame Frame handle to reload.
|
|
57
|
+
* @param options Form submission metadata and cancellation signal.
|
|
58
|
+
* @returns The reload signal and final response URL, when redirected.
|
|
59
|
+
*/
|
|
60
|
+
export function reloadFrameForNavigation(frame, options) {
|
|
61
|
+
let runtime = frame.$runtime;
|
|
62
|
+
invariant(isFrameRuntime(runtime), 'Expected a frame runtime');
|
|
63
|
+
let reload = runtime.reloadForNavigation;
|
|
64
|
+
invariant(reload, 'Expected frame runtime to support navigation reloads');
|
|
65
|
+
return reload(options);
|
|
66
|
+
}
|
|
27
67
|
export function createFrame(root, init) {
|
|
28
68
|
let container = createContainer(root);
|
|
29
69
|
let contentRoot;
|
|
30
70
|
let reloadController;
|
|
71
|
+
// The style registry is document-level and shared by every frame; only the
|
|
72
|
+
// frame that created it (the runtime root) disposes it.
|
|
73
|
+
let ownsStyleManager = !init.styleManager;
|
|
74
|
+
let reloadAbortUnsubscribe;
|
|
75
|
+
let reloadKind;
|
|
31
76
|
let styleManager = init.styleManager ?? createStyleManager();
|
|
32
77
|
let currentMarker = init.marker;
|
|
33
78
|
let displayedContentStatus = init.marker?.status ?? 'resolved';
|
|
@@ -36,37 +81,15 @@ export function createFrame(root, init) {
|
|
|
36
81
|
let pendingTemplateUnsubscribe;
|
|
37
82
|
let inheritedReloadPending = false;
|
|
38
83
|
let inheritedReloadAbortUnsubscribe;
|
|
84
|
+
let disposed = false;
|
|
85
|
+
let lifecycleController = new AbortController();
|
|
39
86
|
// Merge any rmx-data found in the current document once at startup.
|
|
40
87
|
mergeRmxDataFromDocument(init.data, container.doc);
|
|
41
|
-
let runtime = createFrameRuntime({ ...init, styleManager });
|
|
88
|
+
let runtime = createFrameRuntime({ ...init, styleManager, reloadForNavigation: reload });
|
|
42
89
|
let frame = createFrameHandle({
|
|
43
90
|
src: init.src,
|
|
44
91
|
$runtime: runtime,
|
|
45
|
-
reload: async () =>
|
|
46
|
-
reloadController?.abort();
|
|
47
|
-
let controller = new AbortController();
|
|
48
|
-
reloadController = controller;
|
|
49
|
-
frame.dispatchEvent(new Event('reloadStart'));
|
|
50
|
-
startSubFrameInheritedReloads(getContentNodes(), controller.signal);
|
|
51
|
-
try {
|
|
52
|
-
let content = await init.resolveFrame(frame.src, controller.signal, frameName);
|
|
53
|
-
if (reloadController !== controller || controller.signal.aborted)
|
|
54
|
-
return controller.signal;
|
|
55
|
-
await render(content, { signal: controller.signal });
|
|
56
|
-
return controller.signal;
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
if (reloadController !== controller || controller.signal.aborted)
|
|
60
|
-
return controller.signal;
|
|
61
|
-
init.errorTarget.dispatchEvent(createComponentErrorEvent(error));
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
if (reloadController === controller) {
|
|
66
|
-
frame.dispatchEvent(new Event('reloadComplete'));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
},
|
|
92
|
+
reload: async () => (await reload()).signal,
|
|
70
93
|
replace: async (content) => {
|
|
71
94
|
await render(content);
|
|
72
95
|
},
|
|
@@ -90,18 +113,41 @@ export function createFrame(root, init) {
|
|
|
90
113
|
moduleLoads: init.moduleLoads,
|
|
91
114
|
frameInstances: init.frameInstances,
|
|
92
115
|
namedFrames: init.namedFrames,
|
|
116
|
+
lifecycleSignal: lifecycleController.signal,
|
|
93
117
|
regionTailRef: container.regionTailRef,
|
|
94
118
|
regionParent: container.regionParent,
|
|
95
119
|
};
|
|
96
120
|
async function render(content, options) {
|
|
97
|
-
if (options?.signal?.aborted)
|
|
121
|
+
if (disposed || lifecycleController.signal.aborted || options?.signal?.aborted)
|
|
122
|
+
return;
|
|
123
|
+
let ownsData = options?.data === undefined;
|
|
124
|
+
let renderOptions = {
|
|
125
|
+
...options,
|
|
126
|
+
data: options?.data ?? {},
|
|
127
|
+
};
|
|
128
|
+
try {
|
|
129
|
+
await renderContent(content, renderOptions);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
if (ownsData)
|
|
133
|
+
clearRmxData(renderOptions.data);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function renderContent(content, options) {
|
|
137
|
+
if (isRenderAborted(options.signal))
|
|
98
138
|
return;
|
|
99
139
|
if (content instanceof ReadableStream) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
140
|
+
let linkedAbort = createLinkedAbortController(lifecycleController.signal, options.signal);
|
|
141
|
+
try {
|
|
142
|
+
await renderFrameStream(content, container.doc, async (html, flushKind) => {
|
|
143
|
+
if (isRenderAborted(options.signal))
|
|
144
|
+
return;
|
|
145
|
+
await render(html, { ...options, flushKind });
|
|
146
|
+
}, linkedAbort.controller.signal);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
linkedAbort.disconnect();
|
|
150
|
+
}
|
|
105
151
|
return;
|
|
106
152
|
}
|
|
107
153
|
if (isRemixNodeFrameContent(content)) {
|
|
@@ -112,10 +158,10 @@ export function createFrame(root, init) {
|
|
|
112
158
|
clearFrameContent();
|
|
113
159
|
contentRoot = createFrameContentRoot();
|
|
114
160
|
}
|
|
115
|
-
if (options
|
|
161
|
+
if (isRenderAborted(options.signal))
|
|
116
162
|
return;
|
|
117
163
|
contentRoot.render(content);
|
|
118
|
-
displayedContentStatus = options
|
|
164
|
+
displayedContentStatus = options.contentStatus ?? 'resolved';
|
|
119
165
|
return;
|
|
120
166
|
}
|
|
121
167
|
if (contentRoot) {
|
|
@@ -136,50 +182,61 @@ export function createFrame(root, init) {
|
|
|
136
182
|
let htmlContent = typeof content === 'string' ? stripDoctypeMarkup(content) : undefined;
|
|
137
183
|
let isFullDocumentReload = container.root instanceof Document &&
|
|
138
184
|
htmlContent !== undefined &&
|
|
139
|
-
options
|
|
185
|
+
options.flushKind === 'document';
|
|
140
186
|
if (isFullDocumentReload && htmlContent !== undefined) {
|
|
141
187
|
let parsed = new DOMParser().parseFromString(htmlContent, 'text/html');
|
|
142
|
-
|
|
143
|
-
|
|
188
|
+
let responseData = options.data;
|
|
189
|
+
mergeRmxDataFromDocument(responseData, parsed);
|
|
190
|
+
let responseContext = { ...context, data: responseData };
|
|
191
|
+
context.styleManager.adoptServerStyles(collectFrameServerStyleTags(createElementContainer(parsed)));
|
|
144
192
|
syncElementAttributes(container.doc.documentElement, parsed.documentElement);
|
|
145
193
|
diffNodes([container.doc.head], [parsed.head], {
|
|
146
|
-
...
|
|
194
|
+
...responseContext,
|
|
147
195
|
regionParent: container.doc.documentElement,
|
|
148
196
|
regionTailRef: null,
|
|
149
|
-
signal: options
|
|
197
|
+
signal: options.signal,
|
|
150
198
|
});
|
|
151
199
|
diffNodes([container.doc.body], [parsed.body], {
|
|
152
|
-
...
|
|
200
|
+
...responseContext,
|
|
153
201
|
regionParent: container.doc.documentElement,
|
|
154
202
|
regionTailRef: null,
|
|
155
|
-
signal: options
|
|
203
|
+
signal: options.signal,
|
|
156
204
|
});
|
|
157
205
|
let bodyContainer = createElementContainer(container.doc.body);
|
|
158
|
-
if (options
|
|
206
|
+
if (isRenderAborted(options.signal))
|
|
207
|
+
return;
|
|
208
|
+
scheduleHydrationInContainer(bodyContainer, responseContext, options.initialHydrationTracker, options.signal);
|
|
209
|
+
await createSubFrames(bodyContainer.childNodes, responseContext, options);
|
|
210
|
+
if (isRenderAborted(options.signal))
|
|
159
211
|
return;
|
|
160
|
-
|
|
161
|
-
await createSubFrames(bodyContainer.childNodes, context, options);
|
|
162
|
-
displayedContentStatus = options?.contentStatus ?? 'resolved';
|
|
212
|
+
displayedContentStatus = options.contentStatus ?? 'resolved';
|
|
163
213
|
return;
|
|
164
214
|
}
|
|
165
215
|
let fragment = htmlContent !== undefined ? createFragmentFromString(container.doc, htmlContent) : content;
|
|
166
|
-
context.styleManager.
|
|
216
|
+
context.styleManager.adoptServerStyles(collectFrameServerStyleTags(createElementContainer(fragment)));
|
|
167
217
|
removeEmptyHeads(fragment);
|
|
168
|
-
|
|
218
|
+
let responseData = options.data;
|
|
219
|
+
mergeRmxDataFromFragment(responseData, fragment);
|
|
220
|
+
let responseContext = { ...context, data: responseData };
|
|
169
221
|
let nextContainer = createContainer(fragment);
|
|
170
|
-
if (options
|
|
222
|
+
if (isRenderAborted(options.signal))
|
|
171
223
|
return;
|
|
172
224
|
diffNodes(container.childNodes, Array.from(nextContainer.childNodes), {
|
|
173
|
-
...
|
|
225
|
+
...responseContext,
|
|
174
226
|
regionTailRef: container.regionTailRef,
|
|
175
227
|
regionParent: container.regionParent,
|
|
176
|
-
signal: options
|
|
228
|
+
signal: options.signal,
|
|
177
229
|
});
|
|
178
|
-
if (options
|
|
230
|
+
if (isRenderAborted(options.signal))
|
|
179
231
|
return;
|
|
180
|
-
scheduleHydrationInContainer(container,
|
|
181
|
-
await createSubFrames(container.childNodes,
|
|
182
|
-
|
|
232
|
+
scheduleHydrationInContainer(container, responseContext, options.initialHydrationTracker, options.signal);
|
|
233
|
+
await createSubFrames(container.childNodes, responseContext, options);
|
|
234
|
+
if (isRenderAborted(options.signal))
|
|
235
|
+
return;
|
|
236
|
+
displayedContentStatus = options.contentStatus ?? 'resolved';
|
|
237
|
+
}
|
|
238
|
+
function isRenderAborted(signal) {
|
|
239
|
+
return disposed || lifecycleController.signal.aborted || signal?.aborted === true;
|
|
183
240
|
}
|
|
184
241
|
function createFrameContentRoot() {
|
|
185
242
|
let virtualRoot;
|
|
@@ -217,18 +274,34 @@ export function createFrame(root, init) {
|
|
|
217
274
|
}
|
|
218
275
|
async function hydrateInitial() {
|
|
219
276
|
let initialHydrationTracker = createInitialHydrationTracker();
|
|
220
|
-
context.styleManager.
|
|
221
|
-
|
|
277
|
+
context.styleManager.adoptServerStyles(collectFrameServerStyleTags(container));
|
|
278
|
+
let subFramesReady = createSubFrames(container.childNodes, context);
|
|
222
279
|
scheduleHydrationInContainer(container, context, initialHydrationTracker);
|
|
223
|
-
|
|
224
|
-
await
|
|
280
|
+
try {
|
|
281
|
+
await subFramesReady;
|
|
282
|
+
if (disposed || context.lifecycleSignal.aborted)
|
|
283
|
+
return;
|
|
284
|
+
if (currentMarker?.status === 'pending') {
|
|
285
|
+
await watchPendingFrameTemplate(currentMarker, initialHydrationTracker);
|
|
286
|
+
}
|
|
287
|
+
initialHydrationTracker.finalize();
|
|
288
|
+
await initialHydrationTracker.ready();
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
clearRmxData(context.data);
|
|
225
292
|
}
|
|
226
|
-
initialHydrationTracker.finalize();
|
|
227
|
-
await initialHydrationTracker.ready();
|
|
228
293
|
}
|
|
229
294
|
function dispose() {
|
|
295
|
+
if (disposed)
|
|
296
|
+
return;
|
|
297
|
+
disposed = true;
|
|
298
|
+
lifecycleController.abort();
|
|
299
|
+
clearRmxData(context.data);
|
|
230
300
|
reloadController?.abort();
|
|
231
301
|
reloadController = undefined;
|
|
302
|
+
reloadAbortUnsubscribe?.();
|
|
303
|
+
reloadAbortUnsubscribe = undefined;
|
|
304
|
+
reloadKind = undefined;
|
|
232
305
|
contentRoot?.dispose();
|
|
233
306
|
contentRoot = undefined;
|
|
234
307
|
clearPendingFrameTemplateWatch();
|
|
@@ -236,7 +309,9 @@ export function createFrame(root, init) {
|
|
|
236
309
|
removeVirtualRoots(container.childNodes);
|
|
237
310
|
// Dispose sub-frames recursively.
|
|
238
311
|
disposeSubFrames(container.childNodes, context);
|
|
239
|
-
|
|
312
|
+
if (ownsStyleManager) {
|
|
313
|
+
context.styleManager.dispose();
|
|
314
|
+
}
|
|
240
315
|
if (frameName) {
|
|
241
316
|
if (init.namedFrames.get(frameName) === frame) {
|
|
242
317
|
init.namedFrames.delete(frameName);
|
|
@@ -250,14 +325,17 @@ export function createFrame(root, init) {
|
|
|
250
325
|
flush: () => context.scheduler.dequeue(),
|
|
251
326
|
clearPendingTemplateWatch: clearPendingFrameTemplateWatch,
|
|
252
327
|
isDisplayingResolvedContent: () => displayedContentStatus === 'resolved',
|
|
328
|
+
beginClientFrameReloadForAncestorReload,
|
|
329
|
+
cancelReload,
|
|
253
330
|
startInheritedReload,
|
|
254
331
|
updateMarker,
|
|
255
332
|
renderMarkerContent,
|
|
333
|
+
matchesIdentity: (src, name) => !disposed && frame.src === src && frameName === name,
|
|
256
334
|
dispose,
|
|
257
335
|
handle: frame,
|
|
258
336
|
};
|
|
259
337
|
async function updateMarker(marker, options) {
|
|
260
|
-
if (options?.signal?.aborted)
|
|
338
|
+
if (disposed || context.lifecycleSignal.aborted || options?.signal?.aborted)
|
|
261
339
|
return;
|
|
262
340
|
let previousMarker = currentMarker;
|
|
263
341
|
let isInheritedReload = previousMarker !== undefined && previousMarker.id !== marker.id;
|
|
@@ -280,7 +358,7 @@ export function createFrame(root, init) {
|
|
|
280
358
|
}
|
|
281
359
|
}
|
|
282
360
|
async function renderMarkerContent(marker, content, options) {
|
|
283
|
-
if (options?.signal?.aborted)
|
|
361
|
+
if (disposed || context.lifecycleSignal.aborted || options?.signal?.aborted)
|
|
284
362
|
return;
|
|
285
363
|
let previousMarker = currentMarker;
|
|
286
364
|
let isInheritedReload = previousMarker !== undefined && previousMarker.id !== marker.id;
|
|
@@ -290,10 +368,102 @@ export function createFrame(root, init) {
|
|
|
290
368
|
}
|
|
291
369
|
clearPendingFrameTemplateWatch();
|
|
292
370
|
await render(content, { ...options, contentStatus: 'resolved' });
|
|
293
|
-
if (isInheritedReload &&
|
|
371
|
+
if (isInheritedReload &&
|
|
372
|
+
!disposed &&
|
|
373
|
+
!context.lifecycleSignal.aborted &&
|
|
374
|
+
!options?.signal?.aborted) {
|
|
294
375
|
completeInheritedReload();
|
|
295
376
|
}
|
|
296
377
|
}
|
|
378
|
+
async function reload(options) {
|
|
379
|
+
let controller = startReload(options?.signal);
|
|
380
|
+
return await resolveAndRenderReload(controller, options);
|
|
381
|
+
}
|
|
382
|
+
function startReload(signal) {
|
|
383
|
+
let controller = replaceReloadController(signal);
|
|
384
|
+
reloadKind = 'direct';
|
|
385
|
+
frame.dispatchEvent(new Event('reloadStart'));
|
|
386
|
+
startSubFrameInheritedReloads(getContentNodes(), controller.signal);
|
|
387
|
+
return controller;
|
|
388
|
+
}
|
|
389
|
+
function beginClientFrameReloadForAncestorReload(signal) {
|
|
390
|
+
let inheritedReloadStarted = reuseInheritedReloadStart();
|
|
391
|
+
let continuingAncestorReload = reloadKind === 'ancestor';
|
|
392
|
+
let controller = replaceReloadController(signal);
|
|
393
|
+
reloadKind = 'ancestor';
|
|
394
|
+
if (!inheritedReloadStarted && !continuingAncestorReload) {
|
|
395
|
+
frame.dispatchEvent(new Event('reloadStart'));
|
|
396
|
+
startSubFrameInheritedReloads(getContentNodes(), controller.signal);
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
controller,
|
|
400
|
+
complete: () => completeReload(controller),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function cancelReload() {
|
|
404
|
+
let controller = reloadController;
|
|
405
|
+
if (!controller)
|
|
406
|
+
return;
|
|
407
|
+
controller.abort();
|
|
408
|
+
completeReload(controller);
|
|
409
|
+
}
|
|
410
|
+
function replaceReloadController(signal) {
|
|
411
|
+
reloadController?.abort();
|
|
412
|
+
reloadAbortUnsubscribe?.();
|
|
413
|
+
reloadAbortUnsubscribe = undefined;
|
|
414
|
+
let controller = new AbortController();
|
|
415
|
+
reloadController = controller;
|
|
416
|
+
if (signal) {
|
|
417
|
+
if (signal.aborted) {
|
|
418
|
+
controller.abort();
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
let abort = () => controller.abort();
|
|
422
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
423
|
+
reloadAbortUnsubscribe = () => signal.removeEventListener('abort', abort);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return controller;
|
|
427
|
+
}
|
|
428
|
+
async function resolveAndRenderReload(controller, options) {
|
|
429
|
+
try {
|
|
430
|
+
let resolution = await init.resolveFrame(frame.src, {
|
|
431
|
+
...options,
|
|
432
|
+
signal: controller.signal,
|
|
433
|
+
target: frameName,
|
|
434
|
+
});
|
|
435
|
+
if (reloadController !== controller || controller.signal.aborted) {
|
|
436
|
+
return { signal: controller.signal };
|
|
437
|
+
}
|
|
438
|
+
let { content, redirectedTo } = await unwrapFrameResolution(resolution);
|
|
439
|
+
if (reloadController !== controller || controller.signal.aborted) {
|
|
440
|
+
return { signal: controller.signal };
|
|
441
|
+
}
|
|
442
|
+
await render(content, { signal: controller.signal });
|
|
443
|
+
return {
|
|
444
|
+
signal: controller.signal,
|
|
445
|
+
redirectedTo: reloadController === controller && !controller.signal.aborted ? redirectedTo : undefined,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
if (reloadController !== controller || controller.signal.aborted) {
|
|
450
|
+
return { signal: controller.signal };
|
|
451
|
+
}
|
|
452
|
+
init.errorTarget.dispatchEvent(createComponentErrorEvent(error));
|
|
453
|
+
throw error;
|
|
454
|
+
}
|
|
455
|
+
finally {
|
|
456
|
+
completeReload(controller);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function completeReload(controller) {
|
|
460
|
+
if (reloadController !== controller || reloadKind === undefined)
|
|
461
|
+
return;
|
|
462
|
+
reloadAbortUnsubscribe?.();
|
|
463
|
+
reloadAbortUnsubscribe = undefined;
|
|
464
|
+
reloadKind = undefined;
|
|
465
|
+
frame.dispatchEvent(new Event('reloadComplete'));
|
|
466
|
+
}
|
|
297
467
|
function startInheritedReload(signal) {
|
|
298
468
|
if (signal?.aborted)
|
|
299
469
|
return;
|
|
@@ -312,6 +482,14 @@ export function createFrame(root, init) {
|
|
|
312
482
|
};
|
|
313
483
|
}
|
|
314
484
|
}
|
|
485
|
+
function reuseInheritedReloadStart() {
|
|
486
|
+
if (!inheritedReloadPending)
|
|
487
|
+
return false;
|
|
488
|
+
inheritedReloadPending = false;
|
|
489
|
+
inheritedReloadAbortUnsubscribe?.();
|
|
490
|
+
inheritedReloadAbortUnsubscribe = undefined;
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
315
493
|
function completeInheritedReload() {
|
|
316
494
|
if (!inheritedReloadPending)
|
|
317
495
|
return;
|
|
@@ -328,7 +506,7 @@ export function createFrame(root, init) {
|
|
|
328
506
|
if (isFrameStart(node)) {
|
|
329
507
|
let end = findEndMarker(node, isFrameStart, isFrameEnd);
|
|
330
508
|
context.frameInstances.get(node)?.startInheritedReload(signal);
|
|
331
|
-
i = nodes
|
|
509
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
332
510
|
continue;
|
|
333
511
|
}
|
|
334
512
|
if (node.childNodes && node.childNodes.length > 0) {
|
|
@@ -344,7 +522,7 @@ export function createFrame(root, init) {
|
|
|
344
522
|
pendingTemplateMarkerId = undefined;
|
|
345
523
|
}
|
|
346
524
|
async function watchPendingFrameTemplate(marker, initialHydrationTracker, signal, onResolved) {
|
|
347
|
-
if (signal?.aborted)
|
|
525
|
+
if (disposed || context.lifecycleSignal.aborted || signal?.aborted)
|
|
348
526
|
return;
|
|
349
527
|
if (pendingTemplateMarkerId === marker.id)
|
|
350
528
|
return;
|
|
@@ -354,24 +532,24 @@ export function createFrame(root, init) {
|
|
|
354
532
|
if (early) {
|
|
355
533
|
clearPendingFrameTemplateWatch();
|
|
356
534
|
await render(early, { initialHydrationTracker, signal, contentStatus: 'resolved' });
|
|
357
|
-
if (!signal?.aborted)
|
|
535
|
+
if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
|
|
358
536
|
onResolved?.();
|
|
359
537
|
return;
|
|
360
538
|
}
|
|
361
|
-
if (signal?.aborted) {
|
|
539
|
+
if (disposed || context.lifecycleSignal.aborted || signal?.aborted) {
|
|
362
540
|
clearPendingFrameTemplateWatch();
|
|
363
541
|
return;
|
|
364
542
|
}
|
|
365
543
|
let observer = setupTemplateObserver();
|
|
366
544
|
pendingTemplateObserver = observer;
|
|
367
545
|
let unsubscribe = subscribeFrameTemplate(marker.id, async (fragment) => {
|
|
368
|
-
if (signal?.aborted)
|
|
546
|
+
if (disposed || context.lifecycleSignal.aborted || signal?.aborted)
|
|
369
547
|
return;
|
|
370
548
|
if (pendingTemplateMarkerId !== marker.id)
|
|
371
549
|
return;
|
|
372
550
|
clearPendingFrameTemplateWatch();
|
|
373
551
|
await render(fragment, { signal, contentStatus: 'resolved' });
|
|
374
|
-
if (!signal?.aborted)
|
|
552
|
+
if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
|
|
375
553
|
onResolved?.();
|
|
376
554
|
});
|
|
377
555
|
pendingTemplateUnsubscribe = unsubscribe;
|
|
@@ -384,13 +562,14 @@ export function createFrame(root, init) {
|
|
|
384
562
|
if (buffered) {
|
|
385
563
|
clearPendingFrameTemplateWatch();
|
|
386
564
|
await render(buffered, { initialHydrationTracker, signal, contentStatus: 'resolved' });
|
|
387
|
-
if (!signal?.aborted)
|
|
565
|
+
if (!disposed && !context.lifecycleSignal.aborted && !signal?.aborted)
|
|
388
566
|
onResolved?.();
|
|
389
567
|
}
|
|
390
568
|
}
|
|
391
569
|
}
|
|
392
570
|
export function createFrameRuntime(init) {
|
|
393
571
|
return {
|
|
572
|
+
[FRAME_RUNTIME]: true,
|
|
394
573
|
topFrame: init.topFrame,
|
|
395
574
|
errorTarget: init.errorTarget,
|
|
396
575
|
loadModule: init.loadModule,
|
|
@@ -398,11 +577,12 @@ export function createFrameRuntime(init) {
|
|
|
398
577
|
pendingClientEntries: init.pendingClientEntries,
|
|
399
578
|
scheduler: init.scheduler,
|
|
400
579
|
styleManager: init.styleManager,
|
|
401
|
-
data: init.data,
|
|
402
580
|
moduleCache: init.moduleCache,
|
|
403
581
|
moduleLoads: init.moduleLoads,
|
|
404
582
|
frameInstances: init.frameInstances,
|
|
405
583
|
namedFrames: init.namedFrames,
|
|
584
|
+
serverFrameReload: undefined,
|
|
585
|
+
reloadForNavigation: init.reloadForNavigation,
|
|
406
586
|
};
|
|
407
587
|
}
|
|
408
588
|
function createInitialHydrationTracker() {
|
|
@@ -457,6 +637,10 @@ function mergeRmxDataFromFragment(into, fragment) {
|
|
|
457
637
|
script.remove();
|
|
458
638
|
}
|
|
459
639
|
}
|
|
640
|
+
function clearRmxData(data) {
|
|
641
|
+
delete data.h;
|
|
642
|
+
delete data.f;
|
|
643
|
+
}
|
|
460
644
|
function removeEmptyHeads(fragment) {
|
|
461
645
|
let heads = Array.from(fragment.querySelectorAll('head'));
|
|
462
646
|
for (let head of heads) {
|
|
@@ -478,14 +662,14 @@ function collectOwnedServerStyleTags(nodes, styles) {
|
|
|
478
662
|
let node = nodes[i];
|
|
479
663
|
if (isFrameStart(node)) {
|
|
480
664
|
let end = findEndMarker(node, isFrameStart, isFrameEnd);
|
|
481
|
-
i = nodes
|
|
665
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
482
666
|
continue;
|
|
483
667
|
}
|
|
484
668
|
if (node instanceof HTMLStyleElement && node.matches('style[data-rmx]')) {
|
|
485
669
|
styles.push(node);
|
|
486
670
|
continue;
|
|
487
671
|
}
|
|
488
|
-
if (node
|
|
672
|
+
if (node.childNodes.length > 0) {
|
|
489
673
|
collectOwnedServerStyleTags(Array.from(node.childNodes), styles);
|
|
490
674
|
}
|
|
491
675
|
}
|
|
@@ -520,7 +704,7 @@ function copyOwnRmxEntries(target, source) {
|
|
|
520
704
|
target[key] = source[key];
|
|
521
705
|
}
|
|
522
706
|
}
|
|
523
|
-
function scheduleHydrationInContainer(container, context, initialHydrationTracker) {
|
|
707
|
+
function scheduleHydrationInContainer(container, context, initialHydrationTracker, signal) {
|
|
524
708
|
let hydrationMarkers = findHydrationMarkers(container);
|
|
525
709
|
if (hydrationMarkers.length === 0)
|
|
526
710
|
return;
|
|
@@ -531,44 +715,67 @@ function scheduleHydrationInContainer(container, context, initialHydrationTracke
|
|
|
531
715
|
let entry = hydrationData[marker.id];
|
|
532
716
|
if (!entry)
|
|
533
717
|
continue;
|
|
534
|
-
scheduleHydrationMarker(marker, entry, context, initialHydrationTracker);
|
|
718
|
+
scheduleHydrationMarker(marker, entry, context, initialHydrationTracker, signal);
|
|
535
719
|
}
|
|
536
720
|
}
|
|
537
|
-
function scheduleHydrationMarker(marker, entry, context, initialHydrationTracker) {
|
|
721
|
+
function scheduleHydrationMarker(marker, entry, context, initialHydrationTracker, signal) {
|
|
722
|
+
if (signal?.aborted || context.lifecycleSignal.aborted)
|
|
723
|
+
return;
|
|
538
724
|
let done = initialHydrationTracker?.track();
|
|
539
725
|
let key = `${entry.moduleUrl}#${entry.exportName}`;
|
|
726
|
+
let identity = {
|
|
727
|
+
moduleUrl: entry.moduleUrl,
|
|
728
|
+
exportName: entry.exportName,
|
|
729
|
+
};
|
|
730
|
+
let props = entry.props;
|
|
731
|
+
let completed = false;
|
|
732
|
+
let complete = () => {
|
|
733
|
+
if (completed)
|
|
734
|
+
return;
|
|
735
|
+
completed = true;
|
|
736
|
+
props = undefined;
|
|
737
|
+
signal?.removeEventListener('abort', complete);
|
|
738
|
+
context.lifecycleSignal.removeEventListener('abort', complete);
|
|
739
|
+
done?.();
|
|
740
|
+
};
|
|
741
|
+
signal?.addEventListener('abort', complete, { once: true });
|
|
742
|
+
context.lifecycleSignal.addEventListener('abort', complete, { once: true });
|
|
540
743
|
let hydrateWithComponent = (component) => {
|
|
744
|
+
if (signal?.aborted || context.lifecycleSignal.aborted)
|
|
745
|
+
return;
|
|
541
746
|
if (!isHydrationMarkerLive(marker, context))
|
|
542
747
|
return;
|
|
543
|
-
|
|
748
|
+
if (!props)
|
|
749
|
+
return;
|
|
750
|
+
let vElement = createElement(component, props);
|
|
544
751
|
context.pendingClientEntries.set(marker.start, [marker.end, vElement]);
|
|
545
|
-
hydrateRegion(vElement, marker.start, marker.end, context);
|
|
752
|
+
hydrateRegion(vElement, marker.start, marker.end, identity, context, signal);
|
|
546
753
|
};
|
|
547
754
|
let cached = context.moduleCache.get(key);
|
|
548
755
|
if (cached) {
|
|
549
756
|
hydrateWithComponent(cached);
|
|
550
|
-
|
|
757
|
+
complete();
|
|
551
758
|
return;
|
|
552
759
|
}
|
|
553
|
-
getOrStartModuleLoad(key,
|
|
760
|
+
getOrStartModuleLoad(key, identity, marker.id, context)
|
|
554
761
|
.then((component) => {
|
|
555
762
|
if (component) {
|
|
556
763
|
hydrateWithComponent(component);
|
|
557
764
|
}
|
|
558
765
|
})
|
|
559
766
|
.finally(() => {
|
|
560
|
-
|
|
767
|
+
complete();
|
|
561
768
|
});
|
|
562
769
|
}
|
|
563
|
-
function getOrStartModuleLoad(key,
|
|
770
|
+
function getOrStartModuleLoad(key, identity, markerId, context) {
|
|
564
771
|
let inFlight = context.moduleLoads.get(key);
|
|
565
772
|
if (inFlight)
|
|
566
773
|
return inFlight;
|
|
567
774
|
let loadPromise = (async () => {
|
|
568
775
|
try {
|
|
569
|
-
let mod = await context.loadModule(
|
|
570
|
-
if (
|
|
571
|
-
throw new Error(`Export "${
|
|
776
|
+
let mod = await context.loadModule(identity.moduleUrl, identity.exportName);
|
|
777
|
+
if (!isElementFunction(mod)) {
|
|
778
|
+
throw new Error(`Export "${identity.exportName}" from "${identity.moduleUrl}" is not a function`);
|
|
572
779
|
}
|
|
573
780
|
context.moduleCache.set(key, mod);
|
|
574
781
|
return mod;
|
|
@@ -586,8 +793,12 @@ function getOrStartModuleLoad(key, entry, markerId, context) {
|
|
|
586
793
|
}
|
|
587
794
|
function createElement(component, props) {
|
|
588
795
|
let revivedProps = reviveSerializedValue(props);
|
|
796
|
+
invariant(isRecord(revivedProps), 'Expected revived component props to be an object');
|
|
589
797
|
return jsx(component, revivedProps);
|
|
590
798
|
}
|
|
799
|
+
function isElementFunction(value) {
|
|
800
|
+
return typeof value === 'function';
|
|
801
|
+
}
|
|
591
802
|
function reviveSerializedValue(value) {
|
|
592
803
|
if (value === null || value === undefined)
|
|
593
804
|
return value;
|
|
@@ -596,6 +807,8 @@ function reviveSerializedValue(value) {
|
|
|
596
807
|
if (Array.isArray(value)) {
|
|
597
808
|
return value.map((item) => reviveSerializedValue(item));
|
|
598
809
|
}
|
|
810
|
+
if (!isRecord(value))
|
|
811
|
+
return value;
|
|
599
812
|
let record = value;
|
|
600
813
|
if (record.$rmxFrame === true) {
|
|
601
814
|
let props = reviveSerializedObject(record.props);
|
|
@@ -619,15 +832,34 @@ function reviveSerializedObject(value) {
|
|
|
619
832
|
let revived = reviveSerializedValue(value);
|
|
620
833
|
if (!revived || typeof revived !== 'object' || Array.isArray(revived))
|
|
621
834
|
return {};
|
|
622
|
-
return revived;
|
|
835
|
+
return isRecord(revived) ? revived : {};
|
|
836
|
+
}
|
|
837
|
+
function isRecord(value) {
|
|
838
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
623
839
|
}
|
|
624
|
-
function hydrateRegion(vElement, start, end, context) {
|
|
840
|
+
function hydrateRegion(vElement, start, end, identity, context, signal) {
|
|
841
|
+
if (signal?.aborted)
|
|
842
|
+
return;
|
|
625
843
|
context.pendingClientEntries.delete(start);
|
|
626
844
|
// The same marker can be discovered by overlapping hydration passes
|
|
627
845
|
// (for example, document root + nested frame root). Reuse the existing
|
|
628
846
|
// virtual root instead of redefining the marker property.
|
|
629
|
-
|
|
630
|
-
|
|
847
|
+
let owner = getClientEntryBoundaryOwner(start);
|
|
848
|
+
if (owner) {
|
|
849
|
+
if (!signal) {
|
|
850
|
+
owner.root.render(vElement);
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
853
|
+
let frameRuntime = context.frame.$runtime;
|
|
854
|
+
invariant(isFrameRuntime(frameRuntime), 'Expected frame runtime while rendering a preserved client entry');
|
|
855
|
+
let previousServerFrameReload = frameRuntime.serverFrameReload;
|
|
856
|
+
frameRuntime.serverFrameReload = { signal };
|
|
857
|
+
try {
|
|
858
|
+
owner.root.render(vElement);
|
|
859
|
+
}
|
|
860
|
+
finally {
|
|
861
|
+
frameRuntime.serverFrameReload = previousServerFrameReload;
|
|
862
|
+
}
|
|
631
863
|
return;
|
|
632
864
|
}
|
|
633
865
|
let root = createRangeRoot([start, end], {
|
|
@@ -640,7 +872,7 @@ function hydrateRegion(vElement, start, end, context) {
|
|
|
640
872
|
return;
|
|
641
873
|
context.errorTarget.dispatchEvent(createComponentErrorEvent(getComponentError(event)));
|
|
642
874
|
});
|
|
643
|
-
|
|
875
|
+
setClientEntryBoundaryOwner(start, identity, root);
|
|
644
876
|
root.render(vElement);
|
|
645
877
|
}
|
|
646
878
|
async function createSubFrames(nodes, context, options) {
|
|
@@ -675,6 +907,7 @@ async function createSubFrames(nodes, context, options) {
|
|
|
675
907
|
resolveFrame: context.resolveFrame,
|
|
676
908
|
pendingClientEntries: context.pendingClientEntries,
|
|
677
909
|
scheduler: context.scheduler,
|
|
910
|
+
styleManager: context.styleManager,
|
|
678
911
|
data: context.data,
|
|
679
912
|
moduleCache: context.moduleCache,
|
|
680
913
|
moduleLoads: context.moduleLoads,
|
|
@@ -684,7 +917,7 @@ async function createSubFrames(nodes, context, options) {
|
|
|
684
917
|
context.frameInstances.set(node, subFrame);
|
|
685
918
|
}
|
|
686
919
|
}
|
|
687
|
-
i = nodes
|
|
920
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
688
921
|
continue;
|
|
689
922
|
}
|
|
690
923
|
if (node.childNodes && node.childNodes.length > 0) {
|
|
@@ -719,10 +952,9 @@ function isHydrationMarkerLive(marker, context) {
|
|
|
719
952
|
function removeVirtualRoots(nodes) {
|
|
720
953
|
for (let i = 0; i < nodes.length; i++) {
|
|
721
954
|
let node = nodes[i];
|
|
722
|
-
if (
|
|
723
|
-
node.$rmx.dispose();
|
|
955
|
+
if (isCommentNode(node) && isHydrationStart(node) && disposeClientEntryBoundary(node)) {
|
|
724
956
|
let end = findEndMarker(node, isHydrationStart, isHydrationEnd);
|
|
725
|
-
i = nodes
|
|
957
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
726
958
|
continue;
|
|
727
959
|
}
|
|
728
960
|
if (node.childNodes && node.childNodes.length > 0) {
|
|
@@ -740,7 +972,7 @@ function disposeSubFrames(nodes, context) {
|
|
|
740
972
|
subFrame.dispose();
|
|
741
973
|
context.frameInstances.delete(node);
|
|
742
974
|
}
|
|
743
|
-
i = nodes
|
|
975
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
744
976
|
continue;
|
|
745
977
|
}
|
|
746
978
|
if (node.childNodes && node.childNodes.length > 0) {
|
|
@@ -801,7 +1033,9 @@ export function publishFrameTemplate(id, fragment) {
|
|
|
801
1033
|
return;
|
|
802
1034
|
}
|
|
803
1035
|
for (let listener of listeners) {
|
|
804
|
-
|
|
1036
|
+
let clone = fragment.cloneNode(true);
|
|
1037
|
+
invariant(isDocumentFragmentNode(clone), 'Expected cloned frame template fragment');
|
|
1038
|
+
listener(clone);
|
|
805
1039
|
}
|
|
806
1040
|
}
|
|
807
1041
|
export function consumeFrameTemplate(id) {
|
|
@@ -873,12 +1107,21 @@ function extractTemplatesFromBuffer(doc, buffer, onTemplate) {
|
|
|
873
1107
|
remainder: tail.slice(tailStart),
|
|
874
1108
|
};
|
|
875
1109
|
}
|
|
876
|
-
async function renderFrameStream(stream, doc, applyHtml) {
|
|
1110
|
+
async function renderFrameStream(stream, doc, applyHtml, signal) {
|
|
877
1111
|
let reader = stream.getReader();
|
|
878
1112
|
let decoder = new TextDecoder();
|
|
879
1113
|
let buffer = '';
|
|
880
1114
|
let html = '';
|
|
881
1115
|
let appliedOnce = false;
|
|
1116
|
+
let abort = () => {
|
|
1117
|
+
void reader.cancel().catch(() => { });
|
|
1118
|
+
};
|
|
1119
|
+
if (signal?.aborted) {
|
|
1120
|
+
await reader.cancel();
|
|
1121
|
+
reader.releaseLock();
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
882
1125
|
try {
|
|
883
1126
|
while (true) {
|
|
884
1127
|
let { done, value } = await reader.read();
|
|
@@ -913,6 +1156,7 @@ async function renderFrameStream(stream, doc, applyHtml) {
|
|
|
913
1156
|
}
|
|
914
1157
|
}
|
|
915
1158
|
finally {
|
|
1159
|
+
signal?.removeEventListener('abort', abort);
|
|
916
1160
|
reader.releaseLock();
|
|
917
1161
|
}
|
|
918
1162
|
}
|
|
@@ -973,7 +1217,7 @@ function createFragmentFromString(doc, content) {
|
|
|
973
1217
|
}
|
|
974
1218
|
function isRemixNodeFrameContent(content) {
|
|
975
1219
|
return !(content instanceof ReadableStream ||
|
|
976
|
-
content
|
|
1220
|
+
isDocumentFragmentNode(content) ||
|
|
977
1221
|
typeof content === 'string');
|
|
978
1222
|
}
|
|
979
1223
|
function findHydrationMarkers(container) {
|
|
@@ -998,10 +1242,10 @@ function walkCommentsInNodes(nodes, cb) {
|
|
|
998
1242
|
// are discovered and hydrated by the nested frame instance only.
|
|
999
1243
|
if (isFrameStart(node)) {
|
|
1000
1244
|
let end = findEndMarker(node, isFrameStart, isFrameEnd);
|
|
1001
|
-
i = nodes
|
|
1245
|
+
i = findMarkerRangeEndIndex(nodes, end, i);
|
|
1002
1246
|
continue;
|
|
1003
1247
|
}
|
|
1004
|
-
if (node
|
|
1248
|
+
if (isCommentNode(node))
|
|
1005
1249
|
cb(node);
|
|
1006
1250
|
if (node.childNodes && node.childNodes.length > 0) {
|
|
1007
1251
|
walkCommentsInNodes(Array.from(node.childNodes), cb);
|
|
@@ -1014,11 +1258,8 @@ function isHydrationStart(node) {
|
|
|
1014
1258
|
function isHydrationEnd(node) {
|
|
1015
1259
|
return node.data.trim() === '/rmx:h';
|
|
1016
1260
|
}
|
|
1017
|
-
function isHydratedVirtualRootMarker(node) {
|
|
1018
|
-
return node instanceof Comment && '$rmx' in node;
|
|
1019
|
-
}
|
|
1020
1261
|
function isFrameStart(node) {
|
|
1021
|
-
return node
|
|
1262
|
+
return isCommentNode(node) && node.data.trim().startsWith('rmx:f:');
|
|
1022
1263
|
}
|
|
1023
1264
|
function isFrameEnd(node) {
|
|
1024
1265
|
return node.data.trim() === '/rmx:f';
|
|
@@ -1028,11 +1269,15 @@ function getFrameId(start) {
|
|
|
1028
1269
|
invariant(trimmed.startsWith('rmx:f:'), 'Invalid frame start marker');
|
|
1029
1270
|
return trimmed.slice('rmx:f:'.length);
|
|
1030
1271
|
}
|
|
1272
|
+
function findMarkerRangeEndIndex(nodes, end, startIndex) {
|
|
1273
|
+
// The snapshot may not contain an end marker moved by a DOM update.
|
|
1274
|
+
return Math.max(startIndex, nodes.indexOf(end));
|
|
1275
|
+
}
|
|
1031
1276
|
function findEndMarker(start, isStart, isEnd) {
|
|
1032
1277
|
let node = start.nextSibling;
|
|
1033
1278
|
let depth = 1;
|
|
1034
1279
|
while (node) {
|
|
1035
|
-
if (node
|
|
1280
|
+
if (isCommentNode(node)) {
|
|
1036
1281
|
let comment = node;
|
|
1037
1282
|
if (isStart(comment))
|
|
1038
1283
|
depth++;
|
|
@@ -1046,4 +1291,12 @@ function findEndMarker(start, isStart, isEnd) {
|
|
|
1046
1291
|
}
|
|
1047
1292
|
throw new Error('End marker not found');
|
|
1048
1293
|
}
|
|
1294
|
+
function isCommentNode(node) {
|
|
1295
|
+
return node?.nodeType === Node.COMMENT_NODE;
|
|
1296
|
+
}
|
|
1297
|
+
function isDocumentFragmentNode(value) {
|
|
1298
|
+
return (typeof value === 'object' &&
|
|
1299
|
+
value !== null &&
|
|
1300
|
+
Reflect.get(value, 'nodeType') === Node.DOCUMENT_FRAGMENT_NODE);
|
|
1301
|
+
}
|
|
1049
1302
|
//# sourceMappingURL=frame.js.map
|