actual-css 0.1.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 (129) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +166 -0
  4. package/dist/actual.css +4929 -0
  5. package/dist/actual.js +3 -0
  6. package/dist/actual.js.map +31 -0
  7. package/dist/actual.min.css +1 -0
  8. package/docs/README.md +26 -0
  9. package/docs/components.md +860 -0
  10. package/docs/design-notes/accessibility-decisions.md +32 -0
  11. package/docs/design-notes/browser-support.md +93 -0
  12. package/docs/design-notes/cascade-layer.md +52 -0
  13. package/docs/design-notes/css-anchor.md +33 -0
  14. package/docs/design-notes/naming.md +37 -0
  15. package/docs/design-notes/previous-work.md +5 -0
  16. package/docs/design-notes/references.md +324 -0
  17. package/docs/forms.md +1265 -0
  18. package/docs/javascript.md +426 -0
  19. package/docs/layout.md +480 -0
  20. package/docs/mental-model.md +73 -0
  21. package/docs/patterns.md +415 -0
  22. package/docs/reserved.md +7 -0
  23. package/docs/tokens.md +455 -0
  24. package/docs/typography.md +159 -0
  25. package/docs/ui.md +937 -0
  26. package/docs/utilities.md +384 -0
  27. package/llms.txt +17 -0
  28. package/package.json +101 -0
  29. package/src/css/actual.css +17 -0
  30. package/src/css/actual.full.css +2 -0
  31. package/src/css/actual.layer.css +3 -0
  32. package/src/css/base.css +70 -0
  33. package/src/css/components/accordion.css +97 -0
  34. package/src/css/components/actions.css +21 -0
  35. package/src/css/components/alert.css +137 -0
  36. package/src/css/components/avatar.css +199 -0
  37. package/src/css/components/badge.css +143 -0
  38. package/src/css/components/breadcrumb.css +56 -0
  39. package/src/css/components/busy.css +44 -0
  40. package/src/css/components/button.css +216 -0
  41. package/src/css/components/card.css +140 -0
  42. package/src/css/components/drawer.css +122 -0
  43. package/src/css/components/flyout.css +243 -0
  44. package/src/css/components/index.css +41 -0
  45. package/src/css/components/join.css +106 -0
  46. package/src/css/components/key.css +25 -0
  47. package/src/css/components/meter.css +81 -0
  48. package/src/css/components/modal.css +162 -0
  49. package/src/css/components/navbar.css +98 -0
  50. package/src/css/components/overline.css +49 -0
  51. package/src/css/components/pagination.css +30 -0
  52. package/src/css/components/progress.css +126 -0
  53. package/src/css/components/scrollspy.css +27 -0
  54. package/src/css/components/skeleton.css +67 -0
  55. package/src/css/components/spinner.css +60 -0
  56. package/src/css/components/status-bar.css +82 -0
  57. package/src/css/components/surface.css +48 -0
  58. package/src/css/components/tab.css +128 -0
  59. package/src/css/components/table.css +64 -0
  60. package/src/css/components/tooltip.css +107 -0
  61. package/src/css/dialog-fallback.css +56 -0
  62. package/src/css/focus.css +13 -0
  63. package/src/css/forms/choice-card.css +158 -0
  64. package/src/css/forms/choice.css +196 -0
  65. package/src/css/forms/control.css +106 -0
  66. package/src/css/forms/custom-select.css +93 -0
  67. package/src/css/forms/form-actions.css +43 -0
  68. package/src/css/forms/form.css +57 -0
  69. package/src/css/forms/index.css +15 -0
  70. package/src/css/forms/input-icon.css +36 -0
  71. package/src/css/forms/native.css +68 -0
  72. package/src/css/forms/select.css +36 -0
  73. package/src/css/forms/switch.css +127 -0
  74. package/src/css/forms/validation.css +63 -0
  75. package/src/css/grid.css +95 -0
  76. package/src/css/intents.css +33 -0
  77. package/src/css/layout.css +80 -0
  78. package/src/css/optional/index.css +5 -0
  79. package/src/css/optional/layout-extra.css +55 -0
  80. package/src/css/optional/scroll-snap.css +51 -0
  81. package/src/css/optional/scroller.css +51 -0
  82. package/src/css/optional/typography-fluid.css +48 -0
  83. package/src/css/optional/utilities-extra.css +289 -0
  84. package/src/css/print.css +47 -0
  85. package/src/css/prose.css +187 -0
  86. package/src/css/reset.css +56 -0
  87. package/src/css/theme.css +186 -0
  88. package/src/css/themes/corporate.css +60 -0
  89. package/src/css/themes/cyberpunk.css +60 -0
  90. package/src/css/themes/dark.css +32 -0
  91. package/src/css/themes/dim.css +33 -0
  92. package/src/css/themes/edge.css +143 -0
  93. package/src/css/themes/forest.css +65 -0
  94. package/src/css/themes/gradient.css +97 -0
  95. package/src/css/themes/index.css +43 -0
  96. package/src/css/themes/lavender.css +66 -0
  97. package/src/css/themes/mono.css +60 -0
  98. package/src/css/themes/neon.css +66 -0
  99. package/src/css/themes/ocean.css +60 -0
  100. package/src/css/themes/petrol.css +64 -0
  101. package/src/css/themes/spruce.css +64 -0
  102. package/src/css/themes/square.css +68 -0
  103. package/src/css/themes/sunset.css +66 -0
  104. package/src/css/tokens.css +122 -0
  105. package/src/css/utilities.css +162 -0
  106. package/src/css/variants.css +118 -0
  107. package/src/js/command.js +165 -0
  108. package/src/js/context-menu.js +291 -0
  109. package/src/js/dialog-fallback.js +163 -0
  110. package/src/js/dialog.js +503 -0
  111. package/src/js/enhance.js +208 -0
  112. package/src/js/events.js +22 -0
  113. package/src/js/filter.js +122 -0
  114. package/src/js/floating.js +462 -0
  115. package/src/js/flyout.js +187 -0
  116. package/src/js/focus.js +35 -0
  117. package/src/js/index.js +26 -0
  118. package/src/js/input.js +47 -0
  119. package/src/js/keys.js +30 -0
  120. package/src/js/mask.js +184 -0
  121. package/src/js/menu.js +88 -0
  122. package/src/js/password.js +98 -0
  123. package/src/js/scrollspy.js +121 -0
  124. package/src/js/selectors.js +59 -0
  125. package/src/js/status.js +158 -0
  126. package/src/js/surface.js +358 -0
  127. package/src/js/tab.js +173 -0
  128. package/src/js/tooltip.js +374 -0
  129. package/src/js/validation.js +419 -0
