@handamade/psi-react 0.4.0 → 0.5.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.
- package/README.md +1 -1
- package/dist/AspectRatio/AspectRatio.d.ts +1 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/Button/Button.d.ts +2 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Card/Card.d.ts +2 -0
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Checkbox/Checkbox.d.ts +1 -0
- package/dist/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +24 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -0
- package/dist/Field/Field.d.ts +36 -0
- package/dist/Field/Field.d.ts.map +1 -0
- package/dist/IconButton/IconButton.d.ts +2 -0
- package/dist/IconButton/IconButton.d.ts.map +1 -1
- package/dist/Input/Input.d.ts +4 -1
- package/dist/Input/Input.d.ts.map +1 -1
- package/dist/NavBar/NavBar.d.ts +1 -0
- package/dist/NavBar/NavBar.d.ts.map +1 -1
- package/dist/Select/Select.d.ts +4 -1
- package/dist/Select/Select.d.ts.map +1 -1
- package/dist/Switch/Switch.d.ts +2 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Tag/Tag.d.ts +2 -0
- package/dist/Tag/Tag.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.d.ts +1 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/a11y-meta.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +567 -442
- package/dist/manifest.json +180 -13
- package/dist/styles.css +1 -1
- package/docs/AspectRatio.md +3 -1
- package/docs/Button.md +3 -1
- package/docs/Card.md +3 -1
- package/docs/Checkbox.md +3 -1
- package/docs/Dialog.md +43 -0
- package/docs/Field.md +42 -0
- package/docs/IconButton.md +3 -1
- package/docs/Input.md +5 -3
- package/docs/NavBar.md +3 -1
- package/docs/Select.md +5 -3
- package/docs/Switch.md +3 -1
- package/docs/Tag.md +3 -1
- package/docs/Tooltip.md +3 -1
- package/llms.txt +3 -3
- package/package.json +3 -2
package/dist/manifest.json
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
"components": [
|
|
3
3
|
{
|
|
4
4
|
"name": "Button",
|
|
5
|
-
"description": "",
|
|
5
|
+
"description": "Action trigger. With `href` renders an anchor with identical styling (D33); `disabled` then maps to `aria-disabled`.",
|
|
6
|
+
"slots": [],
|
|
6
7
|
"props": [
|
|
7
8
|
{
|
|
8
9
|
"name": "variant",
|
|
@@ -57,7 +58,8 @@
|
|
|
57
58
|
},
|
|
58
59
|
{
|
|
59
60
|
"name": "IconButton",
|
|
60
|
-
"description": "",
|
|
61
|
+
"description": "Square icon-only button; same variant/size/href contract as Button. Give it an accessible name (`aria-label`).",
|
|
62
|
+
"slots": [],
|
|
61
63
|
"props": [
|
|
62
64
|
{
|
|
63
65
|
"name": "variant",
|
|
@@ -112,7 +114,8 @@
|
|
|
112
114
|
},
|
|
113
115
|
{
|
|
114
116
|
"name": "Card",
|
|
115
|
-
"description": "",
|
|
117
|
+
"description": "Content container with an optional edge-to-edge media slot; `stacked` (media above body) or `featured` (media beside body) layout.",
|
|
118
|
+
"slots": [],
|
|
116
119
|
"props": [
|
|
117
120
|
{
|
|
118
121
|
"name": "variant",
|
|
@@ -153,7 +156,8 @@
|
|
|
153
156
|
},
|
|
154
157
|
{
|
|
155
158
|
"name": "Input",
|
|
156
|
-
"description": "",
|
|
159
|
+
"description": "Single-line text input with pixel-true heights (24–48) and an error state. Inside a Field, id/aria-describedby/aria-invalid/required are wired automatically (D49).",
|
|
160
|
+
"slots": [],
|
|
157
161
|
"props": [
|
|
158
162
|
{
|
|
159
163
|
"name": "size",
|
|
@@ -167,7 +171,7 @@
|
|
|
167
171
|
"type": "boolean",
|
|
168
172
|
"required": false,
|
|
169
173
|
"default": false,
|
|
170
|
-
"description": "Show error styling."
|
|
174
|
+
"description": "Show error styling. Inside a Field, the Field's error also lights this."
|
|
171
175
|
},
|
|
172
176
|
{
|
|
173
177
|
"name": "ref",
|
|
@@ -187,7 +191,8 @@
|
|
|
187
191
|
},
|
|
188
192
|
{
|
|
189
193
|
"name": "Select",
|
|
190
|
-
"description": "",
|
|
194
|
+
"description": "Styled native `<select>` with pixel-true heights (24–48) and an error state. Inside a Field, id/aria-describedby/aria-invalid/required are wired automatically (D49).",
|
|
195
|
+
"slots": [],
|
|
191
196
|
"props": [
|
|
192
197
|
{
|
|
193
198
|
"name": "size",
|
|
@@ -201,7 +206,7 @@
|
|
|
201
206
|
"type": "boolean",
|
|
202
207
|
"required": false,
|
|
203
208
|
"default": false,
|
|
204
|
-
"description": "Show error styling."
|
|
209
|
+
"description": "Show error styling. Inside a Field, the Field's error also lights this."
|
|
205
210
|
},
|
|
206
211
|
{
|
|
207
212
|
"name": "ref",
|
|
@@ -219,9 +224,166 @@
|
|
|
219
224
|
}
|
|
220
225
|
]
|
|
221
226
|
},
|
|
227
|
+
{
|
|
228
|
+
"name": "Field",
|
|
229
|
+
"description": "Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49).",
|
|
230
|
+
"slots": [],
|
|
231
|
+
"props": [
|
|
232
|
+
{
|
|
233
|
+
"name": "label",
|
|
234
|
+
"type": "ReactNode",
|
|
235
|
+
"required": false,
|
|
236
|
+
"default": null,
|
|
237
|
+
"description": "Label content; renders a <label> (or <legend> in group mode)."
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"name": "description",
|
|
241
|
+
"type": "ReactNode",
|
|
242
|
+
"required": false,
|
|
243
|
+
"default": null,
|
|
244
|
+
"description": "Helper line under the control; replaced by error when error is set."
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"name": "error",
|
|
248
|
+
"type": "ReactNode",
|
|
249
|
+
"required": false,
|
|
250
|
+
"default": null,
|
|
251
|
+
"description": "Error content; when truthy it replaces the description and switches the\nfield (and a wrapped Input/Select) into error state."
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"name": "required",
|
|
255
|
+
"type": "boolean",
|
|
256
|
+
"required": false,
|
|
257
|
+
"default": false,
|
|
258
|
+
"description": "Renders the required marker and flows `required` to the control."
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"name": "group",
|
|
262
|
+
"type": "boolean",
|
|
263
|
+
"required": false,
|
|
264
|
+
"default": false,
|
|
265
|
+
"description": "Group mode: fieldset/legend wrapping several self-labeled controls\n(Checkbox/Switch); the message describes the whole group."
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"name": "htmlFor",
|
|
269
|
+
"type": "string",
|
|
270
|
+
"required": false,
|
|
271
|
+
"default": null,
|
|
272
|
+
"description": "Override the generated control id (pair it with the same id on the control)."
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"name": "ref",
|
|
276
|
+
"type": "Ref<HTMLDivElement | HTMLFieldSetElement>",
|
|
277
|
+
"required": false,
|
|
278
|
+
"default": null,
|
|
279
|
+
"description": "Forwarded ref to the root element."
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"name": "className",
|
|
283
|
+
"type": "string",
|
|
284
|
+
"required": false,
|
|
285
|
+
"default": null,
|
|
286
|
+
"description": "Additional CSS class name(s) merged onto the component's root element."
|
|
287
|
+
}
|
|
288
|
+
]
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"name": "Dialog",
|
|
292
|
+
"description": "Modal dialog on the native <dialog> top layer: focus trap, aria-modal and focus restore come from the platform; title/footer slots, Esc/backdrop/ close-button dismissal via onClose(reason) (D50).",
|
|
293
|
+
"slots": [
|
|
294
|
+
{
|
|
295
|
+
"name": "title",
|
|
296
|
+
"accepts": {
|
|
297
|
+
"contracts": [
|
|
298
|
+
"inline-content"
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
"cardinality": "0..1",
|
|
302
|
+
"order": 1
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"name": "body",
|
|
306
|
+
"accepts": {},
|
|
307
|
+
"cardinality": "0..*",
|
|
308
|
+
"order": 2
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"name": "footer",
|
|
312
|
+
"accepts": {
|
|
313
|
+
"components": [
|
|
314
|
+
"Button"
|
|
315
|
+
],
|
|
316
|
+
"contracts": [
|
|
317
|
+
"inline-content"
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
"cardinality": "0..*",
|
|
321
|
+
"order": 3
|
|
322
|
+
}
|
|
323
|
+
],
|
|
324
|
+
"props": [
|
|
325
|
+
{
|
|
326
|
+
"name": "open",
|
|
327
|
+
"type": "boolean",
|
|
328
|
+
"required": true,
|
|
329
|
+
"default": null,
|
|
330
|
+
"description": "Controlled open state; syncs to showModal()/close()."
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"name": "onClose",
|
|
334
|
+
"type": "(reason: \"esc\" | \"backdrop\" | \"close-button\") => void",
|
|
335
|
+
"required": true,
|
|
336
|
+
"default": null,
|
|
337
|
+
"description": "Called on every dismissal attempt with its source; the consumer flips `open`."
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"name": "title",
|
|
341
|
+
"type": "ReactNode",
|
|
342
|
+
"required": false,
|
|
343
|
+
"default": null,
|
|
344
|
+
"description": "Heading; renders an <h2> wired to aria-labelledby. Without it, pass aria-label."
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"name": "footer",
|
|
348
|
+
"type": "ReactNode",
|
|
349
|
+
"required": false,
|
|
350
|
+
"default": null,
|
|
351
|
+
"description": "Action row (Buttons — one accent per group, danger for destructive)."
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"name": "width",
|
|
355
|
+
"type": "400 | 560 | 720",
|
|
356
|
+
"required": false,
|
|
357
|
+
"default": 560,
|
|
358
|
+
"description": "Panel width in px (400 | 560 | 720)."
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"name": "dismissible",
|
|
362
|
+
"type": "boolean",
|
|
363
|
+
"required": false,
|
|
364
|
+
"default": true,
|
|
365
|
+
"description": "false = no close button, Esc and backdrop swallowed — footer is the only exit."
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"name": "ref",
|
|
369
|
+
"type": "Ref<HTMLDialogElement>",
|
|
370
|
+
"required": false,
|
|
371
|
+
"default": null,
|
|
372
|
+
"description": "Forwarded ref to the underlying <dialog> element."
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"name": "className",
|
|
376
|
+
"type": "string",
|
|
377
|
+
"required": false,
|
|
378
|
+
"default": null,
|
|
379
|
+
"description": "Additional CSS class name(s) merged onto the component's root element."
|
|
380
|
+
}
|
|
381
|
+
]
|
|
382
|
+
},
|
|
222
383
|
{
|
|
223
384
|
"name": "Checkbox",
|
|
224
|
-
"description": "",
|
|
385
|
+
"description": "Native checkbox with a built-in label; for independent binary choices.",
|
|
386
|
+
"slots": [],
|
|
225
387
|
"props": [
|
|
226
388
|
{
|
|
227
389
|
"name": "children",
|
|
@@ -248,7 +410,8 @@
|
|
|
248
410
|
},
|
|
249
411
|
{
|
|
250
412
|
"name": "Switch",
|
|
251
|
-
"description": "",
|
|
413
|
+
"description": "On/off toggle (`role=\"switch\"`) with a built-in label; for settings that take effect immediately.",
|
|
414
|
+
"slots": [],
|
|
252
415
|
"props": [
|
|
253
416
|
{
|
|
254
417
|
"name": "children",
|
|
@@ -275,7 +438,8 @@
|
|
|
275
438
|
},
|
|
276
439
|
{
|
|
277
440
|
"name": "Tag",
|
|
278
|
-
"description": "",
|
|
441
|
+
"description": "Compact label for status or category; semantic variants, optional subtle tint and dismiss button.",
|
|
442
|
+
"slots": [],
|
|
279
443
|
"props": [
|
|
280
444
|
{
|
|
281
445
|
"name": "variant",
|
|
@@ -316,7 +480,8 @@
|
|
|
316
480
|
},
|
|
317
481
|
{
|
|
318
482
|
"name": "Tooltip",
|
|
319
|
-
"description": "",
|
|
483
|
+
"description": "Short hover/focus hint attached to a single trigger element.",
|
|
484
|
+
"slots": [],
|
|
320
485
|
"props": [
|
|
321
486
|
{
|
|
322
487
|
"name": "content",
|
|
@@ -343,7 +508,8 @@
|
|
|
343
508
|
},
|
|
344
509
|
{
|
|
345
510
|
"name": "NavBar",
|
|
346
|
-
"description": "",
|
|
511
|
+
"description": "Top navigation bar with brand, nav-link, and trailing-action slots.",
|
|
512
|
+
"slots": [],
|
|
347
513
|
"props": [
|
|
348
514
|
{
|
|
349
515
|
"name": "brand",
|
|
@@ -384,7 +550,8 @@
|
|
|
384
550
|
},
|
|
385
551
|
{
|
|
386
552
|
"name": "AspectRatio",
|
|
387
|
-
"description": "",
|
|
553
|
+
"description": "Fixed-aspect-ratio box that sizes its child media.",
|
|
554
|
+
"slots": [],
|
|
388
555
|
"props": [
|
|
389
556
|
{
|
|
390
557
|
"name": "ratio",
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
._button_m8fis_3{display:inline-flex;align-items:center;justify-content:center;gap:var(--psi-space-6);border:none;border-radius:var(--psi-radius-8);cursor:pointer;font-family:var(--psi-font-sans);white-space:nowrap;text-decoration:none;-webkit-user-select:none;user-select:none;transition:background-color var(--psi-duration-150) var(--psi-ease-standard),color var(--psi-duration-150) var(--psi-ease-standard)}._button_m8fis_3:focus-visible{outline:2px solid var(--psi-button-focus-ring);outline-offset:2px}._button_m8fis_3:disabled{opacity:.4;cursor:not-allowed}._button_m8fis_3._disabled_m8fis_31{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_m8fis_39{height:var(--psi-size-24);padding-inline:var(--psi-space-8);font:var(--psi-button-font, var(--psi-text-12-16-medium))}._size32_m8fis_45{height:var(--psi-size-32);padding-inline:var(--psi-space-12);font:var(--psi-button-font, var(--psi-text-14-20-medium))}._size40_m8fis_51{height:var(--psi-size-40);padding-inline:var(--psi-space-16);font:var(--psi-button-font, var(--psi-text-16-24-medium))}._size48_m8fis_57{height:var(--psi-size-48);padding-inline:var(--psi-space-20);font:var(--psi-button-font, var(--psi-text-18-28-medium))}._accent_m8fis_66{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_m8fis_66:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-bg-hover)}._accent_m8fis_66:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-bg-active)}._accentSubtle_m8fis_78{background:var(--psi-button-accent-subtle-bg);color:var(--psi-button-accent-subtle-fg)}._accentSubtle_m8fis_78:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-subtle-bg-hover)}._accentSubtle_m8fis_78:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-subtle-bg-active)}._neutral_m8fis_90{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_m8fis_90:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-bg-hover)}._neutral_m8fis_90:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-bg-active)}._neutralSubtle_m8fis_102{background:var(--psi-button-neutral-subtle-bg);color:var(--psi-button-neutral-subtle-fg)}._neutralSubtle_m8fis_102:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-subtle-bg-hover)}._neutralSubtle_m8fis_102:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-subtle-bg-active)}._ghost_m8fis_114{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_m8fis_114:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-ghost-bg-hover)}._ghost_m8fis_114:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-ghost-bg-active)}._danger_m8fis_126{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_m8fis_126:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-bg-hover)}._danger_m8fis_126:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-bg-active)}._dangerSubtle_m8fis_138{background:var(--psi-button-danger-subtle-bg);color:var(--psi-button-danger-subtle-fg)}._dangerSubtle_m8fis_138:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-subtle-bg-hover)}._dangerSubtle_m8fis_138:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-subtle-bg-active)}._outline_m8fis_150{background:var(--psi-button-outline-bg);color:var(--psi-button-outline-fg);border:1px solid var(--psi-button-outline-border)}._outline_m8fis_150:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-outline-bg-hover);color:var(--psi-button-outline-fg-hover);border-color:transparent}._outline_m8fis_150:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-outline-bg-active)}._iconButton_1dldx_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-radius-8);cursor:pointer;padding:0;text-decoration:none;-webkit-user-select:none;user-select:none;transition:background-color var(--psi-duration-150) var(--psi-ease-standard),color var(--psi-duration-150) var(--psi-ease-standard)}._iconButton_1dldx_3:focus-visible{outline:2px solid var(--psi-button-focus-ring);outline-offset:2px}._iconButton_1dldx_3:disabled{opacity:.4;cursor:not-allowed}._iconButton_1dldx_3._disabled_1dldx_29{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_1dldx_37{width:var(--psi-size-24);height:var(--psi-size-24)}._size32_1dldx_42{width:var(--psi-size-32);height:var(--psi-size-32)}._size40_1dldx_47{width:var(--psi-size-40);height:var(--psi-size-40)}._size48_1dldx_52{width:var(--psi-size-48);height:var(--psi-size-48)}._accent_1dldx_60{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_1dldx_60:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-accent-bg-hover)}._accent_1dldx_60:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-accent-bg-active)}._neutral_1dldx_72{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_1dldx_72:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-neutral-bg-hover)}._neutral_1dldx_72:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-neutral-bg-active)}._ghost_1dldx_84{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_1dldx_84:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-ghost-bg-hover)}._ghost_1dldx_84:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-ghost-bg-active)}._danger_1dldx_96{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_1dldx_96:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-danger-bg-hover)}._danger_1dldx_96:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-danger-bg-active)}._card_1btb3_1{background:var(--psi-card-bg);border:1px solid var(--psi-card-border);border-radius:var(--psi-card-radius);overflow:hidden}._stacked_1btb3_8{display:flex;flex-direction:column;gap:var(--psi-card-gap)}._featured_1btb3_10{display:grid;grid-template-columns:1.6fr 1fr;gap:var(--psi-card-gap);align-items:start}@media(max-width:960px){._featured_1btb3_10{grid-template-columns:1fr}}._media_1btb3_22{min-width:0}._body_1btb3_23{min-width:0;display:flex;flex-direction:column;gap:var(--psi-card-gap);padding:var(--psi-card-gap)}._hoverLift_1btb3_31{transition:transform var(--psi-duration-350) var(--psi-ease-standard)}._hoverLift_1btb3_31:hover{transform:translateY(-6px)}._navbar_1auk1_1{position:sticky;top:0;z-index:var(--psi-z-nav);background:var(--psi-navbar-bg);backdrop-filter:blur(var(--psi-navbar-blur));-webkit-backdrop-filter:blur(var(--psi-navbar-blur));border-bottom:1px solid var(--psi-navbar-border)}._inner_1auk1_11{display:flex;align-items:center;gap:var(--psi-space-24);height:var(--psi-navbar-height)}._brand_1auk1_18{display:flex;align-items:center}._links_1auk1_19{display:flex;align-items:center;gap:var(--psi-space-20);margin-inline-start:auto}._actions_1auk1_25{display:flex;align-items:center;gap:var(--psi-space-8)}._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}._input_8tzcf_3{display:block;width:100%;border:1px solid var(--psi-input-border);border-radius:var(--psi-radius-8);background:var(--psi-input-bg);color:var(--psi-input-fg);font-family:var(--psi-font-sans);padding-inline:var(--psi-space-8);transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._input_8tzcf_3::placeholder{color:var(--psi-input-placeholder)}._input_8tzcf_3:hover:not(:disabled):not(:focus){border-color:var(--psi-input-border-hover)}._input_8tzcf_3:focus{outline:2px solid var(--psi-input-focus-ring);outline-offset:-1px;border-color:transparent}._input_8tzcf_3:disabled{opacity:.4;cursor:not-allowed}._size24_8tzcf_38{height:var(--psi-size-24);font:var(--psi-text-12-16-regular)}._size32_8tzcf_43{height:var(--psi-size-32);font:var(--psi-text-14-20-regular)}._size40_8tzcf_48{height:var(--psi-size-40);font:var(--psi-text-16-24-regular)}._size48_8tzcf_53{height:var(--psi-size-48);font:var(--psi-text-18-28-medium)}._error_8tzcf_60{border-color:var(--psi-input-border-error)}._error_8tzcf_60:hover:not(:disabled):not(:focus){border-color:var(--psi-input-border-error)}._select_140kg_3{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--psi-select-border);border-radius:var(--psi-radius-8);background-color:var(--psi-select-bg);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right var(--psi-space-8) center;color:var(--psi-select-fg);font-family:var(--psi-font-sans);padding-inline-start:var(--psi-space-8);padding-inline-end:var(--psi-space-24);cursor:pointer;transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._select_140kg_3:hover:not(:disabled):not(:focus){border-color:var(--psi-select-border-hover)}._select_140kg_3:focus{outline:2px solid var(--psi-select-focus-ring);outline-offset:-1px;border-color:transparent}._select_140kg_3:disabled{opacity:.4;cursor:not-allowed}._size24_140kg_40{height:var(--psi-size-24);font:var(--psi-text-12-16-regular)}._size32_140kg_45{height:var(--psi-size-32);font:var(--psi-text-14-20-regular)}._size40_140kg_50{height:var(--psi-size-40);font:var(--psi-text-16-24-regular)}._size48_140kg_55{height:var(--psi-size-48);font:var(--psi-text-18-28-medium)}._error_140kg_62{border-color:var(--psi-select-border-error)}._error_140kg_62:hover:not(:disabled):not(:focus){border-color:var(--psi-select-border-error)}._label_n457n_3{display:inline-flex;align-items:center;gap:var(--psi-space-8);cursor:pointer;-webkit-user-select:none;user-select:none;font:var(--psi-text-14-20-regular);color:var(--psi-checkbox-fg)}._disabled_n457n_13{opacity:.4;cursor:not-allowed}._input_n457n_20{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._indicator_n457n_34{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;border:1px solid var(--psi-checkbox-box-border);border-radius:var(--psi-radius-4);background:var(--psi-checkbox-box-bg);transition:background-color var(--psi-duration-150) var(--psi-ease-standard),border-color var(--psi-duration-150) var(--psi-ease-standard)}._input_n457n_20:checked+._indicator_n457n_34{background:var(--psi-checkbox-box-bg-checked);border-color:var(--psi-checkbox-box-border-checked)}._input_n457n_20:checked+._indicator_n457n_34:after{content:"";display:block;width:4px;height:8px;border:solid var(--psi-checkbox-check-fg);border-width:0 2px 2px 0;transform:rotate(45deg) translate(-.5px,-.5px)}._input_n457n_20:focus-visible+._indicator_n457n_34{outline:2px solid var(--psi-checkbox-focus-ring);outline-offset:2px}._text_n457n_74{color:var(--psi-checkbox-fg)}._label_jru2c_3{display:inline-flex;align-items:center;gap:var(--psi-space-8);cursor:pointer;-webkit-user-select:none;user-select:none;font:var(--psi-text-14-20-regular);color:var(--psi-switch-fg)}._disabled_jru2c_13{opacity:.4;cursor:not-allowed}._input_jru2c_20{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._track_jru2c_34{position:relative;display:inline-flex;align-items:center;width:36px;height:20px;flex-shrink:0;border-radius:var(--psi-radius-full);background:var(--psi-switch-track-bg);transition:background-color var(--psi-duration-150) var(--psi-ease-standard)}._input_jru2c_20:checked+._track_jru2c_34{background:var(--psi-switch-track-bg-checked)}._input_jru2c_20:focus-visible+._track_jru2c_34{outline:2px solid var(--psi-switch-focus-ring);outline-offset:2px}._thumb_jru2c_58{position:absolute;width:16px;height:16px;border-radius:var(--psi-radius-full);background:var(--psi-switch-thumb-bg);left:2px;transition:left var(--psi-duration-150) var(--psi-ease-standard);box-shadow:0 1px 2px #00000029}._input_jru2c_20:checked+._track_jru2c_34 ._thumb_jru2c_58{left:18px}._text_jru2c_75{color:var(--psi-switch-fg)}._tag_3oysa_3{display:inline-flex;align-items:center;gap:var(--psi-space-4);height:24px;padding-inline:var(--psi-space-8);border-radius:var(--psi-radius-full);font:var(--psi-text-12-16-medium);white-space:nowrap;-webkit-user-select:none;user-select:none}._dismiss_3oysa_17{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:none;color:inherit;cursor:pointer;opacity:.7;margin-inline-start:var(--psi-space-2);margin-inline-end:calc(-1 * var(--psi-space-4));border-radius:var(--psi-radius-full)}._dismiss_3oysa_17:hover{opacity:1}._dismiss_3oysa_17:focus-visible{outline:2px solid var(--psi-tag-focus-ring);outline-offset:2px}._neutral_3oysa_43{background:var(--psi-tag-neutral-bg);color:var(--psi-tag-neutral-fg)}._accent_3oysa_48{background:var(--psi-tag-accent-bg);color:var(--psi-tag-accent-fg)}._success_3oysa_53{background:var(--psi-tag-success-bg);color:var(--psi-tag-success-fg)}._warning_3oysa_58{background:var(--psi-tag-warning-bg);color:var(--psi-tag-warning-fg)}._danger_3oysa_63{background:var(--psi-tag-danger-bg);color:var(--psi-tag-danger-fg)}._neutralSubtle_3oysa_70{background:var(--psi-tag-neutral-subtle-bg);color:var(--psi-tag-neutral-subtle-fg)}._accentSubtle_3oysa_75{background:var(--psi-tag-accent-subtle-bg);color:var(--psi-tag-accent-subtle-fg)}._successSubtle_3oysa_80{background:var(--psi-tag-success-subtle-bg);color:var(--psi-tag-success-subtle-fg)}._warningSubtle_3oysa_85{background:var(--psi-tag-warning-subtle-bg);color:var(--psi-tag-warning-subtle-fg)}._dangerSubtle_3oysa_90{background:var(--psi-tag-danger-subtle-bg);color:var(--psi-tag-danger-subtle-fg)}._wrapper_17qua_3{position:relative;display:inline-flex}._tooltip_17qua_10{position:absolute;z-index:var(--psi-z-tooltip);padding:var(--psi-space-4) var(--psi-space-8);border-radius:var(--psi-radius-6);background:var(--psi-tooltip-bg);color:var(--psi-tooltip-fg);font:var(--psi-text-12-16-regular);white-space:nowrap;pointer-events:none}._top_17qua_24{bottom:100%;left:50%;transform:translate(-50%);margin-bottom:var(--psi-space-4)}._bottom_17qua_31{top:100%;left:50%;transform:translate(-50%);margin-top:var(--psi-space-4)}._left_17qua_38{right:100%;top:50%;transform:translateY(-50%);margin-right:var(--psi-space-4)}._right_17qua_45{left:100%;top:50%;transform:translateY(-50%);margin-left:var(--psi-space-4)}
|
|
1
|
+
._button_m8fis_3{display:inline-flex;align-items:center;justify-content:center;gap:var(--psi-space-6);border:none;border-radius:var(--psi-radius-8);cursor:pointer;font-family:var(--psi-font-sans);white-space:nowrap;text-decoration:none;-webkit-user-select:none;user-select:none;transition:background-color var(--psi-duration-150) var(--psi-ease-standard),color var(--psi-duration-150) var(--psi-ease-standard)}._button_m8fis_3:focus-visible{outline:2px solid var(--psi-button-focus-ring);outline-offset:2px}._button_m8fis_3:disabled{opacity:.4;cursor:not-allowed}._button_m8fis_3._disabled_m8fis_31{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_m8fis_39{height:var(--psi-size-24);padding-inline:var(--psi-space-8);font:var(--psi-button-font, var(--psi-text-12-16-medium))}._size32_m8fis_45{height:var(--psi-size-32);padding-inline:var(--psi-space-12);font:var(--psi-button-font, var(--psi-text-14-20-medium))}._size40_m8fis_51{height:var(--psi-size-40);padding-inline:var(--psi-space-16);font:var(--psi-button-font, var(--psi-text-16-24-medium))}._size48_m8fis_57{height:var(--psi-size-48);padding-inline:var(--psi-space-20);font:var(--psi-button-font, var(--psi-text-18-28-medium))}._accent_m8fis_66{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_m8fis_66:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-bg-hover)}._accent_m8fis_66:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-bg-active)}._accentSubtle_m8fis_78{background:var(--psi-button-accent-subtle-bg);color:var(--psi-button-accent-subtle-fg)}._accentSubtle_m8fis_78:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-subtle-bg-hover)}._accentSubtle_m8fis_78:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-accent-subtle-bg-active)}._neutral_m8fis_90{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_m8fis_90:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-bg-hover)}._neutral_m8fis_90:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-bg-active)}._neutralSubtle_m8fis_102{background:var(--psi-button-neutral-subtle-bg);color:var(--psi-button-neutral-subtle-fg)}._neutralSubtle_m8fis_102:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-subtle-bg-hover)}._neutralSubtle_m8fis_102:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-neutral-subtle-bg-active)}._ghost_m8fis_114{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_m8fis_114:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-ghost-bg-hover)}._ghost_m8fis_114:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-ghost-bg-active)}._danger_m8fis_126{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_m8fis_126:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-bg-hover)}._danger_m8fis_126:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-bg-active)}._dangerSubtle_m8fis_138{background:var(--psi-button-danger-subtle-bg);color:var(--psi-button-danger-subtle-fg)}._dangerSubtle_m8fis_138:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-subtle-bg-hover)}._dangerSubtle_m8fis_138:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-danger-subtle-bg-active)}._outline_m8fis_150{background:var(--psi-button-outline-bg);color:var(--psi-button-outline-fg);border:1px solid var(--psi-button-outline-border)}._outline_m8fis_150:hover:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-outline-bg-hover);color:var(--psi-button-outline-fg-hover);border-color:transparent}._outline_m8fis_150:active:not(:disabled):not(._disabled_m8fis_31){background:var(--psi-button-outline-bg-active)}._iconButton_1dldx_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-radius-8);cursor:pointer;padding:0;text-decoration:none;-webkit-user-select:none;user-select:none;transition:background-color var(--psi-duration-150) var(--psi-ease-standard),color var(--psi-duration-150) var(--psi-ease-standard)}._iconButton_1dldx_3:focus-visible{outline:2px solid var(--psi-button-focus-ring);outline-offset:2px}._iconButton_1dldx_3:disabled{opacity:.4;cursor:not-allowed}._iconButton_1dldx_3._disabled_1dldx_29{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_1dldx_37{width:var(--psi-size-24);height:var(--psi-size-24)}._size32_1dldx_42{width:var(--psi-size-32);height:var(--psi-size-32)}._size40_1dldx_47{width:var(--psi-size-40);height:var(--psi-size-40)}._size48_1dldx_52{width:var(--psi-size-48);height:var(--psi-size-48)}._accent_1dldx_60{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_1dldx_60:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-accent-bg-hover)}._accent_1dldx_60:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-accent-bg-active)}._neutral_1dldx_72{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_1dldx_72:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-neutral-bg-hover)}._neutral_1dldx_72:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-neutral-bg-active)}._ghost_1dldx_84{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_1dldx_84:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-ghost-bg-hover)}._ghost_1dldx_84:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-ghost-bg-active)}._danger_1dldx_96{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_1dldx_96:hover:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-danger-bg-hover)}._danger_1dldx_96:active:not(:disabled):not(._disabled_1dldx_29){background:var(--psi-button-danger-bg-active)}._card_1btb3_1{background:var(--psi-card-bg);border:1px solid var(--psi-card-border);border-radius:var(--psi-card-radius);overflow:hidden}._stacked_1btb3_8{display:flex;flex-direction:column;gap:var(--psi-card-gap)}._featured_1btb3_10{display:grid;grid-template-columns:1.6fr 1fr;gap:var(--psi-card-gap);align-items:start}@media(max-width:960px){._featured_1btb3_10{grid-template-columns:1fr}}._media_1btb3_22{min-width:0}._body_1btb3_23{min-width:0;display:flex;flex-direction:column;gap:var(--psi-card-gap);padding:var(--psi-card-gap)}._hoverLift_1btb3_31{transition:transform var(--psi-duration-350) var(--psi-ease-standard)}._hoverLift_1btb3_31:hover{transform:translateY(-6px)}._navbar_1uory_1{position:sticky;top:0;z-index:var(--psi-z-nav);background:var(--psi-navbar-bg);backdrop-filter:blur(var(--psi-navbar-blur));-webkit-backdrop-filter:blur(var(--psi-navbar-blur));border-bottom:1px solid var(--psi-navbar-border)}._inner_1uory_11{display:flex;align-items:center;gap:var(--psi-space-24);height:var(--psi-navbar-height)}._brand_1uory_18{display:flex;align-items:center}._links_1uory_19{display:flex;align-items:center;gap:var(--psi-space-20);margin-inline-start:auto}._links_1uory_19 a,._brand_1uory_18 a{text-decoration:none;transition:color var(--psi-duration-150) var(--psi-ease-soft)}._links_1uory_19 a{color:var(--psi-navbar-link-fg)}._links_1uory_19 a:hover,._brand_1uory_18 a{color:var(--psi-navbar-link-fg-hover)}._links_1uory_19 a:focus-visible,._brand_1uory_18 a:focus-visible{outline:2px solid var(--psi-navbar-focus-ring);outline-offset:2px}._actions_1uory_49{display:flex;align-items:center;gap:var(--psi-space-8)}._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}._field_lplye_1{display:grid;gap:var(--psi-field-gap);border:0;margin:0;padding:0;min-width:0}._label_lplye_10{font:var(--psi-text-14-20-medium);color:var(--psi-field-label-fg);padding:0}._marker_lplye_16{color:var(--psi-field-marker-fg)}._message_lplye_20{margin:0;font:var(--psi-text-12-16-regular);color:var(--psi-field-message-fg)}._invalid_lplye_26 ._message_lplye_20{color:var(--psi-field-error-fg)}._dialog_j8ndn_2{padding:0;border:1px solid var(--psi-dialog-border);border-radius:var(--psi-radius-12);background:var(--psi-dialog-bg);color:var(--psi-dialog-fg);max-width:calc(100vw - var(--psi-space-32))}._dialog_j8ndn_2::backdrop{background:var(--psi-dialog-backdrop)}._dialog_j8ndn_2[open]{animation:_dialog-enter_j8ndn_1 var(--psi-duration-200) var(--psi-ease-soft)}._dialog_j8ndn_2[open]::backdrop{animation:_backdrop-enter_j8ndn_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _dialog-enter_j8ndn_1{0%{opacity:0;transform:scale(.97)}}@keyframes _backdrop-enter_j8ndn_1{0%{opacity:0}}._w400_j8ndn_31{width:400px}._w560_j8ndn_32{width:560px}._w720_j8ndn_33{width:720px}._panel_j8ndn_35{display:grid;gap:var(--psi-space-16);padding:var(--psi-space-24)}._header_j8ndn_41{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--psi-space-12)}._title_j8ndn_48{margin:0;font:var(--psi-text-18-28-medium);color:var(--psi-dialog-title-fg)}._footer_j8ndn_54{display:flex;justify-content:flex-end;gap:var(--psi-space-8)}._input_8tzcf_3{display:block;width:100%;border:1px solid var(--psi-input-border);border-radius:var(--psi-radius-8);background:var(--psi-input-bg);color:var(--psi-input-fg);font-family:var(--psi-font-sans);padding-inline:var(--psi-space-8);transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._input_8tzcf_3::placeholder{color:var(--psi-input-placeholder)}._input_8tzcf_3:hover:not(:disabled):not(:focus){border-color:var(--psi-input-border-hover)}._input_8tzcf_3:focus{outline:2px solid var(--psi-input-focus-ring);outline-offset:-1px;border-color:transparent}._input_8tzcf_3:disabled{opacity:.4;cursor:not-allowed}._size24_8tzcf_38{height:var(--psi-size-24);font:var(--psi-text-12-16-regular)}._size32_8tzcf_43{height:var(--psi-size-32);font:var(--psi-text-14-20-regular)}._size40_8tzcf_48{height:var(--psi-size-40);font:var(--psi-text-16-24-regular)}._size48_8tzcf_53{height:var(--psi-size-48);font:var(--psi-text-18-28-medium)}._error_8tzcf_60{border-color:var(--psi-input-border-error)}._error_8tzcf_60:hover:not(:disabled):not(:focus){border-color:var(--psi-input-border-error)}._select_140kg_3{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--psi-select-border);border-radius:var(--psi-radius-8);background-color:var(--psi-select-bg);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right var(--psi-space-8) center;color:var(--psi-select-fg);font-family:var(--psi-font-sans);padding-inline-start:var(--psi-space-8);padding-inline-end:var(--psi-space-24);cursor:pointer;transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._select_140kg_3:hover:not(:disabled):not(:focus){border-color:var(--psi-select-border-hover)}._select_140kg_3:focus{outline:2px solid var(--psi-select-focus-ring);outline-offset:-1px;border-color:transparent}._select_140kg_3:disabled{opacity:.4;cursor:not-allowed}._size24_140kg_40{height:var(--psi-size-24);font:var(--psi-text-12-16-regular)}._size32_140kg_45{height:var(--psi-size-32);font:var(--psi-text-14-20-regular)}._size40_140kg_50{height:var(--psi-size-40);font:var(--psi-text-16-24-regular)}._size48_140kg_55{height:var(--psi-size-48);font:var(--psi-text-18-28-medium)}._error_140kg_62{border-color:var(--psi-select-border-error)}._error_140kg_62:hover:not(:disabled):not(:focus){border-color:var(--psi-select-border-error)}._label_n457n_3{display:inline-flex;align-items:center;gap:var(--psi-space-8);cursor:pointer;-webkit-user-select:none;user-select:none;font:var(--psi-text-14-20-regular);color:var(--psi-checkbox-fg)}._disabled_n457n_13{opacity:.4;cursor:not-allowed}._input_n457n_20{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._indicator_n457n_34{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;border:1px solid var(--psi-checkbox-box-border);border-radius:var(--psi-radius-4);background:var(--psi-checkbox-box-bg);transition:background-color var(--psi-duration-150) var(--psi-ease-standard),border-color var(--psi-duration-150) var(--psi-ease-standard)}._input_n457n_20:checked+._indicator_n457n_34{background:var(--psi-checkbox-box-bg-checked);border-color:var(--psi-checkbox-box-border-checked)}._input_n457n_20:checked+._indicator_n457n_34:after{content:"";display:block;width:4px;height:8px;border:solid var(--psi-checkbox-check-fg);border-width:0 2px 2px 0;transform:rotate(45deg) translate(-.5px,-.5px)}._input_n457n_20:focus-visible+._indicator_n457n_34{outline:2px solid var(--psi-checkbox-focus-ring);outline-offset:2px}._text_n457n_74{color:var(--psi-checkbox-fg)}._label_jru2c_3{display:inline-flex;align-items:center;gap:var(--psi-space-8);cursor:pointer;-webkit-user-select:none;user-select:none;font:var(--psi-text-14-20-regular);color:var(--psi-switch-fg)}._disabled_jru2c_13{opacity:.4;cursor:not-allowed}._input_jru2c_20{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._track_jru2c_34{position:relative;display:inline-flex;align-items:center;width:36px;height:20px;flex-shrink:0;border-radius:var(--psi-radius-full);background:var(--psi-switch-track-bg);transition:background-color var(--psi-duration-150) var(--psi-ease-standard)}._input_jru2c_20:checked+._track_jru2c_34{background:var(--psi-switch-track-bg-checked)}._input_jru2c_20:focus-visible+._track_jru2c_34{outline:2px solid var(--psi-switch-focus-ring);outline-offset:2px}._thumb_jru2c_58{position:absolute;width:16px;height:16px;border-radius:var(--psi-radius-full);background:var(--psi-switch-thumb-bg);left:2px;transition:left var(--psi-duration-150) var(--psi-ease-standard);box-shadow:0 1px 2px #00000029}._input_jru2c_20:checked+._track_jru2c_34 ._thumb_jru2c_58{left:18px}._text_jru2c_75{color:var(--psi-switch-fg)}._tag_3oysa_3{display:inline-flex;align-items:center;gap:var(--psi-space-4);height:24px;padding-inline:var(--psi-space-8);border-radius:var(--psi-radius-full);font:var(--psi-text-12-16-medium);white-space:nowrap;-webkit-user-select:none;user-select:none}._dismiss_3oysa_17{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:none;color:inherit;cursor:pointer;opacity:.7;margin-inline-start:var(--psi-space-2);margin-inline-end:calc(-1 * var(--psi-space-4));border-radius:var(--psi-radius-full)}._dismiss_3oysa_17:hover{opacity:1}._dismiss_3oysa_17:focus-visible{outline:2px solid var(--psi-tag-focus-ring);outline-offset:2px}._neutral_3oysa_43{background:var(--psi-tag-neutral-bg);color:var(--psi-tag-neutral-fg)}._accent_3oysa_48{background:var(--psi-tag-accent-bg);color:var(--psi-tag-accent-fg)}._success_3oysa_53{background:var(--psi-tag-success-bg);color:var(--psi-tag-success-fg)}._warning_3oysa_58{background:var(--psi-tag-warning-bg);color:var(--psi-tag-warning-fg)}._danger_3oysa_63{background:var(--psi-tag-danger-bg);color:var(--psi-tag-danger-fg)}._neutralSubtle_3oysa_70{background:var(--psi-tag-neutral-subtle-bg);color:var(--psi-tag-neutral-subtle-fg)}._accentSubtle_3oysa_75{background:var(--psi-tag-accent-subtle-bg);color:var(--psi-tag-accent-subtle-fg)}._successSubtle_3oysa_80{background:var(--psi-tag-success-subtle-bg);color:var(--psi-tag-success-subtle-fg)}._warningSubtle_3oysa_85{background:var(--psi-tag-warning-subtle-bg);color:var(--psi-tag-warning-subtle-fg)}._dangerSubtle_3oysa_90{background:var(--psi-tag-danger-subtle-bg);color:var(--psi-tag-danger-subtle-fg)}._wrapper_17qua_3{position:relative;display:inline-flex}._tooltip_17qua_10{position:absolute;z-index:var(--psi-z-tooltip);padding:var(--psi-space-4) var(--psi-space-8);border-radius:var(--psi-radius-6);background:var(--psi-tooltip-bg);color:var(--psi-tooltip-fg);font:var(--psi-text-12-16-regular);white-space:nowrap;pointer-events:none}._top_17qua_24{bottom:100%;left:50%;transform:translate(-50%);margin-bottom:var(--psi-space-4)}._bottom_17qua_31{top:100%;left:50%;transform:translate(-50%);margin-top:var(--psi-space-4)}._left_17qua_38{right:100%;top:50%;transform:translateY(-50%);margin-right:var(--psi-space-4)}._right_17qua_45{left:100%;top:50%;transform:translateY(-50%);margin-left:var(--psi-space-4)}
|
package/docs/AspectRatio.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# AspectRatio
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Fixed-aspect-ratio box that sizes its child media.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -25,3 +25,5 @@ Override `--psi-aspect-ratio-*` custom properties at any scope; interactive stat
|
|
|
25
25
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
26
26
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
27
27
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
28
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
29
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Button.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Button
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Action trigger. With `href` renders an anchor with identical styling (D33); `disabled` then maps to `aria-disabled`.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -48,3 +48,5 @@ Override `--psi-button-*` custom properties at any scope; interactive states der
|
|
|
48
48
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
49
49
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
50
50
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
51
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
52
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Card.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Card
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Content container with an optional edge-to-edge media slot; `stacked` (media above body) or `featured` (media beside body) layout.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -37,3 +37,5 @@ Override `--psi-card-*` custom properties at any scope; interactive states deriv
|
|
|
37
37
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
38
38
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
39
39
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
40
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
41
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Checkbox.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Checkbox
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Native checkbox with a built-in label; for independent binary choices.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -32,3 +32,5 @@ Override `--psi-checkbox-*` custom properties at any scope; interactive states d
|
|
|
32
32
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
33
33
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
34
34
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
35
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
36
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Dialog.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
|
+
# Dialog
|
|
3
|
+
|
|
4
|
+
Modal dialog on the native <dialog> top layer: focus trap, aria-modal and focus restore come from the platform; title/footer slots, Esc/backdrop/ close-button dismissal via onClose(reason) (D50).
|
|
5
|
+
|
|
6
|
+
## Props
|
|
7
|
+
|
|
8
|
+
| Prop | Type | Default | Required | Description |
|
|
9
|
+
|---|---|---|---|---|
|
|
10
|
+
| `open` | `boolean` | — | yes | Controlled open state; syncs to showModal()/close(). |
|
|
11
|
+
| `onClose` | `(reason: "esc" \| "backdrop" \| "close-button") => void` | — | yes | Called on every dismissal attempt with its source; the consumer flips `open`. |
|
|
12
|
+
| `title` | `ReactNode` | — | no | Heading; renders an <h2> wired to aria-labelledby. Without it, pass aria-label. |
|
|
13
|
+
| `footer` | `ReactNode` | — | no | Action row (Buttons — one accent per group, danger for destructive). |
|
|
14
|
+
| `width` | `400 \| 560 \| 720` | 560 | no | Panel width in px (400 \| 560 \| 720). |
|
|
15
|
+
| `dismissible` | `boolean` | true | no | false = no close button, Esc and backdrop swallowed — footer is the only exit. |
|
|
16
|
+
| `ref` | `Ref<HTMLDialogElement>` | — | no | Forwarded ref to the underlying <dialog> element. |
|
|
17
|
+
| `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
|
|
18
|
+
|
|
19
|
+
## Keyboard & assistive tech
|
|
20
|
+
|
|
21
|
+
| Keys | Behavior |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Esc | Dismisses via onClose('esc') when dismissible; swallowed otherwise. |
|
|
24
|
+
| Tab | Focus is trapped inside by the native <dialog> top layer; restored on close. |
|
|
25
|
+
|
|
26
|
+
Rendered with showModal(): aria-modal, inert background and focus restore come from the platform. title wires aria-labelledby; without title, pass aria-label. Backdrop click dismisses only when dismissible.
|
|
27
|
+
|
|
28
|
+
## Theming
|
|
29
|
+
|
|
30
|
+
Override `--psi-dialog-*` custom properties at any scope; interactive states derive automatically (L - 0.04 hover, L - 0.08 active).
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- One accent per visual group; everything else neutral or ghost.
|
|
37
|
+
- danger only for actions with real consequences.
|
|
38
|
+
- Sizes are px numbers (24|32|40|48), never S/M/L.
|
|
39
|
+
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
40
|
+
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
41
|
+
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
42
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
43
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Field.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
|
+
# Field
|
|
3
|
+
|
|
4
|
+
Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49).
|
|
5
|
+
|
|
6
|
+
## Props
|
|
7
|
+
|
|
8
|
+
| Prop | Type | Default | Required | Description |
|
|
9
|
+
|---|---|---|---|---|
|
|
10
|
+
| `label` | `ReactNode` | — | no | Label content; renders a <label> (or <legend> in group mode). |
|
|
11
|
+
| `description` | `ReactNode` | — | no | Helper line under the control; replaced by error when error is set. |
|
|
12
|
+
| `error` | `ReactNode` | — | no | Error content; when truthy it replaces the description and switches the field (and a wrapped Input/Select) into error state. |
|
|
13
|
+
| `required` | `boolean` | false | no | Renders the required marker and flows `required` to the control. |
|
|
14
|
+
| `group` | `boolean` | false | no | Group mode: fieldset/legend wrapping several self-labeled controls (Checkbox/Switch); the message describes the whole group. |
|
|
15
|
+
| `htmlFor` | `string` | — | no | Override the generated control id (pair it with the same id on the control). |
|
|
16
|
+
| `ref` | `Ref<HTMLDivElement \| HTMLFieldSetElement>` | — | no | Forwarded ref to the root element. |
|
|
17
|
+
| `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
|
|
18
|
+
|
|
19
|
+
## Keyboard & assistive tech
|
|
20
|
+
|
|
21
|
+
| Keys | Behavior |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Tab | Focus moves to the wrapped control; the label is announced with it. |
|
|
24
|
+
|
|
25
|
+
Wires label association, aria-describedby and aria-invalid into a wrapped Input/Select automatically; the message line is aria-live=polite. Group mode renders fieldset/legend.
|
|
26
|
+
|
|
27
|
+
## Theming
|
|
28
|
+
|
|
29
|
+
Override `--psi-field-*` custom properties at any scope; interactive states derive automatically (L - 0.04 hover, L - 0.08 active).
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## Rules
|
|
34
|
+
|
|
35
|
+
- One accent per visual group; everything else neutral or ghost.
|
|
36
|
+
- danger only for actions with real consequences.
|
|
37
|
+
- Sizes are px numbers (24|32|40|48), never S/M/L.
|
|
38
|
+
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
39
|
+
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
40
|
+
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
41
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
42
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/IconButton.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# IconButton
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Square icon-only button; same variant/size/href contract as Button. Give it an accessible name (`aria-label`).
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -47,3 +47,5 @@ Override `--psi-button-*` custom properties at any scope; interactive states der
|
|
|
47
47
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
48
48
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
49
49
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
50
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
51
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Input.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Input
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Single-line text input with pixel-true heights (24–48) and an error state. Inside a Field, id/aria-describedby/aria-invalid/required are wired automatically (D49).
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
8
8
|
| Prop | Type | Default | Required | Description |
|
|
9
9
|
|---|---|---|---|---|
|
|
10
10
|
| `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Height in px (24 \| 32 \| 40 \| 48). |
|
|
11
|
-
| `error` | `boolean` | false | no | Show error styling. |
|
|
11
|
+
| `error` | `boolean` | false | no | Show error styling. Inside a Field, the Field's error also lights this. |
|
|
12
12
|
| `ref` | `Ref<HTMLInputElement>` | — | no | Forwarded ref to the underlying `<input>` element. |
|
|
13
13
|
| `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|---|---|
|
|
19
19
|
| Tab | Focuses the native <input>; focus ring on the field. |
|
|
20
20
|
|
|
21
|
-
error sets a red border only
|
|
21
|
+
error sets a red border only. Inside a Field, aria-invalid and aria-describedby are wired automatically (D49); standalone, pair them yourself.
|
|
22
22
|
|
|
23
23
|
## Theming
|
|
24
24
|
|
|
@@ -34,3 +34,5 @@ Override `--psi-input-*` custom properties at any scope; interactive states deri
|
|
|
34
34
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
35
35
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
36
36
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
37
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
38
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/NavBar.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# NavBar
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Top navigation bar with brand, nav-link, and trailing-action slots.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -27,3 +27,5 @@ Override `--psi-navbar-*` custom properties at any scope; interactive states der
|
|
|
27
27
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
28
28
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
29
29
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
30
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
31
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Select.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Select
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Styled native `<select>` with pixel-true heights (24–48) and an error state. Inside a Field, id/aria-describedby/aria-invalid/required are wired automatically (D49).
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
8
8
|
| Prop | Type | Default | Required | Description |
|
|
9
9
|
|---|---|---|---|---|
|
|
10
10
|
| `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Height in px (24 \| 32 \| 40 \| 48). Replaces the native `size` attribute (which sets the visible option-row count on a listbox-style `<select>`) with the design system's control height in pixels. |
|
|
11
|
-
| `error` | `boolean` | false | no | Show error styling. |
|
|
11
|
+
| `error` | `boolean` | false | no | Show error styling. Inside a Field, the Field's error also lights this. |
|
|
12
12
|
| `ref` | `Ref<HTMLSelectElement>` | — | no | Forwarded ref to the underlying `<select>` element. |
|
|
13
13
|
| `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
|
|
14
14
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
| Tab | Focuses the native <select>. |
|
|
20
20
|
| Arrow keys / typeahead | Native option navigation. |
|
|
21
21
|
|
|
22
|
-
error: same contract as Input.
|
|
22
|
+
error: same contract as Input — sets a red border only. Inside a Field, aria-invalid and aria-describedby are wired automatically (D49); standalone, pair them yourself.
|
|
23
23
|
|
|
24
24
|
## Theming
|
|
25
25
|
|
|
@@ -35,3 +35,5 @@ Override `--psi-select-*` custom properties at any scope; interactive states der
|
|
|
35
35
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
36
36
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
37
37
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
38
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
39
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Switch.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Switch
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
On/off toggle (`role="switch"`) with a built-in label; for settings that take effect immediately.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -32,3 +32,5 @@ Override `--psi-switch-*` custom properties at any scope; interactive states der
|
|
|
32
32
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
33
33
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
34
34
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
35
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
36
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Tag.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Tag
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Compact label for status or category; semantic variants, optional subtle tint and dismiss button.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -45,3 +45,5 @@ Override `--psi-tag-*` custom properties at any scope; interactive states derive
|
|
|
45
45
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
46
46
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
47
47
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
48
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
49
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|
package/docs/Tooltip.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by emit-docs.ts — do not edit. -->
|
|
2
2
|
# Tooltip
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Short hover/focus hint attached to a single trigger element.
|
|
5
5
|
|
|
6
6
|
## Props
|
|
7
7
|
|
|
@@ -34,3 +34,5 @@ Override `--psi-tooltip-*` custom properties at any scope; interactive states de
|
|
|
34
34
|
- Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
|
|
35
35
|
- Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
|
|
36
36
|
- --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
|
|
37
|
+
- Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
|
|
38
|
+
- Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
|