@ponchia/ui 0.2.2 → 0.3.1

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 (48) hide show
  1. package/README.md +108 -79
  2. package/behaviors/index.d.ts +53 -0
  3. package/behaviors/index.js +745 -34
  4. package/classes/index.d.ts +216 -3
  5. package/classes/index.js +85 -10
  6. package/classes/vscode.css-custom-data.json +407 -0
  7. package/css/app.css +53 -44
  8. package/css/base.css +14 -23
  9. package/css/content.css +37 -2
  10. package/css/core.css +5 -5
  11. package/css/disclosure.css +17 -5
  12. package/css/dots.css +1 -1
  13. package/css/feedback.css +87 -2
  14. package/css/forms.css +128 -2
  15. package/css/navigation.css +16 -85
  16. package/css/overlay.css +73 -2
  17. package/css/primitives.css +100 -3
  18. package/css/site.css +295 -0
  19. package/css/table.css +59 -0
  20. package/css/tokens.css +79 -24
  21. package/dist/bronto.css +1 -1
  22. package/dist/css/app.css +1 -0
  23. package/dist/css/base.css +1 -0
  24. package/dist/css/content.css +1 -0
  25. package/dist/css/disclosure.css +1 -0
  26. package/dist/css/dots.css +1 -0
  27. package/dist/css/feedback.css +1 -0
  28. package/dist/css/fonts.css +1 -0
  29. package/dist/css/forms.css +1 -0
  30. package/dist/css/motion.css +1 -0
  31. package/dist/css/navigation.css +1 -0
  32. package/dist/css/overlay.css +1 -0
  33. package/dist/css/primitives.css +1 -0
  34. package/dist/css/site.css +1 -0
  35. package/dist/css/table.css +1 -0
  36. package/dist/css/tokens.css +1 -0
  37. package/package.json +60 -30
  38. package/shiki/nothing.json +83 -0
  39. package/tokens/index.d.ts +18 -10
  40. package/tokens/index.js +49 -16
  41. package/tokens/index.json +98 -32
  42. package/tokens/tokens.dtcg.json +241 -22
  43. package/css/cards.css +0 -336
  44. package/css/index.css +0 -5
  45. package/css/layout.css +0 -219
  46. package/css/responsive.css +0 -157
  47. package/css/typography.css +0 -139
  48. package/dist/bronto-core.css +0 -1
package/css/app.css CHANGED
@@ -3,19 +3,19 @@
3
3
  For admin / operator dashboards.
4
4
  ========================================================================== */
5
5
 
