ui-style-kit-css 1.2.1 → 1.2.2

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.
@@ -0,0 +1,28 @@
1
+ # Publishing Guide
2
+
3
+ ## Dry run
4
+
5
+ ```bash
6
+ npm run check
7
+ npm run pack:dry-run
8
+ ```
9
+
10
+ `npm run check` rebuilds dist CSS, runs stylelint, executes unit package checks, verifies contrast pairs, and confirms package metadata. `npm run pack:dry-run` shows the exact files that would publish.
11
+
12
+ ## Publish
13
+
14
+ ```bash
15
+ npm publish
16
+ ```
17
+
18
+ For GitHub releases, create or dispatch a release for the matching package tag, such as `v1.2.2`. The release workflows verify that `package.json`, `package-lock.json`, and `CHANGELOG.md` are aligned before publishing.
19
+
20
+ ## Versioning
21
+
22
+ ```bash
23
+ npm run release:patch
24
+ npm run release:minor
25
+ npm run release:major
26
+ ```
27
+
28
+ Use patch for fixes, minor for new themes/styles, and major for breaking public API changes.
@@ -0,0 +1,28 @@
1
+ # Choosing a UI Style
2
+
3
+ | UI style | Best for |
4
+ |---|---|
5
+ | Minimal SaaS | Dashboards, admin tools, SaaS apps, documentation, internal systems |
6
+ | Bento UI | Landing pages, portfolio sections, feature pages, product showcases |
7
+ | Maximalist / Playful | Creators, entertainment brands, events, bold client sites |
8
+ | Bauhaus / Swiss Modern | Agencies, artists, editorial pages, design-forward brands |
9
+ | Tactile / Skeuomorphic | Premium sites, distinctive client interfaces, control-panel metaphors |
10
+ | Neumorphism | Soft dashboards, experimental UI, visual demos |
11
+ | Retrofuturism | Futuristic product pages, portfolios, technology showcases |
12
+ | Brutalism | Bold landing pages, anti-template websites, creative brands |
13
+ | Cyberpunk | Security, gaming, encryption, developer demos, nightlife/tech branding |
14
+ | Y2K | Nostalgic, playful, music/fashion/event sites |
15
+ | Retro Glass | Futuristic premium apps, glass dashboards, hero sections |
16
+ Use `data-mode="contrast"` for high-contrast variants and pair it with semantic HTML for best accessibility outcomes.
17
+
18
+
19
+ ## Visual regression baseline
20
+
21
+ The repository includes optional Playwright visual smoke checks:
22
+
23
+ ```bash
24
+ npm install
25
+ npm run test:visual
26
+ ```
27
+
28
+ Run visual tests before major releases or after large CSS refactors.
package/docs/TOKENS.md ADDED
@@ -0,0 +1,71 @@
1
+ # Token Contract
2
+
3
+ Each UI style uses its own prefix, but the token shape is intentionally consistent.
4
+
5
+ ## Prefixes
6
+
7
+ | UI style | Prefix |
8
+ |---|---:|
9
+ | Minimal SaaS | `saas` |
10
+ | Bento UI | `bento` |
11
+ | Maximalist / Playful | `max` |
12
+ | Bauhaus / Swiss Modern | `bau` |
13
+ | Skeuomorphic / Tactile | `tactile` |
14
+ | Neumorphism | `neo` |
15
+ | Retrofuturism | `retro` |
16
+ | Brutalism | `brutal` |
17
+ | Cyberpunk | `cyber` |
18
+ | Y2K | `y2k` |
19
+ | Retro Glass | `rg` |
20
+
21
+ ## Stable token families
22
+
23
+ Replace `<prefix>` with the style prefix:
24
+
25
+ ```css
26
+ --<prefix>-bg
27
+ --<prefix>-surface
28
+ --<prefix>-surface-strong
29
+ --<prefix>-surface-soft
30
+ --<prefix>-text
31
+ --<prefix>-text-muted
32
+ --<prefix>-border
33
+ --<prefix>-primary
34
+ --<prefix>-primary-hover
35
+ --<prefix>-primary-text
36
+ --<prefix>-secondary
37
+ --<prefix>-secondary-hover
38
+ --<prefix>-secondary-text
39
+ --<prefix>-accent
40
+ --<prefix>-success
41
+ --<prefix>-warning
42
+ --<prefix>-danger
43
+ --<prefix>-link
44
+ --<prefix>-focus
45
+ ```
46
+
47
+ Most systems also expose RGB source tokens such as:
48
+
49
+ ```css
50
+ --<prefix>-primary-rgb
51
+ --<prefix>-border-rgb
52
+ --<prefix>-focus-rgb
53
+ ```
54
+
55
+ These are useful for custom alpha effects:
56
+
57
+ ```css
58
+ .my-component {
59
+ border-color: rgb(var(--saas-primary-rgb) / 0.35);
60
+ }
61
+ ```
62
+
63
+ ## Override example
64
+
65
+ ```css
66
+ /* Consumer CSS is unlayered, so it overrides the library's layered rules cleanly. */
67
+ [data-ui="minimal-saas"][data-theme="arctic-indigo"] {
68
+ --saas-radius-md: 1rem;
69
+ --saas-primary-rgb: 72 91 255;
70
+ }
71
+ ```
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ui-style-kit-css",
3
- "version": "1.2.1",
4
- "description": "A CSS-only UI style and color theme kit with 11 visual systems, 10 shared color schemes, light/dark/contrast modes, and accessibility-focused native HTML coverage. Designed for easy integration into any web project, it provides a comprehensive set of styles and themes to create visually stunning and accessible user interfaces without the need for JavaScript.",
3
+ "version": "1.2.2",
4
+ "description": "CSS theme and UI style preset library for accessible websites, dashboards, admin interfaces, and client-facing pages.",
5
5
  "style": "dist/ui-style-kit.css",
