@askrjs/askr 0.0.52 → 0.0.54
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 +5 -1
- package/dist/{runtime/scheduler.js → access-Bg4RJNC8.js} +182 -9
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.js +103 -0
- package/dist/{common/attr-names.js → attr-names-CjhzmHOn.js} +1 -1
- package/dist/benchmark.d.ts +6 -2
- package/dist/benchmark.js +63 -11
- package/dist/boot/index.d.ts +61 -2
- package/dist/boot/index.js +1 -203
- package/dist/boot-2ZR3MtO0.js +647 -0
- package/dist/cleanup-DScKZG2i.js +487 -0
- package/dist/component-internal-D9PLuFUc.js +614 -0
- package/dist/component-lifecycle-C7lnU9Bt.js +359 -0
- package/dist/{runtime/component-scope.js → component-scope-CC3cojX9.js} +8 -1
- package/dist/component-scope-CvPba6O6.d.ts +12 -0
- package/dist/components/index.d.ts +17 -2
- package/dist/components/index.js +39 -1
- package/dist/compose-ref-Cc_YkUpM.js +92 -0
- package/dist/{foundations/utilities/compose-ref.d.ts → compose-ref-Cizq72-x.d.ts} +1 -1
- package/dist/control/index.d.ts +1 -3
- package/dist/control/index.js +1 -3
- package/dist/control-BI4RMD2z.d.ts +437 -0
- package/dist/control-Bf4Wkdvv.d.ts +9 -0
- package/dist/{common/control.js → control-DhFRTIoE.js} +1 -1
- package/dist/control-mXROCjL3.js +165 -0
- package/dist/data/index.d.ts +2 -6
- package/dist/data/index.js +4 -5
- package/dist/data-B9dauyDn.js +559 -0
- package/dist/{data/data-runtime.js → data-runtime-SJ1BSUvk.js} +32 -31
- package/dist/deferred-DklLG4qM.js +386 -0
- package/dist/{runtime/effect.js → effect-BwnIvLah.js} +4 -4
- package/dist/fastlane-Dw8SOBr9.js +343 -0
- package/dist/for-internal-CSz8Unkq.js +1563 -0
- package/dist/foundations/icon/index.d.ts +68 -2
- package/dist/foundations/icon/index.js +85 -1
- package/dist/foundations/index.d.ts +2 -5
- package/dist/foundations/index.js +2 -5
- package/dist/foundations/interactions/index.d.ts +264 -6
- package/dist/foundations/interactions/index.js +1 -6
- package/dist/foundations/state/index.d.ts +32 -1
- package/dist/foundations/state/index.js +78 -1
- package/dist/foundations/structures/index.d.ts +2 -7
- package/dist/foundations/structures/index.js +2 -7
- package/dist/foundations/utilities/index.d.ts +2 -6
- package/dist/foundations/utilities/index.js +2 -5
- package/dist/fx/index.d.ts +190 -3
- package/dist/fx/index.js +454 -4
- package/dist/index-B1LNotpU.d.ts +239 -0
- package/dist/index-Bki2rqcr.d.ts +233 -0
- package/dist/index-BnU0NPwM.d.ts +101 -0
- package/dist/index-C8iW3xCt.d.ts +44 -0
- package/dist/index-DwxdIA-t.d.ts +48 -0
- package/dist/{runtime/runtime.d.ts → index-Zb31mCiU.d.ts} +31 -8
- package/dist/index.d.ts +8 -13
- package/dist/index.js +150 -15
- package/dist/interactions-w7gQN4ha.js +280 -0
- package/dist/{data/invalidation-listeners.js → invalidation-listeners-Des3AHYs.js} +1 -1
- package/dist/{common/props.d.ts → jsx-CP0gmYwJ.d.ts} +17 -5
- package/dist/{common/jsx.js → jsx-CUpRxrLH.js} +1 -1
- package/dist/jsx-dev-runtime.d.ts +2 -4
- package/dist/jsx-dev-runtime.js +7 -5
- package/dist/jsx-runtime-92bV2hSa.d.ts +34 -0
- package/dist/jsx-runtime-BVVgDSdq.d.ts +1 -0
- package/dist/jsx-runtime.d.ts +2 -35
- package/dist/jsx-runtime.js +11 -5
- package/dist/{runtime/lifecycle-operations.js → lifecycle-operations-CdRjdsHo.js} +4 -5
- package/dist/navigate-BVDCzOuB.d.ts +34 -0
- package/dist/navigate-D17eVQyI.js +1449 -0
- package/dist/{runtime/portal.js → portal-C47xkwXj.js} +71 -41
- package/dist/query-registry-CQIT4mXr.js +73 -0
- package/dist/{common/render-context.js → render-context-Clw3rFiO.js} +14 -6
- package/dist/renderer-DrLRAD5y.js +6266 -0
- package/dist/{runtime/resource-operation.js → resource-operation-BNY29MVH.js} +118 -15
- package/dist/resources/index.d.ts +42 -3
- package/dist/resources/index.js +3 -4
- package/dist/{common/route-activity.js → route-activity-CNJfpwx-.js} +1 -1
- package/dist/route-matching-vJpvLVbX.js +515 -0
- package/dist/router/index.d.ts +166 -14
- package/dist/router/index.js +150 -12
- package/dist/{common/router.d.ts → router-DCfwLBr-.d.ts} +72 -28
- package/dist/{common/router-internal.js → router-internal-BC0w1_xk.js} +1 -1
- package/dist/{runtime/scheduler.d.ts → scheduler-CmLO4Dfm.d.ts} +1 -3
- package/dist/{runtime/selector.js → selector-DafVYzV4.js} +34 -11
- package/dist/{runtime/snapshot-source.js → snapshot-source-BB42xgwb.js} +1 -1
- package/dist/ssg/index.d.ts +252 -4
- package/dist/ssg/index.js +857 -1
- package/dist/ssr/index.d.ts +225 -8
- package/dist/ssr/index.js +3 -6
- package/dist/{common/ssr.js → ssr-CbQO5xd3.js} +1 -1
- package/dist/ssr-DEARZxJ5.js +1413 -0
- package/dist/{runtime/state.js → state-DPl8lffD.js} +3 -5
- package/dist/structures-DUB3HchX.js +221 -0
- package/dist/testing/index.d.ts +3 -2
- package/dist/testing/index.js +2 -5
- package/dist/{jsx/types.d.ts → types-DnQVG4ZY.d.ts} +2 -5
- package/dist/{foundations/utilities/use-id.js → utilities-C_CGX4Dz.js} +1 -1
- package/dist/{ssr/verify-hydration.js → verify-hydration-BWwu-mWu.js} +2 -2
- package/dist/{common/vnode.js → vnode-CGMJYPMB.js} +2 -2
- package/package.json +12 -7
- package/dist/bench/components/benchmark-row.d.ts +0 -20
- package/dist/bench/components/benchmark-row.js +0 -40
- package/dist/bench/components/benchmark-table.js +0 -23
- package/dist/bin/askr-ssg.d.ts +0 -27
- package/dist/bin/askr-ssg.js +0 -186
- package/dist/boot/hydration.js +0 -139
- package/dist/boot/root-lifecycle.d.ts +0 -18
- package/dist/boot/root-lifecycle.js +0 -209
- package/dist/boot/route-startup.js +0 -54
- package/dist/boot/types.d.ts +0 -61
- package/dist/common/component.d.ts +0 -18
- package/dist/common/control.d.ts +0 -12
- package/dist/common/dom-range.d.ts +0 -13
- package/dist/common/env.js +0 -41
- package/dist/common/error-boundary.d.ts +0 -15
- package/dist/common/invariant.js +0 -15
- package/dist/common/jsx.d.ts +0 -22
- package/dist/common/logger.js +0 -34
- package/dist/common/promise.js +0 -6
- package/dist/common/ssr-errors.d.ts +0 -10
- package/dist/common/ssr-errors.js +0 -14
- package/dist/common/ssr.d.ts +0 -41
- package/dist/common/vnode.d.ts +0 -21
- package/dist/components/error-boundary.d.ts +0 -14
- package/dist/components/error-boundary.js +0 -41
- package/dist/components/link.d.ts +0 -68
- package/dist/components/link.js +0 -74
- package/dist/control/case.d.ts +0 -18
- package/dist/control/case.js +0 -68
- package/dist/control/for.d.ts +0 -23
- package/dist/control/for.js +0 -61
- package/dist/control/shared.d.ts +0 -8
- package/dist/control/shared.js +0 -18
- package/dist/control/show.d.ts +0 -14
- package/dist/control/show.js +0 -32
- package/dist/data/data-runtime.d.ts +0 -27
- package/dist/data/invalidation.d.ts +0 -8
- package/dist/data/invalidation.js +0 -25
- package/dist/data/mutation-cell.d.ts +0 -27
- package/dist/data/mutation-cell.js +0 -133
- package/dist/data/query-cell.d.ts +0 -47
- package/dist/data/query-cell.js +0 -324
- package/dist/data/query-key.js +0 -40
- package/dist/data/shared.js +0 -20
- package/dist/data/testing.js +0 -2
- package/dist/data/types.d.ts +0 -160
- package/dist/foundations/icon/icon.d.ts +0 -52
- package/dist/foundations/icon/icon.js +0 -86
- package/dist/foundations/icon/icon.types.d.ts +0 -21
- package/dist/foundations/interactions/dismissable.d.ts +0 -71
- package/dist/foundations/interactions/dismissable.js +0 -24
- package/dist/foundations/interactions/focusable.d.ts +0 -21
- package/dist/foundations/interactions/focusable.js +0 -16
- package/dist/foundations/interactions/hoverable.d.ts +0 -25
- package/dist/foundations/interactions/hoverable.js +0 -13
- package/dist/foundations/interactions/interaction-policy.d.ts +0 -49
- package/dist/foundations/interactions/interaction-policy.js +0 -120
- package/dist/foundations/interactions/pressable.d.ts +0 -60
- package/dist/foundations/interactions/pressable.js +0 -49
- package/dist/foundations/interactions/roving-focus.d.ts +0 -51
- package/dist/foundations/interactions/roving-focus.js +0 -69
- package/dist/foundations/state/controllable.d.ts +0 -32
- package/dist/foundations/state/controllable.js +0 -80
- package/dist/foundations/structures/collection.d.ts +0 -51
- package/dist/foundations/structures/collection.js +0 -49
- package/dist/foundations/structures/layer.d.ts +0 -80
- package/dist/foundations/structures/layer.js +0 -79
- package/dist/foundations/structures/layout.d.ts +0 -32
- package/dist/foundations/structures/layout.js +0 -11
- package/dist/foundations/structures/portal.d.ts +0 -2
- package/dist/foundations/structures/portal.js +0 -3
- package/dist/foundations/structures/presence.d.ts +0 -36
- package/dist/foundations/structures/presence.js +0 -37
- package/dist/foundations/structures/slot.d.ts +0 -34
- package/dist/foundations/structures/slot.js +0 -39
- package/dist/foundations/utilities/aria.d.ts +0 -15
- package/dist/foundations/utilities/aria.js +0 -15
- package/dist/foundations/utilities/compose-handlers.d.ts +0 -36
- package/dist/foundations/utilities/compose-handlers.js +0 -18
- package/dist/foundations/utilities/compose-ref.js +0 -16
- package/dist/foundations/utilities/event-types.d.ts +0 -19
- package/dist/foundations/utilities/merge-props.d.ts +0 -4
- package/dist/foundations/utilities/merge-props.js +0 -47
- package/dist/foundations/utilities/use-id.d.ts +0 -31
- package/dist/fx/fx.d.ts +0 -32
- package/dist/fx/fx.js +0 -211
- package/dist/fx/noop.js +0 -7
- package/dist/fx/timing.d.ts +0 -158
- package/dist/fx/timing.js +0 -241
- package/dist/jsx/index.d.ts +0 -2
- package/dist/jsx/index.js +0 -4
- package/dist/jsx/types.js +0 -2
- package/dist/jsx/utils.d.ts +0 -4
- package/dist/jsx/utils.js +0 -17
- package/dist/jsx-runtime2.d.ts +0 -3
- package/dist/jsx-runtime2.js +0 -4
- package/dist/renderer/attributes.js +0 -254
- package/dist/renderer/boundaries.js +0 -142
- package/dist/renderer/boundary-materialization.js +0 -72
- package/dist/renderer/boundary-range-adoption.js +0 -76
- package/dist/renderer/boundary-range-sync.js +0 -101
- package/dist/renderer/boundary-state.js +0 -50
- package/dist/renderer/child-shape.js +0 -83
- package/dist/renderer/children-fastpath.js +0 -149
- package/dist/renderer/children.js +0 -158
- package/dist/renderer/cleanup.js +0 -267
- package/dist/renderer/component-host-cleanup.js +0 -143
- package/dist/renderer/component-host-instances.js +0 -116
- package/dist/renderer/component-host-replacement.js +0 -105
- package/dist/renderer/component-host-results.js +0 -138
- package/dist/renderer/component-host.js +0 -172
- package/dist/renderer/dom-host.js +0 -11
- package/dist/renderer/dom-internal.js +0 -243
- package/dist/renderer/dom-range.js +0 -161
- package/dist/renderer/dom.js +0 -11
- package/dist/renderer/element-children.js +0 -359
- package/dist/renderer/env.js +0 -2
- package/dist/renderer/error-boundary-dom.js +0 -86
- package/dist/renderer/evaluate-dom-range.js +0 -84
- package/dist/renderer/evaluate-reconcile.js +0 -257
- package/dist/renderer/evaluate.js +0 -95
- package/dist/renderer/fastpath.js +0 -142
- package/dist/renderer/for-commit-dom-map.js +0 -71
- package/dist/renderer/for-commit-removal.js +0 -27
- package/dist/renderer/for-commit-reorder.js +0 -87
- package/dist/renderer/for-commit.js +0 -442
- package/dist/renderer/hydration-boundaries.js +0 -60
- package/dist/renderer/hydration-listener-transaction.js +0 -49
- package/dist/renderer/index.js +0 -39
- package/dist/renderer/intrinsic-blueprint-analysis.js +0 -202
- package/dist/renderer/intrinsic-blueprint-bindings.js +0 -152
- package/dist/renderer/intrinsic-blueprint-materialization.js +0 -100
- package/dist/renderer/intrinsic-blueprint.js +0 -30
- package/dist/renderer/intrinsic-hydration-adoption.js +0 -66
- package/dist/renderer/keyed-children.js +0 -26
- package/dist/renderer/keyed.js +0 -167
- package/dist/renderer/namespaces.js +0 -21
- package/dist/renderer/prop-bindings.js +0 -315
- package/dist/renderer/reactive-child-dom.js +0 -139
- package/dist/renderer/reactive-child-sources.js +0 -182
- package/dist/renderer/reactive-children.js +0 -303
- package/dist/renderer/reconcile-commit.js +0 -36
- package/dist/renderer/reconcile-fastpaths.js +0 -100
- package/dist/renderer/reconcile-resolution.js +0 -163
- package/dist/renderer/reconcile.js +0 -37
- package/dist/renderer/retained-element-rollback.js +0 -288
- package/dist/renderer/stable-patch.js +0 -80
- package/dist/renderer/static-reuse.js +0 -94
- package/dist/renderer/types.js +0 -2
- package/dist/renderer/utils.js +0 -265
- package/dist/router/access.js +0 -34
- package/dist/router/activity.d.ts +0 -9
- package/dist/router/activity.js +0 -85
- package/dist/router/authoring.d.ts +0 -21
- package/dist/router/authoring.js +0 -196
- package/dist/router/internal-types.d.ts +0 -30
- package/dist/router/lazy.d.ts +0 -18
- package/dist/router/lazy.js +0 -50
- package/dist/router/manifest.d.ts +0 -9
- package/dist/router/manifest.js +0 -47
- package/dist/router/match.js +0 -120
- package/dist/router/navigate.d.ts +0 -10
- package/dist/router/navigate.js +0 -73
- package/dist/router/navigation-registry.d.ts +0 -31
- package/dist/router/navigation-registry.js +0 -103
- package/dist/router/navigation-scroll.d.ts +0 -13
- package/dist/router/navigation-scroll.js +0 -91
- package/dist/router/navigation-targets.d.ts +0 -30
- package/dist/router/navigation-targets.js +0 -634
- package/dist/router/policy.d.ts +0 -27
- package/dist/router/policy.js +0 -130
- package/dist/router/rendering.d.ts +0 -9
- package/dist/router/rendering.js +0 -47
- package/dist/router/resolution.d.ts +0 -3
- package/dist/router/resolution.js +0 -84
- package/dist/router/route-context.js +0 -77
- package/dist/router/route-matching.d.ts +0 -19
- package/dist/router/route-matching.js +0 -173
- package/dist/router/route-query.d.ts +0 -16
- package/dist/router/route-query.js +0 -45
- package/dist/router/route.d.ts +0 -8
- package/dist/router/route.js +0 -10
- package/dist/router/store.d.ts +0 -49
- package/dist/router/store.js +0 -169
- package/dist/router/testing.js +0 -4
- package/dist/runtime/access.d.ts +0 -19
- package/dist/runtime/access.js +0 -43
- package/dist/runtime/child-scope.d.ts +0 -41
- package/dist/runtime/child-scope.js +0 -134
- package/dist/runtime/component-cleanup.d.ts +0 -15
- package/dist/runtime/component-cleanup.js +0 -68
- package/dist/runtime/component-commit.js +0 -167
- package/dist/runtime/component-facade.d.ts +0 -5
- package/dist/runtime/component-facade.js +0 -6
- package/dist/runtime/component-internal.d.ts +0 -105
- package/dist/runtime/component-internal.js +0 -237
- package/dist/runtime/component-lifecycle.d.ts +0 -10
- package/dist/runtime/component-lifecycle.js +0 -33
- package/dist/runtime/component-scope.d.ts +0 -54
- package/dist/runtime/component.d.ts +0 -5
- package/dist/runtime/component.js +0 -6
- package/dist/runtime/context.d.ts +0 -72
- package/dist/runtime/context.js +0 -236
- package/dist/runtime/control.d.ts +0 -62
- package/dist/runtime/control.js +0 -239
- package/dist/runtime/derive.d.ts +0 -16
- package/dist/runtime/derive.js +0 -140
- package/dist/runtime/dev-namespace.d.ts +0 -30
- package/dist/runtime/dev-namespace.js +0 -64
- package/dist/runtime/effect.d.ts +0 -35
- package/dist/runtime/error-boundary.d.ts +0 -4
- package/dist/runtime/error-boundary.js +0 -29
- package/dist/runtime/events.d.ts +0 -58
- package/dist/runtime/events.js +0 -201
- package/dist/runtime/execution-model.d.ts +0 -6
- package/dist/runtime/execution-model.js +0 -13
- package/dist/runtime/fastlane.d.ts +0 -33
- package/dist/runtime/fastlane.js +0 -173
- package/dist/runtime/for-bench.d.ts +0 -40
- package/dist/runtime/for-bench.js +0 -13
- package/dist/runtime/for-internal.d.ts +0 -106
- package/dist/runtime/for-internal.js +0 -285
- package/dist/runtime/for-reconcile.d.ts +0 -7
- package/dist/runtime/for-reconcile.js +0 -442
- package/dist/runtime/for-scopes.d.ts +0 -26
- package/dist/runtime/for-scopes.js +0 -280
- package/dist/runtime/for-signals.d.ts +0 -39
- package/dist/runtime/for-signals.js +0 -213
- package/dist/runtime/for-types.d.ts +0 -8
- package/dist/runtime/for.d.ts +0 -4
- package/dist/runtime/for.js +0 -5
- package/dist/runtime/index.d.ts +0 -24
- package/dist/runtime/index.js +0 -33
- package/dist/runtime/lifecycle-batch.d.ts +0 -59
- package/dist/runtime/lifecycle-batch.js +0 -178
- package/dist/runtime/lifecycle-operation-settlement.d.ts +0 -5
- package/dist/runtime/lifecycle-operation-settlement.js +0 -51
- package/dist/runtime/lifecycle-operations.d.ts +0 -30
- package/dist/runtime/operations.d.ts +0 -3
- package/dist/runtime/operations.js +0 -3
- package/dist/runtime/perf-metrics.d.ts +0 -27
- package/dist/runtime/perf-metrics.js +0 -6
- package/dist/runtime/portal.d.ts +0 -21
- package/dist/runtime/readable.d.ts +0 -34
- package/dist/runtime/readable.js +0 -183
- package/dist/runtime/resource-cell.js +0 -112
- package/dist/runtime/resource-operation.d.ts +0 -12
- package/dist/runtime/runtime.js +0 -57
- package/dist/runtime/selector-store.js +0 -22
- package/dist/runtime/selector.d.ts +0 -10
- package/dist/runtime/snapshot-source.d.ts +0 -9
- package/dist/runtime/state.d.ts +0 -54
- package/dist/ssg/batch-render.js +0 -101
- package/dist/ssg/create-static-gen.d.ts +0 -66
- package/dist/ssg/create-static-gen.js +0 -250
- package/dist/ssg/generate-metadata.js +0 -92
- package/dist/ssg/generation-plan.js +0 -68
- package/dist/ssg/incremental-manifest.js +0 -54
- package/dist/ssg/resolve-ssg-data.js +0 -103
- package/dist/ssg/route-utils.js +0 -22
- package/dist/ssg/static-routes.js +0 -100
- package/dist/ssg/types.d.ts +0 -188
- package/dist/ssg/write-static-files.js +0 -77
- package/dist/ssr/attrs.js +0 -92
- package/dist/ssr/boundaries.js +0 -124
- package/dist/ssr/component-runtime.js +0 -85
- package/dist/ssr/context.d.ts +0 -49
- package/dist/ssr/context.js +0 -89
- package/dist/ssr/errors.d.ts +0 -9
- package/dist/ssr/errors.js +0 -12
- package/dist/ssr/escape.js +0 -191
- package/dist/ssr/hydration-data.js +0 -8
- package/dist/ssr/hydration-verify.d.ts +0 -11
- package/dist/ssr/hydration-verify.js +0 -171
- package/dist/ssr/index-internal.d.ts +0 -14
- package/dist/ssr/index-internal.js +0 -17
- package/dist/ssr/render-keys.js +0 -14
- package/dist/ssr/render-resolved.d.ts +0 -19
- package/dist/ssr/render-resolved.js +0 -33
- package/dist/ssr/render-sync.d.ts +0 -20
- package/dist/ssr/render-sync.js +0 -283
- package/dist/ssr/route-policy-resolution.js +0 -76
- package/dist/ssr/route-render.d.ts +0 -76
- package/dist/ssr/route-render.js +0 -118
- package/dist/ssr/sink.d.ts +0 -25
- package/dist/ssr/sink.js +0 -84
- package/dist/ssr/types.d.ts +0 -22
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { DefaultPreventable, KeyboardLikeEvent, PropagationStoppable } from "../utilities/event-types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/foundations/interactions/pressable.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* pressable
|
|
6
|
-
*
|
|
7
|
-
* Interaction helper that produces VNode props for 'press' semantics.
|
|
8
|
-
* - Pure and deterministic: no DOM construction or mutation here
|
|
9
|
-
* - The runtime owns event attachment and scheduling
|
|
10
|
-
* - This helper returns plain props (handlers) intended to be attached by the runtime
|
|
11
|
-
*
|
|
12
|
-
* Behaviour:
|
|
13
|
-
* - For native buttons: only an `onClick` prop is provided (no ARIA or keyboard shims)
|
|
14
|
-
* - For non-button elements: add `role="button"` and `tabIndex` and keyboard handlers
|
|
15
|
-
* - Activation: `Enter` activates on keydown, `Space` activates on keyup (matches native button)
|
|
16
|
-
* - Disabled: handlers short-circuit and `aria-disabled` is set for all hosts
|
|
17
|
-
*
|
|
18
|
-
* POLICY DECISIONS (LOCKED):
|
|
19
|
-
*
|
|
20
|
-
* 1. Activation Timing (Platform Parity)
|
|
21
|
-
* - Enter fires on keydown (immediate response)
|
|
22
|
-
* - Space fires on keyup (allows cancel by moving focus, matches native)
|
|
23
|
-
* - Space keydown prevents scroll (matches native button behavior)
|
|
24
|
-
*
|
|
25
|
-
* 2. Disabled Enforcement Strategy
|
|
26
|
-
* - Native buttons: Use HTML `disabled` attribute (platform-enforced non-interactivity)
|
|
27
|
-
* AND `aria-disabled` (consistent a11y signaling)
|
|
28
|
-
* - Non-native: Use `tabIndex=-1` (removes from tab order)
|
|
29
|
-
* AND `aria-disabled` (signals disabled state to AT)
|
|
30
|
-
* - Click handler short-circuits as defense-in-depth (prevents leaked focus issues)
|
|
31
|
-
*
|
|
32
|
-
* 3. Key Repeat Behavior
|
|
33
|
-
* - Held Enter/Space will fire onPress repeatedly (matches native button)
|
|
34
|
-
* - No debouncing or repeat prevention (platform parity)
|
|
35
|
-
*/
|
|
36
|
-
interface PressableOptions {
|
|
37
|
-
disabled?: boolean;
|
|
38
|
-
onPress?: (e: PressEvent) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Whether the host is a native button. Defaults to false.
|
|
41
|
-
*/
|
|
42
|
-
isNativeButton?: boolean;
|
|
43
|
-
}
|
|
44
|
-
type PressEvent = DefaultPreventable & PropagationStoppable;
|
|
45
|
-
interface PressableResult {
|
|
46
|
-
onClick: (e: PressEvent) => void;
|
|
47
|
-
disabled?: true;
|
|
48
|
-
role?: 'button';
|
|
49
|
-
tabIndex?: number;
|
|
50
|
-
onKeyDown?: (e: KeyboardLikeEvent) => void;
|
|
51
|
-
onKeyUp?: (e: KeyboardLikeEvent) => void;
|
|
52
|
-
'aria-disabled'?: 'true';
|
|
53
|
-
}
|
|
54
|
-
declare function pressable({
|
|
55
|
-
disabled,
|
|
56
|
-
onPress,
|
|
57
|
-
isNativeButton
|
|
58
|
-
}: PressableOptions): PressableResult;
|
|
59
|
-
//#endregion
|
|
60
|
-
export { PressableOptions, PressableResult, pressable };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { ariaDisabled } from "../utilities/aria.js";
|
|
2
|
-
//#region src/foundations/interactions/pressable.ts
|
|
3
|
-
function pressable({ disabled, onPress, isNativeButton = false }) {
|
|
4
|
-
const props = { onClick: (e) => {
|
|
5
|
-
if (disabled) {
|
|
6
|
-
e.preventDefault?.();
|
|
7
|
-
e.stopPropagation?.();
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
onPress?.(e);
|
|
11
|
-
} };
|
|
12
|
-
if (isNativeButton) {
|
|
13
|
-
if (disabled) {
|
|
14
|
-
props.disabled = true;
|
|
15
|
-
Object.assign(props, ariaDisabled(disabled));
|
|
16
|
-
}
|
|
17
|
-
return props;
|
|
18
|
-
}
|
|
19
|
-
props.role = "button";
|
|
20
|
-
props.tabIndex = disabled ? -1 : 0;
|
|
21
|
-
props.onKeyDown = (e) => {
|
|
22
|
-
if (disabled) {
|
|
23
|
-
e.preventDefault?.();
|
|
24
|
-
e.stopPropagation?.();
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (e.key === "Enter") {
|
|
28
|
-
e.preventDefault?.();
|
|
29
|
-
onPress?.(e);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
if (e.key === " ") e.preventDefault?.();
|
|
33
|
-
};
|
|
34
|
-
props.onKeyUp = (e) => {
|
|
35
|
-
if (disabled) {
|
|
36
|
-
e.preventDefault?.();
|
|
37
|
-
e.stopPropagation?.();
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (e.key === " ") {
|
|
41
|
-
e.preventDefault?.();
|
|
42
|
-
onPress?.(e);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
if (disabled) Object.assign(props, ariaDisabled(disabled));
|
|
46
|
-
return props;
|
|
47
|
-
}
|
|
48
|
-
//#endregion
|
|
49
|
-
export { pressable };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { KeyboardLikeEvent } from "../utilities/event-types.js";
|
|
2
|
-
|
|
3
|
-
//#region src/foundations/interactions/roving-focus.d.ts
|
|
4
|
-
type Orientation = 'horizontal' | 'vertical' | 'both';
|
|
5
|
-
interface RovingFocusOptions {
|
|
6
|
-
/**
|
|
7
|
-
* Current focused index
|
|
8
|
-
*/
|
|
9
|
-
currentIndex: number;
|
|
10
|
-
/**
|
|
11
|
-
* Total number of items
|
|
12
|
-
*/
|
|
13
|
-
itemCount: number;
|
|
14
|
-
/**
|
|
15
|
-
* Navigation orientation
|
|
16
|
-
* - horizontal: ArrowLeft/ArrowRight
|
|
17
|
-
* - vertical: ArrowUp/ArrowDown
|
|
18
|
-
* - both: all arrow keys
|
|
19
|
-
*/
|
|
20
|
-
orientation?: Orientation;
|
|
21
|
-
/**
|
|
22
|
-
* Whether to loop when reaching the end
|
|
23
|
-
*/
|
|
24
|
-
loop?: boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Callback when navigation occurs
|
|
27
|
-
*/
|
|
28
|
-
onNavigate?: (index: number) => void;
|
|
29
|
-
/**
|
|
30
|
-
* Optional disabled state check per index
|
|
31
|
-
*/
|
|
32
|
-
isDisabled?: (index: number) => boolean;
|
|
33
|
-
}
|
|
34
|
-
interface RovingFocusResult {
|
|
35
|
-
/**
|
|
36
|
-
* Props for the container element (composes via mergeProps)
|
|
37
|
-
*/
|
|
38
|
-
container: {
|
|
39
|
-
onKeyDown: (e: KeyboardLikeEvent) => void;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Generate props for an item at the given index (composes via mergeProps)
|
|
43
|
-
*/
|
|
44
|
-
item: (index: number) => {
|
|
45
|
-
tabIndex: number;
|
|
46
|
-
'data-roving-index': number;
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
declare function rovingFocus(options: RovingFocusOptions): RovingFocusResult;
|
|
50
|
-
//#endregion
|
|
51
|
-
export { Orientation, RovingFocusOptions, RovingFocusResult, rovingFocus };
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
//#region src/foundations/interactions/roving-focus.ts
|
|
2
|
-
function rovingFocus(options) {
|
|
3
|
-
const { currentIndex, itemCount, orientation = "horizontal", loop = false, onNavigate, isDisabled } = options;
|
|
4
|
-
function findNextIndex(from, direction) {
|
|
5
|
-
let next = from;
|
|
6
|
-
for (let steps = 0; steps < itemCount; steps += 1) {
|
|
7
|
-
next += direction;
|
|
8
|
-
if (loop) {
|
|
9
|
-
if (next < 0) next = itemCount - 1;
|
|
10
|
-
if (next >= itemCount) next = 0;
|
|
11
|
-
} else if (next < 0 || next >= itemCount) return;
|
|
12
|
-
if (next === from) return void 0;
|
|
13
|
-
if (!isDisabled?.(next)) return next;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function handleKeyDown(e) {
|
|
17
|
-
const { key } = e;
|
|
18
|
-
let direction;
|
|
19
|
-
if (orientation === "horizontal" || orientation === "both") {
|
|
20
|
-
if (key === "ArrowRight") direction = 1;
|
|
21
|
-
if (key === "ArrowLeft") direction = -1;
|
|
22
|
-
}
|
|
23
|
-
if (orientation === "vertical" || orientation === "both") {
|
|
24
|
-
if (key === "ArrowDown") direction = 1;
|
|
25
|
-
if (key === "ArrowUp") direction = -1;
|
|
26
|
-
}
|
|
27
|
-
if (direction === void 0) return;
|
|
28
|
-
const nextIndex = findNextIndex(currentIndex, direction);
|
|
29
|
-
if (nextIndex === void 0) return;
|
|
30
|
-
e.preventDefault?.();
|
|
31
|
-
e.stopPropagation?.();
|
|
32
|
-
onNavigate?.(nextIndex);
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
container: { onKeyDown: handleKeyDown },
|
|
36
|
-
item: (index) => ({
|
|
37
|
-
tabIndex: index === currentIndex ? 0 : -1,
|
|
38
|
-
"data-roving-index": index
|
|
39
|
-
})
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* USAGE EXAMPLE:
|
|
44
|
-
*
|
|
45
|
-
* function Menu() {
|
|
46
|
-
* const [focusIndex, setFocusIndex] = state(0);
|
|
47
|
-
* const items = ['File', 'Edit', 'View'];
|
|
48
|
-
*
|
|
49
|
-
* const navigation = rovingFocus({
|
|
50
|
-
* currentIndex: focusIndex(),
|
|
51
|
-
* itemCount: items.length,
|
|
52
|
-
* orientation: 'horizontal',
|
|
53
|
-
* loop: true,
|
|
54
|
-
* onNavigate: setFocusIndex,
|
|
55
|
-
* });
|
|
56
|
-
*
|
|
57
|
-
* return (
|
|
58
|
-
* <div {...navigation.container}>
|
|
59
|
-
* {items.map((label, index) => (
|
|
60
|
-
* <button {...navigation.item(index)}>
|
|
61
|
-
* {label}
|
|
62
|
-
* </button>
|
|
63
|
-
* ))}
|
|
64
|
-
* </div>
|
|
65
|
-
* );
|
|
66
|
-
* }
|
|
67
|
-
*/
|
|
68
|
-
//#endregion
|
|
69
|
-
export { rovingFocus };
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { State } from "../../runtime/state.js";
|
|
2
|
-
//#region src/foundations/state/controllable.d.ts
|
|
3
|
-
declare function isControlled<T>(value: T | undefined): value is T;
|
|
4
|
-
declare function resolveControllable<T>(value: T | undefined, defaultValue: T): {
|
|
5
|
-
value: T;
|
|
6
|
-
isControlled: boolean;
|
|
7
|
-
};
|
|
8
|
-
declare function makeControllable<T>(options: {
|
|
9
|
-
value: T | undefined;
|
|
10
|
-
defaultValue: T;
|
|
11
|
-
onChange?: (next: T) => void;
|
|
12
|
-
setInternal?: (next: T) => void;
|
|
13
|
-
}): {
|
|
14
|
-
set: (next: T) => void;
|
|
15
|
-
isControlled: boolean;
|
|
16
|
-
};
|
|
17
|
-
type ControllableState<T> = State<T> & {
|
|
18
|
-
isControlled: boolean;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* controllableState
|
|
22
|
-
*
|
|
23
|
-
* Hook-like primitive that mirrors `state()` semantics while supporting
|
|
24
|
-
* controlled/uncontrolled behavior.
|
|
25
|
-
*/
|
|
26
|
-
declare function controllableState<T>(options: {
|
|
27
|
-
value: T | undefined;
|
|
28
|
-
defaultValue: T;
|
|
29
|
-
onChange?: (next: T) => void;
|
|
30
|
-
}): ControllableState<T>;
|
|
31
|
-
//#endregion
|
|
32
|
-
export { ControllableState, controllableState, isControlled, makeControllable, resolveControllable };
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { state } from "../../runtime/state.js";
|
|
2
|
-
import "../../runtime/index.js";
|
|
3
|
-
//#region src/foundations/state/controllable.ts
|
|
4
|
-
/**
|
|
5
|
-
* controllable
|
|
6
|
-
*
|
|
7
|
-
* Small utilities for controlled vs uncontrolled components. These helpers are
|
|
8
|
-
* intentionally minimal and do not manage state themselves; they help component
|
|
9
|
-
* implementations make correct decisions about when to call `onChange` vs
|
|
10
|
-
* update internal state.
|
|
11
|
-
*
|
|
12
|
-
* POLICY DECISIONS (LOCKED):
|
|
13
|
-
*
|
|
14
|
-
* 1. Controlled Detection
|
|
15
|
-
* A value is "controlled" if it is not `undefined`.
|
|
16
|
-
* This matches React conventions and is SSR-safe.
|
|
17
|
-
*
|
|
18
|
-
* 2. onChange Timing
|
|
19
|
-
* - Controlled mode: onChange called immediately, no internal update
|
|
20
|
-
* - Uncontrolled mode: internal state updated first, then onChange called
|
|
21
|
-
* This ensures onChange sees the new value in both modes.
|
|
22
|
-
*
|
|
23
|
-
* 3. Value Equality
|
|
24
|
-
* controllableState uses Object.is() to prevent unnecessary onChange calls.
|
|
25
|
-
* This is intentional — strict equality, no deep comparison.
|
|
26
|
-
*/
|
|
27
|
-
function isControlled(value) {
|
|
28
|
-
return value !== void 0;
|
|
29
|
-
}
|
|
30
|
-
function resolveControllable(value, defaultValue) {
|
|
31
|
-
const controlled = isControlled(value);
|
|
32
|
-
return {
|
|
33
|
-
value: controlled ? value : defaultValue,
|
|
34
|
-
isControlled: controlled
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function makeControllable(options) {
|
|
38
|
-
const { value, defaultValue, onChange, setInternal } = options;
|
|
39
|
-
const { isControlled } = resolveControllable(value, defaultValue);
|
|
40
|
-
function set(next) {
|
|
41
|
-
if (isControlled) onChange?.(next);
|
|
42
|
-
else {
|
|
43
|
-
setInternal?.(next);
|
|
44
|
-
onChange?.(next);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
set,
|
|
49
|
-
isControlled
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* controllableState
|
|
54
|
-
*
|
|
55
|
-
* Hook-like primitive that mirrors `state()` semantics while supporting
|
|
56
|
-
* controlled/uncontrolled behavior.
|
|
57
|
-
*/
|
|
58
|
-
function controllableState(options) {
|
|
59
|
-
const isControlled = options.value !== void 0;
|
|
60
|
-
const internal = isControlled ? null : state(options.defaultValue);
|
|
61
|
-
function read() {
|
|
62
|
-
if (isControlled) return options.value;
|
|
63
|
-
return internal();
|
|
64
|
-
}
|
|
65
|
-
read.set = (nextOrUpdater) => {
|
|
66
|
-
const prev = read();
|
|
67
|
-
const next = typeof nextOrUpdater === "function" ? nextOrUpdater(prev) : nextOrUpdater;
|
|
68
|
-
if (Object.is(prev, next)) return;
|
|
69
|
-
if (isControlled) {
|
|
70
|
-
options.onChange?.(next);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
internal.set(nextOrUpdater);
|
|
74
|
-
options.onChange?.(next);
|
|
75
|
-
};
|
|
76
|
-
read.isControlled = isControlled;
|
|
77
|
-
return read;
|
|
78
|
-
}
|
|
79
|
-
//#endregion
|
|
80
|
-
export { controllableState, isControlled, makeControllable, resolveControllable };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
//#region src/foundations/structures/collection.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* createCollection
|
|
4
|
-
*
|
|
5
|
-
* Ordered descendant registry for coordinating items without DOM queries.
|
|
6
|
-
*
|
|
7
|
-
* INVARIANTS:
|
|
8
|
-
* 1. Registration order determines item order (no DOM queries)
|
|
9
|
-
* 2. Stable ordering across renders (insertion order preserved)
|
|
10
|
-
* 3. Each item may have metadata (type-safe, user-defined)
|
|
11
|
-
* 4. No implicit global state (explicit collection instances)
|
|
12
|
-
* 5. No automatic cleanup (caller controls lifecycle)
|
|
13
|
-
*
|
|
14
|
-
* DESIGN:
|
|
15
|
-
* - Returns a registry API ({ register, items, clear })
|
|
16
|
-
* - Items are stored in insertion order
|
|
17
|
-
* - Registration returns an unregister function
|
|
18
|
-
* - No side effects on registration (pure data structure)
|
|
19
|
-
*
|
|
20
|
-
* USAGE:
|
|
21
|
-
* const collection = createCollection<HTMLElement, { disabled: boolean }>();
|
|
22
|
-
* const unregister = collection.register(element, { disabled: false });
|
|
23
|
-
* const allItems = collection.items();
|
|
24
|
-
* unregister();
|
|
25
|
-
*/
|
|
26
|
-
type CollectionItem<TNode, TMetadata = unknown> = {
|
|
27
|
-
node: TNode;
|
|
28
|
-
metadata: TMetadata;
|
|
29
|
-
};
|
|
30
|
-
interface Collection<TNode, TMetadata = unknown> {
|
|
31
|
-
/**
|
|
32
|
-
* Register a node with optional metadata.
|
|
33
|
-
* Returns an unregister function.
|
|
34
|
-
*/
|
|
35
|
-
register(node: TNode, metadata: TMetadata): () => void;
|
|
36
|
-
/**
|
|
37
|
-
* Get all registered items in insertion order.
|
|
38
|
-
*/
|
|
39
|
-
items(): ReadonlyArray<CollectionItem<TNode, TMetadata>>;
|
|
40
|
-
/**
|
|
41
|
-
* Clear all registered items.
|
|
42
|
-
*/
|
|
43
|
-
clear(): void;
|
|
44
|
-
/**
|
|
45
|
-
* Get the count of registered items.
|
|
46
|
-
*/
|
|
47
|
-
size(): number;
|
|
48
|
-
}
|
|
49
|
-
declare function createCollection<TNode, TMetadata = unknown>(): Collection<TNode, TMetadata>;
|
|
50
|
-
//#endregion
|
|
51
|
-
export { Collection, CollectionItem, createCollection };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
//#region src/foundations/structures/collection.ts
|
|
2
|
-
function createCollection() {
|
|
3
|
-
const registry = /* @__PURE__ */ new Map();
|
|
4
|
-
function register(node, metadata) {
|
|
5
|
-
const item = {
|
|
6
|
-
node,
|
|
7
|
-
metadata
|
|
8
|
-
};
|
|
9
|
-
registry.set(node, item);
|
|
10
|
-
return () => {
|
|
11
|
-
registry.delete(node);
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
function items() {
|
|
15
|
-
return Array.from(registry.values());
|
|
16
|
-
}
|
|
17
|
-
function clear() {
|
|
18
|
-
registry.clear();
|
|
19
|
-
}
|
|
20
|
-
function size() {
|
|
21
|
-
return registry.size;
|
|
22
|
-
}
|
|
23
|
-
return {
|
|
24
|
-
register,
|
|
25
|
-
items,
|
|
26
|
-
clear,
|
|
27
|
-
size
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* USAGE EXAMPLE:
|
|
32
|
-
*
|
|
33
|
-
* // Create a collection for menu items
|
|
34
|
-
* const menuItems = createCollection<HTMLElement, { disabled: boolean }>();
|
|
35
|
-
*
|
|
36
|
-
* // Register items
|
|
37
|
-
* const unregister1 = menuItems.register(element1, { disabled: false });
|
|
38
|
-
* const unregister2 = menuItems.register(element2, { disabled: true });
|
|
39
|
-
*
|
|
40
|
-
* // Query items
|
|
41
|
-
* const allItems = menuItems.items();
|
|
42
|
-
* const enabledItems = allItems.filter(item => !item.metadata.disabled);
|
|
43
|
-
*
|
|
44
|
-
* // Cleanup
|
|
45
|
-
* unregister1();
|
|
46
|
-
* unregister2();
|
|
47
|
-
*/
|
|
48
|
-
//#endregion
|
|
49
|
-
export { createCollection };
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
//#region src/foundations/structures/layer.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* createLayer
|
|
4
|
-
*
|
|
5
|
-
* Manages stacking order and coordination for overlays (modals, popovers, etc).
|
|
6
|
-
*
|
|
7
|
-
* INVARIANTS:
|
|
8
|
-
* 1. Layers are ordered by registration time (FIFO)
|
|
9
|
-
* 2. Only the top layer handles Escape key
|
|
10
|
-
* 3. Only the top layer handles outside pointer events
|
|
11
|
-
* 4. Nested layers are supported
|
|
12
|
-
* 5. Does not implement portals (orthogonal concern)
|
|
13
|
-
* 6. No automatic DOM insertion (caller controls mounting)
|
|
14
|
-
*
|
|
15
|
-
* DESIGN:
|
|
16
|
-
* - Returns a layer manager with register/unregister API
|
|
17
|
-
* - Each layer has a unique ID and can query if it's the top layer
|
|
18
|
-
* - Escape and outside pointer coordination via callbacks
|
|
19
|
-
* - No z-index management (CSS concern)
|
|
20
|
-
*
|
|
21
|
-
* USAGE:
|
|
22
|
-
* const manager = createLayer();
|
|
23
|
-
*
|
|
24
|
-
* const layer = manager.register({
|
|
25
|
-
* onEscape: () => { ... },
|
|
26
|
-
* onOutsidePointer: () => { ... }
|
|
27
|
-
* });
|
|
28
|
-
*
|
|
29
|
-
* layer.isTop(); // true if this is the topmost layer
|
|
30
|
-
* layer.unregister();
|
|
31
|
-
*/
|
|
32
|
-
interface LayerOptions {
|
|
33
|
-
/**
|
|
34
|
-
* Called when Escape is pressed and this is the top layer
|
|
35
|
-
*/
|
|
36
|
-
onEscape?: () => void;
|
|
37
|
-
/**
|
|
38
|
-
* Called when pointer event occurs outside and this is the top layer
|
|
39
|
-
*/
|
|
40
|
-
onOutsidePointer?: (e: PointerEvent) => void;
|
|
41
|
-
/**
|
|
42
|
-
* Optional node reference for outside pointer detection
|
|
43
|
-
*/
|
|
44
|
-
node?: Node | null;
|
|
45
|
-
}
|
|
46
|
-
interface Layer {
|
|
47
|
-
/**
|
|
48
|
-
* Unique layer ID
|
|
49
|
-
*/
|
|
50
|
-
id: number;
|
|
51
|
-
/**
|
|
52
|
-
* Check if this layer is the topmost
|
|
53
|
-
*/
|
|
54
|
-
isTop(): boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Remove this layer from the stack
|
|
57
|
-
*/
|
|
58
|
-
unregister(): void;
|
|
59
|
-
}
|
|
60
|
-
interface LayerManager {
|
|
61
|
-
/**
|
|
62
|
-
* Register a new layer
|
|
63
|
-
*/
|
|
64
|
-
register(options: LayerOptions): Layer;
|
|
65
|
-
/**
|
|
66
|
-
* Get all active layers in order
|
|
67
|
-
*/
|
|
68
|
-
layers(): ReadonlyArray<Layer>;
|
|
69
|
-
/**
|
|
70
|
-
* Manually trigger escape handling on the top layer
|
|
71
|
-
*/
|
|
72
|
-
handleEscape(): void;
|
|
73
|
-
/**
|
|
74
|
-
* Manually trigger outside pointer handling on the top layer
|
|
75
|
-
*/
|
|
76
|
-
handleOutsidePointer(e: PointerEvent): void;
|
|
77
|
-
}
|
|
78
|
-
declare function createLayer(): LayerManager;
|
|
79
|
-
//#endregion
|
|
80
|
-
export { Layer, LayerManager, LayerOptions, createLayer };
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
//#region src/foundations/structures/layer.ts
|
|
2
|
-
function createLayer() {
|
|
3
|
-
const stack = [];
|
|
4
|
-
let nextId = 1;
|
|
5
|
-
function register(options) {
|
|
6
|
-
const id = nextId++;
|
|
7
|
-
const entry = {
|
|
8
|
-
id,
|
|
9
|
-
options
|
|
10
|
-
};
|
|
11
|
-
stack.push(entry);
|
|
12
|
-
function isTop() {
|
|
13
|
-
return stack[stack.length - 1]?.id === id;
|
|
14
|
-
}
|
|
15
|
-
function unregister() {
|
|
16
|
-
const index = stack.findIndex((e) => e.id === id);
|
|
17
|
-
if (index !== -1) stack.splice(index, 1);
|
|
18
|
-
}
|
|
19
|
-
return {
|
|
20
|
-
id,
|
|
21
|
-
isTop,
|
|
22
|
-
unregister
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
function layers() {
|
|
26
|
-
return stack.map((entry) => ({
|
|
27
|
-
id: entry.id,
|
|
28
|
-
isTop: () => stack[stack.length - 1]?.id === entry.id,
|
|
29
|
-
unregister: () => {
|
|
30
|
-
const index = stack.findIndex((e) => e.id === entry.id);
|
|
31
|
-
if (index !== -1) stack.splice(index, 1);
|
|
32
|
-
}
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
function handleEscape() {
|
|
36
|
-
const top = stack[stack.length - 1];
|
|
37
|
-
if (top) top.options.onEscape?.();
|
|
38
|
-
}
|
|
39
|
-
function handleOutsidePointer(e) {
|
|
40
|
-
const top = stack[stack.length - 1];
|
|
41
|
-
if (!top) return;
|
|
42
|
-
const node = top.options.node;
|
|
43
|
-
if (node && e.target instanceof Node) {
|
|
44
|
-
if (!node.contains(e.target)) top.options.onOutsidePointer?.(e);
|
|
45
|
-
} else top.options.onOutsidePointer?.(e);
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
register,
|
|
49
|
-
layers,
|
|
50
|
-
handleEscape,
|
|
51
|
-
handleOutsidePointer
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* USAGE EXAMPLE:
|
|
56
|
-
*
|
|
57
|
-
* const layerManager = createLayer();
|
|
58
|
-
*
|
|
59
|
-
* function Modal({ onClose }) {
|
|
60
|
-
* const modalRef = ref<HTMLDivElement>();
|
|
61
|
-
*
|
|
62
|
-
* const layer = layerManager.register({
|
|
63
|
-
* node: modalRef.current,
|
|
64
|
-
* onEscape: onClose,
|
|
65
|
-
* onOutsidePointer: onClose,
|
|
66
|
-
* });
|
|
67
|
-
*
|
|
68
|
-
* onUnmount(() => layer.unregister());
|
|
69
|
-
*
|
|
70
|
-
* return (
|
|
71
|
-
* <div ref={modalRef}>
|
|
72
|
-
* <h1>Modal</h1>
|
|
73
|
-
* {layer.isTop() && <p>I am on top!</p>}
|
|
74
|
-
* </div>
|
|
75
|
-
* );
|
|
76
|
-
* }
|
|
77
|
-
*/
|
|
78
|
-
//#endregion
|
|
79
|
-
export { createLayer };
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { RenderableChild } from "../../common/vnode.js";
|
|
2
|
-
|
|
3
|
-
//#region src/foundations/structures/layout.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* Layout helper.
|
|
6
|
-
*
|
|
7
|
-
* A layout is just a normal component that wraps children.
|
|
8
|
-
* Persistence and reuse are handled by the runtime via component identity.
|
|
9
|
-
*
|
|
10
|
-
* This helper exists purely for readability and convention.
|
|
11
|
-
*
|
|
12
|
-
* POLICY DECISIONS (LOCKED):
|
|
13
|
-
*
|
|
14
|
-
* 1. Return Type is Opaque (unknown)
|
|
15
|
-
* Layout components return `unknown` to remain runtime-agnostic.
|
|
16
|
-
* The runtime owns concrete JSX element types.
|
|
17
|
-
*
|
|
18
|
-
* 2. Children Positioning
|
|
19
|
-
* Layout receives children as first argument (router-friendly).
|
|
20
|
-
* Props come second. This matches route layout conventions where
|
|
21
|
-
* children represent the nested route content.
|
|
22
|
-
*
|
|
23
|
-
* 3. Props Spreading
|
|
24
|
-
* Props are spread into the layout component. This is intentional
|
|
25
|
-
* and deterministic — no merging or composition.
|
|
26
|
-
*/
|
|
27
|
-
type LayoutComponent<P = object> = (props: P & {
|
|
28
|
-
children?: RenderableChild;
|
|
29
|
-
}) => unknown;
|
|
30
|
-
declare function layout<P = object>(Layout: LayoutComponent<P>): (children?: RenderableChild, props?: P) => unknown;
|
|
31
|
-
//#endregion
|
|
32
|
-
export { LayoutComponent, layout };
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { JSXElement } from "../../common/jsx.js";
|
|
2
|
-
import { RenderableChild } from "../../common/vnode.js";
|
|
3
|
-
//#region src/foundations/structures/presence.d.ts
|
|
4
|
-
interface PresenceProps {
|
|
5
|
-
present: boolean | (() => boolean);
|
|
6
|
-
children?: RenderableChild;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Presence
|
|
10
|
-
*
|
|
11
|
-
* Structural policy primitive for conditional mount/unmount.
|
|
12
|
-
* - No timers
|
|
13
|
-
* - No animation coupling
|
|
14
|
-
* - No DOM side-effects
|
|
15
|
-
*
|
|
16
|
-
* POLICY DECISIONS (LOCKED):
|
|
17
|
-
*
|
|
18
|
-
* 1. Present as Function
|
|
19
|
-
* Accepts boolean OR function to support lazy evaluation patterns.
|
|
20
|
-
* Function is called once per render. Use boolean form for static values.
|
|
21
|
-
*
|
|
22
|
-
* 2. Children Type
|
|
23
|
-
* Presence forwards normal renderable child content only.
|
|
24
|
-
* Imperative DOM nodes are not part of the public contract.
|
|
25
|
-
*
|
|
26
|
-
* 3. Immediate Mount/Unmount
|
|
27
|
-
* No exit animations or transitions. When `present` becomes false,
|
|
28
|
-
* children are removed immediately. Animation must be layered above
|
|
29
|
-
* this primitive.
|
|
30
|
-
*/
|
|
31
|
-
declare function Presence({
|
|
32
|
-
present,
|
|
33
|
-
children
|
|
34
|
-
}: PresenceProps): JSXElement | null;
|
|
35
|
-
//#endregion
|
|
36
|
-
export { Presence, PresenceProps };
|