@semanticus/semanticus-css 1.1.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.
Files changed (33) hide show
  1. package/README.md +19 -16
  2. package/dist/semanticus-no-utilities.css +16 -1
  3. package/dist/semanticus-semantics.css +1 -1
  4. package/dist/semanticus-utilities.css +1 -1
  5. package/dist/semanticus.css +17 -2
  6. package/package.json +3 -1
  7. package/src/components/_card.css +65 -4
  8. package/src/components/_content-grid.css +95 -0
  9. package/src/{semantics/attributes/_role-toolbar.css → components/_grid.css} +1 -1
  10. package/src/components/_icons.css +2 -3
  11. package/src/components/modules.css +2 -1
  12. package/src/index.css +1 -1
  13. package/src/semantics/attributes/_popover.css +0 -4
  14. package/src/semantics/attributes/_role-group.css +126 -0
  15. package/src/semantics/attributes/_role-search.css +14 -0
  16. package/src/semantics/attributes/_role-status-alert.css +36 -2
  17. package/src/semantics/elements/_details.css +0 -1
  18. package/src/semantics/elements/_nav.css +5 -1
  19. package/src/semantics/modules.css +2 -2
  20. package/src/utilities/effects/_shadows.css +4 -0
  21. package/src/variables/_theme.css +1 -1
  22. package/src/variants/intent/_contrast.css +15 -20
  23. package/src/variants/intent/_danger.css +14 -19
  24. package/src/variants/intent/_info.css +14 -19
  25. package/src/variants/intent/_primary.css +14 -19
  26. package/src/variants/intent/_secondary.css +14 -19
  27. package/src/variants/intent/_success.css +14 -19
  28. package/src/variants/intent/_warning.css +14 -19
  29. package/src/variants/modifiers/_ghost.css +2 -2
  30. package/src/variants/modifiers/_striped.css +8 -8
  31. package/src/variants/modifiers/_subtle.css +2 -2
  32. package/src/components/_pane.css +0 -19
  33. package/src/semantics/attributes/_role-group-search.css +0 -137
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semanticus/semanticus-css",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "lightweight CSS framework that prioritizes semantic HTML and ARIA-focused accessibility, with a small set of atomic utilities",
5
5
  "author": "Joao Goncalves",
6
6
  "style": "./dist/semanticus.css",
@@ -88,6 +88,8 @@
88
88
  "storybook": "storybook dev -p 6006",
89
89
  "demo:server": "tsx --tsconfig scripts/tsconfig.json scripts/demo-server.ts",
90
90
  "test": "npx playwright test",
91
+ "test:dev": "npx playwright test --ui",
92
+ "test:report": "npx playwright show-report --host 0.0.0.0",
91
93
  "test:update-snapshots": "npx playwright test -u",
92
94
  "kill-zombies": "sh -c 'PORT=${PORT:-4000}; pids=$(lsof -t -i :$PORT); if [ -n \"$pids\" ]; then echo \"Killing PIDs: $pids\"; kill -9 $pids; else echo \"No processes listening on port $PORT\"; fi'",
93
95
  "kill-playwright": "sh -c 'pgrep -af playwright | awk \"{print $1}\" | xargs -r kill -9 || true'",