6
6
  "main": "dist/ui-style-kit.css",
7
7
  "unpkg": "dist/ui-style-kit.min.css",
@@ -9,80 +9,106 @@
9
9
  "files": [
10
10
  "dist",
11
11
  "styles",
12
- "index.html",
12
+ "demo",
13
+ "docs",
13
14
  "README.md",
14
15
  "LICENSE",
15
16
  "CHANGELOG.md",
16
- "CODE_OF_CONDUCT.md"
17
+ "STYLE-MAP.md",
18
+ "CONTRIBUTING.md",
19
+ "SECURITY.md"
17
20
  ],
18
21
  "keywords": [
19
22
  "css",
20
23
  "ui",
21
24
  "themes",
25
+ "theme-system",
22
26
  "style-kit",
23
27
  "design-system",
28
+ "css-library",
24
29
  "accessibility",
25
30
  "color-themes",
31
+ "dark-mode",
32
+ "light-mode",
33
+ "high-contrast",
34
+ "dashboard",
35
+ "admin-panel",
36
+ "web-design",
37
+ "responsive-design",
38
+ "css-variables",
39
+ "custom-properties",
26
40
  "bento",
27
- "saas",
41
+ "minimal-saas",
28
42
  "glassmorphism",
43
+ "skeuomorphism",
29
44
  "neumorphism",
30
45
  "cyberpunk",
31
46
  "y2k",
32
47
  "brutalism",
33
- "retrofuturism"
48
+ "retrofuturism",
49
+ "bauhaus"
34
50
  ],
35
- "scripts": {
36
- "build": "node scripts/build-css.js",
37
- "lint": "npm run lint:css",
38
- "lint:css": "stylelint \"styles/**/*.css\"",
39
- "lint:css:fix": "stylelint \"styles/**/*.css\" --fix",
40
- "prepublishOnly": "npm run lint && npm run build && npm run test:unit",
41
- "test": "npm run test:unit",
42
- "test:ci": "npm run lint && npm run build && npm run test:unit && npm run test:e2e",
43
- "test:e2e": "node scripts/playwright-cli.js test",
44
- "test:e2e:headed": "node scripts/playwright-cli.js test --headed",
45
- "test:e2e:install": "node scripts/playwright-cli.js install chromium",
46
- "test:e2e:install:ci": "node scripts/playwright-cli.js install --with-deps chromium",
47
- "test:e2e:ui": "node scripts/playwright-cli.js test --ui",
48
- "test:unit": "node --test tests/package-integrity.test.js",
49
- "verify": "npm run lint && npm run build && npm run test:unit && npm run test:e2e"
50
- },
51
51
  "license": "MIT",
52
- "engines": {
53
- "node": ">=18.18.0"
54
- },
55
52
  "sideEffects": [
56
53
  "*.css"
57
54
  ],
