emily-css 1.0.26 → 1.0.27

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/CHANGELOG.md CHANGED
@@ -4,259 +4,277 @@ All notable changes to `emily-css` are documented here.
4
4
 
5
5
  ---
6
6
 
7
- ## v1.0.26 — May 2026
8
-
9
- **Expand utility coverage and typography scale**
10
-
11
- ### Added
12
- - Expand utility coverage and typography scale
13
-
14
- ---
15
- ## v1.0.26 — May 2026
16
-
17
- **Colour utilities now variable-based; fix grey text on dark surfaces**
18
-
19
- ### Fixed
20
- - `generateColourUtilities` now emits `var(--color-*)` references instead of hardcoded hex values for all `text-*`, `bg-*`, `border-*`, and `accent-*` utilities. Consistent with how semantic colours and ring/fill/stroke utilities already worked. Enables theme-layer overrides without specificity hacks.
21
- - Homepage "How it works" cards: `text-neutral-80` / `text-neutral-40` on `bg-dark` produced near-invisible text in light mode (contrast ~2.3:1). Fixed to `text-neutral-10` / `text-neutral-30` — matches the pattern used by the hero and CTA banner.
22
- - Removed erroneous backslash in `h-2\.5` HTML class strings in `index.vue` (rendered fine via Vue template compilation, but confusing and inconsistent).
23
- - Stripped null bytes from `pages/index.vue` (6) and `package.json` (339) in `emilyui-site`.
24
-
25
- ### Changed
26
- - `tests/test.js`: updated `accent-brand-80` assertion to expect `var(--color-brand-80)` rather than hardcoded hex, matching the new generation behaviour.
27
-
28
- ---
29
-
30
- ## v1.0.25 — May 2026
31
-
32
- **updaed colour**
33
-
34
- ### Fixed
35
- - change colour on code
36
-
37
- ---
38
- ## v1.0.24 — May 2026
7
+ ## v1.0.27 — May 2026
39
8
 
40
9
  **colour system redesign — brand/accent tokens + semantic colours (v1.0.23)**
41
10
 
42
11
  ### Added
43
12
  - colour system redesign — brand/accent tokens + semantic colours (v1.0.23)
44
13
 
45
- ---
46
- ## v1.0.23 — May 2026
47
-
48
- **Colour system redesign: brand/accent naming + semantic colour tokens**
49
-
50
- ### Changed
51
- - Renamed `primary` colour token to `brand`, `secondary` to `accent` across config, utilities, and showcase
52
- - `btn-primary` and `btn-secondary` are now explicit separate colour tokens (no longer aliases)
53
- - Default config generated by `emily-css init` updated to reflect new naming
54
-
55
- ### Added
56
- - `semanticColours` config key: single-value colour tokens with no shade scale
57
- - `generateSemanticColourUtilities()`: generates `bg-dark`, `text-dark`, `border-dark`, `fill-dark` etc.
58
- - Semantic colour utilities automatically pick up `hover:`, `focus:`, `dark:`, and responsive variants
59
- - Default config includes `dark: "#1A1A1A"` and `light: "#FAFAFA"` as semantic colour examples
60
-
61
- ---
62
-
63
- ## v1.0.22 — May 2026
64
-
65
- **· Improve purge extraction and package robustness tests**
66
-
67
- ---
68
- ## v1.0.21 — May 2026
69
-
70
- **"Include bundled showcase template**
71
-
72
- ---
73
- ## v1.0.20 — May 2026
74
-
75
- **replace folder structure template to tempalates**
76
-
77
- ### Fixed
78
- - replace folder structure template to tempalates
79
-
80
- ---
81
- ## v1.0.19 — May 2026
82
-
83
- **Add framework-aware output paths and bundled showcase template**
84
-
85
- ---
86
- ## v1.0.18 — May 2026
87
-
88
- ****
89
-
90
- ### Changed
91
- - added more utitlies as a code block
92
-
93
- ---
94
- ## v1.0.17 — May 2026
95
-
96
- **added new utilties, and added component patterns**
97
-
98
- ### Added
99
- - added new utilties, and added component patterns
100
-
101
- ---
102
- ## v1.0.16 — May 2026
103
-
104
- **feat: add Round 2 utility set — 156/156 tests passing**
105
-
106
- ### Added
107
- - feat: add Round 2 utility set — 156/156 tests passing
108
-
109
- ---
110
- ## v1.0.15 — May 2026
111
-
112
- **updated readme**
113
-
114
- ---
115
- ## v1.0.14 — May 2026
116
-
117
- **updated readme**
118
-
119
- ### Changed
120
- - updated readme
121
-
122
- ---
123
- ## v1.0.13 — May 2026
124
-
125
- **added functionality to commit to github and then push to npm release**
126
-
127
- ### Added
128
- - added functionality to commit to github and then push to npm release
129
-
130
- ---
131
- ## v1.0.12 — May 2026
132
-
133
- ****
134
-
135
- ---
136
- ## v1.0.11 — May 2026
137
-
138
- ****
139
-
140
- ---
141
- ## v1.0.10 — May 2026
142
-
143
- **Changelog automation**
144
-
145
- ### Added
146
- - Release script (`npm run release`) — reads git log, prompts for version bump, writes CHANGELOG.md, commits and tags automatically
147
-
148
- ---
149
-
150
- ## v1.0.9 — May 2026
151
-
152
- **Showcase server + code block utilities**
153
-
154
- ### Added
155
- - Showcase server — run `npm run emily:showcase` to browse components on localhost:3456
156
- - Code block utilities (`.code-window`, `.token-*`) in generated CSS — VSCode Dark+ style syntax highlighting
157
- - `pre`/`code` base styles added to `@layer base`
158
-
159
- ---
160
-
161
- ## v1.0.8 — May 2026
162
-
163
- **Watch mode + build pipeline**
164
-
165
- ### Added
166
- - Watch mode — `npx emily-css watch` rebuilds CSS automatically on config change
167
- - Build + purge can now be chained in a single pipeline
168
- - npm scripts wired into `package.json` during `npx emily-css init`
169
-
170
14
  ### Changed
