@vitreajs/vitrea 0.10.0 → 0.13.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
@@ -1665,9 +1665,153 @@ interface MaterialOptics {
1665
1665
  /** Rim band half-width in CSS px, and its ambient brightness. */
1666
1666
  readonly rimWidth: number;
1667
1667
  readonly rimAlpha: number;
1668
- /** Specular exponent and gain on the rim. */
1668
+ /**
1669
+ * **The rim band's half-width at dpr 2** (W23; claims §5.100 §5, Decision
1670
+ * Log 2 (d)) — `rimWidth`'s second reading, on the precedent of
1671
+ * `sizeScatterGainMax2x` and its siblings and interpolated by the same
1672
+ * `rampAtScale`.
1673
+ *
1674
+ * The rim's amplitude below is one law for both scales, and it cannot be: read
1675
+ * at the contour, vitrea's per-CSS-px band integral RISES 19 % between 1x and
1676
+ * 2x (0.068 → 0.081) while the reference's FALLS 10 % (0.229 → 0.205), so the
1677
+ * same amplitude that lands the 1x dark-backdrop solids at −0.003…−0.007 lands
1678
+ * the 2x rows at +0.037…+0.051. The mismatch is the band's shape and not its
1679
+ * height: at 1x over a dark backdrop the two rims are already the same
1680
+ * one-pixel line (the reference's second contour row carries 8 % of the peak
1681
+ * and vitrea's −7 %), and at 2x vitrea spreads 35 % of its peak onto the second
1682
+ * row where the reference puts 55 % of a NARROWER line. So `rimWidth` does not
1683
+ * move — the 1x rows do not ask it to — and the 2x band narrows instead.
1684
+ *
1685
+ * At dpr ≤ 1 this constant is not read at all (`rimWidthAtScale`), so a profile
1686
+ * that carries it renders the 1x material unchanged by construction.
1687
+ */
1688
+ readonly rimWidth2x: number;
1689
+ /**
1690
+ * Specular exponent and gain on the rim — **RETIRED from the rim (W24 G2;
1691
+ * claims §5.108 §1, W24 Decision Log 2 (a)), and the note is set beside the
1692
+ * W22 fit below rather than over it.**
1693
+ *
1694
+ * The term was `max(dot(normal, lightDirection), 0)^specularPower ×
1695
+ * specularGain`, one-sided, added to the rim's amplitude. W24 read the
1696
+ * reference's rim around the whole contour instead of per side and found the
1697
+ * variation it was reaching for — but symmetric about the diagonal, not
1698
+ * one-sided: the two ends of that diagonal are drawn EQUAL to a thousandth
1699
+ * (2x dark tl 0.0418 against br 0.0418; 2x light 0.2786 against 0.2823), and
1700
+ * over the nineteen untinted solid rows the one-sided form reaches a
1701
+ * normalised RMS of 0.288 against the symmetric form's 0.148, degenerating in
1702
+ * the fit to the ceiling of both its exponent and its floor trying to become
1703
+ * symmetric. So the shape was wrong, which is the deeper reason W22 G1 rightly
1704
+ * fitted the gain to 0 on the regular variant (claims §5.94 §3): no amount of
1705
+ * a term with the wrong shape helps. `rimLitExponent` below is the shape the
1706
+ * rows chose, and it replaces this one.
1707
+ *
1708
+ * Nothing on either canonical bed moves: the shipped profiles carry
1709
+ * `specularGain` 0 on `regular` since W21/W22, and no scene on either bed or in
1710
+ * the golden suite declares `clear`. What DOES change is the `clear` variant's
1711
+ * unfitted structural 0.45, which drew a one-sided highlight this material is
1712
+ * now measured not to have; it is recorded rather than replaced, because the
1713
+ * lit factor is inert on `clear` for want of rows.
1714
+ *
1715
+ * The two constants stay on the profile so that the W22 fit's record and the
1716
+ * profile documents that carry it remain readable, and so that removing them
1717
+ * is one reviewable change of the profile's SHAPE rather than a side effect of
1718
+ * a material gate. Nothing reads them.
1719
+ */
1669
1720
  readonly specularPower: number;
1670
1721
  readonly specularGain: number;
1722
+ /**
1723
+ * **The rim's amplitude law (W23; claims §5.100 §4, Decision Log 2 (a))** — the
1724
+ * term that lets the rim depend on what it is drawn over, which `rimAlpha`
1725
+ * alone cannot.
1726
+ *
1727
+ * `rimAlpha` was an additive constant: the shader added `rimWeight × rimAlpha`
1728
+ * and nothing scaled it. The reference's rim is not a constant. Read at the
1729
+ * contour (claims §5.99, §5.100 §2; W23 X1) the light reference's rim is
1730
+ * +0.23…0.26 of linear luminance over a dark solid, +0.13…0.21 over a
1731
+ * structured backdrop and clipped to white over `light-solid`, while vitrea
1732
+ * drew the same +0.060…0.078 everywhere; and the dark reference's rim GROWS
1733
+ * with what is behind it, +0.026 over `dark-solid` and +0.103 over
1734
+ * `light-solid`, at a body that moves by only a twelfth as much.
1735
+ *
1736
+ * `rimLevelGain` is the coefficient of the surface's OWN rendered level: the
1737
+ * rim becomes `rimAlpha + rimLevelGain × luminance(surface)`. Four candidate
1738
+ * forms were fitted on the reference's own solid, unclipped, uncollapsed sides
1739
+ * — 44 in light and 36 in dark, from both canonical scales and both probe grids
1740
+ * — and this one wins in both schemes on mean |residual|: 0.0081 / 0.0013
1741
+ * against 0.0249 / 0.0253 for the additive constant, 0.0168 / 0.0259 for a pure
1742
+ * screen and 0.0105 / 0.0042 for screen plus an environment term.
1743
+ *
1744
+ * The gain is SIGNED, and its sign is the whole finding. A negative gain is the
1745
+ * screen form — a white line composited source-over at a fraction of the body's
1746
+ * headroom, which is what the CSS tier's inset `box-shadow` already is — and
1747
+ * the light material's rows want one. A positive gain is a rim that rides its
1748
+ * own body up, and the dark material's rows want that, strongly.
1749
+ *
1750
+ * **The environment term is not here, and its absence is a measurement.** W23
1751
+ * chartered `rimEnvGain` — a coefficient on the backdrop source's own average
1752
+ * luminance — as the candidate (L3) for what makes the reference's rim clip
1753
+ * over a bright backdrop while its body is nowhere near white. It is declined
1754
+ * and REMOVED rather than shipped at 0: it is worse than this law on the
1755
+ * reference in both schemes, and no row of either bed separates it on vitrea's
1756
+ * side (a rendered ladder point at +0.10 of gain moved every solid cell by 0 or
1757
+ * 0.0005, because `light-solid` clips and the dark solids have no environment
1758
+ * to speak of). C9a §6.2's rule is that a constant whose rows do not separate
1759
+ * it is not carried. What the reference does there is real and is recorded in
1760
+ * the wave's Deferred list with its numbers: a bed with a mid-bright solid
1761
+ * backdrop under a light-scheme thick surface would tell the environment apart
1762
+ * from the body, and no bed that exists can.
1763
+ */
1764
+ readonly rimLevelGain: number;
1765
+ /**
1766
+ * **The lit edge (W24; claims §5.107)** — the exponent of the directional
1767
+ * factor `(√2 · |n · L|)^rimLitExponent` the rim's whole amplitude is
1768
+ * multiplied by, with `L` the profile's `rimLitAxis`.
1769
+ *
1770
+ * W23 gave the rim the right AMOUNT and the wrong SHAPE. Read around the whole
1771
+ * contour rather than per side (`results/2026-09-09-w24-lit-edge/g0/
1772
+ * read-angular.py`), Apple's rim is not constant: on the 2x dark
1773
+ * `dark-solid__rrect-md` the bins whose normal points north-west and
1774
+ * south-east read 0.0408 and 0.0418 against 0.0016 for north-east and
1775
+ * south-west, with the four straight sides at 0.0312–0.0328; the same cell in
1776
+ * the light scheme reads 0.284 / 0.286 against 0.038, sides 0.233–0.247.
1777
+ * vitrea drew one number everywhere — a drawn line, which is what the user's
1778
+ * eye called an aesthetic regression on the W23 landing sheet.
1779
+ *
1780
+ * No per-side reader could see it, and the reason is geometric: a light on the
1781
+ * 45° diagonal projects EQUALLY on all four straight sides, so `L−R` and
1782
+ * `T−B` are 0 for the reference exactly as they are for vitrea. The variation
1783
+ * lives in the corner arcs, which W23's contour reader excludes by
1784
+ * construction and W21's band reader averages into its corner overshoot.
1785
+ *
1786
+ * **The form is symmetric and it is not a Lambert.** Fitted on the reference's
1787
+ * own bins over the 19 untinted solid cells of both canonical beds and both
1788
+ * probe grids, `(√2 · |n · L|)^p` reaches an RMS of 0.148 of each cell's own
1789
+ * peak against 0.288 for the one-sided `max(n · L, 0)^p` that W22's `spec`
1790
+ * term draws and 0.312 for the flat rim vitrea ships. The one-sided form
1791
+ * cannot reach both ends of a diagonal whose two corners the reference draws
1792
+ * equal to a thousandth, and that — not its gain — is why W22 rightly fitted
1793
+ * `specularGain` to 0.
1794
+ *
1795
+ * **There is no ambient floor.** The wave chartered `a + (1 − a)|n · L|^p` with
1796
+ * `a` expected around 0.15 dark and 0.25 light. Every grouping of the rows fits
1797
+ * `a` to 0.000 (the search ran 0…0.6 in steps of 0.005), because the bin mean
1798
+ * of `|cos|^p` over the 22.5° straddling the null is already 0.10–0.16 and
1799
+ * supplies everything the null bins carry. A constant every row fits to zero is
1800
+ * a constant the material does not have (C9a §6.2), so it is not here.
1801
+ *
1802
+ * **The `√2` is the amplitude's re-expression, in closed form.** W23 fitted
1803
+ * `rimAlpha` and `rimLevelGain` on the STRAIGHT SPANS, which under this factor
1804
+ * sit at `(cos 45°)^p` of the peak. Normalising the dot product by `cos 45°`
1805
+ * inside the power makes the factor exactly 1 wherever the normal is
1806
+ * horizontal or vertical, at every exponent — so no fitted amplitude moves,
1807
+ * W23's straight-span reads hold identically rather than approximately, and
1808
+ * only the corners and the arcs change. It is why the CSS tier, whose inset
1809
+ * shadow cannot vary around a contour, needs no re-fit either.
1810
+ *
1811
+ * At 0 the factor is `pow(x, 0)` = 1 for every normal, so a profile that does
1812
+ * not carry this constant renders the W23 material byte for byte.
1813
+ */
1814
+ readonly rimLitExponent: number;
1671
1815
  /** Inner-shadow depth (0..1) and how much of it is applied. */
1672
1816
  readonly shadowDepth: number;
1673
1817
  readonly shadowAlpha: number;
@@ -2531,6 +2675,160 @@ interface MaterialProfile {
2531
2675
  readonly backdropToneLow: number;
2532
2676
  readonly backdropToneHigh: number;
2533
2677
  readonly backdropToneSizeBias: number;
2678
+ /**
2679
+ * **The transmission the collapse keeps (W24 G1)** — and the correction, set
2680
+ * BESIDE the paragraph above rather than over it, of what "texture collapse"
2681
+ * was measured on.
2682
+ *
2683
+ * W7 fitted the collapse on `dark-solid`, a backdrop with no texture in it,
2684
+ * and the paragraph above therefore says the collapse converges the interior
2685
+ * on the backdrop's mean COLOUR. On a solid backdrop the mean and the pixel
2686
+ * are the same number, so the fit could not tell the two apart; the impulse
2687
+ * bed can, and it says they are not the same. Through the reference's
2688
+ * collapsed `impulse__capsule-button` the centre dot still comes through at
2689
+ * +0.0065 linear over a body of 0.0065 at 1x and +0.0254 over 0.0065 at 2x,
2690
+ * where vitrea's collapsed capsule passes exactly 0.0000 (claims §5.107 §2).
2691
+ * The reference's collapsed material is a dark glass that still transmits what
2692
+ * lies beneath it, blurred — it collapses the LEVEL, not the structure.
2693
+ *
2694
+ * The arithmetic the collapse already has makes the correction one constant.
2695
+ * Writing `M` for the unadapted composite this pass would otherwise produce,
2696
+ * the (colour, alpha) pair the shader solves reduces exactly to
2697
+ * `colour = (1 − k)·M + k·target`, and `target` is today the group's mean
2698
+ * backdrop colour — one number for the whole surface, which is precisely what
2699
+ * flattens the dot away at `k` 1. So `collapseTransmission` lerps the TARGET
2700
+ * from that mean (0) to the per-pixel blurred backdrop sample the refraction
2701
+ * path already computed (1):
2702
+ *
2703
+ * target = mix(toneColour.rgb, backdrop, collapseTransmission)
2704
+ *
2705
+ * The tone axis's ARGUMENT is untouched — `k` is still read from the group's
2706
+ * mean luminance and the size bias, and the response law still solves against
2707
+ * `toneAnchor.w` — so the collapse collapses exactly as far as it did and
2708
+ * only stops flattening what is under it. The blurred sample's mean under the
2709
+ * surface is the group's mean to within the difference between a local and a
2710
+ * global average, so the body's LEVEL moves by less than a code where the
2711
+ * backdrop is anything like uniform, and not at all where it is solid: over
2712
+ * `dark-solid` the sample IS the mean and every collapsed cell of that bed is
2713
+ * byte-identical at any value of this constant. That is the stop the fit is
2714
+ * checked against.
2715
+ *
2716
+ * At 0 the target is the mean and the shader's arithmetic is W7's to the bit,
2717
+ * which is why this can be added without moving a pixel anywhere.
2718
+ *
2719
+ * What it cannot carry is the reference's WIDTH. Fitted on the reference's own
2720
+ * dot the transmitted profile is a 4 CSS px box convolved with σ 2.63 device
2721
+ * px at 1x and σ 1.38 device px at 2x — the same kernel the reference's
2722
+ * UNCOLLAPSED cells show (σ 2.86 / 1.40 device px on `impulse__rrect-md`), so
2723
+ * the collapse does not change Apple's blur, but that kernel is neither
2724
+ * CSS-invariant nor device-invariant and vitrea's is neither of those numbers.
2725
+ * This constant sets how MUCH comes through; how WIDE it arrives is the
2726
+ * material's own scatter law and is recorded as a gap, not fitted here
2727
+ * (W24 G1 findings).
2728
+ */
2729
+ readonly collapseTransmission: number;
2730
+ /**
2731
+ * **The collapse's transmission at dpr 2** (W24 G1), the second anchor of the
2732
+ * constant above, on the pattern `sizeScatterGainMax2x` established for the
2733
+ * body's own second scale (claims §5.69 §1).
2734
+ *
2735
+ * It is a per-scale reading and not a per-scheme one, and the evidence is the
2736
+ * fixtures': the light and dark captures of the collapsed cells are the same
2737
+ * bytes, so the collapsed appearance is one appearance in both schemes, while
2738
+ * the width the reference transmits through is a different number at each
2739
+ * scale. Fitted on the reference's own dot, its kernel is a 4 CSS px box
2740
+ * convolved with σ 2.63 device px at 1x and σ 1.38 device px at 2x — a width
2741
+ * that is invariant in neither CSS nor device pixels — so the SHARE that comes
2742
+ * through cannot be one number over a kernel that is two.
2743
+ *
2744
+ * Defaults to the 1x constant, so a profile that names only that one renders
2745
+ * it at every ratio and this anchor is the identity on the landed material.
2746
+ */
2747
+ readonly collapseTransmission2x: number;
2748
+ /**
2749
+ * **The rim that survives the collapse (W23)** — the one mark the collapsed
2750
+ * appearance keeps.
2751
+ *
2752
+ * The paragraph above is right about the body and wrong about the rim. W7 read
2753
+ * the settled reference's `dark-solid__capsule-button` as "byte-identical to
2754
+ * its own background, rim included", and at the contour it never was: the
2755
+ * fixture carries a body one code BELOW its backdrop and a contour rim of
2756
+ * +0.020 linear per CSS px (55/255 on a 28/255 backdrop at 2x), in every
2757
+ * standard profile, at both scales, in both schemes (claims §5.99). vitrea
2758
+ * folds that rim out with everything else through the shader's one
2759
+ * `present = 1 − toneAdapt`, and the user's eye named the result: "not one of
2760
+ * our glasses is visible on black, where Apple's clearly show their presence."
2761
+ *
2762
+ * So the shader's rim becomes
2763
+ * `rimWeight × (rimAmplitude × present + rimCollapsed × toneAdapt)`: the
2764
+ * scheme's own rim fading out with the adaptation as it does now, and an
2765
+ * absolute rim the collapsed appearance owns rising with it. At `toneAdapt` 0
2766
+ * nothing changes at all, which is why this constant can be added without
2767
+ * moving a single uncollapsed pixel.
2768
+ *
2769
+ * It lives on the profile and NOT in the dark patch, because the collapsed
2770
+ * appearance is scheme-independent and the fixtures say so: the light and dark
2771
+ * fixtures of `dark-solid__capsule-button` are byte-identical at both scales
2772
+ * (W23 X4). A reading that separates the schemes under collapse is a finding
2773
+ * about the wave, not a second constant. G0 strengthened the evidence: the
2774
+ * identity survives an AUTHOR TINT — `dark-solid__capsule-button__rest-tint-
2775
+ * orange` is the same bytes in both schemes at both scales — so what the
2776
+ * collapse draws is one appearance however the surface was painted.
2777
+ *
2778
+ * It is expressed in its own units and not in the dark rim's, because the two
2779
+ * were measured apart: see the value's own note on the default profile.
2780
+ */
2781
+ readonly rimCollapsed: number;
2782
+ /**
2783
+ * **The rim a PAINTED surface keeps under the collapse** (W23 G1; claims
2784
+ * §5.100 §5, Decision Log 2 (c)) — `rimCollapsed`'s sibling, at the author
2785
+ * tint's full coverage, with the two lerped by the coverage between them.
2786
+ *
2787
+ * The reference's collapsed capsules keep +0.020 of contour rim bare and
2788
+ * **+0.115 painted** (`dark-solid` and `impulse` `capsule-button`
2789
+ * `rest-tint-orange`, both schemes, both scales, on fixtures that are the same
2790
+ * bytes in the two schemes). An author tint over black is painted, not
2791
+ * adapted: the tone collapse takes the material's own appearance to its
2792
+ * backdrop and the colour the author put on it does not go with it.
2793
+ *
2794
+ * It is ABSOLUTE, in its own units, for the same reason `rimCollapsed` is and
2795
+ * on the same evidence — and G1 measured what the alternative would have cost.
2796
+ * Decision Log 2 (c) proposed gating the collapse itself on the tint's
2797
+ * coverage, so that a painted surface keeps its APPEARANCE's own rim; rendered,
2798
+ * that mechanism needs a gate of 0.534 on the light bed and 0.294 on the dark
2799
+ * one to reach +0.115 on a cell whose reference fixture is byte-identical
2800
+ * between the schemes, because it makes the kept rim proportional to each
2801
+ * scheme's own amplitude law and those differ by 1.8× there. A proportional
2802
+ * form cannot draw one appearance from two materials; an absolute one does,
2803
+ * which is X4 again and the reason this constant has the shape it has.
2804
+ *
2805
+ * It is fitted on orange alone, and that is a stated limit: the reference's
2806
+ * collapsed tint-blue capsule reads +0.176 against orange's +0.115, so the
2807
+ * quantity depends on the tint's own colour, and every collapsed blue cell on
2808
+ * the bed is holdout. What lands here is the orange rows' answer with the
2809
+ * colour dependence recorded as future work.
2810
+ */
2811
+ readonly rimCollapsedTinted: number;
2812
+ /**
2813
+ * **How much of an author tint's own colour the rim's light is spent in**
2814
+ * (W23 G3; claims §5.102) — 0…1, multiplied by the surface's tint coverage.
2815
+ *
2816
+ * Apple's rim on a painted surface is the paint LIFTED, not white added over
2817
+ * it. Read on the contour row's straight-span mean colour at 2x in light, an
2818
+ * orange paint of (255, 148, 0) rises to (254, 188, 0) with its blue channel
2819
+ * still at 0, and a blue paint of (8, 120, 236) to (59, 199, 248); vitrea drew
2820
+ * (255, 192, 130) and (145, 183, 255) — the same rim in white, which turns an
2821
+ * orange edge peach and a blue edge lilac. No luminance clause sees it: the
2822
+ * rim's amplitude is right and its colour is not.
2823
+ *
2824
+ * So the rim's light is spent in `mix(white, paint / max(paint), chroma × s)`.
2825
+ * The paint is normalised by its own brightest channel rather than by its
2826
+ * luminance, so a dark paint darkens the rim's HUE and not its amount, and the
2827
+ * factor is the pixel's own tint strength, so an untinted surface keeps a white
2828
+ * rim at every value of this constant — which is what makes the mechanism reach
2829
+ * painted pixels only and every untinted capture byte-identical (W23 S10).
2830
+ */
2831
+ readonly rimTintChroma: number;
2534
2832
  /**
2535
2833
  * **The backdrop tone response (W9)** — the law that owns the interior MEAN,
2536
2834
  * where the four constants above own texture collapse and nothing else.
@@ -2591,6 +2889,31 @@ interface MaterialProfile {
2591
2889
  * specular from.
2592
2890
  */
2593
2891
  readonly lightDirection: readonly [number, number];
2892
+ /**
2893
+ * **The lit edge's axis (W24; claims §5.107)** — the unit direction `L` the
2894
+ * rim's directional factor is symmetric about, in the same viewport
2895
+ * coordinates as `lightDirection`, y pointing down.
2896
+ *
2897
+ * It is a SEPARATE constant from `lightDirection` and not a second reading of
2898
+ * it, for two reasons the rows give. First, they are measured to differ: the
2899
+ * rim's axis fits at 136° of compass bearing over the 19 solid rows (135.0° ±
2900
+ * 0.7° over the dark rows alone, 137.7° ± 1.5° over the light ones), where
2901
+ * `lightDirection` [−0.3714, −0.9285] is a bearing of 338.2°, an axis of
2902
+ * 158.2° — 22° away, and it was fitted for the inner shadow and the sweep, not
2903
+ * for the contour. Second, `light.xy` reaches the one-sided `spec` term this
2904
+ * factor replaces, and re-pointing it to fit the contour would move the
2905
+ * shadow's own light with it; a constant of its own keeps that seam where W2
2906
+ * and W22 left it.
2907
+ *
2908
+ * The default is the exact diagonal (−1, −1)/√2 — a bearing of 135° — and not
2909
+ * the fitted 136°: the rows do not separate the two (the joint fit's RMS moves
2910
+ * by less than a thousandth between them), and only the exact diagonal makes
2911
+ * the factor equal on all four straight sides, which is what lets the
2912
+ * amplitude's re-expression be exact rather than a 2 % trade against W23's
2913
+ * straight-span reads. `rimLitExponent` is 0, so the axis draws nothing until a
2914
+ * profile carries an exponent.
2915
+ */
2916
+ readonly rimLitAxis: readonly [number, number];
2594
2917
  /** Specular sweep band width in radians, and the press glow's reach in CSS px. */
2595
2918
  readonly sweepBandRadians: number;
2596
2919
  readonly glowRadiusCss: number;
@@ -2653,12 +2976,18 @@ interface MaterialProfilePatch {
2653
2976
  readonly backdropToneLow?: number;
2654
2977
  readonly backdropToneHigh?: number;
2655
2978
  readonly backdropToneSizeBias?: number;
2979
+ readonly collapseTransmission?: number;
2980
+ readonly collapseTransmission2x?: number;
2981
+ readonly rimCollapsed?: number;
2982
+ readonly rimCollapsedTinted?: number;
2983
+ readonly rimTintChroma?: number;
2656
2984
  readonly backdropToneAnchorX?: readonly [number, number, number];
2657
2985
  readonly backdropToneResponseThin?: readonly [number, number, number];
2658
2986
  readonly backdropToneResponseThick?: readonly [number, number, number];
2659
2987
  readonly backdropToneResponseStrength?: number;
2660
2988
  readonly outerShadow?: Readonly<Partial<MaterialOuterShadow>>;
2661
2989
  readonly lightDirection?: readonly [number, number];
2990
+ readonly rimLitAxis?: readonly [number, number];
2662
2991
  readonly sweepBandRadians?: number;
2663
2992
  readonly glowRadiusCss?: number;
2664
2993
  readonly glowGain?: number;
@@ -2926,6 +3255,16 @@ interface SurfaceChannels {
2926
3255
  readonly glow: number;
2927
3256
  /** Specular sweep position, 0..1 around the contour. */
2928
3257
  readonly sweep: number;
3258
+ /**
3259
+ * The shimmer's amplitude, 0..1 — the sweep's gain rather than its position.
3260
+ *
3261
+ * The band's angular coordinate covers the whole contour, so no phase is off
3262
+ * the surface and the phase alone cannot mean "not shimmering"; this channel
3263
+ * carries that. It is 0 on a resting surface, which makes the highlight pass's
3264
+ * sweep term exactly zero there, and it is what a shimmer driver will output
3265
+ * when v1 gains one.
3266
+ */
3267
+ readonly shimmer: number;
2929
3268
  /** `lensStrength`, 0..1. Multiplies the resolved refraction scale. */
2930
3269
  readonly lensStrength: number;
2931
3270
  /** Press point in viewport CSS px. Defaults to the surface's centre. */
package/dist/index.js CHANGED
@@ -1092,7 +1092,7 @@ function isHealthy(state) {
1092
1092
 
1093
1093
  // src/renderer-seam.ts
1094
1094
  async function loadWebGPURendererModule() {
1095
- return import('./dist-3OXBJGMC.js');
1095
+ return import('./dist-2V7EQHSR.js');
1096
1096
  }
1097
1097
  async function loadWebGPURenderer() {
1098
1098
  const { createWebGPURenderer } = await loadWebGPURendererModule();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitreajs/vitrea",
3
- "version": "0.10.0",
3
+ "version": "0.13.0",
4
4
  "description": "Framework-agnostic Liquid Glass material runtime: scene model, capability resolution, material policy, accessibility policy.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/SSFSKIM/designer",