@kashi-ui/css 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/kashi.css CHANGED
@@ -21,7 +21,7 @@
21
21
  --k-firoozeh-300: #4fd8cb;
22
22
  --k-firoozeh-400: #22c2b4;
23
23
  --k-firoozeh-500: #0fa89b;
24
- --k-firoozeh-600: #08877e;
24
+ --k-firoozeh-600: #0b8077;
25
25
  --k-firoozeh-700: #0a6b65;
26
26
  --k-firoozeh-800: #0d5551;
27
27
  --k-firoozeh-900: #0f4644;
@@ -76,12 +76,15 @@
76
76
  --k-shab-200: #d5d9e2;
77
77
  --k-shab-300: #b1b9c9;
78
78
  --k-shab-400: #8792ab;
79
+ --k-shab-450: #848fa7;
79
80
  --k-shab-500: #687491;
81
+ --k-shab-550: #5a637a;
80
82
  --k-shab-600: #535d78;
81
83
  --k-shab-700: #444c62;
82
84
  --k-shab-800: #2a2f3d;
83
85
  --k-shab-850: #1e222c;
84
86
  --k-shab-900: #161921;
87
+ --k-shab-925: #111319;
85
88
  --k-shab-950: #0d0f14;
86
89
  --k-shab-1000: #08090c;
87
90
  --k-brand-50: var(--k-firoozeh-50);
@@ -162,11 +165,11 @@
162
165
  --k-bg-primary: var(--k-shab-1000);
163
166
  --k-bg-secondary: var(--k-shab-950);
164
167
  --k-bg-tertiary: var(--k-shab-900);
165
- --k-bg-elevated: var(--k-shab-900);
168
+ --k-bg-elevated: var(--k-shab-925);
166
169
  --k-bg-hover: rgb(255 255 255 / 0.05);
167
170
  --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);
171
+ --k-bg-brand: var(--k-brand-400);
172
+ --k-bg-brand-hover: var(--k-brand-300);
170
173
  --k-bg-brand-subtle: color-mix(in srgb, var(--k-brand-500) 14%, transparent);
171
174
  --k-bg-error: var(--k-anar-600);
172
175
  --k-bg-error-hover: var(--k-anar-700);
@@ -178,7 +181,8 @@
178
181
  --k-text-secondary: var(--k-shab-200);
179
182
  --k-text-tertiary: var(--k-shab-400);
180
183
  --k-text-quaternary: var(--k-shab-500);
181
- --k-text-on-brand: var(--k-shab-0);
184
+ --k-text-on-brand: var(--k-shab-1000);
185
+ --k-text-on-error: var(--k-shab-0);
182
186
  --k-text-brand: var(--k-brand-300);
183
187
  --k-text-error: var(--k-anar-400);
184
188
  --k-text-warning: var(--k-zafaran-400);
@@ -187,11 +191,18 @@
187
191
  --k-border-primary: var(--k-shab-700);
188
192
  --k-border-secondary: var(--k-shab-800);
189
193
  --k-border-brand: var(--k-brand-400);
190
- --k-border-input: var(--k-shab-500);
194
+ --k-border-input: var(--k-shab-550);
191
195
  --k-border-error: var(--k-anar-400);
192
196
  --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent);
193
197
  --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);
198
+ --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(0 0 0 / 0.2), inset 0 -2px 0 rgb(0 0 0 / 0.12);
199
+ --k-highlight: inset 0 1px 0 rgb(255 255 255 / 0.05);
200
+ --k-shadow-xs: 0 1px 2px rgb(0 0 0 / 0.4);
201
+ --k-shadow-sm: 0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px -1px rgb(0 0 0 / 0.4);
202
+ --k-shadow-md: 0 4px 8px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.35);
203
+ --k-shadow-lg: 0 12px 24px -4px rgb(0 0 0 / 0.55), 0 4px 8px -4px rgb(0 0 0 / 0.35);
204
+ --k-shadow-xl: 0 20px 32px -6px rgb(0 0 0 / 0.6), 0 8px 12px -6px rgb(0 0 0 / 0.4);
205
+ --k-shadow-2xl: 0 28px 56px -12px rgb(0 0 0 / 0.7);
195
206
  }
196
207
 
197
208
  [data-theme="light"] {
@@ -202,8 +213,8 @@
202
213
  --k-bg-elevated: var(--k-shab-0);
203
214
  --k-bg-hover: var(--k-shab-50);
204
215
  --k-bg-active: var(--k-shab-100);
205
- --k-bg-brand: var(--k-brand-700);
206
- --k-bg-brand-hover: var(--k-brand-800);
216
+ --k-bg-brand: var(--k-brand-600);
217
+ --k-bg-brand-hover: var(--k-brand-700);
207
218
  --k-bg-brand-subtle: var(--k-brand-50);
208
219
  --k-bg-error: var(--k-anar-600);
209
220
  --k-bg-error-hover: var(--k-anar-700);
@@ -216,6 +227,7 @@
216
227
  --k-text-tertiary: var(--k-shab-600);
217
228
  --k-text-quaternary: var(--k-shab-500);
218
229
  --k-text-on-brand: var(--k-shab-0);
230
+ --k-text-on-error: var(--k-shab-0);
219
231
  --k-text-brand: var(--k-brand-700);
220
232
  --k-text-error: var(--k-anar-700);
221
233
  --k-text-warning: var(--k-zafaran-700);
@@ -224,11 +236,18 @@
224
236
  --k-border-primary: var(--k-shab-300);
225
237
  --k-border-secondary: var(--k-shab-200);
226
238
  --k-border-brand: var(--k-brand-600);
227
- --k-border-input: var(--k-shab-500);
239
+ --k-border-input: var(--k-shab-450);
228
240
  --k-border-error: var(--k-anar-500);
229
241
  --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent);
