vireuikit 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  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
2
 
5
3
  type VireUIKitAtomKind = 'button' | 'iconButton' | 'switch' | 'slider' | 'segment' | 'chip' | 'field' | 'menu';
6
4
  /** Hover and focus don't exist everywhere: touch has neither. The atom accepts them, but has to
@@ -100,97 +98,4 @@ declare const DEFAULT_GROWTH_TIMING: GrowthTiming;
100
98
  * and no defocus phase. */
101
99
  declare function stepGrowth(state: GrowthState, dt: number, open: boolean, reduceMotion?: boolean, timing?: GrowthTiming): boolean;
102
100
 
103
- type Mat3 = readonly [
104
- readonly [number, number, number],
105
- readonly [number, number, number],
106
- readonly [number, number, number]
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;
127
- };
128
- /**
129
- * The medium's working lightness. Glass can't be parked on the polarity threshold (0.50…0.62) —
130
- * the material would flip its polarity every frame there — so the medium stays below that band.
131
- * The physical picture is the same either way: the chamber is a dark volume that tracks glow
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";
166
-
167
- declare const MEDIUM_RESAMPLE_SHADER = "\nuniform shader u_src;\n\nhalf4 main(float2 xy) {\n float2 uv = xy / u_resolution;\n float2 src = uv * u_srcSize;\n return u_src.eval(float2(src.x, u_srcSize.y - src.y));\n}\n";
168
-
169
- declare const MEDIUM_VAPOR_FORWARD_SHADER: string;
170
- declare const MEDIUM_CONDENSATE_FORWARD_SHADER: string;
171
- declare const MEDIUM_VAPOR_CORRECT_SHADER: string;
172
- declare const MEDIUM_CONDENSATE_CORRECT_SHADER: string;
173
- declare const MEDIUM_VAPOR_REACT_SHADER = "\nuniform shader u_transported;\nuniform shader u_condensateTransported;\nuniform float u_dt;\nuniform float u_condensationRate;\nuniform float u_condensationFloor;\nuniform float u_evaporationRate;\nuniform float u_totalScale;\n\nhalf4 main(float2 xy) {\n float3 prevVapor = float3(u_transported.eval(float2(xy.x, u_transportedSize.y - xy.y)).rgb);\n float condensateAtXy = float(u_condensateTransported.eval(float2(xy.x, u_condensateTransportedSize.y - xy.y)).r);\n float vaporTotal = prevVapor.r + prevVapor.g + prevVapor.b;\n\n // Only the EXCESS of vapor above the background floor condenses, not any nonzero density \u2014\n // otherwise condensate would exactly retrace the vapor spot's shape (the same outline, or\n // softer from blur), leaving the two phases nowhere to visually diverge: vapor is already soft,\n // and condensate needs to read brighter and sharper than it. The floor concentrates condensate\n // in dense turbulence cores, leaving the sparse vapor around it uncondensed \u2014 that's where the\n // contrast comes from.\n float excess = max(0.0, vaporTotal - u_condensationFloor);\n float condensedAmount = excess * (1.0 - exp(-u_condensationRate * u_dt));\n float lossFraction = vaporTotal > 1e-6 ? condensedAmount / vaporTotal : 0.0;\n float3 afterLoss = prevVapor * (1.0 - lossFraction);\n\n float condKeep = exp(-u_evaporationRate * u_dt);\n float returned = condensateAtXy * (1.0 - condKeep);\n\n // Evaporated water is distributed by the CURRENT vapor proportion \u2014 the condensation/\n // evaporation cycle doesn't shift the hue, water only oscillates between phases (color belongs\n // to vapor).\n float sumAfterLoss = afterLoss.r + afterLoss.g + afterLoss.b;\n float3 hueShare = sumAfterLoss > 1e-6 ? afterLoss / sumAfterLoss : float3(1.0 / 3.0);\n float3 vapor = (afterLoss + hueShare * returned) * u_totalScale;\n return half4(half3(vapor), half(1.0));\n}\n";
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";
182
-
183
- /**
184
- * Builds a light rig from a cover's character: spotlights take one tone each off the family spread
185
- * around the cover's hue (`characterOf`/`MEDIUM_SPECIES_HUE_SPREAD`, the same arc `species.ts` uses
186
- * for vapor), the edge strip only nudges toward it. With no cover, a caller simply doesn't call this
187
- * — `MEDIUM_DEFAULT_LIGHTS` is already the neutral calm state, so there is no "no-cover" branch here
188
- * to keep in sync with it.
189
- */
190
- declare function lightRigForCharacter(character: VireUIKitMediumCharacter, baseLights?: readonly VireUIKitMediumLight[]): readonly VireUIKitMediumLight[];
191
- /** Convenience for callers that only have a cover color (not an already-derived character) — a
192
- * cover-art palette step lands `characterOf` upstream of this in the product; a lab stand parsing
193
- * `?cover=<hue>,<chroma>` from the URL builds the character directly instead. */
194
- declare function lightRigForCover(cover: VireUIKitMediumChannel, baseLights?: readonly VireUIKitMediumLight[]): readonly VireUIKitMediumLight[];
195
-
196
- export { ATOM_AT_REST, DEFAULT_GROWTH_TIMING, type GrowthFrame, type GrowthInk, type GrowthPhase, type GrowthPoint, type GrowthShape, type GrowthState, type GrowthTiming, LINEAR_TO_LMS, LMS_TO_LINEAR, LMS_TO_OKLAB, MEDIUM_COMPOSITE_SHADER, MEDIUM_CONDENSATE_CORRECT_SHADER, MEDIUM_CONDENSATE_FORWARD_SHADER, MEDIUM_CONDENSATE_REACT_SHADER, MEDIUM_EMIT_SHADER, MEDIUM_RESAMPLE_SHADER, MEDIUM_SEED_SHADER, MEDIUM_SHADOW_SHADER, MEDIUM_SPECIES_HUE_SPREAD, MEDIUM_SPECIES_LIGHTNESS, MEDIUM_TIME_PERIOD, MEDIUM_TRACK_ADVECT_SHADER, MEDIUM_VAPOR_CORRECT_SHADER, MEDIUM_VAPOR_FORWARD_SHADER, MEDIUM_VAPOR_REACT_SHADER, OKLAB_TO_LMS, type Spring, VG_CURL_NOISE, VG_OKLAB_TO_SRGB, VG_VALUE_NOISE, type VireUIKitAtomKind, type VireUIKitAtomState, VireUIKitMediumChannel, type VireUIKitMediumCharacter, VireUIKitMediumLight, atomAtRest, atomLift, atomMaterial, characterOf, createGrowthState, growthFrame, growthInk, growthPhase, lightRigForCharacter, lightRigForCover, neutralSpecies, oklabToSrgb, smoothstep, speciesFamily, srgbToOklab, stepGrowth, stepSpring };
101
+ export { ATOM_AT_REST, DEFAULT_GROWTH_TIMING, type GrowthFrame, type GrowthInk, type GrowthPhase, type GrowthPoint, type GrowthShape, type GrowthState, type GrowthTiming, type Spring, type VireUIKitAtomKind, type VireUIKitAtomState, atomAtRest, atomLift, atomMaterial, createGrowthState, growthFrame, growthInk, growthPhase, smoothstep, stepGrowth, stepSpring };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- export { LINEAR_TO_LMS, LMS_TO_LINEAR, LMS_TO_OKLAB, MEDIUM_ALPHA_BURST_RAYS, MEDIUM_ALPHA_RAY_LENGTH_SCALE, MEDIUM_COMPOSITE_SHADER, MEDIUM_CONDENSATE_CORRECT_SHADER, MEDIUM_CONDENSATE_FORWARD_SHADER, MEDIUM_CONDENSATE_REACT_SHADER, MEDIUM_DEFAULTS, MEDIUM_DEFAULT_CELL_PX, MEDIUM_DEFAULT_LIGHTS, MEDIUM_DRIFT_TURBULENCE, MEDIUM_EMISSION_BEATS, MEDIUM_EMISSION_PROBABILITY, MEDIUM_EMIT_SHADER, MEDIUM_MAX_LIGHTS, MEDIUM_MIN_EMISSION_INTERVAL, MEDIUM_NATURAL_INTERVAL, MEDIUM_NATURAL_JITTER, MEDIUM_PLAYING_TURBULENCE_RANGE, MEDIUM_PROBE_FLOOR_PX, MEDIUM_RESAMPLE_SHADER, MEDIUM_SEED_SHADER, MEDIUM_SENSITIVE_BOTTOM, MEDIUM_SENSITIVE_TOP, MEDIUM_SHADOW_SHADER, MEDIUM_SPECIES_HUE_SPREAD, MEDIUM_SPECIES_LIGHTNESS, MEDIUM_TIME_PERIOD, MEDIUM_TRACK_ADVECT_SHADER, MEDIUM_TRACK_DEPTH_INTENSITY_RANGE, MEDIUM_TRACK_DEPTH_WIDTH_RANGE, MEDIUM_TRACK_LAYER_BURST_ACCENT, MEDIUM_TRACK_LAYER_BURST_SPREAD, MEDIUM_TRACK_LAYER_CURL_PUSH, MEDIUM_TRACK_LAYER_FADE_GAMMA, MEDIUM_TRACK_LAYER_GRAVITY_SAG, MEDIUM_TRACK_LAYER_LIFE_SECONDS, MEDIUM_TRACK_LAYER_LOOK, MEDIUM_TRACK_LAYER_MAX_TRACKS, MEDIUM_TRACK_PRESETS, MEDIUM_TURBULENCE_TAU, MEDIUM_VAPOR_CORRECT_SHADER, MEDIUM_VAPOR_FORWARD_SHADER, MEDIUM_VAPOR_REACT_SHADER, OKLAB_TO_LMS, VG_CURL_NOISE, VG_OKLAB_TO_SRGB, VG_VALUE_NOISE, applyTrackDepth, characterOf, createMediumDynamics, depthFarOffsetPx, lightRigForCharacter, lightRigForCover, neutralSpecies, oklabToSrgb, speciesFamily, srgbToOklab, wrappedDistanceFromZero } from './chunk-VY22O2II.js';
2
1
  import { activeMaterial, halfMinDp } from 'vireglass';