@@ -0,0 +1,51 @@
1
+ /*
2
+ * Scroll snap — optional horizontal rails for niche card strips and simple
3
+ * touch-friendly overflow areas.
4
+ *
5
+ * This is not a full carousel. For previous/next controls, pagination,
6
+ * active state, drag behavior, looping, or robust desktop mouse interaction,
7
+ * use a dedicated carousel library.
8
+ */
9
+ .scroll-snap {
10
+ --scroll-snap-gap: var(--gap);
11
+ --scroll-snap-align: start;
12
+ --scroll-snap-item-size: auto;
13
+
14
+ display: flex;
15
+ gap: var(--scroll-snap-gap);
16
+ overflow-x: auto;
17
+ }
18
+
19
+ .scroll-snap > * {
20
+ flex: 0 0 var(--scroll-snap-item-size);
21
+ }
22
+
23
+ @supports (scroll-snap-type: x mandatory) {
24
+ .scroll-snap {
25
+ overscroll-behavior-inline: contain;
26
+ scroll-padding-inline: var(--scroll-snap-padding, var(--scroll-snap-gap));
27
+ scroll-snap-type: x mandatory;
28
+ }
29
+
30
+ .scroll-snap > * {
31
+ scroll-snap-align: var(--scroll-snap-align);
32
+ }
33
+
34
+ .scroll-snap[data-snap="center"] {
35
+ --scroll-snap-align: center;
36
+ }
37
+ }
38
+
39
+ @supports (scroll-snap-type: inline mandatory) {
40
+ .scroll-snap {
41
+ scroll-snap-type: inline mandatory;
42
+ }
43
+ }
44
+
45
+ .scroll-snap[data-scrollbar="hidden"] {
46
+ scrollbar-width: none;
47
+ }
48
+
49
+ .scroll-snap[data-scrollbar="hidden"]::-webkit-scrollbar {
50
+ display: none;
51
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ * Scroller — optional custom scrollbar styling for overflow regions.
3
+ *
4
+ * Apply to any scroll container (.overflow-auto, sidebars, long tables). Both
5
+ * stable-color (Firefox) and ::-webkit-scrollbar (Safari/Chromium) are styled;
6
+ * the thumb lands as a thin, theme-aware affordance with a hover state.
7
+ */
8
+ .scroller {
9
+ --scroller-size: 0.625rem;
10
+ --scroller-padding: 0.125rem;
11
+ --scroller-track: transparent;
12
+ --scroller-thumb: var(--border);
13
+ --scroller-thumb-hover: var(--text-muted);
14
+
15
+ scrollbar-color: var(--scroller-thumb) var(--scroller-track);
16
+ scrollbar-width: thin;
17
+ }
18
+
19
+ .scroller::-webkit-scrollbar {
20
+ width: var(--scroller-size);
21
+ height: var(--scroller-size);
22
+ }
23
+
24
+ .scroller::-webkit-scrollbar-track {
25
+ background: var(--scroller-track);
26
+ }
27
+
28
+ .scroller::-webkit-scrollbar-thumb {
29
+ border: var(--scroller-padding) solid transparent;
30
+ border-radius: var(--radius-full);
31
+ background: var(--scroller-thumb);
32
+ background-clip: content-box;
33
+ }
34
+
35
+ @media (hover: hover) {
36
+ .scroller::-webkit-scrollbar-thumb:hover {
37
+ background: var(--scroller-thumb-hover);
38
+ background-clip: content-box;
39
+ }
40
+ }
41
+
42
+ .scroller::-webkit-scrollbar-corner {
43
+ background: var(--scroller-track);
44
+ }
45
+
46
+ @supports (color: color-mix(in oklch, red, white)) {
47
+ .scroller {
48
+ --scroller-thumb: color-mix(in oklch, var(--text-muted), transparent 55%);
49
+ --scroller-thumb-hover: color-mix(in oklch, var(--text-muted), transparent 30%);
50
+ }
51
+ }
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Optional fluid typography module.
3
+ *
4
+ * Not imported by actual.css. Import this file manually after actual.css when
5
+ * you need display, title, and lead sizes that scale with the viewport. Typical
6
+ * use cases: marketing pages, landing pages, hero sections, documentation
7
+ * homepages.
8
+ *
9
+ * Do not use this for body text, app UI, or the default prose scale. Fluid
10
+ * sizing is not the foundation of the typography system — it is a small opt-in
11
+ * surface for display text on content-heavy pages.
12
+ *
13
+ * Public API:
14
+ * --fluid-display, --fluid-title, --fluid-lead (size tokens, clamp())
15
+ * .text-display, .text-title, .text-lead (composed classes)
16
+ *
17
+ * Values are generated from scripts/rfs.ts over the 360px -> 1440px range.
18
+ */
19
+ :root {
20
+ --fluid-display: clamp(2.75rem, calc(2.25rem + 2.222vw), 4.25rem);
21
+ --fluid-title: clamp(2rem, calc(1.75rem + 1.111vw), 2.75rem);
22
+ --fluid-lead: clamp(1.125rem, calc(1.0833rem + 0.185vw), 1.25rem);
23
+ }
24
+
25
+ @supports (inline-size: 100vi) {
26
+ :root {
27
+ --fluid-display: clamp(2.75rem, calc(2.25rem + 2.222vi), 4.25rem);
28
+ --fluid-title: clamp(2rem, calc(1.75rem + 1.111vi), 2.75rem);
29
+ --fluid-lead: clamp(1.125rem, calc(1.0833rem + 0.185vi), 1.25rem);
30
+ }
31
+ }
32
+
33
+ .text-display {
34
+ font-size: var(--fluid-display);
35
+ line-height: var(--line-height-tight);
36
+ text-wrap: balance;
37
+ }
38
+
39
+ .text-title {
40
+ font-size: var(--fluid-title);
41
+ line-height: var(--line-height-tight);
42
+ text-wrap: balance;
43
+ }
44
+
45
+ .text-lead {
46
+ font-size: var(--fluid-lead);
47
+ line-height: var(--line-height-relaxed);
48
+ }
@@ -0,0 +1,289 @@
1
+ /*
2
+ * Optional utility helpers.
3
+ *
4
+ * These classes are intentionally not part of the core API.
5
+ * They are escape hatches for layout nudges, not a full atomic scale.
6
+ *
7
+ * Core principle:
8
+ * - .sm / .lg provide local rhythm through --gap and --variant-space.
9
+ * - utilities consume the current context instead of defining their own -sm/-lg scale.
10
+ * - optional utilities extend core utilities, they do not re-express them.
11
+ * - follow verbose .{property}-{value} naming.
12
+ */
13
+
14
+ /* Display */
15
+ .display-block {
16
+ display: block;
17
+ }
18
+
19
+ .display-inline {
20
+ display: inline;
21
+ }
22
+
23
+ .display-inline-block {
24
+ display: inline-block;
25
+ }
26
+
27
+ .display-flex {
28
+ display: flex;
29
+ }
30
+
31
+ .display-inline-flex {
32
+ display: inline-flex;
33
+ }
34
+
35
+ .display-grid {
36
+ display: grid;
37
+ }
38
+
39
+ /* Position */
40
+ .position-relative {
41
+ position: relative;
42
+ }
43
+
44
+ .position-absolute {
45
+ position: absolute;
46
+ }
47
+
48
+ .position-fixed {
49
+ position: fixed;
50
+ }
51
+
52
+ .position-sticky {
53
+ position: sticky;
54
+ }
55
+
56
+ /* Sizing */
57
+ .inline-size-full {
58
+ inline-size: 100%;
59
+ }
60
+
61
+ .block-size-full {
62
+ block-size: 100%;
63
+ }
64
+
65
+ .min-inline-size-0 {
66
+ min-inline-size: 0;
67
+ }
68
+
69
+ .min-block-size-0 {
70
+ min-block-size: 0;
71
+ }
72
+
73
+ .max-inline-size-none {
74
+ max-inline-size: none;
75
+ }
76
+
77
+ /* Flex / alignment */
78
+ .flex-wrap {
79
+ flex-wrap: wrap;
80
+ }
81
+
82
+ .flex-nowrap {
83
+ flex-wrap: nowrap;
84
+ }
85
+
86
+ .justify-content-start {
87
+ --cluster-justify: flex-start;
88
+ justify-content: flex-start;
89
+ }
90
+
91
+ .justify-content-center {
92
+ --cluster-justify: center;
93
+ justify-content: center;
94
+ }
95
+
96
+ .justify-content-end {
97
+ --cluster-justify: flex-end;
98
+ justify-content: flex-end;
99
+ }
100
+
101
+ .justify-content-space-between {
102
+ --cluster-justify: space-between;
103
+ justify-content: space-between;
104
+ }
105
+
106
+ .align-self-start {
107
+ align-self: start;
108
+ }
109
+
110
+ .align-self-center {
111
+ align-self: center;
112
+ }
113
+
114
+ .align-self-end {
115
+ align-self: end;
116
+ }
117
+
118
+ /* Spacing */
119
+ .padding-context {
120
+ padding: var(--variant-space);
121
+ }
122
+
123
+ .margin-inline-auto {
124
+ margin-inline: auto;
125
+ }
126
+
127
+ .margin-inline-start-auto {
128
+ margin-inline-start: auto;
129
+ }
130
+
131
+ .margin-inline-end-auto {
132
+ margin-inline-end: auto;
133
+ }
134
+
135
+ .margin-block-start-auto {
136
+ margin-block-start: auto;
137
+ }
138
+
139
+ .margin-block-end-auto {
140
+ margin-block-end: auto;
141
+ }
142
+
143
+ .gap-context {
144
+ gap: var(--gap);
145
+ }
146
+
147
+ .row-gap-context {
148
+ row-gap: var(--gap);
149
+ }
150
+
151
+ .column-gap-context {
152
+ column-gap: var(--gap);
153
+ }
154
+
155
+ /* Overflow */
156
+ .overflow-hidden {
157
+ overflow: hidden;
158
+ }
159
+
160
+ .overflow-clip {
161
+ overflow: clip;
162
+ }
163
+
164
+ .overflow-x-auto {
165
+ overflow-x: auto;
166
+ }
167
+
168
+ .overflow-y-auto {
169
+ overflow-y: auto;
170
+ }
171
+
172
+ /* Text */
173
+ .white-space-normal {
174
+ white-space: normal;
175
+ }
176
+
177
+ .text-break {
178
+ overflow-wrap: break-word;
179
+ }
180
+
181
+ .text-uppercase {
182
+ text-transform: uppercase;
183
+ }
184
+
185
+ .text-lowercase {
186
+ text-transform: lowercase;
187
+ }
188
+
189
+ .text-capitalize {
190
+ text-transform: capitalize;
191
+ }
192
+
193
+ .font-weight-normal {
194
+ font-weight: var(--font-weight);
195
+ }
196
+
197
+ .font-weight-medium {
198
+ font-weight: var(--font-weight-medium);
199
+ }
200
+
201
+ .font-weight-strong {
202
+ font-weight: var(--font-weight-strong);
203
+ }
204
+
205
+ .font-weight-bold {
206
+ font-weight: var(--font-weight-bold);
207
+ }
208
+
209
+ /* Radius */
210
+ .radius-sm-context {
211
+ border-radius: var(--radius-sm);
212
+ }
213
+
214
+ .radius-context {
215
+ border-radius: var(--radius);
216
+ }
217
+
218
+ .radius-lg-context {
219
+ border-radius: var(--radius-lg);
220
+ }
221
+
222
+ /* Border */
223
+ .border-context {
224
+ border: var(--border-width) solid var(--border);
225
+ }
226
+
227
+ .border-block-start {
228
+ border-block-start: var(--border-width) solid var(--border);
229
+ }
230
+
231
+ .border-block-end {
232
+ border-block-end: var(--border-width) solid var(--border);
233
+ }
234
+
235
+ .border-inline-start {
236
+ border-inline-start: var(--border-width) solid var(--border);
237
+ }
238
+
239
+ .border-inline-end {
240
+ border-inline-end: var(--border-width) solid var(--border);
241
+ }
242
+
243
+ /* Surface */
244
+ .background-surface {
245
+ background: var(--surface);
246
+ color: var(--text);
247
+ }
248
+
249
+ .background-raised {
250
+ background: var(--surface-raised);
251
+ color: var(--text);
252
+ }
253
+
254
+ .background-subtle {
255
+ background: var(--surface-subtle);
256
+ color: var(--text);
257
+ }
258
+
259
+ /* Shadow */
260
+ .shadow-context {
261
+ box-shadow: var(--shadow);
262
+ }
263
+
264
+ .shadow-popout-context {
265
+ box-shadow: var(--shadow-popout);
266
+ }
267
+
268
+ /* Interaction */
269
+ .cursor-pointer {
270
+ cursor: pointer;
271
+ }
272
+
273
+ .pointer-events-none {
274
+ pointer-events: none;
275
+ }
276
+
277
+ .user-select-none {
278
+ -webkit-user-select: none;
279
+ user-select: none;
280
+ }
281
+
282
+ /* Visibility */
283
+ .display-none {
284
+ display: none;
285
+ }
286
+
287
+ .visibility-hidden {
288
+ visibility: hidden;
289
+ }
@@ -0,0 +1,47 @@
1
+ @media print {
2
+ :root,
3
+ body {
4
+ /* Save some ink in dark mode */
5
+ color-scheme: light;
6
+ background: #fff;
7
+ color: #000;
8
+ }
9
+
10
+ .flyout,
11
+ .tooltip,
12
+ .surface-backdrop,
13
+ .status-bar,
14
+ .spinner,
15
+ dialog.modal[open],
16
+ dialog.drawer[open] {
17
+ display: none !important;
18
+ }
19
+
20
+ button.btn,
21
+ input[type="button"].btn,
22
+ input[type="submit"].btn,
23
+ input[type="reset"].btn {
24
+ display: none !important;
25
+ }
26
+
27
+ a.btn[href^="http"]::after {
28
+ content: " (" attr(href) ")";
29
+ font-size: 0.875em;
30
+ }
31
+
32
+ .card,
33
+ .alert,
34
+ .badge {
35
+ border: var(--border-width) solid CanvasText;
36
+ break-inside: avoid;
37
+ }
38
+
39
+ h1,
40
+ h2,
41
+ h3,
42
+ h4,
43
+ h5,
44
+ h6 {
45
+ break-after: avoid;
46
+ }
47
+ }
@@ -0,0 +1,187 @@
1
+ /*
2
+ * Prose is the opt-in rich text scope for authored content.
3
+ *
4
+ * Global element styles stay mild so app UI is not shaped accidentally. Page
5
+ * layout, forms, cards, navigation, and app tables remain outside this scope.
6
+ */
7
+
8
+ .prose {
9
+ /* Prose scale */
10
+ --prose-size: 1rem;
11
+ --prose-line-height: 1.7;
12
+ --prose-measure: 70ch;
13
+ --prose-flow: 1em;
14
+ --prose-heading-line-height: 1.2;
15
+ --prose-h1: 2rem;
16
+ --prose-h2: 1.5rem;
17
+ --prose-h3: 1.25rem;
18
+ --prose-h4: 1.125rem;
19
+
20
+ max-inline-size: var(--prose-measure);
21
+ color: var(--text);
22
+ font-size: var(--prose-size);
23
+ line-height: var(--prose-line-height);
24
+ overflow-wrap: break-word;
25
+ }
26
+
27
+ .prose :where(p, ul, ol, dl, blockquote, pre, table, figure) {
28
+ margin-block: var(--prose-flow) 0;
29
+ }
30
+
31
+ .prose :where(h1, h2, h3, h4, h5, h6) {
32
+ margin-block: 1.5em 0;
33
+ color: var(--text);
34
+ font-weight: var(--font-weight-strong);
35
+ line-height: var(--prose-heading-line-height);
36
+ }
37
+
38
+ .prose :where(p, li, blockquote) {
39
+ text-wrap: pretty;
40
+ }
41
+
42
+ .prose > :first-child {
43
+ margin-block-start: 0;
44
+ }
45
+
46
+ .prose h1 {
47
+ font-size: var(--prose-h1);
48
+ }
49
+
50
+ .prose h2 {
51
+ font-size: var(--prose-h2);
52
+ }
53
+
54
+ .prose h3 {
55
+ font-size: var(--prose-h3);
56
+ }
57
+
58
+ .prose h4 {
59
+ font-size: var(--prose-h4);
60
+ }
61
+
62
+ .prose a {
63
+ color: var(--primary);
64
+ text-decoration-line: underline;
65
+ text-decoration-thickness: 0.08em;
66
+ text-underline-offset: 0.18em;
67
+ }
68
+
69
+ @media (hover: hover) {
70
+ .prose a:hover {
71
+ text-decoration-thickness: 0.12em;
72
+ }
73
+
74
+ @supports (color: color-mix(in oklch, red, white)) {
75
+ .prose a:hover {
76
+ color: color-mix(in oklch, var(--primary), var(--text) 15%);
77
+ }
78
+ }
79
+ }
80
+
81
+ .prose :where(ul, ol) {
82
+ padding-inline-start: 1.5em;
83
+ }
84
+
85
+ .prose li + li {
86
+ margin-block-start: 0.35em;
87
+ }
88
+
89
+ .prose code {
90
+ padding: 0.15em 0.3em;
91
+ border-radius: var(--radius-sm);
92
+ background: var(--surface-subtle);
93
+ color: var(--text);
94
+ font-size: 0.875em;
95
+ }
96
+
97
+ .prose kbd {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ min-inline-size: 1.75em;
102
+ min-block-size: 1.6em;
103
+ padding-inline: 0.45em;
104
+ border: var(--border-width) solid var(--border);
105
+ border-block-end-width: calc(var(--border-width) * 2);
106
+ border-radius: var(--radius-sm);
107
+ background: var(--surface-raised);
108
+ color: var(--text);
109
+ font-family: var(--font-mono);
110
+ font-size: 0.875em;
111
+ font-weight: var(--font-weight-medium);
112
+ line-height: 1;
113
+ white-space: nowrap;
114
+ vertical-align: 0.08em;
115
+ }
116
+
117
+ .prose pre {
118
+ overflow-x: auto;
119
+ padding: 1em;
120
+ border: var(--border-width) solid var(--border);
121
+ border-radius: var(--radius);
122
+ background: var(--surface-subtle);
123
+ }
124
+
125
+ .prose pre code {
126
+ padding: 0;
127
+ background: transparent;
128
+ }
129
+
130
+ .prose blockquote {
131
+ padding-inline-start: 1em;
132
+ border-inline-start: var(--border-width) solid var(--border);
133
+ color: var(--text-muted);
134
+ }
135
+
136
+ .prose figure {
137
+ margin-inline: 0;
138
+ }
139
+
140
+ .prose figcaption {
141
+ margin-block-start: 0.5em;
142
+ color: var(--text-muted);
143
+ font-size: 0.875em;
144
+ }
145
+
146
+ .prose table {
147
+ inline-size: 100%;
148
+ border-collapse: collapse;
149
+ }
150
+
151
+ .prose th,
152
+ .prose td {
153
+ padding: 0.5em;
154
+ border-block-end: var(--border-width) solid var(--border);
155
+ text-align: start;
156
+ }
157
+
158
+ /* Lead paragraph: a slightly larger, more relaxed reading-introduction text.
159
+ Non-fluid and always available — use .text-lead from the optional fluid
160
+ module for marketing/display surfaces. */
161
+ .lead {
162
+ font-size: 1.125em;
163
+ line-height: var(--line-height-relaxed);
164
+ }
165
+
166
+ /* Readable content measure. Composes with .center for centering or with
167
+ margin-inline: auto for a one-off centered block. */
168
+ .measure {
169
+ max-inline-size: var(--prose-measure, 70ch);
170
+ }
171
+
172
+ .prose.sm {
173
+ --prose-size: 0.9375rem;
174
+ --prose-h1: 1.75rem;
175
+ --prose-h2: 1.375rem;
176
+ --prose-h3: 1.125rem;
177
+ --prose-h4: 1rem;
178
+ }
179
+
180
+ .prose.lg {
181
+ --prose-size: 1.125rem;
182
+ --prose-measure: 72ch;
183
+ --prose-h1: 2.25rem;
184
+ --prose-h2: 1.625rem;
185
+ --prose-h3: 1.375rem;
186
+ --prose-h4: 1.25rem;
187
+ }
@@ -0,0 +1,56 @@
1
+ /* Mild reset: useful defaults without classless magic. */
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ html {
9
+ -webkit-text-size-adjust: 100%;
10
+ }
11
+
12
+ body {
13
+ margin: 0;
14
+ }
15
+
16
+ button,
17
+ input,
18
+ textarea,
19
+ select {
20
+ font: inherit;
21
+ }
22
+
23
+ [hidden]:not([hidden="until-found"]) {
24
+ display: none !important;
25
+ }
26
+
27
+ /* Legacy dialog fallback only. Modern dialogs keep the browser's native closed
28
+ state so display/overlay transitions are not flattened by the reset.
29
+ The presentation for the dialog-fallback.js shim lives in the separate
30
+ dialog-fallback.css, so it can be dropped from custom bundles. */
31
+ @supports not (selector(dialog:modal)) {
32
+ dialog:not([open]) {
33
+ display: none;
34
+ }
35
+ }
36
+
37
+ :where(img, svg, video) {
38
+ max-inline-size: 100%;
39
+ block-size: auto;
40
+ }
41
+
42
+ @media (prefers-reduced-motion: reduce) {
43
+ html {
44
+ scroll-behavior: auto !important;
45
+ }
46
+
47
+ *,
48
+ *::before,
49
+ *::after {
50
+ animation-duration: 0.01ms !important;
51
+ animation-delay: 0s !important;
52
+ animation-iteration-count: 1 !important;
53
+ transition-duration: 0.01ms !important;
54
+ transition-delay: 0s !important;
55
+ }
56
+ }