@handamade/psi-react 0.23.0 → 0.25.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.
@@ -10,7 +10,7 @@
10
10
  "type": "ReactNode",
11
11
  "required": false,
12
12
  "default": null,
13
- "description": "Label content."
13
+ "description": "Label content. A direct icon child is sized by the button, half its\nheight (12/16/20/24), whatever the icon's own `size` (D97). A label in a\ndirect `<span>` is capped by `--psi-button-label-max-width` (default\n`none`) and ends in an ellipsis past it (D98)."
14
14
  },
15
15
  {
16
16
  "name": "variant",
@@ -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` 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.",
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. A child link you mark `aria-current=\"true\"` is the entry the current screen sits under (D96): medium weight and the current colour, with no surface and no bar. `NavItem` itself never sets `true`.",
1021
1021
  "slots": [],
1022
1022
  "props": [
1023
1023
  {
@@ -1225,7 +1225,8 @@
1225
1225
  "accepts": {
1226
1226
  "components": [
1227
1227
  "MenuItem",
1228
- "MenuSeparator"
1228
+ "MenuSeparator",
1229
+ "MenuText"
1229
1230
  ]
1230
1231
  },
1231
1232
  "cardinality": "1..*",
@@ -1268,12 +1269,19 @@
1268
1269
  "default": null,
1269
1270
  "description": "Accessible name for the menu when there is no visible label."
1270
1271
  },
1272
+ {
1273
+ "name": "aria-describedby",
1274
+ "type": "string",
1275
+ "required": false,
1276
+ "default": null,
1277
+ "description": "The id of a `MenuText` (or any element) that describes the menu (D99).\nUnset by default: a description may be spoken every time the menu opens."
1278
+ },
1271
1279
  {
1272
1280
  "name": "children",
1273
1281
  "type": "ReactNode",
1274
1282
  "required": true,
1275
1283
  "default": null,
1276
- "description": "MenuItem and MenuSeparator children."
1284
+ "description": "MenuItem, MenuSeparator and MenuText children."
1277
1285
  },
1278
1286
  {
1279
1287
  "name": "className",
@@ -1332,6 +1340,27 @@
1332
1340
  "slots": [],
1333
1341
  "props": []
1334
1342
  },
1343
+ {
1344
+ "name": "MenuText",
1345
+ "description": "A line of text in a Menu that is not an action (D99): a build identifier, a signed-in account. It sits inside the `role=\"menu\"` element with no role of its own, so it is in the accessibility tree as a child of the menu; it is never focused, and the arrows, Home, End and typeahead skip it, since Menu's keyboard moves only between `[data-psi-menu-item]` elements. It is never `aria-hidden`: it exists to be read. In a menu's focus mode a screen reader reaches it by browse mode or the VoiceOver cursor; to have it spoken on entering the menu, make it the menu's description.",
1346
+ "slots": [],
1347
+ "props": [
1348
+ {
1349
+ "name": "children",
1350
+ "type": "ReactNode",
1351
+ "required": true,
1352
+ "default": null,
1353
+ "description": "The line's text: information, not an action."
1354
+ },
1355
+ {
1356
+ "name": "id",
1357
+ "type": "string",
1358
+ "required": false,
1359
+ "default": null,
1360
+ "description": "Give it an id and pass the same id to Menu's `aria-describedby` to make\nthe line the menu's description (D99). Off by default."
1361
+ }
1362
+ ]
1363
+ },
1335
1364
  {
1336
1365
  "name": "Table",
1337
1366
  "description": "Data table on native table semantics. Holds no state: sorting, selection and pagination are the consumer's (D62, extending D50/D53).",
@@ -2031,7 +2060,7 @@
2031
2060
  "type": "ReactNode",
2032
2061
  "required": true,
2033
2062
  "default": null,
2034
- "description": "The message."
2063
+ "description": "The message: bare text, or one or more `<p>`. A direct `<p>` has no\nblock margin, and consecutive paragraphs are 8px apart (D95)."
2035
2064
  },
2036
2065
  {
2037
2066
  "name": "action",
@@ -2120,7 +2149,7 @@
2120
2149
  "type": "ReactNode",
2121
2150
  "required": true,
2122
2151
  "default": null,
2123
- "description": "The message."
2152
+ "description": "The message: bare text, or one or more `<p>`. A direct `<p>` has no\nblock margin, and consecutive paragraphs are 8px apart (D95)."
2124
2153
  },
2125
2154
  {
2126
2155
  "name": "action",
@@ -1,5 +1,66 @@
1
1
  {
2
2
  "patterns": [
3
+ {
4
+ "id": "account-menu",
5
+ "intent": "The signed-in user's menu: account actions, sign out, and a read-only line such as the build, which the keyboard skips",
6
+ "match": [
7
+ "account menu",
8
+ "user menu",
9
+ "profile menu",
10
+ "sign out",
11
+ "build number"
12
+ ],
13
+ "compose": {
14
+ "component": "Menu",
15
+ "props": {
16
+ "placement": "bottom-end",
17
+ "aria-label": "{content:menu-label}"
18
+ },
19
+ "slots": {
20
+ "trigger": [
21
+ {
22
+ "component": "Button",
23
+ "props": {
24
+ "variant": "ghost",
25
+ "size": 32
26
+ },
27
+ "content": "user-name"
28
+ }
29
+ ],
30
+ "body": [
31
+ {
32
+ "component": "MenuItem",
33
+ "content": "profile-label"
34
+ },
35
+ {
36
+ "component": "MenuSeparator"
37
+ },
38
+ {
39
+ "component": "MenuItem",
40
+ "content": "sign-out-label"
41
+ },
42
+ {
43
+ "component": "MenuSeparator"
44
+ },
45
+ {
46
+ "component": "MenuText",
47
+ "content": "build-line"
48
+ }
49
+ ]
50
+ }
51
+ },
52
+ "parameters": [],
53
+ "content": {
54
+ "menu-label": "Account",
55
+ "user-name": "[the signed-in user's display name — wrap it in a span and cap it with --psi-button-label-max-width]",
56
+ "profile-label": "Profile",
57
+ "sign-out-label": "Sign out",
58
+ "build-line": "[read-only information, such as the build identifier]"
59
+ },
60
+ "gaps": [],
61
+ "blocked": false,
62
+ "preset": "<Menu\n aria-label=\"Account\"\n placement=\"bottom-end\"\n trigger={<Button size={32} variant=\"ghost\">[the signed-in user's display name — wrap it in a span and cap it with --psi-button-label-max-width]</Button>}\n>\n <MenuItem>Profile</MenuItem>\n <MenuSeparator />\n <MenuItem>Sign out</MenuItem>\n <MenuSeparator />\n <MenuText>[read-only information, such as the build identifier]</MenuText>\n</Menu>\n"
63
+ },
3
64
  {
4
65
  "id": "action-feedback",
5
66
  "intent": "Transient confirmation after a completed action, with an optional undo affordance",
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- @layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._nav_166vs_6{display:flex;align-items:center;gap:var(--psi-space-4)}._ellipsis_166vs_12{padding-inline:var(--psi-space-4)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._nav_jbhk1_5{display:inline-flex;align-items:center;gap:var(--psi-space-8)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{@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}}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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
+ @layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._button_1rxq8_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_1rxq8_3:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-button-focus-ring);outline-offset:var(--psi-focus-ring-offset)}._button_1rxq8_3:disabled{opacity:.4;cursor:not-allowed}._button_1rxq8_3>span{max-inline-size:var(--psi-button-label-max-width);overflow:hidden;text-overflow:ellipsis;flex:none}._button_1rxq8_3._disabled_1rxq8_45{opacity:.4;cursor:not-allowed;pointer-events:none}._size24_1rxq8_70{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_1rxq8_70:has(>svg:first-child){padding-inline-start:var(--psi-button-24-padding-inline-icon)}._size24_1rxq8_70:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-24-padding-inline-icon)}._size24_1rxq8_70>svg{inline-size:var(--psi-button-24-icon-size);block-size:var(--psi-button-24-icon-size);flex:none}._size32_1rxq8_88{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_1rxq8_88:has(>svg:first-child){padding-inline-start:var(--psi-button-32-padding-inline-icon)}._size32_1rxq8_88:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-32-padding-inline-icon)}._size32_1rxq8_88>svg{inline-size:var(--psi-button-32-icon-size);block-size:var(--psi-button-32-icon-size);flex:none}._size40_1rxq8_106{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_1rxq8_106:has(>svg:first-child){padding-inline-start:var(--psi-button-40-padding-inline-icon)}._size40_1rxq8_106:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-40-padding-inline-icon)}._size40_1rxq8_106>svg{inline-size:var(--psi-button-40-icon-size);block-size:var(--psi-button-40-icon-size);flex:none}._size48_1rxq8_124{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_1rxq8_124:has(>svg:first-child){padding-inline-start:var(--psi-button-48-padding-inline-icon)}._size48_1rxq8_124:has(>svg:last-child:not(:first-child)){padding-inline-end:var(--psi-button-48-padding-inline-icon)}._size48_1rxq8_124>svg{inline-size:var(--psi-button-48-icon-size);block-size:var(--psi-button-48-icon-size);flex:none}._accent_1rxq8_145{background:var(--psi-button-accent-bg);color:var(--psi-button-accent-fg)}._accent_1rxq8_145:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-accent-bg-hover)}._accent_1rxq8_145:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-accent-bg-active)}._accentSubtle_1rxq8_157{background:var(--psi-button-accent-subtle-bg);color:var(--psi-button-accent-subtle-fg)}._accentSubtle_1rxq8_157:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-accent-subtle-bg-hover)}._accentSubtle_1rxq8_157:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-accent-subtle-bg-active)}._neutral_1rxq8_169{background:var(--psi-button-neutral-bg);color:var(--psi-button-neutral-fg)}._neutral_1rxq8_169:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-neutral-bg-hover)}._neutral_1rxq8_169:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-neutral-bg-active)}._neutralSubtle_1rxq8_181{background:var(--psi-button-neutral-subtle-bg);color:var(--psi-button-neutral-subtle-fg)}._neutralSubtle_1rxq8_181:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-neutral-subtle-bg-hover)}._neutralSubtle_1rxq8_181:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-neutral-subtle-bg-active)}._ghost_1rxq8_193{background:var(--psi-button-ghost-bg);color:var(--psi-button-ghost-fg)}._ghost_1rxq8_193:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-ghost-bg-hover)}._ghost_1rxq8_193:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-ghost-bg-active)}._danger_1rxq8_205{background:var(--psi-button-danger-bg);color:var(--psi-button-danger-fg)}._danger_1rxq8_205:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-danger-bg-hover)}._danger_1rxq8_205:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-danger-bg-active)}._dangerSubtle_1rxq8_217{background:var(--psi-button-danger-subtle-bg);color:var(--psi-button-danger-subtle-fg)}._dangerSubtle_1rxq8_217:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-danger-subtle-bg-hover)}._dangerSubtle_1rxq8_217:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-danger-subtle-bg-active)}._outline_1rxq8_229{background:var(--psi-button-outline-bg);color:var(--psi-button-outline-fg);border:1px solid var(--psi-button-outline-border)}._outline_1rxq8_229:hover:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-outline-bg-hover);color:var(--psi-button-outline-fg-hover);border-color:transparent}._outline_1rxq8_229:active:not(:disabled):not(._disabled_1rxq8_45){background:var(--psi-button-outline-bg-active)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._navTree_1ktoe_7{display:block}._list_1ktoe_11,._groupList_1ktoe_12{display:flex;flex-direction:column;gap:var(--psi-space-2);margin:0;padding:0;list-style:none}._item_1ktoe_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_1ktoe_23 a:hover{background:var(--psi-nav-tree-item-bg-hover)}._item_1ktoe_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_1ktoe_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_1ktoe_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)}._item_1ktoe_23 a[aria-current=true]{color:var(--psi-nav-tree-item-fg-current);font:var(--psi-text-14-20-medium)}._groupButton_1ktoe_79{-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_1ktoe_79:hover{background:var(--psi-nav-tree-item-bg-hover)}._groupButton_1ktoe_79:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-nav-tree-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._groupLabel_1ktoe_108{min-width:0}._chevron_1ktoe_112{flex:none;transition:transform var(--psi-duration-150) var(--psi-ease-standard)}._groupButton_1ktoe_79[aria-expanded=true] ._chevron_1ktoe_112{transform:rotate(180deg)}._groupList_1ktoe_12{padding-inline-start:var(--psi-space-12);margin-block-start:var(--psi-space-2)}._groupList_1ktoe_12[hidden]{display:none}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._frame_et4fc_1{overflow:hidden}._frame_et4fc_1>img,._frame_et4fc_1>video{width:100%;height:100%;object-fit:cover;display:block}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._trigger_pivae_4{display:inline-flex;width:fit-content}._menu_pivae_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_pivae_16:not([data-open]):not(:popover-open){display:none}._item_pivae_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_pivae_37:hover{background:var(--psi-menu-item-bg-hover)}._item_pivae_37:active{background:var(--psi-menu-item-bg-active)}._item_pivae_37:focus-visible{outline:var(--psi-focus-ring-width) solid var(--psi-menu-focus-ring);outline-offset:var(--psi-focus-ring-offset-inset)}._item_pivae_37[data-variant=danger]{color:var(--psi-menu-item-fg-danger)}._item_pivae_37[aria-disabled=true]{color:var(--psi-menu-item-fg-disabled);cursor:default}._item_pivae_37[aria-disabled=true]:hover{background:var(--psi-menu-item-bg)}._text_pivae_85{padding:var(--psi-space-8) var(--psi-space-12);color:var(--psi-menu-text-fg);cursor:default}._separator_pivae_93{height:0;margin:var(--psi-space-4) 0;border-top:1px solid var(--psi-menu-separator-border)}@supports (anchor-name: --x){._menu_pivae_16{position:fixed;margin:var(--psi-space-4);position-try-fallbacks:flip-block,flip-inline,flip-block flip-inline}._menu_pivae_16[data-placement=bottom-start]{position-area:block-end span-inline-end}._menu_pivae_16[data-placement=bottom-end]{position-area:block-end span-inline-start}._menu_pivae_16[data-placement=top-start]{position-area:block-start span-inline-end}._menu_pivae_16[data-placement=top-end]{position-area:block-start span-inline-start}}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._nav_166vs_6{display:flex;align-items:center;gap:var(--psi-space-4)}._ellipsis_166vs_12{padding-inline:var(--psi-space-4)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._nav_jbhk1_5{display:inline-flex;align-items:center;gap:var(--psi-space-8)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._banner_15y1f_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_15y1f_7[data-variant=neutral]{background:var(--psi-banner-bg-neutral)}._banner_15y1f_7[data-variant=success]{background:var(--psi-banner-bg-success)}._banner_15y1f_7[data-variant=warning]{background:var(--psi-banner-bg-warning)}._banner_15y1f_7[data-variant=danger]{background:var(--psi-banner-bg-danger)}._icon_15y1f_26{display:inline-flex;align-items:center}._iconNeutral_15y1f_31{color:var(--psi-banner-icon-fg-neutral)}._iconSuccess_15y1f_32{color:var(--psi-banner-icon-fg-success)}._iconWarning_15y1f_33{color:var(--psi-banner-icon-fg-warning)}._iconDanger_15y1f_34{color:var(--psi-banner-icon-fg-danger)}._body_15y1f_36{min-width:0}._body_15y1f_36>p{margin-block:0}._body_15y1f_36>p+p{margin-block-start:var(--psi-space-8)}._title_15y1f_50{display:block;font:var(--psi-text-14-20-medium)}._action_15y1f_55{display:inline-flex}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._inlineAlert_16390_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_16390_7[data-variant=neutral]{background:var(--psi-inline-alert-bg-neutral);border:1px solid var(--psi-inline-alert-border-neutral)}._inlineAlert_16390_7[data-variant=success]{background:var(--psi-inline-alert-bg-success);border:1px solid var(--psi-inline-alert-border-success)}._inlineAlert_16390_7[data-variant=warning]{background:var(--psi-inline-alert-bg-warning);border:1px solid var(--psi-inline-alert-border-warning)}._inlineAlert_16390_7[data-variant=danger]{background:var(--psi-inline-alert-bg-danger);border:1px solid var(--psi-inline-alert-border-danger)}._icon_16390_38{display:inline-flex;align-items:center}._iconNeutral_16390_43{color:var(--psi-inline-alert-icon-fg-neutral)}._iconSuccess_16390_44{color:var(--psi-inline-alert-icon-fg-success)}._iconWarning_16390_45{color:var(--psi-inline-alert-icon-fg-warning)}._iconDanger_16390_46{color:var(--psi-inline-alert-icon-fg-danger)}._body_16390_48{min-width:0}._body_16390_48>p{margin-block:0}._body_16390_48>p+p{margin-block-start:var(--psi-space-8)}._title_16390_62{display:block;font:var(--psi-text-14-20-medium)}._action_16390_67{display:inline-flex}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{@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}}}@layer psi.base,psi.theme,psi.components,psi.utilities;@layer psi.components{._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)}}
package/docs/Banner.md CHANGED
@@ -9,7 +9,7 @@ A full-width, page-level status message (D86). It is not a live region: it rende
9
9
  |---|---|---|---|---|
