@remix-run/ui 0.1.0 → 0.1.2
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 +24 -3
- package/dist/animation/animate-layout-mixin.js +66 -66
- package/dist/animation/animate-layout-mixin.js.map +1 -1
- package/dist/components/accordion/accordion.d.ts +3 -3
- package/dist/components/accordion/accordion.js +0 -2
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/accordion/demos/card.demo.d.ts +6 -0
- package/dist/components/accordion/demos/card.demo.js +58 -0
- package/dist/components/accordion/demos/card.demo.js.map +1 -0
- package/dist/components/accordion/demos/multiple.demo.d.ts +6 -0
- package/dist/components/accordion/demos/multiple.demo.js +19 -0
- package/dist/components/accordion/demos/multiple.demo.js.map +1 -0
- package/dist/components/accordion/demos/overview.demo.d.ts +6 -0
- package/dist/components/accordion/demos/overview.demo.js +19 -0
- package/dist/components/accordion/demos/overview.demo.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.js +0 -2
- package/dist/components/breadcrumbs/breadcrumbs.js.map +1 -1
- package/dist/components/breadcrumbs/demos/basic.demo.d.ts +5 -0
- package/dist/components/breadcrumbs/demos/basic.demo.js +14 -0
- package/dist/components/breadcrumbs/demos/basic.demo.js.map +1 -0
- package/dist/components/breadcrumbs/demos/separator.demo.d.ts +5 -0
- package/dist/components/breadcrumbs/demos/separator.demo.js +14 -0
- package/dist/components/breadcrumbs/demos/separator.demo.js.map +1 -0
- package/dist/components/button/button.d.ts +82 -0
- package/dist/components/button/button.js +60 -2
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button/demos/aliases.demo.d.ts +6 -0
- package/dist/components/button/demos/aliases.demo.js +18 -0
- package/dist/components/button/demos/aliases.demo.js.map +1 -0
- package/dist/components/button/demos/basic.demo.d.ts +6 -0
- package/dist/components/button/demos/basic.demo.js +19 -0
- package/dist/components/button/demos/basic.demo.js.map +1 -0
- package/dist/components/button/demos/states.demo.d.ts +6 -0
- package/dist/components/button/demos/states.demo.js +29 -0
- package/dist/components/button/demos/states.demo.js.map +1 -0
- package/dist/components/combobox/combobox.d.ts +3 -3
- package/dist/components/combobox/combobox.js +0 -2
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/combobox/demos/overview.demo.d.ts +6 -0
- package/dist/components/combobox/demos/overview.demo.js +153 -0
- package/dist/components/combobox/demos/overview.demo.js.map +1 -0
- package/dist/components/listbox/demos/overview.demo.d.ts +6 -0
- package/dist/components/listbox/demos/overview.demo.js +64 -0
- package/dist/components/listbox/demos/overview.demo.js.map +1 -0
- package/dist/components/listbox/listbox.d.ts +1 -6
- package/dist/components/listbox/listbox.js +21 -33
- package/dist/components/listbox/listbox.js.map +1 -1
- package/dist/components/menu/demos/bubbling.demo.d.ts +5 -0
- package/dist/components/menu/demos/bubbling.demo.js +15 -0
- package/dist/components/menu/demos/bubbling.demo.js.map +1 -0
- package/dist/components/menu/demos/overview.demo.d.ts +6 -0
- package/dist/components/menu/demos/overview.demo.js +32 -0
- package/dist/components/menu/demos/overview.demo.js.map +1 -0
- package/dist/components/menu/menu.d.ts +5 -14
- package/dist/components/menu/menu.js +23 -38
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/popover/demos/overview.demo.d.ts +6 -0
- package/dist/components/popover/demos/overview.demo.js +64 -0
- package/dist/components/popover/demos/overview.demo.js.map +1 -0
- package/dist/components/select/demos/deconstructed.demo.d.ts +6 -0
- package/dist/components/select/demos/deconstructed.demo.js +53 -0
- package/dist/components/select/demos/deconstructed.demo.js.map +1 -0
- package/dist/components/select/demos/overview.demo.d.ts +5 -0
- package/dist/components/select/demos/overview.demo.js +27 -0
- package/dist/components/select/demos/overview.demo.js.map +1 -0
- package/dist/components/select/select.d.ts +3 -3
- package/dist/components/select/select.js +17 -26
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/tabs/tabs.d.ts +3 -3
- package/dist/components/tabs/tabs.js +0 -2
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/component.d.ts +8 -5
- package/dist/runtime/component.js +84 -80
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/core/attributes.d.ts +12 -0
- package/dist/runtime/core/attributes.js +85 -0
- package/dist/runtime/core/attributes.js.map +1 -0
- package/dist/runtime/core/children.d.ts +7 -0
- package/dist/runtime/core/children.js +30 -0
- package/dist/runtime/core/children.js.map +1 -0
- package/dist/runtime/core/props.d.ts +9 -0
- package/dist/runtime/core/props.js +169 -0
- package/dist/runtime/core/props.js.map +1 -0
- package/dist/runtime/core/vnode.d.ts +3 -0
- package/dist/runtime/core/vnode.js +39 -0
- package/dist/runtime/core/vnode.js.map +1 -0
- package/dist/runtime/create-element.js +2 -1
- package/dist/runtime/create-element.js.map +1 -1
- package/dist/runtime/diff-dom.js +47 -14
- package/dist/runtime/diff-dom.js.map +1 -1
- package/dist/runtime/diff-props.d.ts +1 -2
- package/dist/runtime/diff-props.js +2 -181
- package/dist/runtime/diff-props.js.map +1 -1
- package/dist/runtime/dom.d.ts +4 -0
- package/dist/runtime/frame.d.ts +23 -2
- package/dist/runtime/frame.js +51 -52
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/jsx.js +2 -27
- package/dist/runtime/jsx.js.map +1 -1
- package/dist/runtime/mixins/mixin.js +9 -4
- package/dist/runtime/mixins/mixin.js.map +1 -1
- package/dist/runtime/mixins/on-mixin.d.ts +15 -4
- package/dist/runtime/mixins/on-mixin.js +9 -2
- package/dist/runtime/mixins/on-mixin.js.map +1 -1
- package/dist/runtime/navigation.d.ts +6 -0
- package/dist/runtime/navigation.js +16 -3
- package/dist/runtime/navigation.js.map +1 -1
- package/dist/runtime/reconcile.js +444 -181
- package/dist/runtime/reconcile.js.map +1 -1
- package/dist/runtime/run.d.ts +17 -2
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/scheduler.js +10 -0
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/stream-protocol.d.ts +8 -0
- package/dist/runtime/stream-protocol.js +20 -0
- package/dist/runtime/stream-protocol.js.map +1 -0
- package/dist/runtime/to-vnode.js +17 -18
- package/dist/runtime/to-vnode.js.map +1 -1
- package/dist/runtime/vnode.d.ts +5 -4
- package/dist/runtime/vnode.js +2 -3
- package/dist/runtime/vnode.js.map +1 -1
- package/dist/server/stream.js +80 -106
- package/dist/server/stream.js.map +1 -1
- package/dist/style/layers.d.ts +2 -0
- package/dist/style/layers.js +3 -0
- package/dist/style/layers.js.map +1 -0
- package/dist/style/stylesheet.d.ts +3 -1
- package/dist/style/stylesheet.js +69 -8
- package/dist/style/stylesheet.js.map +1 -1
- package/dist/theme/glyph-contract.d.ts +1 -1
- package/dist/theme/runtime.js +4 -1
- package/dist/theme/runtime.js.map +1 -1
- package/package.json +6 -7
- package/src/animation/README.md +314 -0
- package/src/animation/animate-layout-mixin.ts +79 -71
- package/src/components/accordion/README.md +166 -0
- package/src/components/accordion/accordion.tsx +8 -10
- package/src/components/accordion/demos/card.demo.tsx +113 -0
- package/src/components/accordion/demos/multiple.demo.tsx +56 -0
- package/src/components/accordion/demos/overview.demo.tsx +56 -0
- package/src/components/anchor/README.md +153 -0
- package/src/components/breadcrumbs/README.md +55 -0
- package/src/components/breadcrumbs/breadcrumbs.tsx +0 -2
- package/src/components/breadcrumbs/demos/basic.demo.tsx +17 -0
- package/src/components/breadcrumbs/demos/separator.demo.tsx +18 -0
- package/src/components/button/README.md +4 -4
- package/src/components/button/button.tsx +88 -2
- package/src/components/button/demos/aliases.demo.tsx +27 -0
- package/src/components/button/demos/basic.demo.tsx +30 -0
- package/src/components/button/demos/states.demo.tsx +52 -0
- package/src/components/combobox/combobox.tsx +8 -10
- package/src/components/combobox/demos/overview.demo.tsx +199 -0
- package/src/components/glyph/README.md +72 -0
- package/src/components/listbox/README.md +115 -0
- package/src/components/listbox/demos/overview.demo.tsx +101 -0
- package/src/components/listbox/listbox.ts +23 -32
- package/src/components/menu/README.md +96 -0
- package/src/components/menu/demos/bubbling.demo.tsx +34 -0
- package/src/components/menu/demos/overview.demo.tsx +76 -0
- package/src/components/menu/menu.tsx +35 -41
- package/src/components/popover/README.md +3 -3
- package/src/components/popover/demos/overview.demo.tsx +143 -0
- package/src/components/select/README.md +107 -0
- package/src/components/select/demos/deconstructed.demo.tsx +95 -0
- package/src/components/select/demos/overview.demo.tsx +51 -0
- package/src/components/select/select.tsx +28 -28
- package/src/components/tabs/tabs.tsx +10 -5
- package/src/index.ts +1 -1
- package/src/runtime/component.ts +94 -82
- package/src/runtime/core/attributes.ts +97 -0
- package/src/runtime/core/children.ts +42 -0
- package/src/runtime/core/props.ts +185 -0
- package/src/runtime/core/vnode.ts +48 -0
- package/src/runtime/create-element.ts +2 -1
- package/src/runtime/diff-dom.ts +59 -12
- package/src/runtime/diff-props.ts +2 -187
- package/src/runtime/dom.ts +4 -0
- package/src/runtime/frame.ts +84 -61
- package/src/runtime/jsx.ts +2 -30
- package/src/runtime/mixins/mixin.ts +9 -4
- package/src/runtime/mixins/on-mixin.ts +20 -12
- package/src/runtime/navigation.ts +24 -3
- package/src/runtime/reconcile.ts +552 -186
- package/src/runtime/run.ts +17 -1
- package/src/runtime/scheduler.ts +7 -0
- package/src/runtime/stream-protocol.ts +27 -0
- package/src/runtime/to-vnode.ts +15 -17
- package/src/runtime/vnode.ts +6 -9
- package/src/server/README.md +88 -0
- package/src/server/stream.ts +105 -117
- package/src/style/layers.ts +2 -0
- package/src/style/stylesheet.ts +75 -10
- package/src/test/README.md +107 -0
- package/src/test/utils.ts +3 -1
- package/src/theme/README.md +103 -0
- package/src/theme/runtime.ts +4 -1
- package/src/utils/scroll-lock/README.md +33 -0
- package/src/test/setup.ts +0 -7
|
@@ -598,7 +598,6 @@ class MixinHandleImpl
|
|
|
598
598
|
this.#activeScope = scope
|
|
599
599
|
if (!scope) return
|
|
600
600
|
if (this.#scopeTargets.has(scope)) return
|
|
601
|
-
this.#scopeSignals.set(scope, new AbortController())
|
|
602
601
|
this.#scopeTargets.set(scope, new TypedEventTarget<MixinHandleEventMap<Element>>())
|
|
603
602
|
this.#scopePhaseCounts.set(scope, { beforeUpdate: 0, commit: 0 })
|
|
604
603
|
}
|
|
@@ -616,8 +615,11 @@ class MixinHandleImpl
|
|
|
616
615
|
this.#decrementGlobalPhaseCount('beforeUpdate', scopePhaseCounts.beforeUpdate)
|
|
617
616
|
this.#decrementGlobalPhaseCount('commit', scopePhaseCounts.commit)
|
|
618
617
|
}
|
|
619
|
-
this.#scopeSignals.get(scope)
|
|
620
|
-
|
|
618
|
+
let controller = this.#scopeSignals.get(scope)
|
|
619
|
+
if (controller) {
|
|
620
|
+
controller.abort()
|
|
621
|
+
this.#scopeSignals.delete(scope)
|
|
622
|
+
}
|
|
621
623
|
this.#scopePhaseCounts.delete(scope)
|
|
622
624
|
this.#scopeTargets.delete(scope)
|
|
623
625
|
if (this.#activeScope === scope) {
|
|
@@ -646,7 +648,10 @@ class MixinHandleImpl
|
|
|
646
648
|
|
|
647
649
|
#getScopeSignal(scope: symbol) {
|
|
648
650
|
let controller = this.#scopeSignals.get(scope)
|
|
649
|
-
|
|
651
|
+
if (!controller) {
|
|
652
|
+
controller = new AbortController()
|
|
653
|
+
this.#scopeSignals.set(scope, controller)
|
|
654
|
+
}
|
|
650
655
|
return controller.signal
|
|
651
656
|
}
|
|
652
657
|
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { createMixin } from './mixin.ts'
|
|
1
|
+
import { createMixin, type MixinType } from './mixin.ts'
|
|
2
2
|
import type { ElementProps } from '../jsx.ts'
|
|
3
3
|
import type { MixinDescriptor } from './mixin.ts'
|
|
4
|
-
import type {
|
|
5
|
-
EventType as AddEventType,
|
|
6
|
-
ListenerFor as AddEventListenerFor,
|
|
7
|
-
} from '../event-listeners.ts'
|
|
8
|
-
|
|
9
|
-
export type { Dispatched } from '../event-listeners.ts'
|
|
4
|
+
import type { EnsureEvent, EventMap } from '../event-listeners.ts'
|
|
10
5
|
|
|
11
6
|
type SignaledListener<event extends Event> = (
|
|
12
7
|
event: event,
|
|
13
8
|
signal: AbortSignal,
|
|
14
9
|
) => void | Promise<void>
|
|
15
10
|
|
|
16
|
-
type EventType<target extends Element> =
|
|
11
|
+
type EventType<target extends Element> = string & keyof EventMap<target>
|
|
12
|
+
|
|
17
13
|
type ListenerFor<target extends Element, type extends EventType<target>> = SignaledListener<
|
|
18
|
-
|
|
14
|
+
EnsureEvent<EventMap<target>[type], target>
|
|
19
15
|
>
|
|
16
|
+
export type OnMixinDescriptor = {
|
|
17
|
+
type: typeof onMixinType
|
|
18
|
+
args: [type: string, handler: SignaledListener<Event>, captureBoolean?: boolean]
|
|
19
|
+
}
|
|
20
20
|
|
|
21
|
-
const
|
|
21
|
+
const onMixinType: MixinType<
|
|
22
22
|
Element,
|
|
23
23
|
[type: string, handler: SignaledListener<Event>, captureBoolean?: boolean],
|
|
24
24
|
ElementProps
|
|
25
|
-
>(
|
|
25
|
+
> = (handle) => {
|
|
26
26
|
let currentHandler: SignaledListener<Event> = () => {}
|
|
27
27
|
let currentType = ''
|
|
28
28
|
let currentCapture = false
|
|
@@ -61,7 +61,15 @@ const onMixin = createMixin<
|
|
|
61
61
|
|
|
62
62
|
return handle.element
|
|
63
63
|
}
|
|
64
|
-
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const onMixin = createMixin(onMixinType)
|
|
67
|
+
|
|
68
|
+
export function isOnMixinDescriptor(descriptor: unknown): descriptor is OnMixinDescriptor {
|
|
69
|
+
if (!descriptor || typeof descriptor !== 'object') return false
|
|
70
|
+
let candidate = descriptor as { type?: unknown; args?: unknown }
|
|
71
|
+
return candidate.type === onMixinType && Array.isArray(candidate.args)
|
|
72
|
+
}
|
|
65
73
|
|
|
66
74
|
/**
|
|
67
75
|
* Attaches a typed DOM event handler through the mixin system.
|
|
@@ -42,8 +42,20 @@ export async function navigate(href: string, options?: NavigationOptions) {
|
|
|
42
42
|
* Starts listening for Navigation API transitions and routes them through frame reloads.
|
|
43
43
|
*
|
|
44
44
|
* @param signal Abort signal used to remove the listener.
|
|
45
|
+
* @returns void
|
|
45
46
|
*/
|
|
46
47
|
export function startNavigationListener(signal: AbortSignal) {
|
|
48
|
+
return startNavigationListenerImpl(signal, { getTopFrame, getNamedFrame })
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Internal version used by unit tests so we can inject stub frames
|
|
52
|
+
export function startNavigationListenerImpl(
|
|
53
|
+
signal: AbortSignal,
|
|
54
|
+
options: {
|
|
55
|
+
getTopFrame: typeof getTopFrame
|
|
56
|
+
getNamedFrame: typeof getNamedFrame
|
|
57
|
+
},
|
|
58
|
+
) {
|
|
47
59
|
let navigation = window.navigation
|
|
48
60
|
|
|
49
61
|
navigation.updateCurrentEntry({
|
|
@@ -53,13 +65,17 @@ export function startNavigationListener(signal: AbortSignal) {
|
|
|
53
65
|
navigation.addEventListener(
|
|
54
66
|
'navigate',
|
|
55
67
|
(event) => {
|
|
56
|
-
|
|
68
|
+
// Safari seems to incorrectly set canIntercept to true for sub-domain navigations, so
|
|
69
|
+
// we do a host check ourselves/. The spec is clear that a different host should prevent
|
|
70
|
+
// interception so this is likely a bug in Safari:
|
|
71
|
+
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#can-have-its-url-rewritten
|
|
72
|
+
if (!event.canIntercept || isCrossOriginDestination(event)) return
|
|
57
73
|
|
|
58
74
|
let state = getRuntimeNavigationState(event)
|
|
59
75
|
if (!state) return
|
|
60
76
|
|
|
61
|
-
let topFrame = getTopFrame()
|
|
62
|
-
let namedFrame = state.target ? getNamedFrame(state.target) : undefined
|
|
77
|
+
let topFrame = options.getTopFrame()
|
|
78
|
+
let namedFrame = state.target ? options.getNamedFrame(state.target) : undefined
|
|
63
79
|
let frame = namedFrame ?? topFrame
|
|
64
80
|
|
|
65
81
|
event.intercept({
|
|
@@ -86,6 +102,11 @@ function isRuntimeNavigation(info: unknown): info is NavigationState {
|
|
|
86
102
|
return typeof info === 'object' && info != null && '$rmx' in info
|
|
87
103
|
}
|
|
88
104
|
|
|
105
|
+
function isCrossOriginDestination(event: NavigateEvent): boolean {
|
|
106
|
+
let destination = new URL(event.destination.url)
|
|
107
|
+
return destination.origin !== window.location.origin
|
|
108
|
+
}
|
|
109
|
+
|
|
89
110
|
function getRuntimeNavigationState(event: NavigateEvent): NavigationState | undefined {
|
|
90
111
|
if (event.navigationType === 'traverse') {
|
|
91
112
|
return getTraverseNavigationState(event)
|