@persona/design-system 0.10.2 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{Breadcrumb-BDbY1Ffu.d.mts → Breadcrumb-CA0vAzUN.d.mts} +7 -2
  3. package/dist/Breadcrumb.d.mts +2 -2
  4. package/dist/{Breadcrumbs-C2ThOYJ-.d.mts → Breadcrumbs-47jYLqNP.d.mts} +2 -2
  5. package/dist/{Breadcrumbs-CQUe9VTM.mjs → Breadcrumbs-gRAsKF4R.mjs} +50 -10
  6. package/dist/Breadcrumbs-gRAsKF4R.mjs.map +1 -0
  7. package/dist/Breadcrumbs.d.mts +1 -1
  8. package/dist/{Combobox-BXHCfVpE.mjs → Combobox-CBM-oY-e.mjs} +6 -4
  9. package/dist/{Combobox-BXHCfVpE.mjs.map → Combobox-CBM-oY-e.mjs.map} +1 -1
  10. package/dist/{CompactBar-CfrrZ69k.d.mts → CompactBar-D9egXqY_.d.mts} +2 -2
  11. package/dist/CompactBar.d.mts +1 -1
  12. package/dist/{ConfigFormGroup-BE3yR_VU.mjs → ConfigFormGroup-CidT_cE9.mjs} +1 -1
  13. package/dist/{ConfigFormGroup-BE3yR_VU.mjs.map → ConfigFormGroup-CidT_cE9.mjs.map} +1 -1
  14. package/dist/{ControlBar-D9KflqmH.d.mts → ControlBar-RIz-xjxs.d.mts} +18 -1
  15. package/dist/ControlBar.d.mts +1 -1
  16. package/dist/{DataTable-BdKUCgcZ.d.mts → DataTable-D15C5lfd.d.mts} +3 -2
  17. package/dist/{DataTable-F9R-aQCg.mjs → DataTable-DQ8axNfo.mjs} +7 -7
  18. package/dist/{DataTable-F9R-aQCg.mjs.map → DataTable-DQ8axNfo.mjs.map} +1 -1
  19. package/dist/DataTable.d.mts +1 -1
  20. package/dist/{DatePicker-CkNQjfCN.mjs → DatePicker-D0cvVbzq.mjs} +2 -2
  21. package/dist/{DatePicker-CkNQjfCN.mjs.map → DatePicker-D0cvVbzq.mjs.map} +1 -1
  22. package/dist/{FormField-D0y1uRV5.mjs → FormField-C0cd1zVd.mjs} +5 -5
  23. package/dist/{FormField-D0y1uRV5.mjs.map → FormField-C0cd1zVd.mjs.map} +1 -1
  24. package/dist/{HoverCopyableField-DkOosH8z.mjs → HoverCopyableField-D-BubaRd.mjs} +2 -2
  25. package/dist/{HoverCopyableField-DkOosH8z.mjs.map → HoverCopyableField-D-BubaRd.mjs.map} +1 -1
  26. package/dist/IndexTableLayout.d.mts +4 -4
  27. package/dist/{Link-BSuXrvTu.mjs → Link-Cf__H8gD.mjs} +1 -1
  28. package/dist/{Link-BSuXrvTu.mjs.map → Link-Cf__H8gD.mjs.map} +1 -1
  29. package/dist/{ListBox-BLoJVezh.mjs → ListBox-eoyBHtnJ.mjs} +2 -2
  30. package/dist/{ListBox-BLoJVezh.mjs.map → ListBox-eoyBHtnJ.mjs.map} +1 -1
  31. package/dist/{Modal-IJdbLORi.mjs → Modal-kjUptzg1.mjs} +1 -1
  32. package/dist/{Modal-IJdbLORi.mjs.map → Modal-kjUptzg1.mjs.map} +1 -1
  33. package/dist/{PageHeader-Czj42pyK.d.mts → PageHeader-CnpDVOck.d.mts} +2 -2
  34. package/dist/{PageHeader-DJF7nxgN.mjs → PageHeader-D2j2XHD9.mjs} +6 -2
  35. package/dist/PageHeader-D2j2XHD9.mjs.map +1 -0
  36. package/dist/PageHeader.d.mts +1 -1
  37. package/dist/{Pagination-C5ANr9M0.mjs → Pagination-DtK-jbEY.mjs} +2 -2
  38. package/dist/{Pagination-C5ANr9M0.mjs.map → Pagination-DtK-jbEY.mjs.map} +1 -1
  39. package/dist/{Pii-G16_b7Yk.mjs → Pii-DueIK287.mjs} +1 -1
  40. package/dist/{Pii-G16_b7Yk.mjs.map → Pii-DueIK287.mjs.map} +1 -1
  41. package/dist/{Popover-532iYFek.mjs → Popover-BcII7usF.mjs} +1 -1
  42. package/dist/{Popover-532iYFek.mjs.map → Popover-BcII7usF.mjs.map} +1 -1
  43. package/dist/{Select-hnXfPywt.mjs → Select-BJ9ACmRD.mjs} +1 -1
  44. package/dist/{Select-hnXfPywt.mjs.map → Select-BJ9ACmRD.mjs.map} +1 -1
  45. package/dist/SelectionCard.d.mts +0 -5
  46. package/dist/{Spinner-AnIk8d9M.mjs → Spinner-7Camx1vs.mjs} +4 -3
  47. package/dist/{Spinner-AnIk8d9M.mjs.map → Spinner-7Camx1vs.mjs.map} +1 -1
  48. package/dist/{Table-CmuWqmVN.mjs → Table-BIDaC0uS.mjs} +2 -2
  49. package/dist/{Table-CmuWqmVN.mjs.map → Table-BIDaC0uS.mjs.map} +1 -1
  50. package/dist/{TableBox-BRJunn09.mjs → TableBox-Bn_XZEYd.mjs} +4 -4
  51. package/dist/{TableBox-BRJunn09.mjs.map → TableBox-Bn_XZEYd.mjs.map} +1 -1
  52. package/dist/{TableControls-DCtTiWk6.d.mts → TableControls-ETB0Xk5X.d.mts} +3 -2
  53. package/dist/{TableControls-C5fNNdmT.mjs → TableControls-qxoq5abn.mjs} +102 -60
  54. package/dist/TableControls-qxoq5abn.mjs.map +1 -0
  55. package/dist/TableControls.d.mts +1 -1
  56. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  57. package/dist/components/Breadcrumbs/index.mjs +1 -1
  58. package/dist/components/Combobox/index.mjs +1 -1
  59. package/dist/components/ConfigFormGroup/index.mjs +1 -1
  60. package/dist/components/DataTable/TableControls/index.d.mts +3 -3
  61. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  62. package/dist/components/DataTable/index.d.mts +1 -1
  63. package/dist/components/DataTable/index.mjs +1 -1
  64. package/dist/components/DatePicker/index.mjs +1 -1
  65. package/dist/components/FormField/index.mjs +1 -1
  66. package/dist/components/HoverCopyableField/index.mjs +1 -1
  67. package/dist/components/Link/index.mjs +1 -1
  68. package/dist/components/ListBox/index.mjs +1 -1
  69. package/dist/components/Modal/index.mjs +1 -1
  70. package/dist/components/PageHeader/index.d.mts +1 -1
  71. package/dist/components/PageHeader/index.mjs +1 -1
  72. package/dist/components/Pagination/index.mjs +1 -1
  73. package/dist/components/Pii/index.mjs +1 -1
  74. package/dist/components/Popover/index.mjs +1 -1
  75. package/dist/components/Select/index.mjs +1 -1
  76. package/dist/components/SelectionCard/index.mjs +32 -24
  77. package/dist/components/SelectionCard/index.mjs.map +1 -1
  78. package/dist/components/SmartTextInput/index.mjs +1 -1
  79. package/dist/components/Spinner/index.mjs +1 -1
  80. package/dist/components/Table/index.mjs +1 -1
  81. package/dist/components/TableBox/index.mjs +1 -1
  82. package/dist/components/VersionHistory/index.mjs +2 -2
  83. package/dist/patterns/IndexTableLayout/index.mjs +2 -2
  84. package/dist/patterns/LayoutLoadingShimmer/index.mjs +2 -2
  85. package/dist/patterns/WizardModal/index.mjs +1 -1
  86. package/llms.txt +2 -1
  87. package/package.json +2 -2
  88. package/skills/ui-authoring/SKILL.md +8 -0
  89. package/skills/ui-authoring/STANDARD.md +137 -0
  90. package/skills/ui-authoring/TOKENS.md +3 -1
  91. package/skills/ui-authoring/lanes.json +22 -0
  92. package/dist/Breadcrumbs-CQUe9VTM.mjs.map +0 -1
  93. package/dist/PageHeader-DJF7nxgN.mjs.map +0 -1
  94. package/dist/TableControls-C5fNNdmT.mjs.map +0 -1