10
10
  | `variant` | `"neutral" \| "success" \| "warning" \| "danger"` | neutral | no | Status variant. |
11
11
  | `title` | `ReactNode` | — | no | A short heading, rendered before the body in the medium weight. |
12
- | `children` | `ReactNode` | — | yes | The message. |
12
+ | `children` | `ReactNode` | — | yes | The message: bare text, or one or more `<p>`. A direct `<p>` has no block margin, and consecutive paragraphs are 8px apart (D95). |
13
13
  | `action` | `ReactNode` | — | no | Trailing affordance — a ghost Button (Review, Retry, Learn more). |
14
14
  | `onDismiss` | `(() => void)` | — | no | When provided, renders the dismiss button and calls this. Banner does not remove itself; the owner disposes. |
15
15
  | `statusLabel` | `string \| null` | — | no | The visually hidden status word (D83). A string replaces the default ("Success:", "Warning:", "Error:") — pass the translated word; `null` drops it. Unset keeps the default, and `neutral` has none. |
package/docs/Button.md CHANGED
@@ -7,7 +7,7 @@ Action trigger. With `href` renders an anchor with identical styling (D33); `dis
7
7
 
8
8
  | Prop | Type | Default | Required | Description |
9
9
  |---|---|---|---|---|
10
- | `children` | `ReactNode` | — | no | Label content. |
10
+ | `children` | `ReactNode` | — | no | Label content. A direct icon child is sized by the button, half its height (12/16/20/24), whatever the icon's own `size` (D97). A label in a direct `<span>` is capped by `--psi-button-label-max-width` (default `none`) and ends in an ellipsis past it (D98). |
11
11
  | `variant` | `"accent" \| "accent-subtle" \| "neutral" \| "neutral-subtle" \| "ghost" \| "danger" \| "danger-subtle" \| "outline"` | neutral | no | Visual variant. |
12
12
  | `size` | `24 \| 32 \| 40 \| 48` | 32 | no | Height in px (24 \| 32 \| 40 \| 48). |
13
13
  | `type` | `"button" \| "submit" \| "reset"` | — | no | Button type. Declared so the manifest lists it and a pattern can say `submit` (D87). No default is set: the platform's applies — `submit` inside a form, a plain button elsewhere. |
@@ -9,7 +9,7 @@ Not `role="alert"`, despite its name. It is not a live region: it renders no `ro
9
9
  |---|---|---|---|---|