3
2
 
3
+ // src/kit/atom.ts
4
4
  var ATOM_AT_REST = {
5
5
  pressed: 0,
6
6
  hovered: 0,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vireuikit",
3
- "version": "0.4.0",
4
- "description": "A UI kit built on the VireGlass material: atom states, capsule-to-target morphs, and a live vapor-and-condensate backdrop.",
3
+ "version": "0.5.0",
4
+ "description": "A UI kit built on the VireGlass material: atom states and capsule-to-target morphs.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Danil Kotlaev",
7
7
  "homepage": "https://github.com/pruffit/vireuikit#readme",
@@ -16,8 +16,6 @@
16
16
  "glassmorphism",
17
17
  "liquid-glass",
18
18
  "vireglass",
19
- "webgl2",
20
- "shader",
21
19
  "ui-kit",
22
20
  "design-system",
23
21
  "material"
@@ -33,11 +31,6 @@
33
31
  "import": "./dist/index.js",
34
32
  "require": "./dist/index.cjs"
35
33
  },
36
- "./web": {
37
- "types": "./dist/web/index.d.ts",
38
- "import": "./dist/web/index.js",
39
- "require": "./dist/web/index.cjs"
40
- },
41
34
  "./package.json": "./package.json"
42
35
  },
43
36
  "main": "./dist/index.cjs",
@@ -54,8 +47,6 @@
54
47
  "typecheck": "tsc --noEmit && tsc -p tsconfig.scripts.json",
55
48
  "test": "vitest run",
56
49
  "test:watch": "vitest",
57
- "check:glsl": "tsx scripts/check-glsl.mjs",
58
- "check:medium": "node scripts/check-medium.mjs",
59
50
  "check:english": "node scripts/check-english.mjs",
60
51
  "check:package": "node scripts/check-package.mjs",
61
52
  "check:readme": "node scripts/check-readme.mjs"
@@ -65,10 +56,7 @@
65
56
  },
66
57
  "devDependencies": {
67
58
  "@types/node": "^22",
68
- "esbuild": "^0.27.0",
69
- "playwright": "^1.62.1",
70
59
  "tsup": "^8.5.0",
71
- "tsx": "^4.23.13",
72
60
  "typescript": "^5.8.3",
73
61
  "vireglass": "^2.3.1",
74
62
  "vitest": "^4.1.11"