ali-mohammadi-design-system 1.0.0 → 2.0.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.
@@ -1,258 +1,23 @@
1
- // /* Color styles */
2
- // --dashboard-karun-mall---success: rgba(240, 253, 244, 1);
3
- // --dashboard-karun-mall---primary--20: rgba(226, 232, 240, 1);
4
- // --dashboard-karun-mall---primary--100: rgba(237, 236, 252, 1);
5
- // --dashboard-karun-mall---primary--200: rgba(220, 218, 250, 1);
6
- // --dashboard-karun-mall---primary--300: rgba(202, 199, 247, 1);
7
- // --dashboard-karun-mall---primary--400: rgba(149, 144, 239, 1);
8
- // --dashboard-karun-mall---primary--500---main: rgba(79, 70, 229, 1);
9
- // --dashboard-karun-mall---primary--600: rgba(63, 56, 184, 1);
10
- // --dashboard-karun-mall---primary--700: rgba(48, 42, 139, 1);
11
- // --dashboard-karun-mall---primary--800: rgba(32, 28, 93, 1);
12
- // --dashboard-karun-mall---primary--900: rgba(17, 14, 48, 1);
13
- // --dashboard-karun-mall---primary--1000: rgba(9, 7, 26, 1);
14
- // --dashboard-karun-mall---neutral--50: rgba(250, 250, 250, 1);
15
- // --dashboard-karun-mall---neutral--100: rgba(245, 245, 245, 1);
16
- // --dashboard-karun-mall---neutral--200: rgba(229, 229, 229, 1);
17
- // --dashboard-karun-mall---neutral--300: rgba(212, 212, 212, 1);
18
- // --dashboard-karun-mall---neutral--400: rgba(163, 163, 163, 1);
19
- // --dashboard-karun-mall---neutral--500: rgba(115, 115, 115, 1);
20
- // --dashboard-karun-mall---neutral--600: rgba(82, 82, 91, 1);
21
- // --dashboard-karun-mall---neutral--700: rgba(64, 64, 64, 1);
22
- // --dashboard-karun-mall---neutral--800: rgba(38, 38, 38, 1);
23
- // --dashboard-karun-mall---neutral--900: rgba(23, 23, 23, 1);
24
- // --dastyar---main--500: rgba(65, 14, 88, 1);
25
- // --dastyar---main--400: rgba(81, 17, 110, 1);
26
- // --dastyar---main--300primery: rgba(109, 49, 137, 1);
27
- // --dastyar---main--200: rgba(223, 179, 243, 1);
28
- // --dastyar---main--100: rgba(245, 222, 255, 1);
29
- // --dastyar---main--50: rgba(250, 238, 255, 1);
30
- // --dastyar---main--25: rgba(249, 242, 253, 1);
31
- // --dastyar---primary--500: rgba(92, 18, 198, 1);
32
- // --dastyar---primary--400: rgba(115, 22, 246, 1);
33
- // --dastyar---primary--300: rgba(143, 69, 249, 1);
34
- // --dastyar---primary--200: rgba(217, 190, 255, 1);
35
- // --dastyar---primary--100: rgba(241, 232, 254, 1);
36
- // --dastyar---primary--50: rgba(247, 242, 255, 1);
37
- // --dastyar---text-color--500: rgba(17, 17, 17, 1);
38
- // --dastyar---text-color--400: rgba(62, 62, 62, 1);
39
- // --dastyar---text-color--300: rgba(146, 146, 146, 1);
40
- // --dastyar---text-color--200: rgba(189, 189, 189, 1);
41
- // --dastyar---text-color--100: rgba(231, 231, 231, 1);
42
- // --dastyar---text-color--50: rgba(255, 255, 255, 1);
43
- // --dastyar---border--50: rgba(245, 245, 245, 1);
44
- // --dastyar---border--100: rgba(225, 225, 225, 1);
45
- // --dastyar---border--200: rgba(220, 220, 220, 1);
46
- // --dastyar---border--300: rgba(181, 181, 181, 1);
47
- // --dastyar---background-color--100: rgba(255, 255, 255, 1);
48
- // --dastyar---background-color--200: rgba(251, 251, 251, 1);
49
- // --dastyar---background-color--300: rgba(245, 245, 245, 1);
50
- // --dastyar---background-color--400: rgba(247, 246, 248, 1);
51
- // --dastyar---background-color--500: rgba(233, 233, 233, 1);
52
- // --dastyar---status---very--good: rgba(8, 161, 87, 1);
53
- // --dastyar---status---good: rgba(181, 213, 86, 1);
54
- // --dastyar---status---average: rgba(246, 188, 36, 1);
55
- // --dastyar---status---bad: rgba(247, 155, 36, 1);
56
- // --dastyar---status---very--bad: rgba(239, 69, 49, 1);
57
- // --dastyar---status---success: rgba(16, 195, 120, 1);
58
- // --dastyar---status--info: rgba(46, 114, 255, 1);
59
- // --dastyar---status--warning: rgba(246, 188, 36, 1);
60
- // --dastyar---status---error: rgba(255, 51, 51, 1);
61
- // --dastyar---status---success--background: rgba(239, 255, 245, 1);
62
- // --dastyar---status--info--background: rgba(240, 245, 255, 1);
63
- // --dastyar---status--warning--background: rgba(255, 248, 233, 1);
64
- // --dastyar---status--error--background: rgba(255, 246, 246, 1);
65
- // --dastyar---blue--500: rgba(80, 70, 229, 1);
66
- // --dastyar---blue--400: rgba(20, 92, 240, 1);
67
- // --dastyar---blue--300: rgba(46, 114, 255, 1);
68
- // --dastyar---blue--200: rgba(180, 204, 255, 1);
69
- // --dastyar---blue--100: rgba(214, 228, 255, 1);
70
- // --dastyar---blue--50: rgba(240, 245, 255, 1);
71
- // --parisa---b-g-gray-_suppliar-dashboard: rgba(246, 246, 246, 1);
72
- // --parisa---green-new: rgba(61, 194, 145, 1);
73
- // --parisa--yellow-new: rgba(246, 188, 36, 1);
74
- // --parisa--new-red-parisa: rgba(255, 51, 51, 1);
75
- // --parisa---green2-new: rgba(15, 146, 98, 1);
76
- // --parisa---g-r-red-pdf: rgba(255, 237, 237, 1);
77
- // --white--12: rgba(255, 255, 255, 0.11999999731779099);
78
- // --white--12: rgba(255, 255, 255, 0.11999999731779099);
79
- // --karunpay-colors---neutral--1000: rgba(22, 24, 27, 1);
80
- // --karunpay-colors---neutral--900: rgba(27, 29, 33, 1);
81
- // --karunpay-colors---neutral--800: rgba(35, 37, 41, 1);
82
- // --karunpay-colors---neutral--700: rgba(42, 45, 51, 1);
83
- // --karunpay-colors---neutral--600: rgba(85, 87, 92, 1);
84
- // --karunpay-colors---neutral--500: rgba(127, 129, 133, 1);
85
- // --karunpay-colors---neutral--400: rgba(170, 171, 173, 1);
86
- // --karunpay-colors---neutral--300: rgba(212, 213, 214, 1);
87
- // --karunpay-colors---neutral--200: rgba(234, 234, 235, 1);
88
- // --karunpay-colors---neutral--100: rgba(244, 244, 245, 1);
89
- // --karunpay-colors---neutral--50: rgba(250, 250, 250, 1);
90
- // --karunpay-colors---neutral--white-0: rgba(255, 255, 255, 1);
91
- // --karunpay-colors---primary--600: rgba(0, 57, 173, 1);
92
- // --karunpay-colors---primary--500: rgba(0, 71, 216, 1);
93
- // --karunpay-colors---primary--400: rgba(51, 108, 224, 1);
94
- // --karunpay-colors---primary--300: rgba(75, 126, 230, 1);
95
- // --karunpay-colors---primary--200: rgba(153, 181, 239, 1);
96
- // --karunpay-colors---primary--100: rgba(215, 228, 255, 1);
97
- // --karunpay-colors---primary--50: rgba(241, 245, 253, 1);
98
- // --karunpay-colors---primary--25: rgba(250, 251, 255, 1);
99
- // --karunpay-colors---secondary--600: rgba(236, 173, 17, 1);
100
- // --karunpay-colors---secondary--500: rgba(246, 186, 36, 1);
101
- // --karunpay-colors---secondary--400: rgba(248, 200, 80, 1);
102
- // --karunpay-colors---secondary--300: rgba(250, 214, 124, 1);
103
- // --karunpay-colors---secondary--200: rgba(251, 227, 167, 1);
104
- // --karunpay-colors---secondary--100: rgba(255, 238, 196, 1);
105
- // --karunpay-colors---secondary--50: rgba(255, 247, 229, 1);
106
- // --karunpay-colors---warning--600: rgba(232, 132, 47, 1);
107
- // --karunpay-colors---warning--500: rgba(255, 145, 52, 1);
108
- // --karunpay-colors---warning--400: rgba(255, 167, 93, 1);
109
- // --karunpay-colors---warning--300: rgba(255, 181, 119, 1);
110
- // --karunpay-colors---warning--200: rgba(255, 204, 162, 1);
111
- // --karunpay-colors---warning--100: rgba(255, 221, 192, 1);
112
- // --karunpay-colors---errors--600: rgba(230, 73, 72, 1);
113
- // --karunpay-colors---errors--500: rgba(253, 80, 79, 1);
114
- // --karunpay-colors---errors--400: rgba(253, 115, 114, 1);
115
- // --karunpay-colors---errors--300: rgba(254, 138, 137, 1);
116
- // --karunpay-colors---errors--200: rgba(255, 195, 193, 1);
117
- // --karunpay-colors---errors--100: rgba(255, 220, 219, 1);
118
- // --karunpay-colors---success--600: rgba(39, 143, 84, 1);
119
- // --karunpay-colors---success--500: rgba(55, 201, 118, 1);
120
- // --karunpay-colors---success--400: rgba(95, 212, 145, 1);
121
- // --karunpay-colors---success--300: rgba(121, 219, 163, 1);
122
- // --karunpay-colors---success--200: rgba(193, 238, 213, 1);
123
- // --karunpay-colors---success--100: rgba(235, 250, 241, 1);
124
- // --brand---neutral--600: rgba(85, 87, 92, 1);
125
- // --brand---neutral--500: rgba(127, 129, 133, 1);
126
- // --brand---neutral--400: rgba(170, 171, 173, 1);
127
- // --brand---neutral--300: rgba(212, 213, 214, 1);
128
- // --brand---neutral--800: rgba(35, 37, 41, 1);
129
- // --brand---neutral--700: rgba(42, 45, 51, 1);
130
- // --brand---neutral--0: rgba(255, 255, 255, 1);
131
- // --brand---neutral--200: rgba(234, 234, 235, 1);
132
- // --brand---neutral--100: rgba(244, 244, 245, 1);
133
- // --brand---neutral--50: rgba(250, 250, 250, 1);
134
- // --brand---neutral--900: rgba(27, 29, 33, 1);
135
- // --brand---dastyar--900: rgba(52, 25, 64, 1);
136
- // --brand---dastyar--700: rgba(103, 50, 127, 1);
137
- // --brand---dastyar--600: rgba(129, 63, 159, 1);
138
- // --brand---dastyar--400: rgba(179, 140, 197, 1);
139
- // --brand---dastyar--300: rgba(217, 197, 226, 1);
140
- // --brand---dastyar--200: rgba(230, 217, 236, 1);
141
- // --brand---dastyar--500: rgba(154, 101, 178, 1);
142
- // --brand---dastyar--800: rgba(77, 38, 95, 1);
143
- // --brand---dastyar--100: rgba(249, 242, 253, 1);
144
- // --brand---seller--dashboard--900: rgba(25, 21, 71, 1);
145
- // --brand---seller--dashboard--700: rgba(80, 70, 229, 1);
146
- // --brand---seller--dashboard--600: rgba(115, 107, 234, 1);
147
- // --brand---seller--dashboard--400: rgba(185, 181, 245, 1);
148
- // --brand---seller--dashboard--300: rgba(202, 199, 247, 1);
149
- // --brand---seller--dashboard--200: rgba(220, 218, 250, 1);
150
- // --brand---seller--dashboard--500: rgba(150, 144, 239, 1);
151
- // --brand---seller--dashboard--800: rgba(64, 56, 184, 1);
152
- // --brand---seller--dashboard--100: rgba(237, 236, 252, 1);
153
- // --brand---seller--dashboard--900-2: rgba(17, 14, 48, 1);
154
- // --brand---karun--pay---primary--700: rgba(0, 71, 216, 1);
155
- // --brand---karun--pay---primary--600: rgba(51, 108, 224, 1);
156
- // --brand---karun--pay---primary--300: rgba(178, 200, 243, 1);
157
- // --brand---karun--pay---primary--900: rgba(0, 43, 130, 1);
158
- // --brand---karun--pay---primary--800: rgba(0, 57, 173, 1);
159
- // --brand---karun--pay---primary--500: rgba(102, 145, 232, 1);
160
- // --brand---karun--pay---primary--200: rgba(204, 218, 247, 1);
161
- // --brand---karun--pay---primary--400: rgba(153, 181, 239, 1);
162
- // --brand---karun--pay---primary--100: rgba(229, 237, 251, 1);
163
- // --brand---karun--pay---secondary--900: rgba(206, 150, 10, 1);
164
- // --brand---karun--pay---secondary--600: rgba(248, 200, 80, 1);
165
- // --brand---karun--pay---secondary--500: rgba(250, 214, 124, 1);
166
- // --brand---karun--pay---secondary--400: rgba(251, 227, 167, 1);
167
- // --brand---karun--pay---secondary--300: rgba(252, 234, 189, 1);
168
- // --brand---karun--pay---secondary--700: rgba(246, 186, 36, 1);
169
- // --brand---karun--pay---secondary--200: rgba(253, 241, 211, 1);
170
- // --brand---karun--pay---secondary--800: rgba(236, 173, 17, 1);
171
- // --brand---karun--pay---secondary--100: rgba(254, 248, 233, 1);
172
- // --brand---state---error--900: rgba(157, 31, 31, 1);
173
- // --brand---state---error--600: rgba(255, 92, 92, 1);
174
- // --brand---state---error--500: rgba(255, 133, 133, 1);
175
- // --brand---state---error--800: rgba(206, 41, 41, 1);
176
- // --brand---state---error--400: rgba(255, 194, 194, 1);
177
- // --brand---state---error--700: rgba(255, 51, 51, 1);
178
- // --brand---state---error--200: rgba(255, 173, 173, 1);
179
- // --brand---state---error--300: rgba(255, 214, 214, 1);
180
- // --brand---state---error--100: rgba(255, 235, 235, 1);
181
- // --brand---state---warning--900: rgba(223, 119, 30, 1);
182
- // --brand---state---warning--800: rgba(232, 132, 47, 1);
183
- // --brand---state---warning--600: rgba(255, 167, 93, 1);
184
- // --brand---state---warning--500: rgba(255, 189, 133, 1);
185
- // --brand---state---warning--400: rgba(255, 211, 174, 1);
186
- // --brand---state---warning--200: rgba(255, 233, 214, 1);
187
- // --brand---state---warning--700: rgba(255, 145, 52, 1);
188
- // --brand---state---warning--300: rgba(255, 222, 194, 1);
189
- // --brand---state---warning--100: rgba(255, 244, 235, 1);
190
- // --brand---state---success--900: rgba(22, 80, 47, 1);
191
- // --brand---state---success--800: rgba(33, 121, 71, 1);
192
- // --brand---state---success--600: rgba(95, 212, 145, 1);
193
- // --brand---state---success--500: rgba(95, 212, 145, 1);
194
- // --brand---state---success--400: rgba(135, 223, 173, 1);
195
- // --brand---state---success--200: rgba(215, 244, 228, 1);
196
- // --brand---state---success--700: rgba(44, 161, 94, 1);
197
- // --brand---state---success--300: rgba(175, 233, 200, 1);
198
- // --brand---state---success--100: rgba(235, 250, 241, 1);
199
- // --brand---state---info--800: rgba(11, 137, 214, 1);
200
- // --brand---state---info--700: rgba(29, 166, 251, 1);
201
- // --brand---state---info--300: rgba(196, 233, 255, 1);
202
- // --brand---state---info--400: rgba(160, 218, 255, 1);
203
- // --brand---state---info--900: rgba(4, 103, 164, 1);
204
- // --brand---state---info--200: rgba(220, 242, 255, 1);
205
- // --brand---state---info--600: rgba(86, 191, 255, 1);
206
- // --brand---state---info--500: rgba(135, 209, 255, 1);
207
- // --brand---state---info--100: rgba(232, 246, 255, 1);
1
+ import { generateTheme } from './generateTheme.js';
208
2
 