10
10
  | `variant` | `"neutral" \| "success" \| "warning" \| "danger"` | neutral | no | Status variant. |
11
11
  | `title` | `ReactNode` | — | no | A short heading, rendered before the body in the medium weight. |
12
- | `children` | `ReactNode` | — | yes | The message. |
12
+ | `children` | `ReactNode` | — | yes | The message: bare text, or one or more `<p>`. A direct `<p>` has no block margin, and consecutive paragraphs are 8px apart (D95). |
13
13
  | `action` | `ReactNode` | — | no | Trailing affordance — a ghost Button (Review, Retry, Learn more). |
14
14
  | `statusLabel` | `string \| null` | — | no | The visually hidden status word (D83). A string replaces the default ("Success:", "Warning:", "Error:") — pass the translated word; `null` drops it. Unset keeps the default, and `neutral` has none. |
15
15
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
package/docs/Menu.md CHANGED
@@ -12,7 +12,8 @@ Action menu on the native Popover API top layer: the top layer and light dismiss
12
12
  | `trigger` | `ReactElement<Record<string, unknown>, string \| JSXElementConstructor<any>>` | — | yes | The trigger element. Must be a single React element that spreads unknown props onto a focusable node (a Psi `Button`, say): Menu clones it to add `aria-haspopup="menu"` and `aria-expanded`, so assistive tech associates the menu with the control users actually focus. |
