@kashi-ui/css 0.3.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; } }
@@ -854,6 +879,28 @@
854
879
  .k-datepicker__popover { border-color: CanvasText; }
855
880
  }
856
881
 
882
+ /* نشان بانک داخل فیلد (کارت، شبا): لوگو + نام */
883
+ .k-bank {
884
+ display: inline-flex;
885
+ align-items: center;
886
+ gap: var(--k-space-1_5);
887
+ color: var(--k-text-tertiary);
888
+ font-size: var(--k-text-sm);
889
+ white-space: nowrap;
890
+ }
891
+ .k-bank__logo {
892
+ inline-size: 1.5rem;
893
+ block-size: 1.5rem;
894
+ flex-shrink: 0;
895
+ border-radius: var(--k-radius-sm);
896
+ animation: k-pop-in var(--k-duration-normal) var(--k-ease-standard);
897
+ }
898
+ /* لوگوهای تیره روی پس‌زمینهٔ تیره دیده شوند */
899
+ [data-theme="dark"] .k-bank__logo, :root:not([data-theme]) .k-bank__logo {
900
+ padding: 1px;
901
+ background: #fff;
902
+ }
903
+
857
904
  /* کارت
858
905
  * <article class="k-card">
859
906
  * <header class="k-card__header">
@@ -876,7 +923,7 @@
876
923
  border-radius: var(--k-card-radius, var(--k-radius-xl));
877
924
  background: var(--k-card-bg, var(--k-bg-elevated));
878
925
  color: var(--k-text-primary);
879
- box-shadow: var(--k-card-shadow, var(--k-shadow-xs));
926
+ box-shadow: var(--k-card-shadow, var(--k-shadow-xs)), var(--k-highlight);
880
927
  overflow: clip;
881
928
  }
882
929
 
@@ -913,7 +960,7 @@
913
960
 
914
961
  .k-card__media { display: block; inline-size: 100%; object-fit: cover; }
915
962
 
916
- .k-card--flat { box-shadow: none; }
963
+ .k-card--flat { box-shadow: var(--k-highlight); }
917
964
 
918
965
  .k-card--interactive {
919
966
  position: relative;
@@ -921,7 +968,7 @@
921
968
  border-color var(--k-duration-fast) var(--k-ease-standard),
922
969
  box-shadow var(--k-duration-normal) var(--k-ease-standard);
923
970
  }
924
- .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); }
925
972
  .k-card--interactive:has(:focus-visible) { box-shadow: var(--k-shadow-md), var(--k-ring-brand); }
926
973
  /* لینک اصلی کل کارت را قابل‌کلیک می‌کند ولی فقط یک توقف Tab دارد */
927
974
  .k-card--interactive :is(a, button).k-card__link::after { content: ""; position: absolute; inset: 0; }
@@ -957,8 +1004,9 @@
957
1004
  margin: 0;
958
1005
  border: 1px solid var(--_border);
959
1006
  border-radius: var(--k-checkbox-radius, calc(0.3125rem * var(--k-radius-factor)));
960
- background: var(--k-bg-primary);
1007
+ background: var(--k-bg-elevated);
961
1008
  color: var(--k-text-on-brand);
1009
+ box-shadow: var(--k-shadow-xs);
962
1010
  cursor: pointer;
963
1011
  transition:
964
1012
  background-color var(--k-duration-fast) var(--k-ease-standard),
@@ -979,7 +1027,7 @@
979
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");
980
1028
  }
981
1029
 
982
- .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); }
983
1031
 
984
1032
  .k-checkbox:is(:checked, :indeterminate) {
985
1033
  --_border: var(--k-bg-brand);
@@ -1026,6 +1074,81 @@
1026
1074
  .k-checkbox::before { display: none; }
1027
1075
  }
1028
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
+
1029
1152
  /* فیلد: برچسب + کنترل + راهنما/خطا — مشترک بین Input، Checkbox و Switch
1030
1153
  * <div class="k-field">
1031
1154
  * <label class="k-label" for="email">ایمیل <span class="k-label__required" aria-hidden="true">*</span></label>
@@ -1081,11 +1204,16 @@
1081
1204
  color: var(--k-text-primary);
1082
1205
  box-shadow: var(--k-shadow-xs);
1083
1206
  cursor: text;
1207
+ font-size: var(--k-text-md);
1084
1208
  transition:
1085
1209
  border-color var(--k-duration-fast) var(--k-ease-standard),
1086
1210
  box-shadow var(--k-duration-fast) var(--k-ease-standard);
1087
1211
  }
1088
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
+
1089
1217
  .k-input:focus-within {
1090
1218
  --_border: var(--k-border-brand);
1091
1219
  box-shadow: var(--k-shadow-xs), var(--_ring);
@@ -1117,6 +1245,17 @@
1117
1245
  font: inherit;
1118
1246
  font-size: var(--k-text-md);
1119
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
+
1120
1259
  .k-input__control::placeholder { color: var(--k-text-tertiary); opacity: 1; }
1121
1260
  .k-input__control:disabled { color: var(--k-text-quaternary); cursor: not-allowed; }
1122
1261
 
@@ -1151,7 +1290,150 @@
1151
1290
 
1152
1291
  @media (forced-colors: active) {
1153
1292
  .k-input { border-color: FieldText; }
1154
- .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; }
1155
1437
  }
1156
1438
 
1157
1439
  /* سوییچ — روی <input type="checkbox" role="switch"> بومی
@@ -1182,6 +1464,7 @@
1182
1464
  border-radius: var(--k-radius-full);
1183
1465
  background: var(--_track);
1184
1466
  cursor: pointer;
1467
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.12);
1185
1468
  transition:
1186
1469
  background-color var(--k-duration-normal) var(--k-ease-standard),
1187
1470
  box-shadow var(--k-duration-fast) var(--k-ease-standard);
@@ -1193,7 +1476,7 @@
1193
1476
  block-size: calc(var(--_h) - var(--_pad) * 2);
1194
1477
  border-radius: var(--k-radius-full);
1195
1478
  background: var(--k-switch-thumb, #fff);
1196
- 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);
1197
1480
  transition: margin-inline-start var(--k-duration-normal) var(--k-ease-emphasized);
1198
1481
  }
1199
1482
 
@@ -1224,4 +1507,208 @@
1224
1507
  .k-switch:checked::before { background: HighlightText; }
1225
1508
  }
1226
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
+
1227
1714
  }