209
- // /* Text-size styles */
210
- // /* base size: typography---title--medium (16px) */
211
- // --typography---display--large: 2.25rem;
212
- // --typography---display--medium: 2rem;
213
- // --typography---display--small: 1.75rem;
214
- // --typography---headline--large: 2rem;
215
- // --typography---headline--medium: 1.75rem;
216
- // --typography---headline--small: 1.5rem;
217
- // --typography---title--large: 1.25rem;
218
- // --typography---title--medium: 1rem;
219
- // --typography---title--small: 0.88rem;
220
- // --typography---body--large: 1rem;
221
- // --typography---body--medium: 0.88rem;
222
- // --typography---body--small: 0.75rem;
223
- // --typography---label--large: 1rem;
224
- // --typography---label--medium: 0.88rem;
225
- // --typography---label--small: 0.63rem;
226
- // --old--style--typography---display---large-48: 3rem;
227
- // --old--style--typography---display---medium-36: 2.25rem;
228
- // --old--style--typography---display---small-36: 2.25rem;
229
- // --old--style--typography---headline---large-32: 2rem;
230
- // --old--style--typography---headline---mdium-28: 1.75rem;
231
- // --old--style--typography---headline---small-24: 1.5rem;
232
- // --old--style--typography---title---lag-24: 1.5rem;
233
- // --old--style--typography---title---medium-20: 1.25rem;
234
- // --old--style--typography---title---small-16: 1rem;
235
- // --old--style--typography---body---large-16: 1rem;
236
- // --old--style--typography---body---medium-14: 0.88rem;
237
- // --old--style--typography---body---small-12: 0.75rem;
238
- // --old--style--typography---label---large-14: 0.88rem;
239
- // --old--style--typography---label---medium-12: 0.75rem;
240
- // --old--style--typography---label---small-10: 0.63rem;
3
+ /**
4
+ * تزریق CSS variables به DOM
5
+ * این تابع یک wrapper ساده برای generateTheme است
6
+ *
7
+ * @param {Object} tokens - توکن‌های سفارشی
8
+ * @example
9
+ * ```js
10
+ * import { injectCSS } from 'ali-mohammadi-design-system';
11
+ *
12
+ * injectCSS({
13
+ * colors: {
14
+ * primary: { 500: '#6366f1' }
15
+ * }
16
+ * });
17
+ * ```
18
+ */
19
+ export function injectCSS(tokens = {}) {
20
+ generateTheme(tokens);
21
+ }
241
22
 