13
13
  | `placement` | `"bottom-start" \| "bottom-end" \| "top-start" \| "top-end"` | bottom-start | no | Placement relative to the trigger. |
14
14
  | `aria-label` | `string` | — | no | Accessible name for the menu when there is no visible label. |
15
- | `children` | `ReactNode` | — | yes | MenuItem and MenuSeparator children. |
15
+ | `aria-describedby` | `string` | — | no | The id of a `MenuText` (or any element) that describes the menu (D99). Unset by default: a description may be spoken every time the menu opens. |
16
+ | `children` | `ReactNode` | — | yes | MenuItem, MenuSeparator and MenuText children. |
16
17
  | `className` | `string` | — | no | Additional CSS class name(s) merged onto the component's root element. |
17
18
  | `ref` | `Ref<HTMLDivElement>` | — | no | Forwarded ref to the popover element. |
18
19
 
@@ -0,0 +1,37 @@
1
+ <!-- Generated by emit-docs.ts — do not edit. -->
2
+ # MenuText
3
+
4
+ A line of text in a Menu that is not an action (D99): a build identifier, a signed-in account. It sits inside the `role="menu"` element with no role of its own, so it is in the accessibility tree as a child of the menu; it is never focused, and the arrows, Home, End and typeahead skip it, since Menu's keyboard moves only between `[data-psi-menu-item]` elements. It is never `aria-hidden`: it exists to be read. In a menu's focus mode a screen reader reaches it by browse mode or the VoiceOver cursor; to have it spoken on entering the menu, make it the menu's description.
5
+
6
+ ## Props
7
+
8
+ | Prop | Type | Default | Required | Description |
9
+ |---|---|---|---|---|
10
+ | `children` | `ReactNode` | — | yes | The line's text: information, not an action. |
11
+ | `id` | `string` | — | no | Give it an id and pass the same id to Menu's `aria-describedby` to make the line the menu's description (D99). Off by default. |
12
+
13
+ ## Keyboard & assistive tech
14
+
15
+ | Keys | Behavior |
16
+ |---|---|
17
+
18
+
19
+ A line of text that is not an action (D99): inside the role="menu" element with no role of its own, never focused, skipped by the arrows, Home, End and typeahead, and never aria-hidden. In a menu's focus mode a screen reader reaches it by browse mode or the VoiceOver cursor. To have it spoken on entering the menu, give it an id and pass that id to Menu's aria-describedby; that is off by default, because a description may be spoken on every open.
20
+
21
+ ## Theming
22
+
23
+ This component has no `--psi-menu-text-*` tokens — its styling binds scale tokens only, so there is nothing component-scoped to override. Theme changes reach it through the semantic tokens of its children and surroundings.
24
+
25
+
26
+
27
+ ## Rules
28
+
29
+ - One accent per visual group; everything else neutral or ghost.
30
+ - danger only for actions with real consequences.
31
+ - Sizes are px numbers (24|32|40|48), never S/M/L.
32
+ - Typography tokens are --psi-text-{size}-{lineHeight}-{weight}.
33
+ - Override component tokens (--psi-{component}-*), not semantic tokens, for one-off theming.
34
+ - --psi-button-font overrides button typography across all sizes (documented D34 override; ember → mono).
35
+ - Wrap labeled form controls in Field — label association, description/error line, aria-describedby and aria-invalid come wired; don't hand-roll label+message rows.
36
+ - 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
+ - Use Dialog for blocking modal flows — title/footer slots, dismissible gate; danger stays on the footer Buttons, one accent per group.
package/docs/NavItem.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- Generated by emit-docs.ts — do not edit. -->
2
2
  # NavItem
