@handamade/psi-react 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/Field/Field.d.ts +5 -1
  2. package/dist/Field/Field.d.ts.map +1 -1
  3. package/dist/NavTree/NavItem.d.ts +12 -8
  4. package/dist/NavTree/NavItem.d.ts.map +1 -1
  5. package/dist/Tabs/Tab.d.ts.map +1 -1
  6. package/dist/Tabs/Tabs.d.ts +20 -1
  7. package/dist/Tabs/Tabs.d.ts.map +1 -1
  8. package/dist/Toast/Announcement.d.ts +12 -4
  9. package/dist/Toast/Announcement.d.ts.map +1 -1
  10. package/dist/Toast/ToastProvider.d.ts +27 -4
  11. package/dist/Toast/ToastProvider.d.ts.map +1 -1
  12. package/dist/Toast/ToastRegion.d.ts +11 -2
  13. package/dist/Toast/ToastRegion.d.ts.map +1 -1
  14. package/dist/Toast/useToast.d.ts +11 -2
  15. package/dist/Toast/useToast.d.ts.map +1 -1
  16. package/dist/Toolbar/Toolbar.d.ts +16 -6
  17. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1050 -1015
  21. package/dist/manifest.json +32 -11
  22. package/dist/patterns.json +4 -4
  23. package/dist/styles.css +1 -1
  24. package/docs/Announcement.md +3 -3
  25. package/docs/AppShell.md +1 -1
  26. package/docs/AspectRatio.md +1 -1
  27. package/docs/Banner.md +1 -1
  28. package/docs/Button.md +1 -1
  29. package/docs/Card.md +1 -1
  30. package/docs/Checkbox.md +1 -1
  31. package/docs/CopyButton.md +1 -1
  32. package/docs/CursorPagination.md +1 -1
  33. package/docs/DescriptionItem.md +1 -1
  34. package/docs/DescriptionList.md +1 -1
  35. package/docs/Dialog.md +1 -1
  36. package/docs/Field.md +2 -2
  37. package/docs/IconButton.md +1 -1
  38. package/docs/InlineAlert.md +1 -1
  39. package/docs/Input.md +1 -1
  40. package/docs/Menu.md +1 -1
  41. package/docs/MenuItem.md +1 -1
  42. package/docs/MenuSeparator.md +1 -1
  43. package/docs/NavBar.md +1 -1
  44. package/docs/NavGroup.md +1 -1
  45. package/docs/NavItem.md +5 -5
  46. package/docs/NavTree.md +1 -1
  47. package/docs/Pagination.md +1 -1
  48. package/docs/Panel.md +1 -1
  49. package/docs/Select.md +1 -1
  50. package/docs/Skeleton.md +1 -1
  51. package/docs/SkipLink.md +1 -1
  52. package/docs/Switch.md +1 -1
  53. package/docs/Tab.md +1 -1
  54. package/docs/TabList.md +1 -1
  55. package/docs/TabPanel.md +1 -1
  56. package/docs/Table.md +1 -1
  57. package/docs/TableBody.md +1 -1
  58. package/docs/TableCaption.md +1 -1
  59. package/docs/TableCell.md +1 -1
  60. package/docs/TableHead.md +1 -1
  61. package/docs/TableHeaderCell.md +1 -1
  62. package/docs/TableRow.md +1 -1
  63. package/docs/Tabs.md +3 -3
  64. package/docs/Tag.md +1 -1
  65. package/docs/Toast.md +1 -1
  66. package/docs/ToastProvider.md +6 -3
  67. package/docs/ToastRegion.md +4 -4
  68. package/docs/Toolbar.md +2 -2
  69. package/docs/Tooltip.md +1 -1
  70. package/llms.txt +7 -5
  71. package/package.json +2 -2
@@ -412,7 +412,7 @@
412
412
  },
