tamga-ui 0.2.1 → 0.3.1

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/theme.css CHANGED
@@ -1,146 +1,73 @@
1
- /* ==============================================================
2
- tamga-ui · TEMA KATMANI
3
-
4
- Token'lar burada yaşar: renk rampası, semantik renkler, tip skalası,
5
- ölçü, şekil ve motion. Sınıflar kit.css'te.
6
-
7
- KULLANIM — tüketici kendi CSS'inde şu sırayı kurar:
8
-
9
- @import "tailwindcss";
10
- @import "tamga-ui/styles.css";
11
- :root { --color-accent: #d6336c; } ← markanın tamamı
12
-
13
- Bu dosya Tailwind v4 gerektirir (@theme direktifi kullanıyor).
14
- kit.css gerektirmez — o saf CSS.
15
-
16
- KURALLAR (guard'larla zorlanır):
17
- · her token HEM :root HEM .dark içinde (check-token-parity)
18
- · bileşen token'a adıyla erişir, ham hex yazmaz (check-hardcoded-colors)
19
- · motion yalnız token üzerinden (check-motion-tokens)
20
- ============================================================== */
21
-
1
+ /*! tamga-ui 0.3.1 · MIT · https://tamga.org.tr */
22
2
  @custom-variant dark (&:is(.dark *));
23
3
 
24
- /* ============================================================
25
- TOKEN KATMANI — kitin tek renk, ölçü ve hareket kaynağı.
26
-
27
- KALICI (mekanizma, tartışmaya kapalı)
28
- · token isimleri + @theme inline köprüsü
29
- · her token HEM :root HEM .dark içinde (parite CI'da denetlenir)
30
- · motion yalnız token üzerinden — ham süre ve eğri yasak
31
- · yükselme tek formülden gelir: 1px kenar + N px sert offset, bulanıklık yok
32
-
33
- DEĞİŞTİRİLEBİLİR (ürünün kararı)
34
- · rampanın DEĞERLERİ. Bir ürün kendi CSS girişinde :root ve .dark blokları
35
- yazarak markasını verir. Token'ın ADI kitin, DEĞERİ ürünündür.
36
-
37
- Buradaki bir değeri değiştirmeden önce kitin ilgili karar belgesini güncelle —
38
- sıra hep aynı: önce doküman, sonra değer.
39
- ============================================================ */
40
-
41
- /* tamga:sabit-olcek — temadan bağımsız: marka rampası, kırılma noktası,
42
- hareket eğrileri ve süreler. Gece de gündüz de aynı. */
43
4
  @theme {
44
- /* Raw brand ramp. Nothing consumes it directly: the semantic tokens below are
45
- the interface, and a component reaching for --color-brand-500 is skipping the
46
- layer that makes theming work. Kept in step with the accent so that if anyone
47
- ever does reach for it they get this product's blue, not the placeholder v2
48
- shipped with.
49
- TR: Ham marka rampası. Hiçbir şey doğrudan tüketmiyor: arayüz aşağıdaki anlamsal
50
- token'lar, ve --color-brand-500'e uzanan bir bileşen temalandırmayı çalıştıran
51
- katmanı atlıyor. */
5
+
52
6
  --color-brand-50: #ecedf3;
53
- /* Raw ramp, second step.
54
- TR: Ham rampa, ikinci adım. */
7
+
55
8
  --color-brand-100: #d6e2f5;
56
- --color-brand-400: #53a4fa; /* = dark --primary TR: = koyu --primary */
57
- --color-brand-500: #2069c9; /* = light --primary TR: = açık --primary */
58
- --color-brand-600: #12245c; /* = the base under the face TR: = yüzün altındaki taban */
9
+ --color-brand-400: #53a4fa;
10
+ --color-brand-500: #2069c9;
11
+ --color-brand-600: #12245c;
59
12
 
60
13
  --breakpoint-xs: 30rem;
61
14
 
62
- /* Motion (docs/13-design-soul §1) — theme-invariant, defined once here and read through the
63
- ease/duration custom properties below. Components never write raw curves/durations (§10).
64
- (Spelled out rather than written with a wildcard: Tailwind scans this file for class
65
- candidates and read the glob form as an arbitrary utility, warning on every build.) */
66
- --ease-instrument: cubic-bezier(0.22, 1, 0.36, 1); /* THE signature: everything that enters or moves TR: İMZA: giren ya da hareket eden her şey */
67
- --ease-press: cubic-bezier(0.22, 1, 0.36, 1); /* the same curve: a press is not a different physics TR: aynı eğri: basmak farklı bir fizik değil */
68
- /* --ease-settle removed (13 §1): the only curve with overshoot, and nothing in this
69
- product bounces. An overshoot placed anywhere leaks everywhere. */
70
- --ease-breath: ease-in-out; /* the two loops: beacon and skeleton TR: iki döngü: işaret ve iskelet */
71
-
72
- --duration-instant: 100ms; /* press, hover, focus: every control (13 §1 --duration-press) TR: basma, üzerine gelme, odak: her kontrol (13 §1 --duration-press) */
73
- --duration-quick: 160ms; /* colour and tone shifts TR: renk ve ton geçişleri */
74
- --duration-base: 240ms; /* panels, popovers, toasts, value changes TR: paneller, balonlar, bildirimler, değer değişimleri */
75
- --duration-slow: 340ms; /* route-level reveals TR: rota düzeyinde açılışlar */
76
- /* Loops — long by design, the only things allowed past --duration-slow */
77
- --duration-breath: 1100ms; /* skeleton TR: iskelet */
78
- --duration-beacon: 1800ms; /* the live mark. 2400ms read as heavy on an instrument. TR: canlı işaret. 2400ms bir göstergede ağır okunuyordu. */
15
+ --ease-instrument: cubic-bezier(0.22, 1, 0.36, 1);
16
+ --ease-press: cubic-bezier(0.22, 1, 0.36, 1);
17
+
18
+ --ease-breath: ease-in-out;
19
+
20
+ --duration-instant: 100ms;
21
+ --duration-quick: 160ms;
22
+ --duration-base: 240ms;
23
+ --duration-slow: 340ms;
24
+
25
+ --duration-breath: 1100ms;
26
+ --duration-beacon: 1800ms;
79
27
  }
80
28
 