171
- - `init.js` provides a more guided setup experience with clearer prompts
172
- - `bin/emilyui.js` updated to correctly route `watch`/`build`/`purge` subcommands
173
-
174
- ---
175
-
176
- ## v1.0.7 — April 2026
177
-
178
- **Purge regex fix**
179
-
180
- ### Fixed
181
- - Purge crashed when class names contained regex metacharacters (`[`, `]`, `(`, `)`, `{`, `}`, etc). Previously only `:` and `.` were escaped — now uses full metacharacter escaping
182
-
183
- ---
184
-
185
- ## v1.0.6 — April 2026
186
-
187
- **Dist + font cleanup**
188
-
189
- ### Changed
190
- - `dist/` and `fonts/` directories removed from git tracking
191
-
192
- ### Breaking changes
193
- - If you were pulling `dist/emily.css` directly from GitHub, run `npx emily-css build` locally instead
194
-
195
- ---
196
-
197
- ## v1.0.5 — April 2026
198
-
199
- **Split font system**
200
-
201
- ### Added
202
- - Separate heading and body font config — `fontFamily.heading` and `fontFamily.body` are now independent
203
- - Google Fonts CDN integration — fonts loaded via `@import` in generated CSS
204
- - Font-specific tests added to test suite
205
-
206
- ### Changed
207
- - Bundled font files removed from the npm package
208
- - `emily.config.json` updated with split `fontFamily` structure
209
-
210
- ### Breaking changes
211
- - If your config has `fontFamily` as a single string, update it to `{ "heading": "...", "body": "..." }`
212
-
213
- ---
214
-
215
- ## v1.0.3 — April 2026
216
-
217
- **Package size reduction**
218
-
219
- ### Changed
220
- - Demo CSS removed from the published npm package
221
-
222
- ---
223
-
224
- ## v1.0.2 — April 2026
225
-
226
- **Package distribution fix**
227
-
228
- ### Added
229
- - `.npmignore` added — controls which files are included in the published package
230
- - `dist` files explicitly declared in `package.json` `files` array
231
-
232
- ### Fixed
233
- - Unnecessary files (tests, src, docs) were being included in the npm tarball
234
-
235
- ---
236
-
237
- ## v1.0.1 — April 2026
238
-
239
- **CLI rename fix**
240
-
241
- ### Fixed
242
- - Internal references to old `emily-ui` CLI name updated to `emily-css`
243
-
244
- ### Breaking changes
245
- - If you had scripts referencing `npx emily-ui`, update them to `npx emily-css`
246
-
247
- ---
248
-
249
- ## v1.0.0 — April 2026
250
-
251
- **Initial release**
252
-
253
- ### Added
254
- - 11,844 utility classes generated from `emily.config.json`
255
- - OKLCH colour scale generation — one hex in, 10-shade scale out
256
- - Responsive variants (`sm:` `md:` `lg:` `xl:` `2xl:`)
257
- - State variants (`hover:` `focus-visible:` `active:` `disabled:` `dark:`)
258
- - Purge system — strips unused classes, ~97% file size reduction
259
- - Interactive setup wizard (`npx emily-css init`)
260
- - 72 tests, all passing
15
+ - updated utilties and new showcase
261
16
 
262
17
  ---