242
- // /* Effect styles */
243
- // --shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
244
- // --botton--shadow: 0px 6px 12px rgba(147, 147, 147, 0.25);
245
- // --acrd-shadow: 17px 7px 64px rgba(50, 59, 56, 0.07);
246
- // --effect: 16px 20px 90px rgba(28, 55, 112, 0.34);
247
- // --calc-shadow: 9px 8px 4px rgba(0, 0, 0, 0.05);
248
- // --buttonm: 4px 32px 90px rgba(13, 23, 41, 0.33);
249
- // --1: 0px -1px 10.800000190734863px rgba(204, 204, 204, 0.18);
250
- // --2: 17px 7px 64px rgba(50, 59, 56, 0.07);
251
- // --new-design-drop-shadow: 0px 4px 15px rgba(0, 0, 0, 0.05);
252
- // --sidebar-active-drop-shadow: 0px 4px 4px rgba(0, 0, 0, 0.05);
253
- // --background-blur-navigation: ;
254
- // --karunpay---effect---background-blur: ;
255
- // --elevation--1: 0px 1px 2px rgba(0, 0, 0, 0.25);
256
- // --elevation--2: 0px 2px 4px rgba(0, 0, 0, 0.2);
257
- // --elevation--3: 0px 3px 4px rgba(0, 0, 0, 0.2);
258
- // --elevation--4: 0px 3px 6px rgba(0, 0, 0, 0.2);
23
+ export default injectCSS;
@@ -0,0 +1,271 @@
1
+ import { defaultColors } from './colors.js';
2
+ import projectTokens from '../config/project-tokens.json' assert { type: 'json' };
3
+
4
+ /**
5
+ * تبدیل توکن‌های پروژه به فرمت استاندارد
6
+ */
7
+ function normalizeProjectTokens() {
8
+ const normalized = {
9
+ colors: {},
10
+ typography: {},
11
+ spacing: {},
12
+ radius: {},
13
+ shadows: {},
14
+ };
15
+
16
+ // تبدیل رنگ‌های brand
17
+ if (projectTokens.brand) {
18
+ Object.entries(projectTokens.brand).forEach(([colorName, shades]) => {
19
+ if (typeof shades === 'object' && !Array.isArray(shades)) {
20
+ const normalizedName = colorName.toLowerCase();
21
+ normalized.colors[normalizedName] = {};
22
+ Object.entries(shades).forEach(([shade, value]) => {
23
+ if (typeof value === 'string' || typeof value === 'number') {
24
+ normalized.colors[normalizedName][shade] = value;
25
+ }
26
+ });
27
+ }
28
+ });
29
+ }
30
+
31
+ // تبدیل TypeScale
32
+ if (projectTokens.brand?.TypeScale) {
33
+ const typeScale = projectTokens.brand.TypeScale;
34
+ normalized.typography = {
35
+ fontFamily: typeScale.FontFamily?.YekanBakh || 'system-ui, sans-serif',
36
+ sizes: typeScale.Size || {},
37
+ lineHeights: typeScale.Height || {},
38
+ weights: typeScale.Weight || {},
39
+ };
40
+ }
41
+
42
+ // تبدیل NumberScale
43
+ if (projectTokens.brand?.NumberScale) {
44
+ const numberScale = projectTokens.brand.NumberScale;
45
+
46
+ if (numberScale.Spacing) {
47
+ normalized.spacing = {};
48
+ Object.entries(numberScale.Spacing).forEach(([key, value]) => {
49
+ const spacingKey = key.replace('spacing-', '');
50
+ normalized.spacing[spacingKey] = typeof value === 'number' ? value : parseInt(value);
51
+ });
52
+ }
53
+
54
+ if (numberScale.Radius) {
55
+ normalized.radius = {};
56
+ Object.entries(numberScale.Radius).forEach(([key, value]) => {
57
+ const radiusKey = key.replace('Radius-', '').toLowerCase();
58
+ normalized.radius[radiusKey] = typeof value === 'number' ? value : parseInt(value);
59
+ });
60
+ }
61
+ }
62
+
63
+ return normalized;
64
+ }
65
+
66
+ /**
67
+ * توکن‌های پیش‌فرض
68
+ */
69
+ export const defaultTokens = {
70
+ colors: {
71
+ primary: {
72
+ 50: '#e3f2fd',
73
+ 100: '#bbdefb',
74
+ 200: '#90caf9',
75
+ 300: '#64b5f6',
76
+ 400: '#42a5f5',
77
+ 500: '#2196f3',
78
+ 600: '#1e88e5',
79
+ 700: '#1976d2',
80
+ 800: '#1565c0',
81
+ 900: '#0d47a1',
82
+ },
83
+ neutral: {
84
+ 0: '#FFFFFF',
85
+ 50: '#FAFAFA',
86
+ 100: '#F5F5F5',
87
+ 200: '#EEEEEE',
88
+ 300: '#E0E0E0',
89
+ 400: '#BDBDBD',
90
+ 500: '#9E9E9E',
91
+ 600: '#757575',
92
+ 700: '#616161',
93
+ 800: '#424242',
94
+ 900: '#212121',
95
+ },
96
+ success: {
97
+ 50: '#e8f5e9',
98
+ 100: '#c8e6c9',
99
+ 200: '#a5d6a7',
100
+ 300: '#81c784',
101
+ 400: '#66bb6a',
102
+ 500: '#4caf50',
103
+ 600: '#43a047',
104
+ 700: '#388e3c',
105
+ 800: '#2e7d32',
106
+ 900: '#1b5e20',
107
+ },
108
+ error: {
109
+ 50: '#ffebee',
110
+ 100: '#ffcdd2',
111
+ 200: '#ef9a9a',
112
+ 300: '#e57373',
113
+ 400: '#ef5350',
114
+ 500: '#f44336',
115
+ 600: '#e53935',
116
+ 700: '#d32f2f',
117
+ 800: '#c62828',
118
+ 900: '#b71c1c',
119
+ },
120
+ warning: {
121
+ 50: '#fff3e0',
122
+ 100: '#ffe0b2',
123
+ 200: '#ffcc80',
124
+ 300: '#ffb74d',
125
+ 400: '#ffa726',
126
+ 500: '#ff9800',
127
+ 600: '#fb8c00',
128
+ 700: '#f57c00',
129
+ 800: '#ef6c00',
130
+ 900: '#e65100',
131
+ },
132
+ info: {
133
+ 50: '#e3f2fd',
134
+ 100: '#bbdefb',
135
+ 200: '#90caf9',
136
+ 300: '#64b5f6',
137
+ 400: '#42a5f5',
138
+ 500: '#2196f3',
139
+ 600: '#1e88e5',
140
+ 700: '#1976d2',
141
+ 800: '#1565c0',
142
+ 900: '#0d47a1',
143
+ },
144
+ },
145
+ typography: {
146
+ fontFamily: 'system-ui, -apple-system, sans-serif',
147
+ baseSize: 16,
148
+ minSize: 14,
149
+ scaleRatio: 1.25,
150
+ sizes: {
151
+ 10: 10,
152
+ 11: 11,
153
+ 12: 12,
154
+ 14: 14,
155
+ 16: 16,
156
+ 18: 18,
157
+ 20: 20,
158
+ 24: 24,
159
+ 28: 28,
160
+ 32: 32,
161
+ 36: 36,
162
+ 48: 48,
163
+ 64: 64,
164
+ },
165
+ lineHeights: {
166
+ 10: 10,
167
+ 12: 12,
168
+ 14: 14,
169
+ 16: 16,
170
+ 20: 20,
171
+ 24: 24,
172
+ 28: 28,
173
+ 32: 32,
174
+ 36: 36,
175
+ 40: 40,
176
+ 44: 44,
177
+ 48: 48,
178
+ 74: 74,
179
+ },
180
+ weights: {
181
+ regular: '400',
182
+ semibold: '600',
183
+ bold: '700',
184
+ },
185
+ },
186
+ spacing: {
187
+ unit: 4,
188
+ 4: 4,
189
+ 8: 8,
190
+ 12: 12,
191
+ 16: 16,
192
+ 20: 20,
193
+ 24: 24,
194
+ 32: 32,
195
+ 40: 40,
196
+ 48: 48,
197
+ 56: 56,
198
+ 64: 64,
199
+ 72: 72,
200
+ 80: 80,
201
+ },
202
+ radius: {
203
+ xs: 4,
204
+ sm: 8,
205
+ md: 12,
206
+ lg: 16,
207
+ xl: 20,
208
+ '2xl': 24,
209
+ '3xl': 28,
210
+ full: 1000,
211
+ },
212
+ shadows: {
213
+ sm: '0px 1px 2px rgba(0, 0, 0, 0.05)',
214
+ md: '0px 4px 6px rgba(0, 0, 0, 0.1)',
215
+ lg: '0px 10px 15px rgba(0, 0, 0, 0.1)',
216
+ xl: '0px 20px 25px rgba(0, 0, 0, 0.1)',
217
+ },
218
+ };
219
+
220
+ /**
221
+ * Merge عمیق دو آبجکت
222
+ */
223
+ function deepMerge(target, source) {
224
+ const output = { ...target };
225
+
226
+ if (isObject(target) && isObject(source)) {
227
+ Object.keys(source).forEach((key) => {
228
+ if (isObject(source[key])) {
229
+ if (!(key in target)) {
230
+ Object.assign(output, { [key]: source[key] });
231
+ } else {
232
+ output[key] = deepMerge(target[key], source[key]);
233
+ }
234
+ } else {
235
+ Object.assign(output, { [key]: source[key] });
236
+ }
237
+ });
238
+ }
239
+
240
+ return output;
241
+ }
242
+
243
+ function isObject(item) {
244
+ return item && typeof item === 'object' && !Array.isArray(item);
245
+ }
246
+
247
+ /**
248
+ * دریافت توکن‌های نرمالایز شده از پروژه
249
+ */
250
+ const projectNormalizedTokens = normalizeProjectTokens();
251
+
252
+ /**
253
+ * Merge توکن‌های پروژه با پیش‌فرض
254
+ */
255
+ export const baseTokens = deepMerge(defaultTokens, projectNormalizedTokens);
256
+
257
+ /**
258
+ * ایجاد توکن‌های نهایی با merge کردن توکن‌های کاربر
259
+ * @param {Object} userTokens - توکن‌های سفارشی کاربر
260
+ * @returns {Object} توکن‌های نهایی
261
+ */
262
+ export function createTokens(userTokens = {}) {
263
+ return deepMerge(baseTokens, userTokens);
264
+ }
265
+
266
+ /**
267
+ * Export توکن‌های پیش‌فرض
268
+ */
269
+ export { defaultColors };
270
+ export default baseTokens;
271
+
@@ -0,0 +1,100 @@
1
+ import { useTheme } from '../theme/ThemeProvider.jsx';
2
+
3
+ /**
4
+ * Hook برای دسترسی راحت‌تر به توکن‌ها
5
+ *
6
+ * @example
7
+ * ```jsx
8
+ * import { useTokens } from 'ali-mohammadi-design-system';
9
+ *
10
+ * function MyComponent() {
11
+ * const { color, spacing, radius, typography } = useTokens();
12
+ * return <div style={{ color: color('primary.500'), padding: spacing(2) }}>Hello</div>;
13
+ * }
14
+ * ```
15
+ */
16
+ export function useTokens() {
17
+ const { tokens, getToken } = useTheme();
18
+
19
+ return {
20
+ /**
21
+ * دریافت رنگ
22
+ * @param {string} path - مسیر رنگ مثل 'primary.500' یا 'neutral.100'
23
+ * @returns {string} مقدار رنگ
24
+ */
25
+ color: (path) => {
26
+ const value = getToken(`colors.${path}`);
27
+ if (value) return value;
28
+ // اگر پیدا نشد، از CSS variable استفاده کن
29
+ const [group, shade] = path.split('.');
30
+ return `var(--${group}-${shade}, #000)`;
31
+ },
32
+
33
+ /**
34
+ * دریافت spacing
35
+ * @param {string|number} key - کلید spacing مثل '4' یا 'sm'
36
+ * @returns {string} مقدار spacing با واحد px
37
+ */
38
+ spacing: (key) => {
39
+ const value = getToken(`spacing.${key}`);
40
+ if (value) return `${value}px`;
41
+ // اگر پیدا نشد، از CSS variable استفاده کن
42
+ return `var(--space-${key}, ${key * (tokens.spacing?.unit || 4)}px)`;
43
+ },
44
+
45
+ /**
46
+ * دریافت radius
47
+ * @param {string} key - کلید radius مثل 'md' یا 'lg'
48
+ * @returns {string} مقدار radius با واحد px
49
+ */
50
+ radius: (key) => {
51
+ const value = getToken(`radius.${key}`);
52
+ if (value) return `${value}px`;
53
+ // اگر پیدا نشد، از CSS variable استفاده کن
54
+ return `var(--radius-${key}, 8px)`;
55
+ },
56
+
57
+ /**
58
+ * دریافت typography
59
+ * @param {string} property - ویژگی typography مثل 'fontFamily', 'sizes.16'
60
+ * @returns {string|number} مقدار typography
61
+ */
62
+ typography: (property) => {
63
+ const value = getToken(`typography.${property}`);
64
+ if (value) {
65
+ if (typeof value === 'number') return `${value}px`;
66
+ return value;
67
+ }
68
+ // اگر پیدا نشد، از CSS variable استفاده کن
69
+ if (property === 'fontFamily') {
70
+ return `var(--font-family, system-ui, sans-serif)`;
71
+ }
72
+ return `var(--font-${property}, 16px)`;
73
+ },
74
+
75
+ /**
76
+ * دریافت shadow
77
+ * @param {string} key - کلید shadow مثل 'sm' یا 'md'
78
+ * @returns {string} مقدار shadow
79
+ */
80
+ shadow: (key) => {
81
+ const value = getToken(`shadows.${key}`);
82
+ if (value) return value;
83
+ // اگر پیدا نشد، از CSS variable استفاده کن
84
+ return `var(--shadow-${key}, none)`;
85
+ },
86
+
87
+ /**
88
+ * دسترسی مستقیم به توکن‌ها
89
+ */
90
+ tokens,
91
+
92
+ /**
93
+ * دریافت توکن با مسیر دلخواه
94
+ */
95
+ getToken,
96
+ };
97
+ }
98
+
99
+ export default useTokens;
100
+