230
242
  --k-ring-error: 0 0 0 4px rgb(229 29 42 / 0.2);
231
243
  --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05);
244
+ --k-highlight: 0 0 #0000;
245
+ --k-shadow-xs: 0 1px 2px rgb(10 13 18 / 0.05);
246
+ --k-shadow-sm: 0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1);
247
+ --k-shadow-md: 0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06);
248
+ --k-shadow-lg: 0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03);
249
+ --k-shadow-xl: 0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03);
250
+ --k-shadow-2xl: 0 24px 48px -12px rgb(10 13 18 / 0.18);
232
251
  }
233
252
 
234
253
  }
@@ -250,6 +269,9 @@
250
269
  font-size: var(--k-text-md);
251
270
  line-height: var(--k-leading-normal);
252
271
  -webkit-font-smoothing: antialiased;
272
+ text-rendering: optimizeLegibility;
273
+ /* نوار اسکرول هم‌رنگ تم */
274
+ scrollbar-color: var(--k-border-primary) transparent;
253
275
  -moz-osx-font-smoothing: grayscale;
254
276
  /* کشیده‌نویسی و اتصال درست حروف فارسی */
255
277
  font-feature-settings: "kern", "liga", "calt";
@@ -307,6 +329,9 @@
307
329
  }
308
330
  }
309
331
 
332
+ /* متن پاراگراف‌ها بدون تک‌کلمهٔ تنها در خط آخر */
333
+ :where(p, li, figcaption) { text-wrap: pretty; }
334
+
310
335
  /* ارقام لاتین در کنار متن فارسی: tabular برای جدول‌ها و اعداد */
311
336
  .k-tabular { font-variant-numeric: tabular-nums; }
312
337
 
@@ -348,7 +373,7 @@
348
373
  background: var(--_bg);
349
374
  color: var(--k-text-tertiary);
350
375
  font-size: var(--k-text-sm);
351
- box-shadow: var(--k-shadow-xs);
376
+ box-shadow: var(--k-shadow-xs), var(--k-highlight);
352
377
  }
353
378
 
354
379
  .k-alert--brand { --_accent: var(--k-text-brand); }
@@ -508,7 +533,7 @@
508
533
  gap: var(--k-space-1);
509
534
  padding-block: 0.125rem;
510
535
  padding-inline: var(--_px);
511
- border: 1px solid color-mix(in srgb, var(--_fg) 24%, transparent);
536
+ border: 1px solid color-mix(in srgb, var(--_fg) 20%, transparent);
512
537
  border-radius: var(--k-badge-radius, var(--k-radius-full));
513
538
  background: var(--_bg);
514
539
  color: var(--_fg);
@@ -553,8 +578,8 @@
553
578
  --_h: var(--k-btn-height-md, calc(2.5rem * var(--k-density)));
554
579
  --_px: var(--k-btn-padding-md, calc(0.875rem * var(--k-density)));
555
580
  --_fs: var(--k-text-sm);
556
- --_bg: var(--k-bg-primary);
557
- --_bg-hover: var(--k-bg-hover);
581
+ --_bg: var(--k-btn-secondary-bg, var(--k-bg-elevated));
582
+ --_bg-hover: color-mix(in srgb, var(--_bg), var(--k-text-primary) 5%);
558
583
  --_fg: var(--k-text-secondary);
559
584
  --_fg-hover: var(--k-text-primary);
560
585
  --_border: var(--k-border-primary);
@@ -623,7 +648,7 @@
623
648
  content: "";
624
649
  position: absolute;
625
650
  inset: 1px;
626
- border: 1px solid rgb(255 255 255 / 0.12);
651
+ border: 1px solid rgb(255 255 255 / var(--k-btn-highlight, 0.14));
627
652
  border-radius: inherit;