18
+ # Changelog
19
+
20
+ All notable changes to `emily-css` are documented here.
21
+
22
+ ---
23
+
24
+ ## v1.0.26 — May 2026
25
+
26
+ **Expand utility coverage and typography scale**
27
+
28
+ ### Added
29
+ - Expand utility coverage and typography scale
30
+
31
+ ---
32
+ ## v1.0.26 — May 2026
33
+
34
+ **Colour utilities now variable-based; fix grey text on dark surfaces**
35
+
36
+ ### Fixed
37
+ - `generateColourUtilities` now emits `var(--color-*)` references instead of hardcoded hex values for all `text-*`, `bg-*`, `border-*`, and `accent-*` utilities. Consistent with how semantic colours and ring/fill/stroke utilities already worked. Enables theme-layer overrides without specificity hacks.
38
+ - Homepage "How it works" cards: `text-neutral-80` / `text-neutral-40` on `bg-dark` produced near-invisible text in light mode (contrast ~2.3:1). Fixed to `text-neutral-10` / `text-neutral-30` — matches the pattern used by the hero and CTA banner.
39
+ - Removed erroneous backslash in `h-2\.5` HTML class strings in `index.vue` (rendered fine via Vue template compilation, but confusing and inconsistent).
40
+ - Stripped null bytes from `pages/index.vue` (6) and `package.json` (339) in `emilyui-site`.
41
+
42
+ ### Changed
43
+ - `tests/test.js`: updated `accent-brand-80` assertion to expect `var(--color-brand-80)` rather than hardcoded hex, matching the new generation behaviour.
44
+
45
+ ---
46
+
47
+ ## v1.0.25 — May 2026
48
+
49
+ **updaed colour**
50
+
51
+ ### Fixed
52
+ - change colour on code
53
+
54
+ ---
55
+ ## v1.0.24 — May 2026
56
+
57
+ **colour system redesign — brand/accent tokens + semantic colours (v1.0.23)**
58
+
59
+ ### Added
60
+ - colour system redesign — brand/accent tokens + semantic colours (v1.0.23)
61
+
62
+ ---
63
+ ## v1.0.23 — May 2026
64
+
65
+ **Colour system redesign: brand/accent naming + semantic colour tokens**
66
+
67
+ ### Changed
68
+ - Renamed `primary` colour token to `brand`, `secondary` to `accent` across config, utilities, and showcase
69
+ - `btn-primary` and `btn-secondary` are now explicit separate colour tokens (no longer aliases)
70
+ - Default config generated by `emily-css init` updated to reflect new naming
71
+
72
+ ### Added
73
+ - `semanticColours` config key: single-value colour tokens with no shade scale
74
+ - `generateSemanticColourUtilities()`: generates `bg-dark`, `text-dark`, `border-dark`, `fill-dark` etc.
75
+ - Semantic colour utilities automatically pick up `hover:`, `focus:`, `dark:`, and responsive variants
76
+ - Default config includes `dark: "#1A1A1A"` and `light: "#FAFAFA"` as semantic colour examples
77
+
78
+ ---
79
+
80
+
81
+ ## v1.0.22 — May 2026
82
+
83
+ **· Improve purge extraction and package robustness tests**
84
+
85
+ ---
86
+ ## v1.0.21 — May 2026
87
+
88
+ **"Include bundled showcase template**
89
+
90
+ ---
91
+ ## v1.0.20 — May 2026
92
+
93
+ **replace folder structure template to tempalates**
94
+
95
+ ### Fixed
96
+ - replace folder structure template to tempalates
97
+
98
+ ---
99
+ ## v1.0.19 — May 2026
100
+
101
+ **Add framework-aware output paths and bundled showcase template**
102
+
103
+ ---
104
+ ## v1.0.18 — May 2026
105
+
106
+ ****
107
+
108
+ ### Changed
109
+ - added more utitlies as a code block
110
+
111
+ ---
112
+ ## v1.0.17 — May 2026
113
+
114
+ **added new utilties, and added component patterns**
115
+
116
+ ### Added
117
+ - added new utilties, and added component patterns
118
+
119
+ ---
120
+ ## v1.0.16 — May 2026
121
+
122
+ **feat: add Round 2 utility set — 156/156 tests passing**
123
+
124
+ ### Added
125
+ - feat: add Round 2 utility set — 156/156 tests passing
126
+
127
+ ---
128
+ ## v1.0.15 — May 2026
129
+
130
+ **updated readme**
131
+
132
+ ---
133
+ ## v1.0.14 — May 2026
134
+
135
+ **updated readme**
136
+
137
+ ### Changed
138
+ - updated readme
139
+
140
+ ---
141
+ ## v1.0.13 — May 2026
142
+
143
+ **added functionality to commit to github and then push to npm release**
144
+
145
+ ### Added
146
+ - added functionality to commit to github and then push to npm release
147
+
148
+ ---
149
+ ## v1.0.12 — May 2026
150
+
151
+ ****
152
+
153
+ ---
154
+ ## v1.0.11 — May 2026
155
+
156
+ ****
157
+
158
+ ---
159
+ ## v1.0.10 — May 2026
160
+
161
+ **Changelog automation**
162
+
163
+ ### Added
164
+ - Release script (`npm run release`) — reads git log, prompts for version bump, writes CHANGELOG.md, commits and tags automatically
165
+
166
+ ---
167
+
168
+ ## v1.0.9 — May 2026
169
+
170
+ **Showcase server + code block utilities**
171
+
172
+ ### Added
173
+ - Showcase server — run `npm run emily:showcase` to browse components on localhost:3456
174
+ - Code block utilities (`.code-window`, `.token-*`) in generated CSS — VSCode Dark+ style syntax highlighting
175
+ - `pre`/`code` base styles added to `@layer base`
176
+
177
+ ---
178
+
179
+ ## v1.0.8 — May 2026
180
+
181
+ **Watch mode + build pipeline**
182
+
183
+ ### Added
184
+ - Watch mode — `npx emily-css watch` rebuilds CSS automatically on config change
185
+ - Build + purge can now be chained in a single pipeline
186
+ - npm scripts wired into `package.json` during `npx emily-css init`
187
+
188
+ ### Changed
189
+ - `init.js` provides a more guided setup experience with clearer prompts
190
+ - `bin/emilyui.js` updated to correctly route `watch`/`build`/`purge` subcommands
191
+
192
+ ---
193
+
194
+ ## v1.0.7 — April 2026
195
+
196
+ **Purge regex fix**
197
+
198
+ ### Fixed
199
+ - Purge crashed when class names contained regex metacharacters (`[`, `]`, `(`, `)`, `{`, `}`, etc). Previously only `:` and `.` were escaped — now uses full metacharacter escaping
200
+
201
+ ---
202
+
203
+ ## v1.0.6 — April 2026
204
+
205
+ **Dist + font cleanup**
206
+
207
+ ### Changed
208
+ - `dist/` and `fonts/` directories removed from git tracking
209
+
210
+ ### Breaking changes
211
+ - If you were pulling `dist/emily.css` directly from GitHub, run `npx emily-css build` locally instead
212
+
213
+ ---
214
+
215
+ ## v1.0.5 — April 2026
216
+
217
+ **Split font system**
218
+
219
+ ### Added
220
+ - Separate heading and body font config — `fontFamily.heading` and `fontFamily.body` are now independent
221
+ - Google Fonts CDN integration — fonts loaded via `@import` in generated CSS
222
+ - Font-specific tests added to test suite
223
+
224
+ ### Changed
225
+ - Bundled font files removed from the npm package
226
+ - `emily.config.json` updated with split `fontFamily` structure
227
+
228
+ ### Breaking changes
229
+ - If your config has `fontFamily` as a single string, update it to `{ "heading": "...", "body": "..." }`
230
+
231
+ ---
232
+
233
+ ## v1.0.3 — April 2026
234
+
235
+ **Package size reduction**
236
+
237
+ ### Changed
238
+ - Demo CSS removed from the published npm package
239
+
240
+ ---
241
+
242
+ ## v1.0.2 — April 2026
243
+
244
+ **Package distribution fix**
245
+
246
+ ### Added
247
+ - `.npmignore` added — controls which files are included in the published package
248
+ - `dist` files explicitly declared in `package.json` `files` array
249
+
250
+ ### Fixed
251
+ - Unnecessary files (tests, src, docs) were being included in the npm tarball
252
+
253
+ ---
254
+
255
+ ## v1.0.1 — April 2026
256
+
257
+ **CLI rename fix**
258
+
259
+ ### Fixed
260
+ - Internal references to old `emily-ui` CLI name updated to `emily-css`
261
+
262
+ ### Breaking changes
263
+ - If you had scripts referencing `npx emily-ui`, update them to `npx emily-css`
264
+
265
+ ---
266
+
267
+ ## v1.0.0 — April 2026
268
+
269
+ **Initial release**
270
+
271
+ ### Added
272
+ - 11,844 utility classes generated from `emily.config.json`
273
+ - OKLCH colour scale generation — one hex in, 10-shade scale out
274
+ - Responsive variants (`sm:` `md:` `lg:` `xl:` `2xl:`)
275
+ - State variants (`hover:` `focus-visible:` `active:` `disabled:` `dark:`)
276
+ - Purge system — strips unused classes, ~97% file size reduction
277
+ - Interactive setup wizard (`npx emily-css init`)
278
+ - 72 tests, all passing
279
+
280
+ ---
package/package.json CHANGED
@@ -1,59 +1,59 @@
1
- {
2
- "name": "emily-css",
3
- "version": "1.0.26",
4
- "description": "A config-driven utility CSS framework. Define your brand once, generate the CSS.",
5
- "main": "src/index.js",
6
- "bin": {
7
- "emily-css": "bin/emilyui.js"
8
- },
9
- "files": [
10
- "bin/",
11
- "src/",
12
- "templates/",
13
- "README.md",
14
- "LICENSE",
15
- "CHANGELOG.md"
16
- ],
17
- "scripts": {
18
- "build": "node src/index.js",
19
- "dev": "nodemon src/index.js",
20
- "dev:full": "nodemon src/index.js -- --keep-full",
21
- "init": "node src/init.js",
22
- "test": "node tests/test.js",
23
- "emily:showcase": "node src/showcase.js",
24
- "commit": "node scripts/commit.js",
25
- "release": "node scripts/release.js",
26
- "ship": "node scripts/ship.js",
27
- "emily:build": "emily-css build",
28
- "emily:watch": "emily-css watch",
29
- "emily:help": "emily-css help"
30
- },
31
- "keywords": [
32
- "css",
33
- "design-system",
34
- "components",
35
- "config-driven",
36
- "utility-css",
37
- "accessibility",
38
- "drupal",
39
- "legacy",
40
- "no-build-step"
41
- ],
42
- "author": "Andy Terry",
43
- "license": "MIT",
44
- "engines": {
45
- "node": ">=16.0.0"
46
- },
47
- "devDependencies": {
48
- "nodemon": "^3.0.0"
49
- },
50
- "dependencies": {
51
- "boxen": "^5.1.2",
52
- "chalk": "^4.1.2",
53
- "chokidar": "^5.0.0",
54
- "cross-spawn": "^7.0.6",
55
- "enquirer": "^2.4.1",
56
- "fast-glob": "^3.3.3",
57
- "ora": "^5.4.1"
58
- }
59
- }
1
+ {
2
+ "name": "emily-css",
3
+ "version": "1.0.27",
4
+ "description": "A config-driven utility CSS framework. Define your brand once, generate the CSS.",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "emily-css": "bin/emilyui.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "templates/",
13
+ "README.md",
14
+ "LICENSE",
15
+ "CHANGELOG.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "node src/index.js",
19
+ "dev": "nodemon src/index.js",
20
+ "dev:full": "nodemon src/index.js -- --keep-full",
21
+ "init": "node src/init.js",
22
+ "test": "node tests/test.js",
23
+ "emily:showcase": "node src/showcase.js",
24
+ "commit": "node scripts/commit.js",
25
+ "release": "node scripts/release.js",
26
+ "ship": "node scripts/ship.js",
27
+ "emily:build": "emily-css build",
28
+ "emily:watch": "emily-css watch",
29
+ "emily:help": "emily-css help"
30
+ },
31
+ "keywords": [
32
+ "css",
33
+ "design-system",
34
+ "components",
35
+ "config-driven",
36
+ "utility-css",
37
+ "accessibility",
38
+ "drupal",
39
+ "legacy",
40
+ "no-build-step"
41
+ ],
42
+ "author": "Andy Terry",
43
+ "license": "MIT",
44
+ "engines": {
45
+ "node": ">=16.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "nodemon": "^3.0.0"
49
+ },
50
+ "dependencies": {
51
+ "boxen": "^5.1.2",
52
+ "chalk": "^4.1.2",
53
+ "chokidar": "^5.0.0",
54
+ "cross-spawn": "^7.0.6",
55
+ "enquirer": "^2.4.1",
56
+ "fast-glob": "^3.3.3",
57
+ "ora": "^5.4.1"
58
+ }
59
+ }
package/src/index.js CHANGED
@@ -999,6 +999,330 @@ function generatePatternComponents() {
999
999
  gap: var(--space-4, 1rem);
1000
1000
  align-items: center;
1001
1001
  }