@@ -0,0 +1,137 @@
1
+ # Product UI standard
2
+
3
+ The rules every screen built on PDS meets, above the shared accessibility floor. This is the product
4
+ UI area standard of the Persona design harness. It cites `persona-id/design-harness` at
5
+ **`core-v0.3`**, where the product UI area's entry is `areas/product-ui.md`.
6
+
7
+ - **Owner:** Michael Hu.
8
+ - **Covers:** screens in Persona apps built on `@persona/design-system` (the dashboard, internal
9
+ apps, App Builder).
10
+ - **Pinned by the app's PDS version.** The installed package is the live source and beats any
11
+ description of it, this file included (PDH-S1).
12
+
13
+ ## Ranks
14
+
15
+ PDH-P1 (honesty) and PDH-P2 (brand) rank first and second. Then:
16
+
17
+ 3. **Component-first.** A PDS pattern or component over custom code. Tokens only style what no
18
+ component covers. The failure this guards against is one-off UI that drifts from every other
19
+ screen.
20
+ 4. **Craft.** Hierarchy, spacing, copy and every state (loading, empty, error, disabled) finished,
21
+ not just working.
22
+
23
+ ## Parameters
24
+
25
+ | Rule | Product UI value |
26
+ | ---- | ---------------- |
27
+ | PDH-F1 contrast | The core value, WCAG 2.2 AA, in every colour mode the screen ships (light and dark) |
28
+ | PDH-F2 copy | **11 CSS px** for text the user reads, the core web-copy value. 10 px styles are below it (see Checks); use `TextSmall` or `TextSmallMono` (12 px) |
29
+ | PDH-F2 label inside a graphic | **8 CSS px** for a label inside a chart, a diagram or rebuilt product UI, the core value |
30
+ | PDH-F3 reduced motion | Every animation and transition honours `prefers-reduced-motion`; flashing follows PDH-F3 |
31
+ | PDH-F4 status | An icon or label as well as colour. `StatusIndicator` and `Sticker` already do this |
32
+
33
+ Product UI shown in a fixed frame (a slide, a video) takes the core's fixed-frame value instead.
34
+
35
+ ## Types
36
+
37
+ | Type | What | Governed by |
38
+ | ---- | ---- | ----------- |
39
+ | `screen` | A route, page, panel or modal flow in app code | This file. It bends nothing here without a departure row |
40
+ | `component` | A component or pattern in PDS itself | `REVIEW.md` and the `design-system-component-authoring` skill, plus this file's parameters |
41
+
42
+ No type bends the floor or PDH-P1.
43
+
44
+ ## What `persona` means here
45
+
46
+ Product UI is always `persona` (PDH-M4): PDS as shipped, in the app's theme. Briefs and receipts
47
+ record `brand: persona` without asking. Work that needs to be `unbranded` isn't covered by this
48
+ standard.
49
+
50
+ ## Screen brief
51
+
52
+ Record these in the PR body before building, so the source is consulted at intake (PDH-S2):
53
+
54
+ - **Intent:** who uses the screen, to do what, in one line.
55
+ - **Source:** the live product, a Figma link, or none. Say so if a source couldn't be reached.
56
+ - **PDS version:** from the app's lockfile.
57
+ - **Brand:** `persona`.
58
+ - **Lane:** `new-screen`, or none.
59
+
60
+ ## Lanes
61
+
62
+ A lane is a strict path for one common task. A PR opts in with a commit trailer, and the diff is then
63
+ held to the lane's allow-list. Work that fits no lane goes without a trailer, through normal review;
64
+ don't stretch a lane to fit it.
65
+
66
+ Lanes are data, in [lanes.json](lanes.json). They name roles, not paths. Each app's harness config
67
+ maps roles to its own paths, so one lane works in any app.
68
+
69
+ ### `new-screen`
70
+
71
+ One new screen built from PDS, with no designer (App Builder, internal apps).
72
+
73
+ - **Opt in:** a `Harness-Task: new-screen` trailer on any commit in the PR.
74
+ - **Allowed:** one new screen directory (`screen`), its tests and stories (`screen-tests`), and
75
+ locale files (`locale`).
76
+ - **Reported, not failed:** edits to the route table (`route-table`), so the screen can be reached.
77
+ - **Forbidden:** shared components (`shared`), theme (`theme`), and code mirrored from PDS
78
+ (`pds-mirror`). A change there is its own PR, or a PDS change.
79
+ - A file that matches no allowed or reported role fails. A file that matches a forbidden role is
80
+ forbidden, even if it also matches another role.
81
+ - Build only from PDS patterns, components and tokens, per [SKILL.md](SKILL.md), and finish with the
82
+ "Before you hand it over" list in [TOKENS.md](TOKENS.md).
83
+
84
+ ### Adding a lane
85
+
86
+ Add an entry under `lanes` in `lanes.json`: a `description`, `newScreens` (how many new screen
87
+ directories the diff may add; `0` for an edit-only lane), and `allow`, `note` and `forbid` role
88
+ lists. Add a role only when no existing one covers the paths. Then describe the lane here.
89
+ Specialized work gets its own lane; never loosen `new-screen` to fit it.
90
+
91
+ ## Checks
92
+
93
+ All of these are review until the screen checker ships. When it does, it fails only on new findings;
94
+ existing ones are grandfathered.
95
+
96
+ | Rule | Source | Check |
97
+ | ---- | ------ | ----- |
98
+ | Painted colours are semantic: no hex, no `Color.*` outside the `semanticColor` fallback | PDS; keeps PDH-F1 in dark mode | Review |
99
+ | Complete `Typography` styles, never individual font properties or a raw `font-size` | PDS; makes PDH-F2 checkable | Review |
100
+ | No copy under 11 px. The 10 px routes are `Typography.TextExtraSmall` and `TextExtraSmallMono`, `theme.text.paragraph.xs`, the text mixin's `xs` (`Paragraph` / `Label` `size="xs"`), and the `TextMono` + `TextExtraSmall.fontSize` composite | PDH-F2 | Review. Report-only once automated, since a text check can't tell copy from a label inside a graphic |
101
+ | `@keyframes`, `animation` or `transition` only with a `prefers-reduced-motion` block | PDH-F3 | Review. Report-only once automated |
102
+ | No hand-rolled `<table>`, `<th>` or `<td>` | PDS (Table Guidelines in SKILL.md) | Review |
103
+ | Contrast | PDH-F1 | Review |
104
+ | Status not by colour alone | PDH-F4 | Review |
105
+ | The diff stays within its lane | `lanes.json` | Review |
106
+
107
+ ## Departure ledger
108
+
109
+ Departures from this file or the core that aren't tightenings, one row each, in the PDH-M3 format:
110
+ `rule ID · what changed · scope · reason (medium or audience) · owner · expiry or "standing" · date`.
111
+ A one-screen departure goes in that PR's brief instead.
112
+
113
+ | Rule | What changed | Scope | Reason | Owner | Expiry | Date |
114
+ | ---- | ------------ | ----- | ------ | ----- | ------ | ---- |
115
+ | PDH-F2 | 10 px mono text (`TextMono` + `TextExtraSmall.fontSize`) | `components/TechnicalSticker/TechnicalSticker.tsx`, the `font-size` in the `TechnicalText` style | PDS's existing 10 px step for dense technical identifiers; predates this standard | Michael Hu | standing | 2026-10-26 |
116
+ | PDH-F2 | 10 px mono pill text (`Typography.TextExtraSmall`, mono family) | `components/SmartTextInput/PillType.tsx`, the `PillType` style | PDS's existing 10 px step for type pills in the editor; predates this standard | Michael Hu | standing | 2026-10-26 |
117
+ | PDH-F2 | 10 px helper copy (`paragraphMixins.xs`); copy, not a label inside a graphic | `components/DataTable/TableControls/FiltersV2/FilterPopover/FilterPopover.tsx`, the `Footer` style | PDS's existing 10 px step for the filter popover's field note; predates this standard | Michael Hu | standing | 2026-10-26 |
118
+ | PDH-F2 | 10 px `xs` paragraph mixin (`Typography.TextExtraSmall`), reached by `Paragraph` / `Label` `size="xs"` | `mixins/text.ts` `xs` | PDS's existing 10 px step, kept for current callers; predates this standard | Michael Hu | standing | 2026-10-26 |
119
+ | PDH-F2 | 10 px theme value (`Typography.TextExtraSmall`) | `theme.ts` `text.paragraph.xs` | Part of the theme contract consumers compile against; predates this standard | Michael Hu | standing | 2026-10-26 |
120
+
121
+ `lib/middleTruncateText.ts` needs no row: its 10 px `DEFAULT_FONT` only measures text on a canvas
122
+ and paints nothing.
123
+
124
+ ## Receipt
125
+
126
+ Each screen records the receipt core (design-harness `spec/receipt.md`) plus `brand: persona`,
127
+ `departures`, and `shared_components_touched` (the shared components changed, with every screen they
128
+ reach). Until the screen receipt is automated, the screen brief in the PR body stands in for it.
129
+
130
+ ## Citations and tightenings
131
+
132
+ No tightenings for now: every value above is the core's value.
133
+
134
+ Core rules cited, all at `persona-id/design-harness` `core-v0.3`: PDH-P1, PDH-P2 (ranks 1–2) · PDH-F1 to PDH-F4 ·
135
+ PDH-S1, PDH-S2 · PDH-M1, host side (a screen hosting an illustration, such as an empty state, sets the
136
+ surface it sits on) · PDH-M3 · PDH-M4 · PDH-M5 (a correction meant to hold lands as a PR to this
137
+ file). Not cited: PDH-M2, campaigns don't apply to product UI.
@@ -634,9 +634,11 @@ Typography.TextMediumLink // 14px, regular, underlined
634
634
  Typography.TextSmall // 12px, regular
