@mkbabb/glass-ui 3.7.0 → 3.9.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 +1 -6
- package/dist/CardAction-DuArVky-.js +157 -0
- package/dist/{CommandShortcut-CY0aQTz5.js → CommandShortcut-CefCj5mt.js} +7 -7
- package/dist/{ContextMenuSubContent-BeDz7G6f.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
- package/dist/{DataTable-gtPOLZvl.js → DataTable-CUHMukiQ.js} +4 -4
- package/dist/DeckProgress-Dmk4_AKN.js +23 -0
- package/dist/{DialogContent-DG1YMR-P.js → DialogContent-BRkT1cjP.js} +3 -3
- package/dist/{DialogFooter-BCIaDP15.js → DialogFooter-Gprw8H_A.js} +1 -1
- package/dist/{HoverPopover-DXpOEw1P.js → HoverPopover-2LOIW34a.js} +1 -1
- package/dist/{IconTooltip-Cu86JR4e.js → IconTooltip-yefK7cJc.js} +1 -1
- package/dist/{MetricBadge-D-bRaQUD.js → MetricBadge-lTc002u2.js} +1 -1
- package/dist/{Notification-B5WHP3_1.js → Notification-BxK8LZMw.js} +1 -1
- package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
- package/dist/{PopoverContent-F1bWnYoh.js → PopoverContent-BId6ggf_.js} +1 -1
- package/dist/{Progress-c4vo4ALi.js → Progress-iEuD9pxG.js} +4 -4
- package/dist/{ScrollingText-BEp377U5.js → ScrollingText-BPP84wKo.js} +2 -2
- package/dist/{SelectScrollDownButton-DAo5NmY_.js → SelectScrollDownButton-T32cVFeM.js} +4 -4
- package/dist/{SelectSeparator-COFMJGng.js → SelectSeparator-C4Ql0gzV.js} +1 -1
- package/dist/{TabsList-COqIdW7i.js → TabsList-B8CVOQPC.js} +2 -2
- package/dist/{Toaster-BMaeziJJ.js → Toaster-1rYWrmAm.js} +1 -1
- package/dist/{ToggleGroupItem-C-AIkBUw.js → ToggleGroupItem-Cev4pOVK.js} +5 -5
- package/dist/animated-digit.js +1 -1
- package/dist/api/index.d.ts +5 -3
- package/dist/aurora.js +339 -408
- package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
- package/dist/badge.js +1 -1
- package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
- package/dist/button.js +1 -1
- package/dist/canvas.d.ts +1 -0
- package/dist/canvas.js +3 -0
- package/dist/card.js +1 -1
- package/dist/carousel.js +106 -105
- package/dist/collapsible.js +1 -1
- package/dist/{color-DjJCAQ6f.js → color-8jBjWiJ6.js} +22 -14
- package/dist/color.js +2 -2
- package/dist/command.js +1 -1
- package/dist/compile-DAjIoEy2.js +158 -0
- package/dist/components/custom/aurora/composables/atoms.d.ts +90 -25
- package/dist/components/custom/aurora/composables/color.d.ts +0 -12
- package/dist/components/custom/aurora/composables/uniformBridge.d.ts +34 -23
- package/dist/components/custom/aurora/constants/presets.d.ts +10 -7
- package/dist/components/custom/aurora/constants/renderMode.d.ts +22 -0
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/index.d.ts +3 -3
- package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
- package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
- package/dist/components/custom/constellation/constellationField.d.ts +110 -5
- package/dist/components/custom/constellation/index.d.ts +2 -2
- package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
- package/dist/components/custom/dock/GlassDock.vue.d.ts +57 -67
- package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
- package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
- package/dist/components/custom/dock/composables/index.d.ts +3 -0
- package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
- package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
- package/dist/components/custom/dock/index.d.ts +4 -1
- package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +13 -0
- package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +23 -5
- package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +2 -0
- package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
- package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +20 -5
- package/dist/components/custom/goo-blob/index.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
- package/dist/components/custom/goo-blob/types.d.ts +8 -0
- package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
- package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
- package/dist/components/custom/tabs/index.d.ts +2 -5
- package/dist/components/ui/button/index.d.ts +1 -1
- package/dist/components/ui/card/Card.vue.d.ts +28 -10
- package/dist/components/ui/card/index.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
- package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
- package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
- package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
- package/dist/components/ui/slider/index.d.ts +14 -7
- package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
- package/dist/composables/color/index.d.ts +19 -0
- package/dist/composables/context/createContext.d.ts +1 -1
- package/dist/composables/dom/index.d.ts +1 -1
- package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
- package/dist/composables/glass/canvas2d/index.d.ts +2 -1
- package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
- package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
- package/dist/composables/glass/index.d.ts +3 -1
- package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
- package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +1 -1
- package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +4 -0
- package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +1 -1
- package/dist/composables/motion/core/index.d.ts +1 -0
- package/dist/configurator.js +1 -1
- package/dist/confirm-dialog.js +2 -2
- package/dist/constellation.js +143 -74
- package/dist/context-menu.js +2 -2
- package/dist/controls.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deck-progress.d.ts +1 -0
- package/dist/deck-progress.js +2 -0
- package/dist/dialog.js +2 -2
- package/dist/dock.js +468 -354
- package/dist/{dockContext-DLgrVWsU.js → dockContext-BKeIMmNk.js} +1 -1
- package/dist/dom.js +6 -6
- package/dist/{dropdown-menu-BWpwutt0.js → dropdown-menu-D77jX6Df.js} +4 -4
- package/dist/dropdown-menu.js +1 -1
- package/dist/fonts/README.md +26 -18
- package/dist/forms.js +5 -5
- package/dist/fourier-field.js +35 -35
- package/dist/glass-panel.js +7 -7
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +154 -169
- package/dist/goo-blob.js +361 -274
- package/dist/header-ribbon.js +1 -1
- package/dist/hover-card.js +1 -1
- package/dist/hover-popover.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/instrument-chassis.js +1 -1
- package/dist/instrument-rail.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +5 -5
- package/dist/{menuItemVariants-B4eFR5Ix.js → menuItemVariants-CCoBNkU5.js} +1 -1
- package/dist/metric-badge.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.js +65 -65
- package/dist/motion.js +1 -1
- package/dist/notification.js +1 -1
- package/dist/number-field.js +1 -1
- package/dist/paper-backdrop.js +1 -1
- package/dist/popover.js +1 -1
- package/dist/progress.js +1 -1
- package/dist/pulse.js +2 -2
- package/dist/reactive.js +2 -2
- package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +9 -9
- package/dist/select.js +3 -3
- package/dist/separator.js +1 -1
- package/dist/{sheet-Cv1uO-Gq.js → sheet-VZEtNFvO.js} +2 -2
- package/dist/sheet.js +1 -1
- package/dist/slider-DC2mwuoe.js +142 -0
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +2 -2
- package/dist/status-dot.js +17 -16
- package/dist/styles/animations.css +6 -2
- package/dist/styles/components.css +1 -1
- package/dist/styles/dock/density.css +230 -0
- package/dist/styles/dock/layer-group.css +263 -0
- package/dist/styles/dock/layers.css +355 -0
- package/dist/styles/dock/morph.css +244 -0
- package/dist/styles/dock/overflow.css +201 -0
- package/dist/styles/dock/shell.css +457 -0
- package/dist/styles/dock-controls.css +187 -50
- package/dist/styles/dock.css +65 -1181
- package/dist/styles/fonts.css +0 -25
- package/dist/styles/glass.css +482 -102
- package/dist/styles/index.css +12 -11
- package/dist/styles/theme.css +60 -2
- package/dist/styles/tokens.css +625 -72
- package/dist/styles/typography.css +52 -69
- package/dist/styles/utilities.css +91 -40
- package/dist/styles/view-transition.css +12 -40
- package/dist/switch.js +1 -1
- package/dist/tabs.js +183 -152
- package/dist/timeline.js +3 -3
- package/dist/toast.js +1 -1
- package/dist/toggle-group.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{useCanvas2D-C31yfUGY.js → useCanvas2D-ClrQuZtp.js} +2 -1
- package/dist/{useConfiguratorState-B24TcgIn.js → useConfiguratorState-DxAqksK6.js} +24 -13
- package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
- package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
- package/dist/{useTextHighlight-aMPdEpkq.js → useTextHighlight-DON84L8w.js} +1 -1
- package/dist/{useTouchGate-YQRwyUGU.js → useTouchGate-WFyJYsth.js} +1 -1
- package/dist/vReveal-CqaCz_mC.js +44 -0
- package/dist/watercolor-dot.js +1 -1
- package/package.json +67 -36
- package/src/fonts/README.md +26 -18
- package/src/styles/animations.css +6 -2
- package/src/styles/dock/density.css +230 -0
- package/src/styles/dock/layer-group.css +263 -0
- package/src/styles/dock/layers.css +355 -0
- package/src/styles/dock/morph.css +244 -0
- package/src/styles/dock/overflow.css +201 -0
- package/src/styles/dock/shell.css +457 -0
- package/src/styles/dock-controls.css +187 -50
- package/src/styles/dock.css +65 -1181
- package/src/styles/fonts.css +0 -25
- package/src/styles/glass.css +482 -102
- package/src/styles/index.css +12 -11
- package/src/styles/theme.css +60 -2
- package/src/styles/tokens.css +625 -72
- package/src/styles/typography.css +52 -69
- package/src/styles/utilities.css +91 -40
- package/src/styles/view-transition.css +12 -40
- package/dist/CardAction-D8nSE62a.js +0 -163
- package/dist/DiscoGlyph-ZoBYpoxI.js +0 -132
- package/dist/GlyphFace-Ce_oe3tM.js +0 -51
- package/dist/UnderlineTabs-D_c1iYo-.js +0 -39
- package/dist/compile-iM4IUB66.js +0 -158
- package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
- package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
- package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
- package/dist/components/custom/disco-glyph/index.d.ts +0 -1
- package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
- package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
- package/dist/components/custom/glass-carousel/index.d.ts +0 -4
- package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
- package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
- package/dist/components/custom/glyph-face/index.d.ts +0 -2
- package/dist/components/custom/glyph-face/keys.d.ts +0 -9
- package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
- package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
- package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
- package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
- package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
- package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
- package/dist/disco-glyph.d.ts +0 -1
- package/dist/disco-glyph.js +0 -2
- package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
- package/dist/glass-carousel.d.ts +0 -1
- package/dist/glass-carousel.js +0 -214
- package/dist/glyph-face.d.ts +0 -1
- package/dist/glyph-face.js +0 -3
- package/dist/keys-Dyf_uTs5.js +0 -9
- package/dist/responsive-tabs.d.ts +0 -1
- package/dist/responsive-tabs.js +0 -95
- package/dist/slider-BA9wIs5e.js +0 -130
- package/dist/styles/disco-glyph.css +0 -26
- package/dist/styles/glyph-face.css +0 -92
- package/dist/useViewTransition-DaN5Zrox.js +0 -21
- package/dist/vReveal-BE2TsPoR.js +0 -24
- package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
- package/src/styles/disco-glyph.css +0 -26
- package/src/styles/glyph-face.css +0 -92
- /package/dist/{CollapsibleContent-D7UNsXQr.js → CollapsibleContent-CP9qF1v4.js} +0 -0
- /package/dist/{ContextMenuContent-DGKZX1Du.js → ContextMenuContent-DDa0v27s.js} +0 -0
- /package/dist/{HoverCardContent-Bn0UBMY9.js → HoverCardContent-B6CcQ8He.js} +0 -0
- /package/dist/{InstrumentChassis-BLJBl1BW.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
- /package/dist/{InstrumentRail-BElFwKyt.js → InstrumentRail-CUJ05YVG.js} +0 -0
- /package/dist/{Label-DBc7bKzZ.js → Label-zRfbQdCn.js} +0 -0
- /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-B1GkAjNb.js} +0 -0
- /package/dist/{PaperBackdrop-DCGoGatv.js → PaperBackdrop-CqwjnfLv.js} +0 -0
- /package/dist/{SelectGroup-BcaFjvP4.js → SelectGroup-BFiod7X2.js} +0 -0
- /package/dist/{Separator-DZyqsCum.js → Separator-D7sD7RKj.js} +0 -0
- /package/dist/{Switch-2rsAtDfA.js → Switch-LDKLmmgx.js} +0 -0
- /package/dist/{TooltipProvider-CD2IXfRv.js → TooltipProvider-CmZzCuaG.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-gLzyemvl.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
- /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
- /package/dist/{createContext-CvNyBk4o.js → createContext-B44Sah_H.js} +0 -0
- /package/dist/{useGlassRenderer-HebgSEgN.js → useGlassRenderer-5I0YkI4t.js} +0 -0
- /package/dist/{useInterval-D3USn0yc.js → useInterval-Dsmqwi03.js} +0 -0
- /package/dist/{useResizeObserver-CSyxGxIX.js → useResizeObserver-CWCbk5Px.js} +0 -0
- /package/dist/{useSpringMount-LRZqJTaF.js → useSpringMount-BJSHcLl3.js} +0 -0
- /package/dist/{useTimer-DEJonOZa.js → useTimer-3xqf_54b.js} +0 -0
- /package/dist/{useUserInvalidAria-CQKjEfwP.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
- /package/dist/{useViewportReady-K96m-Mdv.js → useViewportReady-RIr5Wgkh.js} +0 -0
|
@@ -1,33 +1,8 @@
|
|
|
1
1
|
type DockDensity = "compact" | "comfortable" | "spacious" | "audacious";
|
|
2
|
-
|
|
3
|
-
collapseDelay?: number;
|
|
4
|
-
startCollapsed?: boolean;
|
|
2
|
+
interface DockCommonProps {
|
|
5
3
|
fitContent?: boolean;
|
|
6
4
|
position?: "fixed" | "inline" | "sticky";
|
|
7
5
|
alwaysExpanded?: boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Visual/behavioral preset.
|
|
10
|
-
* `dock` — the horizontal floating dock (default).
|
|
11
|
-
* `rail` — the vertical icon rail variant used by
|
|
12
|
-
* app chrome (stadium-pill silhouette,
|
|
13
|
-
* `--glass-bg-wash` plate).
|
|
14
|
-
* `instrument-strip` — vertical chassis-strip mode for consumer
|
|
15
|
-
* cockpits composing an instrument-cluster
|
|
16
|
-
* gauge column (the speedtest
|
|
17
|
-
* SurveyResultDock consumer). Drops the
|
|
18
|
-
* rail variant's `--radius-pill` extreme
|
|
19
|
-
* and adopts the `<InstrumentChassis>`
|
|
20
|
-
* family's surface vocabulary
|
|
21
|
-
* (`--radius-card` border-radius,
|
|
22
|
-
* `--glass-bg-chassis` background,
|
|
23
|
-
* `--glass-border-quiet` border,
|
|
24
|
-
* `--glass-shadow-quiet` shadow, plus an
|
|
25
|
-
* engraved-bezel `::before` inner stroke
|
|
26
|
-
* matching `InstrumentChassis::before`).
|
|
27
|
-
* No new tokens — lifts the existing
|
|
28
|
-
* chassis vocabulary. AJ-W1-δ / G-AJ-D7.
|
|
29
|
-
*/
|
|
30
|
-
variant?: "dock" | "rail" | "instrument-strip";
|
|
31
6
|
/**
|
|
32
7
|
* Corner treatment.
|
|
33
8
|
* `"pill"` — the stadium silhouette (default).
|
|
@@ -36,9 +11,12 @@ type __VLS_Props = {
|
|
|
36
11
|
* radius (`--dock-card-radius`, default `--radius-3xl`)
|
|
37
12
|
* ABOVE 2xl, below pill — does NOT collapse to a stadium.
|
|
38
13
|
* Collapsed it returns to a pill; the pill↔card swap
|
|
39
|
-
* morphs on the `--dock-motion-resize` spring.
|
|
40
|
-
*
|
|
41
|
-
*
|
|
14
|
+
* morphs on the `--dock-motion-resize` spring. AX.W56's
|
|
15
|
+
* squircle policy applies `corner-shape:
|
|
16
|
+
* var(--corner-shape-bigdock)` here under `@supports
|
|
17
|
+
* (corner-shape: superellipse(2))` — the big-dock is the ONE
|
|
18
|
+
* surface where the superellipse reads (cards/pills stay
|
|
19
|
+
* round); the border-radius arc is the cross-engine contract.
|
|
42
20
|
*
|
|
43
21
|
* `"pill"`/`"rounded"` previously bound ONLY under the vertical rail
|
|
44
22
|
* variant — on a horizontal dock the prop silently no-op'd. AW.W3b adds
|
|
@@ -46,24 +24,11 @@ type __VLS_Props = {
|
|
|
46
24
|
* so `shape` now paints on a horizontal dock too.
|
|
47
25
|
*/
|
|
48
26
|
shape?: "pill" | "rounded" | "card";
|
|
49
|
-
/**
|
|
50
|
-
* In-cap arrangement. `"linear"` (default) lays the active layer out as a
|
|
51
|
-
* linear row/column. `"grid"` makes the active layer a self-wrapping tile
|
|
52
|
-
* grid (Launchpad/Stage-Manager track symmetry — `auto-fill` columns of
|
|
53
|
-
* `--dock-tile-min`). ORTHOGONAL to `overflow` (the OVER-cap strategy):
|
|
54
|
-
* `layout` is the IN-cap arrangement.
|
|
55
|
-
*
|
|
56
|
-
* Hard contract: a `layout="grid"` dock is `alwaysExpanded` (a 2D panel
|
|
57
|
-
* does not read as a collapsible pill, and no width morph means no
|
|
58
|
-
* per-frame grid reflow). The canonical pairing is
|
|
59
|
-
* `shape="card" layout="grid"` (the props stay independent — no
|
|
60
|
-
* auto-implication of `shape`).
|
|
61
|
-
*/
|
|
62
|
-
layout?: "linear" | "grid";
|
|
63
27
|
/**
|
|
64
28
|
* Layout axis of the dock. `"horizontal"` (default) lays items out
|
|
65
29
|
* left-to-right and animates `width`; `"vertical"` lays items out
|
|
66
|
-
* top-to-bottom and animates `height`.
|
|
30
|
+
* top-to-bottom and animates `height`. IGNORED under `variant="rail"` /
|
|
31
|
+
* `"instrument-strip"` (those force vertical by construction).
|
|
67
32
|
*/
|
|
68
33
|
orientation?: "horizontal" | "vertical";
|
|
69
34
|
/**
|
|
@@ -80,10 +45,18 @@ type __VLS_Props = {
|
|
|
80
45
|
* which all touched overflow divergently).
|
|
81
46
|
* `"grow"` — content grows to fit then overflows visibly past
|
|
82
47
|
* the cap (the default; nothing clips or scrolls).
|
|
83
|
-
* `"wrap"` — expanded content wraps to multiple
|
|
84
|
-
* `.dock-overflow-wrap` recipe
|
|
85
|
-
*
|
|
86
|
-
*
|
|
48
|
+
* `"wrap"` — expanded content wraps to multiple rows via CONTENT-DRIVEN
|
|
49
|
+
* intrinsic flex-wrap (the `.dock-overflow-wrap` recipe). The
|
|
50
|
+
* dock shrink-wraps to content and caps that intrinsic width
|
|
51
|
+
* at `max-inline-size: var(--dock-max-inline-size)`, so the row
|
|
52
|
+
* reflows to N rows EXACTLY when its intrinsic width exceeds
|
|
53
|
+
* the cap — at ANY viewport width — and collapses to one row
|
|
54
|
+
* when it fits (no viewport breakpoint). The wrapped multi-row silhouette lifts
|
|
55
|
+
* onto the card/floating shadow tier as the dock expands.
|
|
56
|
+
* HORIZONTAL-ONLY: a vertical rail grows-to-fit + clamps via
|
|
57
|
+
* `--dock-max-block-size` (its own overflow story), so the
|
|
58
|
+
* `.dock-overflow-wrap` class is not emitted for a vertical
|
|
59
|
+
* orientation.
|
|
87
60
|
* `"scroll"` — the dock becomes the scroll port. Horizontal docks
|
|
88
61
|
* scroll the active layer on the inline axis
|
|
89
62
|
* (`.dock-scroll-x`); vertical rails scroll on the
|
|
@@ -107,16 +80,45 @@ type __VLS_Props = {
|
|
|
107
80
|
* size the dock relies on.
|
|
108
81
|
*/
|
|
109
82
|
containerName?: string;
|
|
110
|
-
}
|
|
111
|
-
|
|
83
|
+
}
|
|
84
|
+
interface DockVariantProps extends DockCommonProps {
|
|
85
|
+
variant?: "dock";
|
|
86
|
+
/** Idle-collapse delay in ms (default 2000). DOCK-ONLY — a rail never collapses. */
|
|
87
|
+
collapseDelay?: number;
|
|
88
|
+
/** Start in the collapsed state (default true). DOCK-ONLY — a rail is always expanded. */
|
|
89
|
+
startCollapsed?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* In-cap arrangement. `"linear"` (default) lays the active layer out as a
|
|
92
|
+
* linear row/column. `"grid"` makes the active layer a self-wrapping tile
|
|
93
|
+
* grid (Launchpad/Stage-Manager track symmetry — `auto-fill` columns of
|
|
94
|
+
* `--dock-tile-min`). ORTHOGONAL to `overflow` (the OVER-cap strategy):
|
|
95
|
+
* `layout` is the IN-cap arrangement.
|
|
96
|
+
*
|
|
97
|
+
* Hard contract: a `layout="grid"` dock is `alwaysExpanded` (a 2D panel
|
|
98
|
+
* does not read as a collapsible pill, and no width morph means no
|
|
99
|
+
* per-frame grid reflow). The canonical pairing is
|
|
100
|
+
* `shape="card" layout="grid"` (the props stay independent — no
|
|
101
|
+
* auto-implication of `shape`). DOCK-ONLY — the grid is a horizontal big-dock
|
|
102
|
+
* arrangement, never a rail's.
|
|
103
|
+
*/
|
|
104
|
+
layout?: "linear" | "grid";
|
|
105
|
+
}
|
|
106
|
+
interface DockRailProps extends DockCommonProps {
|
|
107
|
+
variant: "rail" | "instrument-strip";
|
|
108
|
+
}
|
|
109
|
+
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_14: {};
|
|
112
110
|
type __VLS_Slots = {} & {
|
|
113
|
-
|
|
111
|
+
persistent?: (props: typeof __VLS_1) => any;
|
|
112
|
+
} & {
|
|
113
|
+
default?: (props: typeof __VLS_3) => any;
|
|
114
|
+
} & {
|
|
115
|
+
collapsed?: (props: typeof __VLS_5) => any;
|
|
114
116
|
} & {
|
|
115
|
-
|
|
117
|
+
default?: (props: typeof __VLS_7) => any;
|
|
116
118
|
} & {
|
|
117
|
-
|
|
119
|
+
collapsed?: (props: typeof __VLS_14) => any;
|
|
118
120
|
};
|
|
119
|
-
declare const __VLS_base: import("vue").DefineComponent<
|
|
121
|
+
declare const __VLS_base: import("vue").DefineComponent<DockVariantProps | DockRailProps, {
|
|
120
122
|
expanded: import("vue").Ref<boolean, boolean>;
|
|
121
123
|
isPinned: import("vue").Ref<boolean, boolean>;
|
|
122
124
|
isHeld: import("vue").ComputedRef<boolean>;
|
|
@@ -125,19 +127,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
|
|
|
125
127
|
collapse: () => void;
|
|
126
128
|
keepOpen: () => void;
|
|
127
129
|
release: () => void;
|
|
128
|
-
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<
|
|
129
|
-
position: "fixed" | "inline" | "sticky";
|
|
130
|
-
overflow: "grow" | "wrap" | "scroll";
|
|
131
|
-
orientation: "horizontal" | "vertical";
|
|
132
|
-
variant: "dock" | "rail" | "instrument-strip";
|
|
133
|
-
density: DockDensity;
|
|
134
|
-
shape: "pill" | "rounded" | "card";
|
|
135
|
-
layout: "linear" | "grid";
|
|
136
|
-
collapseDelay: number;
|
|
137
|
-
alwaysExpanded: boolean;
|
|
138
|
-
startCollapsed: boolean;
|
|
139
|
-
fitContent: boolean;
|
|
140
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
130
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DockVariantProps | DockRailProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
141
131
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
142
132
|
declare const _default: typeof __VLS_export;
|
|
143
133
|
export default _default;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ComputedRef } from "vue";
|
|
2
2
|
export type DockOrientation = "horizontal" | "vertical";
|
|
3
|
+
export type DockLayout = "linear" | "grid";
|
|
3
4
|
/**
|
|
4
5
|
* Dock context surfaces the dock id + orientation + held-state coordination
|
|
5
6
|
* to descendants.
|
|
@@ -25,6 +26,12 @@ export type DockOrientation = "horizontal" | "vertical";
|
|
|
25
26
|
export interface DockContext {
|
|
26
27
|
id: string;
|
|
27
28
|
orientation: ComputedRef<DockOrientation>;
|
|
29
|
+
/**
|
|
30
|
+
* In-cap arrangement (`linear` row/column vs `grid` tile panel). AX.W45 —
|
|
31
|
+
* `<DockSeparator>` reads this to paint a full-row section break in a grid dock
|
|
32
|
+
* (a 1px perpendicular hairline is useless in a 2D tile grid).
|
|
33
|
+
*/
|
|
34
|
+
layout: ComputedRef<DockLayout>;
|
|
28
35
|
/** Acquire a keep-open token; suppresses timer-based collapse. */
|
|
29
36
|
keepOpen: () => void;
|
|
30
37
|
/** Release a previously-acquired keep-open token. */
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Ref } from "vue";
|
|
2
|
+
export interface DockMorphGroupRegistration {
|
|
3
|
+
/** The container element owning this group's grid-stacked panes. */
|
|
4
|
+
containerEl: Ref<HTMLElement | null>;
|
|
5
|
+
/** The group's currently-active pane id (its `v-model:active`). */
|
|
6
|
+
activeLayer: Ref<string>;
|
|
7
|
+
/** Layout axis of the group; matches the group's `orientation`. */
|
|
8
|
+
axis: Ref<"horizontal" | "vertical">;
|
|
9
|
+
}
|
|
10
|
+
export interface DockMorphGroupHandle {
|
|
11
|
+
/** The active pane id post-swap (the orchestrator mutates it). */
|
|
12
|
+
currentLayer: Readonly<Ref<string>>;
|
|
13
|
+
/** The pane id currently fading out, or null. */
|
|
14
|
+
leavingLayer: Readonly<Ref<string | null>>;
|
|
15
|
+
/** Detach this group from the orchestrator (on the group's unmount). */
|
|
16
|
+
release(): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The provided morph seam. A nested `<DockLayerGroup>` injects this and DEFERS
|
|
20
|
+
* its pane-swap morph to the dock's single orchestrator via `registerGroup`.
|
|
21
|
+
*/
|
|
22
|
+
export interface DockMorphContext {
|
|
23
|
+
registerGroup(group: DockMorphGroupRegistration): DockMorphGroupHandle;
|
|
24
|
+
}
|
|
25
|
+
export declare const DOCK_MORPH_KEY: import("vue").InjectionKey<DockMorphContext>;
|
|
26
|
+
export declare function provideDockMorphContext(context: DockMorphContext): void;
|
|
27
|
+
/**
|
|
28
|
+
* Befitting-silent — returns `null` for a `<DockLayerGroup>` rendered outside a
|
|
29
|
+
* `<GlassDock>` (the standalone self-orchestrate path).
|
|
30
|
+
*/
|
|
31
|
+
export declare const useOptionalDockMorphContext: () => DockMorphContext | null;
|
|
32
|
+
export interface UseDockMorphOrchestratorOptions {
|
|
33
|
+
/** The `.glass-dock` root that carries the shared scalar + clip aperture. */
|
|
34
|
+
rootEl: Ref<HTMLElement | null>;
|
|
35
|
+
/** The outer collapse↔expand container (`.dock-layers`). */
|
|
36
|
+
outerEl: Ref<HTMLElement | null>;
|
|
37
|
+
/** The outer active "layer" id — `(expandedState)` projected to a string. */
|
|
38
|
+
outerActiveLayer: Ref<string>;
|
|
39
|
+
/** The outer pair morphs the inline axis (a horizontal dock). */
|
|
40
|
+
outerAxis: Ref<"horizontal" | "vertical">;
|
|
41
|
+
}
|
|
42
|
+
export interface UseDockMorphOrchestratorReturn {
|
|
43
|
+
/** Provide-able context: a nested `<DockLayerGroup>` registers through it. */
|
|
44
|
+
context: DockMorphContext;
|
|
45
|
+
/** The outer pair's post-swap active layer id (call-site parity). */
|
|
46
|
+
outerCurrentLayer: Readonly<Ref<string>>;
|
|
47
|
+
/** Defensive settle on a stray `@transitionend` (call-site parity). */
|
|
48
|
+
onOuterTransitionEnd(e: TransitionEvent): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The ONE morph engine for a dock instance. Owns a single `SpringProgress`;
|
|
52
|
+
* drives the outer collapse↔expand box AND every nested `<DockLayerGroup>`'s
|
|
53
|
+
* pane-swap off the one `--dock-morph-t` scalar. Replaces the per-pair
|
|
54
|
+
* `useLayerTransition` instantiation (W01's single-scalar primitive) with a
|
|
55
|
+
* single multi-target driver, so a nested dock runs ONE engine, not two.
|
|
56
|
+
*/
|
|
57
|
+
export declare function useDockMorphOrchestrator(options: UseDockMorphOrchestratorOptions): UseDockMorphOrchestratorReturn;
|
|
@@ -2,6 +2,9 @@ export { useDockState } from "./useDockState";
|
|
|
2
2
|
export type { UseDockStateOptions, UseDockStateReturn, DockState } from "./useDockState";
|
|
3
3
|
export { useLayerTransition } from "./useLayerTransition";
|
|
4
4
|
export type { UseLayerTransitionOptions, UseLayerTransitionReturn } from "./useLayerTransition";
|
|
5
|
+
export { useDockHold } from "./useDockHold";
|
|
6
|
+
export type { UseDockHoldOptions, UseDockHoldReturn } from "./useDockHold";
|
|
5
7
|
export { isTeleportedTarget } from "./isTeleportedTarget";
|
|
6
8
|
export { provideDockContext, useDockContext, useOptionalDockContext, DOCK_CONTEXT_KEY, type DockContext, type DockOrientation, } from "./dockContext";
|
|
7
9
|
export { provideDockLayerGroupContext, useDockLayerGroupContext, useOptionalDockLayerGroupContext, DOCK_LAYER_GROUP_KEY, type DockLayerDescriptor, type DockLayerGroupContext, } from "./dockLayerContext";
|
|
10
|
+
export { useDockMorphOrchestrator, provideDockMorphContext, useOptionalDockMorphContext, DOCK_MORPH_KEY, type DockMorphContext, type DockMorphGroupRegistration, type DockMorphGroupHandle, type UseDockMorphOrchestratorOptions, type UseDockMorphOrchestratorReturn, } from "./dockMorphContext";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ComputedRef } from "vue";
|
|
2
|
+
/**
|
|
3
|
+
* AX.W03 — the host-native dock hold.
|
|
4
|
+
*
|
|
5
|
+
* `keepDockOpen` is a FIRST-CLASS, synchronous morph-state input to the dock's
|
|
6
|
+
* one state machine: while a continuous pointer/touch gesture is live on a
|
|
7
|
+
* descendant control, the dock holds open (idle-collapse suppressed) and the
|
|
8
|
+
* dock's `held` edge lights `data-held` on the dock root AND the control for the
|
|
9
|
+
* thumb-halo intensification.
|
|
10
|
+
*
|
|
11
|
+
* Why NATIVE host listeners (not a Vue `@pointerdown` template binding):
|
|
12
|
+
* reka-ui's `<SliderRoot>` is a FORWARDING component — it renders through a
|
|
13
|
+
* `CollectionSlot` + `resolveDynamicComponent` (SliderHorizontal/Vertical) +
|
|
14
|
+
* `forwardRef` chain and binds its OWN cached `onPointerdown`
|
|
15
|
+
* (`SliderRoot.js → SliderImpl.js`, which calls `setPointerCapture`). A consumer
|
|
16
|
+
* `@pointerdown` arrives as `$attrs.onPointerdown` and is DROPPED across that
|
|
17
|
+
* Slot/forwardRef boundary — vue-tsc + units pass, only a real drag catches it
|
|
18
|
+
* (the canonical binding-verification class, `feedback_glass_ui_binding_*`). A
|
|
19
|
+
* native `addEventListener` on the RESOLVED host element is immune: the event
|
|
20
|
+
* always reaches the DOM node the user actually presses. This is the
|
|
21
|
+
* device-proven fix (AX.W03 §Scope.1/2 — slice-2 F0/F2; ratified host-native
|
|
22
|
+
* over a reka `dragging`-ref subscription, which reka does not publicly expose
|
|
23
|
+
* and which would re-introduce the same forwarding fragility).
|
|
24
|
+
*
|
|
25
|
+
* The hold is INSTANT-ON (Apple "Building Fluid Interfaces", facet 5): the first
|
|
26
|
+
* line `keepOpen()` is capture-independent and synchronous, so the halo +
|
|
27
|
+
* substrate tier-shade light the instant the pointer goes down (under the ~100ms
|
|
28
|
+
* perception threshold — reads as instant); the spring governs only the settle.
|
|
29
|
+
*
|
|
30
|
+
* The release window is window-scoped `pointerup`/`pointercancel`: reka
|
|
31
|
+
* `setPointerCapture`-retargets the move/up to the captured element, which
|
|
32
|
+
* bubbles to `window`, so a release anywhere ends the hold. The touch parity
|
|
33
|
+
* folds onto the SAME single acquire — one owner, one acquire path (no second
|
|
34
|
+
* hold path, no parallel `touchGate` watch).
|
|
35
|
+
*
|
|
36
|
+
* DI: consumes the EXISTING typed `DockContext` via `useOptionalDockContext()`
|
|
37
|
+
* (the `keepOpen`/`release` pair, O.W2 single-typed-key collapse). A control
|
|
38
|
+
* rendered OUTSIDE a `<GlassDock>` gets the befitting-silent default (no dock) —
|
|
39
|
+
* every hook is a no-op, a primitive may legitimately render outside a dock.
|
|
40
|
+
*/
|
|
41
|
+
export interface UseDockHoldOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Whether the hold is armed. A reactive getter so a consumer prop
|
|
44
|
+
* (`keepDockOpen`) can disarm it without re-instantiating the composable.
|
|
45
|
+
* Defaults to always-armed.
|
|
46
|
+
*/
|
|
47
|
+
enabled?: () => boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface UseDockHoldReturn {
|
|
50
|
+
/** `true` whenever the dock observes ≥1 held token (the `data-held` edge). */
|
|
51
|
+
isHeld: ComputedRef<boolean> | undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param resolveHost A getter that resolves the REAL host element to attach the
|
|
55
|
+
* native listeners to. Called inside `onMounted` (template refs are populated
|
|
56
|
+
* before `onMounted` fires), so a reka forwardRef host (`SliderRoot.$el`) is
|
|
57
|
+
* live by then. A getter — not a `Ref` — sidesteps the cross-composable
|
|
58
|
+
* `onMounted`-ordering trap (a sibling `onMounted` that populates a ref runs
|
|
59
|
+
* AFTER this one).
|
|
60
|
+
*/
|
|
61
|
+
export declare function useDockHold(resolveHost: () => HTMLElement | null, options?: UseDockHoldOptions): UseDockHoldReturn;
|
|
@@ -2,78 +2,32 @@ import type { Ref } from "vue";
|
|
|
2
2
|
export interface UseLayerTransitionOptions {
|
|
3
3
|
/** The container element that owns the stacked layer panes. */
|
|
4
4
|
containerEl: Ref<HTMLElement | null>;
|
|
5
|
-
/** The currently active layer id */
|
|
5
|
+
/** The currently active layer id. */
|
|
6
6
|
activeLayer: Ref<string>;
|
|
7
7
|
/**
|
|
8
|
-
* Animation axis. `"horizontal"`
|
|
9
|
-
*
|
|
8
|
+
* Animation axis. `"horizontal"` morphs the inline axis; `"vertical"` morphs
|
|
9
|
+
* the block axis. Defaults to horizontal when omitted.
|
|
10
10
|
*/
|
|
11
11
|
axis?: Ref<"horizontal" | "vertical">;
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* The outer collapsed↔expanded pair resolves `dock-expand` / `dock-collapse`;
|
|
18
|
-
* the inner DockLayerGroup pane swap resolves `layer-forward` / `layer-back`.
|
|
19
|
-
* Omit to run the single symmetric curve. Feature-detected — degrades to the
|
|
20
|
-
* symmetric curve on an engine without the `types` overload (Firefox 144).
|
|
13
|
+
* Retained for API parity with the prior VT-typed signature (consumed by
|
|
14
|
+
* `GlassDock` + `DockLayerGroup`). The single-scalar morph runs ONE symmetric
|
|
15
|
+
* spring on every engine, so the direction hint is no longer a curve fork — it
|
|
16
|
+
* is accepted and ignored. Kept so the call sites need no edit.
|
|
21
17
|
*/
|
|
22
18
|
directionTypes?: (from: string, to: string) => string[];
|
|
23
19
|
}
|
|
24
20
|
export interface UseLayerTransitionReturn {
|
|
25
|
-
/** Attach to
|
|
21
|
+
/** Attach to `@transitionend` on the container (kept for call-site parity). */
|
|
26
22
|
onTransitionEnd(e: TransitionEvent): void;
|
|
27
|
-
/** The currently active layer id (post-swap) */
|
|
23
|
+
/** The currently active layer id (post-swap). */
|
|
28
24
|
currentLayer: Ref<string>;
|
|
29
|
-
/** The layer id currently fading out, or null */
|
|
25
|
+
/** The layer id currently fading out, or null. */
|
|
30
26
|
leavingLayer: Ref<string | null>;
|
|
31
27
|
}
|
|
32
28
|
/**
|
|
33
|
-
* Coordinates the
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* AQ.W6 §Design 7 — the swap FORKS on View-Transitions support:
|
|
38
|
-
*
|
|
39
|
-
* - **Native path** (`document.startViewTransition` present): the layer swap is
|
|
40
|
-
* wrapped in `startViewTransition(() => mutate())`. The browser snapshots the
|
|
41
|
-
* container + panes (tagged `view-transition-name` in `dock.css`) and morphs
|
|
42
|
-
* the size + crossfades the pane content with ZERO `getBoundingClientRect`
|
|
43
|
-
* reads. No pin/measure/re-pin dance, no inline size, no rAF.
|
|
44
|
-
*
|
|
45
|
-
* - **Fallback path** (no `startViewTransition`): the axis-aware FLIP, KEPT as
|
|
46
|
-
* the sole feature-detected fallback (no alias — one path or the other runs per
|
|
47
|
-
* swap, never both). It is now the ONLY driver that writes inline size on a
|
|
48
|
-
* non-VT engine (AV.W9.0 retired the `interpolate-size`/`calc-size` CSS arm that
|
|
49
|
-
* used to second-drive width on Chrome 129+ and freeze the dock):
|
|
50
|
-
* 1. Capture current container size (or the live spring's pixel value on a
|
|
51
|
-
* retarget)
|
|
52
|
-
* 2. Pin container to that size
|
|
53
|
-
* 3. nextTick → rAF: swap classes (old → leaving, new → active) AND measure new
|
|
54
|
-
* natural size in ONE frame origin
|
|
55
|
-
* 4. Drive size off ONE `SpringProgress` clock in PIXEL space (its `value` IS
|
|
56
|
-
* the live width/height)
|
|
57
|
-
* 5. On settle, clear inline size + restore the CSS transition
|
|
58
|
-
*
|
|
59
|
-
* AV.W9.2 — velocity-continuity: an interrupted swap (a re-toggle while the
|
|
60
|
-
* spring is still live) RE-SEATS the existing solver's target from its current
|
|
61
|
-
* `(value, velocity)` instead of dispose+reconstruct-from-rest, so the morph is
|
|
62
|
-
* continuous through a retarget (the iOS interruptible-spring contract).
|
|
63
|
-
*
|
|
64
|
-
* AV.W7 perf folds:
|
|
65
|
-
* - F3 — on-demand `will-change`: the morphing box gets `will-change:<dim>`
|
|
66
|
-
* ONLY for the gesture's duration (set just before the spring drives it,
|
|
67
|
-
* cleared to `auto` on settle/`transitionend`). NEVER a standing hint — a
|
|
68
|
-
* permanent `will-change` holds a compositor layer + VRAM for an idle dock.
|
|
69
|
-
* - F5 — inheritance-bomb guard (CONVENTION): this driver animates ONLY the
|
|
70
|
-
* element's own `width`/`height` (the spring's pixel-space `value`) and the
|
|
71
|
-
* pane opacity rides a class-driven CSS transition on the SEPARATE
|
|
72
|
-
* `.dock-layer-item-host`. NO INHERITED custom property (`--phase-color` /
|
|
73
|
-
* `--shadow-color`) is TWEENED per frame here — animating an inherited
|
|
74
|
-
* custom property forces a whole-subtree style recalc every frame (the
|
|
75
|
-
* inheritance bomb). Phase/shadow colors are SET on a discrete state change,
|
|
76
|
-
* never interpolated frame-by-frame. Keep new motion on `transform`/`opacity`
|
|
77
|
-
* /`width`/`height`; route any color shift through a discrete class swap.
|
|
29
|
+
* Coordinates the size morph + crossfade between grid-stacked dock layer panes.
|
|
30
|
+
* Reusable at any nesting level (the inner `<DockLayerGroup>` pair AND the outer
|
|
31
|
+
* `GlassDock` collapsed↔expanded pair).
|
|
78
32
|
*/
|
|
79
33
|
export declare function useLayerTransition(options: UseLayerTransitionOptions): UseLayerTransitionReturn;
|
|
@@ -6,5 +6,8 @@ export { default as DockBackgroundToggle } from "./DockBackgroundToggle.vue";
|
|
|
6
6
|
export { default as DockTabButton } from "./DockTabButton.vue";
|
|
7
7
|
export { default as DockSelectTrigger } from "./DockSelectTrigger.vue";
|
|
8
8
|
export { default as DockDropdownTrigger } from "./DockDropdownTrigger.vue";
|
|
9
|
+
export { default as DockSeparator } from "./DockSeparator.vue";
|
|
9
10
|
export type { UseDockStateOptions, UseDockStateReturn, DockState } from "./composables";
|
|
10
|
-
export {
|
|
11
|
+
export { useLayerTransition } from "./composables";
|
|
12
|
+
export type { UseLayerTransitionOptions, UseLayerTransitionReturn, } from "./composables";
|
|
13
|
+
export { DOCK_CONTEXT_KEY, useDockContext, useOptionalDockContext, provideDockContext, type DockContext, type DockOrientation, type DockLayout, } from "./composables/dockContext";
|
|
@@ -32,6 +32,15 @@ type __VLS_Props = {
|
|
|
32
32
|
config?: BlobConfig;
|
|
33
33
|
/** Extra seed string mixed into the satellite PRNG for a unique-but-reproducible system. */
|
|
34
34
|
seed?: string;
|
|
35
|
+
/**
|
|
36
|
+
* AX.W16 — the declarative WCAG-2.2.2 pause seam. `v-model:paused` parks the
|
|
37
|
+
* render loop (the substrate's `manual` suspend) when `true` and restarts it when
|
|
38
|
+
* `false`. This is the EXACT shape `<DockBackgroundToggle>` wears — wire its
|
|
39
|
+
* `@update:paused` to this `v-model` and the blob's animation stops/starts for ALL
|
|
40
|
+
* users. The imperative `pause()`/`resume()` defineExpose handles bind the SAME
|
|
41
|
+
* renderer seam (no parallel pause path); the prop owns the default.
|
|
42
|
+
*/
|
|
43
|
+
paused?: boolean;
|
|
35
44
|
};
|
|
36
45
|
declare function nudge(): void;
|
|
37
46
|
declare function setMood(m: BlobMood): void;
|
|
@@ -41,10 +50,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
|
41
50
|
setMood: typeof setMood;
|
|
42
51
|
pulse: typeof pulse;
|
|
43
52
|
currentMood: Readonly<import("vue").Ref<BlobMood, BlobMood>>;
|
|
53
|
+
pause: () => void;
|
|
54
|
+
resume: () => void;
|
|
44
55
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
45
56
|
click: () => any;
|
|
57
|
+
"update:paused": (value: boolean) => any;
|
|
46
58
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
47
59
|
onClick?: (() => any) | undefined;
|
|
60
|
+
"onUpdate:paused"?: ((value: boolean) => any) | undefined;
|
|
48
61
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
62
|
declare const _default: typeof __VLS_export;
|
|
50
63
|
export default _default;
|
|
@@ -9,18 +9,36 @@ export interface MoodInteraction {
|
|
|
9
9
|
/** ms since the last pointer activity (drives `sleepy` past IDLE_SLEEP_MS). */
|
|
10
10
|
idleMs: number;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Who is driving a `setMood` retarget (AX.W46 D7). `"auto"` — the autonomic arc
|
|
14
|
+
* (`update` from the pointer/idle state); `"manual"` — the public expose (an imperative
|
|
15
|
+
* `setMood` from a consumer / the demo mood pills). A manual retarget arms the
|
|
16
|
+
* `manualOverride` latch the auto-arc respects.
|
|
17
|
+
*/
|
|
18
|
+
export type MoodSource = "auto" | "manual";
|
|
19
|
+
/** The options bag for `setMood` — the source discriminant (default `"manual"`). */
|
|
20
|
+
export interface SetMoodOptions {
|
|
21
|
+
/** Who is driving the retarget. Defaults to `"manual"` (the public-expose default). */
|
|
22
|
+
source?: MoodSource;
|
|
23
|
+
}
|
|
12
24
|
/**
|
|
13
25
|
* Animates the blob's mood parameters — a cross-fade between named mood targets
|
|
14
|
-
* driven per frame by `tick(dt)`. `setMood` retargets
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
26
|
+
* driven per frame by `tick(dt)`. `setMood(mood, { source })` retargets (a `"manual"`
|
|
27
|
+
* source — the default — pins the mood above the auto-arc, AX.W46 D7);
|
|
28
|
+
* `update(interaction)` drives the AUTONOMIC arc from the AW.W10 pointer/idle state
|
|
29
|
+
* (curious on approach, excited on click, sleepy after inactivity), always
|
|
30
|
+
* `source: "auto"`, and early-returns while a manual mood is pinned; `params` is the
|
|
31
|
+
* eased current value the renderer reads.
|
|
18
32
|
*/
|
|
19
33
|
export declare function useBlobMood(): {
|
|
20
34
|
currentMood: Readonly<Ref<BlobMood>>;
|
|
21
35
|
params: Readonly<Ref<MoodParams>>;
|
|
22
|
-
setMood: (mood: BlobMood) => void;
|
|
36
|
+
setMood: (mood: BlobMood, options?: SetMoodOptions) => void;
|
|
23
37
|
update: (interaction: MoodInteraction) => void;
|
|
24
38
|
tick: (dt: number) => void;
|
|
39
|
+
/** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
|
|
40
|
+
isSettled: () => boolean;
|
|
41
|
+
/** AX.W16 — wall-ms to the next auto-mood retarget (the wake horizon). */
|
|
42
|
+
nextAutoMoodMs: () => number;
|
|
25
43
|
};
|
|
26
44
|
export type BlobMoodSystem = ReturnType<typeof useBlobMood>;
|
|
@@ -55,5 +55,7 @@ export declare function useBlobPointer(el: Ref<HTMLElement | null>): {
|
|
|
55
55
|
click: (amp: number) => void;
|
|
56
56
|
consumeClick: () => boolean;
|
|
57
57
|
rest: () => void;
|
|
58
|
+
/** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
|
|
59
|
+
isAtRest: () => boolean;
|
|
58
60
|
};
|
|
59
61
|
export type BlobPointer = ReturnType<typeof useBlobPointer>;
|
|
@@ -9,5 +9,7 @@ export declare function useBlobSatellites(config: BlobConfig, initialColor: stri
|
|
|
9
9
|
tick: (now: number, mood: MoodParams) => void;
|
|
10
10
|
nudge: () => void;
|
|
11
11
|
reseed: (color: string) => void;
|
|
12
|
+
isQuiescent: () => boolean;
|
|
13
|
+
nextEventMs: (now: number) => number;
|
|
12
14
|
};
|
|
13
15
|
export type BlobSatelliteSystem = ReturnType<typeof useBlobSatellites>;
|
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
import { type Ref } from "vue";
|
|
2
2
|
import type { ColorResolver } from "../../../../composables/color";
|
|
3
|
-
import {
|
|
3
|
+
import type { BlobConfig } from "../types";
|
|
4
4
|
import type { BlobMoodSystem } from "./useBlobMood";
|
|
5
5
|
import type { BlobPointer } from "./useBlobPointer";
|
|
6
6
|
import type { BlobSatelliteSystem } from "./useBlobSatellites";
|
|
7
7
|
export interface UseMetaballRendererOptions {
|
|
8
8
|
canvasRef: Ref<HTMLCanvasElement | null>;
|
|
9
|
+
/** The base color, ALREADY un-wrapped to a CONCRETE string by the SFC (DOM-free). */
|
|
9
10
|
color: Ref<string>;
|
|
11
|
+
/**
|
|
12
|
+
* The Fresnel rim color, ALREADY un-wrapped to a CONCRETE string by the SFC
|
|
13
|
+
* (AX.W16 — the renderer no longer reaches the DOM for the `var()`-cascade read;
|
|
14
|
+
* the SFC's `resolveTokenColor` leaf does ALL un-wrapping before the renderer sees
|
|
15
|
+
* it). A `var(--token)` rim arrives here already resolved to `rgb(...)`.
|
|
16
|
+
*/
|
|
17
|
+
rimColor: Ref<string>;
|
|
18
|
+
/**
|
|
19
|
+
* The multi-stop palette, ALREADY un-wrapped to CONCRETE strings by the SFC
|
|
20
|
+
* (AX.W16). EMPTY falls back to the base color (uStopCount <= 1).
|
|
21
|
+
*/
|
|
22
|
+
paletteStops: Ref<string[]>;
|
|
10
23
|
mood: BlobMoodSystem;
|
|
11
24
|
pointer: BlobPointer;
|
|
12
25
|
satellites: BlobSatelliteSystem;
|
|
13
26
|
config: BlobConfig;
|
|
14
27
|
/**
|
|
15
|
-
* The injected color seam (DEC-AT-2). Resolves a CSS color string to a
|
|
16
|
-
* sRGB triple in [0,1] fed straight into the shader's base-color uniform —
|
|
17
|
-
* faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
|
|
28
|
+
* The injected color seam (DEC-AT-2). Resolves a CONCRETE CSS color string to a
|
|
29
|
+
* GAMMA-sRGB triple in [0,1] fed straight into the shader's base-color uniform —
|
|
30
|
+
* the faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
|
|
18
31
|
* loud failure, not a silent gray) instructing the consumer to pass
|
|
19
|
-
* `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own).
|
|
32
|
+
* `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own). The
|
|
33
|
+
* renderer is DOM-FREE: it never un-wraps a `var(--token)` — the SFC's
|
|
34
|
+
* `resolveTokenColor` leaf does that BEFORE handing strings here (inv-K-3 seam).
|
|
20
35
|
*/
|
|
21
36
|
colorResolver: ColorResolver;
|
|
22
37
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { default as GooBlob } from "./GooBlob.vue";
|
|
2
|
-
export type { BlobMood, BlobMerge, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
|
|
2
|
+
export type { BlobMood, BlobMerge, BlobQuality, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
|
|
3
3
|
export { BLOB_CONFIG_DEFAULTS, BLOB_CONFIG_KEY } from "./types";
|
|
4
4
|
export { useBlobMood, type BlobMoodSystem } from "./composables/useBlobMood";
|
|
5
5
|
export { useBlobPointer, type BlobPointer } from "./composables/useBlobPointer";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// IQ 2024 quadratic-polynomial smin, NORMALIZED so k is a blend band in distance\n// units. The k *= 4.0 pre-scale makes the h*h*k*0.25 poly's effective blend width\n// equal to k (the un-normalized form's width was 0.25*k).\nfloat sminQuadratic(float a, float b, float k) {\n k *= 4.0;\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * k * 0.25;\n}\n\n// IQ circular smin \u2014 a quarter-circle fillet at the seam (rounder than the\n// quadratic). The k *= 1.0/(1.0-sqrt(0.5)) factor normalizes k to the same\n// blend-band units so the merge axis swaps shape without re-tuning uSmoothK.\nfloat sminCircular(float a, float b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n}\n\n// Config-gated merge dispatch \u2014 uMerge 0 = quadratic, 1 = circular.\nfloat smin(float a, float b, float k) {\n if (uMerge > 0.5) return sminCircular(a, b, k);\n return sminQuadratic(a, b, k);\n}";
|
|
1
|
+
export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT circle: returns vec3(d, dd/dx, dd/dy). The circle\n// gradient is the UNIT radial direction (p - center)/length(p - center) (the\n// eikonal property holds EXACTLY for a circle), guarded at the degenerate centre.\n// This is the keystone of the analytic-gradient smin: carrying the gradient\n// through the scene field DELETES the per-pixel 4-tap normal (4 full sceneDist\n// evals, each running 3-octave FBM + the sat/trail loops).\nvec3 sdgCircle(vec2 p, vec2 center, float radius) {\n vec2 d = p - center;\n float len = length(d);\n vec2 grad = len > 1e-6 ? d / len : vec2(0.0, 1.0);\n return vec3(len - radius, grad);\n}\n\n// IQ 2024 quadratic-polynomial smin, NORMALIZED so k is a blend band in distance\n// units. The k *= 4.0 pre-scale makes the h*h*k*0.25 poly's effective blend width\n// equal to k (the un-normalized form's width was 0.25*k).\nfloat sminQuadratic(float a, float b, float k) {\n k *= 4.0;\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * k * 0.25;\n}\n\n// IQ circular smin \u2014 a quarter-circle fillet at the seam (rounder than the\n// quadratic). The k *= 1.0/(1.0-sqrt(0.5)) factor normalizes k to the same\n// blend-band units so the merge axis swaps shape without re-tuning uSmoothK.\nfloat sminCircular(float a, float b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n}\n\n// Config-gated merge dispatch \u2014 uMerge 0 = quadratic, 1 = circular.\nfloat smin(float a, float b, float k) {\n if (uMerge > 0.5) return sminCircular(a, b, k);\n return sminQuadratic(a, b, k);\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT smin. a/b are vec3(dist, grad.xy); the blended\n// gradient is mix(a.yz, b.yz, w) with the interpolation weight w the distance\n// blend uses (IQ's vec2-smin insight). This propagates the analytic gradient\n// through the merge so the surface normal reads the field gradient DIRECTLY \u2014 no\n// finite-difference tap. The blend weight matches each variant.\nvec3 sminQuadraticG(vec3 a, vec3 b, float k) {\n k *= 4.0;\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = h * h * k * 0.25;\n // h-weight that selects which surface dominates (0 \u2192 a, 1 \u2192 b).\n float w = (a.x < b.x) ? 0.5 * h * h : 1.0 - 0.5 * h * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminCircularG(vec3 a, vec3 b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n float w = (a.x < b.x) ? 0.5 * h : 1.0 - 0.5 * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminG(vec3 a, vec3 b, float k) {\n if (uMerge > 0.5) return sminCircularG(a, b, k);\n return sminQuadraticG(a, b, k);\n}";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\n// IQ analytic-derivative gradient noise \u2014 value in .x, ANALYTIC gradient\n// (d/dx, d/dy) in .yz, from one eval. The quintic fade has a continuous 2nd\n// derivative so the gradient is smooth (a cubic smoothstep fade would crease it).\n// (Inigo Quilez, https://iquilezles.org/articles/gradientnoise/.)\nvec3 noised(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n\n // Quintic fade + its derivative.\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n vec2 du = 30.0 * f * f * (f * (f - 2.0) + 1.0);\n\n // Per-corner gradient vectors from the hash (centred to [-1, 1]).\n vec2 ga = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 0.0)), hash21(i + vec2(7.3, 0.0)));\n vec2 gb = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 0.0)), hash21(i + vec2(8.3, 0.0)));\n vec2 gc = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(7.3, 1.0)));\n vec2 gd = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 1.0)), hash21(i + vec2(8.3, 1.0)));\n\n float va = dot(ga, f - vec2(0.0, 0.0));\n float vb = dot(gb, f - vec2(1.0, 0.0));\n float vc = dot(gc, f - vec2(0.0, 1.0));\n float vd = dot(gd, f - vec2(1.0, 1.0));\n\n // Value, remapped to [0,1] so it drops in for the prior valueNoise.\n float n = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd);\n float value = 0.5 + 0.5 * n;\n\n // Analytic gradient (chain rule through the bilinear blend + the fade).\n vec2 grad =\n ga + u.x * (gb - ga) + u.y * (gc - ga) + u.x * u.y * (ga - gb - gc + gd) +\n du * (vec2(u.y, u.x) * (va - vb - vc + vd) + vec2(vb, vc) - va);\n return vec3(value, 0.5 * grad);\n}\n\n// Rotated-octave FBM over the analytic gradient noise: a fixed ~0.5 rad 2x2\n// rotation between octaves breaks the axis-aligned banding. The rotation CONSTANT\n// is spliced from the shared chunk (AV.W2 \u2014 the one FBM_ROT); the loops below\n// stay blob-local (param octaves +
|
|
2
|
-
export declare const METABALL_EDGE_NOISE_POST_GLSL
|
|
1
|
+
export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\n// IQ analytic-derivative gradient noise \u2014 value in .x, ANALYTIC gradient\n// (d/dx, d/dy) in .yz, from one eval. The quintic fade has a continuous 2nd\n// derivative so the gradient is smooth (a cubic smoothstep fade would crease it).\n// (Inigo Quilez, https://iquilezles.org/articles/gradientnoise/.)\nvec3 noised(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n\n // Quintic fade + its derivative.\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n vec2 du = 30.0 * f * f * (f * (f - 2.0) + 1.0);\n\n // Per-corner gradient vectors from the hash (centred to [-1, 1]).\n vec2 ga = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 0.0)), hash21(i + vec2(7.3, 0.0)));\n vec2 gb = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 0.0)), hash21(i + vec2(8.3, 0.0)));\n vec2 gc = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(7.3, 1.0)));\n vec2 gd = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 1.0)), hash21(i + vec2(8.3, 1.0)));\n\n float va = dot(ga, f - vec2(0.0, 0.0));\n float vb = dot(gb, f - vec2(1.0, 0.0));\n float vc = dot(gc, f - vec2(0.0, 1.0));\n float vd = dot(gd, f - vec2(1.0, 1.0));\n\n // Value, remapped to [0,1] so it drops in for the prior valueNoise.\n float n = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd);\n float value = 0.5 + 0.5 * n;\n\n // Analytic gradient (chain rule through the bilinear blend + the fade).\n vec2 grad =\n ga + u.x * (gb - ga) + u.y * (gc - ga) + u.x * u.y * (ga - gb - gc + gd) +\n du * (vec2(u.y, u.x) * (va - vb - vc + vd) + vec2(vb, vc) - va);\n return vec3(value, 0.5 * grad);\n}\n\n// Rotated-octave FBM over the analytic gradient noise: a fixed ~0.5 rad 2x2\n// rotation between octaves breaks the axis-aligned banding. The rotation CONSTANT\n// is spliced from the shared chunk (AV.W2 \u2014 the one FBM_ROT); the loops below\n// stay blob-local (param octaves + the LIQUID lacunarity/persistence, per \u00A73a).";
|
|
2
|
+
export declare const METABALL_EDGE_NOISE_POST_GLSL: string;
|
|
@@ -2,6 +2,13 @@ import type { InjectionKey } from "vue";
|
|
|
2
2
|
export type BlobMood = "idle" | "happy" | "curious" | "sleepy" | "excited";
|
|
3
3
|
/** Smin merge variant — `quadratic` (cheap, creased) | `circular` (rounder menisci). */
|
|
4
4
|
export type BlobMerge = "quadratic" | "circular";
|
|
5
|
+
/**
|
|
6
|
+
* Render-quality axis (AX.W16) — `full` (default) renders the metaball pass at the
|
|
7
|
+
* clamped DPR; `half` renders the backing store at HALF resolution and lets the
|
|
8
|
+
* browser bilinear-upsample on composite (~4× fragment savings for weak GPUs — the
|
|
9
|
+
* blob is the ideal candidate: the soft FBM/AA edge hides the interpolation).
|
|
10
|
+
*/
|
|
11
|
+
export type BlobQuality = "full" | "half";
|
|
5
12
|
export interface MoodParams {
|
|
6
13
|
orbitSpeedScale: number;
|
|
7
14
|
wobbleScale: number;
|
|
@@ -55,6 +62,7 @@ export interface BlobConfig {
|
|
|
55
62
|
satelliteCount: number;
|
|
56
63
|
satelliteRadius: number;
|
|
57
64
|
orbitRadius: number;
|
|
65
|
+
quality: BlobQuality;
|
|
58
66
|
tempo: number;
|
|
59
67
|
smoothK: number;
|
|
60
68
|
/** Smin merge variant — `quadratic` (default) | `circular` (rounder menisci). */
|