@kashi-ui/tokens 0.4.0 → 0.6.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/index.d.ts CHANGED
@@ -1,19 +1,20 @@
1
1
  export declare const font: {
2
2
  "family": {
3
3
  "sans": "\"Vazirmatn\", \"Vazir\", Tahoma, system-ui, sans-serif",
4
+ "display": "var(--k-font-sans)",
4
5
  "mono": "ui-monospace, \"SF Mono\", Menlo, Consolas, \"Vazirmatn\", monospace"
5
6
  },
6
7
  "size": {
7
- "xs": "0.75rem",
8
- "sm": "0.875rem",
9
- "md": "0.9375rem",
10
- "lg": "1.0625rem",
11
- "xl": "1.25rem",
12
- "2xl": "1.5rem",
13
- "3xl": "1.875rem",
14
- "4xl": "2.25rem",
15
- "5xl": "3rem",
16
- "6xl": "3.75rem"
8
+ "xs": "calc(0.75rem * var(--k-text-scale))",
9
+ "sm": "calc(0.875rem * var(--k-text-scale))",
10
+ "md": "calc(0.9375rem * var(--k-text-scale))",
11
+ "lg": "calc(1.0625rem * var(--k-text-scale))",
12
+ "xl": "calc(1.25rem * var(--k-text-scale))",
13
+ "2xl": "calc(1.5rem * var(--k-text-scale))",
14
+ "3xl": "calc(1.875rem * var(--k-text-scale))",
15
+ "4xl": "calc(2.25rem * var(--k-text-scale))",
16
+ "5xl": "calc(3rem * var(--k-text-scale))",
17
+ "6xl": "calc(3.75rem * var(--k-text-scale))"
17
18
  },
18
19
  "weight": {
19
20
  "light": "300",
@@ -32,7 +33,8 @@ export declare const font: {
32
33
 
33
34
  export declare const knobs: {
34
35
  "radius-factor": "1",
35
- "density": "1"
36
+ "density": "1",
37
+ "text-scale": "1"
36
38
  };
37
39
 
38
40
  export declare const motion: {
@@ -55,7 +57,7 @@ export declare const palette: {
55
57
  "300": "#4fd8cb",
56
58
  "400": "#22c2b4",
57
59
  "500": "#0fa89b",
58
- "600": "#08877e",
60
+ "600": "#0b8077",
59
61
  "700": "#0a6b65",
60
62
  "800": "#0d5551",
61
63
  "900": "#0f4644",
@@ -120,12 +122,15 @@ export declare const palette: {
120
122
  "200": "#d5d9e2",
121
123
  "300": "#b1b9c9",
122
124
  "400": "#8792ab",
125
+ "450": "#848fa7",
123
126
  "500": "#687491",
127
+ "550": "#5a637a",
124
128
  "600": "#535d78",
125
129
  "700": "#444c62",
126
130
  "800": "#2a2f3d",
127
131
  "850": "#1e222c",
128
132
  "900": "#161921",
133
+ "925": "#111319",
129
134
  "950": "#0d0f14",
130
135
  "1000": "#08090c"
131
136
  }
@@ -174,11 +179,11 @@ export declare const themes: {
174
179
  "bg-primary": "var(--k-shab-1000)",
175
180
  "bg-secondary": "var(--k-shab-950)",
176
181
  "bg-tertiary": "var(--k-shab-900)",
177
- "bg-elevated": "var(--k-shab-900)",
182
+ "bg-elevated": "var(--k-shab-925)",
178
183
  "bg-hover": "rgb(255 255 255 / 0.05)",
179
184
  "bg-active": "rgb(255 255 255 / 0.08)",
180
- "bg-brand": "var(--k-brand-700)",
181
- "bg-brand-hover": "var(--k-brand-800)",
185
+ "bg-brand": "var(--k-brand-400)",
186
+ "bg-brand-hover": "var(--k-brand-300)",
182
187
  "bg-brand-subtle": "color-mix(in srgb, var(--k-brand-500) 14%, transparent)",
183
188
  "bg-error": "var(--k-anar-600)",
184
189
  "bg-error-hover": "var(--k-anar-700)",
@@ -190,7 +195,8 @@ export declare const themes: {
190
195
  "text-secondary": "var(--k-shab-200)",
191
196
  "text-tertiary": "var(--k-shab-400)",
192
197
  "text-quaternary": "var(--k-shab-500)",
193
- "text-on-brand": "var(--k-shab-0)",
198
+ "text-on-brand": "var(--k-shab-1000)",
199
+ "text-on-error": "var(--k-shab-0)",
194
200
  "text-brand": "var(--k-brand-300)",
195
201
  "text-error": "var(--k-anar-400)",
196
202
  "text-warning": "var(--k-zafaran-400)",
@@ -199,11 +205,18 @@ export declare const themes: {
199
205
  "border-primary": "var(--k-shab-700)",
200
206
  "border-secondary": "var(--k-shab-800)",
201
207
  "border-brand": "var(--k-brand-400)",
202
- "border-input": "var(--k-shab-500)",
208
+ "border-input": "var(--k-shab-550)",
203
209
  "border-error": "var(--k-anar-400)",
204
210
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent)",
205
211
  "ring-error": "0 0 0 4px rgb(248 59 71 / 0.28)",
206
- "shadow-skeuomorphic": "inset 0 0 0 1px rgb(12 14 18 / 0.18), inset 0 -2px 0 rgb(12 14 18 / 0.05)"
212
+ "shadow-skeuomorphic": "inset 0 0 0 1px rgb(0 0 0 / 0.2), inset 0 -2px 0 rgb(0 0 0 / 0.12)",
213
+ "highlight": "inset 0 1px 0 rgb(255 255 255 / 0.05)",
214
+ "shadow-xs": "0 1px 2px rgb(0 0 0 / 0.4)",
215
+ "shadow-sm": "0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px -1px rgb(0 0 0 / 0.4)",
216
+ "shadow-md": "0 4px 8px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.35)",
217
+ "shadow-lg": "0 12px 24px -4px rgb(0 0 0 / 0.55), 0 4px 8px -4px rgb(0 0 0 / 0.35)",
218
+ "shadow-xl": "0 20px 32px -6px rgb(0 0 0 / 0.6), 0 8px 12px -6px rgb(0 0 0 / 0.4)",
219
+ "shadow-2xl": "0 28px 56px -12px rgb(0 0 0 / 0.7)"
207
220
  },
208
221
  "light": {
209
222
  "bg-primary": "var(--k-shab-0)",
@@ -212,8 +225,8 @@ export declare const themes: {
212
225
  "bg-elevated": "var(--k-shab-0)",
213
226
  "bg-hover": "var(--k-shab-50)",
214
227
  "bg-active": "var(--k-shab-100)",
215
- "bg-brand": "var(--k-brand-700)",
216
- "bg-brand-hover": "var(--k-brand-800)",
228
+ "bg-brand": "var(--k-brand-600)",
229
+ "bg-brand-hover": "var(--k-brand-700)",
217
230
  "bg-brand-subtle": "var(--k-brand-50)",
218
231
  "bg-error": "var(--k-anar-600)",
219
232
  "bg-error-hover": "var(--k-anar-700)",
@@ -226,6 +239,7 @@ export declare const themes: {
226
239
  "text-tertiary": "var(--k-shab-600)",
227
240
  "text-quaternary": "var(--k-shab-500)",
228
241
  "text-on-brand": "var(--k-shab-0)",
242
+ "text-on-error": "var(--k-shab-0)",
229
243
  "text-brand": "var(--k-brand-700)",
230
244
  "text-error": "var(--k-anar-700)",
231
245
  "text-warning": "var(--k-zafaran-700)",
@@ -234,11 +248,18 @@ export declare const themes: {
234
248
  "border-primary": "var(--k-shab-300)",
235
249
  "border-secondary": "var(--k-shab-200)",
236
250
  "border-brand": "var(--k-brand-600)",
237
- "border-input": "var(--k-shab-500)",
251
+ "border-input": "var(--k-shab-450)",
238
252
  "border-error": "var(--k-anar-500)",
239
253
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent)",
240
254
  "ring-error": "0 0 0 4px rgb(229 29 42 / 0.2)",
241
- "shadow-skeuomorphic": "inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05)"
255
+ "shadow-skeuomorphic": "inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05)",
256
+ "highlight": "0 0 #0000",
257
+ "shadow-xs": "0 1px 2px rgb(10 13 18 / 0.05)",
258
+ "shadow-sm": "0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1)",
259
+ "shadow-md": "0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06)",
260
+ "shadow-lg": "0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03)",
261
+ "shadow-xl": "0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03)",
262
+ "shadow-2xl": "0 24px 48px -12px rgb(10 13 18 / 0.18)"
242
263
  }
243
264
  };
244
265
 
@@ -251,6 +272,33 @@ export declare const zIndex: {
251
272
  };
252
273
 
253
274
  export declare function brandScale(color: string): Record<number, string>;
275
+ export declare const FALLBACK_SANS: string;
276
+ /** «IRANSans» را به فهرست کامل با فونت‌های جایگزین تبدیل می‌کند */
277
+ export declare function fontStack(family: string, fallback?: string): string;
278
+
279
+ export interface FontFaceSource {
280
+ url: string;
281
+ /** "woff2" | "woff" | "truetype" | "opentype" */
282
+ format: string;
283
+ }
284
+
285
+ export interface FontFaceOptions {
286
+ /** نام خانوادهٔ فونت، همان که در fontFamily استفاده می‌کنید */
287
+ family: string;
288
+ /** آدرس فایل؛ قالب از پسوند تشخیص داده می‌شود */
289
+ src: string | Array<string | FontFaceSource>;
290
+ /** وزن ثابت (400) یا بازه برای فونت متغیر ("100 900") @default "400" */
291
+ weight?: string | number;
292
+ /** @default "normal" */
293
+ style?: string;
294
+ /** @default "swap" */
295
+ display?: string;
296
+ unicodeRange?: string;
297
+ }
298
+
299
+ /** قاعدهٔ @font-face برای فونت خودمیزبان (رایگان یا خریداری‌شده) */
300
+ export declare function fontFace(options: FontFaceOptions): string;
301
+
254
302
  export interface ThemeOptions {
255
303
  /** رنگ پایهٔ برند (پلهٔ ۵۰۰) یا طیف کامل ۵۰ تا ۹۵۰ */
256
304
  brand?: string | Record<number, string>;
@@ -258,7 +306,16 @@ export interface ThemeOptions {
258
306
  radius?: number;
259
307
  /** ضریب تراکم — 0.875 فشرده، 1 عادی، 1.125 جادار */
260
308
  density?: number;
309
+ /** فونت متن؛ نام تنها («IRANSans») خودکار با فونت‌های جایگزین کامل می‌شود */
261
310
  fontFamily?: string;
311
+ /** فونت عنوان‌ها (h1 تا h6)؛ پیش‌فرض همان fontFamily */
312
+ displayFontFamily?: string;
313
+ /** فونت کد */
314
+ monoFontFamily?: string;
315
+ /** ضریب اندازهٔ همهٔ متن‌ها؛ مثلاً 0.95 برای فونتی که درشت‌تر دیده می‌شود */
316
+ textScale?: number;
317
+ /** فایل‌های فونت برای ساخت @font-face */
318
+ fonts?: FontFaceOptions[];
262
319
  /** پیش‌فرض ":root" */
263
320
  selector?: string;
264
321
  }
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export * from "./tokens.js";
2
- export { createTheme } from "./theme.js";
2
+ export { createTheme, brandScale, fontFace, fontStack, FALLBACK_SANS } from "./theme.js";
package/dist/theme.js CHANGED
@@ -1,4 +1,4 @@
1
- // ساخت تم سفارشی: یک رنگ برند می‌گیرد و CSS آماده برمی‌گرداند.
1
+ // ساخت تم سفارشی: رنگ برند، گردی، تراکم و فونت‌ها را می‌گیرد و CSS آماده برمی‌گرداند.
2
2
  // import { createTheme } from "@kashi-ui/tokens";
3
3
  // const css = createTheme({ brand: "#7c3aed", radius: 1.5, density: 0.875 });
4
4
 
@@ -6,6 +6,9 @@ const STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
6
6
  // درصد اختلاط با سفید (مثبت) یا سیاه (منفی) برای هر پله نسبت به رنگ پایه (۵۰۰)
7
7
  const MIX = { 50: 92, 100: 82, 200: 64, 300: 44, 400: 22, 500: 0, 600: -18, 700: -34, 800: -48, 900: -60, 950: -76 };
8
8
 
9
+ /** فونت‌های جایگزین وقتی فونت اصلی هنوز بارگذاری نشده یا حرفی را ندارد */
10
+ export const FALLBACK_SANS = '"Vazirmatn", Tahoma, system-ui, sans-serif';
11
+
9
12
  /** یک طیف ۱۱ پله‌ای از یک رنگ می‌سازد (با color-mix در فضای oklch) */
10
13
  export function brandScale(color) {
11
14
  return Object.fromEntries(
@@ -17,15 +20,50 @@ export function brandScale(color) {
17
20
  );
18
21
  }
19
22
 
23
+ const quote = (name) => (/^["']|^[\w-]+$/.test(name) && !/\s/.test(name) ? name : `"${name.replace(/"/g, "")}"`);
24
+
25
+ /** «IRANSans» → '"IRANSans", "Vazirmatn", Tahoma, …'؛ فهرست کامل (با کاما) دست‌نخورده می‌ماند */
26
+ export function fontStack(family, fallback = FALLBACK_SANS) {
27
+ return family.includes(",") ? family : `${quote(family.trim())}, ${fallback}`;
28
+ }
29
+
30
+ /** قاعدهٔ @font-face برای فونتی که فایلش را خودتان میزبانی می‌کنید (رایگان یا خریداری‌شده) */
31
+ export function fontFace({ family, src, weight = "400", style = "normal", display = "swap", unicodeRange }) {
32
+ const sources = (Array.isArray(src) ? src : [src])
33
+ .map((s) => {
34
+ const url = typeof s === "string" ? s : s.url;
35
+ const format = typeof s === "string" ? (url.match(/\.(woff2?|ttf|otf)(\?|#|$)/)?.[1] ?? "woff2") : s.format;
36
+ const fmt = { woff2: "woff2", woff: "woff", ttf: "truetype", otf: "opentype" }[format] ?? format;
37
+ return `url("${url}") format("${fmt}")`;
38
+ })
39
+ .join(",\n ");
40
+ return [
41
+ "@font-face {",
42
+ ` font-family: ${quote(family)};`,
43
+ ` src: ${sources};`,
44
+ ` font-weight: ${weight};`,
45
+ ` font-style: ${style};`,
46
+ ` font-display: ${display};`,
47
+ unicodeRange ? ` unicode-range: ${unicodeRange};` : null,
48
+ "}",
49
+ ].filter(Boolean).join("\n");
50
+ }
51
+
20
52
  /**
21
53
  * @param {object} o
22
54
  * @param {string | Record<string,string>} [o.brand] رنگ پایه یا طیف کامل
23
55
  * @param {number} [o.radius] ضریب گردی گوشه‌ها
24
56
  * @param {number} [o.density] ضریب تراکم
25
- * @param {string} [o.fontFamily] فونت جایگزین
57
+ * @param {string} [o.fontFamily] فونت متن، مثل "IRANSans" یا یک فهرست کامل
58
+ * @param {string} [o.displayFontFamily] فونت عنوان‌ها
59
+ * @param {string} [o.monoFontFamily] فونت کد
60
+ * @param {number} [o.textScale] ضریب اندازهٔ متن‌ها
61
+ * @param {object[]} [o.fonts] فایل‌های فونت برای ساخت @font-face
26
62
  * @param {string} [o.selector] انتخاب‌گر CSS، پیش‌فرض :root
27
63
  */
28
- export function createTheme({ brand, radius, density, fontFamily, selector = ":root" } = {}) {
64
+ export function createTheme({
65
+ brand, radius, density, fontFamily, displayFontFamily, monoFontFamily, textScale, fonts = [], selector = ":root",
66
+ } = {}) {
29
67
  const vars = {};
30
68
  if (brand) {
31
69
  const scale = typeof brand === "string" ? brandScale(brand) : brand;
@@ -33,7 +71,12 @@ export function createTheme({ brand, radius, density, fontFamily, selector = ":r
33
71
  }
34
72
  if (radius != null) vars["--k-radius-factor"] = String(radius);
35
73
  if (density != null) vars["--k-density"] = String(density);
36
- if (fontFamily) vars["--k-font-sans"] = fontFamily;
74
+ if (textScale != null) vars["--k-text-scale"] = String(textScale);
75
+ if (fontFamily) vars["--k-font-sans"] = fontStack(fontFamily);
76
+ if (displayFontFamily) vars["--k-font-display"] = fontStack(displayFontFamily, "var(--k-font-sans)");
77
+ if (monoFontFamily) vars["--k-font-mono"] = fontStack(monoFontFamily, 'ui-monospace, Menlo, Consolas, "Vazirmatn", monospace');
78
+ const faces = fonts.map(fontFace).join("\n\n");
37
79
  const body = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`).join("\n");
38
- return `${selector} {\n${body}\n}\n`;
80
+ const rule = body ? `${selector} {\n${body}\n}\n` : "";
81
+ return faces ? `${faces}\n\n${rule}` : rule;
39
82
  }
package/dist/tokens.css CHANGED
@@ -2,13 +2,14 @@
2
2
  :root {
3
3
  --k-radius-factor: 1;
4
4
  --k-density: 1;
5
+ --k-text-scale: 1;
5
6
  --k-firoozeh-50: #e6fbf8;
6
7
  --k-firoozeh-100: #c2f4ee;
7
8
  --k-firoozeh-200: #8ce9df;
8
9
  --k-firoozeh-300: #4fd8cb;
9
10
  --k-firoozeh-400: #22c2b4;
10
11
  --k-firoozeh-500: #0fa89b;
11
- --k-firoozeh-600: #08877e;
12
+ --k-firoozeh-600: #0b8077;
12
13
  --k-firoozeh-700: #0a6b65;
13
14
  --k-firoozeh-800: #0d5551;
14
15
  --k-firoozeh-900: #0f4644;
@@ -63,12 +64,15 @@
63
64
  --k-shab-200: #d5d9e2;
64
65
  --k-shab-300: #b1b9c9;
65
66
  --k-shab-400: #8792ab;
67
+ --k-shab-450: #848fa7;
66
68
  --k-shab-500: #687491;
69
+ --k-shab-550: #5a637a;
67
70
  --k-shab-600: #535d78;
68
71
  --k-shab-700: #444c62;
69
72
  --k-shab-800: #2a2f3d;
70
73
  --k-shab-850: #1e222c;
71
74
  --k-shab-900: #161921;
75
+ --k-shab-925: #111319;
72
76
  --k-shab-950: #0d0f14;
73
77
  --k-shab-1000: #08090c;
74
78
  --k-brand-50: var(--k-firoozeh-50);
@@ -106,17 +110,18 @@
106
110
  --k-radius-2xl: calc(1.5rem * var(--k-radius-factor));
107
111
  --k-radius-full: 9999px;
108
112
  --k-font-sans: "Vazirmatn", "Vazir", Tahoma, system-ui, sans-serif;
113
+ --k-font-display: var(--k-font-sans);
109
114
  --k-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, "Vazirmatn", monospace;
110
- --k-text-xs: 0.75rem;
111
- --k-text-sm: 0.875rem;
112
- --k-text-md: 0.9375rem;
113
- --k-text-lg: 1.0625rem;
114
- --k-text-xl: 1.25rem;
115
- --k-text-2xl: 1.5rem;
116
- --k-text-3xl: 1.875rem;
117
- --k-text-4xl: 2.25rem;
118
- --k-text-5xl: 3rem;
119
- --k-text-6xl: 3.75rem;
115
+ --k-text-xs: calc(0.75rem * var(--k-text-scale));
116
+ --k-text-sm: calc(0.875rem * var(--k-text-scale));
117
+ --k-text-md: calc(0.9375rem * var(--k-text-scale));
118
+ --k-text-lg: calc(1.0625rem * var(--k-text-scale));
119
+ --k-text-xl: calc(1.25rem * var(--k-text-scale));
120
+ --k-text-2xl: calc(1.5rem * var(--k-text-scale));
121
+ --k-text-3xl: calc(1.875rem * var(--k-text-scale));
122
+ --k-text-4xl: calc(2.25rem * var(--k-text-scale));
123
+ --k-text-5xl: calc(3rem * var(--k-text-scale));
124
+ --k-text-6xl: calc(3.75rem * var(--k-text-scale));
120
125
  --k-weight-light: 300;
121
126
  --k-weight-regular: 400;
122
127
  --k-weight-medium: 500;
@@ -149,11 +154,11 @@
149
154
  --k-bg-primary: var(--k-shab-1000);
150
155
  --k-bg-secondary: var(--k-shab-950);
151
156
  --k-bg-tertiary: var(--k-shab-900);
152
- --k-bg-elevated: var(--k-shab-900);
157
+ --k-bg-elevated: var(--k-shab-925);
153
158
  --k-bg-hover: rgb(255 255 255 / 0.05);
154
159
  --k-bg-active: rgb(255 255 255 / 0.08);
155
- --k-bg-brand: var(--k-brand-700);
156
- --k-bg-brand-hover: var(--k-brand-800);
160
+ --k-bg-brand: var(--k-brand-400);
161
+ --k-bg-brand-hover: var(--k-brand-300);
157
162
  --k-bg-brand-subtle: color-mix(in srgb, var(--k-brand-500) 14%, transparent);
158
163
  --k-bg-error: var(--k-anar-600);
159
164
  --k-bg-error-hover: var(--k-anar-700);
@@ -165,7 +170,8 @@
165
170
  --k-text-secondary: var(--k-shab-200);
166
171
  --k-text-tertiary: var(--k-shab-400);
167
172
  --k-text-quaternary: var(--k-shab-500);
168
- --k-text-on-brand: var(--k-shab-0);
173
+ --k-text-on-brand: var(--k-shab-1000);
174
+ --k-text-on-error: var(--k-shab-0);
169
175
  --k-text-brand: var(--k-brand-300);
170
176
  --k-text-error: var(--k-anar-400);
171
177
  --k-text-warning: var(--k-zafaran-400);
@@ -174,11 +180,18 @@
174
180
  --k-border-primary: var(--k-shab-700);
175
181
  --k-border-secondary: var(--k-shab-800);
176
182
  --k-border-brand: var(--k-brand-400);
177
- --k-border-input: var(--k-shab-500);
183
+ --k-border-input: var(--k-shab-550);
178
184
  --k-border-error: var(--k-anar-400);
179
185
  --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent);
180
186
  --k-ring-error: 0 0 0 4px rgb(248 59 71 / 0.28);
181
- --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(12 14 18 / 0.18), inset 0 -2px 0 rgb(12 14 18 / 0.05);
187
+ --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(0 0 0 / 0.2), inset 0 -2px 0 rgb(0 0 0 / 0.12);
188
+ --k-highlight: inset 0 1px 0 rgb(255 255 255 / 0.05);
189
+ --k-shadow-xs: 0 1px 2px rgb(0 0 0 / 0.4);
190
+ --k-shadow-sm: 0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px -1px rgb(0 0 0 / 0.4);
191
+ --k-shadow-md: 0 4px 8px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.35);
192
+ --k-shadow-lg: 0 12px 24px -4px rgb(0 0 0 / 0.55), 0 4px 8px -4px rgb(0 0 0 / 0.35);
193
+ --k-shadow-xl: 0 20px 32px -6px rgb(0 0 0 / 0.6), 0 8px 12px -6px rgb(0 0 0 / 0.4);
194
+ --k-shadow-2xl: 0 28px 56px -12px rgb(0 0 0 / 0.7);
182
195
  }
183
196
 
184
197
  [data-theme="light"] {
@@ -189,8 +202,8 @@
189
202
  --k-bg-elevated: var(--k-shab-0);
190
203
  --k-bg-hover: var(--k-shab-50);
191
204
  --k-bg-active: var(--k-shab-100);
192
- --k-bg-brand: var(--k-brand-700);
193
- --k-bg-brand-hover: var(--k-brand-800);
205
+ --k-bg-brand: var(--k-brand-600);
206
+ --k-bg-brand-hover: var(--k-brand-700);
194
207
  --k-bg-brand-subtle: var(--k-brand-50);
195
208
  --k-bg-error: var(--k-anar-600);
196
209
  --k-bg-error-hover: var(--k-anar-700);
@@ -203,6 +216,7 @@
203
216
  --k-text-tertiary: var(--k-shab-600);
204
217
  --k-text-quaternary: var(--k-shab-500);
205
218
  --k-text-on-brand: var(--k-shab-0);
219
+ --k-text-on-error: var(--k-shab-0);
206
220
  --k-text-brand: var(--k-brand-700);
207
221
  --k-text-error: var(--k-anar-700);
208
222
  --k-text-warning: var(--k-zafaran-700);
@@ -211,9 +225,16 @@
211
225
  --k-border-primary: var(--k-shab-300);
212
226
  --k-border-secondary: var(--k-shab-200);
213
227
  --k-border-brand: var(--k-brand-600);
214
- --k-border-input: var(--k-shab-500);
228
+ --k-border-input: var(--k-shab-450);
215
229
  --k-border-error: var(--k-anar-500);
216
230
  --k-ring-brand: 0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent);
217
231
  --k-ring-error: 0 0 0 4px rgb(229 29 42 / 0.2);
218
232
  --k-shadow-skeuomorphic: inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05);
233
+ --k-highlight: 0 0 #0000;
234
+ --k-shadow-xs: 0 1px 2px rgb(10 13 18 / 0.05);
235
+ --k-shadow-sm: 0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1);
236
+ --k-shadow-md: 0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06);
237
+ --k-shadow-lg: 0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03);
238
+ --k-shadow-xl: 0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03);
239
+ --k-shadow-2xl: 0 24px 48px -12px rgb(10 13 18 / 0.18);
219
240
  }
package/dist/tokens.js CHANGED
@@ -6,7 +6,7 @@ export const palette = {
6
6
  // فیروزه‌ای — رنگ اصلی برند
7
7
  firoozeh: {
8
8
  50: "#e6fbf8", 100: "#c2f4ee", 200: "#8ce9df", 300: "#4fd8cb", 400: "#22c2b4",
9
- 500: "#0fa89b", 600: "#08877e", 700: "#0a6b65", 800: "#0d5551", 900: "#0f4644", 950: "#042a29",
9
+ 500: "#0fa89b", 600: "#0b8077", 700: "#0a6b65", 800: "#0d5551", 900: "#0f4644", 950: "#042a29",
10
10
  },
11
11
  // لاجوردی — اطلاعات و لینک
12
12
  lajvard: {
@@ -29,10 +29,11 @@ export const palette = {
29
29
  500: "#6aae33", 600: "#518b25", 700: "#3f6a21", 800: "#35551f", 900: "#2e491e", 950: "#15270c",
30
30
  },
31
31
  // شب — خاکستری‌های کمی آبی برای پس‌زمینه و متن
32
+ // ۴۵۰ و ۵۵۰ کم‌رنگ‌ترین خاکستری‌هایی‌اند که هنوز کنتراست ۳:۱ حاشیهٔ فیلد را دارند (روشن و تیره)
32
33
  shab: {
33
34
  0: "#ffffff", 50: "#f6f7f9", 100: "#eceef2", 200: "#d5d9e2", 300: "#b1b9c9", 400: "#8792ab",
34
- 500: "#687491", 600: "#535d78", 700: "#444c62", 800: "#2a2f3d", 850: "#1e222c", 900: "#161921",
35
- 950: "#0d0f14", 1000: "#08090c",
35
+ 450: "#848fa7", 500: "#687491", 550: "#5a637a", 600: "#535d78", 700: "#444c62", 800: "#2a2f3d",
36
+ 850: "#1e222c", 900: "#161921", 925: "#111319", 950: "#0d0f14", 1000: "#08090c",
36
37
  },
37
38
  };
38
39
 
@@ -42,6 +43,8 @@ export const knobs = {
42
43
  "radius-factor": "1",
43
44
  // تراکم: 0.875 = فشرده (مثل Polaris)، 1 = عادی، 1.125 = جادار
44
45
  "density": "1",
46
+ // ضریب اندازهٔ همهٔ متن‌ها؛ برای فونت‌هایی که درشت‌تر یا ریزتر از وزیرمتن دیده می‌شوند
47
+ "text-scale": "1",
45
48
  };
46
49
 
47
50
  /** فاصله‌ها — مضرب ۴ پیکسل */
@@ -57,16 +60,20 @@ export const radius = {
57
60
  none: "0", sm: r(0.25), md: r(0.5), lg: r(0.75), xl: r(1), "2xl": r(1.5), full: "9999px",
58
61
  };
59
62
 
63
+ const t = (rem) => `calc(${rem}rem * var(--k-text-scale))`;
64
+
60
65
  export const font = {
61
66
  family: {
62
67
  sans: '"Vazirmatn", "Vazir", Tahoma, system-ui, sans-serif',
68
+ // فونت عنوان‌ها؛ پیش‌فرض همان فونت متن
69
+ display: "var(--k-font-sans)",
63
70
  // وزیرمتن به‌عنوان جایگزین تا متن فارسی داخل کد هم یکدست باشد
64
71
  mono: 'ui-monospace, "SF Mono", Menlo, Consolas, "Vazirmatn", monospace',
65
72
  },
66
73
  // متن فارسی در اندازه‌های یکسان کمی کوچک‌تر از لاتین دیده می‌شود؛ پایه ۱۵px است
67
74
  size: {
68
- xs: "0.75rem", sm: "0.875rem", md: "0.9375rem", lg: "1.0625rem", xl: "1.25rem",
69
- "2xl": "1.5rem", "3xl": "1.875rem", "4xl": "2.25rem", "5xl": "3rem", "6xl": "3.75rem",
75
+ xs: t(0.75), sm: t(0.875), md: t(0.9375), lg: t(1.0625), xl: t(1.25),
76
+ "2xl": t(1.5), "3xl": t(1.875), "4xl": t(2.25), "5xl": t(3), "6xl": t(3.75),
70
77
  },
71
78
  weight: { light: "300", regular: "400", medium: "500", semibold: "600", bold: "700", black: "900" },
72
79
  // حروف فارسی نقطه و دندانه دارند و به ارتفاع خط بیشتری نیاز دارند
@@ -101,11 +108,11 @@ export const themes = {
101
108
  "bg-primary": p("shab", 1000),
102
109
  "bg-secondary": p("shab", 950),
103
110
  "bg-tertiary": p("shab", 900),
104
- "bg-elevated": p("shab", 900),
111
+ "bg-elevated": p("shab", 925),
105
112
  "bg-hover": "rgb(255 255 255 / 0.05)",
106
113
  "bg-active": "rgb(255 255 255 / 0.08)",
107
- "bg-brand": p("brand", 700),
108
- "bg-brand-hover": p("brand", 800),
114
+ "bg-brand": p("brand", 400),
115
+ "bg-brand-hover": p("brand", 300),
109
116
  "bg-brand-subtle": "color-mix(in srgb, var(--k-brand-500) 14%, transparent)",
110
117
  "bg-error": p("anar", 600),
111
118
  "bg-error-hover": p("anar", 700),
@@ -118,7 +125,8 @@ export const themes = {
118
125
  "text-secondary": p("shab", 200),
119
126
  "text-tertiary": p("shab", 400),
120
127
  "text-quaternary": p("shab", 500),
121
- "text-on-brand": p("shab", 0),
128
+ "text-on-brand": p("shab", 1000),
129
+ "text-on-error": p("shab", 0),
122
130
  "text-brand": p("brand", 300),
123
131
  "text-error": p("anar", 400),
124
132
  "text-warning": p("zafaran", 400),
@@ -129,13 +137,22 @@ export const themes = {
129
137
  "border-secondary": p("shab", 800),
130
138
  "border-brand": p("brand", 400),
131
139
  // حاشیهٔ فیلدها، چک‌باکس و سوییچ خاموش — حداقل ۳:۱ (WCAG 1.4.11)
132
- "border-input": p("shab", 500),
140
+ "border-input": p("shab", 550),
133
141
  "border-error": p("anar", 400),
134
142
  // حلقهٔ فوکوس نرم و پهن (Untitled UI)
135
143
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent)",
136
144
  "ring-error": "0 0 0 4px rgb(248 59 71 / 0.28)",
137
145
  // سایهٔ اسکئومورفیک دکمه‌ها و فیلدها (Untitled UI)
138
- "shadow-skeuomorphic": "inset 0 0 0 1px rgb(12 14 18 / 0.18), inset 0 -2px 0 rgb(12 14 18 / 0.05)",
146
+ "shadow-skeuomorphic": "inset 0 0 0 1px rgb(0 0 0 / 0.2), inset 0 -2px 0 rgb(0 0 0 / 0.12)",
147
+ // خط روشن بالای سطوح برجسته در تم تیره؛ حس عمق می‌دهد
148
+ "highlight": "inset 0 1px 0 rgb(255 255 255 / 0.05)",
149
+ // سایه‌ها در تیره باید پررنگ‌تر باشند تا دیده شوند
150
+ "shadow-xs": "0 1px 2px rgb(0 0 0 / 0.4)",
151
+ "shadow-sm": "0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px -1px rgb(0 0 0 / 0.4)",
152
+ "shadow-md": "0 4px 8px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.35)",
153
+ "shadow-lg": "0 12px 24px -4px rgb(0 0 0 / 0.55), 0 4px 8px -4px rgb(0 0 0 / 0.35)",
154
+ "shadow-xl": "0 20px 32px -6px rgb(0 0 0 / 0.6), 0 8px 12px -6px rgb(0 0 0 / 0.4)",
155
+ "shadow-2xl": "0 28px 56px -12px rgb(0 0 0 / 0.7)",
139
156
  },
140
157
  light: {
141
158
  "bg-primary": p("shab", 0),
@@ -144,8 +161,8 @@ export const themes = {
144
161
  "bg-elevated": p("shab", 0),
145
162
  "bg-hover": p("shab", 50),
146
163
  "bg-active": p("shab", 100),
147
- "bg-brand": p("brand", 700),
148
- "bg-brand-hover": p("brand", 800),
164
+ "bg-brand": p("brand", 600),
165
+ "bg-brand-hover": p("brand", 700),
149
166
  "bg-brand-subtle": p("brand", 50),
150
167
  "bg-error": p("anar", 600),
151
168
  "bg-error-hover": p("anar", 700),
@@ -158,6 +175,7 @@ export const themes = {
158
175
  "text-tertiary": p("shab", 600),
159
176
  "text-quaternary": p("shab", 500),
160
177
  "text-on-brand": p("shab", 0),
178
+ "text-on-error": p("shab", 0),
161
179
  "text-brand": p("brand", 700),
162
180
  "text-error": p("anar", 700),
163
181
  "text-warning": p("zafaran", 700),
@@ -166,10 +184,18 @@ export const themes = {
166
184
  "border-primary": p("shab", 300),
167
185
  "border-secondary": p("shab", 200),
168
186
  "border-brand": p("brand", 600),
169
- "border-input": p("shab", 500),
187
+ "border-input": p("shab", 450),
170
188
  "border-error": p("anar", 500),
171
189
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent)",
172
190
  "ring-error": "0 0 0 4px rgb(229 29 42 / 0.2)",
173
191
  "shadow-skeuomorphic": "inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05)",
192
+ "highlight": "0 0 #0000",
193
+ // بازگرداندن سایه‌های روشن برای زیرشاخه‌هایی که داخل تم تیره روشن شده‌اند
194
+ "shadow-xs": "0 1px 2px rgb(10 13 18 / 0.05)",
195
+ "shadow-sm": "0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1)",
196
+ "shadow-md": "0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06)",
197
+ "shadow-lg": "0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03)",
198
+ "shadow-xl": "0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03)",
199
+ "shadow-2xl": "0 24px 48px -12px rgb(10 13 18 / 0.18)",
174
200
  },
175
201
  };
package/dist/tokens.json CHANGED
@@ -2,19 +2,20 @@
2
2
  "font": {
3
3
  "family": {
4
4
  "sans": "\"Vazirmatn\", \"Vazir\", Tahoma, system-ui, sans-serif",
5
+ "display": "var(--k-font-sans)",
5
6
  "mono": "ui-monospace, \"SF Mono\", Menlo, Consolas, \"Vazirmatn\", monospace"
6
7
  },
7
8
  "size": {
8
- "xs": "0.75rem",
9
- "sm": "0.875rem",
10
- "md": "0.9375rem",
11
- "lg": "1.0625rem",
12
- "xl": "1.25rem",
13
- "2xl": "1.5rem",
14
- "3xl": "1.875rem",
15
- "4xl": "2.25rem",
16
- "5xl": "3rem",
17
- "6xl": "3.75rem"
9
+ "xs": "calc(0.75rem * var(--k-text-scale))",
10
+ "sm": "calc(0.875rem * var(--k-text-scale))",
11
+ "md": "calc(0.9375rem * var(--k-text-scale))",
12
+ "lg": "calc(1.0625rem * var(--k-text-scale))",
13
+ "xl": "calc(1.25rem * var(--k-text-scale))",
14
+ "2xl": "calc(1.5rem * var(--k-text-scale))",
15
+ "3xl": "calc(1.875rem * var(--k-text-scale))",
16
+ "4xl": "calc(2.25rem * var(--k-text-scale))",
17
+ "5xl": "calc(3rem * var(--k-text-scale))",
18
+ "6xl": "calc(3.75rem * var(--k-text-scale))"
18
19
  },
19
20
  "weight": {
20
21
  "light": "300",
@@ -32,7 +33,8 @@
32
33
  },
33
34
  "knobs": {
34
35
  "radius-factor": "1",
35
- "density": "1"
36
+ "density": "1",
37
+ "text-scale": "1"
36
38
  },
37
39
  "motion": {
38
40
  "duration": {
@@ -53,7 +55,7 @@
53
55
  "300": "#4fd8cb",
54
56
  "400": "#22c2b4",
55
57
  "500": "#0fa89b",
56
- "600": "#08877e",
58
+ "600": "#0b8077",
57
59
  "700": "#0a6b65",
58
60
  "800": "#0d5551",
59
61
  "900": "#0f4644",
@@ -118,12 +120,15 @@
118
120
  "200": "#d5d9e2",
119
121
  "300": "#b1b9c9",
120
122
  "400": "#8792ab",
123
+ "450": "#848fa7",
121
124
  "500": "#687491",
125
+ "550": "#5a637a",
122
126
  "600": "#535d78",
123
127
  "700": "#444c62",
124
128
  "800": "#2a2f3d",
125
129
  "850": "#1e222c",
126
130
  "900": "#161921",
131
+ "925": "#111319",
127
132
  "950": "#0d0f14",
128
133
  "1000": "#08090c"
129
134
  }
@@ -168,11 +173,11 @@
168
173
  "bg-primary": "var(--k-shab-1000)",
169
174
  "bg-secondary": "var(--k-shab-950)",
170
175
  "bg-tertiary": "var(--k-shab-900)",
171
- "bg-elevated": "var(--k-shab-900)",
176
+ "bg-elevated": "var(--k-shab-925)",
172
177
  "bg-hover": "rgb(255 255 255 / 0.05)",
173
178
  "bg-active": "rgb(255 255 255 / 0.08)",
174
- "bg-brand": "var(--k-brand-700)",
175
- "bg-brand-hover": "var(--k-brand-800)",
179
+ "bg-brand": "var(--k-brand-400)",
180
+ "bg-brand-hover": "var(--k-brand-300)",
176
181
  "bg-brand-subtle": "color-mix(in srgb, var(--k-brand-500) 14%, transparent)",
177
182
  "bg-error": "var(--k-anar-600)",
178
183
  "bg-error-hover": "var(--k-anar-700)",
@@ -184,7 +189,8 @@
184
189
  "text-secondary": "var(--k-shab-200)",
185
190
  "text-tertiary": "var(--k-shab-400)",
186
191
  "text-quaternary": "var(--k-shab-500)",
187
- "text-on-brand": "var(--k-shab-0)",
192
+ "text-on-brand": "var(--k-shab-1000)",
193
+ "text-on-error": "var(--k-shab-0)",
188
194
  "text-brand": "var(--k-brand-300)",
189
195
  "text-error": "var(--k-anar-400)",
190
196
  "text-warning": "var(--k-zafaran-400)",
@@ -193,11 +199,18 @@
193
199
  "border-primary": "var(--k-shab-700)",
194
200
  "border-secondary": "var(--k-shab-800)",
195
201
  "border-brand": "var(--k-brand-400)",
196
- "border-input": "var(--k-shab-500)",
202
+ "border-input": "var(--k-shab-550)",
197
203
  "border-error": "var(--k-anar-400)",
198
204
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-400) 28%, transparent)",
199
205
  "ring-error": "0 0 0 4px rgb(248 59 71 / 0.28)",
200
- "shadow-skeuomorphic": "inset 0 0 0 1px rgb(12 14 18 / 0.18), inset 0 -2px 0 rgb(12 14 18 / 0.05)"
206
+ "shadow-skeuomorphic": "inset 0 0 0 1px rgb(0 0 0 / 0.2), inset 0 -2px 0 rgb(0 0 0 / 0.12)",
207
+ "highlight": "inset 0 1px 0 rgb(255 255 255 / 0.05)",
208
+ "shadow-xs": "0 1px 2px rgb(0 0 0 / 0.4)",
209
+ "shadow-sm": "0 1px 3px rgb(0 0 0 / 0.45), 0 1px 2px -1px rgb(0 0 0 / 0.4)",
210
+ "shadow-md": "0 4px 8px -2px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.35)",
211
+ "shadow-lg": "0 12px 24px -4px rgb(0 0 0 / 0.55), 0 4px 8px -4px rgb(0 0 0 / 0.35)",
212
+ "shadow-xl": "0 20px 32px -6px rgb(0 0 0 / 0.6), 0 8px 12px -6px rgb(0 0 0 / 0.4)",
213
+ "shadow-2xl": "0 28px 56px -12px rgb(0 0 0 / 0.7)"
201
214
  },
202
215
  "light": {
203
216
  "bg-primary": "var(--k-shab-0)",
@@ -206,8 +219,8 @@
206
219
  "bg-elevated": "var(--k-shab-0)",
207
220
  "bg-hover": "var(--k-shab-50)",
208
221
  "bg-active": "var(--k-shab-100)",
209
- "bg-brand": "var(--k-brand-700)",
210
- "bg-brand-hover": "var(--k-brand-800)",
222
+ "bg-brand": "var(--k-brand-600)",
223
+ "bg-brand-hover": "var(--k-brand-700)",
211
224
  "bg-brand-subtle": "var(--k-brand-50)",
212
225
  "bg-error": "var(--k-anar-600)",
213
226
  "bg-error-hover": "var(--k-anar-700)",
@@ -220,6 +233,7 @@
220
233
  "text-tertiary": "var(--k-shab-600)",
221
234
  "text-quaternary": "var(--k-shab-500)",
222
235
  "text-on-brand": "var(--k-shab-0)",
236
+ "text-on-error": "var(--k-shab-0)",
223
237
  "text-brand": "var(--k-brand-700)",
224
238
  "text-error": "var(--k-anar-700)",
225
239
  "text-warning": "var(--k-zafaran-700)",
@@ -228,11 +242,18 @@
228
242
  "border-primary": "var(--k-shab-300)",
229
243
  "border-secondary": "var(--k-shab-200)",
230
244
  "border-brand": "var(--k-brand-600)",
231
- "border-input": "var(--k-shab-500)",
245
+ "border-input": "var(--k-shab-450)",
232
246
  "border-error": "var(--k-anar-500)",
233
247
  "ring-brand": "0 0 0 4px color-mix(in srgb, var(--k-brand-500) 20%, transparent)",
234
248
  "ring-error": "0 0 0 4px rgb(229 29 42 / 0.2)",
235
- "shadow-skeuomorphic": "inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05)"
249
+ "shadow-skeuomorphic": "inset 0 0 0 1px rgb(10 13 18 / 0.18), inset 0 -2px 0 rgb(10 13 18 / 0.05)",
250
+ "highlight": "0 0 #0000",
251
+ "shadow-xs": "0 1px 2px rgb(10 13 18 / 0.05)",
252
+ "shadow-sm": "0 1px 3px rgb(10 13 18 / 0.1), 0 1px 2px -1px rgb(10 13 18 / 0.1)",
253
+ "shadow-md": "0 4px 6px -1px rgb(10 13 18 / 0.1), 0 2px 4px -2px rgb(10 13 18 / 0.06)",
254
+ "shadow-lg": "0 12px 16px -4px rgb(10 13 18 / 0.08), 0 4px 6px -2px rgb(10 13 18 / 0.03)",
255
+ "shadow-xl": "0 20px 24px -4px rgb(10 13 18 / 0.08), 0 8px 8px -4px rgb(10 13 18 / 0.03)",
256
+ "shadow-2xl": "0 24px 48px -12px rgb(10 13 18 / 0.18)"
236
257
  }
237
258
  },
238
259
  "zIndex": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kashi-ui/tokens",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "توکن‌های طراحی کاشی — رنگ، فاصله، فونت",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,7 +22,8 @@
22
22
  "*.css"
23
23
  ],
24
24
  "scripts": {
25
- "build": "node contrast.mjs && node build.mjs"
25
+ "build": "node contrast.mjs && node build.mjs",
26
+ "test": "node --test test/*.test.mjs"
26
27
  },
27
28
  "license": "MIT",
28
29
  "repository": {