58
55
  "exports": {
59
56
  ".": "./dist/ui-style-kit.css",
60
57
  "./css": "./dist/ui-style-kit.css",
58
+ "./css.css": "./dist/ui-style-kit.css",
61
59
  "./min": "./dist/ui-style-kit.min.css",
60
+ "./min.css": "./dist/ui-style-kit.min.css",
61
+ "./dist/ui-style-kit.css": "./dist/ui-style-kit.css",
62
+ "./dist/ui-style-kit.min.css": "./dist/ui-style-kit.min.css",
63
+ "./package.json": "./package.json",
62
64
  "./styles/minimal-saas": "./styles/minimal-saas.css",
65
+ "./styles/minimal-saas.css": "./styles/minimal-saas.css",
63
66
  "./minimal-saas": "./styles/minimal-saas.css",
67
+ "./minimal-saas.css": "./styles/minimal-saas.css",
64
68
  "./styles/bento": "./styles/bento.css",
69
+ "./styles/bento.css": "./styles/bento.css",
65
70
  "./bento": "./styles/bento.css",
71
+ "./bento.css": "./styles/bento.css",
66
72
  "./styles/maximalist": "./styles/maximalist.css",
73
+ "./styles/maximalist.css": "./styles/maximalist.css",
67
74
  "./maximalist": "./styles/maximalist.css",
75
+ "./maximalist.css": "./styles/maximalist.css",
68
76
  "./styles/bauhaus": "./styles/bauhaus.css",
77
+ "./styles/bauhaus.css": "./styles/bauhaus.css",
69
78
  "./bauhaus": "./styles/bauhaus.css",
79
+ "./bauhaus.css": "./styles/bauhaus.css",
70
80
  "./styles/tactile": "./styles/tactile.css",
81
+ "./styles/tactile.css": "./styles/tactile.css",
71
82
  "./tactile": "./styles/tactile.css",
83
+ "./tactile.css": "./styles/tactile.css",
72
84
  "./styles/neumorphism": "./styles/neumorphism.css",
85
+ "./styles/neumorphism.css": "./styles/neumorphism.css",
73
86
  "./neumorphism": "./styles/neumorphism.css",
87
+ "./neumorphism.css": "./styles/neumorphism.css",
74
88
  "./styles/retrofuturism": "./styles/retrofuturism.css",
89
+ "./styles/retrofuturism.css": "./styles/retrofuturism.css",
75
90
  "./retrofuturism": "./styles/retrofuturism.css",
91
+ "./retrofuturism.css": "./styles/retrofuturism.css",
76
92
  "./styles/brutalism": "./styles/brutalism.css",
93
+ "./styles/brutalism.css": "./styles/brutalism.css",
77
94
  "./brutalism": "./styles/brutalism.css",
95
+ "./brutalism.css": "./styles/brutalism.css",
78
96
  "./styles/cyberpunk": "./styles/cyberpunk.css",
97
+ "./styles/cyberpunk.css": "./styles/cyberpunk.css",
79
98
  "./cyberpunk": "./styles/cyberpunk.css",
99
+ "./cyberpunk.css": "./styles/cyberpunk.css",
80
100
  "./styles/y2k": "./styles/y2k.css",
101
+ "./styles/y2k.css": "./styles/y2k.css",
81
102
  "./y2k": "./styles/y2k.css",
103
+ "./y2k.css": "./styles/y2k.css",
82
104
  "./styles/retro-glass": "./styles/retro-glass.css",
105
+ "./styles/retro-glass.css": "./styles/retro-glass.css",
83
106
  "./retro-glass": "./styles/retro-glass.css",
107
+ "./retro-glass.css": "./styles/retro-glass.css",
84
108
  "./styles/interactive-surface-bridge": "./styles/interactive-surface-bridge.css",
85
- "./interactive-surface-bridge": "./styles/interactive-surface-bridge.css"
109
+ "./styles/interactive-surface-bridge.css": "./styles/interactive-surface-bridge.css",
110
+ "./interactive-surface-bridge": "./styles/interactive-surface-bridge.css",
111
+ "./interactive-surface-bridge.css": "./styles/interactive-surface-bridge.css"
86
112
  },
87
113
  "repository": {
88
114
  "type": "git",
@@ -92,110 +118,34 @@
92
118
  "url": "https://github.com/Foscat/ui-style-kit-css/issues"
93
119
  },
94
120
  "homepage": "https://github.com/Foscat/ui-style-kit-css#readme",
121
+ "engines": {
122
+ "node": ">=20"
123
+ },
124
+ "type": "module",
95
125
  "devDependencies": {
96
- "@playwright/test": "^1.54.0",
97
- "lightningcss": "^1.30.2",
126
+ "@playwright/test": "^1.60.0",
98
127
  "stylelint": "^17.12.0"
99
128
  },