413
413
  {
414
414
  "name": "Field",
415
- "description": "Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live unless `announce={false}`). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49).",
415
+ "description": "Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live unless `announce={false}`). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49). Overriding `--psi-field-gap` or `--psi-field-label-height` on a narrower scope than the theme root, inside a `Toolbar align=\"start\"` row, also needs `--psi-toolbar-action-offset` set on that same scope, or the row's button keeps the theme-root offset (D92).",
416
416
  "slots": [
417
417
  {
418
418
  "name": "label",
@@ -760,10 +760,10 @@
760
760
  },
761
761
  {
762
762
  "name": "align",
763
- "type": "\"center\" | \"end\"",
763
+ "type": "\"center\" | \"end\" | \"start\"",
764
764
  "required": false,
765
765
  "default": "center",
766
- "description": "Cross-axis alignment. `end` lines items up on their bottom edge, so\ncontrols under visible Field labels and a button without one share a\ncontrol line (D87). It lines up each item's *last* line: a Field in an\nend-aligned row must end on its control — no description or error line\nunder it; put a hint in the label."
766
+ "description": "Cross-axis alignment of the row's items. `center` (the default) centres\nthem, for a row of controls without visible labels such as\nfilter-toolbar. `end` and `start` are for a row of Fields with visible\nlabels beside an unlabelled button.\n`end` (D87) lines items up on their bottom edge. It lines up each item's\n*last* line, so a Field in an end-aligned row must end on its control —\nno description or error line under it; use `start` for one.\n`start` (D92) lines up the controls: items share their top edge, and a\n*direct* `button` or `a` child drops by `--psi-toolbar-action-offset`\n(one Field label line plus the Field gap) onto the control line. Only a\ndirect child is offset: a wrapped trigger (a Tooltip-wrapped button, a\nMenu trigger) is not. A Field's description or error line hangs below\nits control and moves nothing else. Every label in the row must fit on\none line; a label that wraps pushes its control below the others."
767
767
  },
768
768
  {
769
769
  "name": "as",
@@ -1017,7 +1017,7 @@
1017
1017
  },
1018
1018
  {
1019
1019
  "name": "NavItem",
1020
- "description": "One entry of a `NavTree` (D88): an `<li>` that styles the single anchor inside it. Router apps pass their own link as the child, so it keeps its `href`, `aria-current` and handlers; `href` is for plain links and for presets, where the compose tree can hold only manifest components and a raw `<a>` is not one. The current page is never marked by colour alone: medium weight, a raised surface and a bar at the inline start.",
1020
+ "description": "One entry of a `NavTree` (D88): an `<li>` that styles the single anchor inside it. Router apps pass their own link as the child, so it keeps its `href` and handlers; with `current`, `NavItem` clones it to add `aria-current=\"page\"` (D93), as `Menu` clones its trigger. `href` is for plain links and for presets, where the compose tree can hold only manifest components and a raw `<a>` is not one. The current page is never marked by colour alone: medium weight, a raised surface and a bar at the inline start.",
1021
1021
  "slots": [],
1022
1022
  "props": [
1023
1023
  {
@@ -1025,7 +1025,7 @@
1025
1025
  "type": "ReactNode",
1026
1026
  "required": true,
1027
1027
  "default": null,
1028
- "description": "Without `href`: one anchor, your router's link — put `aria-current=\"page\"`\non the current one. With `href`: the link's text."
1028
+ "description": "Without `href`: one anchor, your router's link. With `href`: the link's\ntext."
1029
1029
  },
1030
1030
  {
1031
1031
  "name": "href",
@@ -1039,7 +1039,7 @@
1039
1039
  "type": "boolean",
1040
1040
  "required": false,
1041
1041
  "default": null,
1042
- "description": "Mark the link as the current page (`aria-current=\"page\"`). Only with\n`href`; a link you pass as a child carries its own `aria-current`."
1042
+ "description": "Mark the link as the current page (`aria-current=\"page\"`): on the\nanchor `href` renders, or on the single element you pass as a child (D93).\nWithout `current`, a child's own `aria-current` is left alone, so a router\nthat marks its active link keeps working."
1043
1043
  },
1044
1044
  {
1045
1045
  "name": "className",
@@ -1857,7 +1857,7 @@
1857
1857
  },
1858
1858
  {
1859
1859
  "name": "ToastRegion",
1860
- "description": "The positioned live region that holds the toast stack (D64). Two things here are load-bearing and both look like details: 1. **The two live wrappers are always rendered**, empty queue included. A live region announces mutations to a subtree that already existed; a wrapper that mounts together with its first toast reads as a new subtree, and that first toast is never announced. 2. **`popover=\"manual\"`, not `\"auto\"`.** Manual puts the region in the native top layer without light dismiss. The top layer is required because Dialog uses showModal() — also top layer — so a fixed region at --psi-z-overlay would paint *under* the modal backdrop, hiding the confirmation for the action a user just took inside a dialog. And `auto` would be dismissed by the very click that raised the toast. Routing reads `politeness`, then `variant`, off each child — the same Children.map technique Table uses for select-all injection. `politeness` wins (D83): the owner of an announcement knows what kind of event it is, and tone is only the default. Consequence of the split, visible in the `InRegion` VR baseline: the stack is grouped by politeness, not strictly chronological — every assertive toast sorts below every polite one regardless of arrival order. Chronological order is preserved *within* each group. Keeping it exact across both would mean one live region with a politeness that changes per message, which is the thing the two wrappers exist to avoid. Accepted: at `limit` 3 the grouping reads as severity ordering, and the newest toast still lands nearest the screen edge within its group. Remaining HTML attributes, `data-*` included, are spread onto the root element (D83). That is how an application marks the region `data-react-aria-top-layer`, so that a React Aria overlay — which hides everything outside itself with `aria-hidden` — leaves the two live regions exposed. The region's own attributes always win.",
1860
+ "description": "The positioned live region that holds the toast stack (D64). Two things here are load-bearing and both look like details: 1. **The two live wrappers are always rendered**, empty queue included. A live region announces mutations to a subtree that already existed; a wrapper that mounts together with its first toast reads as a new subtree, and that first toast is never announced. 2. **`popover=\"manual\"`, not `\"auto\"`.** Manual puts the region in the native top layer without light dismiss. The top layer is required because Dialog uses showModal() — also top layer — so a fixed region at --psi-z-overlay would paint *under* the modal backdrop, hiding the confirmation for the action a user just took inside a dialog. And `auto` would be dismissed by the very click that raised the toast. Routing reads `politeness`, then `variant`, off each child — the same Children.map technique Table uses for select-all injection. `politeness` wins (D83): the owner of an announcement knows what kind of event it is, and tone is only the default. Consequence of the split, visible in the `InRegion` VR baseline: the stack is grouped by politeness, not strictly chronological — every assertive toast sorts below every polite one regardless of arrival order. Chronological order is preserved *within* each group. Keeping it exact across both would mean one live region with a politeness that changes per message, which is the thing the two wrappers exist to avoid. Accepted: at `limit` 3 the grouping reads as severity ordering, and the newest toast still lands nearest the screen edge within its group. Remaining HTML attributes, `data-*` included, are spread onto the root element (D83). That is how an application marks the region `data-react-aria-top-layer`, so that a React Aria overlay — which hides everything outside itself with `aria-hidden` — leaves the two live regions exposed. The region's own attributes always win — `role` included. **The region is a landmark, and the wrappers speak only what is new (D90).** `role=\"region\"` makes the `aria-label` legal (a name on a role-less `div` is prohibited) and gives the stack a place in the landmark list. Both wrappers set `aria-atomic=\"false\"` explicitly: `role=\"status\"` and `role=\"alert\"` carry an implicit `true`, which lets a screen reader re-speak everything already in the wrapper whenever one message is added beside it.",
1861
1861
  "slots": [],
1862
1862
  "props": [
1863
1863
  {
@@ -1872,7 +1872,7 @@
1872
1872
  "type": "string",
1873
1873
  "required": false,
1874
1874
  "default": "Notifications",
1875
- "description": "Accessible name for the region."
1875
+ "description": "Accessible name for the region landmark."
1876
1876
  },
1877
1877
  {
1878
1878
  "name": "children",
@@ -1899,7 +1899,7 @@
1899
1899
  },
1900
1900
  {
1901
1901
  "name": "ToastProvider",
1902
- "description": "Owns the toast queue, its auto-dismiss timers, and the single ToastRegion (D65). This is the library's one stateful container, and the exception is deliberately narrow. D50 and D53 rejected internal state for Dialog and Menu because the consumer already owned the state that decided visibility — a menu is open because a user clicked a trigger the consumer rendered. A toast has no such owner: it is created by an outcome, not by a UI state, and it disappears on a timer nobody is watching. The rule that survives is the useful half — presentational components stay controlled (`Toast` still holds nothing), a stateful container may exist when the state has no natural owner, and it must be opt-in. Timers pause while the pointer or focus is inside the region (WCAG 2.2.1), and resume with the time *remaining* rather than a fresh full duration — restarting would let a user hold a toast open indefinitely by jiggling the mouse.",
1902
+ "description": "Owns the toast queue, its auto-dismiss timers, and the single ToastRegion (D65). This is the library's one stateful container, and the exception is deliberately narrow. D50 and D53 rejected internal state for Dialog and Menu because the consumer already owned the state that decided visibility — a menu is open because a user clicked a trigger the consumer rendered. A toast has no such owner: it is created by an outcome, not by a UI state, and it disappears on a timer nobody is watching. The rule that survives is the useful half — presentational components stay controlled (`Toast` still holds nothing), a stateful container may exist when the state has no natural owner, and it must be opt-in. Timers pause while the pointer or focus is inside the region (WCAG 2.2.1), and resume with the time *remaining* rather than a fresh full duration — restarting would let a user hold a toast open indefinitely by jiggling the mouse. **Announcements share the queue, not the limit (D91).** `announce()` adds a speech-only Announcement to the same region — never a live region of its own — and it leaves after a one-second dwell. A later announcement does not remove an earlier one early: removing a node just after it was added can cut its speech, and with non-atomic wrappers (D90) each added node is spoken on its own. Announcements live in their own list, so they never evict a visible toast; their timers live in the same map, so `dismiss`, `clear()` and unmount dispose them as they do a toast's, and they pause with the region. Remaining props go to the ToastRegion (D91): its `aria-label`, a `ref` to the region element, a `className`, and `data-*` attributes such as `data-react-aria-top-layer`.",
1903
1903
  "slots": [],
1904
1904
  "props": [
1905
1905
  {
@@ -1936,12 +1936,33 @@
1936
1936
  "required": true,
1937
1937
  "default": null,
1938
1938
  "description": "The subtree that may call `useToast()`. The region is rendered alongside it."
1939
+ },
1940
+ {
1941
+ "name": "aria-label",
1942
+ "type": "string",
1943
+ "required": false,
1944
+ "default": "\"Notifications\"",
1945
+ "description": "Accessible name for the region landmark, forwarded to ToastRegion."
1946
+ },
1947
+ {
1948
+ "name": "className",
1949
+ "type": "string",
1950
+ "required": false,
1951
+ "default": null,
1952
+ "description": "Forwarded to the region element."
1953
+ },
1954
+ {
1955
+ "name": "ref",
1956
+ "type": "Ref<HTMLDivElement>",
1957
+ "required": false,
1958
+ "default": null,
1959
+ "description": "Forwarded ref to the region element."
1939
1960
  }
1940
1961
  ]
1941
1962
  },
1942
1963
  {
1943
1964
  "name": "Announcement",
1944
- "description": "Text for a screen reader only, spoken through ToastRegion (D83). **It is not a live region.** It renders no `role` and no `aria-live`, and outside a ToastRegion it announces nothing — the region's two persistent wrappers are the only live regions, and an Announcement is content for one of them. Do not use it as a second announcer. Use it where an event must be spoken and there is nothing to show: a state change of the object on screen, or field errors the form already displays. `politeness` is not read here. ToastRegion reads it off the element to pick a wrapper, the same way it reads a Toast's. Controlled, like Toast: it holds no state and never removes itself. Remove it once it has been spoken. To announce the same text again, remove it and render it again with a new `key` — a live region speaks changes, and an unchanged node is not one. It takes no `className`: the one thing a class could do to it is make it visible, and then it is a Toast.",
1965
+ "description": "Text for a screen reader only, spoken through ToastRegion (D83). **It is not a live region.** It renders no `role` and no `aria-live`, and outside a ToastRegion it announces nothing — the region's two persistent wrappers are the only live regions, and an Announcement is content for one of them. Do not use it as a second announcer. Use it where an event must be spoken and there is nothing to show: a state change of the object on screen, or field errors the form already displays. `politeness` is not read here. ToastRegion reads it off the element to pick a wrapper, the same way it reads a Toast's. The usual way to render one is `useToast().announce(message)` (D91), which puts it in ToastProvider's region and gives it a lifetime: it leaves one second (the dwell) after it was added, and a later announcement does not remove it early — removing a node just after it was added can cut its speech, and the region's non-atomic wrappers (D90) speak each added node on its own. It never counts against the provider's toast `limit`. Rendered by hand, it is controlled, like Toast: it holds no state and never removes itself, so follow the same rule — remove it after a one-second dwell, not before. To announce the same text again, remove it and render it again with a new `key` — a live region speaks changes, and an unchanged node is not one. It takes no `className`: the one thing a class could do to it is make it visible, and then it is a Toast.",
1945
1966
  "slots": [],
1946
1967
  "props": [
1947
1968
  {
@@ -2244,7 +2265,7 @@
2244
2265
  "type": "string",
2245
2266
  "required": true,
2246
2267
  "default": null,
2247
- "description": "Controlled selected tab, matched against each `Tab`/`TabPanel` value."
2268
+ "description": "Controlled selected tab, matched against each `Tab`/`TabPanel` value. A\nvalue that matches no tab selects nothing, and the first enabled\ntab holds the list's tab stop (D93); development builds warn."
2248
2269
  },
2249
2270
  {
2250
2271
  "name": "onValueChange",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  {
55
55
  "id": "announcer",
56
- "intent": "One announcer for a whole application: a single ToastRegion holding visible toasts and speech-only Announcements, each routed by politeness rather than by tone. For an application that owns exactly two live regions and lets nothing else write one. For a single confirmation toast, use action-feedback.",
56
+ "intent": "Under a ToastProvider, do not render this — call useToast().announce() (D91). For an application with its own ToastRegion and no provider: one region holding visible toasts and speech-only Announcements, each routed by politeness rather than by tone. For a single confirmation toast, use action-feedback.",
57
57
  "match": [
58
58
  "announcer",
59
59
  "live region",
@@ -809,7 +809,7 @@
809
809
  },
810
810
  {
811
811
  "id": "filter-form",
812
- "intent": "Labelled filters above a list, submitted together with a Find button: a Toolbar rendered as a named form (as=\"form\", so Find and Enter submit — wire onSubmit), aligned to the end so every control sits on one line under its visible Field label. Fields in the row carry no description or error line. Add IconSearch before the Find label. For filters that apply as they change, named without a visible label, use filter-toolbar instead; never name a control by its placeholder alone",
812
+ "intent": "Labelled filters above a list, submitted together with a Find button: a Toolbar rendered as a named form (as=\"form\", so Find and Enter submit — wire onSubmit), aligned to the start so every control sits on one line under its visible Field label and Find drops onto that line. A field's description or error line hangs below its control and moves nothing else; the error line is the Field's own, with its usual aria-describedby wiring — set error on the Field, not beside the row. Every label in the row must be one line: a label that wraps pushes its control off the shared line. Add IconSearch before the Find label. For filters that apply as they change, named without a visible label, use filter-toolbar instead; never name a control by its placeholder alone",
813
813
  "match": [
814
814
  "filter form",
815
815
  "search form",
@@ -822,7 +822,7 @@
822
822
  "component": "Toolbar",
823
823
  "props": {
824
824
  "as": "form",
825
- "align": "end",
825
+ "align": "start",
826
826
  "gap": 12,
827
827
  "aria-label": "{content:form-label}"
828
828
  },
@@ -881,7 +881,7 @@
881
881
  },
882
882
  "gaps": [],
883
883
  "blocked": false,
884
- "preset": "<Toolbar\n align=\"end\"\n aria-label=\"Filters\"\n as=\"form\"\n gap={12}\n>\n <Field\n label=\"[field name]\"\n >\n <Input size={32} />\n </Field>\n <Field\n label=\"[field name]\"\n >\n <Select size={32} />\n </Field>\n <Button size={32} type=\"submit\" variant=\"accent\">Find</Button>\n</Toolbar>\n"
884
+ "preset": "<Toolbar\n align=\"start\"\n aria-label=\"Filters\"\n as=\"form\"\n gap={12}\n>\n <Field\n label=\"[field name]\"\n >\n <Input size={32} />\n </Field>\n <Field\n label=\"[field name]\"\n >\n <Select size={32} />\n </Field>\n <Button size={32} type=\"submit\" variant=\"accent\">Find</Button>\n</Toolbar>\n"
885
885
  },
886
886
  {
887
887
  "id": "filter-toolbar",
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- ._button_a3yli_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-button-radius);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_a3yli_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-button-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._button_a3yli_3:disabled{opacity:.4;cursor:not-allowed}._button_a3yli_3._disabled_a3yli_30{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_a3yli_50{height:var(--psi-button-24-height);padding-inline:var(--psi-button-24-padding-inline);gap:var(--psi-button-24-gap);font:var(--psi-button-font, var(--psi-button-24-font))}._size24_a3yli_50:has(>svg:first-child){padding-inline-start:var(--psi-button-24-padding-inline-icon)}._size24_a3yli_50:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-24-padding-inline-icon)}._size32_a3yli_63{height:var(--psi-button-32-height);padding-inline:var(--psi-button-32-padding-inline);gap:var(--psi-button-32-gap);font:var(--psi-button-font, var(--psi-button-32-font))}._size32_a3yli_63:has(>svg:first-child){padding-inline-start:var(--psi-button-32-padding-inline-icon)}._size32_a3yli_63:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-32-padding-inline-icon)}._size40_a3yli_76{height:var(--psi-button-40-height);padding-inline:var(--psi-button-40-padding-inline);gap:var(--psi-button-40-gap);font:var(--psi-button-font, var(--psi-button-40-font))}._size40_a3yli_76:has(>svg:first-child){padding-inline-start:var(--psi-button-40-padding-inline-icon)}._size40_a3yli_76:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-40-padding-inline-icon)}._size48_a3yli_89{height:var(--psi-button-48-height);padding-inline:var(--psi-button-48-padding-inline);gap:var(--psi-button-48-gap);font:var(--psi-button-font, var(--psi-button-48-font))}._size48_a3yli_89:has(>svg:first-child){padding-inline-start:var(--psi-button-48-padding-inline-icon)}._size48_a3yli_89:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-48-padding-inline-icon)}._accent_a3yli_105{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_a3yli_105:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-bg-hover)}._accent_a3yli_105:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-bg-active)}._accentSubtle_a3yli_117{background:var(--psi-button-accent-subtle-bg);color:var(--psi-button-accent-subtle-fg)}._accentSubtle_a3yli_117:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-subtle-bg-hover)}._accentSubtle_a3yli_117:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-subtle-bg-active)}._neutral_a3yli_129{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_a3yli_129:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-bg-hover)}._neutral_a3yli_129:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-bg-active)}._neutralSubtle_a3yli_141{background:var(--psi-button-neutral-subtle-bg);color:var(--psi-button-neutral-subtle-fg)}._neutralSubtle_a3yli_141:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-subtle-bg-hover)}._neutralSubtle_a3yli_141:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-subtle-bg-active)}._ghost_a3yli_153{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_a3yli_153:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-ghost-bg-hover)}._ghost_a3yli_153:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-ghost-bg-active)}._danger_a3yli_165{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_a3yli_165:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-bg-hover)}._danger_a3yli_165:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-bg-active)}._dangerSubtle_a3yli_177{background:var(--psi-button-danger-subtle-bg);color:var(--psi-button-danger-subtle-fg)}._dangerSubtle_a3yli_177:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-subtle-bg-hover)}._dangerSubtle_a3yli_177:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-subtle-bg-active)}._outline_a3yli_189{background:var(--psi-button-outline-bg);color:var(--psi-button-outline-fg);border:1px solid var(--psi-button-outline-border)}._outline_a3yli_189:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-outline-bg-hover);color:var(--psi-button-outline-fg-hover);border-color:transparent}._outline_a3yli_189:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-outline-bg-active)}._iconButton_1q4hx_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-button-radius);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_1q4hx_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-button-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._iconButton_1q4hx_3:disabled{opacity:.4;cursor:not-allowed}._iconButton_1q4hx_3._disabled_1q4hx_29{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_1q4hx_37{width:var(--psi-button-24-height);height:var(--psi-button-24-height)}._size32_1q4hx_42{width:var(--psi-button-32-height);height:var(--psi-button-32-height)}._size40_1q4hx_47{width:var(--psi-button-40-height);height:var(--psi-button-40-height)}._size48_1q4hx_52{width:var(--psi-button-48-height);height:var(--psi-button-48-height)}._accent_1q4hx_60{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_1q4hx_60:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-accent-bg-hover)}._accent_1q4hx_60:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-accent-bg-active)}._neutral_1q4hx_72{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_1q4hx_72:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-neutral-bg-hover)}._neutral_1q4hx_72:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-neutral-bg-active)}._ghost_1q4hx_84{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_1q4hx_84:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-ghost-bg-hover)}._ghost_1q4hx_84:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-ghost-bg-active)}._danger_1q4hx_96{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_1q4hx_96:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-danger-bg-hover)}._danger_1q4hx_96:active:not(:disabled):not(._disabled_1q4hx_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)}._panel_jn8w4_1{background:var(--psi-panel-bg);border:1px solid var(--psi-panel-border);border-radius:var(--psi-panel-radius);padding:var(--psi-panel-padding)}._padding16_jn8w4_8{padding:var(--psi-space-16)}._list_1lh3q_8{display:flex;flex-direction:column;gap:var(--psi-space-12);margin:var(--psi-space-0)}._list_1lh3q_8[data-gap="8"]{gap:var(--psi-space-8)}._list_1lh3q_8[data-gap="16"]{gap:var(--psi-space-16)}._item_1lh3q_26{display:flex;flex-direction:column;gap:var(--psi-space-4);min-width:0}._list_1lh3q_8[data-layout=inline] ._item_1lh3q_26{display:grid;grid-template-columns:auto 1fr;column-gap:var(--psi-space-16);row-gap:var(--psi-space-0);align-items:start}._term_1lh3q_44{color:var(--psi-description-list-term-fg);font:var(--psi-text-14-20-medium);min-width:0}._value_1lh3q_50{color:var(--psi-description-list-value-fg);font:var(--psi-text-14-20-regular);margin:var(--psi-space-0);min-width:0;overflow-wrap:anywhere}._navbar_1w24e_1{font:var(--psi-text-14-20-medium);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_1w24e_12{display:flex;align-items:center;gap:var(--psi-space-24);height:var(--psi-navbar-height)}._fluid_1w24e_20{padding-inline:var(--psi-navbar-gutter)}._brand_1w24e_22{display:flex;align-items:center}._links_1w24e_23{display:flex;align-items:center;gap:var(--psi-space-20);margin-inline-start:auto}._links_1w24e_23 a,._brand_1w24e_22 a{text-decoration:none;transition:color var(--psi-duration-150) var(--psi-ease-soft)}._links_1w24e_23 a{color:var(--psi-navbar-link-fg)}._links_1w24e_23 a:hover,._brand_1w24e_22 a{color:var(--psi-navbar-link-fg-hover)}._links_1w24e_23 a:focus-visible,._brand_1w24e_22 a:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-navbar-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._actions_1w24e_53{display:flex;align-items:center;gap:var(--psi-space-8)}._brand_1w24e_22+._actions_1w24e_53,._actions_1w24e_53:first-child{margin-inline-start:auto}._skipLink_1fn0y_4{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}._skipLink_1fn0y_4:focus-visible{position:fixed;inset-block-start:0;inset-inline-start:0;margin:var(--psi-space-8);z-index:var(--psi-z-overlay);display:inline-flex;align-items:center;box-sizing:border-box;width:auto;height:var(--psi-size-32);padding-inline:var(--psi-space-12);overflow:visible;clip:auto;clip-path:none;background:var(--psi-skip-link-bg);color:var(--psi-skip-link-fg);border:1px solid var(--psi-skip-link-border);border-radius:var(--psi-skip-link-radius);font:var(--psi-text-14-20-medium);text-decoration:none;outline:var(--psi-focus-ring-width) solid var(--psi-skip-link-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._navTree_y5m3t_7{display:block}._list_y5m3t_11,._groupList_y5m3t_12{display:flex;flex-direction:column;gap:var(--psi-space-2);margin:0;padding:0;list-style:none}._item_y5m3t_23 a{position:relative;display:flex;align-items:center;box-sizing:border-box;min-height:var(--psi-size-32);padding-block:var(--psi-space-4);padding-inline:var(--psi-space-12);border-radius:var(--psi-nav-tree-radius);color:var(--psi-nav-tree-item-fg);font:var(--psi-text-14-20-regular);text-decoration:none}._item_y5m3t_23 a:hover{background:var(--psi-nav-tree-item-bg-hover)}._item_y5m3t_23 a:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-nav-tree-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._item_y5m3t_23 a[aria-current=page]{background:var(--psi-nav-tree-item-bg-current);color:var(--psi-nav-tree-item-fg-current);font:var(--psi-text-14-20-medium)}._item_y5m3t_23 a[aria-current=page]:before{content:"";position:absolute;inset-block:0;inset-inline-start:0;width:3px;border-radius:var(--psi-nav-tree-radius);background:var(--psi-nav-tree-indicator)}._groupButton_y5m3t_70{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;align-items:center;justify-content:space-between;gap:var(--psi-space-8);box-sizing:border-box;width:100%;min-height:var(--psi-size-32);padding-block:var(--psi-space-4);padding-inline:var(--psi-space-12);border:0;border-radius:var(--psi-nav-tree-radius);background:none;color:var(--psi-nav-tree-group-fg);font:var(--psi-text-14-20-medium);text-align:start;cursor:pointer}._groupButton_y5m3t_70:hover{background:var(--psi-nav-tree-item-bg-hover)}._groupButton_y5m3t_70:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-nav-tree-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._groupLabel_y5m3t_99{min-width:0}._chevron_y5m3t_103{flex:none;transition:transform var(--psi-duration-150) var(--psi-ease-standard)}._groupButton_y5m3t_70[aria-expanded=true] ._chevron_y5m3t_103{transform:rotate(180deg)}._groupList_y5m3t_12{padding-inline-start:var(--psi-space-12);margin-block-start:var(--psi-space-2)}._groupList_y5m3t_12[hidden]{display:none}._appShell_i1tds_10{display:grid;grid-template-rows:auto 1fr;grid-template-columns:var(--psi-app-shell-sidebar-width) minmax(0,1fr);height:100dvh}._sidebarClosed_i1tds_18{grid-template-columns:minmax(0,1fr)}._header_i1tds_22{grid-row:1;grid-column:1 / -1;min-width:0}._sidebar_i1tds_18{grid-row:2;min-height:0;overflow:auto;padding:var(--psi-space-8);background:var(--psi-app-shell-sidebar-bg);color:var(--psi-app-shell-sidebar-fg)}._sidebar_i1tds_18[hidden]{display:none}._main_i1tds_45{grid-row:2;min-width:0;min-height:0;overflow:auto}._main_i1tds_45:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-app-shell-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}._field_1xhfz_1{display:grid;gap:var(--psi-field-gap);border:0;margin:0;padding:0;min-width:0}._label_1xhfz_10{font:var(--psi-text-14-20-medium);color:var(--psi-field-label-fg);padding:0}._marker_1xhfz_16{color:var(--psi-field-marker-fg)}._requiredText_1xhfz_22{font:var(--psi-text-14-20-regular);color:var(--psi-field-required-text-fg)}._message_1xhfz_27{margin:0;font:var(--psi-text-12-16-regular);color:var(--psi-field-message-fg)}._invalid_1xhfz_33 ._message_1xhfz_27{color:var(--psi-field-error-fg)}._dialog_qg38y_2{padding:0;border:1px solid var(--psi-dialog-border);border-radius:var(--psi-dialog-radius);background:var(--psi-dialog-bg);color:var(--psi-dialog-fg);max-width:calc(100vw - var(--psi-space-32))}._dialog_qg38y_2::backdrop{background:var(--psi-dialog-backdrop)}._dialog_qg38y_2:focus-visible,._panel_qg38y_20:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-dialog-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._dialog_qg38y_2[open]::backdrop{animation:_backdrop-enter_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _backdrop-enter_qg38y_1{0%{opacity:0}}._center_qg38y_42[open]{animation:_dialog-enter_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _dialog-enter_qg38y_1{0%{opacity:0;transform:scale(.97)}}._inlineStart_qg38y_50,._inlineEnd_qg38y_51{box-sizing:border-box;margin-block:0;height:100dvh;max-height:100dvh;max-width:100vw;border-radius:0}._inlineEnd_qg38y_51{margin-inline-start:auto;margin-inline-end:0;border-start-start-radius:var(--psi-dialog-radius);border-end-start-radius:var(--psi-dialog-radius)}._inlineStart_qg38y_50{margin-inline-start:0;margin-inline-end:auto;border-start-end-radius:var(--psi-dialog-radius);border-end-end-radius:var(--psi-dialog-radius)}._inlineEnd_qg38y_51[open]{animation:_drawer-enter-end_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}._inlineStart_qg38y_50[open]{animation:_drawer-enter-start_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _drawer-enter-end_qg38y_1{0%{transform:translate(100%)}}@keyframes _drawer-enter-start_qg38y_1{0%{transform:translate(-100%)}}._w400_qg38y_100{width:400px}._w560_qg38y_101{width:560px}._w720_qg38y_102{width:720px}._panel_qg38y_20{display:grid;gap:var(--psi-space-16);padding:var(--psi-space-24)}._inlineStart_qg38y_50 ._panel_qg38y_20,._inlineEnd_qg38y_51 ._panel_qg38y_20{height:100%;overflow-y:auto;align-content:start}._header_qg38y_124{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--psi-space-12)}._title_qg38y_131{margin:0;font:var(--psi-text-18-28-medium);color:var(--psi-dialog-title-fg)}._footer_qg38y_137{display:flex;justify-content:flex-end;gap:var(--psi-space-8)}._input_pmr7w_3{display:block;box-sizing:border-box;width:100%;border:1px solid var(--psi-input-border);border-radius:var(--psi-input-radius);background:var(--psi-input-bg);color:var(--psi-input-fg);font-family:var(--psi-font-sans);transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._input_pmr7w_3::placeholder{color:var(--psi-input-placeholder)}._input_pmr7w_3:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-input-border-hover)}._input_pmr7w_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-input-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset);border-color:transparent}._input_pmr7w_3:disabled{opacity:.4;cursor:not-allowed}._size24_pmr7w_43{height:var(--psi-input-24-height);padding-inline:var(--psi-input-24-padding-inline);font:var(--psi-input-24-font)}._size32_pmr7w_49{height:var(--psi-input-32-height);padding-inline:var(--psi-input-32-padding-inline);font:var(--psi-input-32-font)}._size40_pmr7w_55{height:var(--psi-input-40-height);padding-inline:var(--psi-input-40-padding-inline);font:var(--psi-input-40-font)}._size48_pmr7w_61{height:var(--psi-input-48-height);padding-inline:var(--psi-input-48-padding-inline);font:var(--psi-input-48-font)}._error_pmr7w_69{border-color:var(--psi-input-border-error)}._error_pmr7w_69:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-input-border-error)}._select_1eqz1_3{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--psi-select-border);border-radius:var(--psi-select-radius);background-color:var(--psi-select-bg);background-image:linear-gradient(45deg,transparent calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% + .75px),transparent calc(50% + .75px)),linear-gradient(135deg,transparent calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% + .75px),transparent calc(50% + .75px));background-size:4px 4px;background-repeat:no-repeat;color:var(--psi-select-fg);font-family:var(--psi-font-sans);cursor:pointer;transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._select_1eqz1_3:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-select-border-hover)}._select_1eqz1_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-select-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset);border-color:transparent}._select_1eqz1_3:disabled{opacity:.4;cursor:not-allowed}._size24_1eqz1_57{height:var(--psi-select-24-height);padding-inline-start:var(--psi-select-24-padding-inline);padding-inline-end:var(--psi-select-24-padding-inline-end);background-position:right calc(var(--psi-select-24-chevron-offset) + 6px) center,right calc(var(--psi-select-24-chevron-offset) + 2px) center;font:var(--psi-select-24-font)}._size32_1eqz1_67{height:var(--psi-select-32-height);padding-inline-start:var(--psi-select-32-padding-inline);padding-inline-end:var(--psi-select-32-padding-inline-end);background-position:right calc(var(--psi-select-32-chevron-offset) + 6px) center,right calc(var(--psi-select-32-chevron-offset) + 2px) center;font:var(--psi-select-32-font)}._size40_1eqz1_77{height:var(--psi-select-40-height);padding-inline-start:var(--psi-select-40-padding-inline);padding-inline-end:var(--psi-select-40-padding-inline-end);background-position:right calc(var(--psi-select-40-chevron-offset) + 6px) center,right calc(var(--psi-select-40-chevron-offset) + 2px) center;font:var(--psi-select-40-font)}._size48_1eqz1_87{height:var(--psi-select-48-height);padding-inline-start:var(--psi-select-48-padding-inline);padding-inline-end:var(--psi-select-48-padding-inline-end);background-position:right calc(var(--psi-select-48-chevron-offset) + 6px) center,right calc(var(--psi-select-48-chevron-offset) + 2px) center;font:var(--psi-select-48-font)}._error_1eqz1_99{border-color:var(--psi-select-border-error)}._error_1eqz1_99:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-select-border-error)}._label_1jm35_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_1jm35_13{opacity:.4;cursor:not-allowed}._indicator_1jm35_26{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-checkbox-box-radius);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_1jm35_42:checked+._indicator_1jm35_26{background:var(--psi-checkbox-box-bg-checked);border-color:var(--psi-checkbox-box-border-checked)}._input_1jm35_42:checked+._indicator_1jm35_26:after{content:"";display:block;width:4px;height:8px;color:var(--psi-checkbox-check-fg);border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg) translate(-.5px,-.5px)}._input_1jm35_42:focus-visible+._indicator_1jm35_26{outline:var(--psi-focus-ring-width) solid var(--psi-checkbox-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._text_1jm35_67{color:var(--psi-checkbox-fg)}._label_yv464_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_yv464_13{opacity:.4;cursor:not-allowed}._track_yv464_26{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_yv464_38:checked+._track_yv464_26{background:var(--psi-switch-track-bg-checked)}._input_yv464_38:focus-visible+._track_yv464_26{outline:var(--psi-focus-ring-width) solid var(--psi-switch-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._thumb_yv464_50{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_yv464_38:checked+._track_yv464_26 ._thumb_yv464_50{left:18px}._text_yv464_67{color:var(--psi-switch-fg)}._tag_1r2xw_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_1r2xw_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_1r2xw_17:hover{opacity:1}._dismiss_1r2xw_17:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tag-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._neutral_1r2xw_43{background:var(--psi-tag-neutral-bg);color:var(--psi-tag-neutral-fg)}._accent_1r2xw_48{background:var(--psi-tag-accent-bg);color:var(--psi-tag-accent-fg)}._success_1r2xw_53{background:var(--psi-tag-success-bg);color:var(--psi-tag-success-fg)}._warning_1r2xw_58{background:var(--psi-tag-warning-bg);color:var(--psi-tag-warning-fg)}._danger_1r2xw_63{background:var(--psi-tag-danger-bg);color:var(--psi-tag-danger-fg)}._neutralSubtle_1r2xw_70{background:var(--psi-tag-neutral-subtle-bg);color:var(--psi-tag-neutral-subtle-fg)}._accentSubtle_1r2xw_75{background:var(--psi-tag-accent-subtle-bg);color:var(--psi-tag-accent-subtle-fg)}._successSubtle_1r2xw_80{background:var(--psi-tag-success-subtle-bg);color:var(--psi-tag-success-subtle-fg)}._warningSubtle_1r2xw_85{background:var(--psi-tag-warning-subtle-bg);color:var(--psi-tag-warning-subtle-fg)}._dangerSubtle_1r2xw_90{background:var(--psi-tag-danger-subtle-bg);color:var(--psi-tag-danger-subtle-fg)}._wrapper_1eu6z_3{position:relative;display:inline-flex}._tooltip_1eu6z_10{position:absolute;z-index:var(--psi-z-tooltip);padding:var(--psi-space-4) var(--psi-space-8);border-radius:var(--psi-tooltip-radius);background:var(--psi-tooltip-bg);color:var(--psi-tooltip-fg);font:var(--psi-text-12-16-regular);white-space:nowrap;pointer-events:none}._top_1eu6z_24{bottom:100%;left:50%;transform:translate(-50%);margin-bottom:var(--psi-space-4)}._bottom_1eu6z_31{top:100%;left:50%;transform:translate(-50%);margin-top:var(--psi-space-4)}._left_1eu6z_38{right:100%;top:50%;transform:translateY(-50%);margin-right:var(--psi-space-4)}._right_1eu6z_45{left:100%;top:50%;transform:translateY(-50%);margin-left:var(--psi-space-4)}._toolbar_oljum_1{display:flex;flex-wrap:wrap;align-items:center}._gap8_oljum_7{gap:var(--psi-space-8)}._gap12_oljum_8{gap:var(--psi-space-12)}._gap16_oljum_9{gap:var(--psi-space-16)}._alignEnd_oljum_13{align-items:flex-end}._toolbar_oljum_1>input,._toolbar_oljum_1>select{width:var(--psi-toolbar-control-width)}._trigger_uxpyi_4{display:inline-flex;width:fit-content}._menu_uxpyi_16{min-width:180px;margin:var(--psi-space-4);padding:var(--psi-space-4);border:1px solid var(--psi-menu-border);border-radius:var(--psi-menu-radius);background:var(--psi-menu-bg);color:var(--psi-menu-fg);font:var(--psi-text-14-20-regular)}._menu_uxpyi_16:not([data-open]):not(:popover-open){display:none}._item_uxpyi_37{display:flex;width:100%;align-items:center;padding:var(--psi-space-8) var(--psi-space-12);border:0;border-radius:var(--psi-radius-6);background:var(--psi-menu-item-bg);color:var(--psi-menu-item-fg);font:inherit;text-align:start;cursor:pointer}._item_uxpyi_37:hover{background:var(--psi-menu-item-bg-hover)}._item_uxpyi_37:active{background:var(--psi-menu-item-bg-active)}._item_uxpyi_37:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-menu-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._item_uxpyi_37[data-variant=danger]{color:var(--psi-menu-item-fg-danger)}._item_uxpyi_37[aria-disabled=true]{color:var(--psi-menu-item-fg-disabled);cursor:default}._item_uxpyi_37[aria-disabled=true]:hover{background:var(--psi-menu-item-bg)}._separator_uxpyi_82{height:0;margin:var(--psi-space-4) 0;border-top:1px solid var(--psi-menu-separator-border)}@supports (anchor-name: --x){._menu_uxpyi_16{position:fixed;margin:var(--psi-space-4);position-try-fallbacks:flip-block,flip-inline,flip-block flip-inline}._menu_uxpyi_16[data-placement=bottom-start]{position-area:block-end span-inline-end}._menu_uxpyi_16[data-placement=bottom-end]{position-area:block-end span-inline-start}._menu_uxpyi_16[data-placement=top-start]{position-area:block-start span-inline-end}._menu_uxpyi_16[data-placement=top-end]{position-area:block-start span-inline-start}}._table_1maek_3{width:100%;border-collapse:collapse;background:var(--psi-table-bg);color:var(--psi-table-fg);font:var(--psi-text-14-20-regular);border:1px solid var(--psi-table-border);border-radius:var(--psi-table-radius)}._caption_1maek_19{caption-side:top;text-align:start;padding-block:var(--psi-space-8);color:var(--psi-table-fg);font:var(--psi-text-14-20-medium)}._captionDetail_1maek_27{display:block;color:var(--psi-table-header-fg);font:var(--psi-text-12-16-regular)}._caption_1maek_19:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-table-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._headerCell_1maek_38{color:var(--psi-table-header-fg);font:var(--psi-text-14-20-medium);text-align:start}._cell_1maek_44,._headerCell_1maek_38{border-bottom:1px solid var(--psi-table-cell-border)}._rowHeader_1maek_51{font:var(--psi-text-14-20-medium);text-align:start}._cell_1maek_44[data-numeric],._headerCell_1maek_38[data-numeric]{text-align:end;font-variant-numeric:var(--psi-font-variant-numeric)}._sortButton_1maek_62{display:inline-flex;align-items:center;gap:var(--psi-space-4);padding:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer}._sortButton_1maek_62:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-table-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._sortIndicator_1maek_79{color:var(--psi-table-sort-indicator-fg)}._table_1maek_3[data-size="32"] ._cell_1maek_44,._table_1maek_3[data-size="32"] ._headerCell_1maek_38{height:var(--psi-table-32-row-height);padding-inline:var(--psi-table-32-cell-padding-x)}._table_1maek_3[data-size="32"] ._caption_1maek_19{padding-inline:var(--psi-table-32-cell-padding-x)}._table_1maek_3[data-size="40"] ._cell_1maek_44,._table_1maek_3[data-size="40"] ._headerCell_1maek_38{height:var(--psi-table-40-row-height);padding-inline:var(--psi-table-40-cell-padding-x)}._table_1maek_3[data-size="40"] ._caption_1maek_19{padding-inline:var(--psi-table-40-cell-padding-x)}._table_1maek_3[data-size="48"] ._cell_1maek_44,._table_1maek_3[data-size="48"] ._headerCell_1maek_38{height:var(--psi-table-48-row-height);padding-inline:var(--psi-table-48-cell-padding-x)}._table_1maek_3[data-size="48"] ._caption_1maek_19{padding-inline:var(--psi-table-48-cell-padding-x)}._table_1maek_3[data-size] ._selectCell_1maek_123{width:1%;padding-inline-end:0}._body_1maek_130 ._row_1maek_51:hover{background:var(--psi-table-row-bg-hover)}._body_1maek_130 ._row_1maek_51[data-selected]:hover,._row_1maek_51[data-selected]{background:var(--psi-table-row-bg-selected)}._row_1maek_51{background:var(--psi-table-row-bg)}._sticky_1maek_155 ._headerCell_1maek_38{position:sticky;inset-block-start:0;z-index:var(--psi-z-sticky);background:var(--psi-table-bg);box-shadow:inset 0 -1px 0 var(--psi-table-cell-border)}._nav_166vs_6{display:flex;align-items:center;gap:var(--psi-space-4)}._ellipsis_166vs_12{padding-inline:var(--psi-space-4)}._nav_jbhk1_5{display:inline-flex;align-items:center;gap:var(--psi-space-8)}._toast_1gxg8_10{pointer-events:auto;display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:var(--psi-space-12);min-width:280px;max-width:420px;padding:var(--psi-space-12) var(--psi-space-16);border:1px solid var(--psi-toast-border);border-radius:var(--psi-toast-radius);background:var(--psi-toast-bg);color:var(--psi-toast-fg);font:var(--psi-text-14-20-regular);animation:_toast-enter_1gxg8_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _toast-enter_1gxg8_1{0%{opacity:0;transform:translateY(8px)}}._icon_1gxg8_39{display:inline-flex;align-items:center}._iconNeutral_1gxg8_44{color:var(--psi-toast-icon-fg-neutral)}._iconSuccess_1gxg8_45{color:var(--psi-toast-icon-fg-success)}._iconWarning_1gxg8_46{color:var(--psi-toast-icon-fg-warning)}._iconDanger_1gxg8_47{color:var(--psi-toast-icon-fg-danger)}._body_1gxg8_51{min-width:0}._action_1gxg8_55{display:inline-flex}._region_1gxg8_61{position:fixed;inset:auto;margin:0;padding:var(--psi-space-16);border:0;background:none;overflow:visible;pointer-events:none;display:flex;flex-direction:column;gap:var(--psi-space-8);width:max-content;max-width:100%}._region_1gxg8_61[data-placement=top-start]{top:0;left:0;align-items:flex-start}._region_1gxg8_61[data-placement=top-end]{top:0;right:0;align-items:flex-end}._region_1gxg8_61[data-placement=bottom-start]{bottom:0;left:0;align-items:flex-start}._region_1gxg8_61[data-placement=bottom-end]{bottom:0;right:0;align-items:flex-end}._region_1gxg8_61[data-placement^=bottom] ._live_1gxg8_91{flex-direction:column-reverse}._live_1gxg8_91{display:flex;flex-direction:column;gap:var(--psi-space-8)}._banner_pco49_7{display:grid;grid-template-columns:auto 1fr auto auto;align-items:start;gap:var(--psi-space-12);width:100%;box-sizing:border-box;padding:var(--psi-space-12) var(--psi-space-16);color:var(--psi-banner-fg);font:var(--psi-text-14-20-regular)}._banner_pco49_7[data-variant=neutral]{background:var(--psi-banner-bg-neutral)}._banner_pco49_7[data-variant=success]{background:var(--psi-banner-bg-success)}._banner_pco49_7[data-variant=warning]{background:var(--psi-banner-bg-warning)}._banner_pco49_7[data-variant=danger]{background:var(--psi-banner-bg-danger)}._icon_pco49_26{display:inline-flex;align-items:center}._iconNeutral_pco49_31{color:var(--psi-banner-icon-fg-neutral)}._iconSuccess_pco49_32{color:var(--psi-banner-icon-fg-success)}._iconWarning_pco49_33{color:var(--psi-banner-icon-fg-warning)}._iconDanger_pco49_34{color:var(--psi-banner-icon-fg-danger)}._body_pco49_36{min-width:0}._title_pco49_40{display:block;font:var(--psi-text-14-20-medium)}._action_pco49_45{display:inline-flex}._inlineAlert_1tt2h_7{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--psi-space-12);box-sizing:border-box;padding:var(--psi-space-12) var(--psi-space-16);border-radius:var(--psi-inline-alert-radius);color:var(--psi-inline-alert-fg);font:var(--psi-text-14-20-regular)}._inlineAlert_1tt2h_7[data-variant=neutral]{background:var(--psi-inline-alert-bg-neutral);border:1px solid var(--psi-inline-alert-border-neutral)}._inlineAlert_1tt2h_7[data-variant=success]{background:var(--psi-inline-alert-bg-success);border:1px solid var(--psi-inline-alert-border-success)}._inlineAlert_1tt2h_7[data-variant=warning]{background:var(--psi-inline-alert-bg-warning);border:1px solid var(--psi-inline-alert-border-warning)}._inlineAlert_1tt2h_7[data-variant=danger]{background:var(--psi-inline-alert-bg-danger);border:1px solid var(--psi-inline-alert-border-danger)}._icon_1tt2h_38{display:inline-flex;align-items:center}._iconNeutral_1tt2h_43{color:var(--psi-inline-alert-icon-fg-neutral)}._iconSuccess_1tt2h_44{color:var(--psi-inline-alert-icon-fg-success)}._iconWarning_1tt2h_45{color:var(--psi-inline-alert-icon-fg-warning)}._iconDanger_1tt2h_46{color:var(--psi-inline-alert-icon-fg-danger)}._body_1tt2h_48{min-width:0}._title_1tt2h_52{display:block;font:var(--psi-text-14-20-medium)}._action_1tt2h_57{display:inline-flex}@keyframes _skeleton-pulse_1yo7t_1{0%{opacity:1}to{opacity:.45}}._skeleton_1yo7t_12{width:100%;box-sizing:border-box;animation:_skeleton-pulse_1yo7t_1 var(--psi-duration-600) var(--psi-ease-in-out) infinite alternate}._skeleton_1yo7t_12[data-variant=block]{border-radius:var(--psi-skeleton-radius);background:var(--psi-skeleton-bg)}._skeleton_1yo7t_12[data-size="24"]{height:var(--psi-size-24)}._skeleton_1yo7t_12[data-size="32"]{height:var(--psi-size-32)}._skeleton_1yo7t_12[data-size="40"]{height:var(--psi-size-40)}._skeleton_1yo7t_12[data-size="48"]{height:var(--psi-size-48)}._line_1yo7t_28{display:block;padding-block:var(--psi-space-6);margin-block:var(--psi-space-4);border-radius:var(--psi-skeleton-radius);background:var(--psi-skeleton-bg)}._line_1yo7t_28:last-child:not(:first-child){width:60%}@media(prefers-reduced-motion:reduce){._skeleton_1yo7t_12{animation:none}}._tabs_1x9om_8{display:flex;flex-direction:column;gap:var(--psi-space-16)}._tabs_1x9om_8[data-orientation=vertical]{flex-direction:row;gap:var(--psi-space-24)}._list_1x9om_21{display:flex;flex-wrap:wrap;gap:var(--psi-space-4);border-bottom:1px solid var(--psi-tabs-list-border)}._tabs_1x9om_8[data-orientation=vertical] ._list_1x9om_21{flex-direction:column;flex-wrap:nowrap;border-bottom:none;border-inline-start:1px solid var(--psi-tabs-list-border)}._tab_1x9om_8{position:relative;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background:none;cursor:pointer;height:var(--psi-tabs-40-height);padding-inline:var(--psi-tabs-40-padding-x);font:var(--psi-text-14-20-medium);color:var(--psi-tabs-fg);transition:color var(--psi-duration-150) var(--psi-ease-standard)}._tab_1x9om_8:hover:not([aria-disabled=true]){background:var(--psi-tabs-bg-hover)}._tab_1x9om_8:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tabs-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._tab_1x9om_8[aria-disabled=true]{color:var(--psi-tabs-fg-disabled);cursor:default}._tab_1x9om_8[aria-selected=true]{color:var(--psi-tabs-fg-selected)}._tab_1x9om_8[aria-selected=true]:after{content:"";position:absolute;inset-inline:0;bottom:-1px;height:2px;background:var(--psi-tabs-indicator)}._tabs_1x9om_8[data-orientation=vertical] ._tab_1x9om_8{text-align:start}._tabs_1x9om_8[data-orientation=vertical] ._tab_1x9om_8[aria-selected=true]:after{inset-inline:auto;inset-block:0;inset-inline-start:-1px;width:2px;height:auto}._panel_1x9om_99{min-width:0}._panel_1x9om_99:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tabs-focus-ring);outline-offset:var(--psi-focus-ring-offset)}
1
+ ._button_a3yli_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-button-radius);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_a3yli_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-button-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._button_a3yli_3:disabled{opacity:.4;cursor:not-allowed}._button_a3yli_3._disabled_a3yli_30{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_a3yli_50{height:var(--psi-button-24-height);padding-inline:var(--psi-button-24-padding-inline);gap:var(--psi-button-24-gap);font:var(--psi-button-font, var(--psi-button-24-font))}._size24_a3yli_50:has(>svg:first-child){padding-inline-start:var(--psi-button-24-padding-inline-icon)}._size24_a3yli_50:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-24-padding-inline-icon)}._size32_a3yli_63{height:var(--psi-button-32-height);padding-inline:var(--psi-button-32-padding-inline);gap:var(--psi-button-32-gap);font:var(--psi-button-font, var(--psi-button-32-font))}._size32_a3yli_63:has(>svg:first-child){padding-inline-start:var(--psi-button-32-padding-inline-icon)}._size32_a3yli_63:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-32-padding-inline-icon)}._size40_a3yli_76{height:var(--psi-button-40-height);padding-inline:var(--psi-button-40-padding-inline);gap:var(--psi-button-40-gap);font:var(--psi-button-font, var(--psi-button-40-font))}._size40_a3yli_76:has(>svg:first-child){padding-inline-start:var(--psi-button-40-padding-inline-icon)}._size40_a3yli_76:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-40-padding-inline-icon)}._size48_a3yli_89{height:var(--psi-button-48-height);padding-inline:var(--psi-button-48-padding-inline);gap:var(--psi-button-48-gap);font:var(--psi-button-font, var(--psi-button-48-font))}._size48_a3yli_89:has(>svg:first-child){padding-inline-start:var(--psi-button-48-padding-inline-icon)}._size48_a3yli_89:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-48-padding-inline-icon)}._accent_a3yli_105{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_a3yli_105:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-bg-hover)}._accent_a3yli_105:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-bg-active)}._accentSubtle_a3yli_117{background:var(--psi-button-accent-subtle-bg);color:var(--psi-button-accent-subtle-fg)}._accentSubtle_a3yli_117:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-subtle-bg-hover)}._accentSubtle_a3yli_117:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-accent-subtle-bg-active)}._neutral_a3yli_129{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_a3yli_129:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-bg-hover)}._neutral_a3yli_129:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-bg-active)}._neutralSubtle_a3yli_141{background:var(--psi-button-neutral-subtle-bg);color:var(--psi-button-neutral-subtle-fg)}._neutralSubtle_a3yli_141:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-subtle-bg-hover)}._neutralSubtle_a3yli_141:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-neutral-subtle-bg-active)}._ghost_a3yli_153{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_a3yli_153:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-ghost-bg-hover)}._ghost_a3yli_153:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-ghost-bg-active)}._danger_a3yli_165{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_a3yli_165:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-bg-hover)}._danger_a3yli_165:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-bg-active)}._dangerSubtle_a3yli_177{background:var(--psi-button-danger-subtle-bg);color:var(--psi-button-danger-subtle-fg)}._dangerSubtle_a3yli_177:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-subtle-bg-hover)}._dangerSubtle_a3yli_177:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-danger-subtle-bg-active)}._outline_a3yli_189{background:var(--psi-button-outline-bg);color:var(--psi-button-outline-fg);border:1px solid var(--psi-button-outline-border)}._outline_a3yli_189:hover:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-outline-bg-hover);color:var(--psi-button-outline-fg-hover);border-color:transparent}._outline_a3yli_189:active:not(:disabled):not(._disabled_a3yli_30){background:var(--psi-button-outline-bg-active)}._iconButton_1q4hx_3{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--psi-button-radius);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_1q4hx_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-button-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._iconButton_1q4hx_3:disabled{opacity:.4;cursor:not-allowed}._iconButton_1q4hx_3._disabled_1q4hx_29{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_1q4hx_37{width:var(--psi-button-24-height);height:var(--psi-button-24-height)}._size32_1q4hx_42{width:var(--psi-button-32-height);height:var(--psi-button-32-height)}._size40_1q4hx_47{width:var(--psi-button-40-height);height:var(--psi-button-40-height)}._size48_1q4hx_52{width:var(--psi-button-48-height);height:var(--psi-button-48-height)}._accent_1q4hx_60{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_1q4hx_60:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-accent-bg-hover)}._accent_1q4hx_60:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-accent-bg-active)}._neutral_1q4hx_72{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_1q4hx_72:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-neutral-bg-hover)}._neutral_1q4hx_72:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-neutral-bg-active)}._ghost_1q4hx_84{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_1q4hx_84:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-ghost-bg-hover)}._ghost_1q4hx_84:active:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-ghost-bg-active)}._danger_1q4hx_96{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_1q4hx_96:hover:not(:disabled):not(._disabled_1q4hx_29){background:var(--psi-button-danger-bg-hover)}._danger_1q4hx_96:active:not(:disabled):not(._disabled_1q4hx_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)}._panel_jn8w4_1{background:var(--psi-panel-bg);border:1px solid var(--psi-panel-border);border-radius:var(--psi-panel-radius);padding:var(--psi-panel-padding)}._padding16_jn8w4_8{padding:var(--psi-space-16)}._list_1lh3q_8{display:flex;flex-direction:column;gap:var(--psi-space-12);margin:var(--psi-space-0)}._list_1lh3q_8[data-gap="8"]{gap:var(--psi-space-8)}._list_1lh3q_8[data-gap="16"]{gap:var(--psi-space-16)}._item_1lh3q_26{display:flex;flex-direction:column;gap:var(--psi-space-4);min-width:0}._list_1lh3q_8[data-layout=inline] ._item_1lh3q_26{display:grid;grid-template-columns:auto 1fr;column-gap:var(--psi-space-16);row-gap:var(--psi-space-0);align-items:start}._term_1lh3q_44{color:var(--psi-description-list-term-fg);font:var(--psi-text-14-20-medium);min-width:0}._value_1lh3q_50{color:var(--psi-description-list-value-fg);font:var(--psi-text-14-20-regular);margin:var(--psi-space-0);min-width:0;overflow-wrap:anywhere}._navbar_1w24e_1{font:var(--psi-text-14-20-medium);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_1w24e_12{display:flex;align-items:center;gap:var(--psi-space-24);height:var(--psi-navbar-height)}._fluid_1w24e_20{padding-inline:var(--psi-navbar-gutter)}._brand_1w24e_22{display:flex;align-items:center}._links_1w24e_23{display:flex;align-items:center;gap:var(--psi-space-20);margin-inline-start:auto}._links_1w24e_23 a,._brand_1w24e_22 a{text-decoration:none;transition:color var(--psi-duration-150) var(--psi-ease-soft)}._links_1w24e_23 a{color:var(--psi-navbar-link-fg)}._links_1w24e_23 a:hover,._brand_1w24e_22 a{color:var(--psi-navbar-link-fg-hover)}._links_1w24e_23 a:focus-visible,._brand_1w24e_22 a:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-navbar-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._actions_1w24e_53{display:flex;align-items:center;gap:var(--psi-space-8)}._brand_1w24e_22+._actions_1w24e_53,._actions_1w24e_53:first-child{margin-inline-start:auto}._skipLink_1fn0y_4{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}._skipLink_1fn0y_4:focus-visible{position:fixed;inset-block-start:0;inset-inline-start:0;margin:var(--psi-space-8);z-index:var(--psi-z-overlay);display:inline-flex;align-items:center;box-sizing:border-box;width:auto;height:var(--psi-size-32);padding-inline:var(--psi-space-12);overflow:visible;clip:auto;clip-path:none;background:var(--psi-skip-link-bg);color:var(--psi-skip-link-fg);border:1px solid var(--psi-skip-link-border);border-radius:var(--psi-skip-link-radius);font:var(--psi-text-14-20-medium);text-decoration:none;outline:var(--psi-focus-ring-width) solid var(--psi-skip-link-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._navTree_y5m3t_7{display:block}._list_y5m3t_11,._groupList_y5m3t_12{display:flex;flex-direction:column;gap:var(--psi-space-2);margin:0;padding:0;list-style:none}._item_y5m3t_23 a{position:relative;display:flex;align-items:center;box-sizing:border-box;min-height:var(--psi-size-32);padding-block:var(--psi-space-4);padding-inline:var(--psi-space-12);border-radius:var(--psi-nav-tree-radius);color:var(--psi-nav-tree-item-fg);font:var(--psi-text-14-20-regular);text-decoration:none}._item_y5m3t_23 a:hover{background:var(--psi-nav-tree-item-bg-hover)}._item_y5m3t_23 a:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-nav-tree-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._item_y5m3t_23 a[aria-current=page]{background:var(--psi-nav-tree-item-bg-current);color:var(--psi-nav-tree-item-fg-current);font:var(--psi-text-14-20-medium)}._item_y5m3t_23 a[aria-current=page]:before{content:"";position:absolute;inset-block:0;inset-inline-start:0;width:3px;border-radius:var(--psi-nav-tree-radius);background:var(--psi-nav-tree-indicator)}._groupButton_y5m3t_70{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;align-items:center;justify-content:space-between;gap:var(--psi-space-8);box-sizing:border-box;width:100%;min-height:var(--psi-size-32);padding-block:var(--psi-space-4);padding-inline:var(--psi-space-12);border:0;border-radius:var(--psi-nav-tree-radius);background:none;color:var(--psi-nav-tree-group-fg);font:var(--psi-text-14-20-medium);text-align:start;cursor:pointer}._groupButton_y5m3t_70:hover{background:var(--psi-nav-tree-item-bg-hover)}._groupButton_y5m3t_70:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-nav-tree-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._groupLabel_y5m3t_99{min-width:0}._chevron_y5m3t_103{flex:none;transition:transform var(--psi-duration-150) var(--psi-ease-standard)}._groupButton_y5m3t_70[aria-expanded=true] ._chevron_y5m3t_103{transform:rotate(180deg)}._groupList_y5m3t_12{padding-inline-start:var(--psi-space-12);margin-block-start:var(--psi-space-2)}._groupList_y5m3t_12[hidden]{display:none}._appShell_i1tds_10{display:grid;grid-template-rows:auto 1fr;grid-template-columns:var(--psi-app-shell-sidebar-width) minmax(0,1fr);height:100dvh}._sidebarClosed_i1tds_18{grid-template-columns:minmax(0,1fr)}._header_i1tds_22{grid-row:1;grid-column:1 / -1;min-width:0}._sidebar_i1tds_18{grid-row:2;min-height:0;overflow:auto;padding:var(--psi-space-8);background:var(--psi-app-shell-sidebar-bg);color:var(--psi-app-shell-sidebar-fg)}._sidebar_i1tds_18[hidden]{display:none}._main_i1tds_45{grid-row:2;min-width:0;min-height:0;overflow:auto}._main_i1tds_45:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-app-shell-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}._field_x989o_1{display:grid;gap:var(--psi-field-gap);border:0;margin:0;padding:0;min-width:0}._label_x989o_10{font:var(--psi-text-14-20-medium);color:var(--psi-field-label-fg);padding:0;min-block-size:var(--psi-field-label-height)}._marker_x989o_19{color:var(--psi-field-marker-fg)}._requiredText_x989o_25{font:var(--psi-text-14-20-regular);color:var(--psi-field-required-text-fg)}._message_x989o_30{margin:0;font:var(--psi-text-12-16-regular);color:var(--psi-field-message-fg)}._invalid_x989o_36 ._message_x989o_30{color:var(--psi-field-error-fg)}._dialog_qg38y_2{padding:0;border:1px solid var(--psi-dialog-border);border-radius:var(--psi-dialog-radius);background:var(--psi-dialog-bg);color:var(--psi-dialog-fg);max-width:calc(100vw - var(--psi-space-32))}._dialog_qg38y_2::backdrop{background:var(--psi-dialog-backdrop)}._dialog_qg38y_2:focus-visible,._panel_qg38y_20:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-dialog-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._dialog_qg38y_2[open]::backdrop{animation:_backdrop-enter_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _backdrop-enter_qg38y_1{0%{opacity:0}}._center_qg38y_42[open]{animation:_dialog-enter_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _dialog-enter_qg38y_1{0%{opacity:0;transform:scale(.97)}}._inlineStart_qg38y_50,._inlineEnd_qg38y_51{box-sizing:border-box;margin-block:0;height:100dvh;max-height:100dvh;max-width:100vw;border-radius:0}._inlineEnd_qg38y_51{margin-inline-start:auto;margin-inline-end:0;border-start-start-radius:var(--psi-dialog-radius);border-end-start-radius:var(--psi-dialog-radius)}._inlineStart_qg38y_50{margin-inline-start:0;margin-inline-end:auto;border-start-end-radius:var(--psi-dialog-radius);border-end-end-radius:var(--psi-dialog-radius)}._inlineEnd_qg38y_51[open]{animation:_drawer-enter-end_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}._inlineStart_qg38y_50[open]{animation:_drawer-enter-start_qg38y_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _drawer-enter-end_qg38y_1{0%{transform:translate(100%)}}@keyframes _drawer-enter-start_qg38y_1{0%{transform:translate(-100%)}}._w400_qg38y_100{width:400px}._w560_qg38y_101{width:560px}._w720_qg38y_102{width:720px}._panel_qg38y_20{display:grid;gap:var(--psi-space-16);padding:var(--psi-space-24)}._inlineStart_qg38y_50 ._panel_qg38y_20,._inlineEnd_qg38y_51 ._panel_qg38y_20{height:100%;overflow-y:auto;align-content:start}._header_qg38y_124{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--psi-space-12)}._title_qg38y_131{margin:0;font:var(--psi-text-18-28-medium);color:var(--psi-dialog-title-fg)}._footer_qg38y_137{display:flex;justify-content:flex-end;gap:var(--psi-space-8)}._input_pmr7w_3{display:block;box-sizing:border-box;width:100%;border:1px solid var(--psi-input-border);border-radius:var(--psi-input-radius);background:var(--psi-input-bg);color:var(--psi-input-fg);font-family:var(--psi-font-sans);transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._input_pmr7w_3::placeholder{color:var(--psi-input-placeholder)}._input_pmr7w_3:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-input-border-hover)}._input_pmr7w_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-input-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset);border-color:transparent}._input_pmr7w_3:disabled{opacity:.4;cursor:not-allowed}._size24_pmr7w_43{height:var(--psi-input-24-height);padding-inline:var(--psi-input-24-padding-inline);font:var(--psi-input-24-font)}._size32_pmr7w_49{height:var(--psi-input-32-height);padding-inline:var(--psi-input-32-padding-inline);font:var(--psi-input-32-font)}._size40_pmr7w_55{height:var(--psi-input-40-height);padding-inline:var(--psi-input-40-padding-inline);font:var(--psi-input-40-font)}._size48_pmr7w_61{height:var(--psi-input-48-height);padding-inline:var(--psi-input-48-padding-inline);font:var(--psi-input-48-font)}._error_pmr7w_69{border-color:var(--psi-input-border-error)}._error_pmr7w_69:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-input-border-error)}._select_1eqz1_3{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--psi-select-border);border-radius:var(--psi-select-radius);background-color:var(--psi-select-bg);background-image:linear-gradient(45deg,transparent calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% + .75px),transparent calc(50% + .75px)),linear-gradient(135deg,transparent calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% - .75px),var(--psi-select-chevron-fg) calc(50% + .75px),transparent calc(50% + .75px));background-size:4px 4px;background-repeat:no-repeat;color:var(--psi-select-fg);font-family:var(--psi-font-sans);cursor:pointer;transition:border-color var(--psi-duration-150) var(--psi-ease-standard),outline var(--psi-duration-150) var(--psi-ease-standard)}._select_1eqz1_3:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-select-border-hover)}._select_1eqz1_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-select-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset);border-color:transparent}._select_1eqz1_3:disabled{opacity:.4;cursor:not-allowed}._size24_1eqz1_57{height:var(--psi-select-24-height);padding-inline-start:var(--psi-select-24-padding-inline);padding-inline-end:var(--psi-select-24-padding-inline-end);background-position:right calc(var(--psi-select-24-chevron-offset) + 6px) center,right calc(var(--psi-select-24-chevron-offset) + 2px) center;font:var(--psi-select-24-font)}._size32_1eqz1_67{height:var(--psi-select-32-height);padding-inline-start:var(--psi-select-32-padding-inline);padding-inline-end:var(--psi-select-32-padding-inline-end);background-position:right calc(var(--psi-select-32-chevron-offset) + 6px) center,right calc(var(--psi-select-32-chevron-offset) + 2px) center;font:var(--psi-select-32-font)}._size40_1eqz1_77{height:var(--psi-select-40-height);padding-inline-start:var(--psi-select-40-padding-inline);padding-inline-end:var(--psi-select-40-padding-inline-end);background-position:right calc(var(--psi-select-40-chevron-offset) + 6px) center,right calc(var(--psi-select-40-chevron-offset) + 2px) center;font:var(--psi-select-40-font)}._size48_1eqz1_87{height:var(--psi-select-48-height);padding-inline-start:var(--psi-select-48-padding-inline);padding-inline-end:var(--psi-select-48-padding-inline-end);background-position:right calc(var(--psi-select-48-chevron-offset) + 6px) center,right calc(var(--psi-select-48-chevron-offset) + 2px) center;font:var(--psi-select-48-font)}._error_1eqz1_99{border-color:var(--psi-select-border-error)}._error_1eqz1_99:hover:not(:disabled):not(:focus-visible){border-color:var(--psi-select-border-error)}._label_1jm35_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_1jm35_13{opacity:.4;cursor:not-allowed}._indicator_1jm35_26{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-checkbox-box-radius);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_1jm35_42:checked+._indicator_1jm35_26{background:var(--psi-checkbox-box-bg-checked);border-color:var(--psi-checkbox-box-border-checked)}._input_1jm35_42:checked+._indicator_1jm35_26:after{content:"";display:block;width:4px;height:8px;color:var(--psi-checkbox-check-fg);border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg) translate(-.5px,-.5px)}._input_1jm35_42:focus-visible+._indicator_1jm35_26{outline:var(--psi-focus-ring-width) solid var(--psi-checkbox-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._text_1jm35_67{color:var(--psi-checkbox-fg)}._label_yv464_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_yv464_13{opacity:.4;cursor:not-allowed}._track_yv464_26{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_yv464_38:checked+._track_yv464_26{background:var(--psi-switch-track-bg-checked)}._input_yv464_38:focus-visible+._track_yv464_26{outline:var(--psi-focus-ring-width) solid var(--psi-switch-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._thumb_yv464_50{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_yv464_38:checked+._track_yv464_26 ._thumb_yv464_50{left:18px}._text_yv464_67{color:var(--psi-switch-fg)}._tag_1r2xw_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_1r2xw_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_1r2xw_17:hover{opacity:1}._dismiss_1r2xw_17:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tag-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._neutral_1r2xw_43{background:var(--psi-tag-neutral-bg);color:var(--psi-tag-neutral-fg)}._accent_1r2xw_48{background:var(--psi-tag-accent-bg);color:var(--psi-tag-accent-fg)}._success_1r2xw_53{background:var(--psi-tag-success-bg);color:var(--psi-tag-success-fg)}._warning_1r2xw_58{background:var(--psi-tag-warning-bg);color:var(--psi-tag-warning-fg)}._danger_1r2xw_63{background:var(--psi-tag-danger-bg);color:var(--psi-tag-danger-fg)}._neutralSubtle_1r2xw_70{background:var(--psi-tag-neutral-subtle-bg);color:var(--psi-tag-neutral-subtle-fg)}._accentSubtle_1r2xw_75{background:var(--psi-tag-accent-subtle-bg);color:var(--psi-tag-accent-subtle-fg)}._successSubtle_1r2xw_80{background:var(--psi-tag-success-subtle-bg);color:var(--psi-tag-success-subtle-fg)}._warningSubtle_1r2xw_85{background:var(--psi-tag-warning-subtle-bg);color:var(--psi-tag-warning-subtle-fg)}._dangerSubtle_1r2xw_90{background:var(--psi-tag-danger-subtle-bg);color:var(--psi-tag-danger-subtle-fg)}._wrapper_1eu6z_3{position:relative;display:inline-flex}._tooltip_1eu6z_10{position:absolute;z-index:var(--psi-z-tooltip);padding:var(--psi-space-4) var(--psi-space-8);border-radius:var(--psi-tooltip-radius);background:var(--psi-tooltip-bg);color:var(--psi-tooltip-fg);font:var(--psi-text-12-16-regular);white-space:nowrap;pointer-events:none}._top_1eu6z_24{bottom:100%;left:50%;transform:translate(-50%);margin-bottom:var(--psi-space-4)}._bottom_1eu6z_31{top:100%;left:50%;transform:translate(-50%);margin-top:var(--psi-space-4)}._left_1eu6z_38{right:100%;top:50%;transform:translateY(-50%);margin-right:var(--psi-space-4)}._right_1eu6z_45{left:100%;top:50%;transform:translateY(-50%);margin-left:var(--psi-space-4)}._toolbar_8bwkv_1{display:flex;flex-wrap:wrap;align-items:center}._gap8_8bwkv_7{gap:var(--psi-space-8)}._gap12_8bwkv_8{gap:var(--psi-space-12)}._gap16_8bwkv_9{gap:var(--psi-space-16)}._alignEnd_8bwkv_13{align-items:flex-end}._alignStart_8bwkv_19{align-items:flex-start}._alignStart_8bwkv_19>:is(button,a){margin-block-start:var(--psi-toolbar-action-offset)}._toolbar_8bwkv_1>input,._toolbar_8bwkv_1>select{width:var(--psi-toolbar-control-width)}._trigger_uxpyi_4{display:inline-flex;width:fit-content}._menu_uxpyi_16{min-width:180px;margin:var(--psi-space-4);padding:var(--psi-space-4);border:1px solid var(--psi-menu-border);border-radius:var(--psi-menu-radius);background:var(--psi-menu-bg);color:var(--psi-menu-fg);font:var(--psi-text-14-20-regular)}._menu_uxpyi_16:not([data-open]):not(:popover-open){display:none}._item_uxpyi_37{display:flex;width:100%;align-items:center;padding:var(--psi-space-8) var(--psi-space-12);border:0;border-radius:var(--psi-radius-6);background:var(--psi-menu-item-bg);color:var(--psi-menu-item-fg);font:inherit;text-align:start;cursor:pointer}._item_uxpyi_37:hover{background:var(--psi-menu-item-bg-hover)}._item_uxpyi_37:active{background:var(--psi-menu-item-bg-active)}._item_uxpyi_37:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-menu-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._item_uxpyi_37[data-variant=danger]{color:var(--psi-menu-item-fg-danger)}._item_uxpyi_37[aria-disabled=true]{color:var(--psi-menu-item-fg-disabled);cursor:default}._item_uxpyi_37[aria-disabled=true]:hover{background:var(--psi-menu-item-bg)}._separator_uxpyi_82{height:0;margin:var(--psi-space-4) 0;border-top:1px solid var(--psi-menu-separator-border)}@supports (anchor-name: --x){._menu_uxpyi_16{position:fixed;margin:var(--psi-space-4);position-try-fallbacks:flip-block,flip-inline,flip-block flip-inline}._menu_uxpyi_16[data-placement=bottom-start]{position-area:block-end span-inline-end}._menu_uxpyi_16[data-placement=bottom-end]{position-area:block-end span-inline-start}._menu_uxpyi_16[data-placement=top-start]{position-area:block-start span-inline-end}._menu_uxpyi_16[data-placement=top-end]{position-area:block-start span-inline-start}}._table_1maek_3{width:100%;border-collapse:collapse;background:var(--psi-table-bg);color:var(--psi-table-fg);font:var(--psi-text-14-20-regular);border:1px solid var(--psi-table-border);border-radius:var(--psi-table-radius)}._caption_1maek_19{caption-side:top;text-align:start;padding-block:var(--psi-space-8);color:var(--psi-table-fg);font:var(--psi-text-14-20-medium)}._captionDetail_1maek_27{display:block;color:var(--psi-table-header-fg);font:var(--psi-text-12-16-regular)}._caption_1maek_19:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-table-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._headerCell_1maek_38{color:var(--psi-table-header-fg);font:var(--psi-text-14-20-medium);text-align:start}._cell_1maek_44,._headerCell_1maek_38{border-bottom:1px solid var(--psi-table-cell-border)}._rowHeader_1maek_51{font:var(--psi-text-14-20-medium);text-align:start}._cell_1maek_44[data-numeric],._headerCell_1maek_38[data-numeric]{text-align:end;font-variant-numeric:var(--psi-font-variant-numeric)}._sortButton_1maek_62{display:inline-flex;align-items:center;gap:var(--psi-space-4);padding:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer}._sortButton_1maek_62:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-table-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._sortIndicator_1maek_79{color:var(--psi-table-sort-indicator-fg)}._table_1maek_3[data-size="32"] ._cell_1maek_44,._table_1maek_3[data-size="32"] ._headerCell_1maek_38{height:var(--psi-table-32-row-height);padding-inline:var(--psi-table-32-cell-padding-x)}._table_1maek_3[data-size="32"] ._caption_1maek_19{padding-inline:var(--psi-table-32-cell-padding-x)}._table_1maek_3[data-size="40"] ._cell_1maek_44,._table_1maek_3[data-size="40"] ._headerCell_1maek_38{height:var(--psi-table-40-row-height);padding-inline:var(--psi-table-40-cell-padding-x)}._table_1maek_3[data-size="40"] ._caption_1maek_19{padding-inline:var(--psi-table-40-cell-padding-x)}._table_1maek_3[data-size="48"] ._cell_1maek_44,._table_1maek_3[data-size="48"] ._headerCell_1maek_38{height:var(--psi-table-48-row-height);padding-inline:var(--psi-table-48-cell-padding-x)}._table_1maek_3[data-size="48"] ._caption_1maek_19{padding-inline:var(--psi-table-48-cell-padding-x)}._table_1maek_3[data-size] ._selectCell_1maek_123{width:1%;padding-inline-end:0}._body_1maek_130 ._row_1maek_51:hover{background:var(--psi-table-row-bg-hover)}._body_1maek_130 ._row_1maek_51[data-selected]:hover,._row_1maek_51[data-selected]{background:var(--psi-table-row-bg-selected)}._row_1maek_51{background:var(--psi-table-row-bg)}._sticky_1maek_155 ._headerCell_1maek_38{position:sticky;inset-block-start:0;z-index:var(--psi-z-sticky);background:var(--psi-table-bg);box-shadow:inset 0 -1px 0 var(--psi-table-cell-border)}._nav_166vs_6{display:flex;align-items:center;gap:var(--psi-space-4)}._ellipsis_166vs_12{padding-inline:var(--psi-space-4)}._nav_jbhk1_5{display:inline-flex;align-items:center;gap:var(--psi-space-8)}._toast_1gxg8_10{pointer-events:auto;display:grid;grid-template-columns:auto 1fr auto auto;align-items:center;gap:var(--psi-space-12);min-width:280px;max-width:420px;padding:var(--psi-space-12) var(--psi-space-16);border:1px solid var(--psi-toast-border);border-radius:var(--psi-toast-radius);background:var(--psi-toast-bg);color:var(--psi-toast-fg);font:var(--psi-text-14-20-regular);animation:_toast-enter_1gxg8_1 var(--psi-duration-200) var(--psi-ease-soft)}@keyframes _toast-enter_1gxg8_1{0%{opacity:0;transform:translateY(8px)}}._icon_1gxg8_39{display:inline-flex;align-items:center}._iconNeutral_1gxg8_44{color:var(--psi-toast-icon-fg-neutral)}._iconSuccess_1gxg8_45{color:var(--psi-toast-icon-fg-success)}._iconWarning_1gxg8_46{color:var(--psi-toast-icon-fg-warning)}._iconDanger_1gxg8_47{color:var(--psi-toast-icon-fg-danger)}._body_1gxg8_51{min-width:0}._action_1gxg8_55{display:inline-flex}._region_1gxg8_61{position:fixed;inset:auto;margin:0;padding:var(--psi-space-16);border:0;background:none;overflow:visible;pointer-events:none;display:flex;flex-direction:column;gap:var(--psi-space-8);width:max-content;max-width:100%}._region_1gxg8_61[data-placement=top-start]{top:0;left:0;align-items:flex-start}._region_1gxg8_61[data-placement=top-end]{top:0;right:0;align-items:flex-end}._region_1gxg8_61[data-placement=bottom-start]{bottom:0;left:0;align-items:flex-start}._region_1gxg8_61[data-placement=bottom-end]{bottom:0;right:0;align-items:flex-end}._region_1gxg8_61[data-placement^=bottom] ._live_1gxg8_91{flex-direction:column-reverse}._live_1gxg8_91{display:flex;flex-direction:column;gap:var(--psi-space-8)}._banner_pco49_7{display:grid;grid-template-columns:auto 1fr auto auto;align-items:start;gap:var(--psi-space-12);width:100%;box-sizing:border-box;padding:var(--psi-space-12) var(--psi-space-16);color:var(--psi-banner-fg);font:var(--psi-text-14-20-regular)}._banner_pco49_7[data-variant=neutral]{background:var(--psi-banner-bg-neutral)}._banner_pco49_7[data-variant=success]{background:var(--psi-banner-bg-success)}._banner_pco49_7[data-variant=warning]{background:var(--psi-banner-bg-warning)}._banner_pco49_7[data-variant=danger]{background:var(--psi-banner-bg-danger)}._icon_pco49_26{display:inline-flex;align-items:center}._iconNeutral_pco49_31{color:var(--psi-banner-icon-fg-neutral)}._iconSuccess_pco49_32{color:var(--psi-banner-icon-fg-success)}._iconWarning_pco49_33{color:var(--psi-banner-icon-fg-warning)}._iconDanger_pco49_34{color:var(--psi-banner-icon-fg-danger)}._body_pco49_36{min-width:0}._title_pco49_40{display:block;font:var(--psi-text-14-20-medium)}._action_pco49_45{display:inline-flex}._inlineAlert_1tt2h_7{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--psi-space-12);box-sizing:border-box;padding:var(--psi-space-12) var(--psi-space-16);border-radius:var(--psi-inline-alert-radius);color:var(--psi-inline-alert-fg);font:var(--psi-text-14-20-regular)}._inlineAlert_1tt2h_7[data-variant=neutral]{background:var(--psi-inline-alert-bg-neutral);border:1px solid var(--psi-inline-alert-border-neutral)}._inlineAlert_1tt2h_7[data-variant=success]{background:var(--psi-inline-alert-bg-success);border:1px solid var(--psi-inline-alert-border-success)}._inlineAlert_1tt2h_7[data-variant=warning]{background:var(--psi-inline-alert-bg-warning);border:1px solid var(--psi-inline-alert-border-warning)}._inlineAlert_1tt2h_7[data-variant=danger]{background:var(--psi-inline-alert-bg-danger);border:1px solid var(--psi-inline-alert-border-danger)}._icon_1tt2h_38{display:inline-flex;align-items:center}._iconNeutral_1tt2h_43{color:var(--psi-inline-alert-icon-fg-neutral)}._iconSuccess_1tt2h_44{color:var(--psi-inline-alert-icon-fg-success)}._iconWarning_1tt2h_45{color:var(--psi-inline-alert-icon-fg-warning)}._iconDanger_1tt2h_46{color:var(--psi-inline-alert-icon-fg-danger)}._body_1tt2h_48{min-width:0}._title_1tt2h_52{display:block;font:var(--psi-text-14-20-medium)}._action_1tt2h_57{display:inline-flex}@keyframes _skeleton-pulse_1yo7t_1{0%{opacity:1}to{opacity:.45}}._skeleton_1yo7t_12{width:100%;box-sizing:border-box;animation:_skeleton-pulse_1yo7t_1 var(--psi-duration-600) var(--psi-ease-in-out) infinite alternate}._skeleton_1yo7t_12[data-variant=block]{border-radius:var(--psi-skeleton-radius);background:var(--psi-skeleton-bg)}._skeleton_1yo7t_12[data-size="24"]{height:var(--psi-size-24)}._skeleton_1yo7t_12[data-size="32"]{height:var(--psi-size-32)}._skeleton_1yo7t_12[data-size="40"]{height:var(--psi-size-40)}._skeleton_1yo7t_12[data-size="48"]{height:var(--psi-size-48)}._line_1yo7t_28{display:block;padding-block:var(--psi-space-6);margin-block:var(--psi-space-4);border-radius:var(--psi-skeleton-radius);background:var(--psi-skeleton-bg)}._line_1yo7t_28:last-child:not(:first-child){width:60%}@media(prefers-reduced-motion:reduce){._skeleton_1yo7t_12{animation:none}}._tabs_1x9om_8{display:flex;flex-direction:column;gap:var(--psi-space-16)}._tabs_1x9om_8[data-orientation=vertical]{flex-direction:row;gap:var(--psi-space-24)}._list_1x9om_21{display:flex;flex-wrap:wrap;gap:var(--psi-space-4);border-bottom:1px solid var(--psi-tabs-list-border)}._tabs_1x9om_8[data-orientation=vertical] ._list_1x9om_21{flex-direction:column;flex-wrap:nowrap;border-bottom:none;border-inline-start:1px solid var(--psi-tabs-list-border)}._tab_1x9om_8{position:relative;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background:none;cursor:pointer;height:var(--psi-tabs-40-height);padding-inline:var(--psi-tabs-40-padding-x);font:var(--psi-text-14-20-medium);color:var(--psi-tabs-fg);transition:color var(--psi-duration-150) var(--psi-ease-standard)}._tab_1x9om_8:hover:not([aria-disabled=true]){background:var(--psi-tabs-bg-hover)}._tab_1x9om_8:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tabs-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._tab_1x9om_8[aria-disabled=true]{color:var(--psi-tabs-fg-disabled);cursor:default}._tab_1x9om_8[aria-selected=true]{color:var(--psi-tabs-fg-selected)}._tab_1x9om_8[aria-selected=true]:after{content:"";position:absolute;inset-inline:0;bottom:-1px;height:2px;background:var(--psi-tabs-indicator)}._tabs_1x9om_8[data-orientation=vertical] ._tab_1x9om_8{text-align:start}._tabs_1x9om_8[data-orientation=vertical] ._tab_1x9om_8[aria-selected=true]:after{inset-inline:auto;inset-block:0;inset-inline-start:-1px;width:2px;height:auto}._panel_1x9om_99{min-width:0}._panel_1x9om_99:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-tabs-focus-ring);outline-offset:var(--psi-focus-ring-offset)}
@@ -1,7 +1,7 @@
1
1
  <!-- Generated by emit-docs.ts — do not edit. -->
2
2
  # Announcement
3
3
 
4
- Text for a screen reader only, spoken through ToastRegion (D83). **It is not a live region.** It renders no `role` and no `aria-live`, and outside a ToastRegion it announces nothing — the region's two persistent wrappers are the only live regions, and an Announcement is content for one of them. Do not use it as a second announcer. Use it where an event must be spoken and there is nothing to show: a state change of the object on screen, or field errors the form already displays. `politeness` is not read here. ToastRegion reads it off the element to pick a wrapper, the same way it reads a Toast's. Controlled, like Toast: it holds no state and never removes itself. Remove it once it has been spoken. To announce the same text again, remove it and render it again with a new `key` — a live region speaks changes, and an unchanged node is not one. It takes no `className`: the one thing a class could do to it is make it visible, and then it is a Toast.
4
+ Text for a screen reader only, spoken through ToastRegion (D83). **It is not a live region.** It renders no `role` and no `aria-live`, and outside a ToastRegion it announces nothing — the region's two persistent wrappers are the only live regions, and an Announcement is content for one of them. Do not use it as a second announcer. Use it where an event must be spoken and there is nothing to show: a state change of the object on screen, or field errors the form already displays. `politeness` is not read here. ToastRegion reads it off the element to pick a wrapper, the same way it reads a Toast's. The usual way to render one is `useToast().announce(message)` (D91), which puts it in ToastProvider's region and gives it a lifetime: it leaves one second (the dwell) after it was added, and a later announcement does not remove it early — removing a node just after it was added can cut its speech, and the region's non-atomic wrappers (D90) speak each added node on its own. It never counts against the provider's toast `limit`. Rendered by hand, it is controlled, like Toast: it holds no state and never removes itself, so follow the same rule — remove it after a one-second dwell, not before. To announce the same text again, remove it and render it again with a new `key` — a live region speaks changes, and an unchanged node is not one. It takes no `className`: the one thing a class could do to it is make it visible, and then it is a Toast.
5
5
 
6
6
  ## Props
7
7
 
@@ -16,7 +16,7 @@ Text for a screen reader only, spoken through ToastRegion (D83). **It is not a l
16
16
  |---|---|
17
17
 
18
18
 
19
- Not a live region: it renders no role and no aria-live, and outside a ToastRegion it announces nothing. It is visually hidden text that ToastRegion places in its polite or assertive wrapper, by the politeness prop (default polite) — for an event that must be spoken and has nothing to show. Keep one ToastRegion as the application's only announcer and put every Announcement inside it; never use an Announcement as a second one. Controlled like Toast: it never removes itself, so remove it once it has been spoken. To announce the same text again, remove it and render it again with a new key — a live region speaks changes, and an unchanged node is not one. Not focusable, and it takes no space in the toast stack.
19
+ Not a live region: it renders no role and no aria-live, and outside a ToastRegion it announces nothing. It is visually hidden text that ToastRegion places in its polite or assertive wrapper, by the politeness prop (default polite) — for an event that must be spoken and has nothing to show. Keep one ToastRegion as the application's only announcer and put every Announcement inside it; never use an Announcement as a second one. Rendered by useToast().announce() (D91), it gets a lifetime: it leaves after a one-second dwell, a later announcement does not remove it early, and it never counts against the toast limit. Rendered by hand it is controlled like Toast and never removes itself — remove it after the same one-second dwell, not before. To announce the same text again, remove it and render it again with a new key — a live region speaks changes, and an unchanged node is not one. Not focusable, and it takes no space in the toast stack.
20
20
 
21
21
  ## Theming
22
22
 
@@ -33,5 +33,5 @@ This component has no `--psi-announcement-*` tokens — its styling binds scale
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
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
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
36
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
37
37
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
package/docs/AppShell.md CHANGED
@@ -42,5 +42,5 @@ Override `--psi-app-shell-*` custom properties at any scope.
42
42
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
43
43
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
44
44
  - 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.
45
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
45
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
46
46
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -27,5 +27,5 @@ This component has no `--psi-aspect-ratio-*` tokens — its styling binds scale
27
27
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
28
28
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
29
29
  - 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.
30
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
30
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
31
31
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
package/docs/Banner.md CHANGED
@@ -50,5 +50,5 @@ Override `--psi-banner-*` custom properties at any scope.
50
50
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
51
51
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
52
52
  - 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.
53
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
53
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
54
54
  - 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
@@ -51,5 +51,5 @@ Override `--psi-button-*` custom properties at any scope; interactive states der
51
51
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
52
52
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
53
53
  - 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.
54
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
54
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
55
55
  - 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
@@ -39,5 +39,5 @@ Override `--psi-card-*` custom properties at any scope.
39
39
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
40
40
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
41
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
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
42
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
43
43
  - 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
@@ -34,5 +34,5 @@ Override `--psi-checkbox-*` custom properties at any scope.
34
34
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
35
35
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
36
36
  - 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.
37
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
37
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
38
38
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -47,5 +47,5 @@ This component has no `--psi-copy-button-*` tokens — its styling binds scale t
47
47
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
48
48
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
49
49
  - 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.
50
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
50
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
51
51
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -41,5 +41,5 @@ This component has no `--psi-cursor-pagination-*` tokens — its styling binds s
41
41
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
42
42
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
43
43
  - 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.
44
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
44
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
45
45
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -27,5 +27,5 @@ This component has no `--psi-description-item-*` tokens — its styling binds sc
27
27
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
28
28
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
29
29
  - 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.
30
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
30
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
31
31
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -28,5 +28,5 @@ Override `--psi-description-list-*` custom properties at any scope.
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
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
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
31
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
32
32
  - 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 CHANGED
@@ -42,5 +42,5 @@ Override `--psi-dialog-*` custom properties at any scope.
42
42
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
43
43
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
44
44
  - 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.
45
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
45
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
46
46
  - 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- Generated by emit-docs.ts — do not edit. -->
2
2
  # Field
3
3
 
4
- Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live unless `announce={false}`). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49).
4
+ Labeled form-row wrapper: label above, control, one message line below — description normally, error when set (aria-live unless `announce={false}`). Auto-wires id/aria-describedby/aria-invalid into Input and Select (D49). Overriding `--psi-field-gap` or `--psi-field-label-height` on a narrower scope than the theme root, inside a `Toolbar align="start"` row, also needs `--psi-toolbar-action-offset` set on that same scope, or the row's button keeps the theme-root offset (D92).
5
5
 
6
6
  ## Props
7
7
 
@@ -42,5 +42,5 @@ Override `--psi-field-*` custom properties at any scope.
42
42
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
43
43
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
44
44
  - 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.
45
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
45
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
46
46
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -50,5 +50,5 @@ Override `--psi-button-*` custom properties at any scope; interactive states der
50
50
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
51
51
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
52
52
  - 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.
53
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
53
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
54
54
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -49,5 +49,5 @@ Override `--psi-inline-alert-*` custom properties at any scope.
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
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
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
52
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
53
53
  - 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
@@ -37,5 +37,5 @@ Override `--psi-input-*` custom properties at any scope; interactive states deri
37
37
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
38
38
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
39
39
  - 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.
40
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
40
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
41
41
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
package/docs/Menu.md CHANGED
@@ -43,5 +43,5 @@ Override `--psi-menu-*` custom properties at any scope; interactive states deriv
43
43
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
44
44
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
45
45
  - 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.
46
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
46
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
47
47
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
package/docs/MenuItem.md CHANGED
@@ -45,5 +45,5 @@ This component has no `--psi-menu-item-*` tokens — its styling binds scale tok
45
45
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
46
46
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
47
47
  - 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.
48
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
48
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
49
49
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
@@ -32,5 +32,5 @@ This component has no `--psi-menu-separator-*` tokens — its styling binds scal
32
32
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
33
33
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
34
34
  - 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.
35
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
35
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
36
36
  - 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
@@ -30,5 +30,5 @@ Override `--psi-navbar-*` custom properties at any scope; interactive states der
30
30
  - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
31
31
  - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
32
32
  - 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.
33
- - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="end" of Fields (D87).
33
+ - Field is for a control with a *visible* label. A toolbar filter control named by aria-label or placeholder takes neither a Field nor a hand-rolled label row — compare filter-toolbar (no labels) with table-pagination ("Rows per page" visible, so Field). Filters with visible labels submitted together by a Find button are filter-form: a Toolbar as="form" align="start" of Fields with one-line labels, where a field's error line is the Field's own and hangs below its control (D87, D92).
34
34
  - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.