628
653
  mask: linear-gradient(to bottom, #000, transparent);
629
654
  pointer-events: none;
@@ -631,6 +656,7 @@
631
656
  .k-btn:is(.k-btn--primary, .k-btn--danger):is(:disabled, [aria-disabled="true"]:not([aria-busy="true"]))::before { display: none; }
632
657
  .k-btn--tertiary {
633
658
  --_bg: transparent;
659
+ --_bg-hover: var(--k-bg-hover);
634
660
  --_border: transparent;
635
661
  --_shadow: none;
636
662
  }
@@ -648,8 +674,8 @@
648
674
  .k-btn--danger {
649
675
  --_bg: var(--k-bg-error);
650
676
  --_bg-hover: var(--k-bg-error-hover);
651
- --_fg: var(--k-text-on-brand);
652
- --_fg-hover: var(--k-text-on-brand);
677
+ --_fg: var(--k-text-on-error);
678
+ --_fg-hover: var(--k-text-on-error);
653
679
  --_border: transparent;
654
680
  --_shadow: var(--k-shadow-xs), var(--k-shadow-skeuomorphic);
655
681
  --_ring: var(--k-ring-error);
@@ -657,7 +683,6 @@
657
683
  .k-btn--danger-secondary {
658
684
  --_fg: var(--k-text-error);
659
685
  --_fg-hover: var(--k-text-error);
660
- --_bg-hover: var(--k-bg-error-subtle);
661
686
  --_ring: var(--k-ring-error);
662
687
  }
663
688
 
@@ -836,7 +861,7 @@
836
861
  border: 1px solid var(--k-border-secondary);
837
862
  border-radius: var(--k-radius-xl);
838
863
  background: var(--k-calendar-bg, var(--k-bg-elevated));
839
- box-shadow: var(--k-shadow-xl);
864
+ box-shadow: var(--k-shadow-xl), var(--k-highlight);
840
865
  animation: k-pop-in var(--k-duration-fast) var(--k-ease-standard);
841
866
  }
842
867
  @keyframes k-pop-in { from { opacity: 0; translate: 0 -4px; } }
@@ -898,7 +923,7 @@
898
923
  border-radius: var(--k-card-radius, var(--k-radius-xl));
899
924
  background: var(--k-card-bg, var(--k-bg-elevated));
900
925
  color: var(--k-text-primary);
901
- box-shadow: var(--k-card-shadow, var(--k-shadow-xs));
926
+ box-shadow: var(--k-card-shadow, var(--k-shadow-xs)), var(--k-highlight);
902
927
  overflow: clip;
903
928
  }
904
929
 
@@ -935,7 +960,7 @@
935
960
 
936
961
  .k-card__media { display: block; inline-size: 100%; object-fit: cover; }
937
962
 
938
- .k-card--flat { box-shadow: none; }
963
+ .k-card--flat { box-shadow: var(--k-highlight); }
939
964
 
940
965
  .k-card--interactive {
941
966
  position: relative;
@@ -943,7 +968,7 @@
943
968
  border-color var(--k-duration-fast) var(--k-ease-standard),
944
969
  box-shadow var(--k-duration-normal) var(--k-ease-standard);
945
970
  }
946
- .k-card--interactive:hover { border-color: var(--k-border-primary); box-shadow: var(--k-shadow-md); }
971
+ .k-card--interactive:hover { border-color: var(--k-border-primary); box-shadow: var(--k-shadow-md), var(--k-highlight); }
947
972
  .k-card--interactive:has(:focus-visible) { box-shadow: var(--k-shadow-md), var(--k-ring-brand); }
948
973
  /* لینک اصلی کل کارت را قابل‌کلیک می‌کند ولی فقط یک توقف Tab دارد */
949
974
  .k-card--interactive :is(a, button).k-card__link::after { content: ""; position: absolute; inset: 0; }
@@ -979,8 +1004,9 @@
979
1004
  margin: 0;
980
1005
  border: 1px solid var(--_border);
981
1006
  border-radius: var(--k-checkbox-radius, calc(0.3125rem * var(--k-radius-factor)));
982
- background: var(--k-bg-primary);
1007
+ background: var(--k-bg-elevated);
983
1008
  color: var(--k-text-on-brand);
1009
+ box-shadow: var(--k-shadow-xs);
984
1010
  cursor: pointer;
985
1011
  transition:
986
1012
  background-color var(--k-duration-fast) var(--k-ease-standard),
@@ -1001,7 +1027,7 @@
1001
1027
  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");
1002
1028
  }
1003
1029
 
1004
- .k-checkbox:hover { --_border: var(--k-border-brand); }
1030
+ .k-checkbox:hover:not(:disabled) { --_border: var(--k-border-brand); box-shadow: 0 0 0 4px var(--k-bg-hover); }
1005
1031
 
1006
1032
  .k-checkbox:is(:checked, :indeterminate) {
1007
1033
  --_border: var(--k-bg-brand);
@@ -1048,6 +1074,81 @@
1048
1074
  .k-checkbox::before { display: none; }
1049
1075
  }
1050
1076
 
