@ponchia/ui 0.2.1 → 0.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.
package/css/base.css CHANGED
@@ -24,7 +24,7 @@ body {
24
24
  background: var(--bg);
25
25
  color: var(--text);
26
26
  margin: 0;
27
- min-height: 100vh;
27
+ min-block-size: 100vh;
28
28
  position: relative;
29
29
  }
30
30
 
@@ -58,7 +58,7 @@ textarea {
58
58
  img,
59
59
  svg {
60
60
  display: block;
61
- max-width: 100%;
61
+ max-inline-size: 100%;
62
62
  }
63
63
 
64
64
  p,
@@ -134,13 +134,13 @@ pre code {
134
134
 
135
135
  hr {
136
136
  border: 0;
137
- border-top: 1px solid var(--line);
137
+ border-block-start: 1px solid var(--line);
138
138
  margin: var(--space-lg) 0;
139
139
  }
140
140
 
141
141
  ::-webkit-scrollbar {
142
- height: 10px;
143
- width: 10px;
142
+ block-size: 10px;
143
+ inline-size: 10px;
144
144
  }
145
145
 
146
146
  ::-webkit-scrollbar-thumb {
@@ -170,15 +170,15 @@ textarea:focus-visible,
170
170
  border: 1px solid var(--line-strong);
171
171
  border-radius: var(--radius-md);
172
172
  color: var(--text);
173
- left: 1rem;
173
+ inset-inline-start: 1rem;
174
174
  padding: 0.7rem 1rem;
175
175
  position: fixed;
176
- top: -4rem;
176
+ inset-block-start: -4rem;
177
177
  z-index: 40;
178
178
  }
179
179
 
180
180
  .skip-link:focus {
181
- top: 1rem;
181
+ inset-block-start: 1rem;
182
182
  }
183
183
 
184
184
  /* Small global helpers reused across apps. */
@@ -198,9 +198,129 @@ textarea:focus-visible,
198
198
  .ui-visually-hidden {
199
199
  clip: rect(0 0 0 0);
200
200
  clip-path: inset(50%);
201
- height: 1px;
201
+ block-size: 1px;
202
202
  overflow: hidden;
203
203
  position: absolute;
204
204
  white-space: nowrap;
205
- width: 1px;
205
+ inline-size: 1px;
206
+ }
207
+
208
+ /* --------------------------------------------------------------------------
209
+ Forced colors (Windows High Contrast). The OS replaces the palette and
210
+ strips backgrounds/shadows, so any state signalled only by a fill goes
211
+ invisible. Re-assert those with system colors so meaning survives.
212
+ -------------------------------------------------------------------------- */
213
+ @media (forced-colors: active) {
214
+ .ui-progress__bar,
215
+ .ui-dotbar i.is-on,
216
+ .ui-dotspinner i {
217
+ background: Highlight;
218
+ }
219
+
220
+ .ui-dot,
221
+ .ui-dot--accent,
222
+ .ui-dot--success,
223
+ .ui-dot--warning,
224
+ .ui-dot--danger,
225
+ .ui-switch__thumb {
226
+ background: CanvasText;
227
+ }
228
+
229
+ .ui-dot--live::after {
230
+ border-color: CanvasText;
231
+ }
232
+
233
+ .ui-switch input:checked + .ui-switch__track,
234
+ .ui-segmented__option:has(input:checked) {
235
+ outline: 2px solid Highlight;
236
+ outline-offset: -2px;
237
+ }
238
+
239
+ /* Keyboard focus must never depend on a colour that gets overridden. */
240
+ a:focus-visible,
241
+ button:focus-visible,
242
+ summary:focus-visible,
243
+ input:focus-visible,
244
+ select:focus-visible,
245
+ textarea:focus-visible,
246
+ [tabindex]:focus-visible {
247
+ outline: 2px solid Highlight;
248
+ }
249
+ }
250
+
251
+ /* --------------------------------------------------------------------------
252
+ Print — ink on white, no chrome, no page-break scars. The framework
253
+ dresses content sites too, so a clean printout / PDF matters.
254
+ -------------------------------------------------------------------------- */
255
+ @media print {
256
+ html,
257
+ body {
258
+ background: #fff;
259
+ color: #000;
260
+ }
261
+
262
+ /* Decorative / interactive chrome never prints. */
263
+ .ui-dotfield,
264
+ .ui-toast-stack,
265
+ .app-rail,
266
+ .app-topbar,
267
+ .site-nav,
268
+ .theme-toggle__button,
269
+ .site-menu,
270
+ .ui-spinner,
271
+ .ui-dotloader,
272
+ .ui-dotspinner,
273
+ dialog.ui-modal::backdrop {
274
+ display: none !important;
275
+ }
276
+
277
+ /* Flat ink: drop shadows/fills, keep hairlines as real rules. */
278
+ *,
279
+ *::before,
280
+ *::after {
281
+ box-shadow: none !important;
282
+ text-shadow: none !important;
283
+ }
284
+
285
+ .ui-card,
286
+ .ui-panel,
287
+ .ui-surface,
288
+ .ui-alert,
289
+ .ui-table-wrap {
290
+ border: 1px solid #999;
291
+ }
292
+
293
+ /* Scroll containers must spill on paper, not clip. */
294
+ .ui-table-wrap,
295
+ .ui-prose table,
296
+ .ui-tabs__list,
297
+ pre {
298
+ overflow: visible !important;
299
+ }
300
+
301
+ /* Do not split atomic blocks across pages. */
302
+ .ui-card,
303
+ .ui-panel,
304
+ .ui-alert,
305
+ figure,
306
+ blockquote,
307
+ pre,
308
+ tr {
309
+ break-inside: avoid;
310
+ }
311
+
312
+ :is(h1, h2, h3, h4, h5, h6) {
313
+ break-after: avoid;
314
+ }
315
+
316
+ /* Long-form: surface link targets when printed. */
317
+ .ui-prose a[href^="http"]::after {
318
+ content: " (" attr(href) ")";
319
+ font-size: 0.85em;
320
+ word-break: break-all;
321
+ }
322
+
323
+ @page {
324
+ margin: 18mm;
325
+ }
206
326
  }
package/css/cards.css CHANGED
@@ -39,7 +39,7 @@
39
39
  font-family: var(--display);
40
40
  font-size: 1.85rem;
41
41
  letter-spacing: 0;
42
- margin-top: 0.35rem;
42
+ margin-block-start: 0.35rem;
43
43
  }
44
44
 
45
45
  .metric-tile p,
@@ -58,8 +58,8 @@
58
58
 
59
59
  .notes-strip {
60
60
  align-items: center;
61
- border-bottom: 1px solid var(--line);
62
- border-top: 1px solid var(--line);
61
+ border-block-end: 1px solid var(--line);
62
+ border-block-start: 1px solid var(--line);
63
63
  display: grid;
64
64
  gap: 1.2rem;
65
65
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
@@ -77,11 +77,11 @@
77
77
  }
78
78
 
79
79
  .notes-strip__latest {
80
- border-left: 1px solid var(--line);
80
+ border-inline-start: 1px solid var(--line);
81
81
  display: grid;
82
82
  gap: 0.45rem;
83
- min-width: 0;
84
- padding-left: 1.2rem;
83
+ min-inline-size: 0;
84
+ padding-inline-start: 1.2rem;
85
85
  }
86
86
 
87
87
  .notes-strip__topline {
@@ -106,7 +106,7 @@
106
106
 
107
107
  .section-head p {
108
108
  margin: 0;
109
- max-width: 60ch;
109
+ max-inline-size: 60ch;
110
110
  }
111
111
 
112
112
  .section-head--stacked {
@@ -116,7 +116,7 @@
116
116
 
117
117
  .project-card__category {
118
118
  color: var(--text-dim);
119
- margin-top: 0.15rem;
119
+ margin-block-start: 0.15rem;
120
120
  }
121
121
 
122
122
  .project-category-label {
@@ -129,12 +129,12 @@
129
129
  display: inline-block;
130
130
  fill: none;
131
131
  flex: 0 0 auto;
132
- height: 1em;
132
+ block-size: 1em;
133
133
  stroke: currentColor;
134
134
  stroke-linecap: round;
135
135
  stroke-linejoin: round;
136
136
  stroke-width: 2;
137
- width: 1em;
137
+ inline-size: 1em;
138
138
  }
139
139
 
140
140
  .project-card__summary,
@@ -167,10 +167,10 @@
167
167
  }
168
168
 
169
169
  .misc-card__boundary {
170
- border-top: 1px solid var(--line);
170
+ border-block-start: 1px solid var(--line);
171
171
  display: grid;
172
172
  gap: 0.35rem;
173
- padding-top: 0.85rem;
173
+ padding-block-start: 0.85rem;
174
174
  }
175
175
 
176
176
  .misc-card__boundary p {
@@ -186,7 +186,7 @@
186
186
 
187
187
  .post-card h3 {
188
188
  font-size: 1.45rem;
189
- margin-top: 0.35rem;
189
+ margin-block-start: 0.35rem;
190
190
  }
191
191
 
192
192
  .post-card p {
@@ -194,7 +194,7 @@
194
194
  }
195
195
 
196
196
  .contact-stub-card {
197
- max-width: 48rem;
197
+ max-inline-size: 48rem;
198
198
  }
199
199
 
200
200
  .project-pager {
@@ -215,9 +215,9 @@
215
215
  border: 1px solid var(--line);
216
216
  border-radius: var(--radius-lg);
217
217
  box-shadow: var(--shadow);
218
- min-height: 6rem;
218
+ min-block-size: 6rem;
219
219
  padding: 1rem 1.05rem;
220
- width: 100%;
220
+ inline-size: 100%;
221
221
  }
222
222
 
223
223
  .project-pager__link strong {
@@ -226,7 +226,7 @@
226
226
  }
227
227
 
228
228
  .project-pager__link--next {
229
- text-align: right;
229
+ text-align: end;
230
230
  }
231
231
 
232
232
  @media (hover: hover) {
@@ -297,11 +297,11 @@
297
297
  display: grid;
298
298
  gap: 0.75rem;
299
299
  margin: 0;
300
- padding-left: 1.1rem;
300
+ padding-inline-start: 1.1rem;
301
301
  }
302
302
 
303
303
  .focus-list--dense {
304
- margin-top: 0.2rem;
304
+ margin-block-start: 0.2rem;
305
305
  }
306
306
 
307
307
  .focus-list li,
@@ -316,10 +316,10 @@
316
316
  }
317
317
 
318
318
  .profile-link-list div {
319
- border-top: 1px solid var(--line);
319
+ border-block-start: 1px solid var(--line);
320
320
  display: grid;
321
321
  gap: 0.25rem;
322
- padding-top: 0.75rem;
322
+ padding-block-start: 0.75rem;
323
323
  }
324
324
 
325
325
  .profile-link-list dd {
@@ -0,0 +1,289 @@
1
+ /* ==========================================================================
2
+ content — .ui-prose: long-form rich text, zero per-element classes.
3
+
4
+ Wrap the raw HTML a Markdown renderer emits in a single `.ui-prose`
5
+ and the document is styled in the Nothing aesthetic while the markup
6
+ stays semantic and machine-readable (no class-soup). Everything here
7
+ is an element selector scoped under `.ui-prose`, so it never leaks
8
+ into app UI.
9
+ ========================================================================== */
10
+
11
+ .ui-prose {
12
+ color: var(--text-soft);
13
+ font-size: var(--text-base);
14
+ line-height: 1.7;
15
+
16
+ /* Readable measure; the container can still be wider for tables/media. */
17
+ --prose-measure: 72ch;
18
+ }
19
+
20
+ .ui-prose > * {
21
+ margin-block: 0;
22
+ max-inline-size: var(--prose-measure);
23
+ }
24
+
25
+ /* Flow rhythm — space comes from the following element. */
26
+ .ui-prose > * + * {
27
+ margin-block-start: var(--space-md);
28
+ }
29
+
30
+ .ui-prose > * + :is(h1, h2, h3, h4, h5, h6) {
31
+ margin-block-start: var(--space-2xl);
32
+ }
33
+
34
+ /* Full-bleed-ish elements opt out of the text measure. */
35
+ .ui-prose > :is(figure, pre, table, hr, .ui-dotrule) {
36
+ max-inline-size: none;
37
+ }
38
+
39
+ /* --- Headings — brand display face; only the top two shout --- */
40
+
41
+ .ui-prose :is(h1, h2, h3, h4, h5, h6) {
42
+ color: var(--text);
43
+ font-family: var(--display);
44
+ line-height: 1.12;
45
+ text-wrap: balance;
46
+ }
47
+
48
+ .ui-prose h1 {
49
+ font-size: var(--text-xl);
50
+ letter-spacing: var(--tracking-wide);
51
+ text-transform: uppercase;
52
+ }
53
+
54
+ .ui-prose h2 {
55
+ font-size: var(--text-lg);
56
+ letter-spacing: var(--tracking-wide);
57
+ padding-block-end: 0.3rem;
58
+ border-block-end: 1px solid var(--line);
59
+ text-transform: uppercase;
60
+ }
61
+
62
+ .ui-prose h3 {
63
+ font-size: var(--text-lg);
64
+ }
65
+
66
+ .ui-prose :is(h4, h5, h6) {
67
+ font-size: var(--text-base);
68
+ letter-spacing: var(--tracking-wide);
69
+ text-transform: uppercase;
70
+ }
71
+
72
+ .ui-prose :is(h5, h6) {
73
+ color: var(--text-dim);
74
+ }
75
+
76
+ /* Anchored headings clear a sticky chrome and expose a dot on hover. */
77
+ .ui-prose :is(h1, h2, h3, h4, h5, h6)[id] {
78
+ scroll-margin-block-start: 6rem;
79
+ }
80
+
81
+ /* --- Text-level --- */
82
+
83
+ .ui-prose :is(p, ul, ol, dl, blockquote, figure, pre, table) {
84
+ font-size: inherit;
85
+ }
86
+
87
+ .ui-prose a {
88
+ color: var(--text);
89
+ text-decoration: underline;
90
+ text-decoration-color: color-mix(in srgb, var(--accent) 55%, transparent);
91
+ text-decoration-thickness: 1px;
92
+ text-underline-offset: 0.22rem;
93
+ transition:
94
+ color var(--duration-fast) var(--ease-standard),
95
+ text-decoration-color var(--duration-fast) var(--ease-standard);
96
+ }
97
+
98
+ .ui-prose strong {
99
+ color: var(--text);
100
+ }
101
+
102
+ .ui-prose mark {
103
+ background: var(--accent-soft);
104
+ color: var(--text);
105
+ padding: 0.02em 0.22em;
106
+ }
107
+
108
+ .ui-prose small {
109
+ font-size: var(--text-xs);
110
+ }
111
+
112
+ .ui-prose abbr[title] {
113
+ text-decoration: underline dotted;
114
+ text-underline-offset: 0.2rem;
115
+ }
116
+
117
+ .ui-prose :is(sub, sup) {
118
+ font-size: 0.72em;
119
+ }
120
+
121
+ @media (hover: hover) {
122
+ .ui-prose a:hover {
123
+ color: var(--accent);
124
+ text-decoration-color: var(--accent);
125
+ }
126
+ }
127
+
128
+ /* --- Lists — the Nothing dot/square marker --- */
129
+
130
+ .ui-prose :is(ul, ol) {
131
+ padding-inline-start: 1.4rem;
132
+ }
133
+
134
+ .ui-prose li + li {
135
+ margin-block-start: 0.4rem;
136
+ }
137
+
138
+ .ui-prose li::marker {
139
+ color: var(--accent);
140
+ }
141
+
142
+ .ui-prose ul {
143
+ list-style: square;
144
+ }
145
+
146
+ .ui-prose :is(ul, ol) :is(ul, ol) {
147
+ margin-block-start: 0.4rem;
148
+ }
149
+
150
+ /* GitHub task lists stay semantic; just align them. */
151
+ .ui-prose li:has(> input[type='checkbox']) {
152
+ list-style: none;
153
+ margin-inline-start: -1.4rem;
154
+ }
155
+
156
+ .ui-prose li > input[type='checkbox'] {
157
+ accent-color: var(--accent);
158
+ margin-inline-end: 0.4rem;
159
+ }
160
+
161
+ /* --- Quote --- */
162
+
163
+ .ui-prose blockquote {
164
+ border-inline-start: 2px solid var(--accent);
165
+ color: var(--text-dim);
166
+ font-style: normal;
167
+ padding-inline-start: var(--space-md);
168
+ }
169
+
170
+ .ui-prose blockquote > * + * {
171
+ margin-block-start: var(--space-xs);
172
+ }
173
+
174
+ /* --- Definition list --- */
175
+
176
+ .ui-prose dt {
177
+ color: var(--text-dim);
178
+ font-family: var(--mono);
179
+ font-size: var(--text-2xs);
180
+ font-weight: 700;
181
+ letter-spacing: var(--tracking-wide);
182
+ text-transform: uppercase;
183
+ }
184
+
185
+ .ui-prose dd {
186
+ margin-inline-start: 0;
187
+ padding-block: 0.16rem 0.6rem;
188
+ }
189
+
190
+ .ui-prose dd + dt {
191
+ border-block-start: 1px solid var(--line);
192
+ padding-block-start: 0.6rem;
193
+ }
194
+
195
+ /* --- Code --- */
196
+
197
+ .ui-prose :not(pre) > code {
198
+ font-size: 0.88em;
199
+ }
200
+
201
+ .ui-prose pre {
202
+ font-size: var(--text-sm);
203
+ line-height: 1.6;
204
+ overflow-x: auto;
205
+ }
206
+
207
+ /* --- Rule — reuse the dot-matrix divider look --- */
208
+
209
+ .ui-prose hr {
210
+ background-image: radial-gradient(var(--line-strong) 1.4px, transparent 1.4px);
211
+ background-position: 0 50%;
212
+ background-size: 9px 9px;
213
+ block-size: 3px;
214
+ border: 0;
215
+ margin-block: var(--space-xl);
216
+ }
217
+
218
+ /* --- Media --- */
219
+
220
+ .ui-prose :is(img, video, svg) {
221
+ block-size: auto;
222
+ border-radius: var(--radius-sm);
223
+ max-inline-size: 100%;
224
+ }
225
+
226
+ .ui-prose figure {
227
+ display: grid;
228
+ gap: 0.5rem;
229
+ justify-items: start;
230
+ }
231
+
232
+ .ui-prose figcaption {
233
+ color: var(--text-dim);
234
+ font-family: var(--mono);
235
+ font-size: var(--text-2xs);
236
+ letter-spacing: var(--tracking-wide);
237
+ text-transform: uppercase;
238
+ }
239
+
240
+ /* --- Table — raw Markdown tables look like ui-table --- */
241
+
242
+ .ui-prose table {
243
+ border: 1px solid var(--line);
244
+ border-collapse: collapse;
245
+ border-radius: var(--radius-md);
246
+ display: block;
247
+ font-family: var(--mono);
248
+ font-size: var(--text-sm);
249
+ inline-size: 100%;
250
+ overflow-x: auto;
251
+ }
252
+
253
+ .ui-prose :is(th, td) {
254
+ border-block-end: 1px solid var(--line);
255
+ padding: 0.6rem 0.8rem;
256
+ text-align: start;
257
+ vertical-align: top;
258
+ }
259
+
260
+ .ui-prose th {
261
+ background: var(--panel);
262
+ color: var(--text-dim);
263
+ font-size: var(--text-2xs);
264
+ font-weight: 700;
265
+ letter-spacing: var(--tracking-wide);
266
+ text-transform: uppercase;
267
+ }
268
+
269
+ .ui-prose td {
270
+ color: var(--text-soft);
271
+ }
272
+
273
+ .ui-prose tbody tr:last-child :is(th, td) {
274
+ border-block-end: 0;
275
+ }
276
+
277
+ /* --- Compact variant — tighter rhythm for dense docs --- */
278
+
279
+ .ui-prose--compact {
280
+ line-height: 1.55;
281
+ }
282
+
283
+ .ui-prose--compact > * + * {
284
+ margin-block-start: var(--space-sm);
285
+ }
286
+
287
+ .ui-prose--compact > * + :is(h1, h2, h3, h4, h5, h6) {
288
+ margin-block-start: var(--space-lg);
289
+ }
package/css/core.css CHANGED
@@ -15,8 +15,12 @@
15
15
  @import url('./layout.css') layer(bronto);
16
16
  @import url('./navigation.css') layer(bronto);
17
17
  @import url('./typography.css') layer(bronto);
18
+ @import url('./content.css') layer(bronto);
18
19
  @import url('./primitives.css') layer(bronto);
19
20
  @import url('./forms.css') layer(bronto);
21
+ @import url('./feedback.css') layer(bronto);
22
+ @import url('./overlay.css') layer(bronto);
23
+ @import url('./disclosure.css') layer(bronto);
20
24
  @import url('./table.css') layer(bronto);
21
25
  @import url('./cards.css') layer(bronto);
22
26
  @import url('./app.css') layer(bronto);