6
- .app-shell {
6
+ .ui-app-shell {
7
7
  display: grid;
8
8
  grid-template-columns: var(--app-rail, 14rem) minmax(0, 1fr);
9
9
  min-block-size: 100vh;
10
10
  }
11
11
 
12
- .app-shell--full {
12
+ .ui-app-shell--full {
13
13
  grid-template-columns: minmax(0, 1fr);
14
14
  }
15
15
 
16
16
  /* --- Sidebar rail --- */
17
17
 
18
- .app-rail {
18
+ .ui-app-rail {
19
19
  background: var(--panel);
20
20
  border-inline-end: 1px solid var(--line);
21
21
  display: flex;
@@ -28,7 +28,7 @@
28
28
  overflow-y: auto;
29
29
  }
30
30
 
31
- .app-rail__brand {
31
+ .ui-app-rail__brand {
32
32
  align-items: center;
33
33
  color: var(--text);
34
34
  display: flex;
@@ -40,7 +40,7 @@
40
40
  text-transform: uppercase;
41
41
  }
42
42
 
43
- .app-rail__brand::before {
43
+ .ui-app-rail__brand::before {
44
44
  background: var(--accent);
45
45
  border-radius: 50%;
46
46
  content: '';
@@ -48,12 +48,12 @@
48
48
  inline-size: 0.5rem;
49
49
  }
50
50
 
51
- .app-nav {
51
+ .ui-app-nav {
52
52
  display: grid;
53
53
  gap: 0.15rem;
54
54
  }
55
55
 
56
- .app-nav__section {
56
+ .ui-app-nav__section {
57
57
  color: var(--text-dim);
58
58
  font-family: var(--mono);
59
59
  font-size: var(--text-2xs);
@@ -63,7 +63,7 @@
63
63
  text-transform: uppercase;
64
64
  }
65
65
 
66
- .app-nav a {
66
+ .ui-app-nav a {
67
67
  align-items: center;
68
68
  border-inline-start: 2px solid transparent;
69
69
  color: var(--text-soft);
@@ -78,7 +78,7 @@
78
78
  color var(--duration-fast) var(--ease-standard);
79
79
  }
80
80
 
81
- .app-nav a::before {
81
+ .ui-app-nav a::before {
82
82
  background: currentColor;
83
83
  border-radius: 50%;
84
84
  content: '';
@@ -87,22 +87,22 @@
87
87
  inline-size: 0.34rem;
88
88
  }
89
89
 
90
- .app-nav a:hover {
90
+ .ui-app-nav a:hover {
91
91
  background: var(--bg-accent);
92
92
  color: var(--text);
93
93
  }
94
94
 
95
- .app-nav a.is-active {
95
+ .ui-app-nav a.is-active {
96
96
  background: var(--accent-soft);
97
97
  border-inline-start-color: var(--accent);
98
- color: var(--accent);
98
+ color: var(--accent-text);
99
99
  }
100
100
 
101
- .app-nav a.is-active::before {
101
+ .ui-app-nav a.is-active::before {
102
102
  opacity: 1;
103
103
  }
104
104
 
105
- .app-rail__foot {
105
+ .ui-app-rail__foot {
106
106
  border-block-start: 1px solid var(--line);
107
107
  color: var(--text-dim);
108
108
  font-family: var(--mono);
@@ -113,13 +113,13 @@
113
113
 
114
114
  /* --- Main column --- */
115
115
 
116
- .app-main {
116
+ .ui-app-main {
117
117
  display: flex;
118
118
  flex-direction: column;
119
119
  min-inline-size: 0;
120
120
  }
121
121
 
122
- .app-topbar {
122
+ .ui-app-topbar {
123
123
  align-items: center;
124
124
  background: color-mix(in srgb, var(--bg) 86%, transparent);
125
125
  backdrop-filter: blur(8px);
@@ -130,10 +130,10 @@
130
130
  padding: 0.75rem var(--space-lg);
131
131
  position: sticky;
132
132
  inset-block-start: 0;
133
- z-index: 10;
133
+ z-index: var(--z-raised);
134
134
  }
135
135
 
136
- .app-topbar__title {
136
+ .ui-app-topbar__title {
137
137
  color: var(--text);
138
138
  font-family: var(--display);
139
139
  font-size: 1.1rem;
@@ -142,7 +142,7 @@
142
142
  text-transform: uppercase;
143
143
  }
144
144
 
145
- .app-content {
145
+ .ui-app-content {
146
146
  display: grid;
147
147
  gap: var(--space-lg);
148
148
  padding: var(--space-lg);
@@ -150,7 +150,7 @@
150
150
 
151
151
  /* --- Toolbar --- */
152
152
 
153
- .app-toolbar {
153
+ .ui-app-toolbar {
154
154
  align-items: center;
155
155
  background: var(--panel);
156
156
  border: 1px solid var(--line);
@@ -162,7 +162,7 @@
162
162
  padding: 0.7rem 0.85rem;
163
163
  }
164
164
 
165
- .app-toolbar__group {
165
+ .ui-app-toolbar__group {
166
166
  align-items: center;
167
167
  display: flex;
168
168
  flex-wrap: wrap;
@@ -171,7 +171,7 @@
171
171
 
172
172
  /* --- Panel --- */
173
173
 
174
- .app-panel {
174
+ .ui-app-panel {
175
175
  background: var(--panel);
176
176
  border: 1px solid var(--line);
177
177
  border-radius: var(--radius-md);
@@ -180,14 +180,14 @@
180
180
  padding: var(--space-md);
181
181
  }
182
182
 
183
- .app-panel__head {
183
+ .ui-app-panel__head {
184
184
  align-items: flex-start;
185
185
  display: flex;
186
186
  gap: 0.7rem;
187
187
  justify-content: space-between;
188
188
  }
189
189
 
190
- .app-panel__title {
190
+ .ui-app-panel__title {
191
191
  color: var(--text);
192
192
  font-family: var(--display);
193
193
  font-size: 0.95rem;
@@ -196,21 +196,30 @@
196
196
  text-transform: uppercase;
197
197
  }
198
198
 
199
- .app-panel__head p,
200
- .app-empty-state p {
199
+ .ui-app-panel__head p,
200
+ .ui-app-empty-state p {
201
201
  color: var(--text-dim);
202
202
  margin: 0.3rem 0 0;
203
203
  }
204
204
 
205
205
  /* --- Metric tiles --- */
206
206
 
207
- .app-metrics {
207
+ .ui-app-metrics {
208
208
  display: grid;
209
209
  gap: var(--space-md);
210
210
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
211
211
  }
212
212
 
213
- .app-metric {
213
+ /* Inside an opt-in .ui-cq container, collapse to one column when the
214
+ container (not the viewport) is narrow — keeps metric tiles usable
215
+ in a slim panel. Inert without .ui-cq, so baselines are unaffected. */
216
+ @container bronto (max-width: 30rem) {
217
+ .ui-app-metrics {
218
+ grid-template-columns: 1fr;
219
+ }
220
+ }
221
+
222
+ .ui-app-metric {
214
223
  background: var(--panel);
215
224
  border: 1px solid var(--line);
216
225
  border-radius: var(--radius-md);
@@ -219,7 +228,7 @@
219
228
  padding: var(--space-md);
220
229
  }
221
230
 
222
- .app-metric__label {
231
+ .ui-app-metric__label {
223
232
  color: var(--text-dim);
224
233
  font-family: var(--mono);
225
234
  font-size: var(--text-2xs);
@@ -227,7 +236,7 @@
227
236
  text-transform: uppercase;
228
237
  }
229
238
 
230
- .app-metric__value {
239
+ .ui-app-metric__value {
231
240
  color: var(--text);
232
241
  font-family: var(--display);
233
242
  font-size: 1.9rem;
@@ -236,22 +245,22 @@
236
245
  line-height: 1;
237
246
  }
238
247
 
239
- .app-metric__delta {
248
+ .ui-app-metric__delta {
240
249
  font-family: var(--mono);
241
250
  font-size: var(--text-xs);
242
251
  }
243
252
 
244
- .app-metric__delta.is-pos {
253
+ .ui-app-metric__delta.is-pos {
245
254
  color: var(--success);
246
255
  }
247
256
 
248
- .app-metric__delta.is-neg {
257
+ .ui-app-metric__delta.is-neg {
249
258
  color: var(--danger);
250
259
  }
251
260
 
252
261
  /* --- Empty state --- */
253
262
 
254
- .app-empty-state {
263
+ .ui-app-empty-state {
255
264
  border: 1px dashed var(--line-strong);
256
265
  border-radius: var(--radius-md);
257
266
  color: var(--text-dim);
@@ -261,49 +270,49 @@
261
270
 
262
271
  /* --- Mobile rail collapse --- */
263
272
 
264
- .app-rail__toggle {
273
+ .ui-app-rail__toggle {
265
274
  display: none;
266
275
  }
267
276
 
268
277
  @media (max-width: 880px) {
269
- .app-shell {
278
+ .ui-app-shell {
270
279
  grid-template-columns: minmax(0, 1fr);
271
280
  }
272
281
 
273
- .app-rail {
282
+ .ui-app-rail {
274
283
  flex-direction: row;
275
284
  block-size: auto;
276
285
  overflow-x: auto;
277
286
  position: sticky;
278
287
  inset-block-start: 0;
279
- z-index: 11;
288
+ z-index: calc(var(--z-raised) + 1);
280
289
  }
281
290
 
282
- .app-rail__foot {
291
+ .ui-app-rail__foot {
283
292
  display: none;
284
293
  }
285
294
 
286
- .app-nav {
295
+ .ui-app-nav {
287
296
  grid-auto-flow: column;
288
297
  gap: 0.15rem;
289
298
  }
290
299
 
291
- .app-nav__section {
300
+ .ui-app-nav__section {
292
301
  display: none;
293
302
  }
294
303
 
295
- .app-nav a {
304
+ .ui-app-nav a {
296
305
  border-inline-start: 0;
297
306
  border-block-end: 2px solid transparent;
298
307
  white-space: nowrap;
299
308
  }
300
309
 
301
- .app-nav a.is-active {
310
+ .ui-app-nav a.is-active {
302
311
  border-inline-start: 0;
303
312
  border-block-end-color: var(--accent);
304
313
  }
305
314
 
306
- .app-content {
315
+ .ui-app-content {
307
316
  padding: var(--space-md);
308
317
  }
309
318
  }
package/css/base.css CHANGED
@@ -161,26 +161,10 @@ input:focus-visible,
161
161
  select:focus-visible,
162
162
  textarea:focus-visible,
163
163
  [tabindex]:focus-visible {
164
- outline: 2px solid var(--accent);
164
+ outline: 2px solid var(--focus-ring);
165
165
  outline-offset: 2px;
166
166
  }
167
167
 
168
- .skip-link {
169
- background: var(--panel-strong);
170
- border: 1px solid var(--line-strong);
171
- border-radius: var(--radius-md);
172
- color: var(--text);
173
- inset-inline-start: 1rem;
174
- padding: 0.7rem 1rem;
175
- position: fixed;
176
- inset-block-start: -4rem;
177
- z-index: 40;
178
- }
179
-
180
- .skip-link:focus {
181
- inset-block-start: 1rem;
182
- }
183
-
184
168
  /* Small global helpers reused across apps. */
185
169
  .ui-muted {
186
170
  color: var(--text-dim);
@@ -196,7 +180,6 @@ textarea:focus-visible,
196
180
  }
197
181
 
198
182
  .ui-visually-hidden {
199
- clip: rect(0 0 0 0);
200
183
  clip-path: inset(50%);
201
184
  block-size: 1px;
202
185
  overflow: hidden;
@@ -236,6 +219,14 @@ textarea:focus-visible,
236
219
  outline-offset: -2px;
237
220
  }
238
221
 
222
+ /* The active tab signals selection only via accent colour/border, both
223
+ flattened by the forced palette — re-assert it with a system colour
224
+ so the selected tab stays distinguishable (a11y review L3). */
225
+ .ui-tab.is-active {
226
+ border-block-end-color: Highlight;
227
+ color: Highlight;
228
+ }
229
+
239
230
  /* Keyboard focus must never depend on a colour that gets overridden. */
240
231
  a:focus-visible,
241
232
  button:focus-visible,
@@ -262,11 +253,11 @@ textarea:focus-visible,
262
253
  /* Decorative / interactive chrome never prints. */
263
254
  .ui-dotfield,
264
255
  .ui-toast-stack,
265
- .app-rail,
266
- .app-topbar,
267
- .site-nav,
268
- .theme-toggle__button,
269
- .site-menu,
256
+ .ui-app-rail,
257
+ .ui-app-topbar,
258
+ .ui-sitenav,
259
+ .ui-themetoggle__button,
260
+ .ui-sitemenu,
270
261
  .ui-spinner,
271
262
  .ui-dotloader,
272
263
  .ui-dotspinner,
package/css/content.css CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
  @media (hover: hover) {
122
122
  .ui-prose a:hover {
123
- color: var(--accent);
123
+ color: var(--accent-text);
124
124
  text-decoration-color: var(--accent);
125
125
  }
126
126
  }
@@ -136,7 +136,7 @@
136
136
  }
137
137
 
138
138
  .ui-prose li::marker {
139
- color: var(--accent);
139
+ color: var(--accent-text);
140
140
  }
141
141
 
142
142
  .ui-prose ul {
@@ -287,3 +287,38 @@
287
287
  .ui-prose--compact > * + :is(h1, h2, h3, h4, h5, h6) {
288
288
  margin-block-start: var(--space-lg);
289
289
  }
290
+
291
+ /* ==========================================================================
292
+ ui-quote — pull-quote with attribution. A long-form companion to
293
+ .ui-prose (works inside it or standalone). Emphasis via scale + a
294
+ short accent rule, not a tinted box. Use <figure>/<blockquote> +
295
+ <figcaption>; tag-agnostic.
296
+ ========================================================================== */
297
+
298
+ .ui-quote {
299
+ color: var(--text);
300
+ display: grid;
301
+ font-family: var(--display);
302
+ font-size: var(--text-xl);
303
+ gap: var(--space-sm);
304
+ line-height: 1.2;
305
+ margin-block: var(--space-xl);
306
+ max-inline-size: 40ch;
307
+ text-wrap: balance;
308
+ }
309
+
310
+ .ui-quote::before {
311
+ background: var(--accent);
312
+ block-size: 2px;
313
+ content: '';
314
+ inline-size: 2.5rem;
315
+ }
316
+
317
+ .ui-quote__cite {
318
+ color: var(--text-dim);
319
+ font-family: var(--mono);
320
+ font-size: var(--text-2xs);
321
+ font-style: normal;
322
+ letter-spacing: var(--tracking-wide);
323
+ text-transform: uppercase;
324
+ }
package/css/core.css CHANGED
@@ -1,5 +1,7 @@
1
- /* @ponchia/ui — core bundle (no breakpoint overrides).
2
- Consumers that manage their own responsive layer import this.
1
+ /* @ponchia/ui — the CSS bundle (single source entrypoint).
2
+ The legacy non-ui-* vocabulary and the separate responsive layer were
3
+ removed in 0.3.0; the ui-* components carry their own breakpoints, so
4
+ there is one bundle, not a core/full split.
3
5
 
4
6
  Everything ships inside the `bronto` cascade layer. Any un-layered CSS
5
7
  in the consuming app therefore wins over the framework without a
@@ -12,9 +14,8 @@
12
14
  @import url('./base.css') layer(bronto);
13
15
  @import url('./motion.css') layer(bronto);
14
16
  @import url('./dots.css') layer(bronto);
15
- @import url('./layout.css') layer(bronto);
16
17
  @import url('./navigation.css') layer(bronto);
17
- @import url('./typography.css') layer(bronto);
18
+ @import url('./site.css') layer(bronto);
18
19
  @import url('./content.css') layer(bronto);
19
20
  @import url('./primitives.css') layer(bronto);
20
21
  @import url('./forms.css') layer(bronto);
@@ -22,5 +23,4 @@
22
23
  @import url('./overlay.css') layer(bronto);
23
24
  @import url('./disclosure.css') layer(bronto);
24
25
  @import url('./table.css') layer(bronto);
25
- @import url('./cards.css') layer(bronto);
26
26
  @import url('./app.css') layer(bronto);
@@ -46,7 +46,19 @@
46
46
 
47
47
  .ui-tab.is-active {
48
48
  border-block-end-color: var(--accent);
49
- color: var(--accent);
49
+ color: var(--accent-text);
50
+ }
51
+
52
+ .ui-tab:focus-visible {
53
+ /* An inset box, deliberately distinct from the .is-active bottom-border
54
+ so focus ≠ selection for low-vision keyboard users: the global
55
+ button:focus-visible ring would otherwise sit exactly on the active
56
+ underline. Geometry (inset offset), not colour, carries the
57
+ distinction — colour stays the solid accent used by every other
58
+ control's ring (the --focus-ring token wiring is decided globally,
59
+ not per-component). */
60
+ outline: 2px solid var(--focus-ring);
61
+ outline-offset: -3px;
50
62
  }
51
63
 
52
64
  .ui-tabs__panel[hidden] {
@@ -99,7 +111,7 @@
99
111
  }
100
112
 
101
113
  .ui-accordion__item[open] .ui-accordion__summary {
102
- color: var(--accent);
114
+ color: var(--accent-text);
103
115
  }
104
116
 
105
117
  .ui-accordion__item[open] .ui-accordion__summary::before {
@@ -157,7 +169,7 @@
157
169
  }
158
170
 
159
171
  .ui-segmented__option:has(input:focus-visible) {
160
- outline: 2px solid var(--accent);
172
+ outline: 2px solid var(--focus-ring);
161
173
  outline-offset: 2px;
162
174
  }
163
175
 
@@ -209,7 +221,7 @@
209
221
 
210
222
  @media (hover: hover) {
211
223
  .ui-breadcrumb__item a:hover {
212
- color: var(--accent);
224
+ color: var(--accent-text);
213
225
  }
214
226
  }
215
227
 
@@ -246,7 +258,7 @@
246
258
 
247
259
  .ui-pagination__item.is-active {
248
260
  border-color: var(--accent);
249
- color: var(--accent);
261
+ color: var(--accent-text);
250
262
  }
251
263
 
252
264
  .ui-pagination__item[aria-disabled='true'] {
package/css/dots.css CHANGED
@@ -30,7 +30,7 @@
30
30
  mask-image: radial-gradient(ellipse at 50% 0%, #000 30%, transparent 78%);
31
31
  pointer-events: none;
32
32
  position: fixed;
33
- z-index: 0;
33
+ z-index: var(--z-base);
34
34
  }
35
35
 
36
36
  /* Dotted divider — replaces a plain rule. */
package/css/feedback.css CHANGED
@@ -114,7 +114,14 @@
114
114
  max-inline-size: min(22rem, calc(100vw - 2rem));
115
115
  pointer-events: none;
116
116
  position: fixed;
117
- z-index: 60;
117
+ z-index: var(--z-toast);
118
+ }
119
+
120
+ /* Assertive (error) region — anchored top inline-end so it never
121
+ overlaps the polite bottom stack and reads as a distinct, urgent
122
+ channel. */
123
+ .ui-toast-stack--assertive {
124
+ inset-block: 1.25rem auto;
118
125
  }
119
126
 
120
127
  .ui-toast {
@@ -154,6 +161,30 @@
154
161
  text-transform: uppercase;
155
162
  }
156
163
 
164
+ .ui-toast__close {
165
+ align-self: start;
166
+ background: none;
167
+ border: 0;
168
+ block-size: 1.4rem;
169
+ color: var(--text-dim);
170
+ cursor: pointer;
171
+ font: inherit;
172
+ grid-column: 3;
173
+ grid-row: 1 / -1;
174
+ inline-size: 1.4rem;
175
+ padding: 0;
176
+ }
177
+
178
+ .ui-toast__close::before {
179
+ content: '\00d7'; /* × — glyph via CSS so the button has no text node */
180
+ font-size: 1.1rem;
181
+ line-height: 1;
182
+ }
183
+
184
+ .ui-toast__close:hover {
185
+ color: var(--text);
186
+ }
187
+
157
188
  .ui-toast--accent::before {
158
189
  background: var(--accent);
159
190
  }
@@ -196,7 +227,7 @@
196
227
  opacity var(--duration-fast) var(--ease-standard),
197
228
  transform var(--duration-fast) var(--ease-standard);
198
229
  white-space: nowrap;
199
- z-index: 50;
230
+ z-index: var(--z-popover);
200
231
  }
201
232
 
202
233
  .ui-tooltip:hover .ui-tooltip__bubble,
@@ -205,6 +236,60 @@
205
236
  transform: translate(-50%, 0);
206
237
  }
207
238
 
239
+ /* Progressive enhancement: where CSS anchor positioning exists, lift
240
+ the bubble out of the normal flow so it can't be clipped by an
241
+ ancestor's overflow/scroll and auto-flips at the viewport edge.
242
+ Unsupported browsers keep the absolutely-positioned fallback above
243
+ (fine for short labels; use .ui-popover + initPopover for rich or
244
+ edge-critical content). */
245
+ @supports (anchor-name: --x) {
246
+ .ui-tooltip {
247
+ anchor-name: --ui-tooltip;
248
+ }
249
+
250
+ .ui-tooltip__bubble {
251
+ inset: auto;
252
+ margin-block-end: 0.5rem;
253
+ position: fixed;
254
+ position-anchor: --ui-tooltip;
255
+ position-area: block-start center;
256
+ position-try-fallbacks: flip-block;
257
+ transform: translateY(4px);
258
+ }
259
+
260
+ .ui-tooltip:hover .ui-tooltip__bubble,
261
+ .ui-tooltip:focus-within .ui-tooltip__bubble {
262
+ transform: translateY(0);
263
+ }
264
+ }
265
+
266
+ /* Popover surface — a top-layer panel positioned by initPopover (JS
267
+ collision-aware, dependency-free). Uses the native [popover] top
268
+ layer when available so it never clips; the class styles it either
269
+ way. */
270
+ .ui-popover {
271
+ background: var(--panel-strong);
272
+ border: 1px solid var(--line-strong);
273
+ border-radius: var(--radius-md);
274
+ box-shadow: var(--shadow-raised);
275
+ color: var(--text-soft);
276
+ font-size: var(--text-sm);
277
+ inline-size: max-content;
278
+ margin: 0;
279
+ max-inline-size: min(22rem, calc(100vw - 2rem));
280
+ padding: var(--space-sm) var(--space-md);
281
+ position: fixed;
282
+ z-index: var(--z-popover);
283
+ }
284
+
285
+ .ui-popover:not([popover], .is-open) {
286
+ display: none;
287
+ }
288
+
289
+ .ui-popover[popover]:not(:popover-open) {
290
+ display: none;
291
+ }
292
+
208
293
  /* --- Progress — linear, determinate or indeterminate --- */
209
294
 
210
295
  .ui-progress {