1077
+ /* پنجرهٔ گفتگو — روی <dialog> بومی: تلهٔ فوکوس، Esc و غیرفعال شدن پس‌زمینه رایگان
1078
+ * اندازه‌ها: k-dialog--sm | k-dialog--md (پیش‌فرض) | k-dialog--lg
1079
+ *
1080
+ * متغیرها: --k-dialog-width --k-dialog-radius --k-dialog-padding
1081
+ */
1082
+ .k-dialog {
1083
+ --_p: var(--k-dialog-padding, var(--k-space-6));
1084
+
1085
+ inline-size: min(var(--k-dialog-width, 30rem), calc(100vw - 2rem));
1086
+ max-block-size: calc(100dvh - 2rem);
1087
+ margin: auto;
1088
+ padding: 0;
1089
+ border: 1px solid var(--k-border-secondary);
1090
+ border-radius: var(--k-dialog-radius, var(--k-radius-2xl));
1091
+ background: var(--k-bg-elevated);
1092
+ color: var(--k-text-primary);
1093
+ box-shadow: var(--k-shadow-2xl), var(--k-highlight);
1094
+ overflow: auto;
1095
+ }
1096
+ .k-dialog--sm { --k-dialog-width: 24rem; }
1097
+ .k-dialog--lg { --k-dialog-width: 42rem; }
1098
+
1099
+ .k-dialog::backdrop {
1100
+ background: rgb(8 9 12 / 0.6);
1101
+ backdrop-filter: blur(4px);
1102
+ }
1103
+ .k-dialog[open] { animation: k-dialog-in var(--k-duration-normal) var(--k-ease-emphasized); }
1104
+ .k-dialog[open]::backdrop { animation: k-fade-in var(--k-duration-normal) var(--k-ease-standard); }
1105
+ @keyframes k-dialog-in { from { opacity: 0; scale: 0.96; translate: 0 8px; } }
1106
+ @keyframes k-fade-in { from { opacity: 0; } }
1107
+
1108
+ .k-dialog__header {
1109
+ display: flex;
1110
+ align-items: flex-start;
1111
+ gap: var(--k-space-4);
1112
+ padding: var(--_p) var(--_p) 0;
1113
+ }
1114
+ .k-dialog__icon {
1115
+ display: grid;
1116
+ place-items: center;
1117
+ flex-shrink: 0;
1118
+ inline-size: 3rem;
1119
+ block-size: 3rem;
1120
+ border-radius: 50%;
1121
+ background: var(--k-bg-brand-subtle);
1122
+ color: var(--k-text-brand);
1123
+ box-shadow: 0 0 0 8px color-mix(in srgb, var(--k-bg-brand-subtle) 50%, transparent);
1124
+ }
1125
+ .k-dialog__icon svg { inline-size: 1.5rem; block-size: 1.5rem; }
1126
+ .k-dialog--danger .k-dialog__icon { background: var(--k-bg-error-subtle); color: var(--k-text-error); box-shadow: 0 0 0 8px color-mix(in srgb, var(--k-bg-error-subtle) 50%, transparent); }
1127
+ .k-dialog__heading { flex: 1; display: grid; gap: var(--k-space-1); padding-block-start: var(--k-space-1); }
1128
+ .k-dialog__title { margin: 0; font-size: var(--k-text-lg); font-weight: var(--k-weight-semibold); line-height: var(--k-leading-tight); }
1129
+ .k-dialog__description { margin: 0; color: var(--k-text-tertiary); font-size: var(--k-text-sm); line-height: var(--k-leading-normal); }
1130
+ .k-dialog__close { margin-block: -0.25rem; margin-inline-end: -0.5rem; }
1131
+ .k-dialog__body { padding: var(--k-space-5) var(--_p) 0; }
1132
+ .k-dialog__footer {
1133
+ display: flex;
1134
+ flex-wrap: wrap;
1135
+ justify-content: flex-end;
1136
+ gap: var(--k-space-3);
1137
+ padding: var(--k-space-6) var(--_p) var(--_p);
1138
+ }
1139
+ .k-dialog__footer--block > * { flex: 1; }
1140
+
1141
+ /* قفل اسکرول صفحه هنگام باز بودن */
1142
+ html:has(.k-dialog[open]) { overflow: hidden; }
1143
+
1144
+ @media (max-width: 30rem) {
1145
+ .k-dialog__footer { flex-direction: column-reverse; }
1146
+ .k-dialog__footer > * { inline-size: 100%; }
1147
+ }
1148
+ @media (forced-colors: active) {
1149
+ .k-dialog { border-color: CanvasText; }
1150
+ }
1151
+
1051
1152
  /* فیلد: برچسب + کنترل + راهنما/خطا — مشترک بین Input، Checkbox و Switch
1052
1153
  * <div class="k-field">
1053
1154
  * <label class="k-label" for="email">ایمیل <span class="k-label__required" aria-hidden="true">*</span></label>
@@ -1103,11 +1204,16 @@
1103
1204
  color: var(--k-text-primary);
1104
1205
  box-shadow: var(--k-shadow-xs);
1105
1206
  cursor: text;
1207
+ font-size: var(--k-text-md);
1106
1208
  transition:
1107
1209
  border-color var(--k-duration-fast) var(--k-ease-standard),
1108
1210
  box-shadow var(--k-duration-fast) var(--k-ease-standard);
1109
1211
  }
1110
1212
 
1213
+ .k-input:hover:not(:focus-within, :has(:disabled, [aria-invalid="true"])) {
1214
+ --_border: var(--k-input-border-hover, var(--k-text-quaternary));
1215
+ }
1216
+
1111
1217
  .k-input:focus-within {
1112
1218
  --_border: var(--k-border-brand);
1113
1219
  box-shadow: var(--k-shadow-xs), var(--_ring);
@@ -1139,6 +1245,17 @@
1139
1245
  font: inherit;
1140
1246
  font-size: var(--k-text-md);
1141
1247
  }
1248
+ /* ارقام هم‌عرض تا عدد هنگام تایپ جابه‌جا نشود */
1249
+ .k-input__control:is([inputmode="numeric"], [inputmode="tel"], [inputmode="decimal"]) {
1250
+ font-variant-numeric: tabular-nums;
1251
+ letter-spacing: 0.02em;
1252
+ }
1253
+
1254
+ /* iOS هنگام فوکوس روی فیلدی با متن کوچک‌تر از ۱۶ پیکسل کل صفحه را بزرگ می‌کند */
1255
+ @supports (-webkit-touch-callout: none) {
1256
+ .k-input__control { font-size: max(16px, 1em); }
1257
+ }
1258
+
1142
1259
  .k-input__control::placeholder { color: var(--k-text-tertiary); opacity: 1; }
1143
1260
  .k-input__control:disabled { color: var(--k-text-quaternary); cursor: not-allowed; }
