@amboss/design-system 3.48.12 → 3.49.1

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 (119) hide show
  1. package/build/cjs/components/Internal/Panel/Panel.d.ts +36 -0
  2. package/build/cjs/components/Internal/Panel/Panel.js +1 -0
  3. package/build/cjs/components/Internal/Panel/index.d.ts +2 -0
  4. package/build/cjs/components/Internal/Panel/index.js +1 -0
  5. package/build/cjs/components/Internal/Sandwich/-types.d.ts +36 -0
  6. package/build/cjs/components/Internal/Sandwich/-types.js +1 -0
  7. package/build/cjs/components/Internal/Sandwich/Sandwich.d.ts +23 -0
  8. package/build/cjs/components/Internal/Sandwich/Sandwich.js +1 -0
  9. package/build/cjs/components/Internal/Sandwich/SandwichBody.d.ts +3 -0
  10. package/build/cjs/components/Internal/Sandwich/SandwichBody.js +1 -0
  11. package/build/cjs/components/Internal/Sandwich/SandwichFooter.d.ts +3 -0
  12. package/build/cjs/components/Internal/Sandwich/SandwichFooter.js +1 -0
  13. package/build/cjs/components/Internal/Sandwich/SandwichHeader.d.ts +3 -0
  14. package/build/cjs/components/Internal/Sandwich/SandwichHeader.js +1 -0
  15. package/build/cjs/components/Internal/Sandwich/useSandwichContext.d.ts +12 -0
  16. package/build/cjs/components/Internal/Sandwich/useSandwichContext.js +1 -0
  17. package/build/cjs/components/Layout/-constants.d.ts +30 -0
  18. package/build/cjs/components/Layout/-constants.js +1 -0
  19. package/build/cjs/components/Layout/-types.d.ts +214 -0
  20. package/build/cjs/components/Layout/-types.js +1 -0
  21. package/build/cjs/components/Layout/Content.d.ts +7 -0
  22. package/build/cjs/components/Layout/Content.js +1 -0
  23. package/build/cjs/components/Layout/Layout.d.ts +17 -0
  24. package/build/cjs/components/Layout/Layout.js +1 -0
  25. package/build/cjs/components/Layout/LayoutProvider.d.ts +15 -0
  26. package/build/cjs/components/Layout/LayoutProvider.js +1 -0
  27. package/build/cjs/components/Layout/LayoutVars.d.ts +18 -0
  28. package/build/cjs/components/Layout/LayoutVars.js +1 -0
  29. package/build/cjs/components/Layout/RightPanel.d.ts +9 -0
  30. package/build/cjs/components/Layout/RightPanel.js +1 -0
  31. package/build/cjs/components/Layout/RightPanelContainer.d.ts +3 -0
  32. package/build/cjs/components/Layout/RightPanelContainer.js +1 -0
  33. package/build/cjs/components/Layout/Sidebar.d.ts +8 -0
  34. package/build/cjs/components/Layout/Sidebar.js +1 -0
  35. package/build/cjs/components/Layout/Split.d.ts +7 -0
  36. package/build/cjs/components/Layout/Split.js +1 -0
  37. package/build/cjs/components/Layout/context.d.ts +22 -0
  38. package/build/cjs/components/Layout/context.js +1 -0
  39. package/build/cjs/components/Layout/index.d.ts +9 -0
  40. package/build/cjs/components/Layout/index.js +1 -0
  41. package/build/cjs/components/Layout/reducer.d.ts +5 -0
  42. package/build/cjs/components/Layout/reducer.js +1 -0
  43. package/build/cjs/components/Layout/registry.d.ts +31 -0
  44. package/build/cjs/components/Layout/registry.js +1 -0
  45. package/build/cjs/components/Layout/store.d.ts +10 -0
  46. package/build/cjs/components/Layout/store.js +1 -0
  47. package/build/cjs/components/Layout/useLayout.d.ts +7 -0
  48. package/build/cjs/components/Layout/useLayout.js +1 -0
  49. package/build/cjs/components/Layout/usePanelRefs.d.ts +19 -0
  50. package/build/cjs/components/Layout/usePanelRefs.js +1 -0
  51. package/build/cjs/components/Layout/usePortalContainerRefs.d.ts +20 -0
  52. package/build/cjs/components/Layout/usePortalContainerRefs.js +1 -0
  53. package/build/cjs/components/Layout/varStore.d.ts +17 -0
  54. package/build/cjs/components/Layout/varStore.js +1 -0
  55. package/build/cjs/components/NavBar/NavBarSubMenuContainer.js +1 -1
  56. package/build/cjs/components/NavBar/constants.d.ts +1 -0
  57. package/build/cjs/components/NavBar/constants.js +1 -1
  58. package/build/cjs/index.d.ts +1 -0
  59. package/build/cjs/index.js +1 -1
  60. package/build/esm/components/Internal/Panel/Panel.d.ts +36 -0
  61. package/build/esm/components/Internal/Panel/Panel.js +1 -0
  62. package/build/esm/components/Internal/Panel/index.d.ts +2 -0
  63. package/build/esm/components/Internal/Panel/index.js +1 -0
  64. package/build/esm/components/Internal/Sandwich/-types.d.ts +36 -0
  65. package/build/esm/components/Internal/Sandwich/-types.js +1 -0
  66. package/build/esm/components/Internal/Sandwich/Sandwich.d.ts +23 -0
  67. package/build/esm/components/Internal/Sandwich/Sandwich.js +1 -0
  68. package/build/esm/components/Internal/Sandwich/SandwichBody.d.ts +3 -0
  69. package/build/esm/components/Internal/Sandwich/SandwichBody.js +1 -0
  70. package/build/esm/components/Internal/Sandwich/SandwichFooter.d.ts +3 -0
  71. package/build/esm/components/Internal/Sandwich/SandwichFooter.js +1 -0
  72. package/build/esm/components/Internal/Sandwich/SandwichHeader.d.ts +3 -0
  73. package/build/esm/components/Internal/Sandwich/SandwichHeader.js +1 -0
  74. package/build/esm/components/Internal/Sandwich/useSandwichContext.d.ts +12 -0
  75. package/build/esm/components/Internal/Sandwich/useSandwichContext.js +1 -0
  76. package/build/esm/components/Layout/-constants.d.ts +30 -0
  77. package/build/esm/components/Layout/-constants.js +1 -0
  78. package/build/esm/components/Layout/-types.d.ts +214 -0
  79. package/build/esm/components/Layout/-types.js +1 -0
  80. package/build/esm/components/Layout/Content.d.ts +7 -0
  81. package/build/esm/components/Layout/Content.js +1 -0
  82. package/build/esm/components/Layout/Layout.d.ts +17 -0
  83. package/build/esm/components/Layout/Layout.js +1 -0
  84. package/build/esm/components/Layout/LayoutProvider.d.ts +15 -0
  85. package/build/esm/components/Layout/LayoutProvider.js +1 -0
  86. package/build/esm/components/Layout/LayoutVars.d.ts +18 -0
  87. package/build/esm/components/Layout/LayoutVars.js +1 -0
  88. package/build/esm/components/Layout/RightPanel.d.ts +9 -0
  89. package/build/esm/components/Layout/RightPanel.js +1 -0
  90. package/build/esm/components/Layout/RightPanelContainer.d.ts +3 -0
  91. package/build/esm/components/Layout/RightPanelContainer.js +1 -0
  92. package/build/esm/components/Layout/Sidebar.d.ts +8 -0
  93. package/build/esm/components/Layout/Sidebar.js +1 -0
  94. package/build/esm/components/Layout/Split.d.ts +7 -0
  95. package/build/esm/components/Layout/Split.js +1 -0
  96. package/build/esm/components/Layout/context.d.ts +22 -0
  97. package/build/esm/components/Layout/context.js +1 -0
  98. package/build/esm/components/Layout/index.d.ts +9 -0
  99. package/build/esm/components/Layout/index.js +1 -0
  100. package/build/esm/components/Layout/reducer.d.ts +5 -0
  101. package/build/esm/components/Layout/reducer.js +1 -0
  102. package/build/esm/components/Layout/registry.d.ts +31 -0
  103. package/build/esm/components/Layout/registry.js +1 -0
  104. package/build/esm/components/Layout/store.d.ts +10 -0
  105. package/build/esm/components/Layout/store.js +1 -0
  106. package/build/esm/components/Layout/useLayout.d.ts +7 -0
  107. package/build/esm/components/Layout/useLayout.js +1 -0
  108. package/build/esm/components/Layout/usePanelRefs.d.ts +19 -0
  109. package/build/esm/components/Layout/usePanelRefs.js +1 -0
  110. package/build/esm/components/Layout/usePortalContainerRefs.d.ts +20 -0
  111. package/build/esm/components/Layout/usePortalContainerRefs.js +1 -0
  112. package/build/esm/components/Layout/varStore.d.ts +17 -0
  113. package/build/esm/components/Layout/varStore.js +1 -0
  114. package/build/esm/components/NavBar/NavBarSubMenuContainer.js +1 -1
  115. package/build/esm/components/NavBar/constants.d.ts +1 -0
  116. package/build/esm/components/NavBar/constants.js +1 -1
  117. package/build/esm/index.d.ts +1 -0
  118. package/build/esm/index.js +1 -1
  119. package/package.json +2 -1
