@paolojulian.dev/design-system 4.3.0 → 4.4.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/theme.css CHANGED
@@ -1,12 +1,238 @@
1
1
  @theme {
2
- --color-black: #0d0d0d;
2
+ /* Legacy utility names kept for compatibility. Prefer semantic tokens below. */
3
+ --color-black: #111111;
3
4
  --color-white: #ffffff;
4
- --color-primary: #ce5a67;
5
- --color-secondary: #f4bf96;
6
- --color-gray-darker: #78716c;
7
- --color-gray: #a3a3a3;
8
- --color-gray-lighter: #e0e6ed;
5
+ --color-primary: #b63f4c;
6
+ --color-secondary: #d89062;
7
+ --color-gray-darker: #57534e;
8
+ --color-gray: #a8a29e;
9
+ --color-gray-lighter: #e7e5e4;
10
+
11
+ --color-background: var(--p-color-background);
12
+ --color-surface: var(--p-color-surface);
13
+ --color-surface-raised: var(--p-color-surface-raised);
14
+ --color-border: var(--p-color-border);
15
+ --color-border-strong: var(--p-color-border-strong);
16
+ --color-text: var(--p-color-text);
17
+ --color-text-muted: var(--p-color-text-muted);
18
+ --color-text-subtle: var(--p-color-text-subtle);
19
+ --color-primary-action: var(--p-color-action-primary);
20
+ --color-primary-action-hover: var(--p-color-action-primary-hover);
21
+ --color-danger: var(--p-color-danger);
22
+ --color-warning: var(--p-color-warning);
23
+ --color-success: var(--p-color-success);
24
+ --color-info: var(--p-color-info);
9
25
 
10
26
  --font-sans: 'AvantGarde', sans-serif;
11
27
  --font-serif: 'Lora', serif;
28
+
29
+ --breakpoint-xs: 30rem;
30
+ --breakpoint-sm: 40rem;
31
+ --breakpoint-md: 48rem;
32
+ --breakpoint-lg: 64rem;
33
+ --breakpoint-xl: 80rem;
34
+ --breakpoint-2xl: 96rem;
35
+ }
36
+
37
+ :root,
38
+ [data-theme='light'] {
39
+ color-scheme: light;
40
+
41
+ /* Base color tokens */
42
+ --p-color-neutral-0: #ffffff;
43
+ --p-color-neutral-50: #fafaf9;
44
+ --p-color-neutral-100: #f5f5f4;
45
+ --p-color-neutral-200: #e7e5e4;
46
+ --p-color-neutral-300: #d6d3d1;
47
+ --p-color-neutral-400: #a8a29e;
48
+ --p-color-neutral-500: #78716c;
49
+ --p-color-neutral-600: #57534e;
50
+ --p-color-neutral-700: #44403c;
51
+ --p-color-neutral-800: #292524;
52
+ --p-color-neutral-900: #1c1917;
53
+ --p-color-neutral-950: #111111;
54
+
55
+ --p-color-red-50: #fef2f2;
56
+ --p-color-red-100: #fee2e2;
57
+ --p-color-red-600: #dc2626;
58
+ --p-color-red-700: #b91c1c;
59
+ --p-color-amber-50: #fffbeb;
60
+ --p-color-amber-100: #fef3c7;
61
+ --p-color-amber-600: #d97706;
62
+ --p-color-green-50: #f0fdf4;
63
+ --p-color-green-100: #dcfce7;
64
+ --p-color-green-700: #15803d;
65
+ --p-color-blue-50: #eff6ff;
66
+ --p-color-blue-100: #dbeafe;
67
+ --p-color-blue-700: #1d4ed8;
68
+ --p-color-brand-50: #fdf2f3;
69
+ --p-color-brand-100: #f9dcdf;
70
+ --p-color-brand-600: #b63f4c;
71
+ --p-color-brand-700: #96313c;
72
+ --p-color-accent-600: #d89062;
73
+
74
+ /* Semantic color tokens */
75
+ --p-color-background: var(--p-color-neutral-50);
76
+ --p-color-surface: var(--p-color-neutral-0);
77
+ --p-color-surface-raised: var(--p-color-neutral-0);
78
+ --p-color-surface-subtle: var(--p-color-neutral-100);
79
+ --p-color-surface-inverse: var(--p-color-neutral-950);
80
+ --p-color-border: var(--p-color-neutral-300);
81
+ --p-color-border-subtle: var(--p-color-neutral-200);
82
+ --p-color-border-strong: var(--p-color-neutral-800);
83
+ --p-color-text: var(--p-color-neutral-950);
84
+ --p-color-text-muted: var(--p-color-neutral-600);
85
+ --p-color-text-subtle: var(--p-color-neutral-500);
86
+ --p-color-text-inverse: var(--p-color-neutral-0);
87
+ --p-color-action-primary: var(--p-color-brand-600);
88
+ --p-color-action-primary-hover: var(--p-color-brand-700);
89
+ --p-color-action-primary-subtle: var(--p-color-brand-50);
90
+ --p-color-focus: var(--p-color-brand-600);
91
+ --p-color-danger: var(--p-color-red-600);
92
+ --p-color-danger-hover: var(--p-color-red-700);
93
+ --p-color-danger-surface: var(--p-color-red-50);
94
+ --p-color-danger-border: var(--p-color-red-100);
95
+ --p-color-warning: var(--p-color-amber-600);
96
+ --p-color-warning-surface: var(--p-color-amber-50);
97
+ --p-color-warning-border: var(--p-color-amber-100);
98
+ --p-color-success: var(--p-color-green-700);
99
+ --p-color-success-surface: var(--p-color-green-50);
100
+ --p-color-success-border: var(--p-color-green-100);
101
+ --p-color-info: var(--p-color-blue-700);
102
+ --p-color-info-surface: var(--p-color-blue-50);
103
+ --p-color-info-border: var(--p-color-blue-100);
104
+
105
+ /* Typography tokens */
106
+ --p-font-family-sans: 'AvantGarde', sans-serif;
107
+ --p-font-family-serif: 'Lora', serif;
108
+ --p-font-weight-regular: 400;
109
+ --p-font-weight-medium: 500;
110
+ --p-font-weight-bold: 700;
111
+ --p-letter-spacing-default: 0;
112
+ --p-letter-spacing-wide: 0.40em;
113
+ --p-letter-spacing-heading: -0.04em;
114
+ --p-font-size-caption: 0.75rem;
115
+ --p-line-height-caption: 1rem;
116
+ --p-font-size-body-sm: 0.875rem;
117
+ --p-line-height-body-sm: 1.25rem;
118
+ --p-font-size-body-md: 1rem;
119
+ --p-line-height-body-md: 1.5rem;
120
+ --p-font-size-heading-sm: 1.25rem;
121
+ --p-line-height-heading-sm: 1.75rem;
122
+ --p-font-size-heading-md: 1.5rem;
123
+ --p-line-height-heading-md: 2rem;
124
+ --p-font-size-heading-md-desktop: 2.25rem;
125
+ --p-line-height-heading-md-desktop: 2.5rem;
126
+ --p-font-size-heading-lg: 2.5rem;
127
+ --p-line-height-heading-lg: 2.75rem;
128
+ --p-font-size-heading-xl: 4rem;
129
+ --p-line-height-heading-xl: 3.5rem;
130
+ --p-font-size-display-sm: 7rem;
131
+ --p-line-height-display-sm: 5.5rem;
132
+ --p-font-size-display-md: 4rem;
133
+ --p-line-height-display-md: 4.5rem;
134
+
135
+ /* Spacing tokens */
136
+ --p-space-0: 0;
137
+ --p-space-1: 0.25rem;
138
+ --p-space-2: 0.5rem;
139
+ --p-space-3: 0.75rem;
140
+ --p-space-4: 1rem;
141
+ --p-space-5: 1.25rem;
142
+ --p-space-6: 1.5rem;
143
+ --p-space-8: 2rem;
144
+ --p-space-10: 2.5rem;
145
+ --p-space-12: 3rem;
146
+ --p-space-16: 4rem;
147
+ --p-space-20: 5rem;
148
+ --p-space-24: 6rem;
149
+
150
+ /* Shape, sizing, focus, elevation, and motion tokens */
151
+ --p-radius-none: 0;
152
+ --p-radius-xs: 0.125rem;
153
+ --p-radius-sm: 0.25rem;
154
+ --p-radius-md: 0.375rem;
155
+ --p-radius-lg: 0.5rem;
156
+ --p-radius-full: 9999px;
157
+ --p-size-touch-min: 2.75rem;
158
+ --p-size-control-sm: 2.25rem;
159
+ --p-size-control-md: 2.75rem;
160
+ --p-size-control-lg: 3.5rem;
161
+ --p-focus-ring-width: 2px;
162
+ --p-focus-outline-width: 2px;
163
+ --p-focus-ring-offset: 2px;
164
+ --p-focus-ring-color: var(--p-color-focus);
165
+ --p-opacity-disabled: 0.5;
166
+ --p-shadow-sm: 0 1px 2px rgb(17 17 17 / 0.06);
167
+ --p-shadow-md: 0 8px 24px rgb(17 17 17 / 0.10);
168
+ --p-shadow-lg: 0 16px 40px rgb(17 17 17 / 0.14);
169
+ --p-duration-fast: 120ms;
170
+ --p-duration-normal: 180ms;
171
+ --p-duration-slow: 240ms;
172
+ --p-ease-standard: cubic-bezier(0.2, 0, 0, 1);
173
+
174
+ /* Component tokens */
175
+ --p-control-bg: var(--p-color-surface);
176
+ --p-control-bg-hover: var(--p-color-neutral-50);
177
+ --p-control-bg-focus: var(--p-color-surface);
178
+ --p-control-bg-readonly: var(--p-color-surface-subtle);
179
+ --p-control-text: var(--p-color-text);
180
+ --p-control-text-muted: var(--p-color-text-muted);
181
+ --p-control-border: var(--p-color-border-strong);
182
+ --p-control-border-hover: var(--p-color-border-strong);
183
+ --p-control-border-focus: var(--p-color-border-strong);
184
+ --p-control-border-error: var(--p-color-danger);
185
+ --p-control-ring: var(--p-focus-ring-color);
186
+ --p-control-radius: var(--p-radius-sm);
187
+ --p-control-font-size: var(--p-font-size-body-sm);
188
+ --p-control-line-height: var(--p-line-height-body-sm);
189
+ --p-control-message-font-size: var(--p-font-size-caption);
190
+ --p-control-message-line-height: var(--p-line-height-caption);
191
+ --p-control-border-width: 1px;
192
+ --p-control-padding-x: var(--p-space-4);
193
+ --p-control-padding-y: var(--p-space-3);
194
+ --p-control-message-margin-top: var(--p-space-1);
195
+ --p-size-icon-sm: 1rem;
196
+ --p-size-icon-md: 1.25rem;
197
+ --p-size-icon-lg: 1.5rem;
198
+ --p-control-transition: border-color var(--p-duration-fast) var(--p-ease-standard),
199
+ background-color var(--p-duration-fast) var(--p-ease-standard),
200
+ box-shadow var(--p-duration-fast) var(--p-ease-standard);
201
+ }
202
+
203
+ [data-theme='dark'] {
204
+ color-scheme: dark;
205
+
206
+ --p-color-background: var(--p-color-neutral-950);
207
+ --p-color-surface: var(--p-color-neutral-900);
208
+ --p-color-surface-raised: var(--p-color-neutral-800);
209
+ --p-color-surface-subtle: var(--p-color-neutral-800);
210
+ --p-color-surface-inverse: var(--p-color-neutral-0);
211
+ --p-color-border: var(--p-color-neutral-700);
212
+ --p-color-border-subtle: var(--p-color-neutral-800);
213
+ --p-color-border-strong: var(--p-color-neutral-300);
214
+ --p-color-text: var(--p-color-neutral-0);
215
+ --p-color-text-muted: var(--p-color-neutral-300);
216
+ --p-color-text-subtle: var(--p-color-neutral-400);
217
+ --p-color-text-inverse: var(--p-color-neutral-950);
218
+ --p-color-action-primary: #f07f8b;
219
+ --p-color-action-primary-hover: #f4a1aa;
220
+ --p-color-action-primary-subtle: rgb(240 127 139 / 0.14);
221
+ --p-color-focus: #f07f8b;
222
+ --p-color-danger: #f87171;
223
+ --p-color-danger-hover: #fca5a5;
224
+ --p-color-danger-surface: rgb(248 113 113 / 0.14);
225
+ --p-color-danger-border: rgb(248 113 113 / 0.28);
226
+ --p-color-warning: #fbbf24;
227
+ --p-color-warning-surface: rgb(251 191 36 / 0.14);
228
+ --p-color-warning-border: rgb(251 191 36 / 0.28);
229
+ --p-color-success: #4ade80;
230
+ --p-color-success-surface: rgb(74 222 128 / 0.14);
231
+ --p-color-success-border: rgb(74 222 128 / 0.28);
232
+ --p-color-info: #60a5fa;
233
+ --p-color-info-surface: rgb(96 165 250 / 0.14);
234
+ --p-color-info-border: rgb(96 165 250 / 0.28);
235
+ --p-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.32);
236
+ --p-shadow-md: 0 8px 24px rgb(0 0 0 / 0.36);
237
+ --p-shadow-lg: 0 16px 40px rgb(0 0 0 / 0.42);
12
238
  }