81
- /* İŞARETÇİ YORUMU KENDİNDEN BAŞKA BİR İŞARETÇİNİN ADINI TAŞIMAZ. İlk hâli
82
- burada koyu bloğun adını da anıyordu; ayrıştırıcı "koyu" işaretçisini
83
- ararken bu yorumu buluyor ve AÇIK bloğu koyu sanıyordu. Parite kapısı da
84
- bu yüzden açık bloğu kendisiyle karşılaştırıp sessizce geçiyordu.
85
- tamga:tema-acik */
86
29
  :root {
87
- --radius: 6px; /* 13 §5: instrument sharpness, a knowing DNA §12 deviation (ADR pending) TR: 13 §5: gösterge keskinliği, DNA §12'den bilerek yapılan bir sapma (ADR bekliyor) */
88
-
89
- /* Elevation — hard, blurless, offset shadows (docs/13-design-soul §2). Blur only on the
90
- overlay's ambient second layer. Parity-checked in both :root and .dark (docs/03).
91
- Every formula carries the SAME two layers in every theme (bottom shadow + inset top rim) so the
92
- structure is parallel — light just holds the rim transparent; dark's rim is the load-bearing
93
- "night edge" (§2). Equal layer counts also guarantee smooth box-shadow interpolation on press. */
94
- --shadow-color: #d2cec8; /* = --color-edge: the offset IS the edge colour (13 Yasa 1). Darkened from #d9d6d1, which measured ΔL* 9.8 against the page, under this gate's floor of 10. TR: = --color-edge: kaydırmanın kendisi kenarın rengidir (13 Yasa 1). #d9d6d1'den koyulaştırıldı; sayfaya karşı ΔL* 9.8 ölçülmüştü, bu kapının 10 tabanının altında. */
95
- --shadow-rim: transparent; /* no rim in either theme; see .dark TR: iki temada da çerçeve yok; bkz. .dark */
96
- --shadow-ambient: rgb(38 34 26 / 0.32); /* scrim/overlay drop, warm ink TR: katman gölgesi, sıcak mürekkep */
97
- --shadow-raised: 2px 2px 0 0 var(--shadow-color); /* diagonal, blurless (13 Yasa 1) TR: çapraz, bulanıksız (13 Yasa 1) */
30
+ --radius: 6px;
31
+
32
+ --shadow-color: #d2cec8;
33
+ --shadow-rim: transparent;
34
+ --shadow-ambient: rgb(38 34 26 / 0.32);
35
+ --shadow-raised: 2px 2px 0 0 var(--shadow-color);
98
36
  --shadow-hover: 3px 3px 0 0 var(--shadow-color);
99
37
  --shadow-pressed: 0 0 0 0 var(--shadow-color);
100
- --shadow-overlay: 6px 6px 0 0 var(--shadow-color); /* the overlay plane: 6px, past anything the page can reach TR: katman düzlemi: 6px, sayfanın ulaşabileceği her şeyin ötesinde */
101
- --shadow-seated-pressed: inset 0 0 0 0 transparent; /* seated never lifts, so it has nothing to collapse (13 §2) TR: oturmuş olan hiç kalkmaz, yani çökecek bir şeyi yok (13 §2) */
38
+ --shadow-overlay: 6px 6px 0 0 var(--shadow-color);
39
+ --shadow-seated-pressed: inset 0 0 0 0 transparent;
102
40
 
103
- --background: #f5f2ec; /* warm paper TR: sıcak kâğıt */
41
+ --background: #f5f2ec;
104
42
  --foreground: #26221a;
105
43
  --card: #fdfcfa;
106
44
  --card-foreground: #26221a;
107
45
  --popover: #fdfcfa;
108
46
  --popover-foreground: #26221a;
109
47
 
110
- --primary: #2069c9; /* the FACE: L* 45, carries white ink at 5.22:1 (13 §2) TR: YÜZ: L* 45, beyaz mürekkebi 5.22:1 ile taşıyor (13 §2) */
48
+ --primary: #2069c9;
111
49
  --primary-foreground: #fdfcfa;
112
50
  --secondary: #eceae6;
113
51
  --secondary-foreground: #453f34;
114
52
  --muted: #eceae6;
115
- --muted-foreground: #6f695b; /* = --color-ink-faint: the same colour in the other name family, moved in step (contrast gate) TR: = --color-ink-faint: öteki ad ailesindeki aynı renk, onunla birlikte taşındı (kontrast kapısı) */
116
- --accent: #ecedf3; /* selected-row wash TR: seçili satır yıkaması */
53
+ --muted-foreground: #6f695b;
54
+ --accent: #ecedf3;
117
55
  --accent-foreground: #12245c;
118
56
  --destructive: #b3341f;
119
57
  --destructive-foreground: #fdfcfa;
120
- --success: #0a7a5f; /* healthy AND resolved share one green (13 Yasa 3) TR: sağlıklı VE çözüldü tek bir yeşili paylaşıyor (13 Yasa 3) */
58
+ --success: #0a7a5f;
121
59
  --success-foreground: #fdfcfa;
122
60
  --warning: #8a5a0b;
123
61
  --warning-foreground: #fdfcfa;
124
- --beacon: #12245c; /* ⚠️ no separate signature colour; see note below TR: ⚠️ ayrı bir imza rengi yok; aşağıdaki nota bakın */
62
+ --beacon: #12245c;
125
63
  --beacon-foreground: #fdfcfa;
126
64
 
127
- --border: #e2ded6; /* the single rule colour TR: tek çizgi rengi */
128
- /* Instrument scale marks (13 §4). NOT a border: a gauge's ticks are how the dial is READ, so they
129
- answer to a FLOOR (be visible on every surface the dial can sit on), never to the border band's
130
- deliberate softness. Kept warm-taupe in family, several steps darker than --border. */
131
- --tick: #bdb8ae; /* scale marks answer to a FLOOR, not to the border's softness: they must read on card, page AND muted (13 §4) TR: ölçek işaretleri kenarın yumuşaklığına değil bir TABANA cevap verir: kartta, sayfada VE soluk zeminde okunmalı (13 §4) */
132
- --input: #d2cec8; /* = --shadow-color. Yasa 1: the edge and the offset are one colour TR: = --shadow-color. Yasa 1: kenar ile kaydırma tek renktir */
65
+ --border: #e2ded6;
66
+
67
+ --tick: #bdb8ae;
68
+ --input: #d2cec8;
133
69
  --ring: #12245c;
134
70
 
135
- /* Categorical series: for data that is NOT a status (regions, plans, series).
136
- Deliberately QUIETER than the status palette: C* 26 against status's 36–65, so a
137
- chart can never out-shout an event. Hues avoid critical's red (40°) and
138
- resolved's green (169°) — the two carrying the strongest meaning, and the two a
139
- reader would most easily mistake on a line. Measured: 22 ΔE between neighbours,
140
- 20 ΔE to the nearest status colour.
141
- TR: Kategorik seriler: durum OLMAYAN veri için (bölgeler, planlar, seriler). Durum
142
- paletinden bilerek daha SESSİZ: durumun 36–65'ine karşı C* 26, yani bir grafik bir
143
- olayın sesini asla bastıramıyor. */
144
71
  --chart-1: #887c4f;
145
72
  --chart-2: #32888a;
146
73
  --chart-3: #4782a5;
@@ -148,21 +75,15 @@
148
75
  --chart-5: #a36c84;
149
76
  }
