@semanticus/semanticus-css 0.8.0 → 0.9.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 (73) hide show
  1. package/dist/semanticus-semantics.css +1 -1
  2. package/dist/semanticus.css +2 -2
  3. package/dist/semanticus.size.pico.css +1 -1
  4. package/package.json +11 -8
  5. package/src/semantics/_misc.css +3 -0
  6. package/src/semantics/attributes/_popover.css +13 -0
  7. package/src/semantics/attributes/_role-group-search.css +140 -0
  8. package/src/semantics/elements/_abbr.css +5 -0
  9. package/src/semantics/elements/_address.css +7 -0
  10. package/src/semantics/elements/_article.css +6 -0
  11. package/src/semantics/{_aside.css → elements/_aside.css} +1 -1
  12. package/src/semantics/elements/_blockquote.css +18 -0
  13. package/src/semantics/{_button.css → elements/_button.css} +2 -2
  14. package/src/semantics/{_code.css → elements/_code.css} +10 -7
  15. package/src/semantics/elements/_del.css +3 -0
  16. package/src/semantics/{_details.css → elements/_details.css} +9 -9
  17. package/src/semantics/elements/_dialog.css +117 -0
  18. package/src/semantics/elements/_footer.css +13 -0
  19. package/src/semantics/elements/_header.css +13 -0
  20. package/src/semantics/elements/_headings.css +34 -0
  21. package/src/semantics/elements/_hgroup.css +14 -0
  22. package/src/semantics/{_hr.css → elements/_hr.css} +1 -1
  23. package/src/semantics/{_input.css → elements/_input.css} +1 -2
  24. package/src/semantics/elements/_ins.css +4 -0
  25. package/src/semantics/{_links.css → elements/_links.css} +11 -4
  26. package/src/semantics/elements/_lists.css +22 -0
  27. package/src/semantics/elements/_main.css +7 -0
  28. package/src/semantics/elements/_mark.css +6 -0
  29. package/src/semantics/{_nav.css → elements/_nav.css} +4 -4
  30. package/src/semantics/elements/_p.css +11 -0
  31. package/src/semantics/elements/_section.css +7 -0
  32. package/src/semantics/elements/_strong.css +4 -0
  33. package/src/semantics/elements/_sub.css +7 -0
  34. package/src/semantics/elements/_sup.css +7 -0
  35. package/src/semantics/{_table.css → elements/_table.css} +7 -2
  36. package/src/semantics/modules.css +47 -32
  37. package/src/sizes/pico.css +14 -9
  38. package/src/variables/_colors.css +11 -22
  39. package/src/variables/_components.css +59 -47
  40. package/src/variables/_elements.css +0 -5
  41. package/src/variables/_icons.css +12 -0
  42. package/src/variables/_layout.css +18 -23
  43. package/src/variants/_contrast.css +27 -13
  44. package/src/variants/_ghost.css +35 -28
  45. package/src/variants/_pane-panel-card.css +54 -0
  46. package/src/variants/_secondary.css +24 -11
  47. package/src/variants/_sidebar.css +49 -9
  48. package/src/variants/modules.css +4 -5
  49. package/src/semantics/_article.css +0 -12
  50. package/src/semantics/_dialog.css +0 -157
  51. package/src/semantics/_footer.css +0 -12
  52. package/src/semantics/_header.css +0 -12
  53. package/src/semantics/_main.css +0 -10
  54. package/src/semantics/_role-group-search.css +0 -129
  55. package/src/semantics/_section.css +0 -9
  56. package/src/semantics/_typography.css +0 -146
  57. package/src/variants/_card.css +0 -45
  58. package/src/variants/_panel.css +0 -18
  59. /package/src/semantics/{_aria-busy.css → attributes/_aria-busy.css} +0 -0
  60. /package/src/semantics/{_hidden.css → attributes/_hidden.css} +0 -0
  61. /package/src/semantics/{_role-toolbar.css → attributes/_role-toolbar.css} +0 -0
  62. /package/src/semantics/{_role-tooltip.css → attributes/_role-tooltip.css} +0 -0
  63. /package/src/semantics/{_body.css → elements/_body.css} +0 -0
  64. /package/src/semantics/{_document.css → elements/_document.css} +0 -0
  65. /package/src/semantics/{_embedded.css → elements/_embedded.css} +0 -0
  66. /package/src/semantics/{_figure.css → elements/_figure.css} +0 -0
  67. /package/src/semantics/{_progress.css → elements/_progress.css} +0 -0
  68. /package/src/semantics/{_type-checkbox-radio.css → elements/_type-checkbox-radio.css} +0 -0
  69. /package/src/semantics/{_type-color.css → elements/_type-color.css} +0 -0
  70. /package/src/semantics/{_type-date.css → elements/_type-date.css} +0 -0
  71. /package/src/semantics/{_type-file.css → elements/_type-file.css} +0 -0
  72. /package/src/semantics/{_type-range.css → elements/_type-range.css} +0 -0
  73. /package/src/semantics/{_type-search.css → elements/_type-search.css} +0 -0
