vireuikit 0.4.0 → 0.6.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/NOTICE +2 -5
- package/README.md +54 -79
- package/dist/a11y-D3SS74I3.d.cts +25 -0
- package/dist/a11y-D3SS74I3.d.ts +25 -0
- package/dist/chunk-I3BD3XGC.js +392 -0
- package/dist/chunk-I3BD3XGC.js.map +1 -0
- package/dist/index.cjs +226 -1137
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +115 -92
- package/dist/index.d.ts +115 -92
- package/dist/index.js +1 -186
- package/dist/index.js.map +1 -1
- package/dist/web.cjs +826 -0
- package/dist/web.cjs.map +1 -0
- package/dist/web.d.cts +27 -0
- package/dist/web.d.ts +27 -0
- package/dist/web.js +567 -0
- package/dist/web.js.map +1 -0
- package/package.json +16 -16
- package/dist/chunk-VY22O2II.js +0 -1148
- package/dist/chunk-VY22O2II.js.map +0 -1
- package/dist/dynamics-DqGk_f1n.d.cts +0 -415
- package/dist/dynamics-DqGk_f1n.d.ts +0 -415
- package/dist/web/index.cjs +0 -1865
- package/dist/web/index.cjs.map +0 -1
- package/dist/web/index.d.cts +0 -152
- package/dist/web/index.d.ts +0 -152
- package/dist/web/index.js +0 -899
- package/dist/web/index.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
export { A as A11Y_NONE, a as A11yMode, b as A11yOverride, P as Presentation, S as Surface, p as presentationFor, r as resolveA11y, s as sameA11y } from './a11y-D3SS74I3.cjs';
|
|
1
2
|
import { VireGlassMaterial, VireGlassGeometry, VireGlassMorph } from 'vireglass';
|
|
2
|
-
import { V as VireUIKitMediumChannel, a as VireUIKitMediumLight } from './dynamics-DqGk_f1n.cjs';
|
|
3
|
-
export { M as MEDIUM_ALPHA_BURST_RAYS, b as MEDIUM_ALPHA_RAY_LENGTH_SCALE, c as MEDIUM_DEFAULTS, d as MEDIUM_DEFAULT_CELL_PX, e as MEDIUM_DEFAULT_LIGHTS, f as MEDIUM_DRIFT_TURBULENCE, g as MEDIUM_EMISSION_BEATS, h as MEDIUM_EMISSION_PROBABILITY, i as MEDIUM_MAX_LIGHTS, j as MEDIUM_MIN_EMISSION_INTERVAL, k as MEDIUM_NATURAL_INTERVAL, l as MEDIUM_NATURAL_JITTER, m as MEDIUM_PLAYING_TURBULENCE_RANGE, n as MEDIUM_PROBE_FLOOR_PX, o as MEDIUM_SENSITIVE_BOTTOM, p as MEDIUM_SENSITIVE_TOP, q as MEDIUM_TRACK_DEPTH_INTENSITY_RANGE, r as MEDIUM_TRACK_DEPTH_WIDTH_RANGE, s as MEDIUM_TRACK_LAYER_BURST_ACCENT, t as MEDIUM_TRACK_LAYER_BURST_SPREAD, u as MEDIUM_TRACK_LAYER_CURL_PUSH, v as MEDIUM_TRACK_LAYER_FADE_GAMMA, w as MEDIUM_TRACK_LAYER_GRAVITY_SAG, x as MEDIUM_TRACK_LAYER_LIFE_SECONDS, y as MEDIUM_TRACK_LAYER_LOOK, z as MEDIUM_TRACK_LAYER_MAX_TRACKS, A as MEDIUM_TRACK_PRESETS, B as MEDIUM_TURBULENCE_TAU, C as VireUIKitMediumDynamics, D as VireUIKitMediumDynamicsFrame, E as VireUIKitMediumDynamicsInput, F as VireUIKitMediumEmission, G as VireUIKitMediumParams, H as VireUIKitMediumPlaybackState, I as VireUIKitMediumTrackPreset, J as VireUIKitMediumTrackPresetName, K as VireUIKitTrackLayerLook, L as applyTrackDepth, N as createMediumDynamics, O as depthFarOffsetPx, P as wrappedDistanceFromZero } from './dynamics-DqGk_f1n.cjs';
|
|
4
3
|
|
|
5
4
|
type VireUIKitAtomKind = 'button' | 'iconButton' | 'switch' | 'slider' | 'segment' | 'chip' | 'field' | 'menu';
|
|
6
5
|
/** Hover and focus don't exist everywhere: touch has neither. The atom accepts them, but has to
|
|
@@ -29,6 +28,80 @@ declare function atomMaterial(base: VireGlassMaterial, kind: VireUIKitAtomKind,
|
|
|
29
28
|
/** Whether every field on the atom matches rest — lets a client skip redraws for states its own
|
|
30
29
|
* input can never produce (hover on touch, focus on Android). */
|
|
31
30
|
declare function atomAtRest(state: VireUIKitAtomState): boolean;
|
|
31
|
+
/** The veil over the backdrop: the surroundings' colour, `white` of it swapped for white, lifted by `lift` in OKLab lightness. */
|
|
32
|
+
type AtomBody = {
|
|
33
|
+
alpha: number;
|
|
34
|
+
white: number;
|
|
35
|
+
lift: number;
|
|
36
|
+
};
|
|
37
|
+
/** The body for a state; reduced transparency raises it to the density `vireglass` asks of the glass in that mode. */
|
|
38
|
+
declare function atomBody(base: VireGlassMaterial, state?: VireUIKitAtomState, frost?: boolean): AtomBody;
|
|
39
|
+
|
|
40
|
+
type FocusChange = {
|
|
41
|
+
type: 'focus';
|
|
42
|
+
visible: boolean;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'blur';
|
|
45
|
+
};
|
|
46
|
+
declare function stepFocus(event: FocusChange): boolean;
|
|
47
|
+
|
|
48
|
+
type HoverChange = {
|
|
49
|
+
type: 'enter';
|
|
50
|
+
} | {
|
|
51
|
+
type: 'leave';
|
|
52
|
+
};
|
|
53
|
+
declare function stepHover(event: HoverChange, canHover: boolean): boolean;
|
|
54
|
+
|
|
55
|
+
type PressSource = 'pointer' | 'keyboard';
|
|
56
|
+
type PressState = {
|
|
57
|
+
by: PressSource | null;
|
|
58
|
+
};
|
|
59
|
+
type PressEvent = {
|
|
60
|
+
type: 'down';
|
|
61
|
+
source: PressSource;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'up';
|
|
64
|
+
source: PressSource;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'cancel';
|
|
67
|
+
} | {
|
|
68
|
+
type: 'leave';
|
|
69
|
+
};
|
|
70
|
+
declare const PRESS_IDLE: PressState;
|
|
71
|
+
type PressStep = {
|
|
72
|
+
state: PressState;
|
|
73
|
+
activated: boolean;
|
|
74
|
+
};
|
|
75
|
+
declare function stepPress(state: PressState, event: PressEvent, enabled: boolean): PressStep;
|
|
76
|
+
|
|
77
|
+
type InputCaps = {
|
|
78
|
+
hover: boolean;
|
|
79
|
+
};
|
|
80
|
+
declare const TOUCH_INPUT: InputCaps;
|
|
81
|
+
declare const POINTER_INPUT: InputCaps;
|
|
82
|
+
type ControlState = {
|
|
83
|
+
press: PressState;
|
|
84
|
+
hovered: boolean;
|
|
85
|
+
focused: boolean;
|
|
86
|
+
disabled: boolean;
|
|
87
|
+
};
|
|
88
|
+
declare const CONTROL_IDLE: ControlState;
|
|
89
|
+
type ControlEvent = PressEvent | HoverChange | FocusChange | {
|
|
90
|
+
type: 'disable';
|
|
91
|
+
disabled: boolean;
|
|
92
|
+
};
|
|
93
|
+
type ControlStep = {
|
|
94
|
+
state: ControlState;
|
|
95
|
+
activated: boolean;
|
|
96
|
+
};
|
|
97
|
+
declare function stepControl(state: ControlState, event: ControlEvent, caps: InputCaps): ControlStep;
|
|
98
|
+
type ControlTargets = {
|
|
99
|
+
pressed: number;
|
|
100
|
+
hovered: number;
|
|
101
|
+
focus: number;
|
|
102
|
+
disabled: boolean;
|
|
103
|
+
};
|
|
104
|
+
declare function controlTargets(state: ControlState): ControlTargets;
|
|
32
105
|
|
|
33
106
|
/** A spring with `response`-second settle time; `damping` < 1 overshoots. `instant` skips
|
|
34
107
|
* integration entirely, for reduced motion. */
|
|
@@ -100,97 +173,47 @@ declare const DEFAULT_GROWTH_TIMING: GrowthTiming;
|
|
|
100
173
|
* and no defocus phase. */
|
|
101
174
|
declare function stepGrowth(state: GrowthState, dt: number, open: boolean, reduceMotion?: boolean, timing?: GrowthTiming): boolean;
|
|
102
175
|
|
|
103
|
-
type
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
];
|
|
108
|
-
declare const LINEAR_TO_LMS: Mat3;
|
|
109
|
-
declare const LMS_TO_OKLAB: Mat3;
|
|
110
|
-
declare const OKLAB_TO_LMS: Mat3;
|
|
111
|
-
declare const LMS_TO_LINEAR: Mat3;
|
|
112
|
-
declare const VG_OKLAB_TO_SRGB: string;
|
|
113
|
-
declare function srgbToOklab(rgb: readonly [number, number, number]): readonly [number, number, number];
|
|
114
|
-
/** The inverse direction in JS — the same numbers that go into the shader: only that way does a
|
|
115
|
-
* round-trip test prove the GPU and the CPU compute the same thing. */
|
|
116
|
-
declare function oklabToSrgb(lab: readonly [number, number, number]): readonly [number, number, number];
|
|
117
|
-
|
|
118
|
-
/** The medium's character: one hue, one chroma, one lightness shared by the whole triad. */
|
|
119
|
-
type VireUIKitMediumCharacter = {
|
|
120
|
-
/** Oklch hue, degrees. */
|
|
121
|
-
hue: number;
|
|
122
|
-
/** Oklch chroma. For the initial state, this is the platform tone's own chroma — i.e. the floor. */
|
|
123
|
-
chroma: number;
|
|
124
|
-
/** Oklab lightness, shared across every species: unevenly bright tones read as separate patches
|
|
125
|
-
* rather than one medium. */
|
|
126
|
-
lightness: number;
|
|
176
|
+
type ControlVisual = {
|
|
177
|
+
pressed: Spring;
|
|
178
|
+
hovered: Spring;
|
|
179
|
+
focus: Spring;
|
|
127
180
|
};
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
* inside it.
|
|
133
|
-
*/
|
|
134
|
-
declare const MEDIUM_SPECIES_LIGHTNESS = 0.44;
|
|
135
|
-
/** Arc between neighboring species, degrees (a 25–40° spread is the target). */
|
|
136
|
-
declare const MEDIUM_SPECIES_HUE_SPREAD = 32;
|
|
137
|
-
/** Hue, chroma and lightness of an sRGB color — the input for building a family around it. */
|
|
138
|
-
declare function characterOf(color: VireUIKitMediumChannel): VireUIKitMediumCharacter;
|
|
139
|
-
/**
|
|
140
|
-
* A family of three species: `H − Δ`, `H`, `H + Δ`, sharing lightness and chroma.
|
|
141
|
-
*
|
|
142
|
-
* Cover art with no color needs no special case: on a gray cover, chroma arrives as the floor,
|
|
143
|
-
* and the arc collapses on its own — all three species get the same platform tone. That is the
|
|
144
|
-
* initial state, not a branch written for it.
|
|
145
|
-
*/
|
|
146
|
-
declare function speciesFamily(character: VireUIKitMediumCharacter, spreadDeg?: number): readonly [VireUIKitMediumChannel, VireUIKitMediumChannel, VireUIKitMediumChannel];
|
|
147
|
-
/**
|
|
148
|
-
* The initial state: with no cover art, there is nowhere to take a color from. The family is
|
|
149
|
-
* derived from the platform's own tone, so there is no hardcoded triad in the code — neither a
|
|
150
|
-
* placeholder nor an example — only the platform tone and the derivation rule.
|
|
151
|
-
*/
|
|
152
|
-
declare function neutralSpecies(baseColor: VireUIKitMediumChannel): readonly [VireUIKitMediumChannel, VireUIKitMediumChannel, VireUIKitMediumChannel];
|
|
153
|
-
|
|
154
|
-
declare const VG_VALUE_NOISE = "\nfloat vgHash21(float2 p) {\n float h = dot(p, float2(127.1, 311.7));\n return fract(sin(h) * 43758.5453123);\n}\n\nfloat vgValueNoise(float2 p) {\n float2 i = floor(p);\n float2 f = fract(p);\n float a = vgHash21(i);\n float b = vgHash21(i + float2(1.0, 0.0));\n float c = vgHash21(i + float2(0.0, 1.0));\n float d = vgHash21(i + float2(1.0, 1.0));\n float2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y) * 2.0 - 1.0;\n}\n";
|
|
155
|
-
/** The field's phase wraps every this many PHASE units (curlSpeed·seconds), NOT seconds of real
|
|
156
|
-
* time: `web/medium.ts`'s CPU-side accumulator does `phase += dt * curlSpeed`, so the wall-clock
|
|
157
|
-
* wrap period is `MEDIUM_TIME_PERIOD / curlSpeed` — about 2.3h (8333s) at the shipped default
|
|
158
|
-
* (`curlSpeed = 0.12`), verified against that default in `medium-noise-periodicity.test.ts` so
|
|
159
|
-
* this comment can't silently drift out of sync with it. Chosen so every octave rate below times
|
|
160
|
-
* this period lands on an integer — that integer is the z-lattice period `vgValueNoise3Periodic`
|
|
161
|
-
* wraps on, which is what makes the wrap exact rather than merely small. */
|
|
162
|
-
declare const MEDIUM_TIME_PERIOD = 1000;
|
|
163
|
-
declare const VG_CURL_NOISE: string;
|
|
164
|
-
|
|
165
|
-
declare const MEDIUM_SEED_SHADER = "\nuniform float2 u_spot0;\nuniform float2 u_spot1;\nuniform float2 u_spot2;\nuniform float u_spotRadius;\n\nfloat vgSpot(float2 p, float2 c, float r) {\n float d = length(p - c) / max(r, 1.0);\n return exp(-d * d * 2.0);\n}\n\nhalf4 main(float2 xy) {\n float3 dye = float3(\n vgSpot(xy, u_spot0, u_spotRadius),\n vgSpot(xy, u_spot1, u_spotRadius),\n vgSpot(xy, u_spot2, u_spotRadius)\n );\n return half4(half3(dye), half(1.0));\n}\n";
|
|
181
|
+
declare const createControlVisual: () => ControlVisual;
|
|
182
|
+
declare function stepControlVisual(visual: ControlVisual, dt: number, state: ControlState, instant?: boolean): boolean;
|
|
183
|
+
declare function visualAtomState(visual: ControlVisual, state: ControlState): VireUIKitAtomState;
|
|
184
|
+
declare function settleControlVisual(visual: ControlVisual, state: ControlState): void;
|
|
166
185
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
declare
|
|
174
|
-
declare const MEDIUM_CONDENSATE_REACT_SHADER = "\nuniform shader u_transported;\nuniform shader u_vaporTransported;\nuniform shader u_dye;\nuniform float u_dt;\nuniform float u_condensationRate;\nuniform float u_condensationFloor;\nuniform float u_evaporationRate;\nuniform float u_spreadRate;\nuniform float u_totalScale;\n\nhalf4 main(float2 xy) {\n float prevCondensate = float(u_transported.eval(float2(xy.x, u_transportedSize.y - xy.y)).r);\n float3 vaporAtXy = float3(u_vaporTransported.eval(float2(xy.x, u_vaporTransportedSize.y - xy.y)).rgb);\n float vaporTotal = vaporAtXy.r + vaporAtXy.g + vaporAtXy.b;\n\n float excess = max(0.0, vaporTotal - u_condensationFloor);\n float condensed = excess * (1.0 - exp(-u_condensationRate * u_dt));\n float condKeep = exp(-u_evaporationRate * u_dt);\n float afterReaction = prevCondensate * condKeep + condensed;\n\n // Growth is an Euler step separate from transport: the neighbors are sampled at THIS cell's own\n // xy in the ORIGINAL (pre-transport-this-frame) field u_dye, not the already\n // transported/corrected value. On a non-uniform flow, warping compresses the domain in some\n // places and stretches it in others, and blurring at a warped point stacks those distortions \u2014\n // the error accumulates frame over frame (measured: condensate steadily gained about 5% extra\n // water alongside its own mass growth). Right on the grid, with no warp, the same blur is an\n // honest averaging kernel that conserves the sum on a periodic domain.\n float2 selfSrc = float2(xy.x, u_dyeSize.y - xy.y);\n float n0 = float(u_dye.eval(float2(selfSrc.x + 1.0, selfSrc.y)).r);\n float n1 = float(u_dye.eval(float2(selfSrc.x - 1.0, selfSrc.y)).r);\n float n2 = float(u_dye.eval(float2(selfSrc.x, selfSrc.y - 1.0)).r);\n float n3 = float(u_dye.eval(float2(selfSrc.x, selfSrc.y + 1.0)).r);\n float neighborAvg = (n0 + n1 + n2 + n3) * 0.25;\n float spreadWeight = 1.0 - exp(-u_spreadRate * u_dt);\n float grown = mix(afterReaction, neighborAvg, spreadWeight) * u_totalScale;\n\n return half4(half3(grown, 0.0, 0.0), half(1.0));\n}\n";
|
|
175
|
-
declare const MEDIUM_TRACK_ADVECT_SHADER: string;
|
|
176
|
-
|
|
177
|
-
declare const MEDIUM_COMPOSITE_SHADER: string;
|
|
178
|
-
|
|
179
|
-
declare const MEDIUM_EMIT_SHADER = "\nuniform float2 u_source;\nuniform float2 u_head;\nuniform float u_headWidth;\nuniform float u_tailWidth;\nuniform float u_raggedAmp;\nuniform float u_raggedFreq;\nuniform float u_settle;\nuniform float u_tailDim;\nuniform float u_intensity;\nuniform float u_seed;\n\n\nfloat vgHash21(float2 p) {\n float h = dot(p, float2(127.1, 311.7));\n return fract(sin(h) * 43758.5453123);\n}\n\nfloat vgValueNoise(float2 p) {\n float2 i = floor(p);\n float2 f = fract(p);\n float a = vgHash21(i);\n float b = vgHash21(i + float2(1.0, 0.0));\n float c = vgHash21(i + float2(0.0, 1.0));\n float d = vgHash21(i + float2(1.0, 1.0));\n float2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y) * 2.0 - 1.0;\n}\n\n\nhalf4 main(float2 xy) {\n float2 dir = u_head - u_source;\n float len = max(length(dir), 1.0);\n float2 side = float2(-dir.y, dir.x) / len;\n\n float best = 0.0;\n const int STEPS = 12;\n for (int i = 0; i < STEPS; i++) {\n float s = float(i) / float(STEPS - 1);\n float tailness = 1.0 - s;\n float ragged = u_raggedAmp * tailness * vgValueNoise(float2(s * u_raggedFreq + u_seed, u_seed * 3.7));\n float2 p = mix(u_source, u_head, s) + side * ragged + float2(0.0, u_settle * tailness * tailness);\n float w = max(mix(u_tailWidth, u_headWidth, s), 0.5);\n float amp = mix(u_tailDim, 1.0, s);\n float d = length(xy - p);\n float v = amp * exp(-(d * d) / (2.0 * w * w));\n best = max(best, v);\n }\n\n float3 dye = float3(best * u_intensity);\n return half4(half3(dye), half(1.0));\n}\n";
|
|
180
|
-
|
|
181
|
-
declare const MEDIUM_SHADOW_SHADER = "\nuniform shader u_vapor;\nuniform shader u_condensate;\nuniform float u_condensateGain;\nuniform float2 u_light1Grid;\nuniform float2 u_light2Grid;\nuniform float u_extinction;\n\nfloat vgOpticalDepth(float2 p, float2 lightP) {\n float2 toLight = lightP - p;\n float optical = 0.0;\n for (int i = 1; i <= 24; i++) {\n float2 q = p + toLight * (float(i) / 24.0);\n float inside = step(0.0, q.x) * step(q.x, u_resolution.x) * step(0.0, q.y) * step(q.y, u_resolution.y);\n half4 v = u_vapor.eval(q);\n half4 c = u_condensate.eval(q);\n optical += inside * (float(v.r + v.g + v.b) + float(c.r) * u_condensateGain);\n }\n return optical * length(toLight) / 24.0 / max(u_resolution.y, 1.0);\n}\n\nhalf4 main(float2 xy) {\n float2 p = float2(xy.x, u_resolution.y - xy.y);\n float t1 = exp(-vgOpticalDepth(p, u_light1Grid) * u_extinction);\n float t2 = exp(-vgOpticalDepth(p, u_light2Grid) * u_extinction);\n return half4(half(t1), half(t2), half(0.0), half(1.0));\n}\n";
|
|
186
|
+
type PressResponse = {
|
|
187
|
+
/** Fraction of its own size the body adds at full press. */
|
|
188
|
+
grow: number;
|
|
189
|
+
/** Glyph blur at full press, px. */
|
|
190
|
+
defocus: number;
|
|
191
|
+
};
|
|
192
|
+
declare function pressResponse(kind: VireUIKitAtomKind): PressResponse;
|
|
182
193
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
declare
|
|
194
|
+
type ControlSize = 'touch' | 'small' | 'medium' | 'large' | 'xlarge';
|
|
195
|
+
declare const CONTROL_SIZES: readonly ControlSize[];
|
|
196
|
+
type SizeSpec = {
|
|
197
|
+
/** Body height; an icon button is a square of this side. */
|
|
198
|
+
height: number;
|
|
199
|
+
paddingX: number;
|
|
200
|
+
icon: number;
|
|
201
|
+
radius: number;
|
|
202
|
+
shape: 'capsule' | 'rounded';
|
|
203
|
+
};
|
|
204
|
+
declare const MIN_TOUCH_TARGET_DP = 44;
|
|
205
|
+
declare const MIN_POINTER_TARGET_DP = 24;
|
|
206
|
+
declare const BUTTON_SIZES: Readonly<Record<ControlSize, SizeSpec>>;
|
|
207
|
+
declare function iconButtonSize(size: ControlSize): SizeSpec & {
|
|
208
|
+
width: number;
|
|
209
|
+
};
|
|
210
|
+
declare function nestedRadius(outerRadius: number, inset: number, minimum?: number): number;
|
|
211
|
+
declare function defaultSize(input: {
|
|
212
|
+
touch: boolean;
|
|
213
|
+
}): ControlSize;
|
|
214
|
+
declare function hitSlop(bodyDp: number, minTargetDp: number): number;
|
|
215
|
+
declare function minTarget(input: {
|
|
216
|
+
touch: boolean;
|
|
217
|
+
}): number;
|
|
195
218
|
|
|
196
|
-
export { ATOM_AT_REST,
|
|
219
|
+
export { ATOM_AT_REST, type AtomBody, BUTTON_SIZES, CONTROL_IDLE, CONTROL_SIZES, type ControlEvent, type ControlSize, type ControlState, type ControlStep, type ControlTargets, type ControlVisual, DEFAULT_GROWTH_TIMING, type FocusChange, type GrowthFrame, type GrowthInk, type GrowthPhase, type GrowthPoint, type GrowthShape, type GrowthState, type GrowthTiming, type HoverChange, type InputCaps, MIN_POINTER_TARGET_DP, MIN_TOUCH_TARGET_DP, POINTER_INPUT, PRESS_IDLE, type PressEvent, type PressResponse, type PressSource, type PressState, type PressStep, type SizeSpec, type Spring, TOUCH_INPUT, type VireUIKitAtomKind, type VireUIKitAtomState, atomAtRest, atomBody, atomLift, atomMaterial, controlTargets, createControlVisual, createGrowthState, defaultSize, growthFrame, growthInk, growthPhase, hitSlop, iconButtonSize, minTarget, nestedRadius, pressResponse, settleControlVisual, smoothstep, stepControl, stepControlVisual, stepFocus, stepGrowth, stepHover, stepPress, stepSpring, visualAtomState };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
export { A as A11Y_NONE, a as A11yMode, b as A11yOverride, P as Presentation, S as Surface, p as presentationFor, r as resolveA11y, s as sameA11y } from './a11y-D3SS74I3.js';
|
|
1
2
|
import { VireGlassMaterial, VireGlassGeometry, VireGlassMorph } from 'vireglass';
|
|
2
|
-
import { V as VireUIKitMediumChannel, a as VireUIKitMediumLight } from './dynamics-DqGk_f1n.js';
|
|
3
|
-
export { M as MEDIUM_ALPHA_BURST_RAYS, b as MEDIUM_ALPHA_RAY_LENGTH_SCALE, c as MEDIUM_DEFAULTS, d as MEDIUM_DEFAULT_CELL_PX, e as MEDIUM_DEFAULT_LIGHTS, f as MEDIUM_DRIFT_TURBULENCE, g as MEDIUM_EMISSION_BEATS, h as MEDIUM_EMISSION_PROBABILITY, i as MEDIUM_MAX_LIGHTS, j as MEDIUM_MIN_EMISSION_INTERVAL, k as MEDIUM_NATURAL_INTERVAL, l as MEDIUM_NATURAL_JITTER, m as MEDIUM_PLAYING_TURBULENCE_RANGE, n as MEDIUM_PROBE_FLOOR_PX, o as MEDIUM_SENSITIVE_BOTTOM, p as MEDIUM_SENSITIVE_TOP, q as MEDIUM_TRACK_DEPTH_INTENSITY_RANGE, r as MEDIUM_TRACK_DEPTH_WIDTH_RANGE, s as MEDIUM_TRACK_LAYER_BURST_ACCENT, t as MEDIUM_TRACK_LAYER_BURST_SPREAD, u as MEDIUM_TRACK_LAYER_CURL_PUSH, v as MEDIUM_TRACK_LAYER_FADE_GAMMA, w as MEDIUM_TRACK_LAYER_GRAVITY_SAG, x as MEDIUM_TRACK_LAYER_LIFE_SECONDS, y as MEDIUM_TRACK_LAYER_LOOK, z as MEDIUM_TRACK_LAYER_MAX_TRACKS, A as MEDIUM_TRACK_PRESETS, B as MEDIUM_TURBULENCE_TAU, C as VireUIKitMediumDynamics, D as VireUIKitMediumDynamicsFrame, E as VireUIKitMediumDynamicsInput, F as VireUIKitMediumEmission, G as VireUIKitMediumParams, H as VireUIKitMediumPlaybackState, I as VireUIKitMediumTrackPreset, J as VireUIKitMediumTrackPresetName, K as VireUIKitTrackLayerLook, L as applyTrackDepth, N as createMediumDynamics, O as depthFarOffsetPx, P as wrappedDistanceFromZero } from './dynamics-DqGk_f1n.js';
|
|
4
3
|
|
|
5
4
|
type VireUIKitAtomKind = 'button' | 'iconButton' | 'switch' | 'slider' | 'segment' | 'chip' | 'field' | 'menu';
|
|
6
5
|
/** Hover and focus don't exist everywhere: touch has neither. The atom accepts them, but has to
|
|
@@ -29,6 +28,80 @@ declare function atomMaterial(base: VireGlassMaterial, kind: VireUIKitAtomKind,
|
|
|
29
28
|
/** Whether every field on the atom matches rest — lets a client skip redraws for states its own
|
|
30
29
|
* input can never produce (hover on touch, focus on Android). */
|
|
31
30
|
declare function atomAtRest(state: VireUIKitAtomState): boolean;
|
|
31
|
+
/** The veil over the backdrop: the surroundings' colour, `white` of it swapped for white, lifted by `lift` in OKLab lightness. */
|
|
32
|
+
type AtomBody = {
|
|
33
|
+
alpha: number;
|
|
34
|
+
white: number;
|
|
35
|
+
lift: number;
|
|
36
|
+
};
|
|
37
|
+
/** The body for a state; reduced transparency raises it to the density `vireglass` asks of the glass in that mode. */
|
|
38
|
+
declare function atomBody(base: VireGlassMaterial, state?: VireUIKitAtomState, frost?: boolean): AtomBody;
|
|
39
|
+
|
|
40
|
+
type FocusChange = {
|
|
41
|
+
type: 'focus';
|
|
42
|
+
visible: boolean;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'blur';
|
|
45
|
+
};
|
|
46
|
+
declare function stepFocus(event: FocusChange): boolean;
|
|
47
|
+
|
|
48
|
+
type HoverChange = {
|
|
49
|
+
type: 'enter';
|
|
50
|
+
} | {
|
|
51
|
+
type: 'leave';
|
|
52
|
+
};
|
|
53
|
+
declare function stepHover(event: HoverChange, canHover: boolean): boolean;
|
|
54
|
+
|
|
55
|
+
type PressSource = 'pointer' | 'keyboard';
|
|
56
|
+
type PressState = {
|
|
57
|
+
by: PressSource | null;
|
|
58
|
+
};
|
|
59
|
+
type PressEvent = {
|
|
60
|
+
type: 'down';
|
|
61
|
+
source: PressSource;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'up';
|
|
64
|
+
source: PressSource;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'cancel';
|
|
67
|
+
} | {
|
|
68
|
+
type: 'leave';
|
|
69
|
+
};
|
|
70
|
+
declare const PRESS_IDLE: PressState;
|
|
71
|
+
type PressStep = {
|
|
72
|
+
state: PressState;
|
|
73
|
+
activated: boolean;
|
|
74
|
+
};
|
|
75
|
+
declare function stepPress(state: PressState, event: PressEvent, enabled: boolean): PressStep;
|
|
76
|
+
|
|
77
|
+
type InputCaps = {
|
|
78
|
+
hover: boolean;
|
|
79
|
+
};
|
|
80
|
+
declare const TOUCH_INPUT: InputCaps;
|
|
81
|
+
declare const POINTER_INPUT: InputCaps;
|
|
82
|
+
type ControlState = {
|
|
83
|
+
press: PressState;
|
|
84
|
+
hovered: boolean;
|
|
85
|
+
focused: boolean;
|
|
86
|
+
disabled: boolean;
|
|
87
|
+
};
|
|
88
|
+
declare const CONTROL_IDLE: ControlState;
|
|
89
|
+
type ControlEvent = PressEvent | HoverChange | FocusChange | {
|
|
90
|
+
type: 'disable';
|
|
91
|
+
disabled: boolean;
|
|
92
|
+
};
|
|
93
|
+
type ControlStep = {
|
|
94
|
+
state: ControlState;
|
|
95
|
+
activated: boolean;
|
|
96
|
+
};
|
|
97
|
+
declare function stepControl(state: ControlState, event: ControlEvent, caps: InputCaps): ControlStep;
|
|
98
|
+
type ControlTargets = {
|
|
99
|
+
pressed: number;
|
|
100
|
+
hovered: number;
|
|
101
|
+
focus: number;
|
|
102
|
+
disabled: boolean;
|
|
103
|
+
};
|
|
104
|
+
declare function controlTargets(state: ControlState): ControlTargets;
|
|
32
105
|
|
|
33
106
|
/** A spring with `response`-second settle time; `damping` < 1 overshoots. `instant` skips
|
|
34
107
|
* integration entirely, for reduced motion. */
|
|
@@ -100,97 +173,47 @@ declare const DEFAULT_GROWTH_TIMING: GrowthTiming;
|
|
|
100
173
|
* and no defocus phase. */
|
|
101
174
|
declare function stepGrowth(state: GrowthState, dt: number, open: boolean, reduceMotion?: boolean, timing?: GrowthTiming): boolean;
|
|
102
175
|
|
|
103
|
-
type
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
];
|
|
108
|
-
declare const LINEAR_TO_LMS: Mat3;
|
|
109
|
-
declare const LMS_TO_OKLAB: Mat3;
|
|
110
|
-
declare const OKLAB_TO_LMS: Mat3;
|
|
111
|
-
declare const LMS_TO_LINEAR: Mat3;
|
|
112
|
-
declare const VG_OKLAB_TO_SRGB: string;
|
|
113
|
-
declare function srgbToOklab(rgb: readonly [number, number, number]): readonly [number, number, number];
|
|
114
|
-
/** The inverse direction in JS — the same numbers that go into the shader: only that way does a
|
|
115
|
-
* round-trip test prove the GPU and the CPU compute the same thing. */
|
|
116
|
-
declare function oklabToSrgb(lab: readonly [number, number, number]): readonly [number, number, number];
|
|
117
|
-
|
|
118
|
-
/** The medium's character: one hue, one chroma, one lightness shared by the whole triad. */
|
|
119
|
-
type VireUIKitMediumCharacter = {
|
|
120
|
-
/** Oklch hue, degrees. */
|
|
121
|
-
hue: number;
|
|
122
|
-
/** Oklch chroma. For the initial state, this is the platform tone's own chroma — i.e. the floor. */
|
|
123
|
-
chroma: number;
|
|
124
|
-
/** Oklab lightness, shared across every species: unevenly bright tones read as separate patches
|
|
125
|
-
* rather than one medium. */
|
|
126
|
-
lightness: number;
|
|
176
|
+
type ControlVisual = {
|
|
177
|
+
pressed: Spring;
|
|
178
|
+
hovered: Spring;
|
|
179
|
+
focus: Spring;
|
|
127
180
|
};
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
* inside it.
|
|
133
|
-
*/
|
|
134
|
-
declare const MEDIUM_SPECIES_LIGHTNESS = 0.44;
|
|
135
|
-
/** Arc between neighboring species, degrees (a 25–40° spread is the target). */
|
|
136
|
-
declare const MEDIUM_SPECIES_HUE_SPREAD = 32;
|
|
137
|
-
/** Hue, chroma and lightness of an sRGB color — the input for building a family around it. */
|
|
138
|
-
declare function characterOf(color: VireUIKitMediumChannel): VireUIKitMediumCharacter;
|
|
139
|
-
/**
|
|
140
|
-
* A family of three species: `H − Δ`, `H`, `H + Δ`, sharing lightness and chroma.
|
|
141
|
-
*
|
|
142
|
-
* Cover art with no color needs no special case: on a gray cover, chroma arrives as the floor,
|
|
143
|
-
* and the arc collapses on its own — all three species get the same platform tone. That is the
|
|
144
|
-
* initial state, not a branch written for it.
|
|
145
|
-
*/
|
|
146
|
-
declare function speciesFamily(character: VireUIKitMediumCharacter, spreadDeg?: number): readonly [VireUIKitMediumChannel, VireUIKitMediumChannel, VireUIKitMediumChannel];
|
|
147
|
-
/**
|
|
148
|
-
* The initial state: with no cover art, there is nowhere to take a color from. The family is
|
|
149
|
-
* derived from the platform's own tone, so there is no hardcoded triad in the code — neither a
|
|
150
|
-
* placeholder nor an example — only the platform tone and the derivation rule.
|
|
151
|
-
*/
|
|
152
|
-
declare function neutralSpecies(baseColor: VireUIKitMediumChannel): readonly [VireUIKitMediumChannel, VireUIKitMediumChannel, VireUIKitMediumChannel];
|
|
153
|
-
|
|
154
|
-
declare const VG_VALUE_NOISE = "\nfloat vgHash21(float2 p) {\n float h = dot(p, float2(127.1, 311.7));\n return fract(sin(h) * 43758.5453123);\n}\n\nfloat vgValueNoise(float2 p) {\n float2 i = floor(p);\n float2 f = fract(p);\n float a = vgHash21(i);\n float b = vgHash21(i + float2(1.0, 0.0));\n float c = vgHash21(i + float2(0.0, 1.0));\n float d = vgHash21(i + float2(1.0, 1.0));\n float2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y) * 2.0 - 1.0;\n}\n";
|
|
155
|
-
/** The field's phase wraps every this many PHASE units (curlSpeed·seconds), NOT seconds of real
|
|
156
|
-
* time: `web/medium.ts`'s CPU-side accumulator does `phase += dt * curlSpeed`, so the wall-clock
|
|
157
|
-
* wrap period is `MEDIUM_TIME_PERIOD / curlSpeed` — about 2.3h (8333s) at the shipped default
|
|
158
|
-
* (`curlSpeed = 0.12`), verified against that default in `medium-noise-periodicity.test.ts` so
|
|
159
|
-
* this comment can't silently drift out of sync with it. Chosen so every octave rate below times
|
|
160
|
-
* this period lands on an integer — that integer is the z-lattice period `vgValueNoise3Periodic`
|
|
161
|
-
* wraps on, which is what makes the wrap exact rather than merely small. */
|
|
162
|
-
declare const MEDIUM_TIME_PERIOD = 1000;
|
|
163
|
-
declare const VG_CURL_NOISE: string;
|
|
164
|
-
|
|
165
|
-
declare const MEDIUM_SEED_SHADER = "\nuniform float2 u_spot0;\nuniform float2 u_spot1;\nuniform float2 u_spot2;\nuniform float u_spotRadius;\n\nfloat vgSpot(float2 p, float2 c, float r) {\n float d = length(p - c) / max(r, 1.0);\n return exp(-d * d * 2.0);\n}\n\nhalf4 main(float2 xy) {\n float3 dye = float3(\n vgSpot(xy, u_spot0, u_spotRadius),\n vgSpot(xy, u_spot1, u_spotRadius),\n vgSpot(xy, u_spot2, u_spotRadius)\n );\n return half4(half3(dye), half(1.0));\n}\n";
|
|
181
|
+
declare const createControlVisual: () => ControlVisual;
|
|
182
|
+
declare function stepControlVisual(visual: ControlVisual, dt: number, state: ControlState, instant?: boolean): boolean;
|
|
183
|
+
declare function visualAtomState(visual: ControlVisual, state: ControlState): VireUIKitAtomState;
|
|
184
|
+
declare function settleControlVisual(visual: ControlVisual, state: ControlState): void;
|
|
166
185
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
declare
|
|
174
|
-
declare const MEDIUM_CONDENSATE_REACT_SHADER = "\nuniform shader u_transported;\nuniform shader u_vaporTransported;\nuniform shader u_dye;\nuniform float u_dt;\nuniform float u_condensationRate;\nuniform float u_condensationFloor;\nuniform float u_evaporationRate;\nuniform float u_spreadRate;\nuniform float u_totalScale;\n\nhalf4 main(float2 xy) {\n float prevCondensate = float(u_transported.eval(float2(xy.x, u_transportedSize.y - xy.y)).r);\n float3 vaporAtXy = float3(u_vaporTransported.eval(float2(xy.x, u_vaporTransportedSize.y - xy.y)).rgb);\n float vaporTotal = vaporAtXy.r + vaporAtXy.g + vaporAtXy.b;\n\n float excess = max(0.0, vaporTotal - u_condensationFloor);\n float condensed = excess * (1.0 - exp(-u_condensationRate * u_dt));\n float condKeep = exp(-u_evaporationRate * u_dt);\n float afterReaction = prevCondensate * condKeep + condensed;\n\n // Growth is an Euler step separate from transport: the neighbors are sampled at THIS cell's own\n // xy in the ORIGINAL (pre-transport-this-frame) field u_dye, not the already\n // transported/corrected value. On a non-uniform flow, warping compresses the domain in some\n // places and stretches it in others, and blurring at a warped point stacks those distortions \u2014\n // the error accumulates frame over frame (measured: condensate steadily gained about 5% extra\n // water alongside its own mass growth). Right on the grid, with no warp, the same blur is an\n // honest averaging kernel that conserves the sum on a periodic domain.\n float2 selfSrc = float2(xy.x, u_dyeSize.y - xy.y);\n float n0 = float(u_dye.eval(float2(selfSrc.x + 1.0, selfSrc.y)).r);\n float n1 = float(u_dye.eval(float2(selfSrc.x - 1.0, selfSrc.y)).r);\n float n2 = float(u_dye.eval(float2(selfSrc.x, selfSrc.y - 1.0)).r);\n float n3 = float(u_dye.eval(float2(selfSrc.x, selfSrc.y + 1.0)).r);\n float neighborAvg = (n0 + n1 + n2 + n3) * 0.25;\n float spreadWeight = 1.0 - exp(-u_spreadRate * u_dt);\n float grown = mix(afterReaction, neighborAvg, spreadWeight) * u_totalScale;\n\n return half4(half3(grown, 0.0, 0.0), half(1.0));\n}\n";
|
|
175
|
-
declare const MEDIUM_TRACK_ADVECT_SHADER: string;
|
|
176
|
-
|
|
177
|
-
declare const MEDIUM_COMPOSITE_SHADER: string;
|
|
178
|
-
|
|
179
|
-
declare const MEDIUM_EMIT_SHADER = "\nuniform float2 u_source;\nuniform float2 u_head;\nuniform float u_headWidth;\nuniform float u_tailWidth;\nuniform float u_raggedAmp;\nuniform float u_raggedFreq;\nuniform float u_settle;\nuniform float u_tailDim;\nuniform float u_intensity;\nuniform float u_seed;\n\n\nfloat vgHash21(float2 p) {\n float h = dot(p, float2(127.1, 311.7));\n return fract(sin(h) * 43758.5453123);\n}\n\nfloat vgValueNoise(float2 p) {\n float2 i = floor(p);\n float2 f = fract(p);\n float a = vgHash21(i);\n float b = vgHash21(i + float2(1.0, 0.0));\n float c = vgHash21(i + float2(0.0, 1.0));\n float d = vgHash21(i + float2(1.0, 1.0));\n float2 u = f * f * (3.0 - 2.0 * f);\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y) * 2.0 - 1.0;\n}\n\n\nhalf4 main(float2 xy) {\n float2 dir = u_head - u_source;\n float len = max(length(dir), 1.0);\n float2 side = float2(-dir.y, dir.x) / len;\n\n float best = 0.0;\n const int STEPS = 12;\n for (int i = 0; i < STEPS; i++) {\n float s = float(i) / float(STEPS - 1);\n float tailness = 1.0 - s;\n float ragged = u_raggedAmp * tailness * vgValueNoise(float2(s * u_raggedFreq + u_seed, u_seed * 3.7));\n float2 p = mix(u_source, u_head, s) + side * ragged + float2(0.0, u_settle * tailness * tailness);\n float w = max(mix(u_tailWidth, u_headWidth, s), 0.5);\n float amp = mix(u_tailDim, 1.0, s);\n float d = length(xy - p);\n float v = amp * exp(-(d * d) / (2.0 * w * w));\n best = max(best, v);\n }\n\n float3 dye = float3(best * u_intensity);\n return half4(half3(dye), half(1.0));\n}\n";
|
|
180
|
-
|
|
181
|
-
declare const MEDIUM_SHADOW_SHADER = "\nuniform shader u_vapor;\nuniform shader u_condensate;\nuniform float u_condensateGain;\nuniform float2 u_light1Grid;\nuniform float2 u_light2Grid;\nuniform float u_extinction;\n\nfloat vgOpticalDepth(float2 p, float2 lightP) {\n float2 toLight = lightP - p;\n float optical = 0.0;\n for (int i = 1; i <= 24; i++) {\n float2 q = p + toLight * (float(i) / 24.0);\n float inside = step(0.0, q.x) * step(q.x, u_resolution.x) * step(0.0, q.y) * step(q.y, u_resolution.y);\n half4 v = u_vapor.eval(q);\n half4 c = u_condensate.eval(q);\n optical += inside * (float(v.r + v.g + v.b) + float(c.r) * u_condensateGain);\n }\n return optical * length(toLight) / 24.0 / max(u_resolution.y, 1.0);\n}\n\nhalf4 main(float2 xy) {\n float2 p = float2(xy.x, u_resolution.y - xy.y);\n float t1 = exp(-vgOpticalDepth(p, u_light1Grid) * u_extinction);\n float t2 = exp(-vgOpticalDepth(p, u_light2Grid) * u_extinction);\n return half4(half(t1), half(t2), half(0.0), half(1.0));\n}\n";
|
|
186
|
+
type PressResponse = {
|
|
187
|
+
/** Fraction of its own size the body adds at full press. */
|
|
188
|
+
grow: number;
|
|
189
|
+
/** Glyph blur at full press, px. */
|
|
190
|
+
defocus: number;
|
|
191
|
+
};
|
|
192
|
+
declare function pressResponse(kind: VireUIKitAtomKind): PressResponse;
|
|
182
193
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
declare
|
|
194
|
+
type ControlSize = 'touch' | 'small' | 'medium' | 'large' | 'xlarge';
|
|
195
|
+
declare const CONTROL_SIZES: readonly ControlSize[];
|
|
196
|
+
type SizeSpec = {
|
|
197
|
+
/** Body height; an icon button is a square of this side. */
|
|
198
|
+
height: number;
|
|
199
|
+
paddingX: number;
|
|
200
|
+
icon: number;
|
|
201
|
+
radius: number;
|
|
202
|
+
shape: 'capsule' | 'rounded';
|
|
203
|
+
};
|
|
204
|
+
declare const MIN_TOUCH_TARGET_DP = 44;
|
|
205
|
+
declare const MIN_POINTER_TARGET_DP = 24;
|
|
206
|
+
declare const BUTTON_SIZES: Readonly<Record<ControlSize, SizeSpec>>;
|
|
207
|
+
declare function iconButtonSize(size: ControlSize): SizeSpec & {
|
|
208
|
+
width: number;
|
|
209
|
+
};
|
|
210
|
+
declare function nestedRadius(outerRadius: number, inset: number, minimum?: number): number;
|
|
211
|
+
declare function defaultSize(input: {
|
|
212
|
+
touch: boolean;
|
|
213
|
+
}): ControlSize;
|
|
214
|
+
declare function hitSlop(bodyDp: number, minTargetDp: number): number;
|
|
215
|
+
declare function minTarget(input: {
|
|
216
|
+
touch: boolean;
|
|
217
|
+
}): number;
|
|
195
218
|
|
|
196
|
-
export { ATOM_AT_REST,
|
|
219
|
+
export { ATOM_AT_REST, type AtomBody, BUTTON_SIZES, CONTROL_IDLE, CONTROL_SIZES, type ControlEvent, type ControlSize, type ControlState, type ControlStep, type ControlTargets, type ControlVisual, DEFAULT_GROWTH_TIMING, type FocusChange, type GrowthFrame, type GrowthInk, type GrowthPhase, type GrowthPoint, type GrowthShape, type GrowthState, type GrowthTiming, type HoverChange, type InputCaps, MIN_POINTER_TARGET_DP, MIN_TOUCH_TARGET_DP, POINTER_INPUT, PRESS_IDLE, type PressEvent, type PressResponse, type PressSource, type PressState, type PressStep, type SizeSpec, type Spring, TOUCH_INPUT, type VireUIKitAtomKind, type VireUIKitAtomState, atomAtRest, atomBody, atomLift, atomMaterial, controlTargets, createControlVisual, createGrowthState, defaultSize, growthFrame, growthInk, growthPhase, hitSlop, iconButtonSize, minTarget, nestedRadius, pressResponse, settleControlVisual, smoothstep, stepControl, stepControlVisual, stepFocus, stepGrowth, stepHover, stepPress, stepSpring, visualAtomState };
|