1002
+
1003
+ /* ---- Layout ---- */
1004
+
1005
+ /* Constrained width container — 1100px max, full-width on small screens */
1006
+ .width-container {
1007
+ width: 100%;
1008
+ max-width: 1100px;
1009
+ margin-inline: auto;
1010
+ padding-inline: var(--space-4, 1rem);
1011
+ }
1012
+
1013
+ @media (min-width: 640px) {
1014
+ .width-container {
1015
+ padding-inline: var(--space-6, 1.5rem);
1016
+ }
1017
+ }
1018
+
1019
+ @media (min-width: 1024px) {
1020
+ .width-container {
1021
+ padding-inline: var(--space-8, 2rem);
1022
+ }
1023
+ }
1024
+
1025
+ @media (min-width: 1140px) {
1026
+ .width-container {
1027
+ padding-inline: 0;
1028
+ }
1029
+ }
1030
+
1031
+ /* ---- Forms ---- */
1032
+
1033
+ .field-container {
1034
+ display: flex;
1035
+ flex-direction: column;
1036
+ gap: var(--space-2, 0.5rem);
1037
+ margin-bottom: var(--space-6, 1.5rem);
1038
+ }
1039
+
1040
+ .field-container label {
1041
+ display: block;
1042
+ font-weight: var(--font-weight-semibold, 600);
1043
+ color: var(--color-neutral-90);
1044
+ font-size: var(--text-base, 16px);
1045
+ line-height: 1.4;
1046
+ margin-bottom: var(--space-1, 0.25rem);
1047
+ }
1048
+
1049
+ fieldset {
1050
+ border: none;
1051
+ padding: 0;
1052
+ margin: 0 0 var(--space-6, 1.5rem);
1053
+ }
1054
+
1055
+ fieldset legend {
1056
+ display: block;
1057
+ font-size: var(--text-lg, 18px);
1058
+ font-weight: var(--font-weight-semibold, 600);
1059
+ margin-bottom: var(--space-3, 0.75rem);
1060
+ color: var(--color-neutral-90);
1061
+ padding: 0;
1062
+ }
1063
+
1064
+ .form-hint {
1065
+ font-size: var(--text-sm, 14px);
1066
+ color: var(--color-neutral-60);
1067
+ margin-bottom: var(--space-1, 0.25rem);
1068
+ }
1069
+
1070
+ input[type="text"],
1071
+ input[type="email"],
1072
+ input[type="password"],
1073
+ input[type="number"],
1074
+ input[type="tel"],
1075
+ input[type="url"],
1076
+ input[type="search"],
1077
+ input[type="date"],
1078
+ select,
1079
+ textarea {
1080
+ width: 100%;
1081
+ max-width: 100%;
1082
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1083
+ border: 2px solid var(--color-neutral-30);
1084
+ border-radius: 8px;
1085
+ background-color: #ffffff;
1086
+ color: var(--color-neutral-90);
1087
+ font-family: inherit;
1088
+ font-size: var(--text-base, 16px);
1089
+ line-height: var(--leading-base, 1.6);
1090
+ appearance: none;
1091
+ transition: border-color 200ms ease, box-shadow 200ms ease;
1092
+ }
1093
+
1094
+ select {
1095
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
1096
+ background-position: right var(--space-2, 0.5rem) center;
1097
+ background-repeat: no-repeat;
1098
+ background-size: 1.5em 1.5em;
1099
+ padding-right: var(--space-10, 2.5rem);
1100
+ cursor: pointer;
1101
+ }
1102
+
1103
+ textarea {
1104
+ min-height: 120px;
1105
+ resize: vertical;
1106
+ }
1107
+
1108
+ input[type="text"]:focus,
1109
+ input[type="email"]:focus,
1110
+ input[type="password"]:focus,
1111
+ input[type="number"]:focus,
1112
+ input[type="tel"]:focus,
1113
+ input[type="url"]:focus,
1114
+ input[type="search"]:focus,
1115
+ input[type="date"]:focus,
1116
+ select:focus,
1117
+ textarea:focus {
1118
+ outline: 2px solid var(--color-neutral-80);
1119
+ outline-offset: 3px;
1120
+ border-color: var(--color-neutral-80);
1121
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1122
+ }
1123
+
1124
+ .checkbox-group,
1125
+ .radio-group {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ gap: var(--space-3, 0.75rem);
1129
+ margin-bottom: var(--space-4, 1rem);
1130
+ }
1131
+
1132
+ .checkbox-group label,
1133
+ .radio-group label {
1134
+ font-weight: var(--font-weight-normal, 400);
1135
+ margin-bottom: 0;
1136
+ cursor: pointer;
1137
+ font-size: var(--text-base, 16px);
1138
+ }
1139
+
1140
+ input[type="checkbox"] {
1141
+ width: 1.5rem;
1142
+ height: 1.5rem;
1143
+ margin: 0;
1144
+ cursor: pointer;
1145
+ accent-color: var(--color-brand-80);
1146
+ flex-shrink: 0;
1147
+ }
1148
+
1149
+ input[type="checkbox"]:focus {
1150
+ outline: 2px solid var(--color-neutral-80);
1151
+ outline-offset: 3px;
1152
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1153
+ }
1154
+
1155
+ input[type="radio"] {
1156
+ width: 1.5rem;
1157
+ height: 1.5rem;
1158
+ margin: 0;
1159
+ border-radius: 50%;
1160
+ appearance: none;
1161
+ background-color: #ffffff;
1162
+ border: 2px solid var(--color-neutral-30);
1163
+ display: grid;
1164
+ place-content: center;
1165
+ cursor: pointer;
1166
+ flex-shrink: 0;
1167
+ transition: background-color 200ms ease, border-color 200ms ease;
1168
+ }
1169
+
1170
+ input[type="radio"]::before {
1171
+ content: "";
1172
+ width: 0.75rem;
1173
+ height: 0.75rem;
1174
+ border-radius: 50%;
1175
+ transform: scale(0);
1176
+ transition: 120ms transform ease-in-out;
1177
+ background-color: var(--color-brand-80);
1178
+ }
1179
+
1180
+ input[type="radio"]:checked {
1181
+ border-color: var(--color-brand-80);
1182
+ }
1183
+
1184
+ input[type="radio"]:checked::before {
1185
+ transform: scale(1);
1186
+ }
1187
+
1188
+ input[type="radio"]:hover {
1189
+ background-color: var(--color-brand-10);
1190
+ border-color: var(--color-brand-80);
1191
+ }
1192
+
1193
+ input[type="radio"]:focus {
1194
+ outline: 2px solid var(--color-neutral-80);
1195
+ outline-offset: 3px;
1196
+ border-radius: 50%;
1197
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1198
+ }
1199
+
1200
+ input[aria-invalid="true"] {
1201
+ border-color: var(--color-error-80) !important;
1202
+ border-width: 3px;
1203
+ }
1204
+
1205
+ .form-error-message {
1206
+ font-size: var(--text-sm, 14px);
1207
+ font-weight: var(--font-weight-bold, 700);
1208
+ color: var(--color-error-80);
1209
+ margin-top: var(--space-1, 0.25rem);
1210
+ display: block;
1211
+ }
1212
+
1213
+ .error-summary {
1214
+ border: 4px solid var(--color-error-80);
1215
+ padding: var(--space-6, 1.5rem);
1216
+ margin-bottom: var(--space-8, 2rem);
1217
+ border-radius: 8px;
1218
+ }
1219
+
1220
+ .error-summary ul {
1221
+ list-style: disc;
1222
+ padding-left: var(--space-5, 1.25rem);
1223
+ }
1224
+
1225
+ .error-summary a {
1226
+ color: var(--color-error-80);
1227
+ }
1228
+
1229
+ /* ---- Buttons ---- */
1230
+
1231
+ .btn {
1232
+ display: inline-flex;
1233
+ align-items: center;
1234
+ justify-content: center;
1235
+ padding: var(--space-3, 0.75rem) var(--space-6, 1.5rem);
1236
+ font-weight: var(--font-weight-semibold, 600);
1237
+ border-radius: 8px;
1238
+ cursor: pointer;
1239
+ transition: background-color 200ms ease, border-color 200ms ease, color 200ms ease;
1240
+ border: 2px solid transparent;
1241
+ text-align: center;
1242
+ min-height: 3rem;
1243
+ font-size: var(--text-base, 16px);
1244
+ text-decoration: none;
1245
+ font-family: inherit;
1246
+ line-height: 1;
1247
+ }
1248
+
1249
+ .btn-primary {
1250
+ background-color: var(--color-brand-80);
1251
+ color: #ffffff;
1252
+ border-color: transparent;
1253
+ }
1254
+
1255
+ .btn-primary:hover {
1256
+ background-color: var(--color-brand-90);
1257
+ }
1258
+
1259
+ .btn-primary:focus-visible {
1260
+ outline: 2px solid var(--color-neutral-80);
1261
+ outline-offset: 3px;
1262
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1263
+ }
1264
+
1265
+ .btn-secondary {
1266
+ background-color: #ffffff;
1267
+ color: var(--color-accent-80);
1268
+ border-color: var(--color-accent-80);
1269
+ }
1270
+
1271
+ .btn-secondary:hover {
1272
+ background-color: var(--color-accent-10);
1273
+ color: var(--color-accent-90);
1274
+ border-color: var(--color-accent-90);
1275
+ }
1276
+
1277
+ .btn-secondary:focus-visible {
1278
+ outline: 2px solid var(--color-neutral-80);
1279
+ outline-offset: 3px;
1280
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1281
+ }
1282
+
1283
+ .btn-ghost {
1284
+ background-color: transparent;
1285
+ color: var(--color-neutral-80);
1286
+ border-color: transparent;
1287
+ }
1288
+
1289
+ .btn-ghost:hover {
1290
+ background-color: var(--color-neutral-10);
1291
+ }
1292
+
1293
+ .btn-ghost:focus-visible {
1294
+ outline: 2px solid var(--color-neutral-80);
1295
+ outline-offset: 3px;
1296
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1297
+ }
1298
+
1299
+ .btn-danger {
1300
+ background-color: var(--color-error-80);
1301
+ color: #ffffff;
1302
+ border-color: transparent;
1303
+ }
1304
+
1305
+ .btn-danger:hover {
1306
+ background-color: var(--color-error-90);
1307
+ }
1308
+
1309
+ .btn-danger:focus-visible {
1310
+ outline: 2px solid var(--color-neutral-80);
1311
+ outline-offset: 3px;
1312
+ box-shadow: 0 0 0 4px rgba(219, 39, 119, 0.1);
1313
+ }
1314
+
1315
+ .btn-sm {
1316
+ padding: var(--space-2, 0.5rem) var(--space-4, 1rem);
1317
+ font-size: var(--text-sm, 14px);
1318
+ min-height: 2.25rem;
1319
+ }
1320
+
1321
+ .btn-lg {
1322
+ padding: var(--space-4, 1rem) var(--space-8, 2rem);
1323
+ font-size: var(--text-lg, 18px);
1324
+ min-height: 3.5rem;
1325
+ }
1002
1326
  `;
1003
1327
  }
1004
1328
 
@@ -1145,6 +1469,59 @@ function buildFullFramework() {
1145
1469
  overflow-wrap: break-word;
1146
1470
  }
1147
1471
 
1472
+ /* Base heading scale */
1473
+ h1 {
1474
+ font-size: var(--text-4xl, 36px);
1475
+ line-height: var(--leading-4xl, 1.3);
1476
+ font-weight: var(--font-weight-bold, 700);
1477
+ margin-bottom: var(--space-6, 1.5rem);
1478
+ }
1479
+
1480
+ h2 {
1481
+ font-size: var(--text-3xl, 30px);
1482
+ line-height: var(--leading-3xl, 1.4);
1483
+ font-weight: var(--font-weight-bold, 700);
1484
+ margin-bottom: var(--space-5, 1.25rem);
1485
+ }
1486
+
1487
+ h3 {
1488
+ font-size: var(--text-2xl, 24px);
1489
+ line-height: var(--leading-2xl, 1.4);
1490
+ font-weight: var(--font-weight-semibold, 600);
1491
+ margin-bottom: var(--space-4, 1rem);
1492
+ }
1493
+
1494
+ h4 {
1495
+ font-size: var(--text-xl, 20px);
1496
+ line-height: var(--leading-xl, 1.6);
1497
+ font-weight: var(--font-weight-semibold, 600);
1498
+ margin-bottom: var(--space-3, 0.75rem);
1499
+ }
1500
+
1501
+ h5 {
1502
+ font-size: var(--text-lg, 18px);
1503
+ line-height: var(--leading-lg, 1.6);
1504
+ font-weight: var(--font-weight-medium, 500);
1505
+ margin-bottom: var(--space-3, 0.75rem);
1506
+ }
1507
+
1508
+ h6 {
1509
+ font-size: var(--text-base, 16px);
1510
+ line-height: var(--leading-base, 1.6);
1511
+ font-weight: var(--font-weight-medium, 500);
1512
+ margin-bottom: var(--space-2, 0.5rem);
1513
+ }
1514
+
1515
+ p {
1516
+ font-size: var(--text-base, 16px);
1517
+ line-height: var(--leading-base, 1.6);
1518
+ margin-bottom: var(--space-4, 1rem);
1519
+ }
1520
+
1521
+ p:last-child {
1522
+ margin-bottom: 0;
1523
+ }
1524
+
1148
1525
  code {
1149
1526
  font-family: "Menlo", "Monaco", "Courier New", monospace;
1150
1527
  font-size: 0.875em;
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>EmilyUI Showcase</title>
7
- <link rel="stylesheet" href="./dist/emily.min.css">
7
+ <link rel="stylesheet" href="../dist/emily.min.css">
8
8
  <style>
9
9
  html {
10
10
  scroll-behavior: smooth;
@@ -949,7 +949,7 @@
949
949
 
950
950
  <div class="lg:col-span-2">
951
951
  <h3 class="font-bold mb-3">.center-screen</h3>
952
- <div class="border border-neutral-20 rounded-t-lg overflow-hidden bg-neutral-80" style="min-height: 200px; position: relative;">
952
+ <div class="border border-neutral-20 rounded-t-lg overflow-hidden bg-neutral-80" style="min-height: 50vh; position: relative;">
953
953
  <div class="center-screen" style="position: absolute;">
954
954
  <div class="bg-white rounded-lg shadow-lg border border-neutral-20 p-6 text-center" style="max-width: 340px; width: 90%;">
955
955
  <h4 class="text-lg font-bold mb-2">Confirm action</h4>