3
3
 
4
- 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.
4
+ 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. A child link you mark `aria-current="true"` is the entry the current screen sits under (D96): medium weight and the current colour, with no surface and no bar. `NavItem` itself never sets `true`.
5
5
 
6
6
  ## Props
7
7
 
package/llms.txt CHANGED
@@ -1,10 +1,10 @@
1
1
  # @handamade/psi-react
2
2
 
3
- 46 React 19 components consuming @handamade/psi-tokens. Zero runtime deps, CSS Modules, ref-as-prop.
3
+ 47 React 19 components consuming @handamade/psi-tokens. Zero runtime deps, CSS Modules, ref-as-prop.
4
4
 
5
5
  ## Machine-readable artifacts
6
6
  - dist/manifest.json: full component/prop inventory with types and defaults
7
- - dist/patterns.json: 22 composition patterns (D47) — gap-annotated recipes with clarifying parameters; presets are generated JSX, never hand-written
7
+ - dist/patterns.json: 23 composition patterns (D47) — gap-annotated recipes with clarifying parameters; presets are generated JSX, never hand-written
8
8
  - docs/{Component}.md: per-component docs (props, theming, variant guidance)
9
9
 
10
10
  ## Rules for generated code
@@ -21,6 +21,8 @@
21
21
  - Button renders as an <a> when given `href` (plus optional `target`/`rel`); disabled anchors get aria-disabled, no href attribute, and pointer-events: none instead of the disabled attribute.