150
77
 
151
- /* tamga:tema-koyu */
152
78
  .dark {
153
- /* Night field station — warm charcoal, not cold navy. */
154
- /* Elevation (docs/13-design-soul §2 "night edge"): a darkening bottom shadow can't read on a
155
- near-black ground (measured ceiling ΔL* ~8 vs light's ~16-20), so dark pushes --shadow-color to
156
- near-black for max bottom separation AND adds the load-bearing cue — a 1px warm-white inset TOP
157
- rim (light catches the raised top edge at night). Same two-layer formulas as light; on press the
158
- rim goes transparent → the surface reads pressed flat (1:1 with light's bottom-out). */
79
+
159
80
  --shadow-color: #363e6e;
160
- --shadow-rim: transparent; /* the edge colour carries dark on its own — no rim needed */
81
+ --shadow-rim: transparent;
161
82
  --shadow-ambient: rgb(6 6 22 / 0.62);
162
- --shadow-raised: 2px 2px 0 0 var(--shadow-color); /* diagonal, blurless (13 Yasa 1) */
83
+ --shadow-raised: 2px 2px 0 0 var(--shadow-color);
163
84
  --shadow-hover: 3px 3px 0 0 var(--shadow-color);
164
85
  --shadow-pressed: 0 0 0 0 var(--shadow-color);
165
- --shadow-overlay: 6px 6px 0 0 var(--shadow-color); /* the overlay plane: 6px, past anything the page can reach */
86
+ --shadow-overlay: 6px 6px 0 0 var(--shadow-color);
166
87
  --shadow-seated-pressed: inset 0 0 0 0 transparent;
167
88
 
168
89
  --background: #0f1127;
@@ -172,8 +93,8 @@
172
93
  --popover: #131832;
173
94
  --popover-foreground: #efeef4;
174
95
 
175
- --primary: #53a4fa; /* face flips bright: white ink caps the fill at L* 47 on a dark ground */
176
- --primary-foreground: #12245c; /* navy ink on the bright face — 5.62:1 */
96
+ --primary: #53a4fa;
97
+ --primary-foreground: #12245c;
177
98
  --secondary: #1c2241;
178
99
  --secondary-foreground: #d4d4df;
179
100
  --muted: #1c2241;
@@ -190,7 +111,7 @@
190
111
  --beacon-foreground: #0f1127;
191
112
 
192
113
  --border: #262d54;
193
- --tick: #3f4880; /* same floor, measured against the darkest dial surface */
114
+ --tick: #3f4880;
194
115
  --input: #363e6e;
195
116
  --ring: #86a7f3;
196
117
 
@@ -201,10 +122,6 @@
201
122
  --chart-5: #ca90a9;
202
123
  }
203
124
 
204
- /* Köprü: tema ailesinin adlarını kitin `--color-*` ad alanına bağlıyor. Bir
205
- token'ın Tailwind utility'si üretip üretmediği buradan geçip geçmediğine
206
- bağlı, o yüzden işaretli.
207
- tamga:kopru */
208
125
  @theme inline {
209
126
  --color-background: var(--background);
210
127
  --color-foreground: var(--foreground);
@@ -234,46 +151,30 @@
234
151
  --color-ring: var(--ring);
235
152
 
236
153
  --color-chart-1: var(--chart-1);
237
- /* Teal, the second series. Far enough from resolved's green that a line is
238
- never mistaken for a status. */
154
+
239
155
  --color-chart-2: var(--chart-2);
240
- /* Blue, the third series. */
156
+
241
157
  --color-chart-3: var(--chart-3);
242
- /* Violet, the fourth series. */
158
+
243
159
  --color-chart-4: var(--chart-4);
244
- /* Rose, the fifth and last. Beyond five the eye stops telling series apart
245
- and a legend stops helping. */
160
+
246
161
  --color-chart-5: var(--chart-5);
247
162
 
248
- /* Typographic lock (docs/13-design-soul §6) — DECISION CHANGED 2026-08-16 (Berika).
249
- The product runs on the SYSTEM UI stack. Outfit and JetBrains Mono were the earlier lock, but
250
- the prototype everyone judged the design against had a broken variable chain and was silently
251
- rendering system UI the whole time — that is the typography the design was actually approved
252
- with, so it is the typography that ships.
253
- Written out as an explicit value rather than left to a fallback: a stack you can read is a
254
- stack you can change. Reverting is these three lines. */
255
163
  --font-sans: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
256
- /* Measure — how long a line is allowed to get before the eye loses the start
257
- of the next one. A typographic decision, so it lives with the tokens rather
258
- than as an invented number in a className (13 §6). */
259
- --measure-tight: 36ch; /* a note under a control */
260
- --measure: 54ch; /* body copy in a card */
261
- --measure-wide: 70ch; /* documentation prose */
262
-
263
- --font-display: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* headings are the same face, heavier — never a separate display cut (13 §6) */
264
- /* Mono is the same face too — this is what the prototype did, and it is the shape the design was
265
- approved in. The cost is real and worth stating: digits are no longer tabular by default, so a
266
- column of numbers stops aligning on its own. `tabular-nums` is still available where a column
267
- needs it. */
164
+
165
+ --measure-tight: 36ch;
166
+ --measure: 54ch;
167
+ --measure-wide: 70ch;
168
+
169
+ --font-display: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
170
+
268
171
  --font-mono: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
269
172
 
270
- /* Shape rhythm (docs/13-design-soul §5), base --radius = 0.75rem. Kept as a single-knob
271
- calc scale: sm = 0.5rem and lg = 1rem land exactly on §5; md stays a shadcn-compat step. */
272
- --radius-sm: calc(var(--radius) - 4px); /* 0.5rem — badges, tags, inline chips (§5) */
273
- --radius-md: calc(var(--radius) - 2px); /* 0.625rem — shadcn default step */
274
- --radius-lg: calc(var(--radius) + 4px); /* 1rem — cards, panels (§5) */
275
- --radius-xl: calc(var(--radius) + 8px); /* 1.25rem — large surfaces */
276
- --radius-full: 9999px; /* avatars and the live dot ONLY (§5) */
173
+ --radius-sm: calc(var(--radius) - 4px);
174
+ --radius-md: calc(var(--radius) - 2px);
175
+ --radius-lg: calc(var(--radius) + 4px);
176
+ --radius-xl: calc(var(--radius) + 8px);
177
+ --radius-full: 9999px;
277
178
  }
