@orangecheck/design 0.28.2 → 0.28.4

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.
@@ -1,22 +1,20 @@
1
1
  /*
2
- * oc-sigil — the brand mark as a deep-set 3D emboss (aurora depth R3).
2
+ * oc-sigil — the brand mark as a translucent 3D watermark (aurora depth R3).
3
3
  *
4
- * Tier A is pure CSS: 6 stacked <use> copies of the normalized glyph under
5
- * perspective + translateZ, each an OPAQUE color-mix toward --background
6
- * (occlusion, not translucency — enclosed counters never moiré, and the
7
- * contrast ceiling is compiled in: the loudest layer sits 52% toward the
8
- * background, so worst-frame text contrast holds by construction). The drift
9
- * is compositor-only transform at aurora energy, carries `.oc-ambient`
10
- * (inherits the family oc_motion pause), and freezes under
11
- * prefers-reduced-motion.
4
+ * A large, see-through extruded relief of the verb's mark, sitting behind the
5
+ * hero and bleeding off a corner. Many thin <use> layers under perspective +
6
+ * translateZ give real depth (a lit front face, shadowed walls, a back that
7
+ * dissolves into --background); the whole object is composited at a low
8
+ * `--oc-sigil-opacity` so the aurora reads through it — present, dimensional,
9
+ * but muted. The drift carries `.oc-ambient` (family oc_motion pause) and
10
+ * freezes under prefers-reduced-motion.
12
11
  *
13
- * PRESERVE-3D FOOTGUN: never put mask / filter / opacity<1 / overflow on
14
- * .oc-sigil__drift or .oc-sigil__par — any of them silently flattens the
15
- * stack. The edge fade lives on the OUTER .oc-sigil wrapper, which is safe.
12
+ * Responsive by default: size is a clamp() so it scales with the viewport, and
13
+ * it stays visible (smaller, quieter) on phones. Position + size are tunable
14
+ * per-site via --oc-sigil-size / --oc-sigil-opacity / the corner classes.
16
15
  *
17
- * Two registers, one geometry, switched here in CSS (zero hydration flash):
18
- * ember (default root) shows the filled letterpress stack; the cypherpunk
19
- * skins show the wireframe stack instead.
16
+ * PRESERVE-3D FOOTGUN: opacity/mask/filter/overflow live on the OUTER wrapper
17
+ * ONLY — never on .oc-sigil__drift / .oc-sigil__par, or the 3D stack flattens.
20
18
  */
21
19
 