22
22
  - `outline` is a bordered-ghost variant: visible structure, no fill until hover — good for marketing CTAs and download buttons.
23
23
  - --psi-button-font overrides button typography across all sizes in one declaration; brands can set it via componentOverrides (ember → mono).
24
+ - An icon passed straight into a Button is sized by the button (D97): `--psi-button-{24,32,40,48}-icon-size` = half the height, 12/16/20/24, whatever the icon's `size` prop. Write `<Button size={32}><IconPlus aria-hidden="true" />Add</Button>` with no icon size. A wrapped icon is not sized. IconButton keeps its icon's own size.
25
+ - A label wrapped in a direct `<span>` can be capped (D98): set `--psi-button-label-max-width` on your own class (default `none`) and the label ends in an ellipsis past it: `<Button className="account"><IconUser aria-hidden="true" /><span>{name}</span></Button>` with `.account { --psi-button-label-max-width: 12rem; }`. A bare text label is not capped. The full text stays the accessible name; Psi adds no `title`.
24
26
 
25
27
  ## Card
26
28
  - <Card variant="stacked" | "featured" media={...} hoverLift>: stacked places media above the body, featured places media beside it (~1.6fr/1fr, stacks under the md breakpoint). hoverLift lifts the card translateY(-6px) over --psi-duration-350. Border uses --psi-border-faint.