1144
1261
 
@@ -1173,7 +1290,150 @@
1173
1290
 
1174
1291
  @media (forced-colors: active) {
1175
1292
  .k-input { border-color: FieldText; }
1176
- .k-input:focus-within { outline-color: Highlight; }
1293
+ .k-input:hover:not(:focus-within, :has(:disabled, [aria-invalid="true"])) {
1294
+ --_border: var(--k-input-border-hover, var(--k-text-quaternary));
1295
+ }
1296
+
1297
+ .k-input:focus-within { outline-color: Highlight; }
1298
+ }
1299
+
1300
+ /* رادیو — روی <input type="radio"> بومی؛ برای گروه از <fieldset class="k-radio-group"> استفاده کنید
1301
+ * <fieldset class="k-radio-group">
1302
+ * <legend class="k-label">روش ارسال</legend>
1303
+ * <label class="k-check"><input type="radio" name="ship" class="k-radio"><span class="k-check__text">…</span></label>
1304
+ * </fieldset>
1305
+ * کارت‌های قابل‌انتخاب: k-radio-group--cards
1306
+ *
1307
+ * متغیرها: --k-radio-size
1308
+ */
1309
+ .k-radio {
1310
+ --_s: var(--k-radio-size, 1.125rem);
1311
+ --_border: var(--k-border-input);
1312
+
1313
+ appearance: none;
1314
+ display: inline-grid;
1315
+ place-content: center;
1316
+ flex-shrink: 0;
1317
+ inline-size: var(--_s);
1318
+ block-size: var(--_s);
1319
+ margin: 0;
1320
+ border: 1px solid var(--_border);
1321
+ border-radius: 50%;
1322
+ background: var(--k-bg-elevated);
1323
+ box-shadow: var(--k-shadow-xs);
1324
+ cursor: pointer;
1325
+ transition: border-color var(--k-duration-fast), background-color var(--k-duration-fast), box-shadow var(--k-duration-fast);
1326
+ }
1327
+ .k-radio::before {
1328
+ content: "";
1329
+ inline-size: calc(var(--_s) * 0.4);
1330
+ block-size: calc(var(--_s) * 0.4);
1331
+ border-radius: 50%;
1332
+ background: var(--k-text-on-brand);
1333
+ scale: 0;
1334
+ transition: scale var(--k-duration-fast) var(--k-ease-emphasized);
1335
+ }
1336
+ .k-radio:hover:not(:disabled) { --_border: var(--k-border-brand); box-shadow: 0 0 0 4px var(--k-bg-hover); }
1337
+ .k-radio:checked { --_border: var(--k-bg-brand); background: var(--k-bg-brand); }
1338
+ .k-radio:checked::before { scale: 1; }
1339
+ .k-radio:focus-visible { outline: 2px solid transparent; box-shadow: var(--k-ring-brand); }
1340
+ .k-radio[aria-invalid="true"] { --_border: var(--k-border-error); }
1341
+ .k-radio:disabled { --_border: var(--k-border-secondary); background: var(--k-bg-tertiary); cursor: not-allowed; }
1342
+ .k-radio:disabled::before { background: var(--k-text-quaternary); }
1343
+
1344
+ .k-check > .k-radio { margin-block-start: calc((1.25rem - var(--_s)) / 2); }
1345
+
1346
+ .k-radio-group {
1347
+ display: grid;
1348
+ gap: var(--k-space-3);
1349
+ min-inline-size: 0;
1350
+ margin: 0;
1351
+ padding: 0;
1352
+ border: 0;
1353
+ }
1354
+ .k-radio-group > legend { padding: 0; margin-block-end: var(--k-space-3); }
1355
+ .k-radio-group--inline { display: flex; flex-wrap: wrap; gap: var(--k-space-3) var(--k-space-6); }
1356
+
1357
+ /* کارت‌های قابل‌انتخاب (مثل انتخاب پلن یا روش ارسال) */
1358
+ .k-radio-group--cards .k-check {
1359
+ display: flex;
1360
+ padding: var(--k-space-4);
1361
+ border: 1px solid var(--k-border-secondary);
1362
+ border-radius: var(--k-radius-lg);
1363
+ background: var(--k-bg-elevated);
1364
+ box-shadow: var(--k-shadow-xs), var(--k-highlight);
1365
+ transition: border-color var(--k-duration-fast), box-shadow var(--k-duration-fast);
1366
+ }
1367
+ .k-radio-group--cards .k-check:hover { border-color: var(--k-border-primary); }
1368
+ .k-radio-group--cards .k-check:has(:checked) {
1369
+ border-color: var(--k-border-brand);
1370
+ box-shadow: 0 0 0 1px var(--k-border-brand), var(--k-shadow-xs);
1371
+ }
1372
+ .k-radio-group--cards .k-check:has(:focus-visible) { box-shadow: var(--k-ring-brand); }
1373
+ .k-radio-group--cards .k-check:has(:focus-visible) .k-radio { box-shadow: none; }
1374
+ .k-radio-group--cards .k-check__text { flex: 1; }
1375
+
1376
+ @media (forced-colors: active) {
1377
+ .k-radio { appearance: auto; }
1378
+ .k-radio::before { display: none; }
1379
+ .k-radio-group--cards .k-check:has(:checked) { outline: 2px solid Highlight; }
1380
+ }
1381
+
1382
+ /* انتخاب از فهرست — <select> بومی با ظاهر کاشی (دسترس‌پذیر و سازگار با گوشی)
1383
+ * <div class="k-select"><select class="k-select__control">…</select></div>
1384
+ * اندازه‌ها: k-select--sm | k-select--lg — خطا: aria-invalid="true"
1385
+ */
1386
+ .k-select {
1387
+ --_h: var(--k-input-height-md, calc(2.75rem * var(--k-density)));
1388
+ position: relative;
1389
+ display: flex;
1390
+ }
1391
+ .k-select--sm { --_h: var(--k-input-height-sm, calc(2.5rem * var(--k-density))); }
1392
+ .k-select--lg { --_h: var(--k-input-height-lg, calc(3rem * var(--k-density))); }
1393
+
1394
+ .k-select__control {
1395
+ appearance: none;
1396
+ flex: 1;
1397
+ min-inline-size: 0;
1398
+ block-size: var(--_h);
1399
+ padding-inline: calc(0.875rem * var(--k-density)) 2.5rem;
1400
+ border: 1px solid var(--k-input-border, var(--k-border-input));
1401
+ border-radius: var(--k-input-radius, var(--k-radius-md));
1402
+ background: var(--k-input-bg, var(--k-bg-primary));
1403
+ color: var(--k-text-primary);
1404
+ box-shadow: var(--k-shadow-xs);
1405
+ font: inherit;
1406
+ font-size: var(--k-text-md);
1407
+ cursor: pointer;
1408
+ transition: border-color var(--k-duration-fast), box-shadow var(--k-duration-fast);
1409
+ }
1410
+ .k-select__control:hover:not(:disabled, :focus) { border-color: var(--k-text-quaternary); }
1411
+ .k-select__control:focus-visible { outline: 2px solid transparent; border-color: var(--k-border-brand); box-shadow: var(--k-shadow-xs), var(--k-ring-brand); }
1412
+ .k-select__control[aria-invalid="true"] { border-color: var(--k-border-error); }
1413
+ .k-select__control[aria-invalid="true"]:focus-visible { box-shadow: var(--k-ring-error); }
1414
+ .k-select__control:disabled { background: var(--k-bg-secondary); border-color: var(--k-border-secondary); color: var(--k-text-quaternary); box-shadow: none; cursor: not-allowed; }
1415
+ .k-select__control:has(option[value=""]:checked) { color: var(--k-text-tertiary); }
1416
+ .k-select__control option { background: var(--k-bg-elevated); color: var(--k-text-primary); }
1417
+
1418
+ /* فلش در انتهای فیلد */
1419
+ .k-select::after {
1420
+ content: "";
1421
+ position: absolute;
1422
+ inset-block: 0;
1423
+ inset-inline-end: 0.875rem;
1424
+ inline-size: 1.125rem;
1425
+ margin-block: auto;
1426
+ block-size: 1.125rem;
1427
+ background: var(--k-text-tertiary);
1428
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 8 4 4 4-4'/%3E%3C/svg%3E") center / contain no-repeat;
1429
+ pointer-events: none;
1430
+ }
1431
+
1432
+ @supports (-webkit-touch-callout: none) {
1433
+ .k-select__control { font-size: max(16px, 1em); }
1434
+ }
1435
+ @media (forced-colors: active) {
1436
+ .k-select::after { background: CanvasText; }
1177
1437
  }