278
179
 
279
180
  @layer base {
@@ -285,7 +186,7 @@
285
186
  background-color: var(--background);
286
187
  color: var(--foreground);
287
188
  }
288
- /* GEÇİCİ (Faz 2): headings in the display cut. Which face, which tracking — undecided. */
189
+
289
190
  h1,
290
191
  h2,
291
192
  h3 {
@@ -293,10 +194,6 @@
293
194
  letter-spacing: -0.01em;
294
195
  }
295
196
 
296
- /* Skeleton breath — an opacity breath, never a shimmer sweep (13 §8, §10).
297
- Deep and quick on purpose: it started shallow and slow, which was right in
298
- principle and useless in practice — at a glance you could not tell a loading
299
- panel from a settled one, and that is its only job. */
300
197
  @keyframes skeleton-breath {
301
198
  0%,
302
199
  100% {
@@ -311,8 +208,6 @@
311
208
  animation-delay: var(--skeleton-delay, 0ms);
312
209
  }
313
210
 
314
- /* The live mark. Brightness only — never a transform, or it starts competing
315
- with the mascot's channel and Yasa 4 stops being enforceable (13 §3). */
316
211
  @keyframes beacon-breath {
317
212
  0%,
318
213
  100% {
@@ -326,9 +221,6 @@
326
221
  animation: beacon-breath var(--duration-beacon) var(--ease-breath) infinite;
327
222
  }
328
223
 
329
- /* Decorative motion goes static under reduced motion. MECHANISM — keep in every art direction.
330
- A stopped skeleton must still READ as a placeholder, so it parks near the middle of the
331
- breath rather than at either end; an empty box is worse than no skeleton. */
332
224
  @media (prefers-reduced-motion: reduce) {
333
225
  .animate-skeleton-breath {
334
226
  animation: none;
@@ -340,12 +232,6 @@
340
232
  }
341
233
  }
342
234
 
343
- /* ============================================================
344
- Press choreography (docs/13-design-soul §2) — THE single source for every raised interactive
345
- surface (buttons, clickable cards). Apply the `press-surface` class; never re-implement it per
346
- component (no second copy). Decorative, non-clickable surfaces must NOT use it (Law 2).
347
- No transition-all — the property list is explicit.
348
- ============================================================ */
349
235
  .press-surface {
350
236
  transform: translateY(0);
351
237
  box-shadow: var(--shadow-raised);
@@ -355,16 +241,7 @@
355
241
  transition-duration: var(--duration-quick);
356
242
  transition-timing-function: var(--ease-instrument);
357
243
  }
358
- /* The working surface: one card that holds a whole screen (13 §4b).
359
- The chrome around it — rail, header, ground — is all --card with no dividing
360
- line, so it reads as one continuous frame. This is the only thing on top of
361
- that frame, which is why it takes the CONTROL radius rather than the card
362
- radius: at this size a softer corner makes the whole screen look like a
363
- widget, and the sharper one keeps it in the same family as the buttons
364
- inside it.
365
- NOT a motion rule: this sat inside the reduced-motion query, so the surface
366
- had no ground, no edge and no radius for anyone who had not turned reduced
367
- motion on. */
244
+
368
245
  .app-surface {
369
246
  background: var(--background);
370
247
  border: 1px solid var(--border);
@@ -372,7 +249,7 @@
372
249
  }
373
250
 
374
251
  @media (prefers-reduced-motion: reduce) {
375
- /* Functional feedback (lift, press travel, focus ring) stays — just shortened (13 §11). */
252
+
376
253
  .press-surface {
377
254
  transition-duration: var(--duration-instant);
378
255
  }
@@ -380,16 +257,9 @@
380
257
  .press-surface:hover:not(:disabled):not([aria-disabled="true"]):not([data-loading="true"]) {
381
258
  transform: translate(-1px, -1px);
382
259
  box-shadow: var(--shadow-hover);
383
- /* Hover is carried by HEIGHT alone (13 §2). The inherited rule also turned the
384
- border to the signature colour; that was dropped deliberately. One event
385
- should produce one signal, and in this system an accent border already means
386
- "selected or focused" — spending it on "the pointer is here" would blunt it. */
260
+
387
261
  }
388
- /* 1:1 on BOTH axes — the offset is diagonal (13 Yasa 1), so the travel has to be too, or the
389
- surface lands beside its own shadow instead of on it. Measured in-browser: a vertical-only
390
- press against a 2px 2px offset left the button 2px to the left of where it bottomed out.
391
- If this scale ever changes, keep the press translate EQUAL to --shadow-raised's offset on
392
- both x and y. */
262
+
393
263
  .press-surface:active:not(:disabled):not([aria-disabled="true"]):not([data-loading="true"]) {
394
264
  transform: translate(2px, 2px);
395
265
  box-shadow: var(--shadow-pressed);
@@ -397,7 +267,7 @@
397
267
  transition-timing-function: var(--ease-press);
398
268
  }
399
269
  .press-surface:focus-visible {
400
- /* 2px beacon ring @2px offset; box-shadow + transform untouched — focus NEVER flattens (13 §2). */
270
+
401
271
  outline-color: var(--beacon);
402
272
  }
403
273
  .press-surface:disabled,
@@ -407,46 +277,25 @@
407
277
  border-color: color-mix(in oklab, var(--border) 50%, transparent);
408
278
  }
409
279
  .press-surface[data-loading="true"] {
410
- transform: translateY(0); /* travel locked */
280
+ transform: translateY(0);
411
281
  box-shadow: var(--shadow-raised);
412
282
  }
413
283
 
414
- /* ============================================================
415
- Surfaces (docs/13 §5) — the raised panel, defined once.
416
-
417
- §5 is explicit and was not being followed: surfaces take --radius-card (6px), the edge is 1px in
418
- the SHADOW colour (Yasa 1: the edge and the offset are one colour), and emphasis comes from a
419
- hard diagonal offset. shadcn's `rounded-xl border shadow-sm` broke all three — `shadow-sm` is a
420
- BLURRED shadow, which Yasa 1 forbids outright, and a blurred shadow is exactly what makes a
421
- neobrutalist surface read as a generic SaaS card.
422
-
423
- Role aliases, so call sites read by ROLE rather than by size (§5):
424
- ============================================================ */
425
- /* tamga:sabit-rol — rol takma adları ve yapısal ölçüler. Temaya bağlı değil. */
426
284
  :root {
427
- --radius-ctl: var(--radius-md); /* 4px: button, input, chip, segment TR: 4px: düğme, girdi, çip, segment */
428
- --radius-card: var(--radius); /* 6px: card, overlay, panel TR: 6px: kart, katman, panel */
429
-
430
- /* §5's structural rhythm. `--gutter` is the vertical line every heading, label, row and cell
431
- starts on; it existed in the decision and nowhere in the code, so each screen was picking its
432
- own px-6 / px-8 and the left edge wandered from page to page.
433
- TR: §5'in yapısal ritmi. `--gutter` her başlığın, etiketin, satırın ve hücrenin
434
- üstünde başladığı dikey çizgi; kararda vardı ama kodda hiçbir yerde yoktu, o yüzden
435
- her ekran kendi px-6 / px-8'ini seçiyor ve sol kenar sayfadan sayfaya kayıyordu. */
285
+ --radius-ctl: var(--radius-md);
286
+ --radius-card: var(--radius);
287
+
436
288
  --gutter: 24px;
437
- --row: 56px; /* list row TR: liste satırı */
438
- --row-sm: 48px; /* dense row TR: sık satır */
439
- --control: 40px; /* every control's height (§5) TR: her kontrolün yüksekliği (§5) */
289
+ --row: 56px;
290
+ --row-sm: 48px;
291
+ --control: 40px;
440
292
  }
441
293
 
442
- /* The one left line every page shares. */
443
294
  .gutter {
444
295
  padding-left: var(--gutter);
445
296
  padding-right: var(--gutter);
446
297
  }
447
298
 
448
- /* A raised panel. Same grammar as .press-surface but with no choreography: it is not pressable, so
449
- it never lifts and never presses (Law 2). */
450
299
  .card-surface {
451
300
  background: var(--card);
452
301
  border: 1px solid var(--shadow-color);
@@ -454,49 +303,28 @@
454
303
  box-shadow: var(--shadow-raised);
455
304
  }
456
305
 
457
- /* A seated well: content that sits IN the page rather than on it — filter bars, table headers,
458
- sub-panels. No offset, ever. */
459
306
  .sunk-surface {
460
307
  background: var(--muted);
461
308
  border: 1px solid var(--shadow-color);
462
309
  border-radius: var(--radius-card);
463
310
  }
464
311
 
465
- /* Rayın kendi fiziği artık `kit.css`'te `.tamga-rail-link` olarak yaşıyor ve
466
- `--color-nav-*` okuyor. Burada duran `.rail-link` bloğu ile onu besleyen
467
- sekiz `--sidebar-*` token'ı SİLİNDİ: hiçbir bileşen onlara dokunmuyordu, ve
468
- ölü bir token yalnız yer kaplamıyor, yanlış da söylüyor. Token sayfası
469
- `--sidebar-primary` için kırmızı bir 1.08 basıyordu; hiçbir yerde
470
- kullanılmayan bir rengin kontrast uyarısı, gerçek uyarıların arasında
471
- gürültüdür. */
472
-
473
312
  @media (prefers-reduced-motion: reduce) {
474
313
  .rail-link {
475
314
  transition-duration: var(--duration-instant);
476
315
  }
477
316
  }
478
317
 
479
- /* ============================================================
480
- Seated choreography (docs/13-design-soul §2) — THE single source for controls that sit IN a track
481
- (tabs trigger, switch, checkbox, radio, segmented). Sibling of .press-surface, SAME grammar
482
- (beacon focus ring, beacon hover warm, same tokens, same reduced-motion) — but the seated physics:
483
- flat at rest, presses INTO the track on active (inset mirror of the raised bottom-out). No translate,
484
- no scale. Apply the `seated-surface` class + a `border border-transparent` (so the warm shows).
485
- Never re-implement it per component; decorative surfaces must NOT use it (Law 2).
486
- ============================================================ */
487
318
  .seated-surface {
488
- position: relative; /* anchors the ::after tint overlay */
489
- box-shadow: inset 0 0 0 0 var(--shadow-color); /* flat, but transitionable to the inset press */
319
+ position: relative;
320
+ box-shadow: inset 0 0 0 0 var(--shadow-color);
490
321
  outline: 2px solid transparent;
491
322
  outline-offset: 2px;
492
323
  transition-property: box-shadow, border-color, outline-color, color;
493
324
  transition-duration: var(--duration-quick);
494
325
  transition-timing-function: var(--ease-instrument);
495
326
  }
496
- /* The beacon "light" LAYERS over the control's own background via a solid-color ::after overlay —
497
- it never replaces the state (a checked switch keeps --primary; an active tab keeps --background).
498
- Solid color, NOT a gradient (§10). This also sidesteps the specificity clash with the component's
499
- data-[state]:bg-* utility entirely — it's a different element and a different property. */
327
+
500
328
  .seated-surface::after {
501
329
  content: "";
502
330
  position: absolute;
@@ -507,25 +335,25 @@
507
335
  transition: background-color var(--duration-quick) var(--ease-instrument);
508
336
  }
509
337
  @media (prefers-reduced-motion: reduce) {
510
- /* functional feedback kept, shortened (13 §11) */
338
+
511
339
  .seated-surface,
512
340
  .seated-surface::after {
513
341
  transition-duration: var(--duration-instant);
514
342
  }
515
343
  }
516
344
  .seated-surface:hover:not(:disabled):not([aria-disabled="true"]) {
517
- /* seated answers by FILLING, not by recolouring its edge (13 §2) */
345
+
518
346
  }
519
347
  .seated-surface:hover:not(:disabled):not([aria-disabled="true"])::after {
520
348
  background-color: var(--accent);
521
349
  }
522
350
  .seated-surface:active:not(:disabled):not([aria-disabled="true"]) {
523
- box-shadow: var(--shadow-seated-pressed); /* presses INTO the track — inset mirror of raised */
351
+ box-shadow: var(--shadow-seated-pressed);
524
352
  transition-duration: var(--duration-instant);
525
353
  transition-timing-function: var(--ease-press);
526
354
  }
527
355
  .seated-surface:focus-visible {
528
- outline-color: var(--beacon); /* SAME 2px beacon ring as raised — the shared grammar */
356
+ outline-color: var(--beacon);
529
357
  }
530
358
  .seated-surface:disabled,
531
359
  .seated-surface[aria-disabled="true"] {
@@ -533,280 +361,96 @@
533
361
  border-color: color-mix(in oklab, var(--border) 50%, transparent);
534
362
  }
535
363
 
536
- /* ==============================================================
537
- TASLAK tokens (src/taslak) — here rather than in taslak.css because Tailwind generates utilities
538
- only for the entry that imports it, and the draft needs `bg-shell`, `text-ink`, `text-body`.
539
- Names are additive: v5 speaks --background/--card and Tailwind's own text scale, so nothing is
540
- overwritten. `static` because a token reached only through var() in a TSX inline style is
541
- invisible to the tree-shaker. Dark overrides and the tamga-* classes stay in taslak.css.
542
- ============================================================== */
543
- /* Kitin kendi ad ailesi (--color-page, --color-ink …). Koyu karşılıkları
544
- kit.css'te, ayrı bir dosyada: tam olarak bir parite kapısı gerektiren şey.
545
- tamga:kit-acik */
546
364
  @theme static {
547
365
 
548
-
549
- /* 1 · neutral ramp — cooled off, one step per layer */
550
- /* The ground everything sits on. The rail and the band share it: what divides
551
- them is a 1px line, never a fill.
552
- TR: Her şeyin üstünde durduğu zemin. Ray ve şerit de aynı zemini kullanıyor: onları
553
- ayıran şey 1px'lik bir çizgi, asla bir dolgu. */
554
366
  --color-page: #f5f2ec;
555
- /* A raised surface: cards, overlays, popovers. It is barely lighter than the
556
- page on purpose; the edge does the lifting.
557
- TR: Yükseltilmiş yüzey: kartlar, katmanlar, balonlar. Sayfadan bilerek çok az açık;
558
- yükseltmeyi kenar yapıyor. */
367
+
559
368
  --color-shell: #fdfcfa;
560
- /* A row under the pointer, and a selected row's neutral wash. Same value as
561
- sunk, different job.
562
- TR: İmlecin altındaki satır, ve seçili satırın nötr yıkaması. Gömülü ile aynı değer,
563
- farklı iş. */
369
+
564
370
  --color-hover: #eceae6;
565
- /* The strip above a table: counters, page-size, summary lines. It is the
566
- page, separated by a line.
567
- TR: Tablonun üstündeki şerit: sayaçlar, sayfa boyu, özet satırları. Sayfanın
568
- kendisi, bir çizgiyle ayrılmış. */
371
+
569
372
  --color-band: #f5f2ec;
570
- /* The navigation rail. Also the page: a sidebar that fills itself becomes a
571
- second surface competing with the content.
572
- TR: Gezinme rayı. O da sayfa: kendini dolduran bir kenar çubuğu, içerikle yarışan
573
- ikinci bir yüzeye dönüşüyor. */
373
+
574
374
  --color-rail: #f5f2ec;
575
- /* Content that sits IN the page rather than on it: filter bars, table
576
- headers, code blocks, sub-panels.
577
- TR: Sayfanın üstünde değil İÇİNDE duran içerik: filtre çubukları, tablo başlıkları,
578
- kod blokları, alt paneller. */
375
+
579
376
  --color-sunk: #eceae6;
580
- /* the single rule colour: dividers and card edges
581
- TR: tek çizgi rengi: ayraçlar ve kart kenarları */
377
+
582
378
  --color-line: #e2ded6;
583
- /* Darkened from #d9d6d1 after v5's contrast gate measured it at ΔL* 9.8 against
584
- the page, just under the floor of 10 where a raised surface stops reading as
585
- raised. check-token-contrast now measures it here too, and reproduces that
586
- same 9.8, which is how we know the two gates share one arithmetic.
587
- TR: #d9d6d1'den koyulaştırıldı: v5'in kontrast kapısı sayfaya karşı ΔL* 9.8
588
- ölçmüştü, yükseltilmiş bir yüzeyin yükseltilmiş okunmayı bıraktığı 10 tabanının
589
- hemen altında. check-token-contrast artık burada da ölçüyor ve aynı 9.8'i üretiyor;
590
- iki kapının tek bir aritmetiği paylaştığını böyle biliyoruz. */
379
+
591
380
  --color-edge: #d2cec8;
592
- /* neutral fill under a chart: area body, sparkline wash
593
- TR: grafiğin altındaki nötr dolgu: alan gövdesi, kıvılcım çizgisi yıkaması */
381
+
594
382
  --color-chart-fill: #eceae6;
595
- /* Lightened text, and it answers to AA like any other text. Was #716b5d, which
596
- measured 4.41 against --color-sunk and --color-hover, under the 4.5 floor, so
597
- secondary text on a filter bar, a table header or a hovered row was failing
598
- while the same colour passed on the page. Nobody saw it: it fails by 0.09.
599
- Darkened one step to clear 4.5 on every surface it can land on (4.54 on sunk,
600
- 4.89 on the page, 5.32 on a card). check-token-contrast measures it now.
601
- TR: Açılmış metin, ve her metin gibi AA'ya cevap veriyor. #716b5d'ydi; --color-sunk
602
- ve --color-hover'a karşı 4.41 ölçüldü, 4.5 tabanının altında, yani bir filtre
603
- çubuğundaki ya da tablo başlığındaki ikincil metin, aynı renk sayfada geçerken orada
604
- kalıyordu. */
383
+
605
384
  --color-ink-faint: #6f695b;
606
- /* The second weight: labels, secondary rows, anything that supports the
607
- heading without competing with it.
608
- TR: İkinci ağırlık: etiketler, ikincil satırlar, başlıkla yarışmadan onu destekleyen
609
- her şey. */
385
+
610
386
  --color-ink-soft: #453f34;
611
- /* The heaviest weight: headings, table values, anything the eye should land
612
- on first.
613
- TR: En ağır ağırlık: başlıklar, tablo değerleri, gözün ilk konması gereken her şey. */
387
+
614
388
  --color-ink: #26221a;
615
389
 
616
- /* 2 · accent — interaction only */
617
- /* A face on a base, never a fill with a shadow. #12245c is L* 16 — our body
618
- text is L* 27 and our heading ink is L* 13, so as a fill it was a text
619
- colour, and every product primary worth comparing sits at L* 46–62. A
620
- near-black face leaves no room for a base under it, which is why the offset
621
- kept having to escape upward. The navy moved to the base, and the face
622
- sits at L* 45 carrying white ink: 29 ΔL* between the two layers. */
623
- --color-accent: #2069c9; /* primary fill TR: birincil dolgu */
624
- --color-accent-hover: #005ab5; /* darkens, not lightens; white ink needs it TR: açılmaz, koyulaşır; beyaz mürekkep bunu istiyor */
625
- /* The pressed face. It keeps going in the same direction as hover: darker in
626
- light, brighter in dark.
627
- TR: Basılı yüz. Üzerine gelmeyle aynı yönde devam ediyor: açıkta daha koyu, koyuda
628
- daha parlak. */
390
+ --color-accent: #2069c9;
391
+ --color-accent-hover: #005ab5;
392
+
629
393
  --color-accent-active: #004c9b;
630
- --color-accent-ink: #fdfcfa; /* white ink on the fill, 5.22:1 TR: dolgunun üstünde beyaz mürekkep, 5.22:1 */
631
- --color-accent-line: #12245c; /* link text, focus ring, thin marks TR: bağlantı metni, odak halkası, ince işaretler */
632
- --color-accent-bg: #ecedf3; /* selected row ground TR: seçili satırın zemini */
633
- /* The base the face sits on, and the primary's edge. This is where the brand
634
- navy belongs: dark, saturated, and doing the job a shadow is supposed to do
635
- instead of pretending to be a fill.
636
- TR: Yüzün üstüne oturduğu taban, ve birincilin kenarı. Marka lacivertinin yeri
637
- burası: koyu, doygun, ve bir dolgu taklidi yapmak yerine bir gölgenin yapması
638
- gereken işi yapıyor. */
394
+ --color-accent-ink: #fdfcfa;
395
+ --color-accent-line: #12245c;
396
+ --color-accent-bg: #ecedf3;
397
+
639
398
  --color-accent-shadow: #12245c;
640
399
 
641
- /* 3 · status — healthy green, silenced neutral */
642
- /* Something is broken and someone has to act. The only red in the system, and
643
- it never decorates.
644
- TR: Bir şey bozuldu ve birinin harekete geçmesi gerekiyor. Sistemdeki tek kırmızı,
645
- ve asla süslemiyor. */
646
400
  --color-critical: #b3341f;
647
- /* The wash behind a critical chip or row. A tint, not a fill: it carries no
648
- text of its own.
649
- TR: Kritik bir çipin ya da satırın arkasındaki yıkama. Bir dolgu değil bir ton:
650
- kendi metnini taşımıyor. */
401
+
651
402
  --color-critical-bg: #fbeae4;
652
- /* Not broken yet, but heading there. A threshold crossed, a queue growing, a
653
- stock running low.
654
- TR: Henüz bozulmadı ama o yöne gidiyor. Aşılan bir eşik, büyüyen bir kuyruk, azalan
655
- bir stok. */
403
+
656
404
  --color-warn: #8a5a0b;
657
- /* The wash behind a warning chip or row.
658
- TR: Uyarı çipinin ya da satırının arkasındaki yıkama. */
405
+
659
406
  --color-warn-bg: #fbf1dd;
660
- /* Healthy, and also resolved. One green for both, because a reader should
661
- not have to learn two.
662
- TR: Sağlıklı, ve aynı zamanda çözüldü. İkisi için tek yeşil, çünkü okuyanın iki renk
663
- öğrenmesi gerekmemeli. */
407
+
664
408
  --color-resolved: #0a7a5f;
665
- /* The wash behind a healthy or resolved chip.
666
- TR: Sağlıklı ya da çözülmüş bir çipin arkasındaki yıkama. */
409
+
667
410
  --color-resolved-bg: #e3f3ec;
668
- /* Was #716b5d, the same value as ink-faint, and it failed on the one ground it
669
- is documented against: silent on chart-fill measured 4.41:1, under AA. It
670
- passed on the card (5.17:1), which is why it went unnoticed: the healthy
671
- and paused chips are the only place the pair actually meets. Darkened to
672
- clear the wash (5.02:1) while staying clearly the muted tone. It no longer
673
- tracks ink-faint, which is correct: they are different roles.
674
- TR: #716b5d'ydi, ink-faint ile aynı değer, ve belgelendiği tek zeminde kalıyordu:
675
- chart-fill üstünde 4.41:1, AA'nın altında. Kartta geçiyordu (5.17:1), fark
676
- edilmemesinin sebebi de bu. */
411
+
677
412
  --color-silent: #696256;
678
413
 
679
- /* Instrument scale marks: the progress dial's ticks. NOT --color-edge: a tick is
680
- READ, so it answers to a floor (visible on card, page AND the sunk wash), never
681
- to the rule line's deliberate softness. On --color-sunk the edge measured ΔL* 7.0
682
- against a floor of 12.
683
- TR: Gösterge ölçek işaretleri: ilerleme kadranının çentikleri. --color-edge DEĞİL:
684
- bir çentik OKUNUR, yani çizginin bilerek seçilmiş yumuşaklığına değil bir tabana
685
- cevap verir (kartta, sayfada VE gömülü yıkamada görünecek). */
686
414
  --color-tick: #bdb8ae;
687
415
 
688
- /* Categorical series: data that is NOT a status (regions, plans, series).
689
- Quieter than the status palette on purpose: C* 26 against status's 36–65, so a
690
- chart can never out-shout an event. Hues avoid critical's red and resolved's
691
- green, the two a reader would most easily misread on a line.
692
- TR: Kategorik seriler: durum OLMAYAN veri (bölgeler, planlar, seriler). Durum
693
- paletinden bilerek daha sessiz: durumun 36–65'ine karşı C* 26, yani bir grafik bir
694
- olayın sesini asla bastıramıyor. */
695
416
  --color-chart-1: #887c4f;
696
- /* Teal, the second series. Far enough from resolved's green that a line is
697
- never mistaken for a status.
698
- TR: Deniz mavisi, ikinci seri. Çözüldü yeşilinden, bir çizginin durum sanılmayacağı
699
- kadar uzak. */
417
+
700
418
  --color-chart-2: #32888a;
701
- /* Blue, the third series.
702
- TR: Mavi, üçüncü seri. */
419
+
703
420
  --color-chart-3: #4782a5;
704
- /* Violet, the fourth series.
705
- TR: Mor, dördüncü seri. */
421
+
706
422
  --color-chart-4: #7f76a2;
707
- /* Rose, the fifth and last. Beyond five the eye stops telling series apart
708
- and a legend stops helping.
709
- TR: Gül, beşinci ve sonuncu. Beşten sonra göz serileri ayırmayı bırakıyor ve bir
710
- gösterge artık yardım etmiyor. */
423
+
711
424
  --color-chart-5: #a36c84;
712
425
 
713
- /* rail navigation */
714
- /* An idle rail label is TEXT, so it answers to AA. Was #8a857a: 3.29 against the
715
- rail, while dark's counterpart sat at 5.42, and the asymmetry was the tell that
716
- light had never been measured. Now L* 46, the same band as --color-ink-faint,
717
- which is what a faint label should be.
718
- TR: Boştaki bir ray etiketi METİNDİR, yani AA'ya cevap verir. #8a857a'ydı: raya
719
- karşı 3.29, koyudaki karşılığı 5.42'de dururken. Bu asimetri, açığın hiç
720
- ölçülmediğinin işaretiydi. */
721
426
  --color-nav-idle: #726d62;
722
- /* A rail item under the pointer. Darker than idle in light, brighter in
723
- dark: the label steps toward the reader.
724
- TR: İmlecin altındaki ray öğesi. Açıkta boştakinden koyu, koyuda daha parlak: etiket
725
- okuyana doğru bir adım atıyor. */
427
+
726
428
  --color-nav-hover: #4a4438;
727
- /* The wash behind a hovered rail item. The current item takes an outline
728
- instead, never this fill.
729
- TR: Üzerine gelinen ray öğesinin arkasındaki yıkama. Bulunulan öğe bunun yerine bir
730
- dış çizgi alıyor, asla bu dolguyu. */
429
+
731
430
  --color-nav-hover-bg: #eae6dd;
732
431
 
733
- /* overlay plane: dropdowns, popovers, dialogs, toasts
734
- TR: katman düzlemi: açılır listeler, balonlar, diyaloglar, bildirimler */
735
432
  --color-scrim: rgba(38, 34, 26, 0.32);
736
433
 
737
- /* ---------------------------------------------------------------- *
738
- * Type scale. Ten steps, and nothing outside them.
739
- *
740
- * The kit ran on 19 hand-written sizes across 272 places, including
741
- * 12.5px, 13.5px and 14.5px — half pixels, which no screen renders
742
- * cleanly and which nobody chose on purpose. They existed because
743
- * each one was typed at the moment it was needed, so the answer to
744
- * "how big is body text?" was "somewhere between 12 and 14".
745
- *
746
- * Each step has ONE job. Pick by role, never by how it looks in the
747
- * spot you happen to be in.
748
- * ---------------------------------------------------------------- */
749
- --text-micro: 10px; /* axis ticks, scale ends, the smallest label TR: eksen çentikleri, ölçek uçları, en küçük etiket */
750
- --text-caption: 11px; /* dense mono identifiers, chip text TR: sık eşaralıklı kimlikler, çip metni */
751
- --text-small: 12px; /* meta, secondary, table sub-lines TR: üstveri, ikincil satırlar, tablo alt satırları */
752
- --text-body: 13px; /* THE default: rows, cells, body copy TR: VARSAYILAN: satırlar, hücreler, gövde metni */
753
- --text-control: 14px; /* inputs, textareas, larger body TR: girdiler, metin alanları, daha büyük gövde */
754
- --text-subhead: 15px; /* card and section titles TR: kart ve bölüm başlıkları */
755
- --text-title: 18px; /* page titles TR: sayfa başlıkları */
756
- /* The small display step: a card's hero number, a score.
757
- TR: Küçük gösterim adımı: bir kartın öne çıkan sayısı, bir puan. */
434
+ --text-micro: 10px;
435
+ --text-caption: 11px;
436
+ --text-small: 12px;
437
+ --text-body: 13px;
438
+ --text-control: 14px;
439
+ --text-subhead: 15px;
440
+ --text-title: 18px;
441
+
758
442
  --text-display-sm: 24px;
759
- --text-display: 30px; /* KPI numbers TR: KPI sayıları */
760
- /* The largest step, and the rarest. One per screen at most.
761
- TR: En büyük adım, ve en nadiri. Ekran başına en fazla bir tane. */
443
+ --text-display: 30px;
444
+
762
445
  --text-display-lg: 40px;
763
446
 
764
- /* Measure — how long a line of text is allowed to get before the eye loses
765
- the start of the next one. Three steps, and nothing outside them; the kit
766
- ran on ten hand-written `ch` values across 31 places, which is the type
767
- scale's disease in a second coat. */
768
- --measure-tight: 36ch; /* a note under a control TR: bir kontrolün altındaki not */
769
- --measure: 54ch; /* body copy in a card TR: kart içindeki gövde metni */
770
- --measure-wide: 70ch; /* documentation prose TR: doküman metni */
771
-
772
- /* ---------------------------------------------------------------- *
773
- * Shape. One knob, and everything derives from it.
774
- *
775
- * Written as a calc scale rather than two loose numbers so "make the
776
- * product a little softer" stays a one-line edit — v5 inherits the
777
- * same single-knob structure, and matching it means the values port
778
- * without redesigning anything.
779
- *
780
- * The VALUE is a deliberate departure. v5 carries --radius: 12px with
781
- * a note pointing at the brand DNA's "soft corners"; this product went
782
- * the other way on purpose. It is an instrument read at 3am, and a
783
- * dense table of rows reads faster with corners that stop rather than
784
- * curve. Recorded as a knowing deviation, not an oversight — the same
785
- * way v5 records its own amber beacon as one.
786
- * ---------------------------------------------------------------- */
787
-
788
- /* aliases kept so call sites read by ROLE rather than by size */
789
-
790
- /* ---------------------------------------------------------------- *
791
- * Motion. Durations and curves are tokens for exactly the reason
792
- * colours are: written inline they drift. Before this block existed
793
- * the kit held 16 hand-written values doing four jobs, and they had
794
- * already scattered — a toast appeared in 200ms, a progress bar moved
795
- * in 240ms, a route revealed in 340ms. Nobody could point at a line
796
- * and call it wrong; it just felt uneven.
797
- *
798
- * --press is its own step and the smallest on purpose: a control that
799
- * answers a click in 100ms feels mechanical, which is the whole point
800
- * of a hard-offset button. Anything slower reads as lag.
801
- * ---------------------------------------------------------------- */
802
- --duration-press: 100ms; /* hover, press, focus: every control TR: üzerine gelme, basma, odak: her kontrol */
803
-
804
- --ease-standard: cubic-bezier(0.22, 1, 0.36, 1); /* everything that enters or moves TR: giren ya da hareket eden her şey */
805
-
806
- /* Loops. Long by design, and the only things allowed past --duration-slow.
807
- `--duration-spin` and `--ease-linear` lived here for the old CSS `.tamga-spinner`, a rotating
808
- ring. The kit's spinner is three marching bars (ui/spinner.tsx) — nothing in this product
809
- rotates any more, so both went with it.
810
- TR: Döngüler. Bilerek uzun, ve --duration-slow'u geçmesine izin verilen tek şeyler. */
447
+ --measure-tight: 36ch;
448
+ --measure: 54ch;
449
+ --measure-wide: 70ch;
450
+
451
+ --duration-press: 100ms;
452
+
453
+ --ease-standard: cubic-bezier(0.22, 1, 0.36, 1);
454
+
811
455
  --duration-bar: 900ms;
812
456
  }