@@ -69,8 +71,8 @@
69
71
  - Placement changes position and nothing else: modality, the focus trap, `aria-modal`, focus restore and the dismissal reasons are identical. Logical (`inline-*`, not left/right), so RTL flips for free. Consult dist/patterns.json for the `detail-drawer` pattern.
70
72
 
71
73
  ## Feedback (4)
72
- - `<Banner variant="neutral|success|warning|danger" title action onDismiss statusLabel>message</Banner>` is **not a live region** (D86): a page-level message, full width, above the content. It shows the message and announces nothing; speak the same event through the announcer. Same status vocabulary as Toast; `action` takes a ghost Button, `onDismiss` renders a labelled Dismiss button, `statusLabel` replaces or drops the hidden status word. Consult dist/patterns.json for `page-banner`.
73
- - `<InlineAlert variant title>message</InlineAlert>` is **not a live region** (D86), and despite its name it is **not `role="alert"`**: a message inside content, bordered in the variant's foreground colour. Put it above a form after a rejected submission and speak the result separately. Consult dist/patterns.json for `form-feedback`.
74
+ - `<Banner variant="neutral|success|warning|danger" title action onDismiss statusLabel>message</Banner>` is **not a live region** (D86): a page-level message, full width, above the content. It shows the message and announces nothing; speak the same event through the announcer. Same status vocabulary as Toast; `action` takes a ghost Button, `onDismiss` renders a labelled Dismiss button, `statusLabel` replaces or drops the hidden status word. The message may be paragraphs: a direct `<p>` has no block margin and consecutive ones are 8px apart (D95), so do not add `psi-m-0`. Consult dist/patterns.json for `page-banner`.
75
+ - `<InlineAlert variant title>message</InlineAlert>` is **not a live region** (D86), and despite its name it is **not `role="alert"`**: a message inside content, bordered in the variant's foreground colour. Put it above a form after a rejected submission and speak the result separately. Paragraph children behave as in Banner (D95). Consult dist/patterns.json for `form-feedback`.
74
76
  - `<Skeleton>` is **not a live region** (D86): a loading placeholder that is always `aria-hidden`, so it says nothing. Put `aria-busy` on the region it stands in for (a `TableBody`, a list) — that is what assistive tech reads. The shimmer stops under `prefers-reduced-motion`. Consult dist/patterns.json for `loading-table`.
75
77
  - `<CopyButton value label size onCopy>` is **not a live region** (D86): a Button with a visible label that copies `value` to the clipboard and reports `"copied" | "failed"` through `onCopy`. It never changes its label or icon and announces nothing; speak the result through the announcer or a Toast. Consult dist/patterns.json for `copyable-id`.
76
78
 
@@ -83,7 +85,7 @@
83
85
 
84
86
  ## NavTree family (3)
85
87
  - `<NavTree aria-label="Main">` is a `<nav>` around a `<ul>` of `<NavItem>` and `<NavGroup>` (D88). `aria-label` is **required**: an app has more than one navigation landmark. It is native and router-agnostic — **Tab** moves through group buttons and the links of open groups; there is no roving tabindex, no arrow keys and no `role="menu"` or `role="tree"`.