100
- "dependencies": {
101
- "ajv": "~8.20.0",
102
- "ansi-regex": "~5.0.1",
103
- "ansi-styles": "~4.3.0",
104
- "argparse": "~2.0.1",
105
- "array-union": "~2.1.0",
106
- "astral-regex": "~2.0.0",
107
- "balanced-match": "~2.0.0",
108
- "braces": "~3.0.3",
109
- "cacheable": "~2.3.5",
110
- "callsites": "~3.1.0",
111
- "color-convert": "~2.0.1",
112
- "color-name": "~1.1.4",
113
- "colord": "~2.9.3",
114
- "cosmiconfig": "~9.0.1",
115
- "css-functions-list": "~3.3.3",
116
- "css-tree": "~3.2.1",
117
- "cssesc": "~3.0.0",
118
- "debug": "~4.4.3",
119
- "dir-glob": "~3.0.1",
120
- "emoji-regex": "~8.0.0",
121
- "env-paths": "~2.2.1",
122
- "error-ex": "~1.3.4",
123
- "fast-deep-equal": "~3.1.3",
124
- "fast-glob": "~3.3.3",
125
- "fast-uri": "~3.1.2",
126
- "fastest-levenshtein": "~1.0.16",
127
- "fastq": "~1.20.1",
128
- "file-entry-cache": "~11.1.3",
129
- "fill-range": "~7.1.1",
130
- "flat-cache": "~6.1.22",
131
- "flatted": "~3.4.2",
132
- "glob-parent": "~5.1.2",
133
- "global-modules": "~2.0.0",
134
- "global-prefix": "~3.0.0",
135
- "globby": "~11.1.0",
136
- "globjoin": "~0.1.4",
137
- "has-flag": "~4.0.0",
138
- "hashery": "~1.5.1",
139
- "hookified": "~1.15.1",
140
- "html-tags": "~3.3.1",
141
- "ignore": "~7.0.5",
142
- "import-fresh": "~3.3.1",
143
- "imurmurhash": "~0.1.4",
144
- "ini": "~1.3.8",
145
- "is-arrayish": "~0.2.1",
146
- "is-extglob": "~2.1.1",
147
- "is-fullwidth-code-point": "~3.0.0",
148
- "is-glob": "~4.0.3",
149
- "is-number": "~7.0.0",
150
- "is-plain-object": "~5.0.0",
151
- "isexe": "~2.0.0",
152
- "js-tokens": "~4.0.0",
153
- "js-yaml": "~4.1.1",
154
- "json-parse-even-better-errors": "~2.3.1",
155
- "json-schema-traverse": "~1.0.0",
156
- "keyv": "~5.6.0",
157
- "kind-of": "~6.0.3",
158
- "known-css-properties": "~0.37.0",
159
- "lines-and-columns": "~1.2.4",
160
- "lodash.truncate": "~4.4.2",
161
- "mathml-tag-names": "~2.1.3",
162
- "mdn-data": "~2.27.1",
163
- "meow": "~13.2.0",
164
- "merge2": "~1.4.1",
165
- "micromatch": "~4.0.8",
166
- "ms": "~2.1.3",
167
- "nanoid": "~3.3.12",
168
- "normalize-path": "~3.0.0",
169
- "parent-module": "~1.0.1",
170
- "parse-json": "~5.2.0",
171
- "path-type": "~4.0.0",
172
- "picocolors": "~1.1.1",
173
- "picomatch": "~2.3.2",
174
- "postcss": "~8.5.15",
175
- "postcss-resolve-nested-selector": "~0.1.6",
176
- "postcss-safe-parser": "~7.0.1",
177
- "postcss-selector-parser": "~7.1.1",
178
- "postcss-value-parser": "~4.2.0",
179
- "qified": "~0.10.1",
180
- "queue-microtask": "~1.2.3",
181
- "require-from-string": "~2.0.2",
182
- "resolve-from": "~5.0.0",
183
- "reusify": "~1.1.0",
184
- "run-parallel": "~1.2.0",
185
- "signal-exit": "~4.1.0",
186
- "slash": "~3.0.0",
187
- "slice-ansi": "~4.0.0",
188
- "source-map-js": "~1.2.1",
189
- "string-width": "~4.2.3",
190
- "strip-ansi": "~6.0.1",
191
- "supports-color": "~7.2.0",
192
- "supports-hyperlinks": "~3.2.0",
193
- "svg-tags": "~1.0.0",
194
- "table": "~6.9.0",
195
- "to-regex-range": "~5.0.1",
196
- "util-deprecate": "~1.0.2",
197
- "which": "~1.3.1",
198
- "write-file-atomic": "~5.0.1"
129
+ "scripts": {
130
+ "build": "node scripts/build.mjs",
131
+ "lint": "stylelint \"styles/**/*.css\"",
132
+ "check:contrast": "node scripts/check-contrast.mjs",
133
+ "check:package": "node scripts/check-package.mjs",
134
+ "test": "npm run test:unit",
135
+ "test:unit": "node --test tests/package-integrity.test.js",
136
+ "test:e2e": "playwright test --config playwright.config.js",
137
+ "test:e2e:install:ci": "playwright install --with-deps chromium",
138
+ "check": "npm run build && npm run lint && npm run test:unit && npm run check:contrast && npm run check:package",
139
+ "pack:dry-run": "npm pack --dry-run",
140
+ "prepack": "npm run check",
141
+ "prepublishOnly": "npm run check",
142
+ "release:patch": "npm version patch && npm publish",
143
+ "release:minor": "npm version minor && npm publish",
144
+ "release:major": "npm version major && npm publish",
145
+ "test:visual": "playwright test --config playwright.config.mjs tests/demo-visual.spec.mjs"
199
146
  },
200
- "author": "Foscat"
147
+ "author": "Kyle Foster",
148
+ "publishConfig": {
149
+ "access": "public"
150
+ }
201
151
  }