@@ -1,6 +1,4 @@
1
- .card,
2
- .pane {
3
- --shadow: var(--dialog-shadow);
1
+ .card {
4
2
  --color-background: var(--dialog-fill);
5
3
  --border-color: var(--dialog-border);
6
4
 
@@ -10,7 +8,6 @@
10
8
  border-radius: var(--radius);
11
9
  border: var(--border-size) solid var(--border-color);
12
10
  background: var(--color-background);
13
- box-shadow: var(--shadow);
14
11
 
15
12
  > header,
16
13
  > footer {
@@ -44,4 +41,68 @@
44
41
  > :last-child:is(hgroup, h1, h2, h3, h4, h5, h6) {
45
42
  margin-bottom: 0;
46
43
  }
44
+
45
+ &:is(ul, [role="list"], [role="group"]) {
46
+ padding: 0;
47
+ border: none;
48
+
49
+ > * {
50
+ --color-background: transparent;
51
+ --card-item-fill: var(--color-background);
52
+ --border-color: color-mix(in srgb, light-dark(var(--color-slate-900), var(--color-zinc-350)), transparent 90%);
53
+
54
+ background: var(--card-item-fill);
55
+ color: var(--color-text);
56
+ margin: 0;
57
+ padding: var(--spacing);
58
+ border-radius: 0;
59
+ border: var(--border-size) solid var(--border-color);
60
+
61
+ &:first-child {
62
+ border-top-left-radius: var(--radius);
63
+ }
64
+
65
+ &:last-child {
66
+ border-bottom-right-radius: var(--radius);
67
+ }
68
+
69
+ &:is([aria-current]:not([aria-current="false"])) {
70
+ --card-item-fill: color-mix(in srgb, var(--color-background), var(--color-hover-effect) 15%);
71
+ }
72
+ }
73
+ }
74
+
75
+ &:is(ul, [role="list"]) {
76
+ display: flex;
77
+ flex-direction: column;
78
+
79
+ > * {
80
+ border-top: none;
81
+ list-style: none;
82
+
83
+ &:first-child {
84
+ border-top: var(--border-size) solid var(--border-color);
85
+ border-top-right-radius: var(--radius);
86
+ }
87
+
88
+ &:last-child {
89
+ border-bottom-left-radius: var(--radius);
90
+ }
91
+ }
92
+ }
93
+
94
+ &[role="group"] {
95
+ > * {
96
+ border-left: none;
97
+
98
+ &:first-child {
99
+ border-left: var(--border-size) solid var(--border-color);
100
+ border-bottom-left-radius: var(--radius);
101
+ }
102
+
103
+ &:last-child {
104
+ border-top-right-radius: var(--radius);
105
+ }
106
+ }
107
+ }
47
108
  }
@@ -0,0 +1,95 @@
1
+ /*!
2
+ * Content Grid
3
+ *
4
+ * A CSS Grid layout pattern that eliminates the need for container/wrapper divs.
5
+ * Inspired by Kevin Powell's content grid technique (https://www.youtube.com/watch?v=c13gpBrnGEw)
6
+ * and the original idea from Stephanie Eckles (smolcss.dev) and Ryan Mulligan.
7
+ *
8
+ * The grid provides three width levels for direct children:
9
+ * - content (default) — constrained to the content max-width
10
+ * - .breakout — wider than content, narrower than full-width
11
+ * - .full-width — edge-to-edge spanning the entire viewport
12
+ *
13
+ * .full-width elements also create a nested grid with the same column structure,
14
+ * so their children follow the same content / breakout / full-width rules.
15
+ */
16
+
17
+ .content-grid {
18
+ --content-grid-padding-inline: var(--spacing);
19
+ --content-grid-content-max-width: 70ch;
20
+ --content-grid-breakout-max-width: 90ch;
21
+
22
+ /* Internal computed value */
23
+ --content-grid-breakout-size: max(
24
+ 0px,
25
+ calc(
26
+ (var(--content-grid-breakout-max-width) - var(--content-grid-content-max-width)) / 2
27
+ )
28
+ );
29
+
30
+ display: grid;
31
+ grid-template-columns:
32
+ [full-width-start]
33
+ minmax(var(--content-grid-padding-inline), 1fr)
34
+ [breakout-start]
35
+ minmax(0px, var(--content-grid-breakout-size))
36
+ [content-start]
37
+ min(
38
+ var(--content-grid-content-max-width),
39
+ 100% - var(--content-grid-padding-inline) * 2
40
+ )
41
+ [content-end]
42
+ minmax(0px, var(--content-grid-breakout-size))
43
+ [breakout-end]
44
+ minmax(var(--content-grid-padding-inline), 1fr)
45
+ [full-width-end];
46
+ }
47
+
48
+ /* ── Default placement: all direct children → content column ── */
49
+ .content-grid > :not(.breakout, .full-width) {
50
+ grid-column: content;
51
+ }
52
+
53
+ /* ── Breakout: spans the breakout area (wider than content) ── */
54
+ .content-grid > .breakout {
55
+ grid-column: breakout;
56
+ }
57
+
58
+ /* ── Full-width: spans edge-to-edge, becomes a nested content grid ── */
59
+ .content-grid > .full-width {
60
+ grid-column: full-width;
61
+ display: grid;
62
+ grid-template-columns: inherit;
63
+ }
64
+
65
+ /* Children of any .full-width (at any nesting depth) follow the same rules */
66
+ .content-grid .full-width > :not(.breakout, .full-width) {
67
+ grid-column: content;
68
+ }
69
+
70
+ .content-grid .full-width > .breakout {
71
+ grid-column: breakout;
72
+ }
73
+
74
+ /* ── Nested full-width: spans edge-to-edge within any .full-width ancestor ── */
75
+ /*
76
+ * Instead of inheriting the full 5-track template (which starts with a gutter
77
+ * column), we define a single centered content-width column. This ensures that
78
+ * auto-placed items — including bare text nodes, which CSS selectors cannot
79
+ * target — land in the content column rather than the first gutter track.
80
+ *
81
+ * Trade-off: .breakout and .full-width children inside a nested .full-width
82
+ * will not span wider than the content column (graceful degradation).
83
+ */
84
+ .content-grid .full-width > .full-width {
85
+ grid-column: full-width;
86
+ display: grid;
87
+ grid-template-columns:
88
+ [full-width-start breakout-start content-start]
89
+ min(
90
+ var(--content-grid-content-max-width),
91
+ 100% - var(--content-grid-padding-inline) * 2
92
+ )
93
+ [content-end breakout-end full-width-end];
94
+ justify-content: center;
95
+ }
@@ -1,4 +1,4 @@
1
- [role="toolbar"] {
1
+ .grid {
2
2
  grid-column-gap: var(--spacing);
3
3
  grid-row-gap: var(--spacing);
4
4
  display: grid;
@@ -2,8 +2,8 @@
2
2
  [class^="icon-"],
3
3
  [class*=" icon-"] {
4
4
  display: inline-block;
5
- width: 1em;
6
- height: 1em;
5
+ min-width: 1em;
6
+ min-height: 1em;
7
7
  margin: 0;
8
8
  padding: 0;
9
9
  border: none;
@@ -14,7 +14,6 @@
14
14
  mask-size: contain;
15
15
  mask-repeat: no-repeat;
16
16
  vertical-align: -.199em;
17
- align-self: center;
18
17
  color: inherit;
19
18
  }
20
19
 
@@ -1,5 +1,6 @@
1
1
  @import "./_card.css";
2
2
  @import "./_container.css";
3
+ @import "./_grid.css";
3
4
  @import "./_icons.css";
4
- @import "./_pane.css";
5
+ @import "./_content-grid.css";
5
6
  @import "./_sidebar.css";
package/src/index.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Semanticus CSS v1.1.0 (https://semanticus.design/)
2
+ * Semanticus CSS v2.0.0 (https://semanticus.design/)
3
3
  *
4
4
  * A ARIA-centric, semantic HTML — enhanced with components and variants and utilities
5
5
  *
@@ -6,8 +6,4 @@
6
6
  background-color: var(--color-background);
7
7
  height: unset;
8
8
  margin: unset;
9
-
10
- &:popover-open {
11
- display: block !important;
12
- }
13
9
  }
@@ -0,0 +1,126 @@
1
+ [role="search"],
2
+ [role="group"] {
3
+ border-radius: var(--radius);
4
+ box-shadow: var(--group-shadow, 0 0 0 rgba(0, 0, 0, 0));
5
+ display: inline-flex;
6
+ gap: 0;
7
+ margin-bottom: var(--spacing);
8
+ position: relative;
9
+ transition: box-shadow var(--transition);
10
+ vertical-align: middle;
11
+ width: 100%;
12
+
13
+ & > *:not(details),
14
+ & input:not([type="checkbox"], [type="radio"]),
15
+ & select {
16
+ position: relative;
17
+ flex: 1 1 auto;
18
+ margin-bottom: 0;
19
+
20
+ &:not(:first-child) {
21
+ /* when a button is next to an input that has a border */
22
+ margin-left: calc(var(--border-size) * -1);
23
+ border-top-left-radius: 0;
24
+ border-bottom-left-radius: 0;
25
+ }
26
+
27
+ &:not(:last-child) {
28
+ border-top-right-radius: 0;
29
+ border-bottom-right-radius: 0;
30
+ }
31
+
32
+ &:focus {
33
+ z-index: 2;
34
+ }
35
+ }
36
+
37
+ & button,
38
+ & [type="submit"],
39
+ & [type="reset"],
40
+ & [type="button"],
41
+ & [role="button"] {
42
+ width: auto;
43
+ }
44
+
45
+ /* Details dropdown inside group */
46
+ & > details {
47
+ position: relative;
48
+ margin-bottom: 0;
49
+ /* Constrain details height to just the button, not the dropdown menu */
50
+ height: calc(
51
+ 1rem * var(--line-height) + var(--input-spacing-vertical) *
52
+ 2 + var(--border-size) * 2
53
+ );
54
+ overflow: visible;
55
+
56
+ &:not(:first-child) {
57
+ margin-left: calc(var(--border-size) * -1);
58
+
59
+ & > summary {
60
+ border-top-left-radius: 0;
61
+ border-bottom-left-radius: 0;
62
+ }
63
+ }
64
+
65
+ &:not(:last-child) > summary {
66
+ border-top-right-radius: 0;
67
+ border-bottom-right-radius: 0;
68
+ }
69
+
70
+ & > summary:focus {
71
+ z-index: 2;
72
+ }
73
+
74
+ /* Ensure consistent height with other form elements in the group */
75
+ & > summary[role="button"] {
76
+ display: flex;
77
+ align-items: center;
78
+ height: 100%;
79
+
80
+ &::after {
81
+ height: calc(1rem * var(--line-height, 1.5));
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ @supports selector(:has(*)) {
88
+ [role="search"],
89
+ [role="group"] {
90
+ &:has(
91
+ button:focus,
92
+ [type="submit"]:focus,
93
+ [type="button"]:focus,
94
+ [role="button"]:focus
95
+ ) {
96
+ --group-shadow: var(--group-shadow-focus-button);
97
+
98
+ & input:not([type="checkbox"], [type="radio"]),
99
+ & select {
100
+ border-color: transparent;
101
+ }
102
+ }
103
+
104
+ &:has(input:not([type="submit"], [type="button"]):focus, select:focus) {
105
+ --group-shadow: var(--group-shadow-focus-input);
106
+
107
+ & button,
108
+ & [type="submit"],
109
+ & [type="button"],
110
+ & [role="button"] {
111
+ --button-shadow: 0 0 0 var(--border-size)
112
+ var(--color-primary-fill);
113
+ --button-shadow-hover: 0 0 0 var(--border-size)
114
+ var(--color-primary-fill-hover);
115
+ }
116
+ }
117
+
118
+ & button:focus,
119
+ & [type="submit"]:focus,
120
+ & [type="reset"]:focus,
121
+ & [type="button"]:focus,
122
+ & [role="button"]:focus {
123
+ box-shadow: none;
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,14 @@
1
+ /* [role="search"] shares most of its styles with [role="group"] */
2
+ /* See _role-group.css for the shared styles */
3
+
4
+ [role="search"] {
5
+ & > :first-child {
6
+ border-top-left-radius: 5rem;
7
+ border-bottom-left-radius: 5rem;
8
+ }
9
+
10
+ & > :last-child {
11
+ border-top-right-radius: 5rem;
12
+ border-bottom-right-radius: 5rem;
13
+ }
14
+ }
@@ -8,6 +8,31 @@
8
8
  --alert-size: var(--border-size);
9
9
 
10
10
  color: var(--color-text);
11
+ display: grid;
12
+ grid-template-columns: 1fr;
13
+ gap: calc(var(--nav-link-gap) * 1.5);
14
+ align-items: start;
15
+
16
+ &:empty {
17
+ display: none;
18
+ }
19
+
20
+ &:has(> :nth-child(2):last-child) {
21
+ grid-template-columns: 1fr auto;
22
+
23
+ &:has(> :first-child:empty) {
24
+ display: none;
25
+ }
26
+ }
27
+
28
+ &:has(> :nth-child(3):last-child) {
29
+ grid-template-columns: auto 1fr auto;
30
+
31
+ &:has(> :nth-child(2):empty) {
32
+ display: none;
33
+ }
34
+ }
35
+
11
36
  padding: var(--spacing);
12
37
  margin-bottom: var(--spacing);
13
38
  border-radius: var(--radius);
@@ -15,12 +40,21 @@
15
40
  border-inline-start-width: var(--alert-size);
16
41
  border-inline-start-color: var(--dialog-border);
17
42
  background: var(--color-background);
18
- position: relative;
19
43
 
20
44
  &:is(.ghost, .subtle) {
21
45
  --alert-size: calc(var(--border-size) * 4);
22
46
  }
23
47
 
48
+ > * {
49
+ margin: 0 !important;
50
+ }
51
+
52
+ [class^="icon-"],
53
+ [class*=" icon-"] {
54
+ position: relative;
55
+ top: 4px;
56
+ }
57
+
24
58
  /* Opening animation using @starting-style (Chrome 117+, Firefox 129+, Safari 17.4+) */
25
59
  /* Gracefully degrades to instant appearance in unsupported browsers */
26
60
  transition: opacity 0.2s ease-in-out, top 0.2s ease-in-out, right 0.2s ease-in-out, left 0.2s ease-in-out, bottom 0.2s ease-in-out;
@@ -35,7 +69,7 @@
35
69
  margin: var(--spacing);
36
70
 
37
71
  &:popover-open {
38
- display: flex;
72
+ display: grid;
39
73
  }
40
74
 
41
75
  &[data-placement="top-start"] {
@@ -4,7 +4,6 @@ summary {
4
4
 
5
5
  details {
6
6
  display: block;
7
- margin-bottom: var(--spacing);
8
7
 
9
8
  & summary {
10
9
  line-height: 1rem;
@@ -8,8 +8,12 @@ nav {
8
8
  justify-content: space-between;
9
9
  overflow: visible;
10
10
 
11
- & > * {
11
+ > * {
12
12
  margin: 0 !important;
13
+
14
+ &:only-child {
15
+ flex-grow: 1;
16
+ }
13
17
  }
14
18
 
15
19
  &[aria-label=breadcrumb] {
@@ -2,9 +2,9 @@
2
2
  @import "./attributes/_aria-disabled.css";
3
3
  @import "./attributes/_hidden.css";
4
4
  @import "./attributes/_popover.css";
5
- @import "./attributes/_role-group-search.css";
5
+ @import "./attributes/_role-group.css";
6
+ @import "./attributes/_role-search.css";
6
7
  @import "./attributes/_role-status-alert.css";
7
- @import "./attributes/_role-toolbar.css";
8
8
  @import "./attributes/_role-tooltip.css";
9
9
 
10
10
  @import "./elements/_abbr.css";
@@ -6,6 +6,10 @@
6
6
  box-shadow: var(--shadow-sm) !important;
7
7
  }
8
8
 
9
+ .shadow-md {
10
+ box-shadow: var(--shadow-md) !important;
11
+ }
12
+
9
13
  .shadow-lg {
10
14
  box-shadow: var(--shadow-lg) !important;
11
15
  }
@@ -220,7 +220,7 @@
220
220
 
221
221
  /* === Dialog / Alert tokens === */
222
222
  --dialog-fill: light-dark(var(--color-background), var(--color-slate-900));
223
- --dialog-border: light-dark(var(--color-border), var(--color-slate-900));
223
+ --dialog-border: var(--color-border);
224
224
  --dialog-shadow: var(--shadow);
225
225
  --dialog-section-fill: light-dark(
226
226
  color-mix(in srgb, var(--color-slate-50) 25%, white),
@@ -1,6 +1,17 @@
1
- :where(a:not([role="button"])),
2
- [role="link"] {
3
- &.contrast {
1
+ .contrast {
2
+ &:not(a:not([role="button"]), [role="link"]) {
3
+ --color-background: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
4
+ --border-color: oklch(from var(--color-contrast-fill) l c h / var(--color-border-opacity));
5
+ --color-text: oklch(from var(--color-contrast-on-fill) l c h / var(--color-text-opacity));
6
+ --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
7
+
8
+ --dialog-fill: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
9
+ --dialog-border: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
10
+ --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-50), var(--color-slate-900)), transparent 90%);
11
+ --dialog-section-border: color-mix(in srgb, light-dark(var(--color-slate-50), black), transparent 95%);
12
+ }
13
+
14
+ &:is(a:not([role="button"]), [role="link"]) {
4
15
  --color-text: oklch(from var(--color-contrast-text) l c h / var(--color-text-opacity));
5
16
  --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
6
17
 
@@ -8,17 +19,8 @@
8
19
  --color-text: oklch(from var(--color-contrast-text-hover) l c h / var(--color-text-opacity));
9
20
  }
10
21
  }
11
- }
12
22
 
13
- .contrast:not([role="link"], a:not([role="button"])) {
14
- --color-background: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
15
- --border-color: oklch(from var(--color-contrast-fill) l c h / var(--color-border-opacity));
16
- --color-text: oklch(from var(--color-contrast-on-fill) l c h / var(--color-text-opacity));
17
- --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
18
- }
19
-
20
- :is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
21
- &.contrast {
23
+ &:is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
22
24
  &:is([aria-current]:not([aria-current="false"]), :hover, :active, :focus) {
23
25
  --color-background: oklch(from var(--color-contrast-fill-hover) l c h / var(--color-background-opacity));
24
26
  --border-color: oklch(from var(--color-contrast-fill-hover) l c h / var(--color-border-opacity));
@@ -32,13 +34,6 @@
32
34
  }
33
35
  }
34
36
 
35
- :is(.card, .pane, [role="status"], [role="alert"]).contrast {
36
- --dialog-fill: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
37
- --dialog-border: oklch(from var(--color-contrast-fill) l c h / var(--color-background-opacity));
38
- --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-50), var(--color-slate-900)), transparent 90%);
39
- --dialog-section-border: color-mix(in srgb, light-dark(var(--color-slate-50), black), transparent 95%);
40
- }
41
-
42
37
  /* Accordion chevron override */
43
38
  details summary[role="button"].contrast::after {
44
39
  @container style(--theme: dark) {
@@ -1,6 +1,16 @@
1
- :where(a:not([role="button"])),
2
- [role="link"] {
3
- &.danger {
1
+ .danger {
2
+ &:not(a:not([role="button"]), [role="link"]) {
3
+ --color-background: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
4
+ --border-color: oklch(from var(--color-danger-fill) l c h / var(--color-border-opacity));
5
+ --color-text: oklch(from var(--color-danger-on-fill) l c h / var(--color-text-opacity));
6
+ --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
7
+
8
+ --dialog-fill: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
9
+ --dialog-border: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
10
+ --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-900), var(--color-slate-50)), transparent 90%);
11
+ }
12
+
13
+ &:is(a:not([role="button"]), [role="link"]) {
4
14
  --color-text: oklch(from var(--color-danger-text) l c h / var(--color-text-opacity));
5
15
  --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
6
16
 
@@ -8,17 +18,8 @@
8
18
  --color-text: oklch(from var(--color-danger-text-hover) l c h / var(--color-text-opacity));
9
19
  }
10
20
  }
11
- }
12
21
 
13
- .danger:not([role="link"], a:not([role="button"])) {
14
- --color-background: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
15
- --border-color: oklch(from var(--color-danger-fill) l c h / var(--color-border-opacity));
16
- --color-text: oklch(from var(--color-danger-on-fill) l c h / var(--color-text-opacity));
17
- --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
18
- }
19
-
20
- :is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
21
- &.danger {
22
+ &:is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
22
23
  &:is([aria-current]:not([aria-current="false"]), :hover, :active, :focus) {
23
24
  --color-background: oklch(from var(--color-danger-fill-hover) l c h / var(--color-background-opacity));
24
25
  --border-color: oklch(from var(--color-danger-fill-hover) l c h / var(--color-border-opacity));
@@ -31,9 +32,3 @@
31
32
  }
32
33
  }
33
34
  }
34
-
35
- :is(.card, .pane, [role="status"], [role="alert"]).danger {
36
- --dialog-fill: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
37
- --dialog-border: oklch(from var(--color-danger-fill) l c h / var(--color-background-opacity));
38
- --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-900), var(--color-slate-50)), transparent 90%);
39
- }
@@ -1,6 +1,16 @@
1
- :where(a:not([role="button"])),
2
- [role="link"] {
3
- &.info {
1
+ .info {
2
+ &:not(a:not([role="button"]), [role="link"]) {
3
+ --color-background: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
4
+ --border-color: oklch(from var(--color-info-fill) l c h / var(--color-border-opacity));
5
+ --color-text: oklch(from var(--color-info-on-fill) l c h / var(--color-text-opacity));
6
+ --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
7
+
8
+ --dialog-fill: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
9
+ --dialog-border: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
10
+ --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-900), var(--color-slate-50)), transparent 90%);
11
+ }
12
+
13
+ &:is(a:not([role="button"]), [role="link"]) {
4
14
  --color-text: oklch(from var(--color-info-text) l c h / var(--color-text-opacity));
5
15
  --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
6
16
 
@@ -8,17 +18,8 @@
8
18
  --color-text: oklch(from var(--color-info-text-hover) l c h / var(--color-text-opacity));
9
19
  }
10
20
  }
11
- }
12
21
 
13
- .info:not([role="link"], a:not([role="button"])) {
14
- --color-background: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
15
- --border-color: oklch(from var(--color-info-fill) l c h / var(--color-border-opacity));
16
- --color-text: oklch(from var(--color-info-on-fill) l c h / var(--color-text-opacity));
17
- --color-text-muted: color-mix(in srgb, var(--color-text), transparent 40%);
18
- }
19
-
20
- :is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
21
- &.info {
22
+ &:is(button, [type="submit"], [type="button"], [role="button"]):not([role="link"]) {
22
23
  &:is([aria-current]:not([aria-current="false"]), :hover, :active, :focus) {
23
24
  --color-background: oklch(from var(--color-info-fill-hover) l c h / var(--color-background-opacity));
24
25
  --border-color: oklch(from var(--color-info-fill-hover) l c h / var(--color-border-opacity));
@@ -31,9 +32,3 @@
31
32
  }
32
33
  }
33
34
  }
34
-
35
- :is(.card, .pane, [role="status"], [role="alert"]).info {
36
- --dialog-fill: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
37
- --dialog-border: oklch(from var(--color-info-fill) l c h / var(--color-background-opacity));
38
- --dialog-section-fill: color-mix(in srgb, light-dark(var(--color-slate-900), var(--color-slate-50)), transparent 90%);
39
- }