@kashi-ui/css 0.0.0-stage → 0.3.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/kashi.css ADDED
@@ -0,0 +1,1227 @@
1
+ @layer kashi.tokens, kashi.base, kashi.components;
2
+
3
+ /* فونت وزیرمتن (Variable، وزن ۱۰۰ تا ۹۰۰) — لایسنس OFL */
4
+ @font-face {
5
+ font-family: "Vazirmatn";
6
+ src: url("./fonts/Vazirmatn.woff2") format("woff2-variations"),
7
+ url("./fonts/Vazirmatn.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ }
12
+
13
+ @layer kashi.tokens {
14
+ /* @kashi-ui/tokens — این فایل خودکار ساخته شده است */
15
+ :root {
16
+ --k-radius-factor: 1;
17
+ --k-density: 1;
18
+ --k-firoozeh-50: #e6fbf8;
19
+ --k-firoozeh-100: #c2f4ee;
20
+ --k-firoozeh-200: #8ce9df;
21
+ --k-firoozeh-300: #4fd8cb;
22
+ --k-firoozeh-400: #22c2b4;
23
+ --k-firoozeh-500: #0fa89b;
24
+ --k-firoozeh-600: #08877e;
25
+ --k-firoozeh-700: #0a6b65;
26
+ --k-firoozeh-800: #0d5551;
27
+ --k-firoozeh-900: #0f4644;
28
+ --k-firoozeh-950: #042a29;
29
+ --k-lajvard-50: #eef3ff;
30
+ --k-lajvard-100: #dbe5ff;
31
+ --k-lajvard-200: #bfd0ff;
32
+ --k-lajvard-300: #93b0ff;
33
+ --k-lajvard-400: #6185fd;
34
+ --k-lajvard-500: #3d5ef8;
35
+ --k-lajvard-600: #2740ed;
36
+ --k-lajvard-700: #1f30d9;
37
+ --k-lajvard-800: #2029b0;
38
+ --k-lajvard-900: #20298b;
39
+ --k-lajvard-950: #181b54;
40
+ --k-zafaran-50: #fff8eb;
41
+ --k-zafaran-100: #ffecc6;
42
+ --k-zafaran-200: #ffd788;
43
+ --k-zafaran-300: #ffbd4a;
44
+ --k-zafaran-400: #ffa520;
45
+ --k-zafaran-500: #f98307;
46
+ --k-zafaran-600: #dd5e02;
47
+ --k-zafaran-700: #b73e06;
48
+ --k-zafaran-800: #94300c;
49
+ --k-zafaran-900: #7a280d;
50
+ --k-zafaran-950: #461202;
51
+ --k-anar-50: #fff1f2;
52
+ --k-anar-100: #ffe0e2;
53
+ --k-anar-200: #ffc7cb;
54
+ --k-anar-300: #ffa0a6;
55
+ --k-anar-400: #ff6972;
56
+ --k-anar-500: #f83b47;
57
+ --k-anar-600: #e51d2a;
58
+ --k-anar-700: #c11420;
59
+ --k-anar-800: #a0141e;
60
+ --k-anar-900: #841820;
61
+ --k-anar-950: #48070b;
62
+ --k-pesteh-50: #f3faeb;
63
+ --k-pesteh-100: #e4f4d3;
64
+ --k-pesteh-200: #cbeaac;
65
+ --k-pesteh-300: #a9db7b;
66
+ --k-pesteh-400: #89c951;
67
+ --k-pesteh-500: #6aae33;
68
+ --k-pesteh-600: #518b25;
69
+ --k-pesteh-700: #3f6a21;
70
+ --k-pesteh-800: #35551f;
71
+ --k-pesteh-900: #2e491e;
72
+ --k-pesteh-950: #15270c;
73
+ --k-shab-0: #ffffff;
74
+ --k-shab-50: #f6f7f9;
75
+ --k-shab-100: #eceef2;
76
+ --k-shab-200: #d5d9e2;
77
+ --k-shab-300: #b1b9c9;
78
+ --k-shab-400: #8792ab;
79
+ --k-shab-500: #687491;
80
+ --k-shab-600: #535d78;
81
+ --k-shab-700: #444c62;
82
+ --k-shab-800: #2a2f3d;
83
+ --k-shab-850: #1e222c;
84
+ --k-shab-900: #161921;
85
+ --k-shab-950: #0d0f14;
86
+ --k-shab-1000: #08090c;
87
+ --k-brand-50: var(--k-firoozeh-50);
88
+ --k-brand-100: var(--k-firoozeh-100);
89
+ --k-brand-200: var(--k-firoozeh-200);
90
+ --k-brand-300: var(--k-firoozeh-300);
91
+ --k-brand-400: var(--k-firoozeh-400);
92
+ --k-brand-500: var(--k-firoozeh-500);
93
+ --k-brand-600: var(--k-firoozeh-600);
94
+ --k-brand-700: var(--k-firoozeh-700);
95
+ --k-brand-800: var(--k-firoozeh-800);
96
+ --k-brand-900: var(--k-firoozeh-900);
97
+ --k-brand-950: var(--k-firoozeh-950);
98
+ --k-space-0: 0;
99
+ --k-space-1: 0.25rem;
100
+ --k-space-2: 0.5rem;
101
+ --k-space-3: 0.75rem;
102
+ --k-space-4: 1rem;
103
+ --k-space-5: 1.25rem;
104
+ --k-space-6: 1.5rem;
105
+ --k-space-8: 2rem;
106
+ --k-space-10: 2.5rem;
107
+ --k-space-12: 3rem;
108
+ --k-space-16: 4rem;
109
+ --k-space-20: 5rem;
110
+ --k-space-24: 6rem;
111
+ --k-space-px: 1px;
112
+ --k-space-0_5: 0.125rem;
113
+ --k-space-1_5: 0.375rem;
114
+ --k-radius-none: 0;
115
+ --k-radius-sm: calc(0.25rem * var(--k-radius-factor));
116
+ --k-radius-md: calc(0.5rem * var(--k-radius-factor));
117
+ --k-radius-lg: calc(0.75rem * var(--k-radius-factor));
118
+ --k-radius-xl: calc(1rem * var(--k-radius-factor));
119
+ --k-radius-2xl: calc(1.5rem * var(--k-radius-factor));
120
+ --k-radius-full: 9999px;
121
+ --k-font-sans: "Vazirmatn", "Vazir", Tahoma, system-ui, sans-serif;
122
+ --k-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, "Vazirmatn", monospace;
123
+ --k-text-xs: 0.75rem;
124
+ --k-text-sm: 0.875rem;
125
+ --k-text-md: 0.9375rem;
126
+ --k-text-lg: 1.0625rem;
127
+ --k-text-xl: 1.25rem;
128
+ --k-text-2xl: 1.5rem;
129
+ --k-text-3xl: 1.875rem;
130
+ --k-text-4xl: 2.25rem;
131
+ --k-text-5xl: 3rem;
132
+ --k-text-6xl: 3.75rem;
133
+ --k-weight-light: 300;
134
+ --k-weight-regular: 400;
135
+ --k-weight-medium: 500;
136
+ --k-weight-semibold: 600;
137
+ --k-weight-bold: 700;
138
+ --k-weight-black: 900;
139
+ --k-leading-tight: 1.35;
140
+ --k-leading-normal: 1.75;
141
+ --k-leading-relaxed: 2;
142
+ --k-shadow-xs: 0 1px 2px rgb(10 13 18 / 0.05);
143
+ --k-shadow-sm: 0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1);
144
+ --k-shadow-md: 0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06);
145
+ --k-shadow-lg: 0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03);
146
+ --k-shadow-xl: 0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03);
147
+ --k-shadow-2xl: 0 24px 48px -12px rgb(10 13 18 / 0.18);
148
+ --k-duration-fast: 120ms;
149
+ --k-duration-normal: 200ms;
150
+ --k-duration-slow: 320ms;
151
+ --k-ease-standard: cubic-bezier(0.2, 0, 0, 1);
152
+ --k-ease-emphasized: cubic-bezier(0.3, 0, 0, 1.3);
153
+ --k-z-dropdown: 1000;
154
+ --k-z-sticky: 1100;
155
+ --k-z-overlay: 1300;
156
+ --k-z-modal: 1400;
157
+ --k-z-toast: 1500;
158
+ }
159
+
160
+ :root, [data-theme="dark"] {
161
+ color-scheme: dark;
162
+ --k-bg-primary: var(--k-shab-1000);
163
+ --k-bg-secondary: var(--k-shab-950);
164
+ --k-bg-tertiary: var(--k-shab-900);
165
+ --k-bg-elevated: var(--k-shab-900);
166
+ --k-bg-hover: rgb(255 255 255 / 0.05);
167
+ --k-bg-active: rgb(255 255 255 / 0.08);
168
+ --k-bg-brand: var(--k-brand-700);
169
+ --k-bg-brand-hover: var(--k-brand-800);
170
+ --k-bg-brand-subtle: color-mix(in srgb, var(--k-brand-500) 14%, transparent);
171
+ --k-bg-error: var(--k-anar-600);
172
+ --k-bg-error-hover: var(--k-anar-700);
173
+ --k-bg-error-subtle: rgb(248 59 71 / 0.14);
174
+ --k-bg-warning-subtle: rgb(249 131 7 / 0.14);
175
+ --k-bg-success-subtle: rgb(106 174 51 / 0.14);
176
+ --k-bg-info-subtle: rgb(61 94 248 / 0.16);
177
+ --k-text-primary: var(--k-shab-50);
178
+ --k-text-secondary: var(--k-shab-200);
179
+ --k-text-tertiary: var(--k-shab-400);
180
+ --k-text-quaternary: var(--k-shab-500);
181
+ --k-text-on-brand: var(--k-shab-0);
182
+ --k-text-brand: var(--k-brand-300);
183
+ --k-text-error: var(--k-anar-400);
184
+ --k-text-warning: var(--k-zafaran-400);
185
+ --k-text-success: var(--k-pesteh-400);
186
+ --k-text-info: var(--k-lajvard-300);
187
+ --k-border-primary: var(--k-shab-700);
188
+ --k-border-secondary: var(--k-shab-800);
189
+ --k-border-brand: var(--k-brand-400);
190
+ --k-border-input: var(--k-shab-500);
191
+ --k-border-error: var(--k-anar-400);
192
+ --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent);
193
+ --k-ring-error: 0 0 0 4px rgb(248 59 71 / 0.28);
194
+ --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(12 14 18 / 0.18), inset 0 -2px 0 rgb(12 14 18 / 0.05);
195
+ }
196
+
197
+ [data-theme="light"] {
198
+ color-scheme: light;
199
+ --k-bg-primary: var(--k-shab-0);
200
+ --k-bg-secondary: var(--k-shab-50);
201
+ --k-bg-tertiary: var(--k-shab-100);
202
+ --k-bg-elevated: var(--k-shab-0);
203
+ --k-bg-hover: var(--k-shab-50);
204
+ --k-bg-active: var(--k-shab-100);
205
+ --k-bg-brand: var(--k-brand-700);
206
+ --k-bg-brand-hover: var(--k-brand-800);
207
+ --k-bg-brand-subtle: var(--k-brand-50);
208
+ --k-bg-error: var(--k-anar-600);
209
+ --k-bg-error-hover: var(--k-anar-700);
210
+ --k-bg-error-subtle: var(--k-anar-50);
211
+ --k-bg-warning-subtle: var(--k-zafaran-50);
212
+ --k-bg-success-subtle: var(--k-pesteh-50);
213
+ --k-bg-info-subtle: var(--k-lajvard-50);
214
+ --k-text-primary: var(--k-shab-950);
215
+ --k-text-secondary: var(--k-shab-700);
216
+ --k-text-tertiary: var(--k-shab-600);
217
+ --k-text-quaternary: var(--k-shab-500);
218
+ --k-text-on-brand: var(--k-shab-0);
219
+ --k-text-brand: var(--k-brand-700);
220
+ --k-text-error: var(--k-anar-700);
221
+ --k-text-warning: var(--k-zafaran-700);
222
+ --k-text-success: var(--k-pesteh-700);
223
+ --k-text-info: var(--k-lajvard-700);
224
+ --k-border-primary: var(--k-shab-300);
225
+ --k-border-secondary: var(--k-shab-200);
226
+ --k-border-brand: var(--k-brand-600);
227
+ --k-border-input: var(--k-shab-500);
228
+ --k-border-error: var(--k-anar-500);
229
+ --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent);
230
+ --k-ring-error: 0 0 0 4px rgb(229 29 42 / 0.2);
231
+ --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05);
232
+ }
233
+
234
+ }
235
+
236
+ @layer kashi.base {
237
+ /* پایه — فقط در ریشه یا داخل .k-root اعمال می‌شود */
238
+ *, *::before, *::after { box-sizing: border-box; }
239
+
240
+ :where(html) {
241
+ -webkit-text-size-adjust: 100%;
242
+ text-size-adjust: 100%;
243
+ }
244
+
245
+ :where(body, .k-root) {
246
+ margin: 0;
247
+ background: var(--k-bg-primary);
248
+ color: var(--k-text-primary);
249
+ font-family: var(--k-font-sans);
250
+ font-size: var(--k-text-md);
251
+ line-height: var(--k-leading-normal);
252
+ -webkit-font-smoothing: antialiased;
253
+ -moz-osx-font-smoothing: grayscale;
254
+ /* کشیده‌نویسی و اتصال درست حروف فارسی */
255
+ font-feature-settings: "kern", "liga", "calt";
256
+ }
257
+
258
+ :where(h1, h2, h3, h4, h5, h6) {
259
+ margin: 0;
260
+ line-height: var(--k-leading-tight);
261
+ font-weight: var(--k-weight-bold);
262
+ }
263
+
264
+ :where(:focus-visible) {
265
+ outline: 2px solid var(--k-border-brand);
266
+ outline-offset: 2px;
267
+ }
268
+
269
+ ::selection {
270
+ background: var(--k-bg-brand-subtle);
271
+ color: var(--k-text-primary);
272
+ }
273
+
274
+ /* فقط برای صفحه‌خوان قابل‌خواندن است */
275
+ .k-sr-only {
276
+ position: absolute;
277
+ inline-size: 1px;
278
+ block-size: 1px;
279
+ padding: 0;
280
+ margin: -1px;
281
+ overflow: hidden;
282
+ clip-path: inset(50%);
283
+ white-space: nowrap;
284
+ border: 0;
285
+ }
286
+
287
+ /* لینک «رفتن به محتوای اصلی» برای کاربران کیبورد */
288
+ .k-skip-link {
289
+ position: absolute;
290
+ inset-inline-start: var(--k-space-4);
291
+ inset-block-start: var(--k-space-4);
292
+ z-index: var(--k-z-toast);
293
+ padding: var(--k-space-2) var(--k-space-4);
294
+ border-radius: var(--k-radius-md);
295
+ background: var(--k-bg-brand);
296
+ color: var(--k-text-on-brand);
297
+ translate: 0 -200%;
298
+ }
299
+ .k-skip-link:focus { translate: 0 0; }
300
+
301
+ /* کاربرانی که کنتراست بیشتر خواسته‌اند */
302
+ @media (prefers-contrast: more) {
303
+ :root {
304
+ --k-text-tertiary: var(--k-text-secondary);
305
+ --k-border-primary: var(--k-text-tertiary);
306
+ --k-border-secondary: var(--k-border-primary);
307
+ }
308
+ }
309
+
310
+ /* ارقام لاتین در کنار متن فارسی: tabular برای جدول‌ها و اعداد */
311
+ .k-tabular { font-variant-numeric: tabular-nums; }
312
+
313
+ @media (prefers-reduced-motion: reduce) {
314
+ *, *::before, *::after {
315
+ animation-duration: 0.01ms !important;
316
+ transition-duration: 0.01ms !important;
317
+ }
318
+ }
319
+
320
+ }
321
+
322
+ @layer kashi.components {
323
+ /* هشدار (Alert) — به سبک Untitled UI: سطح خنثی، رنگ فقط در آیکون شاخص
324
+ * <div class="k-alert k-alert--warning" role="alert"> ← role="status" برای پیام‌های غیرفوری
325
+ * <span class="k-alert__icon" aria-hidden="true"><svg>…</svg></span>
326
+ * <div class="k-alert__content">
327
+ * <p class="k-alert__title">عنوان</p>
328
+ * <p class="k-alert__description">توضیح</p>
329
+ * <div class="k-alert__actions">…</div>
330
+ * </div>
331
+ * <button class="k-btn k-btn--tertiary k-btn--icon k-btn--sm k-alert__close" aria-label="بستن">×</button>
332
+ * </div>
333
+ * رنگ‌ها: neutral | brand | info | success | warning | error
334
+ * k-alert--tinted: پس‌زمینهٔ رنگی کم‌رنگ به‌جای سطح خنثی
335
+ *
336
+ * متغیرها: --k-alert-radius --k-alert-padding --k-alert-bg
337
+ */
338
+ .k-alert {
339
+ --_accent: var(--k-text-tertiary);
340
+ --_bg: var(--k-alert-bg, var(--k-bg-secondary));
341
+
342
+ display: flex;
343
+ align-items: flex-start;
344
+ gap: var(--k-space-4);
345
+ padding: var(--k-alert-padding, calc(1rem * var(--k-density)));
346
+ border: 1px solid var(--k-border-primary);
347
+ border-radius: var(--k-alert-radius, var(--k-radius-xl));
348
+ background: var(--_bg);
349
+ color: var(--k-text-tertiary);
350
+ font-size: var(--k-text-sm);
351
+ box-shadow: var(--k-shadow-xs);
352
+ }
353
+
354
+ .k-alert--brand { --_accent: var(--k-text-brand); }
355
+ .k-alert--info { --_accent: var(--k-text-info); }
356
+ .k-alert--success { --_accent: var(--k-text-success); }
357
+ .k-alert--warning { --_accent: var(--k-text-warning); }
358
+ .k-alert--error { --_accent: var(--k-text-error); }
359
+
360
+ .k-alert--tinted {
361
+ --_bg: var(--k-alert-bg, color-mix(in srgb, var(--_accent) 8%, var(--k-bg-primary)));
362
+ border-color: color-mix(in srgb, var(--_accent) 32%, transparent);
363
+ }
364
+
365
+ /* آیکون شاخص با دو حلقهٔ هم‌مرکز (featured icon) */
366
+ .k-alert__icon {
367
+ position: relative;
368
+ display: grid;
369
+ place-items: center;
370
+ flex-shrink: 0;
371
+ inline-size: 1.25rem;
372
+ block-size: 1.25rem;
373
+ margin: 0.375rem;
374
+ color: var(--_accent);
375
+ }
376
+ .k-alert__icon::before,
377
+ .k-alert__icon::after {
378
+ content: "";
379
+ position: absolute;
380
+ border: 2px solid var(--_accent);
381
+ border-radius: var(--k-radius-full);
382
+ }
383
+ .k-alert__icon::before { inset: -0.3125rem; opacity: 0.3; }
384
+ .k-alert__icon::after { inset: -0.625rem; opacity: 0.1; }
385
+ .k-alert__icon svg { inline-size: 100%; block-size: 100%; }
386
+
387
+ .k-alert__content {
388
+ flex: 1;
389
+ display: grid;
390
+ gap: var(--k-space-1);
391
+ min-inline-size: 0;
392
+ padding-block-start: 0.125rem;
393
+ }
394
+
395
+ .k-alert__title {
396
+ margin: 0;
397
+ color: var(--k-text-secondary);
398
+ font-weight: var(--k-weight-semibold);
399
+ }
400
+
401
+ .k-alert__description { margin: 0; }
402
+
403
+ .k-alert__actions {
404
+ display: flex;
405
+ flex-wrap: wrap;
406
+ gap: var(--k-space-3);
407
+ margin-block-start: var(--k-space-2);
408
+ }
409
+
410
+ .k-alert__close { margin-block: -0.375rem; margin-inline-end: -0.375rem; }
411
+
412
+ @media (forced-colors: active) {
413
+ .k-alert { border-color: CanvasText; }
414
+ }
415
+
416
+ /* آواتار
417
+ * <span class="k-avatar k-avatar--lg">
418
+ * <img class="k-avatar__image" src="…" alt="سارا احمدی"> ← یا حروف اول: <span aria-hidden="true">س‌ا</span> + role="img" aria-label روی والد
419
+ * <span class="k-avatar__status k-avatar__status--online"></span>
420
+ * </span>
421
+ * اندازه‌ها: xs | sm | md | lg | xl | 2xl — شکل: k-avatar--square — رنگ: k-avatar--brand
422
+ * گروه: <div class="k-avatar-group">…</div>
423
+ *
424
+ * متغیرها: --k-avatar-size --k-avatar-radius --k-avatar-bg --k-avatar-fg
425
+ */
426
+ .k-avatar {
427
+ --_s: var(--k-avatar-size, 2.5rem);
428
+
429
+ position: relative;
430
+ display: inline-grid;
431
+ place-items: center;
432
+ flex-shrink: 0;
433
+ inline-size: var(--_s);
434
+ block-size: var(--_s);
435
+ border-radius: var(--k-avatar-radius, var(--k-radius-full));
436
+ background: var(--k-avatar-bg, var(--k-bg-tertiary));
437
+ color: var(--k-avatar-fg, var(--k-text-secondary));
438
+ font-size: calc(var(--_s) * 0.36);
439
+ font-weight: var(--k-weight-semibold);
440
+ line-height: 1;
441
+ user-select: none;
442
+ /* حاشیهٔ داخلی ظریف مثل Untitled UI */
443
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--k-text-primary) 8%, transparent);
444
+ }
445
+
446
+ .k-avatar__image {
447
+ position: absolute;
448
+ inset: 0;
449
+ inline-size: 100%;
450
+ block-size: 100%;
451
+ object-fit: cover;
452
+ border-radius: inherit;
453
+ }
454
+
455
+ .k-avatar--xs { --_s: var(--k-avatar-size, 1.5rem); }
456
+ .k-avatar--sm { --_s: var(--k-avatar-size, 2rem); }
457
+ .k-avatar--lg { --_s: var(--k-avatar-size, 3rem); }
458
+ .k-avatar--xl { --_s: var(--k-avatar-size, 3.5rem); }
459
+ .k-avatar--2xl { --_s: var(--k-avatar-size, 4rem); }
460
+
461
+ .k-avatar--square { border-radius: var(--k-avatar-radius, var(--k-radius-md)); }
462
+ .k-avatar--brand {
463
+ background: var(--k-avatar-bg, var(--k-bg-brand-subtle));
464
+ color: var(--k-avatar-fg, var(--k-text-brand));
465
+ }
466
+
467
+ .k-avatar__status {
468
+ position: absolute;
469
+ inset-block-end: 0;
470
+ inset-inline-end: 0;
471
+ inline-size: max(0.5rem, calc(var(--_s) * 0.28));
472
+ block-size: max(0.5rem, calc(var(--_s) * 0.28));
473
+ border: 2px solid var(--k-bg-primary);
474
+ border-radius: var(--k-radius-full);
475
+ background: var(--k-border-input);
476
+ }
477
+ .k-avatar__status--online { background: var(--k-text-success); }
478
+ .k-avatar__status--busy { background: var(--k-text-error); }
479
+ .k-avatar__status--away { background: var(--k-text-warning); }
480
+
481
+ .k-avatar-group { display: inline-flex; align-items: center; }
482
+ .k-avatar-group > .k-avatar {
483
+ box-shadow: 0 0 0 2px var(--k-bg-primary);
484
+ }
485
+ .k-avatar-group > .k-avatar + .k-avatar {
486
+ margin-inline-start: calc(var(--_s) * -0.28);
487
+ }
488
+
489
+ @media (forced-colors: active) {
490
+ .k-avatar { border: 1px solid CanvasText; }
491
+ .k-avatar__status { background: CanvasText; }
492
+ }
493
+
494
+ /* نشان (Badge)
495
+ * <span class="k-badge k-badge--success"><span class="k-badge__dot" aria-hidden="true"></span>فعال</span>
496
+ * رنگ‌ها: neutral | brand | error | warning | success | info — اندازه‌ها: sm | md | lg
497
+ * شکل: پیش‌فرض گرد (pill)؛ k-badge--square برای گوشهٔ کم
498
+ *
499
+ * متغیرها: --k-badge-radius --k-badge-font-weight
500
+ */
501
+ .k-badge {
502
+ --_bg: var(--k-bg-tertiary);
503
+ --_fg: var(--k-text-secondary);
504
+ --_px: 0.625rem;
505
+
506
+ display: inline-flex;
507
+ align-items: center;
508
+ gap: var(--k-space-1);
509
+ padding-block: 0.125rem;
510
+ padding-inline: var(--_px);
511
+ border: 1px solid color-mix(in srgb, var(--_fg) 24%, transparent);
512
+ border-radius: var(--k-badge-radius, var(--k-radius-full));
513
+ background: var(--_bg);
514
+ color: var(--_fg);
515
+ font-size: var(--k-text-sm);
516
+ font-weight: var(--k-badge-font-weight, var(--k-weight-medium));
517
+ line-height: 1.5;
518
+ white-space: nowrap;
519
+ }
520
+
521
+ .k-badge--brand { --_bg: var(--k-bg-brand-subtle); --_fg: var(--k-text-brand); }
522
+ .k-badge--error { --_bg: var(--k-bg-error-subtle); --_fg: var(--k-text-error); }
523
+ .k-badge--warning { --_bg: var(--k-bg-warning-subtle); --_fg: var(--k-text-warning); }
524
+ .k-badge--success { --_bg: var(--k-bg-success-subtle); --_fg: var(--k-text-success); }
525
+ .k-badge--info { --_bg: var(--k-bg-info-subtle); --_fg: var(--k-text-info); }
526
+
527
+ .k-badge--sm { --_px: 0.5rem; font-size: var(--k-text-xs); }
528
+ .k-badge--lg { --_px: 0.75rem; padding-block: 0.25rem; }
529
+ .k-badge--square { border-radius: var(--k-badge-radius, var(--k-radius-sm)); }
530
+
531
+ .k-badge__dot {
532
+ inline-size: 0.375rem;
533
+ block-size: 0.375rem;
534
+ border-radius: var(--k-radius-full);
535
+ background: currentColor;
536
+ }
537
+ .k-badge svg { inline-size: 0.875em; block-size: 0.875em; }
538
+
539
+ @media (forced-colors: active) {
540
+ .k-badge { border-color: CanvasText; }
541
+ }
542
+
543
+ /* دکمه — به سبک Untitled UI: سایهٔ اسکئومورفیک و حلقهٔ فوکوس نرم
544
+ * <button class="k-btn k-btn--primary k-btn--md">ثبت</button>
545
+ * گونه‌ها: primary | secondary | tertiary | link | danger | danger-secondary
546
+ * اندازه‌ها: sm | md | lg | xl — حالت‌ها: disabled، aria-disabled، aria-busy="true"
547
+ *
548
+ * متغیرهای قابل‌بازنویسی (روی :root یا هر والدی):
549
+ * --k-btn-height-{sm,md,lg,xl} --k-btn-padding-{sm,md,lg,xl}
550
+ * --k-btn-radius --k-btn-font-weight --k-btn-gap
551
+ */
552
+ .k-btn {
553
+ --_h: var(--k-btn-height-md, calc(2.5rem * var(--k-density)));
554
+ --_px: var(--k-btn-padding-md, calc(0.875rem * var(--k-density)));
555
+ --_fs: var(--k-text-sm);
556
+ --_bg: var(--k-bg-primary);
557
+ --_bg-hover: var(--k-bg-hover);
558
+ --_fg: var(--k-text-secondary);
559
+ --_fg-hover: var(--k-text-primary);
560
+ --_border: var(--k-border-primary);
561
+ --_shadow: var(--k-shadow-xs), var(--k-shadow-skeuomorphic);
562
+ --_ring: var(--k-ring-brand);
563
+
564
+ position: relative;
565
+ display: inline-flex;
566
+ align-items: center;
567
+ justify-content: center;
568
+ gap: var(--k-btn-gap, var(--k-space-1_5));
569
+ block-size: var(--_h);
570
+ /* حداقل ناحیهٔ لمس WCAG 2.5.8 */
571
+ min-block-size: 24px;
572
+ min-inline-size: 24px;
573
+ padding-inline: var(--_px);
574
+ border: 1px solid var(--_border);
575
+ border-radius: var(--k-btn-radius, var(--k-radius-md));
576
+ background: var(--_bg);
577
+ color: var(--_fg);
578
+ box-shadow: var(--_shadow);
579
+ font: inherit;
580
+ font-size: var(--_fs);
581
+ font-weight: var(--k-btn-font-weight, var(--k-weight-semibold));
582
+ line-height: 1;
583
+ white-space: nowrap;
584
+ text-decoration: none;
585
+ cursor: pointer;
586
+ user-select: none;
587
+ transition:
588
+ background-color var(--k-duration-fast) var(--k-ease-standard),
589
+ color var(--k-duration-fast) var(--k-ease-standard),
590
+ box-shadow var(--k-duration-fast) var(--k-ease-standard);
591
+ }
592
+
593
+ .k-btn:hover { background: var(--_bg-hover); color: var(--_fg-hover); }
594
+
595
+ .k-btn:focus-visible {
596
+ /* outline شفاف در حالت forced-colors ویندوز قابل‌مشاهده می‌شود */
597
+ outline: 2px solid transparent;
598
+ box-shadow: var(--_shadow), var(--_ring);
599
+ }
600
+
601
+ .k-btn:disabled,
602
+ .k-btn[aria-disabled="true"]:not([aria-busy="true"]) {
603
+ --_bg: var(--k-bg-secondary);
604
+ --_fg: var(--k-text-quaternary);
605
+ --_border: var(--k-border-secondary);
606
+ --_shadow: var(--k-shadow-xs);
607
+ cursor: not-allowed;
608
+ }
609
+ .k-btn[aria-disabled="true"]:hover { background: var(--_bg); color: var(--_fg); }
610
+
611
+
612
+ /* گونه‌ها */
613
+ .k-btn--primary {
614
+ --_bg: var(--k-bg-brand);
615
+ --_bg-hover: var(--k-bg-brand-hover);
616
+ --_fg: var(--k-text-on-brand);
617
+ --_fg-hover: var(--k-text-on-brand);
618
+ --_border: transparent;
619
+ --_shadow: var(--k-shadow-xs), var(--k-shadow-skeuomorphic);
620
+ }
621
+ /* حاشیهٔ داخلی سفید که به پایین محو می‌شود (Untitled UI) */
622
+ .k-btn:is(.k-btn--primary, .k-btn--danger)::before {
623
+ content: "";
624
+ position: absolute;
625
+ inset: 1px;
626
+ border: 1px solid rgb(255 255 255 / 0.12);
627
+ border-radius: inherit;
628
+ mask: linear-gradient(to bottom, #000, transparent);
629
+ pointer-events: none;
630
+ }
631
+ .k-btn:is(.k-btn--primary, .k-btn--danger):is(:disabled, [aria-disabled="true"]:not([aria-busy="true"]))::before { display: none; }
632
+ .k-btn--tertiary {
633
+ --_bg: transparent;
634
+ --_border: transparent;
635
+ --_shadow: none;
636
+ }
637
+ .k-btn--link {
638
+ --_bg: transparent;
639
+ --_bg-hover: transparent;
640
+ --_fg: var(--k-text-brand);
641
+ --_fg-hover: var(--k-text-brand);
642
+ --_border: transparent;
643
+ --_shadow: none;
644
+ --_h: auto;
645
+ --_px: 0;
646
+ }
647
+ .k-btn--link:hover { text-decoration: underline; text-underline-offset: 0.3em; }
648
+ .k-btn--danger {
649
+ --_bg: var(--k-bg-error);
650
+ --_bg-hover: var(--k-bg-error-hover);
651
+ --_fg: var(--k-text-on-brand);
652
+ --_fg-hover: var(--k-text-on-brand);
653
+ --_border: transparent;
654
+ --_shadow: var(--k-shadow-xs), var(--k-shadow-skeuomorphic);
655
+ --_ring: var(--k-ring-error);
656
+ }
657
+ .k-btn--danger-secondary {
658
+ --_fg: var(--k-text-error);
659
+ --_fg-hover: var(--k-text-error);
660
+ --_bg-hover: var(--k-bg-error-subtle);
661
+ --_ring: var(--k-ring-error);
662
+ }
663
+
664
+ /* اندازه‌ها */
665
+ .k-btn--sm {
666
+ --_h: var(--k-btn-height-sm, calc(2.25rem * var(--k-density)));
667
+ --_px: var(--k-btn-padding-sm, calc(0.75rem * var(--k-density)));
668
+ }
669
+ .k-btn--lg {
670
+ --_h: var(--k-btn-height-lg, calc(2.75rem * var(--k-density)));
671
+ --_px: var(--k-btn-padding-lg, calc(1.125rem * var(--k-density)));
672
+ --_fs: var(--k-text-md);
673
+ }
674
+ .k-btn--xl {
675
+ --_h: var(--k-btn-height-xl, calc(3rem * var(--k-density)));
676
+ --_px: var(--k-btn-padding-xl, calc(1.25rem * var(--k-density)));
677
+ --_fs: var(--k-text-md);
678
+ }
679
+ .k-btn--icon { padding-inline: 0; inline-size: var(--_h); }
680
+ .k-btn--block { display: flex; inline-size: 100%; }
681
+
682
+ .k-btn svg { inline-size: 1.25em; block-size: 1.25em; flex-shrink: 0; }
683
+
684
+ /* آیکون‌های جهت‌دار (فلش و…) در RTL آینه می‌شوند */
685
+ [dir="rtl"] .k-btn [data-k-mirror] { transform: scaleX(-1); }
686
+
687
+ /* در حال بارگذاری */
688
+ .k-btn[aria-busy="true"] {
689
+ color: transparent;
690
+ cursor: progress;
691
+ }
692
+ .k-btn[aria-busy="true"]::after {
693
+ content: "";
694
+ position: absolute;
695
+ inline-size: 1.1em;
696
+ block-size: 1.1em;
697
+ border: 2px solid var(--_fg);
698
+ border-block-start-color: transparent;
699
+ border-radius: var(--k-radius-full);
700
+ animation: k-spin 0.7s linear infinite;
701
+ }
702
+
703
+ @keyframes k-spin { to { rotate: 360deg; } }
704
+
705
+ /* حالت کنتراست بالای ویندوز */
706
+ @media (forced-colors: active) {
707
+ .k-btn { border-color: ButtonText; }
708
+ .k-btn--primary, .k-btn--danger { border-color: ButtonText; }
709
+ .k-btn:disabled, .k-btn[aria-disabled="true"] { border-color: GrayText; color: GrayText; }
710
+ .k-btn[aria-busy="true"]::after { border-color: ButtonText; border-block-start-color: transparent; }
711
+ }
712
+
713
+ /* تقویم شمسی و انتخاب تاریخ
714
+ * ساختار را کامپوننت React می‌سازد (Calendar و DatePicker)؛ این استایل برای هر پیاده‌سازی دیگری هم قابل‌استفاده است.
715
+ *
716
+ * متغیرها: --k-calendar-day-size --k-calendar-radius --k-calendar-bg --k-datepicker-width
717
+ */
718
+ .k-calendar {
719
+ --_day: var(--k-calendar-day-size, calc(2.5rem * var(--k-density)));
720
+
721
+ display: grid;
722
+ gap: var(--k-space-2);
723
+ inline-size: max-content;
724
+ max-inline-size: 100%;
725
+ color: var(--k-text-primary);
726
+ font-size: var(--k-text-sm);
727
+ }
728
+
729
+ .k-calendar__header {
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: space-between;
733
+ gap: var(--k-space-2);
734
+ }
735
+
736
+ .k-calendar__selects { display: flex; gap: var(--k-space-1); }
737
+
738
+ .k-calendar__select {
739
+ appearance: none;
740
+ min-block-size: 2.25rem;
741
+ padding-block: 0;
742
+ padding-inline: var(--k-space-3) var(--k-space-6);
743
+ border: 1px solid transparent;
744
+ border-radius: var(--k-radius-md);
745
+ background:
746
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23687491' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 8 4 4 4-4'/%3E%3C/svg%3E") no-repeat,
747
+ transparent;
748
+ background-position: left var(--k-space-1_5) center;
749
+ background-size: 1rem;
750
+ color: var(--k-text-primary);
751
+ font: inherit;
752
+ font-weight: var(--k-weight-semibold);
753
+ cursor: pointer;
754
+ }
755
+ [dir="ltr"] .k-calendar__select { background-position: right var(--k-space-1_5) center; }
756
+ .k-calendar__select:hover { background-color: var(--k-bg-hover); }
757
+ .k-calendar__select:focus-visible { outline: 2px solid transparent; border-color: var(--k-border-brand); box-shadow: var(--k-ring-brand); }
758
+ .k-calendar__select option { background: var(--k-bg-elevated); color: var(--k-text-primary); }
759
+
760
+ .k-calendar__grid { border-collapse: collapse; margin-inline: auto; }
761
+ .k-calendar__grid th {
762
+ block-size: 2rem;
763
+ padding: 0;
764
+ color: var(--k-text-tertiary);
765
+ font-size: var(--k-text-xs);
766
+ font-weight: var(--k-weight-medium);
767
+ text-align: center;
768
+ }
769
+ .k-calendar__grid td { padding: 1px; text-align: center; }
770
+
771
+ .k-calendar__day {
772
+ position: relative;
773
+ display: inline-grid;
774
+ place-items: center;
775
+ inline-size: var(--_day);
776
+ block-size: var(--_day);
777
+ padding: 0;
778
+ border: 0;
779
+ border-radius: var(--k-calendar-radius, var(--k-radius-full));
780
+ background: transparent;
781
+ color: var(--k-text-secondary);
782
+ font: inherit;
783
+ font-variant-numeric: tabular-nums;
784
+ cursor: pointer;
785
+ transition: background-color var(--k-duration-fast) var(--k-ease-standard);
786
+ }
787
+ .k-calendar__day:hover { background: var(--k-bg-hover); color: var(--k-text-primary); }
788
+ .k-calendar__day:focus-visible { outline: 2px solid transparent; box-shadow: var(--k-ring-brand); }
789
+
790
+ /* امروز: نقطهٔ زیر عدد */
791
+ .k-calendar__day[aria-current="date"] { color: var(--k-text-brand); font-weight: var(--k-weight-bold); }
792
+ .k-calendar__day[aria-current="date"]::after {
793
+ content: "";
794
+ position: absolute;
795
+ inset-block-end: 0.3rem;
796
+ inline-size: 0.25rem;
797
+ block-size: 0.25rem;
798
+ border-radius: 50%;
799
+ background: currentColor;
800
+ }
801
+
802
+ [aria-selected="true"] > .k-calendar__day {
803
+ background: var(--k-bg-brand);
804
+ color: var(--k-text-on-brand);
805
+ font-weight: var(--k-weight-semibold);
806
+ box-shadow: var(--k-shadow-xs), var(--k-shadow-skeuomorphic);
807
+ }
808
+ [aria-selected="true"] > .k-calendar__day:focus-visible { box-shadow: var(--k-ring-brand); }
809
+
810
+ .k-calendar__day[aria-disabled="true"] {
811
+ color: var(--k-text-quaternary);
812
+ text-decoration: line-through;
813
+ cursor: not-allowed;
814
+ }
815
+ .k-calendar__day[aria-disabled="true"]:hover { background: transparent; }
816
+
817
+ .k-calendar__footer {
818
+ display: flex;
819
+ justify-content: center;
820
+ padding-block-start: var(--k-space-2);
821
+ border-block-start: 1px solid var(--k-border-secondary);
822
+ }
823
+
824
+ /* انتخاب تاریخ: فیلد + تقویم شناور */
825
+ .k-datepicker { position: relative; }
826
+ .k-datepicker .k-input { padding-inline-end: var(--k-space-1); }
827
+ .k-datepicker__toggle { margin-block: -0.25rem; }
828
+
829
+ .k-datepicker__popover {
830
+ position: absolute;
831
+ inset-inline-end: 0;
832
+ z-index: var(--k-z-dropdown);
833
+ inline-size: var(--k-datepicker-width, max-content);
834
+ max-inline-size: calc(100vw - 2rem);
835
+ padding: var(--k-space-4);
836
+ border: 1px solid var(--k-border-secondary);
837
+ border-radius: var(--k-radius-xl);
838
+ background: var(--k-calendar-bg, var(--k-bg-elevated));
839
+ box-shadow: var(--k-shadow-xl);
840
+ animation: k-pop-in var(--k-duration-fast) var(--k-ease-standard);
841
+ }
842
+ @keyframes k-pop-in { from { opacity: 0; translate: 0 -4px; } }
843
+
844
+ /* متن کوچک داخل فیلد، مثل نام بانک */
845
+ .k-input__meta {
846
+ color: var(--k-text-tertiary);
847
+ font-size: var(--k-text-sm);
848
+ white-space: nowrap;
849
+ }
850
+
851
+ @media (forced-colors: active) {
852
+ [aria-selected="true"] > .k-calendar__day { forced-color-adjust: none; background: Highlight; color: HighlightText; }
853
+ .k-calendar__day[aria-current="date"] { outline: 1px solid CanvasText; }
854
+ .k-datepicker__popover { border-color: CanvasText; }
855
+ }
856
+
857
+ /* کارت
858
+ * <article class="k-card">
859
+ * <header class="k-card__header">
860
+ * <h3 class="k-card__title">عنوان</h3>
861
+ * <p class="k-card__description">توضیح</p>
862
+ * </header>
863
+ * <div class="k-card__body">...</div>
864
+ * <footer class="k-card__footer">...دکمه‌ها</footer>
865
+ * </article>
866
+ * گونه‌ها: k-card--flat (بدون سایه) | k-card--interactive (برای کارت قابل‌کلیک، همراه با <a> یا <button>)
867
+ *
868
+ * متغیرها: --k-card-padding --k-card-radius --k-card-bg --k-card-border --k-card-shadow
869
+ */
870
+ .k-card {
871
+ --_p: var(--k-card-padding, calc(1.5rem * var(--k-density)));
872
+
873
+ display: flex;
874
+ flex-direction: column;
875
+ border: 1px solid var(--k-card-border, var(--k-border-secondary));
876
+ border-radius: var(--k-card-radius, var(--k-radius-xl));
877
+ background: var(--k-card-bg, var(--k-bg-elevated));
878
+ color: var(--k-text-primary);
879
+ box-shadow: var(--k-card-shadow, var(--k-shadow-xs));
880
+ overflow: clip;
881
+ }
882
+
883
+ .k-card__header,
884
+ .k-card__body,
885
+ .k-card__footer { padding: var(--_p); }
886
+
887
+ .k-card__header + .k-card__body { padding-block-start: 0; }
888
+
889
+ .k-card__header { display: grid; gap: var(--k-space-1); }
890
+
891
+ .k-card__title {
892
+ margin: 0;
893
+ font-size: var(--k-text-lg);
894
+ font-weight: var(--k-weight-semibold);
895
+ line-height: var(--k-leading-tight);
896
+ }
897
+
898
+ .k-card__description {
899
+ margin: 0;
900
+ color: var(--k-text-tertiary);
901
+ font-size: var(--k-text-sm);
902
+ }
903
+
904
+ .k-card__footer {
905
+ display: flex;
906
+ flex-wrap: wrap;
907
+ gap: var(--k-space-3);
908
+ justify-content: flex-end;
909
+ padding-block: calc(var(--_p) * 0.66);
910
+ border-block-start: 1px solid var(--k-border-secondary);
911
+ margin-block-start: auto;
912
+ }
913
+
914
+ .k-card__media { display: block; inline-size: 100%; object-fit: cover; }
915
+
916
+ .k-card--flat { box-shadow: none; }
917
+
918
+ .k-card--interactive {
919
+ position: relative;
920
+ transition:
921
+ border-color var(--k-duration-fast) var(--k-ease-standard),
922
+ box-shadow var(--k-duration-normal) var(--k-ease-standard);
923
+ }
924
+ .k-card--interactive:hover { border-color: var(--k-border-primary); box-shadow: var(--k-shadow-md); }
925
+ .k-card--interactive:has(:focus-visible) { box-shadow: var(--k-shadow-md), var(--k-ring-brand); }
926
+ /* لینک اصلی کل کارت را قابل‌کلیک می‌کند ولی فقط یک توقف Tab دارد */
927
+ .k-card--interactive :is(a, button).k-card__link::after { content: ""; position: absolute; inset: 0; }
928
+ .k-card--interactive .k-card__link:focus-visible { outline: none; }
929
+
930
+ @media (forced-colors: active) {
931
+ .k-card { border-color: CanvasText; }
932
+ .k-card--interactive:has(:focus-visible) { outline: 2px solid Highlight; }
933
+ }
934
+
935
+ /* چک‌باکس — روی <input type="checkbox"> بومی، پس کیبورد و صفحه‌خوان خودکار کار می‌کنند
936
+ * <label class="k-check">
937
+ * <input type="checkbox" class="k-checkbox">
938
+ * <span class="k-check__text">
939
+ * <span class="k-check__label">مرا به خاطر بسپار</span>
940
+ * <span class="k-check__description">توضیح اختیاری</span>
941
+ * </span>
942
+ * </label>
943
+ * حالت نیمه: input.indeterminate = true — خطا: aria-invalid="true" — اندازه: k-checkbox--lg
944
+ *
945
+ * متغیرها: --k-checkbox-size --k-checkbox-radius
946
+ */
947
+ .k-checkbox {
948
+ --_s: var(--k-checkbox-size, 1.125rem);
949
+ --_border: var(--k-border-input);
950
+
951
+ appearance: none;
952
+ display: inline-grid;
953
+ place-content: center;
954
+ flex-shrink: 0;
955
+ inline-size: var(--_s);
956
+ block-size: var(--_s);
957
+ margin: 0;
958
+ border: 1px solid var(--_border);
959
+ border-radius: var(--k-checkbox-radius, calc(0.3125rem * var(--k-radius-factor)));
960
+ background: var(--k-bg-primary);
961
+ color: var(--k-text-on-brand);
962
+ cursor: pointer;
963
+ transition:
964
+ background-color var(--k-duration-fast) var(--k-ease-standard),
965
+ border-color var(--k-duration-fast) var(--k-ease-standard),
966
+ box-shadow var(--k-duration-fast) var(--k-ease-standard);
967
+ }
968
+
969
+ .k-checkbox::before {
970
+ content: "";
971
+ inline-size: calc(var(--_s) * 0.7);
972
+ block-size: calc(var(--_s) * 0.7);
973
+ background: currentColor;
974
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11.5 3.5 5.5 10 2.5 7'/%3E%3C/svg%3E") center / contain no-repeat;
975
+ scale: 0;
976
+ transition: scale var(--k-duration-fast) var(--k-ease-emphasized);
977
+ }
978
+ .k-checkbox:indeterminate::before {
979
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M3 7h8'/%3E%3C/svg%3E");
980
+ }
981
+
982
+ .k-checkbox:hover { --_border: var(--k-border-brand); }
983
+
984
+ .k-checkbox:is(:checked, :indeterminate) {
985
+ --_border: var(--k-bg-brand);
986
+ background: var(--k-bg-brand);
987
+ }
988
+ .k-checkbox:is(:checked, :indeterminate)::before { scale: 1; }
989
+
990
+ .k-checkbox:focus-visible {
991
+ outline: 2px solid transparent;
992
+ box-shadow: var(--k-ring-brand);
993
+ }
994
+
995
+ .k-checkbox[aria-invalid="true"] { --_border: var(--k-border-error); }
996
+ .k-checkbox[aria-invalid="true"]:focus-visible { box-shadow: var(--k-ring-error); }
997
+
998
+ .k-checkbox:disabled {
999
+ --_border: var(--k-border-secondary);
1000
+ background: var(--k-bg-tertiary);
1001
+ color: var(--k-text-quaternary);
1002
+ cursor: not-allowed;
1003
+ }
1004
+
1005
+ .k-checkbox--lg { --_s: var(--k-checkbox-size, 1.25rem); }
1006
+
1007
+ /* ردیف برچسب — مشترک بین چک‌باکس و سوییچ */
1008
+ .k-check {
1009
+ display: inline-flex;
1010
+ align-items: flex-start;
1011
+ gap: var(--k-space-2);
1012
+ cursor: pointer;
1013
+ /* ارتفاع خط متن با کنترل هم‌تراز شود */
1014
+ line-height: 1.25rem;
1015
+ }
1016
+ .k-check > :is(.k-checkbox, .k-switch) { margin-block-start: calc((1.25rem - var(--_h, var(--_s))) / 2); }
1017
+ .k-check:has(:disabled) { cursor: not-allowed; }
1018
+ .k-check__text { display: grid; gap: 0.125rem; }
1019
+ .k-check__label { color: var(--k-text-secondary); font-size: var(--k-text-sm); font-weight: var(--k-weight-medium); }
1020
+ .k-check__description { color: var(--k-text-tertiary); font-size: var(--k-text-sm); }
1021
+ .k-check:has(:disabled) .k-check__label { color: var(--k-text-quaternary); }
1022
+
1023
+ /* حالت کنتراست بالای ویندوز: برگشت به کنترل بومی سیستم */
1024
+ @media (forced-colors: active) {
1025
+ .k-checkbox { appearance: auto; }
1026
+ .k-checkbox::before { display: none; }
1027
+ }
1028
+
1029
+ /* فیلد: برچسب + کنترل + راهنما/خطا — مشترک بین Input، Checkbox و Switch
1030
+ * <div class="k-field">
1031
+ * <label class="k-label" for="email">ایمیل <span class="k-label__required" aria-hidden="true">*</span></label>
1032
+ * ...کنترل...
1033
+ * <p class="k-hint" id="email-hint">راهنما</p>
1034
+ * <p class="k-hint k-hint--error" id="email-error">خطا</p>
1035
+ * </div>
1036
+ */
1037
+ .k-field {
1038
+ display: grid;
1039
+ gap: var(--k-field-gap, var(--k-space-1_5));
1040
+ min-inline-size: 0;
1041
+ }
1042
+
1043
+ .k-label {
1044
+ color: var(--k-text-secondary);
1045
+ font-size: var(--k-text-sm);
1046
+ font-weight: var(--k-weight-medium);
1047
+ line-height: var(--k-leading-tight);
1048
+ }
1049
+ .k-label__required { color: var(--k-text-error); margin-inline-start: 0.125em; }
1050
+
1051
+ .k-hint {
1052
+ margin: 0;
1053
+ color: var(--k-text-tertiary);
1054
+ font-size: var(--k-text-sm);
1055
+ line-height: var(--k-leading-tight);
1056
+ }
1057
+ .k-hint--error { color: var(--k-text-error); }
1058
+
1059
+ /* ورودی متن
1060
+ * <div class="k-input">
1061
+ * <span class="k-input__addon">svg یا متن</span>
1062
+ * <input class="k-input__control" id="email" aria-describedby="email-hint">
1063
+ * </div>
1064
+ * خطا: aria-invalid="true" روی input — اندازه‌ها: k-input--sm | k-input--lg
1065
+ *
1066
+ * متغیرها: --k-input-height-{sm,md,lg} --k-input-radius --k-input-bg --k-input-border
1067
+ */
1068
+ .k-input {
1069
+ --_h: var(--k-input-height-md, calc(2.75rem * var(--k-density)));
1070
+ --_border: var(--k-input-border, var(--k-border-input));
1071
+ --_ring: var(--k-ring-brand);
1072
+
1073
+ display: flex;
1074
+ align-items: center;
1075
+ gap: var(--k-space-2);
1076
+ min-block-size: var(--_h);
1077
+ padding-inline: calc(0.875rem * var(--k-density));
1078
+ border: 1px solid var(--_border);
1079
+ border-radius: var(--k-input-radius, var(--k-radius-md));
1080
+ background: var(--k-input-bg, var(--k-bg-primary));
1081
+ color: var(--k-text-primary);
1082
+ box-shadow: var(--k-shadow-xs);
1083
+ cursor: text;
1084
+ transition:
1085
+ border-color var(--k-duration-fast) var(--k-ease-standard),
1086
+ box-shadow var(--k-duration-fast) var(--k-ease-standard);
1087
+ }
1088
+
1089
+ .k-input:focus-within {
1090
+ --_border: var(--k-border-brand);
1091
+ box-shadow: var(--k-shadow-xs), var(--_ring);
1092
+ /* forced-colors */
1093
+ outline: 2px solid transparent;
1094
+ }
1095
+
1096
+ .k-input:has(.k-input__control[aria-invalid="true"]) {
1097
+ --_border: var(--k-border-error);
1098
+ --_ring: var(--k-ring-error);
1099
+ }
1100
+
1101
+ .k-input:has(.k-input__control:disabled) {
1102
+ background: var(--k-bg-secondary);
1103
+ border-color: var(--k-border-secondary);
1104
+ box-shadow: none;
1105
+ cursor: not-allowed;
1106
+ }
1107
+
1108
+ .k-input__control {
1109
+ flex: 1;
1110
+ min-inline-size: 0;
1111
+ align-self: stretch;
1112
+ padding: 0;
1113
+ border: 0;
1114
+ outline: 0;
1115
+ background: transparent;
1116
+ color: inherit;
1117
+ font: inherit;
1118
+ font-size: var(--k-text-md);
1119
+ }
1120
+ .k-input__control::placeholder { color: var(--k-text-tertiary); opacity: 1; }
1121
+ .k-input__control:disabled { color: var(--k-text-quaternary); cursor: not-allowed; }
1122
+
1123
+ /* ایمیل، آدرس، شماره و رمز همیشه چپ‌به‌راست تایپ می‌شوند */
1124
+ .k-input__control:is([type="email"], [type="url"], [type="tel"], [type="number"], [type="password"], [dir="ltr"]) {
1125
+ direction: ltr;
1126
+ text-align: end;
1127
+ }
1128
+ .k-input__control:is([type="email"], [type="url"], [type="tel"], [type="number"], [type="password"]):placeholder-shown {
1129
+ direction: rtl;
1130
+ text-align: start;
1131
+ }
1132
+ [dir="ltr"] .k-input__control:is([type="email"], [type="url"], [type="tel"], [type="number"], [type="password"]):placeholder-shown {
1133
+ direction: ltr;
1134
+ }
1135
+
1136
+ .k-input__addon {
1137
+ display: inline-flex;
1138
+ align-items: center;
1139
+ flex-shrink: 0;
1140
+ color: var(--k-text-tertiary);
1141
+ font-size: var(--k-text-md);
1142
+ }
1143
+ .k-input__addon svg { inline-size: 1.25rem; block-size: 1.25rem; }
1144
+
1145
+ /* چندخطی */
1146
+ .k-input--textarea { align-items: stretch; padding-block: calc(0.625rem * var(--k-density)); }
1147
+ .k-input--textarea .k-input__control { min-block-size: 5lh; resize: vertical; line-height: var(--k-leading-normal); }
1148
+
1149
+ .k-input--sm { --_h: var(--k-input-height-sm, calc(2.5rem * var(--k-density))); }
1150
+ .k-input--lg { --_h: var(--k-input-height-lg, calc(3rem * var(--k-density))); }
1151
+
1152
+ @media (forced-colors: active) {
1153
+ .k-input { border-color: FieldText; }
1154
+ .k-input:focus-within { outline-color: Highlight; }
1155
+ }
1156
+
1157
+ /* سوییچ — روی <input type="checkbox" role="switch"> بومی
1158
+ * <label class="k-check">
1159
+ * <input type="checkbox" role="switch" class="k-switch">
1160
+ * <span class="k-check__text"><span class="k-check__label">اعلان‌ها</span></span>
1161
+ * </label>
1162
+ * در RTL دکمهٔ سوییچ در حالت روشن به چپ می‌رود (خودکار با Logical Properties)
1163
+ * اندازه‌ها: k-switch--sm | k-switch--lg
1164
+ *
1165
+ * متغیرها: --k-switch-width --k-switch-height --k-switch-track-on --k-switch-track-off --k-switch-thumb
1166
+ */
1167
+ .k-switch {
1168
+ --_w: var(--k-switch-width, 2.25rem);
1169
+ --_h: var(--k-switch-height, 1.25rem);
1170
+ --_pad: 2px;
1171
+ --_track: var(--k-switch-track-off, var(--k-border-input));
1172
+
1173
+ appearance: none;
1174
+ display: inline-flex;
1175
+ align-items: center;
1176
+ flex-shrink: 0;
1177
+ inline-size: var(--_w);
1178
+ block-size: var(--_h);
1179
+ margin: 0;
1180
+ padding: var(--_pad);
1181
+ border: 0;
1182
+ border-radius: var(--k-radius-full);
1183
+ background: var(--_track);
1184
+ cursor: pointer;
1185
+ transition:
1186
+ background-color var(--k-duration-normal) var(--k-ease-standard),
1187
+ box-shadow var(--k-duration-fast) var(--k-ease-standard);
1188
+ }
1189
+
1190
+ .k-switch::before {
1191
+ content: "";
1192
+ inline-size: calc(var(--_h) - var(--_pad) * 2);
1193
+ block-size: calc(var(--_h) - var(--_pad) * 2);
1194
+ border-radius: var(--k-radius-full);
1195
+ background: var(--k-switch-thumb, #fff);
1196
+ box-shadow: var(--k-shadow-sm);
1197
+ transition: margin-inline-start var(--k-duration-normal) var(--k-ease-emphasized);
1198
+ }
1199
+
1200
+ .k-switch:hover { --_track: color-mix(in srgb, var(--k-switch-track-off, var(--k-border-input)), var(--k-text-primary) 12%); }
1201
+
1202
+ .k-switch:checked { --_track: var(--k-switch-track-on, var(--k-bg-brand)); }
1203
+ .k-switch:checked:hover { --_track: var(--k-switch-track-on, var(--k-bg-brand-hover)); }
1204
+ .k-switch:checked::before { margin-inline-start: calc(var(--_w) - var(--_h)); }
1205
+
1206
+ .k-switch:focus-visible {
1207
+ outline: 2px solid transparent;
1208
+ box-shadow: var(--k-ring-brand);
1209
+ }
1210
+
1211
+ .k-switch:disabled {
1212
+ --_track: var(--k-bg-tertiary);
1213
+ cursor: not-allowed;
1214
+ }
1215
+ .k-switch:disabled::before { background: var(--k-bg-secondary); box-shadow: none; }
1216
+
1217
+ .k-switch--sm { --_w: var(--k-switch-width, 1.75rem); --_h: var(--k-switch-height, 1rem); }
1218
+ .k-switch--lg { --_w: var(--k-switch-width, 2.75rem); --_h: var(--k-switch-height, 1.5rem); }
1219
+
1220
+ @media (forced-colors: active) {
1221
+ .k-switch { border: 1px solid ButtonText; background: Canvas; }
1222
+ .k-switch::before { background: ButtonText; forced-color-adjust: none; }
1223
+ .k-switch:checked { background: Highlight; }
1224
+ .k-switch:checked::before { background: HighlightText; }
1225
+ }
1226
+
1227
+ }