635
635
  Typography.TextSmallBold // 12px, bold
636
636
  Typography.TextSmallLink // 12px, regular, underlined
637
- Typography.TextExtraSmall // 10px
637
+ Typography.TextExtraSmall // 10px, below the 11px minimum for text the user reads (STANDARD.md)
638
638
 
639
639
  Typography.TextMono // 14px, monospace
640
+ Typography.TextSmallMono // 12px, monospace
641
+ Typography.TextExtraSmallMono // 10px, monospace, below the 11px minimum for text the user reads (STANDARD.md)
640
642
  ```
641
643
 
642
644
  ## Radius
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": 1,
3
+ "trailer": "Harness-Task",
4
+ "roles": {
5
+ "screen": "Files inside the screen or route directory the lane adds. The app's harness config names where screen directories live.",
6
+ "screen-tests": "Tests and stories for that screen kept outside its directory.",
7
+ "locale": "Locale (translation) files.",
8
+ "route-table": "The app's route or navigation table.",
9
+ "shared": "Components, hooks and layouts used by more than one screen.",
10
+ "theme": "Theme, global styles and token overrides.",
11
+ "pds-mirror": "Code mirrored or copied from @persona/design-system."
12
+ },
13
+ "lanes": {
14
+ "new-screen": {
15
+ "description": "One new screen built from PDS patterns and components, with no designer.",
16
+ "newScreens": 1,
17
+ "allow": ["screen", "screen-tests", "locale"],
18
+ "note": ["route-table"],
19
+ "forbid": ["shared", "theme", "pds-mirror"]
20
+ }
21
+ }
22
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Breadcrumbs-CQUe9VTM.mjs","names":["Input"],"sources":["../components/Breadcrumbs/Breadcrumb.tsx","../components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { type ChangeEvent, useEffect, useRef, useState } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport { CopyIcon, EditIcon } from '@persona/icons';\nimport { IconButton } from 'design-system/components/Button';\nimport Input from 'design-system/components/Input';\nimport { HStack } from 'design-system/components/Stack';\nimport TechnicalSticker from 'design-system/components/TechnicalSticker';\nimport { Paragraph } from 'design-system/components/Text';\nimport Tooltip from 'design-system/components/Tooltip';\nimport { RouterLink } from 'design-system/lib/router';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { paragraphMixins } from 'design-system/mixins/text';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\nexport type BreadcrumbSize = 'md' | 'lg';\n\nexport type BreadcrumbHeadingAs = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nconst COPY_TOOLTIP_LABEL = 'Copy ID';\nconst COPIED_TOOLTIP_LABEL = 'Copied!';\nconst DEFAULT_EDIT_MAX_LENGTH = 100;\nconst COPY_TOOLTIP_STICKER_MAX_WIDTH = '96px';\nconst COPY_TOOLTIP_STICKER_TOOLTIP_MAX_WIDTH = '250px';\n\nexport type BreadcrumbProps = {\n label: string;\n size?: BreadcrumbSize;\n current?: boolean;\n /**\n * Overrides the heading element rendered for the current crumb. Defaults to `h1`; use `h2` or\n * lower when the page already has an `h1`.\n */\n headingAs?: BreadcrumbHeadingAs;\n showCopyAction?: boolean;\n copyValue?: string;\n copyTooltipLabel?: string;\n /** Copy tooltip text shown after a successful copy. Defaults to `Copied!`. */\n copiedTooltipLabel?: string;\n /**\n * Appends `copyValue` to both copy tooltip texts as a `TechnicalSticker`, so the tooltip shows\n * which token is being copied.\n */\n showCopyValueInTooltip?: boolean;\n /** Internal path (e.g. `/cases`), rendered as a router-aware link. */\n href?: string;\n /**\n * Activates a non-current crumb without a route change, for trails that navigate in-place (e.g.\n * a control panel drilling into a sub-panel). Ignored when `href` is set.\n */\n onClick?: () => void;\n onEdit?: (newLabel: string) => void;\n editMaxLength?: number;\n onCopy?: () => void;\n};\n\nconst LABEL_ACTION_GAP = Spacing[2];\nconst ACTION_BUTTON_GAP = Spacing[1];\n\nconst CrumbRow = styled(HStack)`\n align-items: center;\n min-width: 0;\n`;\n\nconst crumbLayoutStyles = (size: BreadcrumbSize) => css`\n display: inline-flex;\n align-items: center;\n min-width: 0;\n min-height: ${({ theme }) => theme.element.height.xs};\n ${\n size === 'lg'\n ? css`\n font-size: ${({ theme }) => theme.text.paragraph.lg.fontSize};\n line-height: ${({ theme }) => theme.text.paragraph.lg.lineHeight};\n `\n : css``\n };\n`;\n\nconst editInputTextStyles = (size: BreadcrumbSize, current: boolean) => {\n if (current) {\n return size === 'lg' ? paragraphMixins.lgBold : paragraphMixins.mdBold;\n }\n return size === 'lg' ? paragraphMixins.lg : paragraphMixins.md;\n};\n\nconst ancestorCrumbStyles = css<{ $size: BreadcrumbSize }>`\n ${paragraphMixins.md};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', theme.color.text.secondary)};\n text-decoration: none;\n transition: color ${TransitionDuration.ExtraFast} ease-out;\n ${focusOutline}\n ${({ $size }) => crumbLayoutStyles($size)}\n\n &:hover {\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n }\n`;\n\nconst AncestorNavLink = styled(RouterLink)<{ $size: BreadcrumbSize }>`\n ${ancestorCrumbStyles}\n`;\n\nconst AncestorNavButton = styled.button<{ $size: BreadcrumbSize }>`\n ${ancestorCrumbStyles}\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n`;\n\nconst InlineEditInput = styled(Input)<{\n $size: BreadcrumbSize;\n $current: boolean;\n $editMinWidth?: number;\n}>`\n margin: 0;\n padding: 2px 10px;\n width: auto;\n max-width: 100%;\n min-width: ${({ $editMinWidth }) => ($editMinWidth != null ? `${$editMinWidth}px` : '0')};\n field-sizing: content;\n display: inline-block;\n ${({ $size, $current }) => editInputTextStyles($size, $current)};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', theme.color.background.primary)};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n\n &:not(:focus) {\n border-color: transparent;\n }\n\n &:hover:not(:disabled) {\n border-style: solid;\n }\n`;\n\nconst CurrentLabel = styled(Paragraph)<{ $size: BreadcrumbSize }>`\n margin: 0;\n ${({ $size }) => crumbLayoutStyles($size)}\n`;\n\nconst copyToClipboard = async (value: string): Promise<boolean> => {\n try {\n if (navigator.clipboard?.writeText == null) {\n return false;\n }\n\n await navigator.clipboard.writeText(value);\n return true;\n } catch {\n return false;\n }\n};\n\nconst BreadcrumbCopyButton = ({\n copyValue,\n copyTooltipLabel = COPY_TOOLTIP_LABEL,\n copiedTooltipLabel = COPIED_TOOLTIP_LABEL,\n showCopyValueInTooltip = false,\n onCopy,\n}: {\n copyValue: string;\n copyTooltipLabel?: string;\n copiedTooltipLabel?: string;\n showCopyValueInTooltip?: boolean;\n onCopy?: () => void;\n}) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n const success = await copyToClipboard(copyValue);\n if (!success) {\n return;\n }\n\n setCopied(true);\n setTooltipOpen(true);\n onCopy?.();\n\n window.setTimeout(() => {\n setTooltipOpen(false);\n window.setTimeout(() => setCopied(false), 200);\n }, 1000);\n };\n\n const handleMouseEnter = () => {\n if (!copied) {\n setTooltipOpen(true);\n }\n };\n\n const handleMouseLeave = () => {\n if (!copied) {\n setTooltipOpen(false);\n }\n };\n\n const trigger = (\n <span onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <IconButton\n type='button'\n size='sm'\n aria-label={`Copy ${copyValue}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void handleCopy();\n }}\n >\n <CopyIcon />\n </IconButton>\n </span>\n );\n\n const tooltipLabel = copied ? copiedTooltipLabel : copyTooltipLabel;\n\n return (\n <Tooltip\n trigger={trigger}\n open={tooltipOpen}\n side='top'\n sideOffset={4}\n size='sm'\n contentAlignment='center'\n interactive={false}\n hideArrow\n portal={false}\n maxWidth={showCopyValueInTooltip ? COPY_TOOLTIP_STICKER_TOOLTIP_MAX_WIDTH : undefined}\n >\n {showCopyValueInTooltip ? (\n <HStack spacing={ACTION_BUTTON_GAP} align='center'>\n <span>{tooltipLabel}</span>\n <TechnicalSticker copyable={false} maxWidth={COPY_TOOLTIP_STICKER_MAX_WIDTH}>\n {copyValue}\n </TechnicalSticker>\n </HStack>\n ) : (\n tooltipLabel\n )}\n </Tooltip>\n );\n};\n\nconst Breadcrumb = ({\n label,\n size = 'md',\n current = false,\n headingAs = 'h1',\n showCopyAction = false,\n copyValue,\n copyTooltipLabel,\n copiedTooltipLabel,\n showCopyValueInTooltip,\n href,\n onClick,\n onEdit,\n editMaxLength = DEFAULT_EDIT_MAX_LENGTH,\n onCopy,\n}: BreadcrumbProps) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(label);\n const [editMinWidth, setEditMinWidth] = useState<number | undefined>();\n const editInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) {\n setEditValue(label);\n }\n }, [isEditing, label]);\n\n useEffect(() => {\n if (!isEditing) {\n setEditMinWidth(undefined);\n return;\n }\n\n const input = editInputRef.current;\n if (input == null) {\n return;\n }\n\n setEditMinWidth(input.offsetWidth);\n input.focus();\n input.select();\n }, [isEditing]);\n\n const commitEdit = () => {\n if (!isEditing) {\n return;\n }\n\n setIsEditing(false);\n if (editValue !== label) {\n onEdit?.(editValue);\n }\n };\n\n const inlineActions = !isEditing && (showCopyAction || onEdit) && (\n <HStack spacing={ACTION_BUTTON_GAP} align='center'>\n {onEdit && (\n <IconButton\n type='button'\n size='sm'\n aria-label={`Edit ${label}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setIsEditing(true);\n }}\n >\n <EditIcon />\n </IconButton>\n )}\n {showCopyAction && copyValue != null && (\n <BreadcrumbCopyButton\n copyValue={copyValue}\n copyTooltipLabel={copyTooltipLabel}\n copiedTooltipLabel={copiedTooltipLabel}\n showCopyValueInTooltip={showCopyValueInTooltip}\n onCopy={onCopy}\n />\n )}\n </HStack>\n );\n\n if (isEditing) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <InlineEditInput\n ref={editInputRef}\n $size={size}\n $current={current}\n $editMinWidth={editMinWidth}\n size='md'\n aria-label={`Edit ${label}`}\n maxLength={editMaxLength}\n value={editValue}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setEditValue(event.target.value)}\n onBlur={commitEdit}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commitEdit();\n }\n if (event.key === 'Escape') {\n setEditValue(label);\n setIsEditing(false);\n }\n }}\n />\n </CrumbRow>\n );\n }\n\n if (current) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <CurrentLabel\n $size={size}\n size={size === 'lg' ? 'lg' : 'md'}\n weight='bold'\n color='primary'\n as={headingAs}\n >\n {label}\n </CurrentLabel>\n {inlineActions}\n </CrumbRow>\n );\n }\n\n if (href == null && onClick != null) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <AncestorNavButton type='button' onClick={onClick} $size={size}>\n {label}\n </AncestorNavButton>\n {inlineActions}\n </CrumbRow>\n );\n }\n\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <AncestorNavLink to={href ?? ''} $size={size}>\n {label}\n </AncestorNavLink>\n {inlineActions}\n </CrumbRow>\n );\n};\n\nexport default Breadcrumb;\n","import styled from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport { intersperse } from 'design-system/lib/intersperse';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { paragraphMixins } from 'design-system/mixins/text';\n\nimport Breadcrumb, {\n type BreadcrumbHeadingAs,\n type BreadcrumbProps,\n type BreadcrumbSize,\n} from './Breadcrumb';\n\nexport type BreadcrumbsItemProps = Omit<BreadcrumbProps, 'size' | 'current' | 'headingAs'>;\n\nexport type BreadcrumbsProps = {\n items: BreadcrumbsItemProps[];\n size?: BreadcrumbSize;\n /**\n * Overrides the heading element rendered for the current crumb. Defaults to `h1`; use `h2` or\n * lower when the page already has an `h1`.\n */\n headingAs?: BreadcrumbHeadingAs;\n 'aria-label'?: string;\n className?: string;\n};\n\nconst BreadcrumbList = styled.ol`\n max-width: 100%;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n list-style: none;\n margin: 0;\n padding: 0;\n min-width: 0;\n`;\n\nconst BreadcrumbListItem = styled.li`\n display: flex;\n align-items: center;\n min-width: 0;\n`;\n\nconst Separator = styled.span<{ $size: BreadcrumbSize }>`\n padding: 0 ${Spacing[2]};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', theme.color.text.tertiary)};\n user-select: none;\n ${({ $size }) => ($size === 'lg' ? paragraphMixins.lg : paragraphMixins.md)};\n`;\n\nexport const Breadcrumbs = ({\n items,\n size = 'md',\n headingAs = 'h1',\n 'aria-label': ariaLabel = 'Breadcrumbs',\n className,\n}: BreadcrumbsProps) => {\n if (items.length === 0) {\n return null;\n }\n\n const crumbNodes = items.map((item, index) => {\n const isCurrent = index === items.length - 1;\n\n return (\n <BreadcrumbListItem\n key={`${item.label}-${index}`}\n aria-current={isCurrent ? 'page' : undefined}\n >\n <Breadcrumb {...item} size={size} current={isCurrent} headingAs={headingAs} />\n </BreadcrumbListItem>\n );\n });\n\n const listItems = intersperse(crumbNodes, (separatorIndex: number) => (\n <BreadcrumbListItem key={`separator-${separatorIndex}`} aria-hidden='true'>\n <Separator $size={size}>/</Separator>\n </BreadcrumbListItem>\n ));\n\n return (\n <nav aria-label={ariaLabel} className={className}>\n <BreadcrumbList>{listItems}</BreadcrumbList>\n </nav>\n );\n};\n\nexport default Breadcrumbs;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAC7B,MAAM,0BAA0B;AAChC,MAAM,iCAAiC;AACvC,MAAM,yCAAyC;AAiC/C,MAAM,mBAAmB,QAAQ;AACjC,MAAM,oBAAoB,QAAQ;AAElC,MAAM,WAAW,OAAO,OAAO;;;;AAK/B,MAAM,qBAAqB,SAAyB,GAAG;;;;iBAItC,EAAE,YAAY,MAAM,QAAQ,OAAO,GAAG;IAEnD,SAAS,OACL,GAAG;sBACW,EAAE,YAAY,MAAM,KAAK,UAAU,GAAG,SAAS;wBAC7C,EAAE,YAAY,MAAM,KAAK,UAAU,GAAG,WAAW;UAEjE,GAAG,GACR;;AAGH,MAAM,uBAAuB,MAAsB,YAAqB;AACtE,KAAI,QACF,QAAO,SAAS,OAAO,gBAAgB,SAAS,gBAAgB;AAElE,QAAO,SAAS,OAAO,gBAAgB,KAAK,gBAAgB;;AAG9D,MAAM,sBAAsB,GAA8B;IACtD,gBAAgB,GAAG;YACX,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,MAAM,KAAK,UAAU,CAAC;;8BAEvC;IAC/C,aAAa;KACZ,EAAE,YAAY,kBAAkB,MAAM,CAAC;;;cAG9B,EAAE,YAAY,cAAc,OAAO,aAAa,MAAM,MAAM,KAAK,QAAQ,CAAC;;;AAIxF,MAAM,kBAAkB,OAAO,WAAW;IACtC,oBAAoB;;AAGxB,MAAM,oBAAoB,OAAO,MAAiC;IAC9D,oBAAoB;;;;;;AAOxB,MAAM,kBAAkB,OAAOA,cAAM;;;;;gBASrB,EAAE,oBAAqB,iBAAiB,OAAO,GAAG,cAAc,MAAM,IAAK;;;KAGtF,EAAE,OAAO,eAAe,oBAAoB,OAAO,SAAS,CAAC;uBAC3C,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,MAAM,WAAW,QAAQ,CAAC;YAChG,EAAE,YAAY,cAAc,OAAO,aAAa,MAAM,MAAM,KAAK,QAAQ,CAAC;;;;;;;;;;AAWtF,MAAM,eAAe,OAAO,UAAU;;KAEjC,EAAE,YAAY,kBAAkB,MAAM,CAAC;;AAG5C,MAAM,kBAAkB,OAAO,UAAoC;AACjE,KAAI;AACF,MAAI,UAAU,WAAW,aAAa,KACpC,QAAO;AAGT,QAAM,UAAU,UAAU,UAAU,MAAM;AAC1C,SAAO;SACD;AACN,SAAO;;;AAIX,MAAM,wBAAwB,EAC5B,WACA,mBAAmB,oBACnB,qBAAqB,sBACrB,yBAAyB,OACzB,aAOI;CACJ,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAE3C,MAAM,aAAa,YAAY;AAE7B,MAAI,CAAC,MADiB,gBAAgB,UAAU,CAE9C;AAGF,YAAU,KAAK;AACf,iBAAe,KAAK;AACpB,YAAU;AAEV,SAAO,iBAAiB;AACtB,kBAAe,MAAM;AACrB,UAAO,iBAAiB,UAAU,MAAM,EAAE,IAAI;KAC7C,IAAK;;CAGV,MAAM,yBAAyB;AAC7B,MAAI,CAAC,OACH,gBAAe,KAAK;;CAIxB,MAAM,yBAAyB;AAC7B,MAAI,CAAC,OACH,gBAAe,MAAM;;CAIzB,MAAM,UACJ,oBAAC,QAAD;EAAM,cAAc;EAAkB,cAAc;YAClD,oBAAC,YAAD;GACE,MAAK;GACL,MAAK;GACL,cAAY,QAAQ;GACpB,UAAU,UAAU;AAClB,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AAClB,gBAAY;;aAGnB,oBAAC,UAAD,EAAY,CAAA;GACD,CAAA;EACR,CAAA;CAGT,MAAM,eAAe,SAAS,qBAAqB;AAEnD,QACE,oBAAC,SAAD;EACW;EACT,MAAM;EACN,MAAK;EACL,YAAY;EACZ,MAAK;EACL,kBAAiB;EACjB,aAAa;EACb,WAAA;EACA,QAAQ;EACR,UAAU,yBAAyB,yCAAyC,KAAA;YAE3E,yBACC,qBAAC,QAAD;GAAQ,SAAS;GAAmB,OAAM;aAA1C,CACE,oBAAC,QAAD,EAAA,UAAO,cAAoB,CAAA,EAC3B,oBAAC,kBAAD;IAAkB,UAAU;IAAO,UAAU;cAC1C;IACgB,CAAA,CACZ;OAET;EAEM,CAAA;;AAId,MAAM,cAAc,EAClB,OACA,OAAO,MACP,UAAU,OACV,YAAY,MACZ,iBAAiB,OACjB,WACA,kBACA,oBACA,wBACA,MACA,SACA,QACA,gBAAgB,yBAChB,aACqB;CACrB,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,CAAC,cAAc,mBAAmB,UAA8B;CACtE,MAAM,eAAe,OAAyB,KAAK;AAEnD,iBAAgB;AACd,MAAI,CAAC,UACH,cAAa,MAAM;IAEpB,CAAC,WAAW,MAAM,CAAC;AAEtB,iBAAgB;AACd,MAAI,CAAC,WAAW;AACd,mBAAgB,KAAA,EAAU;AAC1B;;EAGF,MAAM,QAAQ,aAAa;AAC3B,MAAI,SAAS,KACX;AAGF,kBAAgB,MAAM,YAAY;AAClC,QAAM,OAAO;AACb,QAAM,QAAQ;IACb,CAAC,UAAU,CAAC;CAEf,MAAM,mBAAmB;AACvB,MAAI,CAAC,UACH;AAGF,eAAa,MAAM;AACnB,MAAI,cAAc,MAChB,UAAS,UAAU;;CAIvB,MAAM,gBAAgB,CAAC,cAAc,kBAAkB,WACrD,qBAAC,QAAD;EAAQ,SAAS;EAAmB,OAAM;YAA1C,CACG,UACC,oBAAC,YAAD;GACE,MAAK;GACL,MAAK;GACL,cAAY,QAAQ;GACpB,UAAU,UAAU;AAClB,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,iBAAa,KAAK;;aAGpB,oBAAC,UAAD,EAAY,CAAA;GACD,CAAA,EAEd,kBAAkB,aAAa,QAC9B,oBAAC,sBAAD;GACa;GACO;GACE;GACI;GAChB;GACR,CAAA,CAEG;;AAGX,KAAI,UACF,QACE,oBAAC,UAAD;EAAU,SAAS;YACjB,oBAAC,iBAAD;GACE,KAAK;GACL,OAAO;GACP,UAAU;GACV,eAAe;GACf,MAAK;GACL,cAAY,QAAQ;GACpB,WAAW;GACX,OAAO;GACP,WAAW,UAAyC,aAAa,MAAM,OAAO,MAAM;GACpF,QAAQ;GACR,YAAY,UAAU;AACpB,QAAI,MAAM,QAAQ,SAAS;AACzB,WAAM,gBAAgB;AACtB,iBAAY;;AAEd,QAAI,MAAM,QAAQ,UAAU;AAC1B,kBAAa,MAAM;AACnB,kBAAa,MAAM;;;GAGvB,CAAA;EACO,CAAA;AAIf,KAAI,QACF,QACE,qBAAC,UAAD;EAAU,SAAS;YAAnB,CACE,oBAAC,cAAD;GACE,OAAO;GACP,MAAM,SAAS,OAAO,OAAO;GAC7B,QAAO;GACP,OAAM;GACN,IAAI;aAEH;GACY,CAAA,EACd,cACQ;;AAIf,KAAI,QAAQ,QAAQ,WAAW,KAC7B,QACE,qBAAC,UAAD;EAAU,SAAS;YAAnB,CACE,oBAAC,mBAAD;GAAmB,MAAK;GAAkB;GAAS,OAAO;aACvD;GACiB,CAAA,EACnB,cACQ;;AAIf,QACE,qBAAC,UAAD;EAAU,SAAS;YAAnB,CACE,oBAAC,iBAAD;GAAiB,IAAI,QAAQ;GAAI,OAAO;aACrC;GACe,CAAA,EACjB,cACQ;;;;;AC5Wf,MAAM,iBAAiB,OAAO,EAAE;;;;;;;;;;AAWhC,MAAM,qBAAqB,OAAO,EAAE;;;;;AAMpC,MAAM,YAAY,OAAO,IAA+B;eACzC,QAAQ,GAAG;YACd,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,MAAM,KAAK,SAAS,CAAC;;KAEpF,EAAE,YAAa,UAAU,OAAO,gBAAgB,KAAK,gBAAgB,GAAI;;AAG9E,MAAa,eAAe,EAC1B,OACA,OAAO,MACP,YAAY,MACZ,cAAc,YAAY,eAC1B,gBACsB;AACtB,KAAI,MAAM,WAAW,EACnB,QAAO;AAsBT,QACE,oBAAC,OAAD;EAAK,cAAY;EAAsB;YACrC,oBAAC,gBAAD,EAAA,UARc,YAbC,MAAM,KAAK,MAAM,UAAU;GAC5C,MAAM,YAAY,UAAU,MAAM,SAAS;AAE3C,UACE,oBAAC,oBAAD;IAEE,gBAAc,YAAY,SAAS,KAAA;cAEnC,oBAAC,YAAD;KAAY,GAAI;KAAY;KAAM,SAAS;KAAsB;KAAa,CAAA;IAC3D,EAJd,GAAG,KAAK,MAAM,GAAG,QAIH;IAIe,GAAG,mBACzC,oBAAC,oBAAD;GAAwD,eAAY;aAClE,oBAAC,WAAD;IAAW,OAAO;cAAM;IAAa,CAAA;GAClB,EAFI,aAAa,iBAEjB,CAKO,EAAkB,CAAA;EACxC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageHeader-DJF7nxgN.mjs","names":[],"sources":["../components/PageHeader/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport Breadcrumbs, { type BreadcrumbsProps } from 'design-system/components/Breadcrumbs';\nimport { Heading, Paragraph } from 'design-system/components/Text';\nimport { semanticColor, semanticOnly } from 'design-system/lib/semanticColor';\n\nexport const PageHeaderContainer = styled.header`\n display: flex;\n width: 100%;\n justify-content: space-between;\n align-items: center;\n padding: ${Spacing[3]} ${Spacing[5]};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', theme.color.background.primary)};\n border-bottom: 1px solid ${({ theme }) => semanticColor(theme, 'BorderDivider', theme.color.border.primary)};\n box-sizing: border-box;\n min-height: 56px; /* Standardize height for most PageHeaders */\n`;\n\nconst TitleContainer = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n h1 {\n margin: 0;\n ${semanticOnly((tokens) => `color: ${tokens.FgPrimary};`)}\n }\n p {\n margin: 0 0 0 ${Spacing[2]};\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondary};`)}\n }\n`;\n\nconst LeftContainer = styled.div`\n display: flex;\n align-items: center;\n gap: ${Spacing[2]};\n`;\n\nconst RightContainer = styled.div`\n display: flex;\n gap: ${Spacing[2]};\n margin-left: ${Spacing[3]};\n`;\n\ninterface PageHeaderCommonProps {\n level?: 'product' | 'detail';\n prepend?: ReactNode;\n append?: ReactNode;\n children?: ReactNode;\n}\n\n/** Exactly one heading source is required: either `title` or `breadcrumbs`. */\nexport type PageHeaderProps = PageHeaderCommonProps &\n (\n | { title: ReactNode; subtitle?: ReactNode; breadcrumbs?: never }\n | {\n title?: never;\n /**\n * The subtitle is sunset in the breadcrumbs variant (PX-1299); fold the value it\n * carried (e.g. an object ID) into the current crumb, with a copy action if useful.\n */\n subtitle?: never;\n /** Renders in place of `title`; the current crumb becomes the page `h1`, at `lg` size. */\n breadcrumbs: BreadcrumbsProps;\n }\n );\n\nconst PageHeader = ({\n title,\n breadcrumbs,\n subtitle,\n level = 'product',\n prepend,\n append,\n children,\n ...props\n}: PageHeaderProps) => (\n <PageHeaderContainer {...props}>\n <LeftContainer>\n {prepend}\n <TitleContainer>\n {breadcrumbs ? (\n <Breadcrumbs size='lg' {...breadcrumbs} />\n ) : (\n <>\n {level === 'product' && (\n <Heading as='h1' size='sm'>\n {title}\n </Heading>\n )}\n {level === 'detail' && (\n <Paragraph as='h1' size='lg' color='primary'>\n {title}\n </Paragraph>\n )}\n </>\n )}\n {subtitle && <Paragraph size='md'>{subtitle}</Paragraph>}\n </TitleContainer>\n {append}\n </LeftContainer>\n {children && <RightContainer>{children}</RightContainer>}\n </PageHeaderContainer>\n);\n\nexport default PageHeader;\n"],"mappings":";;;;;;;AAQA,MAAa,sBAAsB,OAAO,MAAM;;;;;aAKnC,QAAQ,GAAG,GAAG,QAAQ,GAAG;uBACf,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,MAAM,WAAW,QAAQ,CAAC;8BAC9E,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,MAAM,OAAO,QAAQ,CAAC;;;;AAK9G,MAAM,iBAAiB,OAAO,GAAG;;;;;;MAM3B,cAAc,WAAW,UAAU,OAAO,UAAU,GAAG,CAAC;;;oBAG1C,QAAQ,GAAG;MACzB,cAAc,WAAW,UAAU,OAAO,YAAY,GAAG,CAAC;;;AAIhE,MAAM,gBAAgB,OAAO,GAAG;;;SAGvB,QAAQ,GAAG;;AAGpB,MAAM,iBAAiB,OAAO,GAAG;;SAExB,QAAQ,GAAG;iBACH,QAAQ,GAAG;;AA0B5B,MAAM,cAAc,EAClB,OACA,aACA,UACA,QAAQ,WACR,SACA,QACA,UACA,GAAG,YAEH,qBAAC,qBAAD;CAAqB,GAAI;WAAzB,CACE,qBAAC,eAAD,EAAA,UAAA;EACG;EACD,qBAAC,gBAAD,EAAA,UAAA,CACG,cACC,oBAAC,aAAD;GAAa,MAAK;GAAK,GAAI;GAAe,CAAA,GAE1C,qBAAA,UAAA,EAAA,UAAA,CACG,UAAU,aACT,oBAAC,SAAD;GAAS,IAAG;GAAK,MAAK;aACnB;GACO,CAAA,EAEX,UAAU,YACT,oBAAC,WAAD;GAAW,IAAG;GAAK,MAAK;GAAK,OAAM;aAChC;GACS,CAAA,CAEb,EAAA,CAAA,EAEJ,YAAY,oBAAC,WAAD;GAAW,MAAK;aAAM;GAAqB,CAAA,CACzC,EAAA,CAAA;EAChB;EACa,EAAA,CAAA,EACf,YAAY,oBAAC,gBAAD,EAAiB,UAA0B,CAAA,CACpC"}