@@ -0,0 +1,12 @@
1
+ import type { SandwichEdges } from "./-types";
2
+ /**
3
+ * Context decouples the parts: `Body` reports edge visibility via `setEdges`,
4
+ * `Header` / `Footer` read `atTop` / `atBottom`. The link is the context, not
5
+ * child order, so the parts may be authored in any order.
6
+ */
7
+ export type SandwichContextValue = SandwichEdges & {
8
+ setEdges: (edges: Partial<SandwichEdges>) => void;
9
+ };
10
+ export declare const SandwichProvider: React.Provider<SandwichContextValue>;
11
+ /** Read the Sandwich context, or throw if used outside `<Sandwich>`. */
12
+ export declare function useSandwichContext(): SandwichContextValue;
@@ -0,0 +1 @@
1
+ import{createContext,useContext}from"react";let SandwichContext=createContext(null);export const SandwichProvider=SandwichContext.Provider;export function useSandwichContext(){let ctx=useContext(SandwichContext);if(!ctx)throw Error("Sandwich.Header / Sandwich.Footer / Sandwich.Body must be used within <Sandwich>.");return ctx}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Slot keys — the single source of truth. The key *types* (`SlotKey`,
3
+ * `SidePanelKey`, `PanelKey`) are derived from these const values below and
4
+ * re-exported by `-types.ts`, so the literals are written exactly once.
5
+ */
6
+ /** Slot keys as named constants — reference these instead of bare literals. */
7
+ export declare const Slot: {
8
+ readonly sidebar: "sidebar";
9
+ readonly content: "content";
10
+ readonly splitview: "splitview";
11
+ readonly rightPanel: "rightPanel";
12
+ };
13
+ /** Side panels (open/close), left + right. */
14
+ export declare const SIDE_PANELS: readonly ["sidebar", "rightPanel"];
15
+ /** Flex panels — content is always shown; splitview toggles. */
16
+ export declare const PANELS: readonly ["content", "splitview"];
17
+ /** Left-to-right panel order in the resizable row (the full slot set). */
18
+ export declare const PANEL_ORDER: readonly ["sidebar", "content", "splitview", "rightPanel"];
19
+ export type SlotKey = (typeof PANEL_ORDER)[number];
20
+ export type SidePanelKey = (typeof SIDE_PANELS)[number];
21
+ export type PanelKey = (typeof PANELS)[number];
22
+ /** Slide-animation timing. Injected on `:root` by `Layout.Provider` (`SlideVars`)
23
+ * from the theme's `navSlide` token; read by animated layout surfaces. */
24
+ export declare const SLIDE_VAR: {
25
+ readonly duration: "--ds-layout-slide-duration";
26
+ readonly easing: "--ds-layout-slide-easing";
27
+ };
28
+ /** Vertical offset for the right panel — set this (e.g. to a sticky subnav's
29
+ * height) and the panel tracks it; defaults to `0` when unset. */
30
+ export declare const SUBNAV_OFFSET_VAR = "--ds-layout-subnav-offset";
@@ -0,0 +1 @@
1
+ export const Slot={sidebar:"sidebar",content:"content",splitview:"splitview",rightPanel:"rightPanel"};export const SIDE_PANELS=[Slot.sidebar,Slot.rightPanel];export const PANELS=[Slot.content,Slot.splitview];export const PANEL_ORDER=[Slot.sidebar,Slot.content,Slot.splitview,Slot.rightPanel];export const SLIDE_VAR={duration:"--ds-layout-slide-duration",easing:"--ds-layout-slide-easing"};export const SUBNAV_OFFSET_VAR="--ds-layout-subnav-offset";
@@ -0,0 +1,214 @@
1
+ import type React from "react";
2
+ import type { PanelKey, SidePanelKey, SlotKey } from "./-constants";
3
+ import type { IconProps } from "../Icon/Icon";
4
+ /**
5
+ * Surface = compound components (`Layout.Sidebar` / `Layout.RightPanel` /
6
+ * `Layout.Content` / `Layout.Split`) + one control hook
7
+ * (`useLayout()`). The manager owns the open/collapsed/size state; components
8
+ * render per that state. State engine is replaceable (see `LayoutStore`).
9
+ *
10
+ * Slots (max 4 panels, max 3 visible at once — budget enforcement deferred):
11
+ * sidebar | content | splitview | rightPanel
12
+ */
13
+ /** A size: plain number = pixels; unitless string = percentage ("10%"). */
14
+ export type Size = number | string;
15
+ /**
16
+ * - `sidebar` — in-flow resizable panel.
17
+ * - `offcanvas` — detached desktop overlay. ⚠️ **RESERVED — not implemented yet.**
18
+ * Currently treated like `sidebar` (renders in-flow); the overlay
19
+ * implementation lands in a later commit.
20
+ */
21
+ export type Variant = "sidebar" | "offcanvas";
22
+ export type { PanelKey, SidePanelKey, SlotKey };
23
+ export type SidePanelState = {
24
+ kind: "sidePanel";
25
+ /** Shown vs hidden. */
26
+ visible: boolean;
27
+ /** Whether it can collapse at all. */
28
+ collapsible: boolean;
29
+ /** Render style. */
30
+ variant: Variant;
31
+ /** Current size (px number or "%" string). */
32
+ size?: Size;
33
+ /** Constraint from config (component prop overrides). */
34
+ minSize?: Size;
35
+ maxSize?: Size;
36
+ };
37
+ export type PanelState = {
38
+ kind: "panel";
39
+ /** content is always visible; splitview is toggleable. */
40
+ visible: boolean;
41
+ size?: Size;
42
+ /** Constraint from config (component prop overrides). */
43
+ minSize?: Size;
44
+ maxSize?: Size;
45
+ };
46
+ export type LayoutState = {
47
+ sidebar: SidePanelState;
48
+ rightPanel: SidePanelState;
49
+ content: PanelState;
50
+ splitview: PanelState;
51
+ };
52
+ export type SidePanelConfig = {
53
+ defaultVisible?: boolean;
54
+ collapsible?: boolean;
55
+ variant?: Variant;
56
+ defaultSize?: Size;
57
+ minSize?: Size;
58
+ maxSize?: Size;
59
+ };
60
+ export type PanelConfig = {
61
+ defaultVisible?: boolean;
62
+ defaultSize?: Size;
63
+ minSize?: Size;
64
+ maxSize?: Size;
65
+ };
66
+ export type LayoutConfig = {
67
+ sidebar?: SidePanelConfig;
68
+ rightPanel?: SidePanelConfig;
69
+ content?: PanelConfig;
70
+ splitview?: PanelConfig;
71
+ };
72
+ export type LayoutAction = {
73
+ type: "setVisible";
74
+ slot: SlotKey;
75
+ visible: boolean;
76
+ } | {
77
+ type: "setVariant";
78
+ panel: SidePanelKey;
79
+ variant: Variant;
80
+ } | {
81
+ type: "resize";
82
+ slot: SlotKey;
83
+ size: Size;
84
+ }
85
+ /** Restore one slot (or all, if omitted) to its config-default state.
86
+ * Page panels default hidden, so this also hides them — handy on unmount. */
87
+ | {
88
+ type: "reset";
89
+ slot?: SlotKey;
90
+ };
91
+ export type LayoutReducer = (state: LayoutState, action: LayoutAction,
92
+ /** Config-default state, used by the `reset` action. */
93
+ initial?: LayoutState) => LayoutState;
94
+ /**
95
+ * Replaceable state engine. Matches `useSyncExternalStore` + zustand/redux
96
+ * conventions. The manager depends only on this interface, so a zustand-backed
97
+ * store can be injected via `<LayoutProvider store={…}>`.
98
+ */
99
+ export type LayoutStore = {
100
+ getState: () => LayoutState;
101
+ dispatch: (action: LayoutAction) => void;
102
+ subscribe: (listener: () => void) => () => void;
103
+ };
104
+ export type LayoutStorage = {
105
+ getItem: (key: string) => string | null;
106
+ setItem: (key: string, value: string) => void;
107
+ };
108
+ export type SidePanelHandle = {
109
+ state: SidePanelState;
110
+ isVisible: boolean;
111
+ show: () => void;
112
+ hide: () => void;
113
+ resize: (size: Size) => void;
114
+ setVariant: (variant: Variant) => void;
115
+ /** Restore this slot to its config default (hides it for page panels). */
116
+ reset: () => void;
117
+ };
118
+ export type PanelHandle = {
119
+ state: PanelState;
120
+ isVisible: boolean;
121
+ show: () => void;
122
+ hide: () => void;
123
+ resize: (size: Size) => void;
124
+ /** Restore this slot to its config default (hides it for page panels). */
125
+ reset: () => void;
126
+ };
127
+ export type LayoutValue = {
128
+ state: LayoutState;
129
+ sidebar: SidePanelHandle;
130
+ rightPanel: SidePanelHandle;
131
+ content: PanelHandle;
132
+ splitview: PanelHandle;
133
+ };
134
+ export type SidePanelProps = {
135
+ children: React.ReactNode;
136
+ variant?: Variant;
137
+ collapsible?: boolean;
138
+ defaultSize?: Size;
139
+ minSize?: Size;
140
+ maxSize?: Size;
141
+ /** Called whenever the panel's visibility changes, with the new value. */
142
+ onVisibleChange?: (visible: boolean) => void;
143
+ };
144
+ export type ContentProps = {
145
+ children: React.ReactNode;
146
+ minSize?: Size;
147
+ maxSize?: Size;
148
+ };
149
+ export type SplitProps = {
150
+ children: React.ReactNode;
151
+ defaultSize?: Size;
152
+ minSize?: Size;
153
+ maxSize?: Size;
154
+ };
155
+ export type LayoutProviderProps = {
156
+ children: React.ReactNode;
157
+ config?: LayoutConfig;
158
+ store?: LayoutStore;
159
+ /** Persistence config for the whole layout namespace. The Provider does NOT
160
+ * read these — it publishes them to the nested `<Layout>` (which owns
161
+ * persistence). Kept here so consumers configure everything in one place. */
162
+ persistenceKey?: string;
163
+ storage?: LayoutStorage;
164
+ };
165
+ export type LayoutProps = {
166
+ children: React.ReactNode;
167
+ /** Persist panel SIZES (via react-resizable-panels), keyed by this. Open/
168
+ * visible/variant ("intent") persistence is separate and deferred. Falls
169
+ * back to the values on `Layout.Provider` when omitted. */
170
+ persistenceKey?: string;
171
+ storage?: LayoutStorage;
172
+ };
173
+ /**
174
+ * Title shown in the panel header. `label` always provides the panel's
175
+ * accessible name (even when the title block is visually hidden).
176
+ */
177
+ export type RightPanelContainerTitle = {
178
+ /** Visible label and the panel's accessible name. */
179
+ label: string;
180
+ /** Optional leading icon. */
181
+ icon?: IconProps;
182
+ /** Show the visible label+icon block. Default `true`. When `false` the block
183
+ * is hidden but `label` is still exposed as the accessible name. */
184
+ isVisible?: boolean;
185
+ };
186
+ export type RightPanelContainerSlotProps = {
187
+ /** Header slots around the title. */
188
+ header?: {
189
+ /** Rendered at the header start, before the title. */
190
+ leftSlot?: React.ReactNode;
191
+ /** Rendered at the header end, after the title and before the close button. */
192
+ rightSlot?: React.ReactNode;
193
+ };
194
+ /** Sticky footer content. Footer is omitted entirely when not provided. */
195
+ footer?: React.ReactNode;
196
+ /** Props for the always-rendered close button. */
197
+ closeButton: {
198
+ "aria-label": string;
199
+ };
200
+ };
201
+ export type RightPanelContainerProps = {
202
+ title: RightPanelContainerTitle;
203
+ /** Scrollable body content. */
204
+ children: React.ReactNode;
205
+ /** Called when the (always rendered) close button is clicked. */
206
+ onClose?: () => void;
207
+ slotProps: RightPanelContainerSlotProps;
208
+ /** Forwarded to the scrollable body element (scroll restoration etc.). */
209
+ scrollContainerRef?: React.Ref<HTMLDivElement>;
210
+ /** Forwarded to the scrollable body's scroll handler. */
211
+ onScroll?: React.UIEventHandler<HTMLDivElement>;
212
+ "data-e2e-test-id"?: string;
213
+ };
214
+ export type RightPanelProps = SidePanelProps & Omit<RightPanelContainerProps, "data-e2e-test-id">;
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,7 @@
1
+ import type React from "react";
2
+ import type { ContentProps } from "./-types";
3
+ /**
4
+ * Primary content panel. Always shown (never collapsible) and flexes to fill the
5
+ * space the side panels leave. Declares the `content` slot and portals into it.
6
+ */
7
+ export declare const Content: React.FC<ContentProps>;
@@ -0,0 +1 @@
1
+ import{Slot}from"./-constants";import{useDeclarePanel,useLayoutPortal}from"./registry";export const Content=({children,minSize,maxSize})=>(useDeclarePanel(Slot.content,{minSize,maxSize,collapsible:!1}),useLayoutPortal(Slot.content,children));
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { LayoutProvider } from "./LayoutProvider";
3
+ import { Content } from "./Content";
4
+ import { RightPanel } from "./RightPanel";
5
+ import { Sidebar } from "./Sidebar";
6
+ import { Split } from "./Split";
7
+ import type { LayoutProps } from "./-types";
8
+ declare function LayoutBase({ children, persistenceKey, storage, }: LayoutProps): React.ReactElement;
9
+ type LayoutComponent = typeof LayoutBase & {
10
+ Provider: typeof LayoutProvider;
11
+ Sidebar: typeof Sidebar;
12
+ RightPanel: typeof RightPanel;
13
+ Content: typeof Content;
14
+ Split: typeof Split;
15
+ };
16
+ export declare const Layout: LayoutComponent;
17
+ export {};
@@ -0,0 +1 @@
1
+ import React,{useMemo,useState}from"react";import styled from"@emotion/styled";import{Panel}from"../Internal/Panel/Panel";import{PANEL_ORDER,Slot}from"./-constants";import{useLayoutPersistence}from"./context";import{LayoutProvider}from"./LayoutProvider";import{Content}from"./Content";import{RightPanel}from"./RightPanel";import{Sidebar}from"./Sidebar";import{Split}from"./Split";import{LayoutPortalContext,PanelRegistryContext}from"./registry";import{usePortalContainerRefs}from"./usePortalContainerRefs";import{useLayout}from"./useLayout";let StyledLayout=styled("div",{target:"eu1s17s0",label:"StyledLayout"})({position:"relative",height:"100%",width:"100%"},"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjL2NvbXBvbmVudHMvTGF5b3V0L0xheW91dC50c3giLCJzb3VyY2VzIjpbInNyYy9jb21wb25lbnRzL0xheW91dC9MYXlvdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuLi9JbnRlcm5hbC9QYW5lbC9QYW5lbFwiO1xuaW1wb3J0IHR5cGUgeyBQYW5lbEl0ZW0gfSBmcm9tIFwiLi4vSW50ZXJuYWwvUGFuZWwvUGFuZWxcIjtcbmltcG9ydCB7IFBBTkVMX09SREVSLCBTbG90IH0gZnJvbSBcIi4vLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgdXNlTGF5b3V0UGVyc2lzdGVuY2UgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBMYXlvdXRQcm92aWRlciB9IGZyb20gXCIuL0xheW91dFByb3ZpZGVyXCI7XG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4vQ29udGVudFwiO1xuaW1wb3J0IHsgUmlnaHRQYW5lbCB9IGZyb20gXCIuL1JpZ2h0UGFuZWxcIjtcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tIFwiLi9TaWRlYmFyXCI7XG5pbXBvcnQgeyBTcGxpdCB9IGZyb20gXCIuL1NwbGl0XCI7XG5pbXBvcnQge1xuICBMYXlvdXRQb3J0YWxDb250ZXh0LFxuICBQYW5lbFJlZ2lzdHJ5Q29udGV4dCxcbiAgdHlwZSBQYW5lbFJlZyxcbiAgdHlwZSBQYW5lbFJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgdXNlUG9ydGFsQ29udGFpbmVyUmVmcyB9IGZyb20gXCIuL3VzZVBvcnRhbENvbnRhaW5lclJlZnNcIjtcbmltcG9ydCB7IHVzZUxheW91dCB9IGZyb20gXCIuL3VzZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgeyBMYXlvdXRQcm9wcywgU2l6ZSwgU2xvdEtleSB9IGZyb20gXCIuLy10eXBlc1wiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogTGF5b3V0IOKAlCByZWdpc3RyeSArIGhvc3RzOyBtYXJrZXJzIGRlY2xhcmUvcG9ydGFsOyB0aGUgcmVzaXphYmxlIHBhbmVsIHJvdyAgICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5jb25zdCBTdHlsZWRMYXlvdXQgPSBzdHlsZWQuZGl2KHtcbiAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgd2lkdGg6IFwiMTAwJVwiLFxufSk7XG5cbi8vIFNvbG8tbW9kZSBob3N0OiBhIGxvbmUgcGFuZWwgKG5vIHJlc2l6YWJsZSBzaWJsaW5nKSBpcyBob3N0ZWQgaGVyZSBpbnN0ZWFkIG9mXG4vLyBpbnNpZGUgcmVhY3QtcmVzaXphYmxlLXBhbmVscy4gTWF0Y2hlcyB0aGUgcGVyLXBhbmVsIGhvc3QgdGhlIEdyb3VwIHJlbmRlcnNcbi8vIChgcmVsYXRpdmVgICsgZnVsbC1ibGVlZCkgc28gY29udGVudCByZWZsb3dzL3Njcm9sbHMgaWRlbnRpY2FsbHkgZWl0aGVyIHdheS5cbmNvbnN0IFN0eWxlZFNvbG9Ib3N0ID0gc3R5bGVkLmRpdih7XG4gIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIHdpZHRoOiBcIjEwMCVcIixcbn0pO1xuXG5mdW5jdGlvbiBMYXlvdXRCYXNlKHtcbiAgY2hpbGRyZW4sXG4gIHBlcnNpc3RlbmNlS2V5LFxuICBzdG9yYWdlLFxufTogTGF5b3V0UHJvcHMpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCBbZGVjbGFyZWQsIHNldERlY2xhcmVkXSA9IHVzZVN0YXRlPFBhcnRpYWw8UmVjb3JkPFNsb3RLZXksIFBhbmVsUmVnPj4+KFxuICAgIHt9XG4gICk7XG4gIGNvbnN0IHsgc3RhdGU6IGxheW91dFN0YXRlLCAuLi5wYW5lbENhbGxiYWNrcyB9ID0gdXNlTGF5b3V0KCk7XG4gIGNvbnN0IHBlcnNpc3RlbmNlID0gdXNlTGF5b3V0UGVyc2lzdGVuY2UoKTtcbiAgY29uc3QgcmVzb2x2ZWRLZXkgPSBwZXJzaXN0ZW5jZUtleSA/PyBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZUtleTtcbiAgY29uc3QgcmVzb2x2ZWRTdG9yYWdlID0gc3RvcmFnZSA/PyBwZXJzaXN0ZW5jZS5zdG9yYWdlO1xuXG4gIGNvbnN0IGlzU2hvd24gPSAoc2xvdDogU2xvdEtleSk6IGJvb2xlYW4gPT4gbGF5b3V0U3RhdGVbc2xvdF0udmlzaWJsZTtcblxuICBjb25zdCByZWdpc3RyeSA9IHVzZU1lbW88UGFuZWxSZWdpc3RyeT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIHJlZ2lzdGVyOiAoc2xvdCwgcmVnKSA9PlxuICAgICAgICBzZXREZWNsYXJlZCgocHJldikgPT4gKHsgLi4ucHJldiwgW3Nsb3RdOiByZWcgfSkpLFxuICAgICAgdW5yZWdpc3RlcjogKHNsb3QpID0+XG4gICAgICAgIHNldERlY2xhcmVkKChwcmV2KSA9PiB7XG4gICAgICAgICAgaWYgKCEoc2xvdCBpbiBwcmV2KSkgcmV0dXJuIHByZXY7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHsgLi4ucHJldiB9O1xuICAgICAgICAgIGRlbGV0ZSBuZXh0W3Nsb3RdO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9KSxcbiAgICB9KSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IFtub2RlcywgaG9zdFJlZnNdID0gdXNlUG9ydGFsQ29udGFpbmVyUmVmcyhQQU5FTF9PUkRFUik7XG5cbiAgLy8gUGFuZWxzIHRoYXQgZXhpc3QgaW4gdGhlIGxheW91dCwgcmVnYXJkbGVzcyBvZiB2aXNpYmlsaXR5LiBEcml2ZXMgdGhlXG4gIC8vIHNvbG8tdnMtcmVzaXphYmxlIGRlY2lzaW9uIGJlbG93IOKAlCBrZXllZCBvbiBERUNMQVJFRCAobm90IHNob3duKSBzbyB0aGF0XG4gIC8vIHNob3dpbmcvaGlkaW5nIGEgcGFuZWwgbmV2ZXIgZmxpcHMgdGhlIG1vZGUuXG4gIGNvbnN0IGRlY2xhcmVkU2xvdHMgPSBQQU5FTF9PUkRFUi5maWx0ZXIoKHNsb3QpID0+IGRlY2xhcmVkW3Nsb3RdKTtcblxuICAvLyBTb2xvIG1vZGU6IGEgc2luZ2xlIHBhbmVsIGlzIGRlY2xhcmVkIChlLmcuIGp1c3QgYENvbnRlbnRgLCB3aXRoIG5vXG4gIC8vIFJpZ2h0UGFuZWwvU2lkZWJhci9TcGxpdCBpbiB0aGUgdHJlZSkg4oCUIG5vdGhpbmcgdG8gcmVzaXplIGFnYWluc3QsIHNvIGhvc3RcbiAgLy8gaXQgaW4gYSBwbGFpbiBkaXYgYW5kIHNraXAgcmVhY3QtcmVzaXphYmxlLXBhbmVscyBlbnRpcmVseS4gQmVjYXVzZSB0aGVcbiAgLy8gY2hlY2sgaXMgb24gREVDTEFSRUQgcGFuZWxzLCB0b2dnbGluZyBhICpkZWNsYXJlZCogcGFuZWwncyB2aXNpYmlsaXR5IGtlZXBzXG4gIC8vIHRoZSBtb2RlIHN0YWJsZSwgc28gYENvbnRlbnRgIGlzIG5ldmVyIHJlbW91bnRlZCBieSBhIHNob3cvaGlkZS4gVGhlIG1vZGVcbiAgLy8gb25seSBmbGlwcyB3aGVuIGEgcGFuZWwgbWFya2VyIGlzIGFkZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIChhXG4gIC8vIHN0cnVjdHVyYWwgY2hhbmdlKSwgd2hlcmUgYSBvbmUtdGltZSByZW1vdW50IGlzIGFjY2VwdGFibGUuXG4gIGNvbnN0IGlzU29sbyA9IGRlY2xhcmVkU2xvdHMubGVuZ3RoIDw9IDE7XG4gIGNvbnN0IHNvbG9TbG90ID0gZGVjbGFyZWRTbG90c1swXTtcblxuICAvLyBjb250ZW50IGZsZXhlcyAobm8gZml4ZWQgc2l6ZSk7IG90aGVycyB1c2UgdGhlIGRlY2xhcmVkIGRlZmF1bHQsIGZhbGxpbmdcbiAgLy8gYmFjayB0byB0aGUgcGVyc2lzdGVkL2NvbmZpZyBzaXplLlxuICBjb25zdCBkZWZhdWx0U2l6ZUZvciA9IChzbG90OiBTbG90S2V5KTogU2l6ZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHNsb3QgPT09IFNsb3QuY29udGVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZGVjbGFyZWRbc2xvdF0/LmRlZmF1bHRTaXplID8/IGxheW91dFN0YXRlW3Nsb3RdLnNpemU7XG4gIH07XG5cbiAgLy8gT25seSB0aGUgcGFuZWxzIHRoYXQgYXJlIGRlY2xhcmVkIEFORCBjdXJyZW50bHkgc2hvd24uIENsb3NlZC9oaWRkZW4gcGFuZWxzXG4gIC8vIGFyZSBub3QgcmVuZGVyZWQgYXQgYWxsIOKAlCBubyByZXNlcnZlZCBzcGFjZS5cbiAgY29uc3QgcGFuZWxJdGVtczogUGFuZWxJdGVtW10gPSBQQU5FTF9PUkRFUi5maWx0ZXIoXG4gICAgKHNsb3QpID0+IGRlY2xhcmVkW3Nsb3RdICYmIGlzU2hvd24oc2xvdClcbiAgKS5tYXAoKHNsb3QpID0+ICh7XG4gICAgaWQ6IHNsb3QsXG4gICAgZGVmYXVsdFNpemU6IGRlZmF1bHRTaXplRm9yKHNsb3QpLFxuICAgIG1pblNpemU6IGRlY2xhcmVkW3Nsb3RdPy5taW5TaXplID8/IGxheW91dFN0YXRlW3Nsb3RdLm1pblNpemUsXG4gICAgbWF4U2l6ZTogZGVjbGFyZWRbc2xvdF0/Lm1heFNpemUgPz8gbGF5b3V0U3RhdGVbc2xvdF0ubWF4U2l6ZSxcbiAgICBjb2xsYXBzaWJsZTogc2xvdCAhPT0gU2xvdC5jb250ZW50ICYmIChkZWNsYXJlZFtzbG90XT8uY29sbGFwc2libGUgPz8gdHJ1ZSksXG4gIH0pKTtcblxuICByZXR1cm4gKFxuICAgIDxQYW5lbFJlZ2lzdHJ5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17cmVnaXN0cnl9PlxuICAgICAgPExheW91dFBvcnRhbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e25vZGVzfT5cbiAgICAgICAgPFN0eWxlZExheW91dCBkYXRhLWRzLWlkPVwiTGF5b3V0XCI+XG4gICAgICAgICAge2lzU29sb1xuICAgICAgICAgICAgPyAvLyBMb25lIHBhbmVsIOKAlCBob3N0IGl0IGluIGEgcGxhaW4gZGl2LCBubyByZXNpemFibGUgR3JvdXAuIEhpZGRlblxuICAgICAgICAgICAgICAvLyBsb25lIHBhbmVscyByZW5kZXIgbm90aGluZyAoQ29udGVudCBpcyBhbHdheXMgc2hvd24pLlxuICAgICAgICAgICAgICBzb2xvU2xvdCAmJlxuICAgICAgICAgICAgICBpc1Nob3duKHNvbG9TbG90KSAmJiA8U3R5bGVkU29sb0hvc3QgcmVmPXtob3N0UmVmc1tzb2xvU2xvdF19IC8+XG4gICAgICAgICAgICA6IHBhbmVsSXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgLy8gYGtleWAgPSB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlLiByZWFjdC1yZXNpemFibGUtcGFuZWxzXG4gICAgICAgICAgICAgICAgLy8gcmVhZHMgc3RvcmVkIHNpemVzIG9ubHkgb24gbW91bnQsIGFuZCB0aGlzIGdyb3VwIHN0YXlzXG4gICAgICAgICAgICAgICAgLy8gbW91bnRlZCBhY3Jvc3MgbmF2aWdhdGlvbiDigJQgc28gcmVtb3VudCBpdCB3aGVuIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIHRvIGxvYWQgVEhBVCBpbnN0YW5jZSdzIHNpemVzLiBVc2UgY2FzZTpcbiAgICAgICAgICAgICAgICAvLyBwZXItcm91dGUvcGVyLWluc3RhbmNlIHNpemUgbWVtb3J5IChlLmcuXG4gICAgICAgICAgICAgICAgLy8gYHBlcnNpc3RlbmNlS2V5PXtgbGF5b3V0OiR7cm91dGVJZH1gfWApIOKAlCBkcmFnIHRoZSBjaGF0IHdpZGVcbiAgICAgICAgICAgICAgICAvLyBvbiBwYWdlIEEsIHN3aXRjaCB0byBwYWdlIEIgKGl0cyBvd24gd2lkdGhzKSwgY29tZSBiYWNrIHRvIEFcbiAgICAgICAgICAgICAgICAvLyBhbmQgZmluZCBBJ3Mgd2lkdGhzIHJlc3RvcmVkLiBUaGUga2V5IG9ubHkgY2hhbmdlcyBvblxuICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlIHN3aXRjaCwgbmV2ZXIgb24gcGFuZWwgb3Blbi9jbG9zZSwgc28gbm9ybWFsXG4gICAgICAgICAgICAgICAgLy8gdG9nZ2xpbmcgc3RheXMgcmVtb3VudC1mcmVlLlxuICAgICAgICAgICAgICAgIDxQYW5lbFxuICAgICAgICAgICAgICAgICAga2V5PXtyZXNvbHZlZEtleX1cbiAgICAgICAgICAgICAgICAgIHBhbmVscz17cGFuZWxJdGVtc31cbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlS2V5PXtyZXNvbHZlZEtleX1cbiAgICAgICAgICAgICAgICAgIHN0b3JhZ2U9e3Jlc29sdmVkU3RvcmFnZX1cbiAgICAgICAgICAgICAgICAgIGhvc3RGb3I9eyhpZCkgPT4gaG9zdFJlZnNbaWQgYXMgU2xvdEtleV19XG4gICAgICAgICAgICAgICAgICBvblJlc2l6ZT17KGlkLCBzaXplKSA9PlxuICAgICAgICAgICAgICAgICAgICBwYW5lbENhbGxiYWNrc1tpZCBhcyBTbG90S2V5XS5yZXNpemUoc2l6ZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9uQ29sbGFwc2U9eyhpZCkgPT4gcGFuZWxDYWxsYmFja3NbaWQgYXMgU2xvdEtleV0uaGlkZSgpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1N0eWxlZExheW91dD5cbiAgICAgIDwvTGF5b3V0UG9ydGFsQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1BhbmVsUmVnaXN0cnlDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogUHVibGljIExheW91dCDigJQgdGhlIHJlc2l6YWJsZSBwYW5lbCByb3cgKyBjb21wb3VuZCBwYXJ0cyBhcyBzdGF0aWNzICAgICAgICAgKi9cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTGF5b3V0Q29tcG9uZW50ID0gdHlwZW9mIExheW91dEJhc2UgJiB7XG4gIFByb3ZpZGVyOiB0eXBlb2YgTGF5b3V0UHJvdmlkZXI7XG4gIFNpZGViYXI6IHR5cGVvZiBTaWRlYmFyO1xuICBSaWdodFBhbmVsOiB0eXBlb2YgUmlnaHRQYW5lbDtcbiAgQ29udGVudDogdHlwZW9mIENvbnRlbnQ7XG4gIFNwbGl0OiB0eXBlb2YgU3BsaXQ7XG59O1xuXG5leHBvcnQgY29uc3QgTGF5b3V0ID0gTGF5b3V0QmFzZSBhcyBMYXlvdXRDb21wb25lbnQ7XG5cbkxheW91dC5Qcm92aWRlciA9IExheW91dFByb3ZpZGVyO1xuTGF5b3V0LlNpZGViYXIgPSBTaWRlYmFyO1xuTGF5b3V0LlJpZ2h0UGFuZWwgPSBSaWdodFBhbmVsO1xuTGF5b3V0LkNvbnRlbnQgPSBDb250ZW50O1xuTGF5b3V0LlNwbGl0ID0gU3BsaXQ7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUJxQiJ9 */"),StyledSoloHost=styled("div",{target:"eu1s17s1",label:"StyledSoloHost"})({position:"relative",height:"100%",width:"100%"},"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjL2NvbXBvbmVudHMvTGF5b3V0L0xheW91dC50c3giLCJzb3VyY2VzIjpbInNyYy9jb21wb25lbnRzL0xheW91dC9MYXlvdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuLi9JbnRlcm5hbC9QYW5lbC9QYW5lbFwiO1xuaW1wb3J0IHR5cGUgeyBQYW5lbEl0ZW0gfSBmcm9tIFwiLi4vSW50ZXJuYWwvUGFuZWwvUGFuZWxcIjtcbmltcG9ydCB7IFBBTkVMX09SREVSLCBTbG90IH0gZnJvbSBcIi4vLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgdXNlTGF5b3V0UGVyc2lzdGVuY2UgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBMYXlvdXRQcm92aWRlciB9IGZyb20gXCIuL0xheW91dFByb3ZpZGVyXCI7XG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4vQ29udGVudFwiO1xuaW1wb3J0IHsgUmlnaHRQYW5lbCB9IGZyb20gXCIuL1JpZ2h0UGFuZWxcIjtcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tIFwiLi9TaWRlYmFyXCI7XG5pbXBvcnQgeyBTcGxpdCB9IGZyb20gXCIuL1NwbGl0XCI7XG5pbXBvcnQge1xuICBMYXlvdXRQb3J0YWxDb250ZXh0LFxuICBQYW5lbFJlZ2lzdHJ5Q29udGV4dCxcbiAgdHlwZSBQYW5lbFJlZyxcbiAgdHlwZSBQYW5lbFJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgdXNlUG9ydGFsQ29udGFpbmVyUmVmcyB9IGZyb20gXCIuL3VzZVBvcnRhbENvbnRhaW5lclJlZnNcIjtcbmltcG9ydCB7IHVzZUxheW91dCB9IGZyb20gXCIuL3VzZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgeyBMYXlvdXRQcm9wcywgU2l6ZSwgU2xvdEtleSB9IGZyb20gXCIuLy10eXBlc1wiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogTGF5b3V0IOKAlCByZWdpc3RyeSArIGhvc3RzOyBtYXJrZXJzIGRlY2xhcmUvcG9ydGFsOyB0aGUgcmVzaXphYmxlIHBhbmVsIHJvdyAgICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5jb25zdCBTdHlsZWRMYXlvdXQgPSBzdHlsZWQuZGl2KHtcbiAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgd2lkdGg6IFwiMTAwJVwiLFxufSk7XG5cbi8vIFNvbG8tbW9kZSBob3N0OiBhIGxvbmUgcGFuZWwgKG5vIHJlc2l6YWJsZSBzaWJsaW5nKSBpcyBob3N0ZWQgaGVyZSBpbnN0ZWFkIG9mXG4vLyBpbnNpZGUgcmVhY3QtcmVzaXphYmxlLXBhbmVscy4gTWF0Y2hlcyB0aGUgcGVyLXBhbmVsIGhvc3QgdGhlIEdyb3VwIHJlbmRlcnNcbi8vIChgcmVsYXRpdmVgICsgZnVsbC1ibGVlZCkgc28gY29udGVudCByZWZsb3dzL3Njcm9sbHMgaWRlbnRpY2FsbHkgZWl0aGVyIHdheS5cbmNvbnN0IFN0eWxlZFNvbG9Ib3N0ID0gc3R5bGVkLmRpdih7XG4gIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIHdpZHRoOiBcIjEwMCVcIixcbn0pO1xuXG5mdW5jdGlvbiBMYXlvdXRCYXNlKHtcbiAgY2hpbGRyZW4sXG4gIHBlcnNpc3RlbmNlS2V5LFxuICBzdG9yYWdlLFxufTogTGF5b3V0UHJvcHMpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCBbZGVjbGFyZWQsIHNldERlY2xhcmVkXSA9IHVzZVN0YXRlPFBhcnRpYWw8UmVjb3JkPFNsb3RLZXksIFBhbmVsUmVnPj4+KFxuICAgIHt9XG4gICk7XG4gIGNvbnN0IHsgc3RhdGU6IGxheW91dFN0YXRlLCAuLi5wYW5lbENhbGxiYWNrcyB9ID0gdXNlTGF5b3V0KCk7XG4gIGNvbnN0IHBlcnNpc3RlbmNlID0gdXNlTGF5b3V0UGVyc2lzdGVuY2UoKTtcbiAgY29uc3QgcmVzb2x2ZWRLZXkgPSBwZXJzaXN0ZW5jZUtleSA/PyBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZUtleTtcbiAgY29uc3QgcmVzb2x2ZWRTdG9yYWdlID0gc3RvcmFnZSA/PyBwZXJzaXN0ZW5jZS5zdG9yYWdlO1xuXG4gIGNvbnN0IGlzU2hvd24gPSAoc2xvdDogU2xvdEtleSk6IGJvb2xlYW4gPT4gbGF5b3V0U3RhdGVbc2xvdF0udmlzaWJsZTtcblxuICBjb25zdCByZWdpc3RyeSA9IHVzZU1lbW88UGFuZWxSZWdpc3RyeT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIHJlZ2lzdGVyOiAoc2xvdCwgcmVnKSA9PlxuICAgICAgICBzZXREZWNsYXJlZCgocHJldikgPT4gKHsgLi4ucHJldiwgW3Nsb3RdOiByZWcgfSkpLFxuICAgICAgdW5yZWdpc3RlcjogKHNsb3QpID0+XG4gICAgICAgIHNldERlY2xhcmVkKChwcmV2KSA9PiB7XG4gICAgICAgICAgaWYgKCEoc2xvdCBpbiBwcmV2KSkgcmV0dXJuIHByZXY7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHsgLi4ucHJldiB9O1xuICAgICAgICAgIGRlbGV0ZSBuZXh0W3Nsb3RdO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9KSxcbiAgICB9KSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IFtub2RlcywgaG9zdFJlZnNdID0gdXNlUG9ydGFsQ29udGFpbmVyUmVmcyhQQU5FTF9PUkRFUik7XG5cbiAgLy8gUGFuZWxzIHRoYXQgZXhpc3QgaW4gdGhlIGxheW91dCwgcmVnYXJkbGVzcyBvZiB2aXNpYmlsaXR5LiBEcml2ZXMgdGhlXG4gIC8vIHNvbG8tdnMtcmVzaXphYmxlIGRlY2lzaW9uIGJlbG93IOKAlCBrZXllZCBvbiBERUNMQVJFRCAobm90IHNob3duKSBzbyB0aGF0XG4gIC8vIHNob3dpbmcvaGlkaW5nIGEgcGFuZWwgbmV2ZXIgZmxpcHMgdGhlIG1vZGUuXG4gIGNvbnN0IGRlY2xhcmVkU2xvdHMgPSBQQU5FTF9PUkRFUi5maWx0ZXIoKHNsb3QpID0+IGRlY2xhcmVkW3Nsb3RdKTtcblxuICAvLyBTb2xvIG1vZGU6IGEgc2luZ2xlIHBhbmVsIGlzIGRlY2xhcmVkIChlLmcuIGp1c3QgYENvbnRlbnRgLCB3aXRoIG5vXG4gIC8vIFJpZ2h0UGFuZWwvU2lkZWJhci9TcGxpdCBpbiB0aGUgdHJlZSkg4oCUIG5vdGhpbmcgdG8gcmVzaXplIGFnYWluc3QsIHNvIGhvc3RcbiAgLy8gaXQgaW4gYSBwbGFpbiBkaXYgYW5kIHNraXAgcmVhY3QtcmVzaXphYmxlLXBhbmVscyBlbnRpcmVseS4gQmVjYXVzZSB0aGVcbiAgLy8gY2hlY2sgaXMgb24gREVDTEFSRUQgcGFuZWxzLCB0b2dnbGluZyBhICpkZWNsYXJlZCogcGFuZWwncyB2aXNpYmlsaXR5IGtlZXBzXG4gIC8vIHRoZSBtb2RlIHN0YWJsZSwgc28gYENvbnRlbnRgIGlzIG5ldmVyIHJlbW91bnRlZCBieSBhIHNob3cvaGlkZS4gVGhlIG1vZGVcbiAgLy8gb25seSBmbGlwcyB3aGVuIGEgcGFuZWwgbWFya2VyIGlzIGFkZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIChhXG4gIC8vIHN0cnVjdHVyYWwgY2hhbmdlKSwgd2hlcmUgYSBvbmUtdGltZSByZW1vdW50IGlzIGFjY2VwdGFibGUuXG4gIGNvbnN0IGlzU29sbyA9IGRlY2xhcmVkU2xvdHMubGVuZ3RoIDw9IDE7XG4gIGNvbnN0IHNvbG9TbG90ID0gZGVjbGFyZWRTbG90c1swXTtcblxuICAvLyBjb250ZW50IGZsZXhlcyAobm8gZml4ZWQgc2l6ZSk7IG90aGVycyB1c2UgdGhlIGRlY2xhcmVkIGRlZmF1bHQsIGZhbGxpbmdcbiAgLy8gYmFjayB0byB0aGUgcGVyc2lzdGVkL2NvbmZpZyBzaXplLlxuICBjb25zdCBkZWZhdWx0U2l6ZUZvciA9IChzbG90OiBTbG90S2V5KTogU2l6ZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHNsb3QgPT09IFNsb3QuY29udGVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZGVjbGFyZWRbc2xvdF0/LmRlZmF1bHRTaXplID8/IGxheW91dFN0YXRlW3Nsb3RdLnNpemU7XG4gIH07XG5cbiAgLy8gT25seSB0aGUgcGFuZWxzIHRoYXQgYXJlIGRlY2xhcmVkIEFORCBjdXJyZW50bHkgc2hvd24uIENsb3NlZC9oaWRkZW4gcGFuZWxzXG4gIC8vIGFyZSBub3QgcmVuZGVyZWQgYXQgYWxsIOKAlCBubyByZXNlcnZlZCBzcGFjZS5cbiAgY29uc3QgcGFuZWxJdGVtczogUGFuZWxJdGVtW10gPSBQQU5FTF9PUkRFUi5maWx0ZXIoXG4gICAgKHNsb3QpID0+IGRlY2xhcmVkW3Nsb3RdICYmIGlzU2hvd24oc2xvdClcbiAgKS5tYXAoKHNsb3QpID0+ICh7XG4gICAgaWQ6IHNsb3QsXG4gICAgZGVmYXVsdFNpemU6IGRlZmF1bHRTaXplRm9yKHNsb3QpLFxuICAgIG1pblNpemU6IGRlY2xhcmVkW3Nsb3RdPy5taW5TaXplID8/IGxheW91dFN0YXRlW3Nsb3RdLm1pblNpemUsXG4gICAgbWF4U2l6ZTogZGVjbGFyZWRbc2xvdF0/Lm1heFNpemUgPz8gbGF5b3V0U3RhdGVbc2xvdF0ubWF4U2l6ZSxcbiAgICBjb2xsYXBzaWJsZTogc2xvdCAhPT0gU2xvdC5jb250ZW50ICYmIChkZWNsYXJlZFtzbG90XT8uY29sbGFwc2libGUgPz8gdHJ1ZSksXG4gIH0pKTtcblxuICByZXR1cm4gKFxuICAgIDxQYW5lbFJlZ2lzdHJ5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17cmVnaXN0cnl9PlxuICAgICAgPExheW91dFBvcnRhbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e25vZGVzfT5cbiAgICAgICAgPFN0eWxlZExheW91dCBkYXRhLWRzLWlkPVwiTGF5b3V0XCI+XG4gICAgICAgICAge2lzU29sb1xuICAgICAgICAgICAgPyAvLyBMb25lIHBhbmVsIOKAlCBob3N0IGl0IGluIGEgcGxhaW4gZGl2LCBubyByZXNpemFibGUgR3JvdXAuIEhpZGRlblxuICAgICAgICAgICAgICAvLyBsb25lIHBhbmVscyByZW5kZXIgbm90aGluZyAoQ29udGVudCBpcyBhbHdheXMgc2hvd24pLlxuICAgICAgICAgICAgICBzb2xvU2xvdCAmJlxuICAgICAgICAgICAgICBpc1Nob3duKHNvbG9TbG90KSAmJiA8U3R5bGVkU29sb0hvc3QgcmVmPXtob3N0UmVmc1tzb2xvU2xvdF19IC8+XG4gICAgICAgICAgICA6IHBhbmVsSXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgLy8gYGtleWAgPSB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlLiByZWFjdC1yZXNpemFibGUtcGFuZWxzXG4gICAgICAgICAgICAgICAgLy8gcmVhZHMgc3RvcmVkIHNpemVzIG9ubHkgb24gbW91bnQsIGFuZCB0aGlzIGdyb3VwIHN0YXlzXG4gICAgICAgICAgICAgICAgLy8gbW91bnRlZCBhY3Jvc3MgbmF2aWdhdGlvbiDigJQgc28gcmVtb3VudCBpdCB3aGVuIHRoZSBrZXlcbiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIHRvIGxvYWQgVEhBVCBpbnN0YW5jZSdzIHNpemVzLiBVc2UgY2FzZTpcbiAgICAgICAgICAgICAgICAvLyBwZXItcm91dGUvcGVyLWluc3RhbmNlIHNpemUgbWVtb3J5IChlLmcuXG4gICAgICAgICAgICAgICAgLy8gYHBlcnNpc3RlbmNlS2V5PXtgbGF5b3V0OiR7cm91dGVJZH1gfWApIOKAlCBkcmFnIHRoZSBjaGF0IHdpZGVcbiAgICAgICAgICAgICAgICAvLyBvbiBwYWdlIEEsIHN3aXRjaCB0byBwYWdlIEIgKGl0cyBvd24gd2lkdGhzKSwgY29tZSBiYWNrIHRvIEFcbiAgICAgICAgICAgICAgICAvLyBhbmQgZmluZCBBJ3Mgd2lkdGhzIHJlc3RvcmVkLiBUaGUga2V5IG9ubHkgY2hhbmdlcyBvblxuICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlIHN3aXRjaCwgbmV2ZXIgb24gcGFuZWwgb3Blbi9jbG9zZSwgc28gbm9ybWFsXG4gICAgICAgICAgICAgICAgLy8gdG9nZ2xpbmcgc3RheXMgcmVtb3VudC1mcmVlLlxuICAgICAgICAgICAgICAgIDxQYW5lbFxuICAgICAgICAgICAgICAgICAga2V5PXtyZXNvbHZlZEtleX1cbiAgICAgICAgICAgICAgICAgIHBhbmVscz17cGFuZWxJdGVtc31cbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlS2V5PXtyZXNvbHZlZEtleX1cbiAgICAgICAgICAgICAgICAgIHN0b3JhZ2U9e3Jlc29sdmVkU3RvcmFnZX1cbiAgICAgICAgICAgICAgICAgIGhvc3RGb3I9eyhpZCkgPT4gaG9zdFJlZnNbaWQgYXMgU2xvdEtleV19XG4gICAgICAgICAgICAgICAgICBvblJlc2l6ZT17KGlkLCBzaXplKSA9PlxuICAgICAgICAgICAgICAgICAgICBwYW5lbENhbGxiYWNrc1tpZCBhcyBTbG90S2V5XS5yZXNpemUoc2l6ZSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9uQ29sbGFwc2U9eyhpZCkgPT4gcGFuZWxDYWxsYmFja3NbaWQgYXMgU2xvdEtleV0uaGlkZSgpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1N0eWxlZExheW91dD5cbiAgICAgIDwvTGF5b3V0UG9ydGFsQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1BhbmVsUmVnaXN0cnlDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogUHVibGljIExheW91dCDigJQgdGhlIHJlc2l6YWJsZSBwYW5lbCByb3cgKyBjb21wb3VuZCBwYXJ0cyBhcyBzdGF0aWNzICAgICAgICAgKi9cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTGF5b3V0Q29tcG9uZW50ID0gdHlwZW9mIExheW91dEJhc2UgJiB7XG4gIFByb3ZpZGVyOiB0eXBlb2YgTGF5b3V0UHJvdmlkZXI7XG4gIFNpZGViYXI6IHR5cGVvZiBTaWRlYmFyO1xuICBSaWdodFBhbmVsOiB0eXBlb2YgUmlnaHRQYW5lbDtcbiAgQ29udGVudDogdHlwZW9mIENvbnRlbnQ7XG4gIFNwbGl0OiB0eXBlb2YgU3BsaXQ7XG59O1xuXG5leHBvcnQgY29uc3QgTGF5b3V0ID0gTGF5b3V0QmFzZSBhcyBMYXlvdXRDb21wb25lbnQ7XG5cbkxheW91dC5Qcm92aWRlciA9IExheW91dFByb3ZpZGVyO1xuTGF5b3V0LlNpZGViYXIgPSBTaWRlYmFyO1xuTGF5b3V0LlJpZ2h0UGFuZWwgPSBSaWdodFBhbmVsO1xuTGF5b3V0LkNvbnRlbnQgPSBDb250ZW50O1xuTGF5b3V0LlNwbGl0ID0gU3BsaXQ7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0N1QiJ9 */");export const Layout=function({children,persistenceKey,storage}){let[declared,setDeclared]=useState({}),{state:layoutState,...panelCallbacks}=useLayout(),persistence=useLayoutPersistence(),resolvedKey=persistenceKey??persistence.persistenceKey,resolvedStorage=storage??persistence.storage,isShown=slot=>layoutState[slot].visible,registry=useMemo(()=>({register:(slot,reg)=>setDeclared(prev=>({...prev,[slot]:reg})),unregister:slot=>setDeclared(prev=>{if(!(slot in prev))return prev;let next={...prev};return delete next[slot],next})}),[]),[nodes,hostRefs]=usePortalContainerRefs(PANEL_ORDER),declaredSlots=PANEL_ORDER.filter(slot=>declared[slot]),isSolo=declaredSlots.length<=1,soloSlot=declaredSlots[0],defaultSizeFor=slot=>{if(slot!==Slot.content)return declared[slot]?.defaultSize??layoutState[slot].size},panelItems=PANEL_ORDER.filter(slot=>declared[slot]&&isShown(slot)).map(slot=>({id:slot,defaultSize:defaultSizeFor(slot),minSize:declared[slot]?.minSize??layoutState[slot].minSize,maxSize:declared[slot]?.maxSize??layoutState[slot].maxSize,collapsible:slot!==Slot.content&&(declared[slot]?.collapsible??!0)}));return React.createElement(PanelRegistryContext.Provider,{value:registry},React.createElement(LayoutPortalContext.Provider,{value:nodes},React.createElement(StyledLayout,{"data-ds-id":"Layout"},isSolo?soloSlot&&isShown(soloSlot)&&React.createElement(StyledSoloHost,{ref:hostRefs[soloSlot]}):panelItems.length>0&&React.createElement(Panel,{key:resolvedKey,panels:panelItems,persistenceKey:resolvedKey,storage:resolvedStorage,hostFor:id=>hostRefs[id],onResize:(id,size)=>panelCallbacks[id].resize(size),onCollapse:id=>panelCallbacks[id].hide()}),children)))};Layout.Provider=LayoutProvider,Layout.Sidebar=Sidebar,Layout.RightPanel=RightPanel,Layout.Content=Content,Layout.Split=Split;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import type { LayoutProviderProps } from "./-types";
3
+ /**
4
+ * Owns the state engine + the public persistence-config surface. Mount once,
5
+ * above the router. Pass `store` to replace the default vanilla engine with a
6
+ * zustand/redux-backed one; otherwise a default store is built from `config`.
7
+ *
8
+ * `storage`/`persistenceKey` are accepted here so consumers configure the whole
9
+ * layout in one provider — but the Provider **never reads storage itself**.
10
+ * It publishes them to the nested, which owns persistence.
11
+ * Two tracks: panel sizes (via react-resizable-panels, working today) and the panels'
12
+ * "intent" — open/visible/variant (restore on mount + save on store.subscribe, still deferred).
13
+ * That deferral is the default store's; a bring-your-own store can persist intent itself.
14
+ */
15
+ export declare function LayoutProvider({ children, config, store, persistenceKey, storage, }: LayoutProviderProps): React.ReactElement;
@@ -0,0 +1 @@
1
+ import React,{useMemo,useRef}from"react";import{useTheme}from"@emotion/react";import{SLIDE_VAR}from"./-constants";import{LayoutPersistenceProvider,LayoutStoreProvider}from"./context";import{LayoutVars,LayoutVarStoreProvider,useLayoutVar}from"./LayoutVars";import{createLayoutVarStore}from"./varStore";import{createInitialState}from"./reducer";import{createLayoutStore}from"./store";function SlideVars(){let theme=useTheme(),open=theme.variables?.animation?.navSlide?.open;return useLayoutVar(SLIDE_VAR.duration,open?.duration??""),useLayoutVar(SLIDE_VAR.easing,open?.timingFunction??""),null}export function LayoutProvider({children,config,store,persistenceKey,storage}){let storeRef=useRef(null);null===storeRef.current&&(storeRef.current=store??createLayoutStore(createInitialState(config)));let varStoreRef=useRef(null);null===varStoreRef.current&&(varStoreRef.current=createLayoutVarStore());let persistence=useMemo(()=>({persistenceKey,storage}),[persistenceKey,storage]);return React.createElement(LayoutStoreProvider,{value:storeRef.current},React.createElement(LayoutPersistenceProvider,{value:persistence},React.createElement(LayoutVarStoreProvider,{value:varStoreRef.current},React.createElement(LayoutVars,null),React.createElement(SlideVars,null),children)))}
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import type { LayoutVarStore } from "./varStore";
3
+ export declare const LayoutVarStoreProvider: React.Provider<LayoutVarStore>;
4
+ /**
5
+ * Publish one layout CSS var. Call it from the component that owns the logic of
6
+ * *why* the value changes (e.g. the subnav: `compact ? 0 : height`). The value
7
+ * is registered on mount/update and removed on unmount, so the var only exists
8
+ * while its producer is mounted. An empty-string value is treated as unset (the
9
+ * var is removed) — lets a producer opt out without breaking hook order. No-op
10
+ * outside a `Layout.Provider`.
11
+ */
12
+ export declare function useLayoutVar(name: string, value: string): void;
13
+ /**
14
+ * The single sink: renders every registered layout var in ONE place. Today it
15
+ * targets `:root`; to scope the vars to a host element later, change only this
16
+ * component — producers are untouched.
17
+ */
18
+ export declare function LayoutVars(): React.ReactElement;
@@ -0,0 +1 @@
1
+ import React,{createContext,useContext,useEffect,useSyncExternalStore}from"react";import{Global}from"@emotion/react";let LayoutVarStoreContext=createContext(null);export const LayoutVarStoreProvider=LayoutVarStoreContext.Provider;let EMPTY_VARS={},NOOP_SUBSCRIBE=()=>()=>{};export function useLayoutVar(name,value){let store=useContext(LayoutVarStoreContext);useEffect(()=>{if(store)return""===value?void store.remove(name):(store.set(name,value),()=>store.remove(name))},[store,name,value])}export function LayoutVars(){let vars=function(){let store=useContext(LayoutVarStoreContext);return useSyncExternalStore(store?.subscribe??NOOP_SUBSCRIBE,store?store.getSnapshot:()=>EMPTY_VARS,()=>EMPTY_VARS)}();return React.createElement(Global,{styles:[{":root":vars},"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjL2NvbXBvbmVudHMvTGF5b3V0L0xheW91dFZhcnMudHN4Iiwic291cmNlcyI6WyJzcmMvY29tcG9uZW50cy9MYXlvdXQvTGF5b3V0VmFycy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIkBlbW90aW9uL3JlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IExheW91dFZhclN0b3JlIH0gZnJvbSBcIi4vdmFyU3RvcmVcIjtcblxuLyoqXG4gKiBDb250ZXh0IGNhcnJpZXMgdGhlIFZBUi1TVE9SRSBSRUZFUkVOQ0UgKHN0YWJsZSBmb3IgdGhlIHByb3ZpZGVyJ3MgbGlmZXRpbWUpLFxuICogbm90IHRoZSB2YWx1ZXMg4oCUIHNhbWUgYXBwcm9hY2ggYXMgdGhlIGxheW91dCBzdG9yZS4gUHJvZHVjZXJzIHB1Ymxpc2ggdGhyb3VnaFxuICogYHVzZUxheW91dFZhcmA7IHRoZSBgPExheW91dFZhcnM+YCBzaW5rIHJlYWRzIHRoZSB3aG9sZSBtYXAuXG4gKi9cbmNvbnN0IExheW91dFZhclN0b3JlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8TGF5b3V0VmFyU3RvcmUgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IExheW91dFZhclN0b3JlUHJvdmlkZXIgPSBMYXlvdXRWYXJTdG9yZUNvbnRleHQuUHJvdmlkZXI7XG5cbi8vIFN0YWJsZSBmYWxsYmFja3Mgc28gdGhlIGhvb2tzIGJlbG93IGFyZSBzYWZlIHRvIGNhbGwgb3V0c2lkZSBhIHByb3ZpZGVyLlxuY29uc3QgRU1QVFlfVkFSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuY29uc3QgTk9PUF9TVUJTQ1JJQkUgPSAoKTogKCgpID0+IHZvaWQpID0+ICgpID0+IHt9O1xuXG4vKipcbiAqIFB1Ymxpc2ggb25lIGxheW91dCBDU1MgdmFyLiBDYWxsIGl0IGZyb20gdGhlIGNvbXBvbmVudCB0aGF0IG93bnMgdGhlIGxvZ2ljIG9mXG4gKiAqd2h5KiB0aGUgdmFsdWUgY2hhbmdlcyAoZS5nLiB0aGUgc3VibmF2OiBgY29tcGFjdCA/IDAgOiBoZWlnaHRgKS4gVGhlIHZhbHVlXG4gKiBpcyByZWdpc3RlcmVkIG9uIG1vdW50L3VwZGF0ZSBhbmQgcmVtb3ZlZCBvbiB1bm1vdW50LCBzbyB0aGUgdmFyIG9ubHkgZXhpc3RzXG4gKiB3aGlsZSBpdHMgcHJvZHVjZXIgaXMgbW91bnRlZC4gQW4gZW1wdHktc3RyaW5nIHZhbHVlIGlzIHRyZWF0ZWQgYXMgdW5zZXQgKHRoZVxuICogdmFyIGlzIHJlbW92ZWQpIOKAlCBsZXRzIGEgcHJvZHVjZXIgb3B0IG91dCB3aXRob3V0IGJyZWFraW5nIGhvb2sgb3JkZXIuIE5vLW9wXG4gKiBvdXRzaWRlIGEgYExheW91dC5Qcm92aWRlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRWYXIobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gdXNlQ29udGV4dChMYXlvdXRWYXJTdG9yZUNvbnRleHQpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3RvcmUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICBzdG9yZS5yZW1vdmUobmFtZSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzdG9yZS5zZXQobmFtZSwgdmFsdWUpO1xuICAgIHJldHVybiAoKSA9PiBzdG9yZS5yZW1vdmUobmFtZSk7XG4gIH0sIFtzdG9yZSwgbmFtZSwgdmFsdWVdKTtcbn1cblxuZnVuY3Rpb24gdXNlTGF5b3V0VmFycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgc3RvcmUgPSB1c2VDb250ZXh0KExheW91dFZhclN0b3JlQ29udGV4dCk7XG4gIHJldHVybiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBzdG9yZT8uc3Vic2NyaWJlID8/IE5PT1BfU1VCU0NSSUJFLFxuICAgIHN0b3JlID8gc3RvcmUuZ2V0U25hcHNob3QgOiAoKSA9PiBFTVBUWV9WQVJTLFxuICAgICgpID0+IEVNUFRZX1ZBUlNcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgc2luZ2xlIHNpbms6IHJlbmRlcnMgZXZlcnkgcmVnaXN0ZXJlZCBsYXlvdXQgdmFyIGluIE9ORSBwbGFjZS4gVG9kYXkgaXRcbiAqIHRhcmdldHMgYDpyb290YDsgdG8gc2NvcGUgdGhlIHZhcnMgdG8gYSBob3N0IGVsZW1lbnQgbGF0ZXIsIGNoYW5nZSBvbmx5IHRoaXNcbiAqIGNvbXBvbmVudCDigJQgcHJvZHVjZXJzIGFyZSB1bnRvdWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMYXlvdXRWYXJzKCk6IFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIGNvbnN0IHZhcnMgPSB1c2VMYXlvdXRWYXJzKCk7XG4gIHJldHVybiA8R2xvYmFsIHN0eWxlcz17eyBcIjpyb290XCI6IHZhcnMgfX0gLz47XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkRVIn0= */"]})}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import type { RightPanelProps } from "./-types";
3
+ /**
4
+ * Right side panel. Declares the `rightPanel` slot and portals its content into
5
+ * the Group's host while visible. Renders in-flow (a resizable column) — the
6
+ * offcanvas overlay / mobile sheet is deferred. Content is wrapped in a slot
7
+ * that tracks the `--ds-layout-subnav-offset` var.
8
+ */
9
+ export declare const RightPanel: React.FC<RightPanelProps>;
@@ -0,0 +1 @@
1
+ import React from"react";import styled from"@emotion/styled";import{SLIDE_VAR,Slot,SUBNAV_OFFSET_VAR}from"./-constants";import{useDeclarePanel,useLayoutPortal,useVisibleChange}from"./registry";import{useLayout}from"./useLayout";import{RightPanelContainer}from"./RightPanelContainer";let StyledRightPanelSlot=styled("div",{target:"e1jmp3pg0",label:"StyledRightPanelSlot"})({position:"absolute",left:0,right:0,bottom:0,top:`var(${SUBNAV_OFFSET_VAR}, 0px)`,overflow:"hidden",transition:`top var(${SLIDE_VAR.duration}) var(${SLIDE_VAR.easing})`},"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjL2NvbXBvbmVudHMvTGF5b3V0L1JpZ2h0UGFuZWwudHN4Iiwic291cmNlcyI6WyJzcmMvY29tcG9uZW50cy9MYXlvdXQvUmlnaHRQYW5lbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBTTElERV9WQVIsIFNsb3QsIFNVQk5BVl9PRkZTRVRfVkFSIH0gZnJvbSBcIi4vLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgdXNlRGVjbGFyZVBhbmVsLCB1c2VMYXlvdXRQb3J0YWwsIHVzZVZpc2libGVDaGFuZ2UgfSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0IH0gZnJvbSBcIi4vdXNlTGF5b3V0XCI7XG5pbXBvcnQgeyBSaWdodFBhbmVsQ29udGFpbmVyIH0gZnJvbSBcIi4vUmlnaHRQYW5lbENvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgeyBSaWdodFBhbmVsUHJvcHMgfSBmcm9tIFwiLi8tdHlwZXNcIjtcblxuLy8gQnVpbHQtaW4gc2xvdDogb2Zmc2V0cyB0aGUgcGFuZWwgY29udGVudCBieSB0aGUgc3VibmF2LW9mZnNldCB2YXIgKDAgd2hlblxuLy8gdW5zZXQpLCB0cmFuc2l0aW9uZWQgd2l0aCB0aGUgc2hhcmVkIHNsaWRlIHZhcnMg4oCUIHNvIHRoZSByaWdodCBwYW5lbCB0cmFja3MgYVxuLy8gc3RpY2t5IHN1Ym5hdiB3aXRoIG5vIHdpcmluZyBvbiB0aGUgY29uc3VtZXIncyBzaWRlLlxuY29uc3QgU3R5bGVkUmlnaHRQYW5lbFNsb3QgPSBzdHlsZWQuZGl2KHtcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgbGVmdDogMCxcbiAgcmlnaHQ6IDAsXG4gIGJvdHRvbTogMCxcbiAgdG9wOiBgdmFyKCR7U1VCTkFWX09GRlNFVF9WQVJ9LCAwcHgpYCxcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gIHRyYW5zaXRpb246IGB0b3AgdmFyKCR7U0xJREVfVkFSLmR1cmF0aW9ufSkgdmFyKCR7U0xJREVfVkFSLmVhc2luZ30pYCxcbn0pO1xuXG4vKipcbiAqIFJpZ2h0IHNpZGUgcGFuZWwuIERlY2xhcmVzIHRoZSBgcmlnaHRQYW5lbGAgc2xvdCBhbmQgcG9ydGFscyBpdHMgY29udGVudCBpbnRvXG4gKiB0aGUgR3JvdXAncyBob3N0IHdoaWxlIHZpc2libGUuIFJlbmRlcnMgaW4tZmxvdyAoYSByZXNpemFibGUgY29sdW1uKSDigJQgdGhlXG4gKiBvZmZjYW52YXMgb3ZlcmxheSAvIG1vYmlsZSBzaGVldCBpcyBkZWZlcnJlZC4gQ29udGVudCBpcyB3cmFwcGVkIGluIGEgc2xvdFxuICogdGhhdCB0cmFja3MgdGhlIGAtLWRzLWxheW91dC1zdWJuYXYtb2Zmc2V0YCB2YXIuXG4gKi9cbmV4cG9ydCBjb25zdCBSaWdodFBhbmVsOiBSZWFjdC5GQzxSaWdodFBhbmVsUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIGRlZmF1bHRTaXplID0gMzc4LFxuICBtaW5TaXplID0gMzI4LFxuICBtYXhTaXplID0gXCIzMCVcIixcbiAgY29sbGFwc2libGUgPSBmYWxzZSxcbiAgb25WaXNpYmxlQ2hhbmdlLFxuICB0aXRsZSxcbiAgb25DbG9zZSxcbiAgc2xvdFByb3BzLFxuICBzY3JvbGxDb250YWluZXJSZWYsXG4gIG9uU2Nyb2xsLFxufSkgPT4ge1xuICBjb25zdCB7IGlzVmlzaWJsZSwgaGlkZSB9ID0gdXNlTGF5b3V0KClbU2xvdC5yaWdodFBhbmVsXTtcbiAgdXNlRGVjbGFyZVBhbmVsKFNsb3QucmlnaHRQYW5lbCwge1xuICAgIGRlZmF1bHRTaXplLFxuICAgIG1pblNpemUsXG4gICAgbWF4U2l6ZSxcbiAgICBjb2xsYXBzaWJsZSxcbiAgfSk7XG4gIHVzZVZpc2libGVDaGFuZ2UoaXNWaXNpYmxlLCBvblZpc2libGVDaGFuZ2UpO1xuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpOiB2b2lkID0+IHtcbiAgICBoaWRlKCk7XG4gICAgb25DbG9zZT8uKCk7XG4gIH07XG4gIHJldHVybiB1c2VMYXlvdXRQb3J0YWwoXG4gICAgU2xvdC5yaWdodFBhbmVsLFxuICAgIGlzVmlzaWJsZSA/IChcbiAgICAgIDxTdHlsZWRSaWdodFBhbmVsU2xvdD5cbiAgICAgICAgPFJpZ2h0UGFuZWxDb250YWluZXJcbiAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICAgICAgc2xvdFByb3BzPXtzbG90UHJvcHN9XG4gICAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVmPXtzY3JvbGxDb250YWluZXJSZWZ9XG4gICAgICAgICAgb25TY3JvbGw9e29uU2Nyb2xsfVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JpZ2h0UGFuZWxDb250YWluZXI+XG4gICAgICA8L1N0eWxlZFJpZ2h0UGFuZWxTbG90PlxuICAgICkgOiBudWxsXG4gICk7XG59O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVc2QiJ9 */");export const RightPanel=({children,defaultSize=378,minSize=328,maxSize="30%",collapsible=!1,onVisibleChange,title,onClose,slotProps,scrollContainerRef,onScroll})=>{let{isVisible,hide}=useLayout()[Slot.rightPanel];return useDeclarePanel(Slot.rightPanel,{defaultSize,minSize,maxSize,collapsible}),useVisibleChange(isVisible,onVisibleChange),useLayoutPortal(Slot.rightPanel,isVisible?React.createElement(StyledRightPanelSlot,null,React.createElement(RightPanelContainer,{title:title,onClose:()=>{hide(),onClose?.()},slotProps:slotProps,scrollContainerRef:scrollContainerRef,onScroll:onScroll},children)):null)};
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import type { RightPanelContainerProps } from "./-types";
3
+ export declare function RightPanelContainer({ title, children, onClose, slotProps, scrollContainerRef, onScroll, "data-e2e-test-id": dataE2eTestId, }: RightPanelContainerProps): React.ReactElement;
@@ -0,0 +1 @@
1
+ import React from"react";import styled from"@emotion/styled";import{Sandwich}from"../Internal/Sandwich/Sandwich";import{Icon}from"../Icon/Icon";import{H5}from"../Typography/Header/Header";import{Box}from"../Box/Box";import{Inline}from"../Inline/Inline";import{PictogramButton}from"../PictogramButton/PictogramButton";import{Divider}from"../Divider/Divider";import{Container}from"../Container/Container";let CustomContainer=styled(Container,{target:"e5j03vd0",label:"CustomContainer"})({height:"100%"},"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjL2NvbXBvbmVudHMvTGF5b3V0L1JpZ2h0UGFuZWxDb250YWluZXIudHN4Iiwic291cmNlcyI6WyJzcmMvY29tcG9uZW50cy9MYXlvdXQvUmlnaHRQYW5lbENvbnRhaW5lci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBTYW5kd2ljaCB9IGZyb20gXCIuLi9JbnRlcm5hbC9TYW5kd2ljaC9TYW5kd2ljaFwiO1xuaW1wb3J0IHsgSWNvbiB9IGZyb20gXCIuLi9JY29uL0ljb25cIjtcbmltcG9ydCB7IEg1IH0gZnJvbSBcIi4uL1R5cG9ncmFwaHkvSGVhZGVyL0hlYWRlclwiO1xuaW1wb3J0IHsgQm94IH0gZnJvbSBcIi4uL0JveC9Cb3hcIjtcbmltcG9ydCB7IElubGluZSB9IGZyb20gXCIuLi9JbmxpbmUvSW5saW5lXCI7XG5pbXBvcnQgeyBQaWN0b2dyYW1CdXR0b24gfSBmcm9tIFwiLi4vUGljdG9ncmFtQnV0dG9uL1BpY3RvZ3JhbUJ1dHRvblwiO1xuaW1wb3J0IHsgRGl2aWRlciB9IGZyb20gXCIuLi9EaXZpZGVyL0RpdmlkZXJcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi9Db250YWluZXIvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSB7IFJpZ2h0UGFuZWxDb250YWluZXJQcm9wcyB9IGZyb20gXCIuLy10eXBlc1wiO1xuXG5jb25zdCBDdXN0b21Db250YWluZXIgPSBzdHlsZWQoQ29udGFpbmVyKSh7XG4gIGhlaWdodDogXCIxMDAlXCIsXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIFJpZ2h0UGFuZWxDb250YWluZXIoe1xuICB0aXRsZSxcbiAgY2hpbGRyZW4sXG4gIG9uQ2xvc2UsXG4gIHNsb3RQcm9wcyxcbiAgc2Nyb2xsQ29udGFpbmVyUmVmLFxuICBvblNjcm9sbCxcbiAgXCJkYXRhLWUyZS10ZXN0LWlkXCI6IGRhdGFFMmVUZXN0SWQsXG59OiBSaWdodFBhbmVsQ29udGFpbmVyUHJvcHMpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCB7IGlzVmlzaWJsZTogaXNUaXRsZVZpc2libGUgPSB0cnVlIH0gPSB0aXRsZTtcbiAgcmV0dXJuIChcbiAgICA8Q3VzdG9tQ29udGFpbmVyXG4gICAgICBlbGV2YXRpb249ezB9XG4gICAgICBzcXVhcmVDb3JuZXJzXG4gICAgICBkYXRhLWRzLWlkPVwiUmlnaHRQYW5lbENvbnRhaW5lclwiXG4gICAgICBkYXRhLWUyZS10ZXN0LWlkPXtkYXRhRTJlVGVzdElkfVxuICAgID5cbiAgICAgIDxTYW5kd2ljaCByb2xlPVwicmVnaW9uXCIgYXJpYS1sYWJlbD17dGl0bGUubGFiZWx9PlxuICAgICAgICA8U2FuZHdpY2guSGVhZGVyIHNob3dTZXBhcmF0b3I9XCJhbHdheXNcIj5cbiAgICAgICAgICA8Qm94IHNwYWNlPVwic1wiIHZTcGFjZT1cInhzXCI+XG4gICAgICAgICAgICA8SW5saW5lXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM9XCJzcGFjZUJldHdlZW5cIlxuICAgICAgICAgICAgICB2QWxpZ25JdGVtcz1cImNlbnRlclwiXG4gICAgICAgICAgICAgIG5vV3JhcFxuICAgICAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPElubGluZSBzcGFjZT1cInhzXCIgdkFsaWduSXRlbXM9XCJjZW50ZXJcIiBub1dyYXA+XG4gICAgICAgICAgICAgICAge3Nsb3RQcm9wcy5oZWFkZXI/LmxlZnRTbG90fVxuICAgICAgICAgICAgICAgIHtpc1RpdGxlVmlzaWJsZSAmJiAoXG4gICAgICAgICAgICAgICAgICA8SW5saW5lIHNwYWNlPVwieHNcIiB2QWxpZ25JdGVtcz1cImNlbnRlclwiIG5vV3JhcD5cbiAgICAgICAgICAgICAgICAgICAge3RpdGxlLmljb24gJiYgPEljb24gey4uLnRpdGxlLmljb259IC8+fVxuICAgICAgICAgICAgICAgICAgICA8SDU+e3RpdGxlLmxhYmVsfTwvSDU+XG4gICAgICAgICAgICAgICAgICA8L0lubGluZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L0lubGluZT5cbiAgICAgICAgICAgICAgPElubGluZSBzcGFjZT1cInh4c1wiIHZBbGlnbkl0ZW1zPVwiY2VudGVyXCIgbm9XcmFwPlxuICAgICAgICAgICAgICAgIHtzbG90UHJvcHMuaGVhZGVyPy5yaWdodFNsb3R9XG4gICAgICAgICAgICAgICAgey8qIGRpdmlkZXIgc2VwYXJhdGluZyBjb25zdW1lciBoZWFkZXIgYWN0aW9ucyBmcm9tIHRoZSBjbG9zZSBidXR0b24gKi99XG4gICAgICAgICAgICAgICAge3Nsb3RQcm9wcy5oZWFkZXI/LnJpZ2h0U2xvdCAmJiAoXG4gICAgICAgICAgICAgICAgICA8RGl2aWRlciBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCIgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxQaWN0b2dyYW1CdXR0b25cbiAgICAgICAgICAgICAgICAgIGljb249XCJ4XCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtzbG90UHJvcHMuY2xvc2VCdXR0b25bXCJhcmlhLWxhYmVsXCJdfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25DbG9zZT8uKCl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9JbmxpbmU+XG4gICAgICAgICAgICA8L0lubGluZT5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgPC9TYW5kd2ljaC5IZWFkZXI+XG4gICAgICAgIDxTYW5kd2ljaC5Cb2R5IHNjcm9sbFJlZj17c2Nyb2xsQ29udGFpbmVyUmVmfSBvblNjcm9sbD17b25TY3JvbGx9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9TYW5kd2ljaC5Cb2R5PlxuICAgICAgICB7c2xvdFByb3BzLmZvb3RlciAmJiAoXG4gICAgICAgICAgPFNhbmR3aWNoLkZvb3RlciBzaG93U2VwYXJhdG9yPVwibmV2ZXJcIj5cbiAgICAgICAgICAgIHtzbG90UHJvcHMuZm9vdGVyfVxuICAgICAgICAgIDwvU2FuZHdpY2guRm9vdGVyPlxuICAgICAgICApfVxuICAgICAgPC9TYW5kd2ljaD5cbiAgICA8L0N1c3RvbUNvbnRhaW5lcj5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZd0IifQ== */");export function RightPanelContainer({title,children,onClose,slotProps,scrollContainerRef,onScroll,"data-e2e-test-id":dataE2eTestId}){let{isVisible:isTitleVisible=!0}=title;return React.createElement(CustomContainer,{elevation:0,squareCorners:!0,"data-ds-id":"RightPanelContainer","data-e2e-test-id":dataE2eTestId},React.createElement(Sandwich,{role:"region","aria-label":title.label},React.createElement(Sandwich.Header,{showSeparator:"always"},React.createElement(Box,{space:"s",vSpace:"xs"},React.createElement(Inline,{alignItems:"spaceBetween",vAlignItems:"center",noWrap:!0,fullWidth:!0},React.createElement(Inline,{space:"xs",vAlignItems:"center",noWrap:!0},slotProps.header?.leftSlot,isTitleVisible&&React.createElement(Inline,{space:"xs",vAlignItems:"center",noWrap:!0},title.icon&&React.createElement(Icon,title.icon),React.createElement(H5,null,title.label))),React.createElement(Inline,{space:"xxs",vAlignItems:"center",noWrap:!0},slotProps.header?.rightSlot,slotProps.header?.rightSlot&&React.createElement(Divider,{orientation:"vertical"}),React.createElement(PictogramButton,{icon:"x",size:"s",variant:"tertiary","aria-label":slotProps.closeButton["aria-label"],onClick:()=>onClose?.()}))))),React.createElement(Sandwich.Body,{scrollRef:scrollContainerRef,onScroll:onScroll},children),slotProps.footer&&React.createElement(Sandwich.Footer,{showSeparator:"never"},slotProps.footer)))}
@@ -0,0 +1,8 @@
1
+ import type React from "react";
2
+ import type { SidePanelProps } from "./-types";
3
+ /**
4
+ * Left side panel. Declares the `sidebar` slot and portals its content into the
5
+ * Group's host while visible. Renders in-flow (a resizable column) — the
6
+ * offcanvas overlay / mobile sheet is deferred.
7
+ */
8
+ export declare const Sidebar: React.FC<SidePanelProps>;
@@ -0,0 +1 @@
1
+ import{Slot}from"./-constants";import{useDeclarePanel,useLayoutPortal,useVisibleChange}from"./registry";import{useLayout}from"./useLayout";export const Sidebar=({children,defaultSize,minSize,maxSize,collapsible=!0,onVisibleChange})=>{let{isVisible}=useLayout()[Slot.sidebar];return useDeclarePanel(Slot.sidebar,{defaultSize,minSize,maxSize,collapsible}),useVisibleChange(isVisible,onVisibleChange),useLayoutPortal(Slot.sidebar,isVisible?children:null)};
@@ -0,0 +1,7 @@
1
+ import type React from "react";
2
+ import type { SplitProps } from "./-types";
3
+ /**
4
+ * Split view panel. Declares the `splitview` slot and portals its content while
5
+ * visible — a toggleable in-flow column beside `content`.
6
+ */
7
+ export declare const Split: React.FC<SplitProps>;
@@ -0,0 +1 @@
1
+ import{Slot}from"./-constants";import{useDeclarePanel,useLayoutPortal}from"./registry";import{useLayout}from"./useLayout";export const Split=({children,defaultSize,minSize,maxSize})=>{let{isVisible}=useLayout()[Slot.splitview];return useDeclarePanel(Slot.splitview,{defaultSize,minSize,maxSize,collapsible:!0}),useLayoutPortal(Slot.splitview,isVisible?children:null)};
@@ -0,0 +1,22 @@
1
+ import type { LayoutState, LayoutStorage, LayoutStore } from "./-types";
2
+ export declare const LayoutStoreProvider: React.Provider<LayoutStore>;
3
+ /** Get the store from context, or throw if used outside the provider. */
4
+ export declare function useLayoutStore(): LayoutStore;
5
+ /**
6
+ * Persistence config for the layout namespace. Set on `Layout.Provider` (single
7
+ * external surface) and read by the nested `<Layout>`. The Provider only
8
+ * forwards it — it never touches storage itself.
9
+ */
10
+ export type LayoutPersistence = {
11
+ persistenceKey?: string;
12
+ storage?: LayoutStorage;
13
+ };
14
+ export declare const LayoutPersistenceProvider: React.Provider<LayoutPersistence>;
15
+ /** Persistence config from the nearest `Layout.Provider` (empty if none). */
16
+ export declare function useLayoutPersistence(): LayoutPersistence;
17
+ /**
18
+ * Subscribe to a slice of layout state via `useSyncExternalStore`. The selector
19
+ * should return a stable reference when nothing relevant changed — the reducer
20
+ * preserves references for untouched positions, so slice selectors are safe.
21
+ */
22
+ export declare function useLayoutSelector<T>(selector: (state: LayoutState) => T): T;
@@ -0,0 +1 @@
1
+ import{createContext,useContext,useSyncExternalStore}from"react";let LayoutStoreContext=createContext(null);export const LayoutStoreProvider=LayoutStoreContext.Provider;export function useLayoutStore(){let store=useContext(LayoutStoreContext);if(!store)throw Error("useLayout must be used within a <LayoutProvider>.");return store}let LayoutPersistenceContext=createContext({});export const LayoutPersistenceProvider=LayoutPersistenceContext.Provider;export function useLayoutPersistence(){return useContext(LayoutPersistenceContext)}export function useLayoutSelector(selector){let store=useLayoutStore(),getSnapshot=()=>selector(store.getState());return useSyncExternalStore(store.subscribe,getSnapshot,getSnapshot)}
@@ -0,0 +1,9 @@
1
+ export { SLIDE_VAR, SUBNAV_OFFSET_VAR } from "./-constants";
2
+ export { Layout } from "./Layout";
3
+ export { LayoutProvider } from "./LayoutProvider";
4
+ export { useLayoutVar } from "./LayoutVars";
5
+ export { useLayout } from "./useLayout";
6
+ export { RightPanelContainer } from "./RightPanelContainer";
7
+ export { createLayoutStore } from "./store";
8
+ export { createInitialState, layoutReducer } from "./reducer";
9
+ export * from "./-types";
@@ -0,0 +1 @@
1
+ export{SLIDE_VAR,SUBNAV_OFFSET_VAR}from"./-constants";export{Layout}from"./Layout";export{LayoutProvider}from"./LayoutProvider";export{useLayoutVar}from"./LayoutVars";export{useLayout}from"./useLayout";export{RightPanelContainer}from"./RightPanelContainer";export{createLayoutStore}from"./store";export{createInitialState,layoutReducer}from"./reducer";export*from"./-types";
@@ -0,0 +1,5 @@
1
+ import type { LayoutConfig, LayoutReducer, LayoutState } from "./-types";
2
+ /** Build the initial state from optional config. */
3
+ export declare function createInitialState(config?: LayoutConfig): LayoutState;
4
+ /** Pure reducer. Returns the same reference when nothing changes. */
5
+ export declare const layoutReducer: LayoutReducer;
@@ -0,0 +1 @@
1
+ function sidePanel(config={}){return{kind:"sidePanel",visible:config.defaultVisible??!0,collapsible:config.collapsible??!0,variant:config.variant??"sidebar",size:config.defaultSize,minSize:config.minSize,maxSize:config.maxSize}}function panelState(config={}){return{kind:"panel",visible:config.defaultVisible??!0,size:config.defaultSize,minSize:config.minSize,maxSize:config.maxSize}}export function createInitialState(config={}){return{sidebar:sidePanel(config.sidebar),rightPanel:sidePanel({defaultVisible:!1,...config.rightPanel}),content:panelState(config.content),splitview:panelState({defaultVisible:!1,...config.splitview})}}export const layoutReducer=(state,action,initial)=>{switch(action.type){case"setVisible":{let slot=state[action.slot];if(slot.visible===action.visible)return state;return{...state,[action.slot]:{...slot,visible:action.visible}}}case"setVariant":{let panel=state[action.panel];if(panel.variant===action.variant)return state;return{...state,[action.panel]:{...panel,variant:action.variant}}}case"resize":{let slot=state[action.slot];if(slot.size===action.size)return state;return{...state,[action.slot]:{...slot,size:action.size}}}case"reset":if(!initial)return state;if(!action.slot)return initial;if(state[action.slot]===initial[action.slot])return state;return{...state,[action.slot]:initial[action.slot]};default:return state}};
@@ -0,0 +1,31 @@
1
+ import { type ReactNode } from "react";
2
+ import type { Size, SlotKey } from "./-types";
3
+ export type HostNodes = Partial<Record<SlotKey, HTMLElement | null>>;
4
+ export declare const LayoutPortalContext: React.Context<Partial<Record<"content" | "sidebar" | "splitview" | "rightPanel", HTMLElement>>>;
5
+ /**
6
+ * Portal `children` into the host DOM node registered for `slot`. Returns the
7
+ * portal (or `null` if the host isn't mounted yet). Call unconditionally —
8
+ * gate content by passing `null` as `children`, not by skipping the call.
9
+ */
10
+ export declare function useLayoutPortal(slot: SlotKey, children: ReactNode): ReactNode;
11
+ /**
12
+ * Panel descriptor a marker contributes. The Group renders one resizable Panel
13
+ * per *declared* panel that is currently shown — regardless of nesting depth.
14
+ * So a page can drop `<Layout.Split>` deep in its tree and it joins the app's
15
+ * single Layout as a panel; toggling a panel never remounts the others.
16
+ */
17
+ export type PanelReg = {
18
+ defaultSize?: Size;
19
+ minSize?: Size;
20
+ maxSize?: Size;
21
+ collapsible?: boolean;
22
+ };
23
+ export type PanelRegistry = {
24
+ register: (slot: SlotKey, reg: PanelReg) => void;
25
+ unregister: (slot: SlotKey) => void;
26
+ };
27
+ export declare const PanelRegistryContext: React.Context<PanelRegistry>;
28
+ /** Register this slot as a panel for the marker's lifetime. */
29
+ export declare function useDeclarePanel(slot: SlotKey, reg: PanelReg): void;
30
+ /** Fire `onChange(visible)` when `visible` transitions (not on initial mount). */
31
+ export declare function useVisibleChange(visible: boolean, onChange?: (visible: boolean) => void): void;
@@ -0,0 +1 @@
1
+ import{createContext,useContext,useEffect,useLayoutEffect,useRef}from"react";import{createPortal}from"react-dom";export const LayoutPortalContext=createContext({});export function useLayoutPortal(slot,children){let slotNode=useContext(LayoutPortalContext)[slot]??null;return slotNode?createPortal(children,slotNode):null}export const PanelRegistryContext=createContext(null);export function useDeclarePanel(slot,reg){let registry=useContext(PanelRegistryContext),{defaultSize,minSize,maxSize,collapsible}=reg;useLayoutEffect(()=>{if(registry)return registry.register(slot,{defaultSize,minSize,maxSize,collapsible}),()=>registry.unregister(slot)},[registry,slot,defaultSize,minSize,maxSize,collapsible])}export function useVisibleChange(visible,onChange){let prev=useRef(visible);useEffect(()=>{prev.current!==visible&&(prev.current=visible,onChange?.(visible))},[visible,onChange])}
@@ -0,0 +1,10 @@
1
+ import type { LayoutState, LayoutStore } from "./-types";
2
+ /**
3
+ * Default, dependency-free `LayoutStore` implementation: a tiny pub/sub wrapper
4
+ * around the pure `layoutReducer`. Skips notifying subscribers when an action is
5
+ * a no-op (reducer returns the same reference).
6
+ *
7
+ * Swap this for a zustand/redux-backed store by implementing the same
8
+ * `LayoutStore` interface — bindings and primitives are unaffected.
9
+ */
10
+ export declare function createLayoutStore(initial: LayoutState): LayoutStore;
@@ -0,0 +1 @@
1
+ import{layoutReducer}from"./reducer";export function createLayoutStore(initial){let state=initial,listeners=new Set;return{getState:()=>state,dispatch:action=>{let next=layoutReducer(state,action,initial);next!==state&&(state=next,listeners.forEach(listener=>listener()))},subscribe:listener=>(listeners.add(listener),()=>{listeners.delete(listener)})}}
@@ -0,0 +1,7 @@
1
+ import type { LayoutValue } from "./-types";
2
+ /**
3
+ * The single control hook. Returns `state` plus a typed handle per slot. Works
4
+ * from any descendant of `<LayoutProvider>` — remote control without prop
5
+ * drilling.
6
+ */
7
+ export declare function useLayout(): LayoutValue;
@@ -0,0 +1 @@
1
+ import{useLayoutSelector,useLayoutStore}from"./context";let selectAll=state=>state;function sidePanelHandle(panel,state,dispatch){let slot=state[panel];return{state:slot,isVisible:slot.visible,show:()=>dispatch({type:"setVisible",slot:panel,visible:!0}),hide:()=>dispatch({type:"setVisible",slot:panel,visible:!1}),resize:size=>dispatch({type:"resize",slot:panel,size}),setVariant:variant=>dispatch({type:"setVariant",panel,variant}),reset:()=>dispatch({type:"reset",slot:panel})}}function panelHandle(panel,state,dispatch){let slot=state[panel];return{state:slot,isVisible:slot.visible,show:()=>dispatch({type:"setVisible",slot:panel,visible:!0}),hide:()=>dispatch({type:"setVisible",slot:panel,visible:!1}),resize:size=>dispatch({type:"resize",slot:panel,size}),reset:()=>dispatch({type:"reset",slot:panel})}}export function useLayout(){let store=useLayoutStore(),state=useLayoutSelector(selectAll),{dispatch}=store;return{state,sidebar:sidePanelHandle("sidebar",state,dispatch),rightPanel:sidePanelHandle("rightPanel",state,dispatch),content:panelHandle("content",state,dispatch),splitview:panelHandle("splitview",state,dispatch)}}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Track a set of DOM elements by key, with stable per-key ref callbacks.
3
+ *
4
+ * Given a fixed list of keys, returns `[elements, refs]`:
5
+ * - `refs[key]` — a ref callback to attach to an element; captures it into
6
+ * `elements[key]` (and clears it to `null` on unmount).
7
+ * - `elements[key]` — the currently-attached element (undefined until set).
8
+ *
9
+ * The callbacks are **stable** across renders, so React invokes them only on
10
+ * mount/unmount — not detach/attach every render. (An inline `ref={el => …}`
11
+ * that calls setState would get a new identity each render and loop.)
12
+ *
13
+ * Agnostic utility — useful whenever something needs the live DOM node of a
14
+ * child: portal targets, measurement, focus management, etc.
15
+ */
16
+ export declare function usePanelRefs<K extends string>(keys: readonly K[]): [
17
+ Partial<Record<K, HTMLElement | null>>,
18
+ Record<K, (el: HTMLElement | null) => void>
19
+ ];
@@ -0,0 +1 @@
1
+ import{useMemo,useState}from"react";export function usePanelRefs(keys){let[elements,setElements]=useState({});return[elements,useMemo(()=>{let map={};return keys.forEach(key=>{map[key]=el=>setElements(prev=>prev[key]===el?prev:{...prev,[key]:el})}),map},[keys])]}