@@ -1 +1 @@
1
- :root{--font-family-emoji:"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-sans-serif:system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue", sans-serif, var(--font-family-emoji);--font-family-monospace:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, var(--font-family-emoji);--font-family:var(--font-family-sans-serif);--line-height:1.5;--font-weight:400;--font-size:100%;--text-underline-offset:.1rem;--border-radius:.25rem;--border-width:.0625rem;--outline-width:.125rem;--transition:.2s ease-in-out;--spacing:1rem;--responsive-multiplier:1;--typography-spacing-vertical:1rem;--block-spacing-vertical:var(--spacing);--block-spacing-horizontal:var(--spacing);--grid-column-gap:var(--spacing);--grid-row-gap:var(--spacing);--form-element-spacing-vertical:.75rem;--form-element-spacing-horizontal:1rem;--group-shadow:0 0 0 transparent;--group-shadow-focus-with-button:0 0 0 var(--outline-width) var(--color-primary-focus);--group-shadow-focus-with-input:0 0 0 .0625rem var(--form-border-color);--modal-overlay-backdrop-filter:blur(.375rem);--nav-link-spacing-vertical:.5rem;--nav-link-spacing-horizontal:.5rem;--nav-breadcrumb-divider:">";--sidebar-width:25%}:host{--font-family-emoji:"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-sans-serif:system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue", sans-serif, var(--font-family-emoji);--font-family-monospace:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, var(--font-family-emoji);--font-family:var(--font-family-sans-serif);--line-height:1.5;--font-weight:400;--font-size:100%;--text-underline-offset:.1rem;--border-radius:.25rem;--border-width:.0625rem;--outline-width:.125rem;--transition:.2s ease-in-out;--spacing:1rem;--responsive-multiplier:1;--typography-spacing-vertical:1rem;--block-spacing-vertical:var(--spacing);--block-spacing-horizontal:var(--spacing);--grid-column-gap:var(--spacing);--grid-row-gap:var(--spacing);--form-element-spacing-vertical:.75rem;--form-element-spacing-horizontal:1rem;--group-shadow:0 0 0 transparent;--group-shadow-focus-with-button:0 0 0 var(--outline-width) var(--color-primary-focus);--group-shadow-focus-with-input:0 0 0 .0625rem var(--form-border-color);--modal-overlay-backdrop-filter:blur(.375rem);--nav-link-spacing-vertical:.5rem;--nav-link-spacing-horizontal:.5rem;--nav-breadcrumb-divider:">";--sidebar-width:25%}@media (width>=576px){:root{--font-size:106.25%;--sidebar-width:max(25%, 150px);--responsive-multiplier:1.25}:host{--font-size:106.25%;--sidebar-width:max(25%, 150px);--responsive-multiplier:1.25}}@media (width>=768px){:root{--font-size:112.5%;--sidebar-width:max(22%, 180px);--responsive-multiplier:1.5}:host{--font-size:112.5%;--sidebar-width:max(22%, 180px);--responsive-multiplier:1.5}}@media (width>=1024px){:root{--font-size:118.75%;--sidebar-width:max(20%, 200px);--responsive-multiplier:1.75}:host{--font-size:118.75%;--sidebar-width:max(20%, 200px);--responsive-multiplier:1.75}}@media (width>=1280px){:root{--font-size:125%;--sidebar-width:max(18%, 220px);--responsive-multiplier:2}:host{--font-size:125%;--sidebar-width:max(18%, 220px);--responsive-multiplier:2}}@media (width>=1536px){:root{--font-size:131.25%;--sidebar-width:clamp(240px, 16%, 300px);--responsive-multiplier:2.25}:host{--font-size:131.25%;--sidebar-width:clamp(240px, 16%, 300px);--responsive-multiplier:2.25}}
1
+ :root{--font-family-emoji:"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-sans-serif:system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue", sans-serif, var(--font-family-emoji);--font-family-monospace:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, var(--font-family-emoji);--font-family:var(--font-family-sans-serif);--line-height:1.5;--font-weight:400;--font-size:100%;--text-underline-offset:.1rem;--border-radius:.25rem;--border-width:.0625rem;--outline-width:.125rem;--transition:.2s ease-in-out;--base-spacing:1rem;--responsive-multiplier:1;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--typography-spacing-vertical:1rem;--grid-column-gap:var(--spacing);--grid-row-gap:var(--spacing);--form-element-spacing-vertical:.75rem;--form-element-spacing-horizontal:1rem;--group-shadow:0 0 0 transparent;--group-shadow-focus-with-button:0 0 0 var(--outline-width) var(--color-primary-focus);--group-shadow-focus-with-input:0 0 0 .0625rem var(--form-border-color);--nav-link-spacing:calc(var(--spacing) * .5);--nav-breadcrumb-divider:">";--sidebar-width:25%}:host{--font-family-emoji:"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-sans-serif:system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue", sans-serif, var(--font-family-emoji);--font-family-monospace:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, var(--font-family-emoji);--font-family:var(--font-family-sans-serif);--line-height:1.5;--font-weight:400;--font-size:100%;--text-underline-offset:.1rem;--border-radius:.25rem;--border-width:.0625rem;--outline-width:.125rem;--transition:.2s ease-in-out;--base-spacing:1rem;--responsive-multiplier:1;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--typography-spacing-vertical:1rem;--grid-column-gap:var(--spacing);--grid-row-gap:var(--spacing);--form-element-spacing-vertical:.75rem;--form-element-spacing-horizontal:1rem;--group-shadow:0 0 0 transparent;--group-shadow-focus-with-button:0 0 0 var(--outline-width) var(--color-primary-focus);--group-shadow-focus-with-input:0 0 0 .0625rem var(--form-border-color);--nav-link-spacing:calc(var(--spacing) * .5);--nav-breadcrumb-divider:">";--sidebar-width:25%}@media (width>=576px){:root{--font-size:106.25%;--sidebar-width:max(25%, 150px);--responsive-multiplier:1.25;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}:host{--font-size:106.25%;--sidebar-width:max(25%, 150px);--responsive-multiplier:1.25;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}}@media (width>=768px){:root{--font-size:112.5%;--sidebar-width:max(22%, 180px);--responsive-multiplier:1.5;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}:host{--font-size:112.5%;--sidebar-width:max(22%, 180px);--responsive-multiplier:1.5;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}}@media (width>=1024px){:root{--font-size:118.75%;--sidebar-width:max(20%, 200px);--responsive-multiplier:1.75;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}:host{--font-size:118.75%;--sidebar-width:max(20%, 200px);--responsive-multiplier:1.75;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}}@media (width>=1280px){:root{--font-size:125%;--sidebar-width:max(18%, 220px);--responsive-multiplier:2;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}:host{--font-size:125%;--sidebar-width:max(18%, 220px);--responsive-multiplier:2;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}}@media (width>=1536px){:root{--font-size:131.25%;--sidebar-width:clamp(240px, 16%, 300px);--responsive-multiplier:2.25;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}:host{--font-size:131.25%;--sidebar-width:clamp(240px, 16%, 300px);--responsive-multiplier:2.25;--spacing:calc(var(--base-spacing) * var(--responsive-multiplier));--nav-link-spacing:calc(var(--spacing) * .5)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semanticus/semanticus-css",
3
- "version": "0.8.0",
3
+ "version": "0.9.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",
@@ -63,25 +63,28 @@
63
63
  "src/**/*.css"
64
64
  ],
65
65
  "devDependencies": {
66
- "backstopjs": "^6.3.25",
66
+ "@playwright/test": "^1.59.1",
67
+ "@storybook/addon-docs": "^10.3.6",
68
+ "@storybook/html": "^10.3.5",
69
+ "@storybook/html-vite": "^10.3.5",
70
+ "@types/node": "^25.6.0",
67
71
  "browserslist": "^4.28.2",
68
72
  "highlight.js": "^11.11.1",
69
73
  "lightningcss": "^1.32.0",
70
74
  "lightningcss-cli": "^1.32.0",
71
- "puppeteer": "^23.0.0",
75
+ "storybook": "^10.3.5",
72
76
  "stylelint": "^17.7.0",
73
77
  "stylelint-config-standard": "^40.0.0",
74
78
  "vitepress": "^2.0.0-alpha.17"
75
79
  },
76
80
  "scripts": {
77
- "start": "npm run docs:dev",
78
- "demo": "node scripts/demo.js",
81
+ "start": "npm run build && npm run storybook",
79
82
  "lint": "stylelint \"src/**/*.css\"",
80
83
  "lint:fix": "stylelint \"src/**/*.css\" --fix",
81
- "test": "npx backstopjs test",
82
- "test:snapshot": "npx backstopjs reference",
83
- "test:kill-zombies": "pkill -f '(chrome)?(--headless)'",
84
84
  "check": "npm run lint && npm run build",
85
+ "storybook": "storybook dev -p 6006",
86
+ "test:visual-regression": "npx playwright test",
87
+ "test:update-snapshots": "npx playwright test -u",
85
88
  "prepublishOnly": "npm run lint && npm run build",
86
89
  "release:sync-versions": "node scripts/sync-version-references.js",
87
90
  "build": "npm run build:css && npm run build:palettes && npm run build:sizes && npm run build:update-size-claims",
@@ -0,0 +1,3 @@
1
+ ::selection {
2
+ background-color: var(--color-text-selection);
3
+ }
@@ -0,0 +1,13 @@
1
+ [popover] {
2
+ overflow: auto;
3
+ border: 0;
4
+ padding: 0;
5
+ color: var(--color-text);
6
+ background-color: var(--color-background);
7
+ height: unset;
8
+ margin: unset;
9
+
10
+ &:popover-open {
11
+ display: block !important;
12
+ }
13
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Group ([role="group"], [role="search"])
3
+ */
4
+ [role="search"],
5
+ [role="group"] {
6
+ border-radius: var(--border-radius);
7
+ box-shadow: var(--group-shadow, 0 0 0 rgba(0, 0, 0, 0));
8
+ display: inline-flex;
9
+ gap: 0;
10
+ margin-bottom: var(--spacing);
11
+ position: relative;
12
+ transition: box-shadow var(--transition);
13
+ vertical-align: middle;
14
+ width: 100%;
15
+
16
+ & > *:not(details),
17
+ & input:not([type="checkbox"], [type="radio"]),
18
+ & select {
19
+ position: relative;
20
+ flex: 1 1 auto;
21
+ margin-bottom: 0;
22
+
23
+ &:not(:first-child) {
24
+ margin-left: calc(var(--border-width) * -1);
25
+ border-top-left-radius: 0;
26
+ border-bottom-left-radius: 0;
27
+ }
28
+
29
+ &:not(:last-child) {
30
+ border-top-right-radius: 0;
31
+ border-bottom-right-radius: 0;
32
+ }
33
+
34
+ &:focus {
35
+ z-index: 2;
36
+ }
37
+ }
38
+
39
+ & button,
40
+ & [type="submit"],
41
+ & [type="reset"],
42
+ & [type="button"],
43
+ & [role="button"] {
44
+ width: auto;
45
+ }
46
+
47
+ /* Details dropdown inside group */
48
+ & > details {
49
+ position: relative;
50
+ margin-bottom: 0;
51
+ /* Constrain details height to just the button, not the dropdown menu */
52
+ height: calc(
53
+ 1rem * var(--line-height) + var(--form-element-spacing-vertical) *
54
+ 2 + var(--border-width) * 2
55
+ );
56
+ overflow: visible;
57
+
58
+ &:not(:first-child) {
59
+ margin-left: calc(var(--border-width) * -1);
60
+
61
+ & > summary {
62
+ border-top-left-radius: 0;
63
+ border-bottom-left-radius: 0;
64
+ }
65
+ }
66
+
67
+ &:not(:last-child) > summary {
68
+ border-top-right-radius: 0;
69
+ border-bottom-right-radius: 0;
70
+ }
71
+
72
+ & > summary:focus {
73
+ z-index: 2;
74
+ }
75
+
76
+ /* Ensure consistent height with other form elements in the group */
77
+ & > summary[role="button"] {
78
+ display: flex;
79
+ align-items: center;
80
+ height: 100%;
81
+
82
+ &::after {
83
+ height: calc(1rem * var(--line-height, 1.5));
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ @supports selector(:has(*)) {
90
+ [role="search"],
91
+ [role="group"] {
92
+ &:has(
93
+ button:focus,
94
+ [type="submit"]:focus,
95
+ [type="button"]:focus,
96
+ [role="button"]:focus
97
+ ) {
98
+ --group-shadow: var(--group-shadow-focus-with-button);
99
+
100
+ & input:not([type="checkbox"], [type="radio"]),
101
+ & select {
102
+ border-color: transparent;
103
+ }
104
+ }
105
+
106
+ &:has(input:not([type="submit"], [type="button"]):focus, select:focus) {
107
+ --group-shadow: var(--group-shadow-focus-with-input);
108
+
109
+ & button,
110
+ & [type="submit"],
111
+ & [type="button"],
112
+ & [role="button"] {
113
+ --button-shadow: 0 0 0 var(--border-width)
114
+ var(--color-primary-border);
115
+ --button-shadow-hover: 0 0 0 var(--border-width)
116
+ var(--color-primary-hover-border);
117
+ }
118
+ }
119
+
120
+ & button:focus,
121
+ & [type="submit"]:focus,
122
+ & [type="reset"]:focus,
123
+ & [type="button"]:focus,
124
+ & [role="button"]:focus {
125
+ box-shadow: none;
126
+ }
127
+ }
128
+ }
129
+
130
+ [role="search"] {
131
+ & > :first-child {
132
+ border-top-left-radius: 5rem;
133
+ border-bottom-left-radius: 5rem;
134
+ }
135
+
136
+ & > :last-child {
137
+ border-top-right-radius: 5rem;
138
+ border-bottom-right-radius: 5rem;
139
+ }
140
+ }
@@ -0,0 +1,5 @@
1
+ abbr[title] {
2
+ border-bottom: 1px dotted;
3
+ text-decoration: none;
4
+ cursor: help;
5
+ }
@@ -0,0 +1,7 @@
1
+ address {
2
+ margin-top: 0;
3
+ margin-bottom: var(--typography-spacing-vertical);
4
+ color: var(--color-text);
5
+ font-style: normal;
6
+ font-weight: var(--font-weight);
7
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Article
3
+ */
4
+ article {
5
+ width: 100%;
6
+ }
@@ -5,8 +5,8 @@
5
5
  * In case of a single child, this child will fill the entire height.
6
6
  */
7
7
  aside {
8
- padding-inline: var(--block-spacing-horizontal);
9
8
  width: var(--sidebar-width) !important;
9
+ padding: var(--spacing) !important;
10
10
 
11
11
  :where(ol, ul, li) {
12
12
  align-items: stretch !important;
@@ -0,0 +1,18 @@
1
+ blockquote {
2
+ border-inline-end: none;
3
+ border-inline-start: 0.25rem solid var(--color-border-muted);
4
+ border-left: 0.25rem solid var(--color-border-muted);
5
+ border-right: none;
6
+ color: var(--color-text);
7
+ display: block;
8
+ font-style: normal;
9
+ font-weight: var(--font-weight);
10
+ margin-bottom: var(--typography-spacing-vertical);
11
+ margin-top: 0;
12
+ padding: var(--spacing);
13
+
14
+ & footer {
15
+ margin-top: calc(var(--typography-spacing-vertical) * 0.5);
16
+ color: var(--color-text-muted);
17
+ }
18
+ }
@@ -118,8 +118,8 @@ aside {
118
118
 
119
119
  nav {
120
120
  :where(button, [role=button], [type=button], input:not([type=checkbox], [type=radio], [type=range], [type=file]), select) {
121
- --form-element-spacing-vertical: calc(var(--nav-link-spacing-vertical) - var(--border-width) * 2);
122
- --form-element-spacing-horizontal: var(--nav-link-spacing-horizontal);
121
+ --form-element-spacing-vertical: calc(var(--nav-link-spacing) - var(--border-width) * 2);
122
+ --form-element-spacing-horizontal: var(--nav-link-spacing);
123
123
 
124
124
  height: auto;
125
125
  margin-right: inherit;
@@ -8,8 +8,8 @@ samp {
8
8
  font-size: 0.875em;
9
9
  font-family: var(--font-family);
10
10
  border-radius: var(--border-radius);
11
- background: var(--color-code-bg);
12
- color: var(--color-code-text);
11
+ background: var(--code-bg);
12
+ color: var(--code-color);
13
13
  font-weight: var(--font-weight);
14
14
  line-height: initial;
15
15
  }
@@ -23,10 +23,13 @@ samp {
23
23
 
24
24
  pre {
25
25
  -ms-overflow-style: scrollbar;
26
- overflow: auto;
26
+ color: var(--color-text);
27
27
  display: block;
28
- margin-bottom: var(--spacing);
29
- overflow-x: auto;
28
+ font-style: normal;
29
+ font-weight: var(--font-weight);
30
+ margin-bottom: var(--typography-spacing-vertical);
31
+ margin-top: 0;
32
+ overflow: auto;
30
33
 
31
34
  & code,
32
35
  & samp {
@@ -44,7 +47,7 @@ pre {
44
47
  }
45
48
 
46
49
  kbd {
47
- background-color: var(--color-kbd-bg);
48
- color: var(--color-kbd-text);
50
+ background-color: var(--kbd-bg);
51
+ color: var(--kbd-color);
49
52
  vertical-align: baseline;
50
53
  }
@@ -0,0 +1,3 @@
1
+ del {
2
+ color: rgb(var(--color-danger-rgb));
3
+ }
@@ -173,11 +173,11 @@ details:has(> summary[aria-haspopup="menu"]) {
173
173
  margin: 0;
174
174
  margin-top: var(--outline-width);
175
175
  padding: 0;
176
- border: var(--border-width) solid var(--dropdown-border);
176
+ border: var(--border-width) solid var(--menu-border);
177
177
  border-radius: var(--border-radius);
178
- background-color: var(--dropdown-bg);
179
- box-shadow: var(--dropdown-shadow);
180
- color: var(--dropdown-text);
178
+ background-color: var(--menu-bg);
179
+ box-shadow: var(--menu-shadow);
180
+ color: var(--menu-text);
181
181
  white-space: nowrap;
182
182
  opacity: 0;
183
183
  transition: opacity var(--transition), transform 0s ease-in-out 1s;
@@ -208,7 +208,7 @@ details:has(> summary[aria-haspopup="menu"]) {
208
208
  padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal);
209
209
  overflow: hidden;
210
210
  border-radius: 0;
211
- color: var(--dropdown-text);
211
+ color: var(--menu-text);
212
212
  text-decoration: none;
213
213
  text-overflow: ellipsis;
214
214
 
@@ -217,7 +217,7 @@ details:has(> summary[aria-haspopup="menu"]) {
217
217
  &:active,
218
218
  &:focus-visible,
219
219
  &[aria-current]:not([aria-current=false]) {
220
- background-color: var(--dropdown-hover-bg);
220
+ background-color: var(--menu-hover-bg);
221
221
  }
222
222
  }
223
223
 
@@ -226,7 +226,7 @@ details:has(> summary[aria-haspopup="menu"]) {
226
226
  }
227
227
 
228
228
  &:has(label):hover {
229
- background-color: var(--dropdown-hover-bg);
229
+ background-color: var(--menu-hover-bg);
230
230
  }
231
231
  }
232
232
 
@@ -269,7 +269,7 @@ nav details:has(> summary[aria-haspopup="menu"]) {
269
269
  display: flex;
270
270
  align-items: center;
271
271
  height: auto;
272
- padding: calc(var(--nav-link-spacing-vertical) - var(--border-width) * 2) var(--nav-link-spacing-horizontal);
272
+ padding: calc(var(--nav-link-spacing) - var(--border-width) * 2) var(--nav-link-spacing);
273
273
  }
274
274
 
275
275
  & > :where(summary:not([role]):focus-visible) {
@@ -286,6 +286,6 @@ nav details:has(> summary[aria-haspopup="menu"]) {
286
286
  align-items: center;
287
287
  width: auto;
288
288
  height: auto;
289
- padding: calc(var(--nav-link-spacing-vertical) - var(--border-width) * 2) var(--nav-link-spacing-horizontal);
289
+ padding: calc(var(--nav-link-spacing) - var(--border-width) * 2) var(--nav-link-spacing);
290
290
  }
291
291
  }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Modal (<dialog>)
3
+ */
4
+
5
+ /* Prevent body scroll and interaction when modal is open */
6
+ body:has(dialog[open]) {
7
+ overflow: hidden;
8
+ pointer-events: none;
9
+ touch-action: none;
10
+
11
+ & dialog[open],
12
+ & dialog:target {
13
+ pointer-events: auto;
14
+ touch-action: auto;
15
+ }
16
+ }
17
+
18
+ dialog {
19
+ max-height: calc(100vh - var(--spacing) * 2);
20
+ margin: auto;
21
+ overflow: auto;
22
+ padding: var(--spacing);
23
+ border-radius: var(--border-radius);
24
+ background: var(--pane-bg);
25
+ box-shadow: var(--pane-shadow);
26
+ border: 0;
27
+
28
+ /* Opening animation using @starting-style (Chrome 117+, Firefox 129+, Safari 17.4+) */
29
+ /* Gracefully degrades to instant appearance in unsupported browsers */
30
+ transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out;
31
+
32
+ @media (--breakpoint-sm) {
33
+ max-width: 510px;
34
+ }
35
+
36
+ @media (--breakpoint-md) {
37
+ max-width: 700px;
38
+ }
39
+
40
+ /* Hidden state */
41
+ &:not([open]),
42
+ &[open=false] {
43
+ display: none;
44
+ }
45
+
46
+ /* Backdrop overlay */
47
+ &::backdrop {
48
+ backdrop-filter: var(--backdrop-overlay-filter);
49
+ background-color: var(--backdrop-overlay-bg);
50
+ transition: backdrop-filter 0.2s ease-in-out, background-color 0.2s ease-in-out;
51
+ }
52
+
53
+ > header,
54
+ > footer {
55
+ width: auto;
56
+ margin-inline: calc(var(--spacing) * -1);
57
+ padding-inline: var(--spacing);
58
+ background-color: var(--pane-section-bg);
59
+ }
60
+
61
+ /* Header styling */
62
+ > header {
63
+ margin-top: calc(var(--spacing) * -1);
64
+ border-bottom: var(--border-width) solid var(--pane-section-border);
65
+ border-top-right-radius: var(--border-radius);
66
+ border-top-left-radius: var(--border-radius);
67
+ }
68
+
69
+ /* Footer styling */
70
+ > footer {
71
+ margin-bottom: calc(var(--spacing) * -1);
72
+ border-top: var(--border-width) solid var(--pane-section-border);
73
+ border-bottom-right-radius: var(--border-radius);
74
+ border-bottom-left-radius: var(--border-radius);
75
+ display: flex;
76
+ justify-content: end;
77
+ gap: calc(var(--nav-link-spacing) * 1.5);
78
+ }
79
+
80
+ /* Close button styling */
81
+ [rel=prev] {
82
+ margin: 0;
83
+ padding: 0;
84
+ position: absolute;
85
+ display: block;
86
+ width: 1rem;
87
+ height: 1rem;
88
+ top: calc(var(--spacing) * .66);
89
+ right: var(--spacing);
90
+ border: none;
91
+ border-radius: 0;
92
+ background-image: var(--icon-close);
93
+ background-position: center;
94
+ background-size: auto 1rem;
95
+ background-repeat: no-repeat;
96
+ background-color: transparent;
97
+ box-shadow: none;
98
+ opacity: 0.5;
99
+ transition: opacity var(--transition);
100
+
101
+ &:hover {
102
+ opacity: 1;
103
+ }
104
+ }
105
+ }
106
+
107
+ @starting-style {
108
+ dialog[open] {
109
+ opacity: 0;
110
+ transform: translateY(-20px);
111
+ }
112
+
113
+ dialog[open]::backdrop {
114
+ backdrop-filter: none;
115
+ background-color: transparent;
116
+ }
117
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Footer
3
+ */
4
+ footer {
5
+ width: 100%;
6
+ padding-block: var(--spacing);
7
+ margin-top: var(--spacing);
8
+
9
+ & > * {
10
+ margin-top: 0 !important;
11
+ margin-bottom: 0 !important;
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Header
3
+ */
4
+ header {
5
+ width: 100%;
6
+ padding-block: var(--spacing);
7
+ margin-bottom: var(--spacing);
8
+
9
+ & > * {
10
+ margin-top: 0 !important;
11
+ margin-bottom: 0 !important;
12
+ }
13
+ }
@@ -0,0 +1,34 @@
1
+ h1,
2
+ h2,
3
+ h3,
4
+ h4,
5
+ h5,
6
+ h6 {
7
+ margin-top: 0;
8
+ margin-bottom: var(--typography-spacing-vertical);
9
+ color: var(--color-text);
10
+ font-weight: var(--font-weight);
11
+ font-size: var(--font-size);
12
+ line-height: var(--line-height);
13
+ font-family: var(--font-family);
14
+ }
15
+
16
+ /* Headings - progressive lightness using color-mix */
17
+ h1 { --color-text: var(--color-heading-base); }
18
+ h2 { --color-text: color-mix(in srgb, var(--color-heading-base), white 12%); }
19
+ h3 { --color-text: color-mix(in srgb, var(--color-heading-base), white 22%); }
20
+ h4 { --color-text: color-mix(in srgb, var(--color-heading-base), white 32%); }
21
+ h5 { --color-text: color-mix(in srgb, var(--color-heading-base), white 45%); }
22
+ h6 { --color-text: color-mix(in srgb, var(--color-heading-base), white 55%); }
23
+
24
+ /* Dark mode headings - base is lightest, mix in black for lower levels */
25
+ [data-theme="dark"] h1 { --color-text: var(--color-heading-base); }
26
+ [data-theme="dark"] h2 { --color-text: color-mix(in srgb, var(--color-heading-base), black 8%); }
27
+ [data-theme="dark"] h3 { --color-text: color-mix(in srgb, var(--color-heading-base), black 18%); }
28
+ [data-theme="dark"] h4 { --color-text: color-mix(in srgb, var(--color-heading-base), black 28%); }
29
+ [data-theme="dark"] h5 { --color-text: color-mix(in srgb, var(--color-heading-base), black 38%); }
30
+ [data-theme="dark"] h6 { --color-text: color-mix(in srgb, var(--color-heading-base), black 48%); }
31
+
32
+ :where(article, address, blockquote, dl, figure, form, ol, p, pre, table, ul, hr) ~ :is(h1, h2, h3, h4, h5, h6) {
33
+ margin-top: var(--typography-spacing-top);
34
+ }
@@ -0,0 +1,14 @@
1
+ hgroup {
2
+ margin-bottom: var(--typography-spacing-vertical);
3
+
4
+ & > * {
5
+ margin-top: 0;
6
+ margin-bottom: 0;
7
+
8
+ &:not(:first-child):last-child {
9
+ color: color-mix(in srgb, var(--color-text), rgb(128, 128, 128) 70%);
10
+ --font-weight: unset;
11
+ font-size: 1rem;
12
+ }
13
+ }
14
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Misc
2
+ * Horizontal Rule
3
3
  */
4
4
  hr {
5
5
  height: 0;
@@ -84,8 +84,7 @@ input:not([type=checkbox], [type=radio], [type=range]) {
84
84
 
85
85
  fieldset {
86
86
  width: 100%;
87
- margin: 0;
88
- margin-bottom: var(--spacing);
87
+ margin: 0 ;
89
88
  padding: 0;
90
89
  border: 0;
91
90
  }
@@ -0,0 +1,4 @@
1
+ ins {
2
+ color: rgb(var(--color-success-rgb));
3
+ text-decoration: none;
4
+ }
@@ -3,20 +3,27 @@
3
3
  */
4
4
  :where(a:not([role=button])),
5
5
  [role=link] {
6
- --color-text: rgb(var(--color-primary-rgb));
7
6
  --color-background: transparent;
7
+ --border-color: transparent;
8
+ --color-text: rgb(var(--color-primary-rgb));
9
+ --shadow-lg: transparent;
8
10
  --underline: var(--color-primary-underline);
9
11
  outline: none;
12
+ padding: 0;
10
13
  background-color: var(--color-background);
11
14
  color: var(--color-text);
12
15
  text-decoration: var(--text-decoration);
13
16
  text-decoration-color: var(--underline);
14
17
  text-underline-offset: 0.125em;
15
18
  transition: background-color var(--transition), color var(--transition), text-decoration var(--transition), box-shadow var(--transition);
16
- }
17
19
 
18
- :where(a:not([role=button])),
19
- [role=link] {
20
+ &:is(:hover, :active, :focus) {
21
+ --color-background: transparent;
22
+ --border-color: transparent;
23
+ --color-text: rgb(var(--color-primary-rgb));
24
+ --shadow-lg: transparent;
25
+ }
26
+
20
27
  &:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) {
21
28
  --color-text: var(--color-primary-hover);
22
29
  --underline: var(--color-primary-hover-underline);
@@ -0,0 +1,22 @@
1
+ dl,
2
+ ol,
3
+ ul {
4
+ margin-top: 0;
5
+ margin-bottom: var(--typography-spacing-vertical);
6
+ color: var(--color-text);
7
+ font-style: normal;
8
+ font-weight: var(--font-weight);
9
+ }
10
+
11
+ :where(ol, ul) li {
12
+ margin-bottom: calc(var(--typography-spacing-vertical) * 0.25);
13
+ }
14
+
15
+ :where(dl, ol, ul) :where(dl, ol, ul) {
16
+ margin: 0;
17
+ margin-top: calc(var(--typography-spacing-vertical) * 0.25);
18
+ }
19
+
20
+ ul li {
21
+ list-style: square;
22
+ }