86
- - `<NavItem>` is an `<li>` that styles the one anchor inside it: pass your router's link. `current` clones that single child with `aria-current="page"` (D93); without `current` the child's own `aria-current` is left alone, so a router that marks its active link keeps working. The current page shows by weight, a raised surface and an inline-start bar, never by colour alone. `<NavItem href="#x" current>Text</NavItem>` renders the anchor itself (`aria-current="page"` when `current`): for plain links and presets, where a compose tree can hold only manifest components; router apps keep passing their own link as the child.
88
+ - `<NavItem>` is an `<li>` that styles the one anchor inside it: pass your router's link. `current` clones that single child with `aria-current="page"` (D93); without `current` the child's own `aria-current` is left alone, so a router that marks its active link keeps working. The current page shows by weight, a raised surface and an inline-start bar, never by colour alone. A link you mark `aria-current="true"` is the entry the current screen sits under (D96), for a screen that is not in the tree: it shows by weight and colour, with no surface and no bar, so it stays distinct from the page itself. `NavItem` never sets `true`; set it on your router's link. `<NavItem href="#x" current>Text</NavItem>` renders the anchor itself (`aria-current="page"` when `current`): for plain links and presets, where a compose tree can hold only manifest components; router apps keep passing their own link as the child.
87
89
  - `<NavGroup label open onOpenChange>` is **controlled-only**, like Tabs: `open` and `onOpenChange` are required and it never opens itself. It renders a `<button aria-expanded aria-controls>` over a `<ul>` that is `hidden` when closed, so `aria-controls` always resolves. The chevron is `aria-hidden` and turns on a duration token.
88
90
  - Tokens `--psi-nav-tree-*` alias the semantic layer, so under a `data-psi-theme="dark"` sidebar in a light page they resolve dark. The theme paints no background: the sidebar paints `--psi-bg-primary` itself.
89
91
 
@@ -103,8 +105,9 @@
103
105
  - **A `value` that matches no tab** (an address naming a tab the user may not see) still leaves the list one tab stop: the first enabled tab takes it, or the first tab when all are disabled (D93). Nothing is selected, and development builds warn with the value. The selection stays yours; `Tabs` never picks one. A selected tab that is disabled keeps the stop, as before.
104
106
  - `TabList` requires `aria-label`. The active panel is itself a tab stop, so a panel with no focusable content is still reachable.
105
107
 
106
- ## Menu family (3)
108
+ ## Menu family (4)
107
109
  - `<Menu open onClose={(reason) => …} trigger={<IconButton …/>} placement="bottom-start|bottom-end|top-start|top-end" aria-label="…">`: action menu on the native Popover API — top layer and light dismiss come from the platform, roving keyboard and dismissal reasons from Psi (D53). **Controlled-only** like Dialog: `onClose(reason)` reports `"esc" | "outside" | "item-select"` and the consumer flips `open`. Compose `<MenuItem onSelect>` and `<MenuSeparator>`; the trigger needs an accessible name, so an icon-only trigger is `<IconButton aria-label>`.
110
+ - `<MenuText>` is a line of text that is not an action (D99), such as a build identifier: inside the menu with no role, in the secondary foreground, never focused, and skipped by the arrows, Home, End and typeahead. It is never `aria-hidden`. To have it spoken when the menu opens, give it an `id` and pass that id as Menu's `aria-describedby` (off by default). Consult dist/patterns.json for `account-menu`.
108
111
  - Many menus, one state: for a row-actions column, hold a single `openMenuId` and render each row's Menu with `open={openMenuId === row.id}`, closing with `onClose={() => setOpenMenuId(null)}`. Do not give each row its own boolean. This is the shape D58 fixed a real dismissal bug in — switching directly between two menus left both closed, because the platform light-dismisses the first before the consumer's click handler runs.
109
112
 
110
113
  ## Compositions (recipes for what has no component yet)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@handamade/psi-react",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -47,7 +47,7 @@
47
47
  "tsx": "^4.22.4",
48
48
  "vite": "^6.0.0",
49
49
  "vitest": "^3.2.6",
50
- "@handamade/psi-tokens": "0.23.0"
50
+ "@handamade/psi-tokens": "0.25.0"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "vite build && tsc -p tsconfig.build.json && tsx scripts/emit-styles-dts.ts && tsx scripts/emit-manifest.ts && tsx scripts/emit-patterns.ts && tsx scripts/emit-docs.ts",