22
20
  .oc-sigil {
@@ -24,28 +22,40 @@
24
22
  pointer-events: none;
25
23
  contain: layout paint;
26
24
  perspective: 1100px;
27
- /* edge fade on the wrapper (NOT the 3D stack) so the emboss dissolves
28
- into the aurora field instead of ending in a hard box */
29
- -webkit-mask-image: radial-gradient(120% 120% at 55% 42%, #000 45%, transparent 92%);
30
- mask-image: radial-gradient(120% 120% at 55% 42%, #000 45%, transparent 92%);
25
+ /* responsive footprint — scales with the smaller viewport axis, clamped */
26
+ width: var(--oc-sigil-size, clamp(240px, 52vmin, 600px));
27
+ height: var(--oc-sigil-size, clamp(240px, 52vmin, 600px));
28
+ /* translucent: the whole relief composites at this alpha so the aurora and
29
+ page read through it (a watermark, not an opaque object). Light mode
30
+ rides higher — a mid-tone terracotta over a near-white page needs more
31
+ presence to read than the same mark over a dark page. */
32
+ opacity: var(--oc-sigil-opacity, 0.58);
33
+ /* soft edge fade so the mark dissolves into the field rather than ending in
34
+ a hard box (on the wrapper, which is safe for preserve-3d) */
35
+ -webkit-mask-image: radial-gradient(125% 125% at 55% 45%, #000 42%, transparent 90%);
36
+ mask-image: radial-gradient(125% 125% at 55% 45%, #000 42%, transparent 90%);
37
+ }
38
+ :root.dark .oc-sigil {
39
+ opacity: var(--oc-sigil-opacity, 0.52);
31
40
  }
32
41
 
33
- /* corner anchors — the bleed crops against the hero's overflow-hidden */
42
+ /* corner anchors — the bleed crops against the hero's overflow-hidden. Offsets
43
+ are a share of the mark's own size so the crop is consistent at every width. */
34
44
  .oc-sigil--bottom-left {
35
- left: -8%;
36
- bottom: -16%;
45
+ left: -14%;
46
+ bottom: -18%;
37
47
  }
38
48
  .oc-sigil--bottom-right {
39
- right: -8%;
40
- bottom: -16%;
49
+ right: -14%;
50
+ bottom: -18%;
41
51
  }
42
52
  .oc-sigil--top-left {
43
- left: -8%;
44
- top: -14%;
53
+ left: -14%;
54
+ top: -16%;
45
55
  }
46
56
  .oc-sigil--top-right {
47
- right: -8%;
48
- top: -14%;
57
+ right: -14%;
58
+ top: -16%;
49
59
  }
50
60
 
51
61
  .oc-sigil__drift {
@@ -65,17 +75,17 @@
65
75
  @keyframes oc-sigil-drift {
66
76
  0%,
67
77
  100% {
68
- transform: rotateX(20deg) rotateY(calc(-26deg + var(--oc-sigil-seed, 0deg)));
78
+ transform: rotateX(19deg) rotateY(calc(-24deg + var(--oc-sigil-seed, 0deg)));
69
79
  }
70
80
  50% {
71
- transform: rotateX(26deg) rotateY(calc(-16deg + var(--oc-sigil-seed, 0deg)));
81
+ transform: rotateX(25deg) rotateY(calc(-14deg + var(--oc-sigil-seed, 0deg)));
72
82
  }
73
83
  }
74
84
 
75
85
  /* Layers are absolutely stacked; their translateZ + color ramp (the 3D relief)
76
86
  are computed per-layer in the component so depth is tunable in one place. The
77
- mark is always the OUTLINE form (the tile drops away), extruded into a solid
78
- slab that recolors per skin via currentColor. */
87
+ mark is always the OUTLINE form (the tile drops away), extruded into a slab
88
+ that recolors per skin via currentColor. */
79
89
  .oc-sigil__layer {
80
90
  position: absolute;
81
91
  inset: 0;
@@ -84,10 +94,24 @@
84
94
  backface-visibility: hidden;
85
95
  }
86
96
 
87
- /* mobile = hidden, full stop — decoration never spends phone-fold real estate */
97
+ /* Phones: single-column heroes stack tall, so a bottom anchor buries the mark
98
+ below the fold. Re-anchor to the TOP-RIGHT corner (clear of a left-aligned
99
+ headline) so it lands in the first viewport, and keep it quiet. This wins on
100
+ specificity + source order over the desktop corner classes above. */
88
101
  @media (max-width: 640px) {
89
102
  .oc-sigil {
90
- display: none;
103
+ width: var(--oc-sigil-size-sm, clamp(170px, 56vw, 300px));
104
+ height: var(--oc-sigil-size-sm, clamp(170px, 56vw, 300px));
105
+ opacity: var(--oc-sigil-opacity-sm, 0.4);
106
+ }
107
+ :root.dark .oc-sigil {
108
+ opacity: var(--oc-sigil-opacity-sm, 0.42);
109
+ }
110
+ .oc-sigil--bottom-left,
111
+ .oc-sigil--bottom-right,
112
+ .oc-sigil--top-left,
113
+ .oc-sigil--top-right {
114
+ inset: -5% -24% auto auto; /* top-right, cropped off the right edge */
91
115
  }
92
116
  }
93
117
 
package/dist/tokens.js CHANGED
@@ -961,14 +961,14 @@ var LAYERS = Array.from({ length: DEPTH }, (_, i) => i);
961
961
  function layerStyle(i) {
962
962
  const t = i / (DEPTH - 1);
963
963
  let color;
964
- if (t < 0.12) {
965
- color = `color-mix(in oklab, var(--primary), white ${Math.round((0.12 - t) * 60)}%)`;
966
- } else if (t < 0.62) {
967
- const k = (t - 0.12) / 0.5;
968
- color = `color-mix(in oklab, var(--primary), black ${Math.round(k * 42)}%)`;
964
+ if (t < 0.14) {
965
+ color = `color-mix(in oklab, var(--primary), white ${Math.round((0.14 - t) * 26)}%)`;
966
+ } else if (t < 0.6) {
967
+ const k = (t - 0.14) / 0.46;
968
+ color = `color-mix(in oklab, var(--primary), black ${Math.round(k * 34)}%)`;
969
969
  } else {
970
- const k = (t - 0.62) / 0.38;
971
- color = `color-mix(in oklab, color-mix(in oklab, var(--primary), black 42%), var(--background) ${Math.round(k * 100)}%)`;
970
+ const k = (t - 0.6) / 0.4;
971
+ color = `color-mix(in oklab, color-mix(in oklab, var(--primary), black 34%), var(--background) ${Math.round(k * 100)}%)`;
972
972
  }
973
973
  return {
974
974
  transform: `translateZ(${-i * Z_STEP}px)`,