@@ -10,6 +10,8 @@
10
10
  <body data-ui="bauhaus" data-theme="cyber-lime" data-mode="contrast">
11
11
  ========================================================= */
12
12
 
13
+
14
+ @layer ui-style-kit.bauhaus {
13
15
  :root {
14
16
  --bau-font-sans: Helvetica Neue, Helvetica, Arial, ui-sans-serif, system-ui, sans-serif;
15
17
  --bau-font-display: Helvetica Neue, Helvetica, Arial, ui-sans-serif, system-ui, sans-serif;
@@ -90,7 +92,7 @@
90
92
  --bau-border-rgb: 214 200 165;
91
93
  --bau-primary-rgb: 184 135 47;
92
94
  --bau-primary-hover-rgb: 148 104 31;
93
- --bau-primary-text-rgb: 255 255 255;
95
+ --bau-primary-text-rgb: 16 16 16;
94
96
  --bau-secondary-rgb: 34 49 79;
95
97
  --bau-secondary-hover-rgb: 23 36 60;
96
98
  --bau-secondary-text-rgb: 255 255 255;
@@ -618,7 +620,7 @@
618
620
  --bau-border-rgb: 198 216 179;
619
621
  --bau-primary-rgb: 95 159 31;
620
622
  --bau-primary-hover-rgb: 73 125 23;
621
- --bau-primary-text-rgb: 255 255 255;
623
+ --bau-primary-text-rgb: 16 16 16;
622
624
  --bau-secondary-rgb: 20 127 134;
623
625
  --bau-secondary-hover-rgb: 14 98 104;
624
626
  --bau-secondary-text-rgb: 255 255 255;
@@ -976,3 +978,4 @@
976
978
  [data-ui="bauhaus"] * { box-shadow: none !important; text-shadow: none !important; }
977
979
  [data-ui="bauhaus"] a { color: #000 !important; text-decoration: underline; }
978
980
  }
981
+ }
package/styles/bento.css CHANGED
@@ -10,6 +10,8 @@
10
10
  <body data-ui="bento" data-theme="cyber-lime" data-mode="contrast">
11
11
  ========================================================= */
12
12
 
13
+
14
+ @layer ui-style-kit.bento {
13
15
  :root {
14
16
  --bento-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
15
17
  --bento-font-display: Inter, ui-sans-serif, system-ui, sans-serif;
@@ -90,7 +92,7 @@
90
92
  --bento-border-rgb: 214 200 165;
91
93
  --bento-primary-rgb: 184 135 47;
92
94
  --bento-primary-hover-rgb: 148 104 31;
93
- --bento-primary-text-rgb: 255 255 255;
95
+ --bento-primary-text-rgb: 16 16 16;
94
96
  --bento-secondary-rgb: 34 49 79;
95
97
  --bento-secondary-hover-rgb: 23 36 60;
96
98
  --bento-secondary-text-rgb: 255 255 255;
@@ -618,7 +620,7 @@
618
620
  --bento-border-rgb: 198 216 179;
619
621
  --bento-primary-rgb: 95 159 31;
620
622
  --bento-primary-hover-rgb: 73 125 23;
621
- --bento-primary-text-rgb: 255 255 255;
623
+ --bento-primary-text-rgb: 16 16 16;
622
624
  --bento-secondary-rgb: 20 127 134;
623
625
  --bento-secondary-hover-rgb: 14 98 104;
624
626
  --bento-secondary-text-rgb: 255 255 255;
@@ -977,3 +979,4 @@
977
979
  [data-ui="bento"] * { box-shadow: none !important; text-shadow: none !important; }
978
980
  [data-ui="bento"] a { color: #000 !important; text-decoration: underline; }
979
981
  }
982
+ }
@@ -11,6 +11,8 @@
11
11
  <body data-ui="brutalism" data-theme="midnight-gold" data-mode="contrast">
12
12
  ========================================================= */
13
13
 
14
+
15
+ @layer ui-style-kit.brutalism {
14
16
  :root {
15
17
  --brutal-radius-xs: 0.25rem;
16
18
  --brutal-radius-sm: 0.5rem;
@@ -111,7 +113,7 @@
111
113
  --brutal-border-rgb: 214 200 165;
112
114
  --brutal-primary-rgb: 184 135 47;
113
115
  --brutal-primary-hover-rgb: 148 104 31;
114
- --brutal-primary-text-rgb: 255 255 255;
116
+ --brutal-primary-text-rgb: 16 16 16;
115
117
  --brutal-secondary-rgb: 34 49 79;
116
118
  --brutal-secondary-hover-rgb: 23 36 60;
117
119
  --brutal-secondary-text-rgb: 255 255 255;
@@ -671,7 +673,7 @@
671
673
  --brutal-border-rgb: 198 216 179;
672
674
  --brutal-primary-rgb: 95 159 31;
673
675
  --brutal-primary-hover-rgb: 73 125 23;
674
- --brutal-primary-text-rgb: 255 255 255;
676
+ --brutal-primary-text-rgb: 16 16 16;
675
677
  --brutal-secondary-rgb: 20 127 134;
676
678
  --brutal-secondary-hover-rgb: 14 98 104;
677
679
  --brutal-secondary-text-rgb: 255 255 255;
@@ -909,3 +911,82 @@
909
911
 
910
912
  [data-ui="brutalism"] :focus-visible { outline: 4px solid var(--brutal-focus); outline-offset: 3px; }
911
913
  @media (prefers-reduced-motion: reduce) { [data-ui="brutalism"] *, [data-ui="brutalism"] *::before, [data-ui="brutalism"] *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; } }
914
+
915
+ /* =========================================================
916
+ Native HTML Coverage + CSS Accessibility Layer
917
+ ========================================================= */
918
+
919
+ .brutal-sr-only,
920
+ .brutal-visually-hidden { position: absolute !important; inline-size: 1px !important; block-size: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0 0 0 0) !important; white-space: nowrap !important; border: 0 !important; }
921
+ .brutal-skip-link { position: fixed; inset-block-start: 1rem; inset-inline-start: 1rem; z-index: 10000; transform: translateY(-150%); padding: .75rem 1rem; background: var(--brutal-primary); color: var(--brutal-primary-text); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-sm); box-shadow: var(--brutal-shadow-md); font-weight: 900; text-decoration: none; }
922
+ .brutal-skip-link:focus { transform: translateY(0); }
923
+ .brutal-divider { width: 100%; height: 1px; border: 0; margin: 1.5rem 0; background: var(--brutal-border); }
924
+
925
+ [data-ui="brutalism"] :where(h1, h2, h3, h4, h5, h6) { color: var(--brutal-text); font-family: var(--brutal-font-display); line-height: 1.15; margin: 0 0 .65em; text-wrap: balance; }
926
+ [data-ui="brutalism"] :where(h1) { font-size: clamp(2rem, 5vw, 3.5rem); }
927
+ [data-ui="brutalism"] :where(h2) { font-size: clamp(1.55rem, 3vw, 2.35rem); }
928
+ [data-ui="brutalism"] :where(h3) { font-size: clamp(1.25rem, 2vw, 1.65rem); }
929
+ [data-ui="brutalism"] :where(p) { margin: 0 0 1rem; color: var(--brutal-text-muted); line-height: 1.7; }
930
+ [data-ui="brutalism"] :where(a) { color: var(--brutal-link); text-decoration-thickness: .08em; text-underline-offset: .18em; }
931
+ [data-ui="brutalism"] :where(a:hover) { color: var(--brutal-primary-hover); }
932
+ [data-ui="brutalism"] :where(ul, ol) { margin: 0 0 1rem; padding-left: 1.35rem; color: var(--brutal-text-muted); }
933
+ [data-ui="brutalism"] :where(li) { margin-block: .25rem; }
934
+ [data-ui="brutalism"] :where(blockquote) { margin: 1.25rem 0; padding: 1rem 1.25rem; color: var(--brutal-text); background: var(--brutal-surface-soft); border-left: .35rem solid var(--brutal-primary); border-radius: var(--brutal-radius-md); }
935
+ [data-ui="brutalism"] :where(code, kbd, samp) { font-family: var(--brutal-font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace); font-size: .92em; background: var(--brutal-surface-soft); color: var(--brutal-text); border: 1px solid rgb(var(--brutal-border-rgb) / .45); border-radius: var(--brutal-radius-xs); padding: .15em .35em; }
936
+ [data-ui="brutalism"] :where(pre) { overflow: auto; margin: 1rem 0; padding: 1rem; background: var(--brutal-surface-soft); color: var(--brutal-text); border: 1px solid var(--brutal-border); border-radius: var(--brutal-radius-md); }
937
+ [data-ui="brutalism"] :where(pre code) { display: block; padding: 0; border: 0; background: transparent; }
938
+ [data-ui="brutalism"] :where(hr) { height: 1px; border: 0; margin: 2rem 0; background: var(--brutal-border); }
939
+ [data-ui="brutalism"] :where(mark) { background: rgb(var(--brutal-warning-rgb) / .32); color: var(--brutal-text); border-radius: .2em; padding-inline: .15em; }
940
+ [data-ui="brutalism"] :where(small) { color: var(--brutal-text-muted); }
941
+ [data-ui="brutalism"] :where(abbr[title]) { text-decoration: underline dotted var(--brutal-primary); text-underline-offset: .18em; cursor: help; }
942
+ [data-ui="brutalism"] :where(img, picture, video, canvas, svg, iframe) { max-width: 100%; height: auto; }
943
+ [data-ui="brutalism"] :where(figure) { margin: 1.25rem 0; }
944
+ [data-ui="brutalism"] :where(figcaption) { margin-top: .5rem; color: var(--brutal-text-muted); font-size: .9rem; }
945
+ [data-ui="brutalism"] :where(fieldset) { min-inline-size: 0; margin: 0 0 1rem; padding: 1rem; border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-md); }
946
+ [data-ui="brutalism"] :where(legend) { padding-inline: .35rem; color: var(--brutal-text); font-weight: 900; }
947
+ [data-ui="brutalism"] :where(label) { color: var(--brutal-text); font-weight: 750; }
948
+ [data-ui="brutalism"] :where(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]), textarea, select) { width: 100%; min-height: 2.75rem; padding: .72rem .95rem; background: var(--brutal-surface-soft); color: var(--brutal-text); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-md); font: inherit; }
949
+ [data-ui="brutalism"] :where(textarea) { resize: vertical; min-height: 7rem; }
950
+ [data-ui="brutalism"] :where(input, textarea, select, button) { font: inherit; }
951
+ [data-ui="brutalism"] :where(button, input[type="button"], input[type="submit"], input[type="reset"]) { min-height: 2.75rem; padding: .7rem 1rem; background: var(--brutal-primary); color: var(--brutal-primary-text); border: 3px solid var(--brutal-primary); border-radius: var(--brutal-radius-md); font-weight: 850; cursor: pointer; }
952
+ [data-ui="brutalism"] :where(button:hover, input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover) { background: var(--brutal-primary-hover); border-color: var(--brutal-primary-hover); }
953
+ [data-ui="brutalism"] :where(input[type="checkbox"], input[type="radio"]) { inline-size: 1.1rem; block-size: 1.1rem; accent-color: var(--brutal-primary); }
954
+ [data-ui="brutalism"] :where(input[type="range"]) { width: 100%; accent-color: var(--brutal-primary); }
955
+ [data-ui="brutalism"] :where(input[type="color"]) { inline-size: 3rem; block-size: 2.4rem; padding: .2rem; background: var(--brutal-surface-soft); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-sm); }
956
+ [data-ui="brutalism"] :where(input[type="file"]) { color: var(--brutal-text-muted); }
957
+ [data-ui="brutalism"] :where(input[type="file"]::file-selector-button) { margin-inline-end: .75rem; padding: .55rem .8rem; border: 3px solid var(--brutal-primary); border-radius: var(--brutal-radius-sm); background: var(--brutal-primary); color: var(--brutal-primary-text); font-weight: 800; cursor: pointer; }
958
+ [data-ui="brutalism"] :where(input:disabled, textarea:disabled, select:disabled, button:disabled, [aria-disabled="true"]) { opacity: .55; cursor: not-allowed; }
959
+ [data-ui="brutalism"] :where(input:invalid, textarea:invalid, select:invalid, [aria-invalid="true"]) { border-color: var(--brutal-danger); }
960
+ [data-ui="brutalism"] :where(table) { width: 100%; border-collapse: collapse; margin: 1rem 0; background: var(--brutal-surface); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-md); overflow: hidden; }
961
+ [data-ui="brutalism"] :where(caption) { caption-side: bottom; padding: .75rem; color: var(--brutal-text-muted); font-size: .9rem; }
962
+ [data-ui="brutalism"] :where(th, td) { padding: .8rem .9rem; text-align: left; border-bottom: 1px solid var(--brutal-border); }
963
+ [data-ui="brutalism"] :where(th) { color: var(--brutal-text); background: rgb(var(--brutal-primary-rgb) / .08); }
964
+ [data-ui="brutalism"] :where(td) { color: var(--brutal-text-muted); }
965
+ [data-ui="brutalism"] :where(details) { margin: 1rem 0; padding: .9rem 1rem; background: var(--brutal-surface); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-md); }
966
+ [data-ui="brutalism"] :where(summary) { color: var(--brutal-text); font-weight: 900; cursor: pointer; }
967
+ [data-ui="brutalism"] :where(dialog) { max-width: min(92vw, 42rem); padding: 0; background: var(--brutal-surface-strong); color: var(--brutal-text); border: 3px solid var(--brutal-border); border-radius: var(--brutal-radius-lg); box-shadow: 0 30px 80px rgb(0 0 0 / .42); }
968
+ [data-ui="brutalism"] :where(dialog::backdrop) { background: rgb(0 0 0 / .62); }
969
+ [data-ui="brutalism"] :where(progress, meter) { width: 100%; min-height: .9rem; accent-color: var(--brutal-primary); }
970
+ [data-ui="brutalism"] :where(:focus-visible) { outline: 3px solid var(--brutal-focus); outline-offset: 3px; box-shadow: 0 0 0 4px rgb(var(--brutal-focus-rgb) / .28); }
971
+ [data-ui="brutalism"] :where(:target) { scroll-margin-top: 6rem; outline: 3px solid var(--brutal-focus); outline-offset: .35rem; }
972
+ [data-ui="brutalism"] :where([aria-current="page"]) { font-weight: 900; }
973
+ [data-ui="brutalism"] :where([aria-busy="true"]) { cursor: progress; }
974
+ [data-ui="brutalism"] :where([hidden]) { display: none !important; }
975
+ [data-ui="brutalism"] ::selection { background: var(--brutal-primary); color: var(--brutal-primary-text); }
976
+
977
+ @media (prefers-reduced-motion: reduce) {
978
+ [data-ui="brutalism"] *, [data-ui="brutalism"] *::before, [data-ui="brutalism"] *::after { scroll-behavior: auto !important; transition-duration: 1ms !important; animation-duration: 1ms !important; animation-iteration-count: 1 !important; }
979
+ }
980
+ @media (prefers-contrast: more) {
981
+ [data-ui="brutalism"] { --brutal-border-alpha: 1; }
982
+ }
983
+ @media (forced-colors: active) {
984
+ [data-ui="brutalism"] * { forced-color-adjust: auto; }
985
+ [data-ui="brutalism"] :where(:focus-visible) { outline: 3px solid CanvasText; box-shadow: none; }
986
+ }
987
+ @media print {
988
+ [data-ui="brutalism"] { background: #fff !important; color: #000 !important; }
989
+ [data-ui="brutalism"] * { box-shadow: none !important; text-shadow: none !important; }
990
+ [data-ui="brutalism"] a { color: #000 !important; text-decoration: underline; }
991
+ }
992
+ }