@@ -5,6 +5,11 @@ import path from "path";
5
5
  import tailwindcss from "@tailwindcss/vite";
6
6
  import { viteStaticCopy } from "vite-plugin-static-copy";
7
7
 
8
+ const copyBinaryAsset = {
9
+ encoding: "buffer" as const,
10
+ handler: (content: Buffer) => content,
11
+ };
12
+
8
13
  // https://vitejs.dev/config/
9
14
  export default defineConfig({
10
15
  plugins: [
@@ -12,46 +17,22 @@ export default defineConfig({
12
17
  viteStaticCopy({
13
18
  targets: [
14
19
  {
15
- src: path.resolve(
16
- __dirname,
17
- "src/assets/fonts/AvantGarde/AvantGarde.woff2",
18
- ),
20
+ src: path.resolve(__dirname, "src/assets/fonts/AvantGarde/*.woff2"),
19
21
  dest: "assets/fonts/AvantGarde",
22
+ transform: copyBinaryAsset,
20
23
  },
21
24
  {
22
25
  src: path.resolve(
23
26
  __dirname,
24
- "src/assets/fonts/AvantGarde/AvantGardeMedium.woff2",
25
- ),
26
- dest: "assets/fonts/AvantGarde",
27
- },
28
- {
29
- src: path.resolve(
30
- __dirname,
31
- "src/assets/fonts/ITC Avant Garde Gothic/ITC Avant Garde Gothic Medium.otf",
27
+ "src/assets/fonts/ITC Avant Garde Gothic/*.otf",
32
28
  ),
33
29
  dest: "assets/fonts/ITC Avant Garde Gothic",
30
+ transform: copyBinaryAsset,
34
31
  },
35
32
  {
36
- src: path.resolve(
37
- __dirname,
38
- "src/assets/fonts/ITC Avant Garde Gothic/ITC Avant Garde Gothic.otf",
39
- ),
40
- dest: "assets/fonts/ITC Avant Garde Gothic",
41
- },
42
- {
43
- src: path.resolve(
44
- __dirname,
45
- "src/assets/fonts/Merriweather/Merriweather-Bold.ttf",
46
- ),
47
- dest: "assets/fonts/Merriweather",
48
- },
49
- {
50
- src: path.resolve(
51
- __dirname,
52
- "src/assets/fonts/Merriweather/Merriweather-Regular.ttf",
53
- ),
33
+ src: path.resolve(__dirname, "src/assets/fonts/Merriweather/*.ttf"),
54
34
  dest: "assets/fonts/Merriweather",
35
+ transform: copyBinaryAsset,
55
36
  },
56
37
  {
57
38
  src: path.resolve(__dirname, "src/fonts.css"),
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@paolojulian.dev/design-system",
3
3
  "license": "MIT",
4
4
  "private": false,
5
- "version": "4.3.0",
5
+ "version": "4.4.0",
6
6
  "type": "module",
7
7
  "types": "dist/index.d.ts",
8
8
  "main": "dist/index.cjs.js",
@@ -51,6 +51,10 @@
51
51
  "lint": "eslint .",
52
52
  "preview": "vite preview",
53
53
  "storybook": "storybook dev -p 6006",
54
+ "test:ui": "playwright test",
55
+ "test:ui:build": "npm run build:storybook && playwright test",
56
+ "test:visual": "npm run build:storybook && chromatic --storybook-build-dir storybook-static --only-changed",
57
+ "test:visual:ci": "chromatic --storybook-build-dir storybook-static --only-changed --ci --exit-once-uploaded",
54
58
  "publish:pack": "yarn build && npm pack --pack-destination ./packed"
55
59
  },
56
60
  "peerDependencies": {
@@ -63,8 +67,10 @@
63
67
  "tailwind-merge": "^2.2.0"
64
68
  },
65
69
  "devDependencies": {
70
+ "@axe-core/playwright": "^4.11.3",
66
71
  "@chromatic-com/storybook": "^1.9.0",
67
72
  "@eslint/js": "^9.9.0",
73
+ "@playwright/test": "^1.59.1",
68
74
  "@storybook/addon-essentials": "^8.3.1",
69
75
  "@storybook/addon-interactions": "^8.3.1",
70
76
  "@storybook/addon-links": "^8.3.1",
@@ -73,10 +79,10 @@
73
79
  "@storybook/react": "^8.3.1",
74
80
  "@storybook/react-vite": "^8.3.1",
75
81
  "@storybook/test": "^8.3.1",
82
+ "@tailwindcss/vite": "^4.0.0",
76
83
  "@types/react": "^19.0.0",
77
84
  "@types/react-dom": "^19.0.0",
78
85
  "@vitejs/plugin-react": "^4.3.1",
79
- "@tailwindcss/vite": "^4.0.0",
80
86
  "eslint": "^9.9.0",
81
87
  "eslint-plugin-react-hooks": "^5.1.0-rc.0",
82
88
  "eslint-plugin-react-refresh": "^0.4.9",