1178
1438
 
1179
1439
  /* سوییچ — روی <input type="checkbox" role="switch"> بومی
@@ -1204,6 +1464,7 @@
1204
1464
  border-radius: var(--k-radius-full);
1205
1465
  background: var(--_track);
1206
1466
  cursor: pointer;
1467
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.12);
1207
1468
  transition:
1208
1469
  background-color var(--k-duration-normal) var(--k-ease-standard),
1209
1470
  box-shadow var(--k-duration-fast) var(--k-ease-standard);
@@ -1215,7 +1476,7 @@
1215
1476
  block-size: calc(var(--_h) - var(--_pad) * 2);
1216
1477
  border-radius: var(--k-radius-full);
1217
1478
  background: var(--k-switch-thumb, #fff);
1218
- box-shadow: var(--k-shadow-sm);
1479
+ box-shadow: 0 1px 3px rgb(10 13 18 / 0.2), 0 1px 2px rgb(10 13 18 / 0.12);
1219
1480
  transition: margin-inline-start var(--k-duration-normal) var(--k-ease-emphasized);
1220
1481
  }
1221
1482
 
@@ -1246,4 +1507,208 @@
1246
1507
  .k-switch:checked::before { background: HighlightText; }
1247
1508
  }
1248
1509
 
1510
+ /* زبانه‌ها (Tabs) — ساختار ARIA را کامپوننت React می‌سازد
1511
+ * گونه‌ها: k-tabs--line (پیش‌فرض) | k-tabs--pill | k-tabs--segmented — تمام‌عرض: k-tabs--block
1512
+ */
1513
+ .k-tabs { display: grid; gap: var(--k-space-4); }
1514
+
1515
+ .k-tabs__list {
1516
+ position: relative;
1517
+ display: flex;
1518
+ gap: var(--k-space-1);
1519
+ overflow-x: auto;
1520
+ scrollbar-width: none;
1521
+ }
1522
+
1523
+ .k-tabs__tab {
1524
+ position: relative;
1525
+ display: inline-flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ gap: var(--k-space-2);
1529
+ min-block-size: calc(2.5rem * var(--k-density));
1530
+ padding-inline: var(--k-space-3);
1531
+ border: 0;
1532
+ border-radius: var(--k-radius-md);
1533
+ background: transparent;
1534
+ color: var(--k-text-tertiary);
1535
+ font: inherit;
1536
+ font-size: var(--k-text-sm);
1537
+ font-weight: var(--k-weight-semibold);
1538
+ white-space: nowrap;
1539
+ cursor: pointer;
1540
+ transition: color var(--k-duration-fast), background-color var(--k-duration-fast);
1541
+ }
1542
+ .k-tabs__tab:hover { color: var(--k-text-primary); }
1543
+ .k-tabs__tab[aria-selected="true"] { color: var(--k-text-primary); }
1544
+ .k-tabs__tab:focus-visible { outline: 2px solid transparent; box-shadow: var(--k-ring-brand); }
1545
+ .k-tabs__tab:disabled { color: var(--k-text-quaternary); cursor: not-allowed; }
1546
+ .k-tabs__tab .k-badge { font-size: var(--k-text-xs); padding-block: 0; }
1547
+
1548
+ .k-tabs__panel:focus-visible { outline: 2px solid var(--k-border-brand); outline-offset: 4px; border-radius: var(--k-radius-sm); }
1549
+
1550
+ /* خطی: خط زیر زبانهٔ فعال */
1551
+ .k-tabs--line .k-tabs__list { border-block-end: 1px solid var(--k-border-secondary); gap: var(--k-space-4); }
1552
+ .k-tabs--line .k-tabs__tab { padding-inline: var(--k-space-1); border-radius: 0; }
1553
+ .k-tabs--line .k-tabs__tab:focus-visible { border-radius: var(--k-radius-sm); }
1554
+ .k-tabs--line .k-tabs__tab[aria-selected="true"]::after {
1555
+ content: "";
1556
+ position: absolute;
1557
+ inset-inline: 0;
1558
+ inset-block-end: -1px;
1559
+ block-size: 2px;
1560
+ border-radius: 2px;
1561
+ background: var(--k-border-brand);
1562
+ }
1563
+
1564
+ /* قرصی */
1565
+ .k-tabs--pill .k-tabs__tab:hover { background: var(--k-bg-hover); }
1566
+ .k-tabs--pill .k-tabs__tab[aria-selected="true"] { background: var(--k-bg-brand-subtle); color: var(--k-text-brand); }
1567
+
1568
+ /* چندبخشی: مثل کنترل iOS */
1569
+ .k-tabs--segmented .k-tabs__list {
1570
+ inline-size: fit-content;
1571
+ padding: 3px;
1572
+ border: 1px solid var(--k-border-secondary);
1573
+ border-radius: calc(var(--k-radius-md) + 3px);
1574
+ background: var(--k-bg-secondary);
1575
+ }
1576
+ .k-tabs--segmented .k-tabs__tab { min-block-size: calc(2.25rem * var(--k-density)); }
1577
+ .k-tabs--segmented .k-tabs__tab[aria-selected="true"] {
1578
+ background: var(--k-bg-elevated);
1579
+ box-shadow: var(--k-shadow-sm), var(--k-highlight);
1580
+ }
1581
+ .k-tabs--block .k-tabs__list { inline-size: auto; }
1582
+ .k-tabs--block .k-tabs__tab { flex: 1; }
1583
+
1584
+ @media (forced-colors: active) {
1585
+ .k-tabs__tab[aria-selected="true"] { outline: 2px solid Highlight; }
1586
+ }
1587
+
1588
+ /* اعلان کوتاه (Toast) — محل نمایش را کامپوننت <Toaster> می‌سازد
1589
+ * رنگ‌ها: neutral | success | error | warning | info
1590
+ */
1591
+ .k-toaster {
1592
+ position: fixed;
1593
+ inset-block-end: var(--k-space-6);
1594
+ inset-inline-end: var(--k-space-6);
1595
+ z-index: var(--k-z-toast);
1596
+ display: grid;
1597
+ gap: var(--k-space-3);
1598
+ inline-size: min(24rem, calc(100vw - 2rem));
1599
+ margin: 0;
1600
+ padding: 0;
1601
+ list-style: none;
1602
+ pointer-events: none;
1603
+ }
1604
+ .k-toaster--top { inset-block: var(--k-space-6) auto; }
1605
+ @media (max-width: 30rem) {
1606
+ .k-toaster { inset-inline: var(--k-space-4); inset-block-end: var(--k-space-4); inline-size: auto; }
1607
+ }
1608
+
1609
+ .k-toast {
1610
+ --_accent: var(--k-text-tertiary);
1611
+
1612
+ position: relative;
1613
+ display: flex;
1614
+ align-items: flex-start;
1615
+ gap: var(--k-space-3);
1616
+ padding: var(--k-space-4);
1617
+ border: 1px solid var(--k-border-secondary);
1618
+ border-radius: var(--k-radius-xl);
1619
+ background: var(--k-bg-elevated);
1620
+ color: var(--k-text-primary);
1621
+ box-shadow: var(--k-shadow-lg), var(--k-highlight);
1622
+ pointer-events: auto;
1623
+ animation: k-toast-in var(--k-duration-slow) var(--k-ease-emphasized);
1624
+ overflow: hidden;
1625
+ }
1626
+ .k-toast[data-state="closing"] { animation: k-toast-out var(--k-duration-normal) var(--k-ease-standard) forwards; }
1627
+ @keyframes k-toast-in { from { opacity: 0; translate: 0 12px; scale: 0.97; } }
1628
+ @keyframes k-toast-out { to { opacity: 0; translate: 0 8px; scale: 0.97; } }
1629
+
1630
+ .k-toast--success { --_accent: var(--k-text-success); }
1631
+ .k-toast--error { --_accent: var(--k-text-error); }
1632
+ .k-toast--warning { --_accent: var(--k-text-warning); }
1633
+ .k-toast--info { --_accent: var(--k-text-info); }
1634
+
1635
+ .k-toast__icon { flex-shrink: 0; inline-size: 1.25rem; block-size: 1.25rem; margin-block-start: 0.125rem; color: var(--_accent); }
1636
+ .k-toast__icon svg { inline-size: 100%; block-size: 100%; }
1637
+ .k-toast__content { flex: 1; display: grid; gap: 0.125rem; min-inline-size: 0; font-size: var(--k-text-sm); }
1638
+ .k-toast__title { margin: 0; font-weight: var(--k-weight-semibold); }
1639
+ .k-toast__description { margin: 0; color: var(--k-text-tertiary); }
1640
+ .k-toast__action { margin-block-start: var(--k-space-2); justify-self: start; }
1641
+ .k-toast__close { margin-block: -0.375rem; margin-inline-end: -0.375rem; }
1642
+
1643
+ /* نوار زمان باقی‌مانده */
1644
+ .k-toast__progress {
1645
+ position: absolute;
1646
+ inset-inline: 0;
1647
+ inset-block-end: 0;
1648
+ block-size: 2px;
1649
+ background: var(--_accent);
1650
+ opacity: 0.6;
1651
+ transform-origin: var(--_origin, right);
1652
+ animation: k-toast-progress linear forwards;
1653
+ }
1654
+ [dir="ltr"] .k-toast__progress { --_origin: left; }
1655
+ .k-toast:is(:hover, :focus-within) .k-toast__progress { animation-play-state: paused; }
1656
+ @keyframes k-toast-progress { to { scale: 0 1; } }
1657
+
1658
+ @media (prefers-reduced-motion: reduce) {
1659
+ .k-toast__progress { display: none; }
1660
+ }
1661
+ @media (forced-colors: active) {
1662
+ .k-toast { border-color: CanvasText; }
1663
+ }
1664
+
1665
+ /* راهنمای کوتاه (Tooltip) — با hover و فوکوس، بسته شدن با Esc (WCAG 1.4.13)
1666
+ * فقط برای توضیح تکمیلی؛ اطلاعات ضروری را در tooltip پنهان نکنید.
1667
+ */
1668
+ .k-tooltip-anchor { position: relative; display: inline-flex; }
1669
+
1670
+ .k-tooltip {
1671
+ position: absolute;
1672
+ inset-block-end: calc(100% + 8px);
1673
+ inset-inline-start: 50%;
1674
+ z-index: var(--k-z-dropdown);
1675
+ inline-size: max-content;
1676
+ max-inline-size: 16rem;
1677
+ padding: var(--k-space-1_5) var(--k-space-3);
1678
+ border-radius: var(--k-radius-md);
1679
+ background: var(--k-tooltip-bg, var(--k-text-primary));
1680
+ color: var(--k-tooltip-fg, var(--k-bg-primary));
1681
+ box-shadow: var(--k-shadow-lg);
1682
+ font-size: var(--k-text-xs);
1683
+ font-weight: var(--k-weight-medium);
1684
+ line-height: 1.6;
1685
+ text-align: center;
1686
+ translate: 50% 0;
1687
+ pointer-events: auto;
1688
+ animation: k-tip-in var(--k-duration-fast) var(--k-ease-standard);
1689
+ }
1690
+ [dir="ltr"] .k-tooltip { translate: -50% 0; }
1691
+ .k-tooltip[hidden] { display: none; }
1692
+ .k-tooltip--bottom { inset-block: calc(100% + 8px) auto; }
1693
+
1694
+ /* پیکان */
1695
+ .k-tooltip::after {
1696
+ content: "";
1697
+ position: absolute;
1698
+ inset-block-start: 100%;
1699
+ inset-inline-start: 50%;
1700
+ translate: 50% 0;
1701
+ border: 5px solid transparent;
1702
+ border-block-start-color: var(--k-tooltip-bg, var(--k-text-primary));
1703
+ }
1704
+ [dir="ltr"] .k-tooltip::after { translate: -50% 0; }
1705
+ .k-tooltip--bottom::after { inset-block: auto 100%; border-block-start-color: transparent; border-block-end-color: var(--k-tooltip-bg, var(--k-text-primary)); }
1706
+ @keyframes k-tip-in { from { opacity: 0; translate: 50% 3px; } }
1707
+ [dir="ltr"] .k-tooltip { animation-name: k-tip-in-ltr; }
1708
+ @keyframes k-tip-in-ltr { from { opacity: 0; translate: -50% 3px; } }
1709
+
1710
+ @media (forced-colors: active) {
1711
+ .k-tooltip { border: 1px solid CanvasText; }
1712
+ }
1713
+
1249
1714
  }