@psnext/design-system 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +466 -4
- package/README.md +3 -3
- package/SKILL.md +83 -5
- package/bin/install-agent-skill.mjs +39 -7
- package/dist/Header.cjs +214 -108
- package/dist/Header.cjs.map +1 -1
- package/dist/Header.js +214 -108
- package/dist/Header.js.map +1 -1
- package/dist/Icon.cjs +40 -8
- package/dist/Icon.cjs.map +1 -1
- package/dist/Icon.js +40 -8
- package/dist/Icon.js.map +1 -1
- package/dist/MultiColumn.cjs +354 -0
- package/dist/MultiColumn.cjs.map +1 -0
- package/dist/MultiColumn.js +335 -0
- package/dist/MultiColumn.js.map +1 -0
- package/dist/Sidebar.cjs +4 -3
- package/dist/Sidebar.cjs.map +1 -1
- package/dist/Sidebar.js +4 -3
- package/dist/Sidebar.js.map +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index10.d.cts +6 -6
- package/dist/index10.d.ts +7 -7
- package/dist/index10.d.ts.map +1 -1
- package/dist/index11.d.cts +3 -3
- package/dist/index11.d.cts.map +1 -1
- package/dist/index11.d.ts +3 -3
- package/dist/index11.d.ts.map +1 -1
- package/dist/index12.d.cts +11 -11
- package/dist/index12.d.ts +13 -13
- package/dist/index12.d.ts.map +1 -1
- package/dist/index13.d.cts +6 -6
- package/dist/index13.d.cts.map +1 -1
- package/dist/index13.d.ts +6 -6
- package/dist/index13.d.ts.map +1 -1
- package/dist/index14.d.cts +5 -5
- package/dist/index14.d.cts.map +1 -1
- package/dist/index14.d.ts +5 -5
- package/dist/index15.d.cts +3 -3
- package/dist/index15.d.cts.map +1 -1
- package/dist/index15.d.ts +3 -3
- package/dist/index15.d.ts.map +1 -1
- package/dist/index16.d.cts +2 -2
- package/dist/index16.d.cts.map +1 -1
- package/dist/index16.d.ts +2 -2
- package/dist/index16.d.ts.map +1 -1
- package/dist/index17.d.cts +4 -4
- package/dist/index17.d.cts.map +1 -1
- package/dist/index17.d.ts +4 -4
- package/dist/index18.d.cts +11 -11
- package/dist/index18.d.cts.map +1 -1
- package/dist/index18.d.ts +11 -11
- package/dist/index18.d.ts.map +1 -1
- package/dist/index19.d.cts +10 -10
- package/dist/index19.d.cts.map +1 -1
- package/dist/index19.d.ts +10 -10
- package/dist/index19.d.ts.map +1 -1
- package/dist/index2.d.cts +8 -8
- package/dist/index2.d.cts.map +1 -1
- package/dist/index2.d.ts +7 -7
- package/dist/index20.d.cts +16 -16
- package/dist/index20.d.cts.map +1 -1
- package/dist/index20.d.ts +16 -16
- package/dist/index20.d.ts.map +1 -1
- package/dist/index21.d.cts +4 -4
- package/dist/index21.d.cts.map +1 -1
- package/dist/index21.d.ts +4 -4
- package/dist/index21.d.ts.map +1 -1
- package/dist/index22.d.cts +11 -11
- package/dist/index22.d.ts +11 -11
- package/dist/index23.d.cts +16 -16
- package/dist/index23.d.cts.map +1 -1
- package/dist/index23.d.ts +16 -16
- package/dist/index23.d.ts.map +1 -1
- package/dist/index24.d.cts +10 -10
- package/dist/index24.d.cts.map +1 -1
- package/dist/index24.d.ts +11 -11
- package/dist/index24.d.ts.map +1 -1
- package/dist/index25.d.cts +2 -2
- package/dist/index25.d.cts.map +1 -1
- package/dist/index25.d.ts +2 -2
- package/dist/index25.d.ts.map +1 -1
- package/dist/index26.d.cts +13 -13
- package/dist/index26.d.cts.map +1 -1
- package/dist/index26.d.ts +15 -15
- package/dist/index26.d.ts.map +1 -1
- package/dist/index27.d.cts +7 -7
- package/dist/index27.d.cts.map +1 -1
- package/dist/index27.d.ts +7 -7
- package/dist/index27.d.ts.map +1 -1
- package/dist/index28.d.cts +4 -4
- package/dist/index28.d.ts +6 -6
- package/dist/index28.d.ts.map +1 -1
- package/dist/index29.d.cts +4 -4
- package/dist/index29.d.cts.map +1 -1
- package/dist/index29.d.ts +4 -4
- package/dist/index29.d.ts.map +1 -1
- package/dist/index3.d.cts +13 -13
- package/dist/index3.d.ts +13 -13
- package/dist/index30.d.cts +42 -13
- package/dist/index30.d.cts.map +1 -1
- package/dist/index30.d.ts +43 -14
- package/dist/index30.d.ts.map +1 -1
- package/dist/index31.d.cts +5 -5
- package/dist/index31.d.cts.map +1 -1
- package/dist/index31.d.ts +6 -6
- package/dist/index31.d.ts.map +1 -1
- package/dist/index32.d.cts +6 -6
- package/dist/index32.d.cts.map +1 -1
- package/dist/index32.d.ts +6 -6
- package/dist/index33.d.cts +11 -11
- package/dist/index33.d.cts.map +1 -1
- package/dist/index33.d.ts +12 -12
- package/dist/index33.d.ts.map +1 -1
- package/dist/index34.d.cts +5 -5
- package/dist/index34.d.cts.map +1 -1
- package/dist/index34.d.ts +5 -5
- package/dist/index34.d.ts.map +1 -1
- package/dist/index35.d.cts +15 -15
- package/dist/index35.d.cts.map +1 -1
- package/dist/index35.d.ts +16 -16
- package/dist/index35.d.ts.map +1 -1
- package/dist/index36.d.cts +3 -3
- package/dist/index36.d.ts +3 -3
- package/dist/index36.d.ts.map +1 -1
- package/dist/index37.d.cts +5 -5
- package/dist/index37.d.ts +6 -6
- package/dist/index38.d.cts +2 -2
- package/dist/index38.d.ts +2 -2
- package/dist/index39.d.cts +17 -17
- package/dist/index39.d.cts.map +1 -1
- package/dist/index39.d.ts +17 -17
- package/dist/index39.d.ts.map +1 -1
- package/dist/index4.d.cts +2 -2
- package/dist/index4.d.ts +2 -2
- package/dist/index40.d.cts +5 -5
- package/dist/index40.d.cts.map +1 -1
- package/dist/index40.d.ts +6 -6
- package/dist/index40.d.ts.map +1 -1
- package/dist/index41.d.cts +11 -11
- package/dist/index41.d.cts.map +1 -1
- package/dist/index41.d.ts +11 -11
- package/dist/index41.d.ts.map +1 -1
- package/dist/index42.d.cts +8 -8
- package/dist/index42.d.cts.map +1 -1
- package/dist/index42.d.ts +8 -8
- package/dist/index42.d.ts.map +1 -1
- package/dist/index43.d.cts +9 -9
- package/dist/index43.d.cts.map +1 -1
- package/dist/index43.d.ts +9 -9
- package/dist/index43.d.ts.map +1 -1
- package/dist/index45.d.cts +8 -8
- package/dist/index45.d.cts.map +1 -1
- package/dist/index45.d.ts +8 -8
- package/dist/index45.d.ts.map +1 -1
- package/dist/index46.d.cts +2 -2
- package/dist/index46.d.cts.map +1 -1
- package/dist/index46.d.ts +2 -2
- package/dist/index46.d.ts.map +1 -1
- package/dist/index47.d.cts +4 -4
- package/dist/index47.d.cts.map +1 -1
- package/dist/index47.d.ts +4 -4
- package/dist/index47.d.ts.map +1 -1
- package/dist/index48.d.cts +4 -4
- package/dist/index48.d.cts.map +1 -1
- package/dist/index48.d.ts +4 -4
- package/dist/index48.d.ts.map +1 -1
- package/dist/index49.d.cts +3 -3
- package/dist/index49.d.ts +3 -3
- package/dist/index5.d.cts +7 -7
- package/dist/index5.d.ts +7 -7
- package/dist/index5.d.ts.map +1 -1
- package/dist/index50.d.cts +11 -11
- package/dist/index50.d.cts.map +1 -1
- package/dist/index50.d.ts +11 -11
- package/dist/index50.d.ts.map +1 -1
- package/dist/index51.d.cts +9 -9
- package/dist/index51.d.cts.map +1 -1
- package/dist/index51.d.ts +9 -9
- package/dist/index51.d.ts.map +1 -1
- package/dist/index52.d.cts +5 -5
- package/dist/index52.d.ts +5 -5
- package/dist/index53.d.cts +26 -26
- package/dist/index53.d.cts.map +1 -1
- package/dist/index53.d.ts +27 -27
- package/dist/index53.d.ts.map +1 -1
- package/dist/index54.d.cts +5 -5
- package/dist/index54.d.ts +5 -5
- package/dist/index54.d.ts.map +1 -1
- package/dist/index55.d.cts +2 -2
- package/dist/index55.d.cts.map +1 -1
- package/dist/index55.d.ts +2 -2
- package/dist/index56.d.cts +2 -2
- package/dist/index56.d.cts.map +1 -1
- package/dist/index56.d.ts +2 -2
- package/dist/index56.d.ts.map +1 -1
- package/dist/index57.d.cts +2 -2
- package/dist/index57.d.cts.map +1 -1
- package/dist/index57.d.ts +2 -2
- package/dist/index57.d.ts.map +1 -1
- package/dist/index58.d.cts +4 -4
- package/dist/index58.d.ts +4 -4
- package/dist/index58.d.ts.map +1 -1
- package/dist/index59.d.cts +9 -9
- package/dist/index59.d.ts +9 -9
- package/dist/index6.d.cts +6 -6
- package/dist/index6.d.cts.map +1 -1
- package/dist/index6.d.ts +6 -6
- package/dist/index6.d.ts.map +1 -1
- package/dist/index60.d.cts +9 -9
- package/dist/index60.d.cts.map +1 -1
- package/dist/index60.d.ts +13 -13
- package/dist/index60.d.ts.map +1 -1
- package/dist/index61.d.cts +5 -5
- package/dist/index61.d.ts +6 -6
- package/dist/index62.d.cts +5 -5
- package/dist/index62.d.ts +5 -5
- package/dist/index62.d.ts.map +1 -1
- package/dist/index63.d.cts +2 -2
- package/dist/index63.d.cts.map +1 -1
- package/dist/index63.d.ts +2 -2
- package/dist/index63.d.ts.map +1 -1
- package/dist/index64.d.cts +6 -6
- package/dist/index64.d.cts.map +1 -1
- package/dist/index64.d.ts +7 -7
- package/dist/index65.d.cts +3 -3
- package/dist/index65.d.ts +4 -4
- package/dist/index65.d.ts.map +1 -1
- package/dist/index66.d.cts +4 -4
- package/dist/index66.d.cts.map +1 -1
- package/dist/index66.d.ts +6 -6
- package/dist/index66.d.ts.map +1 -1
- package/dist/index67.d.cts +83 -11
- package/dist/index67.d.cts.map +1 -1
- package/dist/index67.d.ts +83 -11
- package/dist/index67.d.ts.map +1 -1
- package/dist/index68.d.cts +12 -30
- package/dist/index68.d.cts.map +1 -1
- package/dist/index68.d.ts +12 -30
- package/dist/index68.d.ts.map +1 -1
- package/dist/index69.d.cts +28 -27
- package/dist/index69.d.cts.map +1 -1
- package/dist/index69.d.ts +29 -28
- package/dist/index69.d.ts.map +1 -1
- package/dist/index7.d.cts +8 -8
- package/dist/index7.d.cts.map +1 -1
- package/dist/index7.d.ts +8 -8
- package/dist/index7.d.ts.map +1 -1
- package/dist/index70.d.cts +33 -78
- package/dist/index70.d.cts.map +1 -1
- package/dist/index70.d.ts +33 -78
- package/dist/index70.d.ts.map +1 -1
- package/dist/index71.d.cts +77 -258
- package/dist/index71.d.cts.map +1 -1
- package/dist/index71.d.ts +77 -258
- package/dist/index71.d.ts.map +1 -1
- package/dist/index72.d.cts +278 -0
- package/dist/index72.d.cts.map +1 -0
- package/dist/index72.d.ts +278 -0
- package/dist/index72.d.ts.map +1 -0
- package/dist/index8.d.cts +5 -5
- package/dist/index8.d.ts +5 -5
- package/dist/index8.d.ts.map +1 -1
- package/dist/index9.d.cts +2 -2
- package/dist/index9.d.cts.map +1 -1
- package/dist/index9.d.ts +2 -2
- package/dist/layouts/Container/index.cjs +2 -1
- package/dist/layouts/Container/index.cjs.map +1 -1
- package/dist/layouts/Container/index.js +1 -1
- package/dist/layouts/MultiColumn/index.cjs +5 -0
- package/dist/layouts/MultiColumn/index.d.cts +2 -0
- package/dist/layouts/MultiColumn/index.d.ts +2 -0
- package/dist/layouts/MultiColumn/index.js +2 -0
- package/dist/layouts/PageBackground/index.d.cts +1 -1
- package/dist/layouts/PageBackground/index.d.ts +1 -1
- package/dist/layouts/Stack/index.cjs +2 -1
- package/dist/layouts/Stack/index.cjs.map +1 -1
- package/dist/layouts/Stack/index.d.cts +1 -1
- package/dist/layouts/Stack/index.d.ts +1 -1
- package/dist/layouts/Stack/index.js +1 -1
- package/dist/layouts/TwoColumn/index.cjs +2 -1
- package/dist/layouts/TwoColumn/index.cjs.map +1 -1
- package/dist/layouts/TwoColumn/index.d.cts +1 -1
- package/dist/layouts/TwoColumn/index.d.ts +1 -1
- package/dist/layouts/TwoColumn/index.js +1 -1
- package/dist/layouts/index.cjs +4 -0
- package/dist/layouts/index.d.cts +5 -4
- package/dist/layouts/index.d.ts +5 -4
- package/dist/layouts/index.js +2 -1
- package/dist/patterns/DataTable/index.cjs +6 -2
- package/dist/patterns/DataTable/index.cjs.map +1 -1
- package/dist/patterns/DataTable/index.d.cts +3 -3
- package/dist/patterns/DataTable/index.d.cts.map +1 -1
- package/dist/patterns/DataTable/index.d.ts +3 -3
- package/dist/patterns/DataTable/index.d.ts.map +1 -1
- package/dist/patterns/DataTable/index.js +6 -2
- package/dist/patterns/DataTable/index.js.map +1 -1
- package/dist/patterns/Footer/index.d.cts +7 -7
- package/dist/patterns/Footer/index.d.cts.map +1 -1
- package/dist/patterns/Footer/index.d.ts +7 -7
- package/dist/patterns/Header/index.d.cts +1 -1
- package/dist/patterns/Header/index.d.ts +1 -1
- package/dist/patterns/MediaObject/index.cjs +1 -1
- package/dist/patterns/MediaObject/index.d.cts +11 -11
- package/dist/patterns/MediaObject/index.d.ts +14 -14
- package/dist/patterns/MediaObject/index.js +1 -1
- package/dist/patterns/NavRail/index.cjs +4 -2
- package/dist/patterns/NavRail/index.cjs.map +1 -1
- package/dist/patterns/NavRail/index.js +4 -2
- package/dist/patterns/NavRail/index.js.map +1 -1
- package/dist/patterns/SectionCard/index.d.cts +2 -2
- package/dist/patterns/SectionCard/index.d.ts +2 -2
- package/dist/patterns/SectionCard/index.d.ts.map +1 -1
- package/dist/patterns/SectionHeading/index.d.cts +2 -2
- package/dist/patterns/SectionHeading/index.d.ts +2 -2
- package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
- package/dist/patterns/index.d.cts +1 -1
- package/dist/patterns/index.d.ts +1 -1
- package/dist/primitives/Accordion/index.cjs +6 -2
- package/dist/primitives/Accordion/index.cjs.map +1 -1
- package/dist/primitives/Accordion/index.js +6 -2
- package/dist/primitives/Accordion/index.js.map +1 -1
- package/dist/primitives/Alert/index.cjs +2 -1
- package/dist/primitives/Alert/index.cjs.map +1 -1
- package/dist/primitives/Alert/index.js +1 -1
- package/dist/primitives/AlertDialog/index.cjs +1 -1
- package/dist/primitives/AlertDialog/index.js +1 -1
- package/dist/primitives/AspectRatio/index.cjs +1 -1
- package/dist/primitives/AspectRatio/index.js +1 -1
- package/dist/primitives/Avatar/index.cjs +1 -1
- package/dist/primitives/Avatar/index.js +1 -1
- package/dist/primitives/Badge/index.cjs +3 -2
- package/dist/primitives/Badge/index.cjs.map +1 -1
- package/dist/primitives/Badge/index.js +2 -2
- package/dist/primitives/Breadcrumb/index.cjs +7 -3
- package/dist/primitives/Breadcrumb/index.cjs.map +1 -1
- package/dist/primitives/Breadcrumb/index.js +7 -3
- package/dist/primitives/Breadcrumb/index.js.map +1 -1
- package/dist/primitives/Button/index.cjs +3 -2
- package/dist/primitives/Button/index.cjs.map +1 -1
- package/dist/primitives/Button/index.js +2 -2
- package/dist/primitives/ButtonGroup/index.cjs +3 -2
- package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
- package/dist/primitives/ButtonGroup/index.js +2 -2
- package/dist/primitives/Calendar/index.cjs +12 -11
- package/dist/primitives/Calendar/index.cjs.map +1 -1
- package/dist/primitives/Calendar/index.js +12 -11
- package/dist/primitives/Calendar/index.js.map +1 -1
- package/dist/primitives/Card/index.cjs +2 -1
- package/dist/primitives/Card/index.cjs.map +1 -1
- package/dist/primitives/Card/index.js +1 -1
- package/dist/primitives/Carousel/index.cjs +4 -3
- package/dist/primitives/Carousel/index.cjs.map +1 -1
- package/dist/primitives/Carousel/index.js +4 -3
- package/dist/primitives/Carousel/index.js.map +1 -1
- package/dist/primitives/Checkbox/index.cjs +9 -2
- package/dist/primitives/Checkbox/index.cjs.map +1 -1
- package/dist/primitives/Checkbox/index.js +9 -2
- package/dist/primitives/Checkbox/index.js.map +1 -1
- package/dist/primitives/CheckboxTree/index.cjs +6 -2
- package/dist/primitives/CheckboxTree/index.cjs.map +1 -1
- package/dist/primitives/CheckboxTree/index.js +6 -2
- package/dist/primitives/CheckboxTree/index.js.map +1 -1
- package/dist/primitives/Collapsible/index.cjs +1 -1
- package/dist/primitives/Collapsible/index.js +1 -1
- package/dist/primitives/Command/index.cjs +6 -2
- package/dist/primitives/Command/index.cjs.map +1 -1
- package/dist/primitives/Command/index.js +6 -2
- package/dist/primitives/Command/index.js.map +1 -1
- package/dist/primitives/ContextMenu/index.cjs +14 -4
- package/dist/primitives/ContextMenu/index.cjs.map +1 -1
- package/dist/primitives/ContextMenu/index.js +14 -4
- package/dist/primitives/ContextMenu/index.js.map +1 -1
- package/dist/primitives/Credits/index.cjs +8 -3
- package/dist/primitives/Credits/index.cjs.map +1 -1
- package/dist/primitives/Credits/index.js +7 -3
- package/dist/primitives/Credits/index.js.map +1 -1
- package/dist/primitives/Dialog/index.cjs +3 -2
- package/dist/primitives/Dialog/index.cjs.map +1 -1
- package/dist/primitives/Dialog/index.js +3 -2
- package/dist/primitives/Dialog/index.js.map +1 -1
- package/dist/primitives/DropdownMenu/index.cjs +14 -4
- package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
- package/dist/primitives/DropdownMenu/index.js +14 -4
- package/dist/primitives/DropdownMenu/index.js.map +1 -1
- package/dist/primitives/Empty/index.cjs +1 -1
- package/dist/primitives/Empty/index.js +1 -1
- package/dist/primitives/Field/index.cjs +1 -1
- package/dist/primitives/Field/index.js +1 -1
- package/dist/primitives/Form/index.cjs +1 -1
- package/dist/primitives/Form/index.js +1 -1
- package/dist/primitives/Heading/index.cjs +2 -1
- package/dist/primitives/Heading/index.cjs.map +1 -1
- package/dist/primitives/Heading/index.js +1 -1
- package/dist/primitives/HoverCard/index.cjs +1 -1
- package/dist/primitives/HoverCard/index.js +1 -1
- package/dist/primitives/InfoBanner/index.cjs +6 -3
- package/dist/primitives/InfoBanner/index.cjs.map +1 -1
- package/dist/primitives/InfoBanner/index.js +5 -3
- package/dist/primitives/InfoBanner/index.js.map +1 -1
- package/dist/primitives/Input/index.cjs +2 -1
- package/dist/primitives/Input/index.cjs.map +1 -1
- package/dist/primitives/Input/index.js +1 -1
- package/dist/primitives/InputGroup/index.cjs +1 -1
- package/dist/primitives/InputGroup/index.js +1 -1
- package/dist/primitives/InputOtp/index.cjs +3 -2
- package/dist/primitives/InputOtp/index.cjs.map +1 -1
- package/dist/primitives/InputOtp/index.js +3 -2
- package/dist/primitives/InputOtp/index.js.map +1 -1
- package/dist/primitives/Item/index.cjs +2 -2
- package/dist/primitives/Item/index.js +2 -2
- package/dist/primitives/Label/index.cjs +1 -1
- package/dist/primitives/Label/index.js +1 -1
- package/dist/primitives/Link/index.cjs +3 -2
- package/dist/primitives/Link/index.cjs.map +1 -1
- package/dist/primitives/Link/index.js +2 -2
- package/dist/primitives/Menubar/index.cjs +14 -4
- package/dist/primitives/Menubar/index.cjs.map +1 -1
- package/dist/primitives/Menubar/index.js +14 -4
- package/dist/primitives/Menubar/index.js.map +1 -1
- package/dist/primitives/NativeSelect/index.cjs +6 -3
- package/dist/primitives/NativeSelect/index.cjs.map +1 -1
- package/dist/primitives/NativeSelect/index.js +5 -3
- package/dist/primitives/NativeSelect/index.js.map +1 -1
- package/dist/primitives/NavigationMenu/index.cjs +5 -3
- package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
- package/dist/primitives/NavigationMenu/index.js +5 -3
- package/dist/primitives/NavigationMenu/index.js.map +1 -1
- package/dist/primitives/Pagination/index.cjs +6 -2
- package/dist/primitives/Pagination/index.cjs.map +1 -1
- package/dist/primitives/Pagination/index.js +6 -2
- package/dist/primitives/Pagination/index.js.map +1 -1
- package/dist/primitives/Popover/index.cjs +1 -1
- package/dist/primitives/Popover/index.js +1 -1
- package/dist/primitives/Progress/index.cjs +1 -1
- package/dist/primitives/Progress/index.js +1 -1
- package/dist/primitives/RadioGroup/index.cjs +6 -2
- package/dist/primitives/RadioGroup/index.cjs.map +1 -1
- package/dist/primitives/RadioGroup/index.js +6 -2
- package/dist/primitives/RadioGroup/index.js.map +1 -1
- package/dist/primitives/Resizable/index.cjs +6 -2
- package/dist/primitives/Resizable/index.cjs.map +1 -1
- package/dist/primitives/Resizable/index.js +6 -2
- package/dist/primitives/Resizable/index.js.map +1 -1
- package/dist/primitives/ScrollArea/index.cjs +1 -1
- package/dist/primitives/ScrollArea/index.js +1 -1
- package/dist/primitives/Select/index.cjs +18 -5
- package/dist/primitives/Select/index.cjs.map +1 -1
- package/dist/primitives/Select/index.js +18 -5
- package/dist/primitives/Select/index.js.map +1 -1
- package/dist/primitives/Separator/index.cjs +1 -1
- package/dist/primitives/Separator/index.js +1 -1
- package/dist/primitives/Sheet/index.cjs +6 -2
- package/dist/primitives/Sheet/index.cjs.map +1 -1
- package/dist/primitives/Sheet/index.js +6 -2
- package/dist/primitives/Sheet/index.js.map +1 -1
- package/dist/primitives/Slider/index.cjs +1 -1
- package/dist/primitives/Slider/index.js +1 -1
- package/dist/primitives/Sonner/index.cjs +22 -6
- package/dist/primitives/Sonner/index.cjs.map +1 -1
- package/dist/primitives/Sonner/index.js +22 -6
- package/dist/primitives/Sonner/index.js.map +1 -1
- package/dist/primitives/Spinner/index.cjs +4 -2
- package/dist/primitives/Spinner/index.cjs.map +1 -1
- package/dist/primitives/Spinner/index.js +4 -2
- package/dist/primitives/Spinner/index.js.map +1 -1
- package/dist/primitives/Switch/index.cjs +1 -1
- package/dist/primitives/Switch/index.js +1 -1
- package/dist/primitives/Tabs/index.cjs +2 -2
- package/dist/primitives/Tabs/index.js +2 -2
- package/dist/primitives/Text/index.cjs +2 -1
- package/dist/primitives/Text/index.cjs.map +1 -1
- package/dist/primitives/Text/index.js +1 -1
- package/dist/primitives/Textarea/index.cjs +2 -1
- package/dist/primitives/Textarea/index.cjs.map +1 -1
- package/dist/primitives/Textarea/index.js +1 -1
- package/dist/primitives/Toggle/index.cjs +3 -2
- package/dist/primitives/Toggle/index.cjs.map +1 -1
- package/dist/primitives/Toggle/index.js +2 -2
- package/dist/primitives/ToggleGroup/index.cjs +1 -1
- package/dist/primitives/ToggleGroup/index.js +1 -1
- package/dist/primitives/Tooltip/index.cjs +1 -1
- package/dist/primitives/Tooltip/index.js +1 -1
- package/dist/primitives/index.cjs +1 -1
- package/dist/primitives/index.js +1 -1
- package/package.json +2 -1
package/dist/Header.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { t as cn } from "./cn.js";
|
|
2
|
+
import { t as Icon } from "./Icon.js";
|
|
2
3
|
import { Button } from "./primitives/Button/index.js";
|
|
3
4
|
import { Avatar, AvatarFallback } from "./primitives/Avatar/index.js";
|
|
4
5
|
import { Credits } from "./primitives/Credits/index.js";
|
|
@@ -9,8 +10,8 @@ import { Popover, PopoverContent, PopoverTrigger } from "./primitives/Popover/in
|
|
|
9
10
|
import { Skeleton } from "./primitives/Skeleton/index.js";
|
|
10
11
|
import { useTheme } from "./primitives/ThemeProvider/index.js";
|
|
11
12
|
import * as React from "react";
|
|
12
|
-
import { Check, ChevronDown, ChevronRight, FolderOpen, LogOut, MessageSquareShare, Moon, Search, Sun, X } from "lucide-react";
|
|
13
13
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { Check, ChevronDown, ChevronRight, LogOut, MessageSquareShare, Moon, Search, Sun } from "lucide-react";
|
|
14
15
|
import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
|
|
15
16
|
//#region src/patterns/Header/project-tree.ts
|
|
16
17
|
/** True when a node with the given id exists anywhere in the tree. */
|
|
@@ -25,6 +26,14 @@ function findProjectName(tree, id) {
|
|
|
25
26
|
if (found) return found;
|
|
26
27
|
}
|
|
27
28
|
}
|
|
29
|
+
/** First selectable node in the tree (depth-first, skipping context-only ancestors). */
|
|
30
|
+
function firstSelectableProject(tree) {
|
|
31
|
+
for (const node of tree) {
|
|
32
|
+
if (!node.isContextOnly) return node;
|
|
33
|
+
const found = firstSelectableProject(node.children);
|
|
34
|
+
if (found) return found;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
28
37
|
/** Filter the tree to nodes matching `term`, preserving ancestors of matches. */
|
|
29
38
|
function filterTree(nodes, term) {
|
|
30
39
|
if (!term) return nodes;
|
|
@@ -66,7 +75,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
|
|
|
66
75
|
children: [projectLabel, ":"]
|
|
67
76
|
}),
|
|
68
77
|
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 flex-1" }),
|
|
69
|
-
/* @__PURE__ */ jsx(
|
|
78
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
79
|
+
as: ChevronDown,
|
|
80
|
+
className: "size-4 shrink-0 text-muted-txt opacity-40"
|
|
81
|
+
})
|
|
70
82
|
]
|
|
71
83
|
});
|
|
72
84
|
return /* @__PURE__ */ jsxs(Popover, {
|
|
@@ -87,7 +99,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
|
|
|
87
99
|
className: cn("max-w-36 truncate", selectedName ? "font-medium" : "text-muted-txt"),
|
|
88
100
|
children: selectedName ?? projectPlaceholder
|
|
89
101
|
}),
|
|
90
|
-
/* @__PURE__ */ jsx(
|
|
102
|
+
/* @__PURE__ */ jsx(Icon, {
|
|
103
|
+
as: ChevronDown,
|
|
104
|
+
className: "ml-1 size-4 shrink-0 text-muted-txt"
|
|
105
|
+
})
|
|
91
106
|
]
|
|
92
107
|
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
93
108
|
align: "start",
|
|
@@ -98,7 +113,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
|
|
|
98
113
|
className: "border-b p-2",
|
|
99
114
|
children: /* @__PURE__ */ jsxs("div", {
|
|
100
115
|
className: "relative",
|
|
101
|
-
children: [/* @__PURE__ */ jsx(
|
|
116
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
117
|
+
as: Search,
|
|
118
|
+
className: "absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-txt"
|
|
119
|
+
}), /* @__PURE__ */ jsx(Input, {
|
|
102
120
|
size: "sm",
|
|
103
121
|
className: "pl-8",
|
|
104
122
|
placeholder: searchPlaceholder,
|
|
@@ -140,7 +158,13 @@ function TreeNode({ node, depth, selectedId, onSelect, collapsedIds, onToggleCol
|
|
|
140
158
|
"aria-label": isCollapsed ? `Expand ${node.name}` : `Collapse ${node.name}`,
|
|
141
159
|
onClick: () => onToggleCollapse(node.id),
|
|
142
160
|
className: "shrink-0 text-muted-txt hover:text-primary-txt",
|
|
143
|
-
children: isCollapsed ? /* @__PURE__ */ jsx(
|
|
161
|
+
children: isCollapsed ? /* @__PURE__ */ jsx(Icon, {
|
|
162
|
+
as: ChevronRight,
|
|
163
|
+
className: "size-3.5"
|
|
164
|
+
}) : /* @__PURE__ */ jsx(Icon, {
|
|
165
|
+
as: ChevronDown,
|
|
166
|
+
className: "size-3.5"
|
|
167
|
+
})
|
|
144
168
|
}) : /* @__PURE__ */ jsx("span", { className: "inline-block w-3.5 shrink-0" }),
|
|
145
169
|
node.isContextOnly ? /* @__PURE__ */ jsx("span", {
|
|
146
170
|
className: "flex-1 text-left",
|
|
@@ -151,7 +175,10 @@ function TreeNode({ node, depth, selectedId, onSelect, collapsedIds, onToggleCol
|
|
|
151
175
|
className: "flex-1 text-left",
|
|
152
176
|
children: node.name
|
|
153
177
|
}),
|
|
154
|
-
isSelected && /* @__PURE__ */ jsx(
|
|
178
|
+
isSelected && /* @__PURE__ */ jsx(Icon, {
|
|
179
|
+
as: Check,
|
|
180
|
+
className: "ml-auto size-3.5 shrink-0 text-primary"
|
|
181
|
+
})
|
|
155
182
|
]
|
|
156
183
|
}), !isCollapsed && hasChildren && /* @__PURE__ */ jsx("div", {
|
|
157
184
|
role: "group",
|
|
@@ -176,16 +203,14 @@ const DEFAULT_LABELS = {
|
|
|
176
203
|
searchPlaceholder: "Search project",
|
|
177
204
|
emptyStateText: "No projects found",
|
|
178
205
|
profileMenuLabel: "Profile menu",
|
|
179
|
-
logoutLabel: "Logout"
|
|
180
|
-
overlayTitle: "Select a Project",
|
|
181
|
-
overlayDescription: "Choose a project to get started. You can change it anytime from the header."
|
|
206
|
+
logoutLabel: "Logout"
|
|
182
207
|
};
|
|
183
|
-
|
|
184
|
-
|
|
208
|
+
/** Hard cap on project pages fetched — guards against a runaway loop. */
|
|
209
|
+
const PROJECTS_MAX_PAGES = 40;
|
|
185
210
|
const PATHS = {
|
|
186
211
|
token: "/api/v1/studio-auth/sessions/token",
|
|
187
212
|
logout: "/api/v1/studio-auth/sessions/logout",
|
|
188
|
-
projects: (clientId) => `/api/v1/
|
|
213
|
+
projects: (clientId) => `/api/v1/client-projects/getAllProjects?limit=50&page=1&sort=name&sortOrder=ASC&clientId=${encodeURIComponent(clientId)}&metaData=true`,
|
|
189
214
|
credits: "/save/api/v1/users"
|
|
190
215
|
};
|
|
191
216
|
/** Join a base URL and path without doubling slashes. */
|
|
@@ -206,16 +231,77 @@ async function fetchToken(endpoints, fetcher) {
|
|
|
206
231
|
const { accessToken } = await res.json();
|
|
207
232
|
return accessToken;
|
|
208
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Return `url` with the `page` query param set to the given page (and `limit`
|
|
236
|
+
* backfilled when absent). Pagination stays owned by the header: host-provided
|
|
237
|
+
* endpoint URLs don't need — and can't break — the paging params. Handles
|
|
238
|
+
* absolute and relative URLs.
|
|
239
|
+
*/
|
|
240
|
+
function withPageParam(url, page) {
|
|
241
|
+
const isAbsolute = /^[a-z][a-z0-9+.-]*:\/\//i.test(url);
|
|
242
|
+
try {
|
|
243
|
+
const u = new URL(url, isAbsolute ? void 0 : "http://relative.invalid");
|
|
244
|
+
u.searchParams.set("page", String(page));
|
|
245
|
+
if (!u.searchParams.has("limit")) u.searchParams.set("limit", String(50));
|
|
246
|
+
return isAbsolute ? u.toString() : `${u.pathname}${u.search}${u.hash}`;
|
|
247
|
+
} catch {
|
|
248
|
+
return url;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** The `limit` query param already on a URL, else the default page size. */
|
|
252
|
+
function readLimitParam(url) {
|
|
253
|
+
try {
|
|
254
|
+
const limit = Number(new URL(url, "http://relative.invalid").searchParams.get("limit"));
|
|
255
|
+
return Number.isInteger(limit) && limit > 0 ? limit : 50;
|
|
256
|
+
} catch {
|
|
257
|
+
return 50;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** Total node count in a tree page (roots + descendants). */
|
|
261
|
+
function countNodes(tree) {
|
|
262
|
+
return tree.reduce((sum, node) => sum + 1 + countNodes(node.children ?? []), 0);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Merge a page's tree into the accumulated tree. Nodes repeated across pages
|
|
266
|
+
* (e.g. a context-only ancestor whose children span a page boundary) are
|
|
267
|
+
* merged by id instead of duplicated.
|
|
268
|
+
*/
|
|
269
|
+
function mergeTrees(into, page) {
|
|
270
|
+
for (const node of page) {
|
|
271
|
+
const existing = into.find((n) => n.id === node.id);
|
|
272
|
+
if (existing) mergeTrees(existing.children, node.children ?? []);
|
|
273
|
+
else into.push({
|
|
274
|
+
...node,
|
|
275
|
+
children: [...node.children ?? []]
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Fetch ALL pages of the paginated projects endpoint and merge them into a
|
|
281
|
+
* single tree, so users with more projects than one page still see everything.
|
|
282
|
+
* The response carries no pagination metadata, so the first page that comes
|
|
283
|
+
* back with fewer than `limit` nodes is treated as the last one.
|
|
284
|
+
*/
|
|
209
285
|
async function fetchProjects(endpoints, clientId, accessToken, fetcher) {
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
286
|
+
const projectsTree = [];
|
|
287
|
+
let organizationName;
|
|
288
|
+
const baseUrl = endpoints.projects(clientId);
|
|
289
|
+
const pageLimit = readLimitParam(baseUrl);
|
|
290
|
+
for (let page = 1; page <= PROJECTS_MAX_PAGES; page++) {
|
|
291
|
+
const res = await fetcher(withPageParam(baseUrl, page), {
|
|
292
|
+
credentials: "include",
|
|
293
|
+
headers: { Authorization: `Bearer ${accessToken}` }
|
|
294
|
+
});
|
|
295
|
+
if (!res.ok) throw new Error(`projects request failed: ${res.status}`);
|
|
296
|
+
const body = await res.json();
|
|
297
|
+
const pageTree = body.response?.data?.projectsTree ?? [];
|
|
298
|
+
mergeTrees(projectsTree, pageTree);
|
|
299
|
+
organizationName ??= body.response?.data?.organization?.name;
|
|
300
|
+
if (countNodes(pageTree) < pageLimit) break;
|
|
301
|
+
}
|
|
216
302
|
return {
|
|
217
|
-
projectsTree
|
|
218
|
-
organizationName
|
|
303
|
+
projectsTree,
|
|
304
|
+
organizationName
|
|
219
305
|
};
|
|
220
306
|
}
|
|
221
307
|
async function fetchCredits(endpoints, accessToken, fetcher) {
|
|
@@ -239,6 +325,8 @@ async function callLogout(endpoints, fetcher) {
|
|
|
239
325
|
//#endregion
|
|
240
326
|
//#region src/patterns/Header/storage.ts
|
|
241
327
|
const PROJECT_KEY = "ds-header-project";
|
|
328
|
+
const LAST_PROJECT_KEY = "lastSelectedProject";
|
|
329
|
+
const PROJECTS_CACHE_KEY = "ds-header-projects-cache";
|
|
242
330
|
function getStoredProject() {
|
|
243
331
|
try {
|
|
244
332
|
const raw = sessionStorage.getItem(PROJECT_KEY);
|
|
@@ -257,6 +345,52 @@ function clearStoredProject() {
|
|
|
257
345
|
sessionStorage.removeItem(PROJECT_KEY);
|
|
258
346
|
} catch {}
|
|
259
347
|
}
|
|
348
|
+
/** The project the user last explicitly selected, in any tab (localStorage). */
|
|
349
|
+
function getLastSelectedProject() {
|
|
350
|
+
try {
|
|
351
|
+
const raw = localStorage.getItem(LAST_PROJECT_KEY);
|
|
352
|
+
return raw ? JSON.parse(raw) : null;
|
|
353
|
+
} catch {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function setLastSelectedProject(project) {
|
|
358
|
+
try {
|
|
359
|
+
localStorage.setItem(LAST_PROJECT_KEY, JSON.stringify(project));
|
|
360
|
+
} catch {}
|
|
361
|
+
}
|
|
362
|
+
function projectsCacheKey(clientId, userId) {
|
|
363
|
+
return `${PROJECTS_CACHE_KEY}:${clientId}:${userId}`;
|
|
364
|
+
}
|
|
365
|
+
/** The session-cached projects result for this client + user, or null on miss. */
|
|
366
|
+
function getCachedProjects(clientId, userId) {
|
|
367
|
+
try {
|
|
368
|
+
const raw = sessionStorage.getItem(projectsCacheKey(clientId, userId));
|
|
369
|
+
if (!raw) return null;
|
|
370
|
+
const cached = JSON.parse(raw);
|
|
371
|
+
if (!Array.isArray(cached.projectsTree)) return null;
|
|
372
|
+
return {
|
|
373
|
+
projectsTree: cached.projectsTree,
|
|
374
|
+
organizationName: cached.organizationName
|
|
375
|
+
};
|
|
376
|
+
} catch {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
function setCachedProjects(clientId, userId, data) {
|
|
381
|
+
try {
|
|
382
|
+
sessionStorage.setItem(projectsCacheKey(clientId, userId), JSON.stringify(data));
|
|
383
|
+
} catch {}
|
|
384
|
+
}
|
|
385
|
+
/** Drop every cached projects entry (all clients/users) — used on logout. */
|
|
386
|
+
function clearCachedProjects() {
|
|
387
|
+
try {
|
|
388
|
+
for (let i = sessionStorage.length - 1; i >= 0; i--) {
|
|
389
|
+
const key = sessionStorage.key(i);
|
|
390
|
+
if (key?.startsWith(PROJECTS_CACHE_KEY)) sessionStorage.removeItem(key);
|
|
391
|
+
}
|
|
392
|
+
} catch {}
|
|
393
|
+
}
|
|
260
394
|
//#endregion
|
|
261
395
|
//#region src/patterns/Header/header-store.ts
|
|
262
396
|
function initialState() {
|
|
@@ -292,14 +426,22 @@ const headerStore = {
|
|
|
292
426
|
getServerSnapshot() {
|
|
293
427
|
return SERVER_SNAPSHOT;
|
|
294
428
|
},
|
|
295
|
-
/**
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
429
|
+
/**
|
|
430
|
+
* Set the selected project. `name` is best-effort; the Header backfills it from
|
|
431
|
+
* the tree. Explicit selections are also remembered in localStorage as the
|
|
432
|
+
* cross-tab default; pass `remember: false` for internal backfill/auto-select
|
|
433
|
+
* writes so they don't overwrite the user's last explicit choice.
|
|
434
|
+
*/
|
|
435
|
+
setProject(id, name = "", clientId, { remember = true } = {}) {
|
|
436
|
+
if (id) {
|
|
437
|
+
const project = {
|
|
438
|
+
id,
|
|
439
|
+
name,
|
|
440
|
+
clientId: clientId ?? state.clientId
|
|
441
|
+
};
|
|
442
|
+
setStoredProject(project);
|
|
443
|
+
if (remember) setLastSelectedProject(project);
|
|
444
|
+
} else clearStoredProject();
|
|
303
445
|
state = {
|
|
304
446
|
...state,
|
|
305
447
|
selectedProjectId: id,
|
|
@@ -432,7 +574,7 @@ function isSessionValid(environmentId) {
|
|
|
432
574
|
const TOGGLE_PROJECT_DROPDOWN_EVENT = "toggle-project-dropdown";
|
|
433
575
|
const DEFAULT_STALE_TIME = 5 * 6e4;
|
|
434
576
|
const DEFAULT_GC_TIME = 10 * 6e4;
|
|
435
|
-
function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInjectAccessToken: injectedToken, showProjectDropdown = false, showProfile = false, showOrg = false, showCredits = false, endpoints: endpointOverrides, fetcher: fetcherProp, staleTime = DEFAULT_STALE_TIME, gcTime = DEFAULT_GC_TIME, onProjectChange }) {
|
|
577
|
+
function useGlobalHeader({ apiBaseUrl, environmentId, clientId, defaultProjectId, _dangerouslyInjectAccessToken: injectedToken, showProjectDropdown = false, showProfile = false, showOrg = false, showCredits = false, endpoints: endpointOverrides, fetcher: fetcherProp, staleTime = DEFAULT_STALE_TIME, gcTime = DEFAULT_GC_TIME, onProjectChange }) {
|
|
436
578
|
const fetcher = React.useMemo(() => fetcherProp ?? ((input, init) => fetch(input, init)), [fetcherProp]);
|
|
437
579
|
const endpoints = React.useMemo(() => buildEndpoints(apiBaseUrl, endpointOverrides), [apiBaseUrl, endpointOverrides]);
|
|
438
580
|
const isAuthenticated = isSessionValid(environmentId);
|
|
@@ -450,15 +592,25 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
|
|
|
450
592
|
});
|
|
451
593
|
const token = injectedToken ?? tokenQuery.data;
|
|
452
594
|
const effectiveClientId = clientId ?? claims?.clientId;
|
|
595
|
+
const wantsProjects = showProjectDropdown || showOrg;
|
|
596
|
+
const userId = claims?.userId ?? "";
|
|
453
597
|
const projectsQuery = useQuery({
|
|
454
598
|
queryKey: [
|
|
455
599
|
"ds-header",
|
|
456
600
|
"projects",
|
|
457
601
|
effectiveClientId,
|
|
602
|
+
userId,
|
|
458
603
|
token
|
|
459
604
|
],
|
|
460
|
-
queryFn: () =>
|
|
461
|
-
|
|
605
|
+
queryFn: async () => {
|
|
606
|
+
const id = effectiveClientId;
|
|
607
|
+
const cached = getCachedProjects(id, userId);
|
|
608
|
+
if (cached) return cached;
|
|
609
|
+
const fresh = await fetchProjects(endpoints, id, token, fetcher);
|
|
610
|
+
setCachedProjects(id, userId, fresh);
|
|
611
|
+
return fresh;
|
|
612
|
+
},
|
|
613
|
+
enabled: isAuthenticated && !!token && !!effectiveClientId && wantsProjects,
|
|
462
614
|
staleTime,
|
|
463
615
|
gcTime
|
|
464
616
|
});
|
|
@@ -484,6 +636,10 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
|
|
|
484
636
|
}
|
|
485
637
|
}, [apiBaseUrl]);
|
|
486
638
|
const selection = useHeaderStore();
|
|
639
|
+
const onProjectChangeRef = React.useRef(onProjectChange);
|
|
640
|
+
React.useEffect(() => {
|
|
641
|
+
onProjectChangeRef.current = onProjectChange;
|
|
642
|
+
});
|
|
487
643
|
React.useEffect(() => {
|
|
488
644
|
if (effectiveClientId) headerStore.reconcileClient(effectiveClientId);
|
|
489
645
|
}, [effectiveClientId]);
|
|
@@ -491,13 +647,29 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
|
|
|
491
647
|
if (!projectsQuery.data) return;
|
|
492
648
|
const tree = projectsQuery.data.projectsTree;
|
|
493
649
|
const id = headerStore.getSnapshot().selectedProjectId;
|
|
494
|
-
if (id &&
|
|
495
|
-
else if (id) {
|
|
650
|
+
if (id && nodeExistsInTree(tree, id)) {
|
|
496
651
|
const name = findProjectName(tree, id);
|
|
497
|
-
if (name && name !== headerStore.getSnapshot().selectedProjectName) headerStore.setProject(id, name, effectiveClientId);
|
|
652
|
+
if (name && name !== headerStore.getSnapshot().selectedProjectName) headerStore.setProject(id, name, effectiveClientId, { remember: false });
|
|
653
|
+
} else {
|
|
654
|
+
const last = getLastSelectedProject();
|
|
655
|
+
const fallback = last && nodeExistsInTree(tree, last.id) ? {
|
|
656
|
+
id: last.id,
|
|
657
|
+
name: findProjectName(tree, last.id) ?? last.name
|
|
658
|
+
} : defaultProjectId && nodeExistsInTree(tree, defaultProjectId) ? {
|
|
659
|
+
id: defaultProjectId,
|
|
660
|
+
name: findProjectName(tree, defaultProjectId) ?? ""
|
|
661
|
+
} : firstSelectableProject(tree);
|
|
662
|
+
if (fallback) {
|
|
663
|
+
headerStore.setProject(fallback.id, fallback.name, effectiveClientId, { remember: false });
|
|
664
|
+
onProjectChangeRef.current?.(fallback.id);
|
|
665
|
+
} else if (id) headerStore.clearProject();
|
|
498
666
|
}
|
|
499
667
|
headerStore.setOrganization(projectsQuery.data.organizationName, effectiveClientId);
|
|
500
|
-
}, [
|
|
668
|
+
}, [
|
|
669
|
+
projectsQuery.data,
|
|
670
|
+
effectiveClientId,
|
|
671
|
+
defaultProjectId
|
|
672
|
+
]);
|
|
501
673
|
React.useEffect(() => {
|
|
502
674
|
if (creditsQuery.data !== void 0) headerStore.setCredits(creditsQuery.data);
|
|
503
675
|
}, [creditsQuery.data]);
|
|
@@ -508,6 +680,7 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
|
|
|
508
680
|
};
|
|
509
681
|
const logout = () => {
|
|
510
682
|
headerStore.clearProject();
|
|
683
|
+
clearCachedProjects();
|
|
511
684
|
callLogout(endpoints, fetcher);
|
|
512
685
|
};
|
|
513
686
|
const [projectDropdownVisible, setProjectDropdownVisible] = React.useState(showProjectDropdown);
|
|
@@ -532,7 +705,6 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
|
|
|
532
705
|
credits: selection.credits,
|
|
533
706
|
creditsHref,
|
|
534
707
|
projectDropdownVisible,
|
|
535
|
-
showOverlay: isAuthenticated && projectDropdownVisible && !selection.selectedProjectId,
|
|
536
708
|
selectProject,
|
|
537
709
|
logout
|
|
538
710
|
};
|
|
@@ -644,7 +816,7 @@ function Header(props) {
|
|
|
644
816
|
children: /* @__PURE__ */ jsx(HeaderInner, { ...props })
|
|
645
817
|
});
|
|
646
818
|
}
|
|
647
|
-
function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown = false, showProfile = false, showThemeSwitcher = false, showCredits = false, pageTitle, feedbackUrl, logoAddon,
|
|
819
|
+
function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown = false, showProfile = false, showThemeSwitcher = false, showCredits = false, pageTitle, feedbackUrl, logoAddon, actionsStart, actionsEnd, className, ...rest }) {
|
|
648
820
|
const { product } = useTheme();
|
|
649
821
|
const brand = logoType ?? product;
|
|
650
822
|
const state = useGlobalHeader({
|
|
@@ -658,8 +830,8 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
|
|
|
658
830
|
const showOrgUi = showOrg && state.isAuthenticated;
|
|
659
831
|
const showProfileUi = showProfile && state.isAuthenticated;
|
|
660
832
|
const showCreditsUi = showCredits && state.isAuthenticated && state.credits !== void 0;
|
|
661
|
-
const showActions = showThemeSwitcher || showProfileUi || showCreditsUi || !!feedbackUrl;
|
|
662
|
-
return /* @__PURE__ */ jsxs(
|
|
833
|
+
const showActions = showThemeSwitcher || showProfileUi || showCreditsUi || !!feedbackUrl || !!actionsStart || !!actionsEnd;
|
|
834
|
+
return /* @__PURE__ */ jsxs(HeaderBar, {
|
|
663
835
|
className,
|
|
664
836
|
children: [
|
|
665
837
|
/* @__PURE__ */ jsx(HeaderLogo, {
|
|
@@ -693,6 +865,7 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
|
|
|
693
865
|
showActions && /* @__PURE__ */ jsxs("div", {
|
|
694
866
|
className: "ml-auto flex items-center gap-2",
|
|
695
867
|
children: [
|
|
868
|
+
actionsStart,
|
|
696
869
|
feedbackUrl && /* @__PURE__ */ jsx(Button, {
|
|
697
870
|
variant: "ghost",
|
|
698
871
|
size: "icon",
|
|
@@ -715,78 +888,11 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
|
|
|
715
888
|
showProfileUi && /* @__PURE__ */ jsx(ProfileMenu, {
|
|
716
889
|
email: state.userEmail,
|
|
717
890
|
onLogout: state.logout
|
|
718
|
-
})
|
|
891
|
+
}),
|
|
892
|
+
actionsEnd
|
|
719
893
|
]
|
|
720
894
|
})
|
|
721
895
|
]
|
|
722
|
-
}), showProjectUi && state.showOverlay && /* @__PURE__ */ jsx(ProjectOverlay, {
|
|
723
|
-
organizationName: state.organizationName,
|
|
724
|
-
projectsTree: state.projectsTree,
|
|
725
|
-
selectedProjectId: state.selectedProjectId,
|
|
726
|
-
onSelect: state.selectProject,
|
|
727
|
-
isLoading: state.isProjectsLoading,
|
|
728
|
-
onClose: onCloseProjectOverlay
|
|
729
|
-
})] });
|
|
730
|
-
}
|
|
731
|
-
function ProjectOverlay({ organizationName, projectsTree, selectedProjectId, onSelect, isLoading, onClose }) {
|
|
732
|
-
return /* @__PURE__ */ jsx("div", {
|
|
733
|
-
role: "dialog",
|
|
734
|
-
"aria-modal": "true",
|
|
735
|
-
"aria-label": DEFAULT_LABELS.overlayTitle,
|
|
736
|
-
className: "fixed inset-0 z-50 flex items-center justify-center bg-primary-bg/80 backdrop-blur-sm",
|
|
737
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
738
|
-
className: "relative mx-1 flex w-full max-w-md flex-col items-center gap-6 rounded-16 border bg-glass-none-bg p-2 text-primary-txt shadow-xl",
|
|
739
|
-
children: [
|
|
740
|
-
/* @__PURE__ */ jsx(Button, {
|
|
741
|
-
variant: "ghost",
|
|
742
|
-
size: "icon",
|
|
743
|
-
onClick: onClose ?? (() => window.history.back()),
|
|
744
|
-
className: "absolute top-4 right-4",
|
|
745
|
-
"aria-label": "Close",
|
|
746
|
-
children: /* @__PURE__ */ jsx(X, { className: "size-5" })
|
|
747
|
-
}),
|
|
748
|
-
/* @__PURE__ */ jsxs("div", {
|
|
749
|
-
className: "flex flex-col items-center gap-3 text-center",
|
|
750
|
-
children: [
|
|
751
|
-
/* @__PURE__ */ jsx("div", {
|
|
752
|
-
className: "rounded-full bg-primary/10 p-4",
|
|
753
|
-
children: /* @__PURE__ */ jsx(FolderOpen, { className: "size-8 text-primary" })
|
|
754
|
-
}),
|
|
755
|
-
/* @__PURE__ */ jsx("h2", {
|
|
756
|
-
className: "font-semibold text-primary-txt text-xl",
|
|
757
|
-
children: DEFAULT_LABELS.overlayTitle
|
|
758
|
-
}),
|
|
759
|
-
/* @__PURE__ */ jsx("p", {
|
|
760
|
-
className: "text-muted-txt text-sm",
|
|
761
|
-
children: DEFAULT_LABELS.overlayDescription
|
|
762
|
-
})
|
|
763
|
-
]
|
|
764
|
-
}),
|
|
765
|
-
/* @__PURE__ */ jsxs("div", {
|
|
766
|
-
className: "flex w-full justify-center gap-2",
|
|
767
|
-
children: [organizationName && /* @__PURE__ */ jsxs("div", {
|
|
768
|
-
className: cn(PILL, "select-none"),
|
|
769
|
-
title: organizationName,
|
|
770
|
-
children: [/* @__PURE__ */ jsxs("span", {
|
|
771
|
-
className: "shrink-0 text-muted-txt",
|
|
772
|
-
children: [DEFAULT_LABELS.orgLabel, ":"]
|
|
773
|
-
}), /* @__PURE__ */ jsx("span", {
|
|
774
|
-
className: "max-w-52 truncate font-medium",
|
|
775
|
-
children: organizationName
|
|
776
|
-
})]
|
|
777
|
-
}), /* @__PURE__ */ jsx(ProjectPicker, {
|
|
778
|
-
projectsTree,
|
|
779
|
-
selectedProjectId,
|
|
780
|
-
onSelect,
|
|
781
|
-
projectLabel: DEFAULT_LABELS.projectLabel,
|
|
782
|
-
projectPlaceholder: DEFAULT_LABELS.projectPlaceholder,
|
|
783
|
-
searchPlaceholder: DEFAULT_LABELS.searchPlaceholder,
|
|
784
|
-
emptyStateText: DEFAULT_LABELS.emptyStateText,
|
|
785
|
-
isLoading
|
|
786
|
-
})]
|
|
787
|
-
})
|
|
788
|
-
]
|
|
789
|
-
})
|
|
790
896
|
});
|
|
791
897
|
}
|
|
792
898
|
//#endregion
|