@ngrok/mantle 0.81.1 → 0.82.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.
- package/dist/accordion.js +1 -1
- package/dist/agent.json +4 -1
- package/dist/alert-BWwNPOMI.d.ts +391 -0
- package/dist/alert-center.d.ts +647 -0
- package/dist/alert-center.js +1 -0
- package/dist/alert-dialog.js +1 -1
- package/dist/alert-vwFd7qdp.js +1 -0
- package/dist/alert.d.ts +1 -390
- package/dist/alert.js +1 -1
- package/dist/{anchor-DfeXTpKW.js → anchor-3OGK2UKU.js} +1 -1
- package/dist/anchor.js +1 -1
- package/dist/app-layout.d.ts +566 -0
- package/dist/app-layout.js +1 -0
- package/dist/area-chart.js +1 -1
- package/dist/badge.js +1 -1
- package/dist/bar-chart.js +1 -1
- package/dist/breadcrumb.d.ts +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/browser-only-CmEEzfU3.js +1 -0
- package/dist/browser-only.js +1 -1
- package/dist/{button-DjpEKt2X.js → button-Cnja9Bsr.js} +1 -1
- package/dist/{button-D9n09xUg.js → button-DmJkYfyl.js} +1 -1
- package/dist/{button-BAno7KIU.js → button-IlxHhjPK.js} +1 -1
- package/dist/button.js +1 -1
- package/dist/calendar.d.ts +1 -1
- package/dist/card.js +1 -1
- package/dist/centered-layout.d.ts +9 -9
- package/dist/centered-layout.js +1 -1
- package/dist/chart-B3pAvmkk.js +2 -0
- package/dist/{choice-BHwFSSyv.js → choice-CnwfjSEu.js} +1 -1
- package/dist/choice.js +1 -1
- package/dist/code-block.js +1 -1
- package/dist/code.js +1 -1
- package/dist/combobox.js +1 -1
- package/dist/command.js +1 -1
- package/dist/cookie-ca4g5CKp.js +1 -0
- package/dist/{copy-to-clipboard-BsCQ9m6K.js → copy-to-clipboard-B4UB6pts.js} +1 -1
- package/dist/data-slot-EM6s2WEU.js +1 -0
- package/dist/data-table.js +1 -1
- package/dist/description-list.js +1 -1
- package/dist/{dialog-DWZWd5Jt.js → dialog-DozL6n-F.js} +1 -1
- package/dist/dialog.d.ts +1 -1
- package/dist/dialog.js +1 -1
- package/dist/dropdown-menu-BRH0Wd_z.js +1 -0
- package/dist/dropdown-menu.js +1 -1
- package/dist/empty.js +1 -1
- package/dist/field.d.ts +1 -1
- package/dist/field.js +1 -1
- package/dist/hooks.js +1 -1
- package/dist/{icons-DLCs1hLP.js → icons-Bb_zF2OV.js} +1 -1
- package/dist/icons.js +1 -1
- package/dist/input.js +1 -1
- package/dist/line-chart.js +1 -1
- package/dist/{list-51KQvENW.js → list-CJABVHwi.js} +1 -1
- package/dist/list.js +1 -1
- package/dist/llms.txt +4 -1
- package/dist/main.d.ts +35 -1
- package/dist/main.js +1 -1
- package/dist/mantle.css +21 -1
- package/dist/media-object.js +1 -1
- package/dist/multi-select.d.ts +10 -2
- package/dist/multi-select.js +1 -1
- package/dist/otp-input.js +1 -1
- package/dist/pagination.js +1 -1
- package/dist/platform-BVD3gpKD.js +1 -0
- package/dist/{primitive-trJDqIXJ.js → primitive-D-9GIFWb.js} +1 -1
- package/dist/progress.d.ts +8 -8
- package/dist/qr-code.js +1 -1
- package/dist/radio-group.d.ts +10 -0
- package/dist/radio-group.js +1 -1
- package/dist/sandboxed-on-click.js +1 -1
- package/dist/scatter-plot.d.ts +2 -1
- package/dist/scatter-plot.js +1 -1
- package/dist/{select-BCHWvmyC.js → select-BReznXaw.js} +1 -1
- package/dist/select.js +1 -1
- package/dist/selectable-list.js +1 -1
- package/dist/{separator-bpE_kooz.js → separator-D0D6VyyM.js} +1 -1
- package/dist/separator.js +1 -1
- package/dist/sheet-BxvTfPLM.js +1 -0
- package/dist/sheet.d.ts +1 -1
- package/dist/sheet.js +1 -1
- package/dist/sidebar.d.ts +2558 -0
- package/dist/sidebar.js +1 -0
- package/dist/{skeleton-CsbUHbBA.js → skeleton-BhcJMpem.js} +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/skip-to-main-link.js +1 -1
- package/dist/slot-DdgxmuI5.d.ts +67 -0
- package/dist/slot-DpNWVci8.js +1 -0
- package/dist/slot.d.ts +1 -1
- package/dist/slot.js +1 -1
- package/dist/split-button.js +1 -1
- package/dist/tabs.js +1 -1
- package/dist/theme-BorfgnNh.js +1 -0
- package/dist/theme-switcher.d.ts +1 -1
- package/dist/theme-switcher.js +1 -1
- package/dist/theme.js +1 -1
- package/dist/toast.js +1 -1
- package/dist/tooltip-Dnu35cjU.js +1 -0
- package/dist/tooltip-mrpLz4DZ.d.ts +218 -0
- package/dist/tooltip.d.ts +1 -217
- package/dist/tooltip.js +1 -1
- package/dist/use-breakpoint-Wd7_5-Mu.js +1 -0
- package/dist/use-copy-to-clipboard-CSyp4Zk0.js +1 -0
- package/dist/use-is-hydrated-DDCqXmju.js +1 -0
- package/dist/{use-prefers-reduced-motion-CagaNRgm.js → use-prefers-reduced-motion-Bk5zAfHY.js} +1 -1
- package/dist/utils.js +1 -1
- package/dist/well.js +1 -1
- package/package.json +16 -13
- package/dist/browser-only-CPH56Xw_.js +0 -1
- package/dist/chart-Do2qkrxl.js +0 -2
- package/dist/dropdown-menu-RyDWoKHx.js +0 -1
- package/dist/slot-BtwKJTLq.d.ts +0 -25
- package/dist/slot-CDk0Bb9z.js +0 -1
- package/dist/theme-C26-Xolp.js +0 -1
- package/dist/use-copy-to-clipboard-DqQ0_N3E.js +0 -1
|
@@ -0,0 +1,2558 @@
|
|
|
1
|
+
import { n as WithAsChild, t as SelfClosingWithAsChild } from "./as-child-D23mGo4f.js";
|
|
2
|
+
import { t as WithDataSlot } from "./data-slot-CChfb_cv.js";
|
|
3
|
+
import { n as IconButtonProps } from "./button-C7vAl6lS.js";
|
|
4
|
+
import { n as Separator } from "./separator-B5UmkVRL.js";
|
|
5
|
+
import { t as Tooltip } from "./tooltip-mrpLz4DZ.js";
|
|
6
|
+
import { ComponentProps, ReactElement, ReactNode } from "react";
|
|
7
|
+
//#region src/components/sidebar/sidebar.d.ts
|
|
8
|
+
/**
|
|
9
|
+
* The breakpoints below which `Sidebar.Nav` swaps from the inline desktop
|
|
10
|
+
* panel to the mobile `Sheet` presentation. Kept to a closed set because the
|
|
11
|
+
* pre-hydration visibility classes are static strings (Tailwind cannot see
|
|
12
|
+
* interpolated class names).
|
|
13
|
+
*
|
|
14
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <Sidebar.Root mobileBreakpoint="md">…</Sidebar.Root>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
type SidebarMobileBreakpoint = "sm" | "md" | "lg";
|
|
22
|
+
/**
|
|
23
|
+
* The state and actions shared by every part under a `Sidebar.Root`, returned
|
|
24
|
+
* by {@link useSidebar}. Use it to build custom triggers, keyboard shortcuts,
|
|
25
|
+
* or close-on-navigate behavior.
|
|
26
|
+
*
|
|
27
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* function CollapseSidebarButton() {
|
|
32
|
+
* const { open, toggle } = useSidebar();
|
|
33
|
+
* return (
|
|
34
|
+
* <button type="button" onClick={toggle}>
|
|
35
|
+
* {open ? "Collapse" : "Expand"} sidebar
|
|
36
|
+
* </button>
|
|
37
|
+
* );
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
type SidebarState = {
|
|
42
|
+
/**
|
|
43
|
+
* Whether the desktop sidebar is expanded. Mirrored as
|
|
44
|
+
* `data-state="expanded" | "collapsed"` on `Sidebar.Nav`.
|
|
45
|
+
*/
|
|
46
|
+
open: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Set the desktop expanded state. Calls `onOpenChange` and, when
|
|
49
|
+
* uncontrolled, updates the internal state.
|
|
50
|
+
*/
|
|
51
|
+
setOpen: (open: boolean) => void;
|
|
52
|
+
/**
|
|
53
|
+
* Whether the mobile sheet is open. Only meaningful when `isMobile`.
|
|
54
|
+
*/
|
|
55
|
+
openMobile: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Set the mobile sheet open state. Calls `onOpenMobileChange` and, when
|
|
58
|
+
* uncontrolled, updates the internal state. Use it to close the sheet on
|
|
59
|
+
* navigation.
|
|
60
|
+
*/
|
|
61
|
+
setOpenMobile: (open: boolean) => void;
|
|
62
|
+
/**
|
|
63
|
+
* `true` when the viewport is below `mobileBreakpoint`. `false` during SSR
|
|
64
|
+
* and the hydration render (desktop-first).
|
|
65
|
+
*/
|
|
66
|
+
isMobile: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* The breakpoint below which the sidebar renders as a mobile sheet.
|
|
69
|
+
*/
|
|
70
|
+
mobileBreakpoint: SidebarMobileBreakpoint;
|
|
71
|
+
/**
|
|
72
|
+
* Toggle the sidebar: the mobile sheet when `isMobile`, the desktop
|
|
73
|
+
* expanded state otherwise. This is what `Sidebar.Trigger` calls.
|
|
74
|
+
*/
|
|
75
|
+
toggle: () => void;
|
|
76
|
+
/**
|
|
77
|
+
* The generated id of the sidebar's `<nav>` landmark. `Sidebar.Trigger`
|
|
78
|
+
* references it via `aria-controls`; reuse it when building custom
|
|
79
|
+
* triggers.
|
|
80
|
+
*/
|
|
81
|
+
navId: string;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Read the nearest `Sidebar.Root` state. Throws when called outside a
|
|
85
|
+
* `Sidebar.Root` so misuse fails loudly. Use it to build custom triggers,
|
|
86
|
+
* a keyboard shortcut, or close-on-navigate behavior.
|
|
87
|
+
*
|
|
88
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#usesidebar
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* function CloseSidebarOnNavigate() {
|
|
93
|
+
* const { setOpenMobile } = useSidebar();
|
|
94
|
+
* const location = useLocation();
|
|
95
|
+
* useEffect(() => {
|
|
96
|
+
* setOpenMobile(false);
|
|
97
|
+
* }, [location.pathname, setOpenMobile]);
|
|
98
|
+
* return null;
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
declare function useSidebar(): SidebarState;
|
|
103
|
+
type SidebarRootProps = {
|
|
104
|
+
/**
|
|
105
|
+
* The sidebar's parts — a `Sidebar.Nav` and anything that reads the state,
|
|
106
|
+
* including a `Sidebar.Trigger` rendered anywhere below (an
|
|
107
|
+
* `AppLayout.Header`, for example). `Root` renders no DOM of its own.
|
|
108
|
+
*/
|
|
109
|
+
children?: ReactNode;
|
|
110
|
+
/**
|
|
111
|
+
* The initial desktop expanded state for the uncontrolled case.
|
|
112
|
+
*
|
|
113
|
+
* @default true
|
|
114
|
+
*/
|
|
115
|
+
defaultOpen?: boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Controlled desktop expanded state. Pair with `onOpenChange`.
|
|
118
|
+
*/
|
|
119
|
+
open?: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Called with the next desktop expanded state whenever it changes.
|
|
122
|
+
*/
|
|
123
|
+
onOpenChange?: (open: boolean) => void;
|
|
124
|
+
/**
|
|
125
|
+
* Controlled mobile sheet open state. Pair with `onOpenMobileChange`.
|
|
126
|
+
*/
|
|
127
|
+
openMobile?: boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Called with the next mobile sheet open state whenever it changes.
|
|
130
|
+
*/
|
|
131
|
+
onOpenMobileChange?: (open: boolean) => void;
|
|
132
|
+
/**
|
|
133
|
+
* The breakpoint below which `Sidebar.Nav` renders as a mobile `Sheet`
|
|
134
|
+
* instead of the inline desktop panel.
|
|
135
|
+
*
|
|
136
|
+
* @default "lg"
|
|
137
|
+
*/
|
|
138
|
+
mobileBreakpoint?: SidebarMobileBreakpoint;
|
|
139
|
+
/**
|
|
140
|
+
* Toggle the sidebar with `⌘B` (macOS) / `Ctrl+B` (Windows/Linux). The
|
|
141
|
+
* shortcut requires exactly the platform modifier + `b`: `⌘` on Apple
|
|
142
|
+
* platforms and `Ctrl` everywhere else, resolved per host — the two never
|
|
143
|
+
* substitute for each other, so macOS's native `Ctrl+B` ("move the caret
|
|
144
|
+
* back one character") is left alone. Combinations with `Shift`/`Alt` (e.g.
|
|
145
|
+
* the browser's own `⌘⇧B`) pass through too.
|
|
146
|
+
*
|
|
147
|
+
* The shortcut is also ignored while focus is in a text-editing or form
|
|
148
|
+
* control — an `<input>`, `<textarea>`, `<select>`, or any `contenteditable`
|
|
149
|
+
* host — because the chord is usually already bound there (`⌘B` is "bold")
|
|
150
|
+
* and this is a `window` listener that calls `preventDefault()`. That covers
|
|
151
|
+
* embedded editors like Monaco and CodeMirror, which attach to exactly those
|
|
152
|
+
* elements. Set `false` to opt out entirely.
|
|
153
|
+
*
|
|
154
|
+
* The shortcut has exactly one owner per window: the first mounted root
|
|
155
|
+
* with the shortcut enabled. Additional roots (nested or siblings) queue
|
|
156
|
+
* and take ownership only when the owner unmounts, so composing a second
|
|
157
|
+
* sidebar never makes one keypress toggle both.
|
|
158
|
+
*
|
|
159
|
+
* @default true
|
|
160
|
+
*/
|
|
161
|
+
keyboardShortcut?: boolean;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* The state owner for a sidebar. Renders no DOM of its own (like
|
|
165
|
+
* `Tooltip.Root`) — it provides the expanded/collapsed and mobile-sheet state
|
|
166
|
+
* to every part below it, so `Sidebar.Trigger` can live anywhere in the tree
|
|
167
|
+
* (for example inside an `AppLayout.Header`) without coupling the app shell
|
|
168
|
+
* to the sidebar.
|
|
169
|
+
*
|
|
170
|
+
* Render exactly one `Sidebar.Nav` per `Sidebar.Root`. Nested roots shadow
|
|
171
|
+
* the outer sidebar for everything below them.
|
|
172
|
+
*
|
|
173
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarroot
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```tsx
|
|
177
|
+
* <Sidebar.Root>
|
|
178
|
+
* <Sidebar.Nav aria-label="Main">
|
|
179
|
+
* <Sidebar.Header>
|
|
180
|
+
* <DropdownMenu.Root>
|
|
181
|
+
* <DropdownMenu.Trigger asChild>
|
|
182
|
+
* <Sidebar.SwitcherTrigger>
|
|
183
|
+
* <GlobeIcon />
|
|
184
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
185
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
186
|
+
* </Sidebar.SwitcherTrigger>
|
|
187
|
+
* </DropdownMenu.Trigger>
|
|
188
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
189
|
+
* </DropdownMenu.Root>
|
|
190
|
+
* </Sidebar.Header>
|
|
191
|
+
* <Sidebar.Body>
|
|
192
|
+
* <Sidebar.Group>
|
|
193
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
194
|
+
* <Sidebar.List>
|
|
195
|
+
* <Sidebar.Item>
|
|
196
|
+
* <Sidebar.ItemButton asChild current>
|
|
197
|
+
* <a href="/endpoints">
|
|
198
|
+
* <GraphIcon />
|
|
199
|
+
* Endpoints
|
|
200
|
+
* </a>
|
|
201
|
+
* </Sidebar.ItemButton>
|
|
202
|
+
* </Sidebar.Item>
|
|
203
|
+
* </Sidebar.List>
|
|
204
|
+
* </Sidebar.Group>
|
|
205
|
+
* </Sidebar.Body>
|
|
206
|
+
* <Sidebar.Footer>
|
|
207
|
+
* <Sidebar.Separator />
|
|
208
|
+
* <DropdownMenu.Root>
|
|
209
|
+
* <DropdownMenu.Trigger asChild>
|
|
210
|
+
* <Sidebar.SwitcherTrigger>
|
|
211
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
212
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
213
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
214
|
+
* </Sidebar.SwitcherTrigger>
|
|
215
|
+
* </DropdownMenu.Trigger>
|
|
216
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
217
|
+
* </DropdownMenu.Root>
|
|
218
|
+
* </Sidebar.Footer>
|
|
219
|
+
* </Sidebar.Nav>
|
|
220
|
+
* <Sidebar.Trigger />
|
|
221
|
+
* </Sidebar.Root>
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
declare const Root: ({ children, defaultOpen, keyboardShortcut, mobileBreakpoint, onOpenChange, onOpenMobileChange, open: openProp, openMobile: openMobileProp }: SidebarRootProps) => import("react").JSX.Element;
|
|
225
|
+
type SidebarNavProps = ComponentProps<"div"> & WithDataSlot;
|
|
226
|
+
/**
|
|
227
|
+
* The sidebar panel. On viewports at or above the root's `mobileBreakpoint`
|
|
228
|
+
* it renders inline (in normal flow, so it composes under an
|
|
229
|
+
* `AppLayout.Notice` banner) and collapses by animating its width down to a
|
|
230
|
+
* skinny icon rail (`--sidebar-width-icon`): group labels fade out in place
|
|
231
|
+
* and each row becomes a square chip around its leading icon, but everything
|
|
232
|
+
* keeps its expanded position and stays in the tab order and the
|
|
233
|
+
* accessibility tree. Below the breakpoint it renders inside a mantle
|
|
234
|
+
* `Sheet` on the left.
|
|
235
|
+
*
|
|
236
|
+
* `className`, `style`, `ref`, and rest props land on the panel surface in
|
|
237
|
+
* both presentations (the desktop animator / the mobile `Sheet.Content`), so
|
|
238
|
+
* the width variables work anywhere:
|
|
239
|
+
* `className="[--sidebar-width:20rem] [--sidebar-width-mobile:20rem]"`.
|
|
240
|
+
* `aria-label` (default `"Main"`) is forwarded to the inner `<nav>` landmark.
|
|
241
|
+
*
|
|
242
|
+
* **CSS variables (public API):**
|
|
243
|
+
*
|
|
244
|
+
* | CSS Variable | Default | Description |
|
|
245
|
+
* | --- | --- | --- |
|
|
246
|
+
* | `--sidebar-width` | `16rem` | Expanded desktop panel width (256px). |
|
|
247
|
+
* | `--sidebar-width-mobile` | `18rem` | Mobile sheet width (288px). |
|
|
248
|
+
* | `--sidebar-width-icon` | `3.25rem` | Collapsed icon rail width (52px). |
|
|
249
|
+
* | `--sidebar-row-width` | `15rem` | Derived, not set: one row's width in the expanded panel (240px), for sizing surfaces that render *outside* it. See below and `Sidebar.SwitcherTrigger`. |
|
|
250
|
+
*
|
|
251
|
+
* `--sidebar-row-width` is `calc(var(--sidebar-width,16rem) - 1rem)`, declared
|
|
252
|
+
* at `:root` by `mantle.css` — the panel width minus the row gutter this
|
|
253
|
+
* component's regions apply.
|
|
254
|
+
*
|
|
255
|
+
* Each of the three widths is read with its default as the fallback, and
|
|
256
|
+
* custom properties inherit, so set one on `Sidebar.Nav` to resize a single
|
|
257
|
+
* sidebar or on any ancestor (`:root` in your global stylesheet) to resize
|
|
258
|
+
* every sidebar in the app. `--sidebar-row-width` resolves at `:root`, so a
|
|
259
|
+
* `--sidebar-width` override scoped to one `Sidebar.Nav` does not reach it in
|
|
260
|
+
* either direction — a narrower panel leaves the floor *wider* than the row it
|
|
261
|
+
* opens from. Override `--sidebar-width` at `:root` to move both together, or
|
|
262
|
+
* set `--sidebar-row-width` on the outside surface itself.
|
|
263
|
+
*
|
|
264
|
+
* **Data attributes:**
|
|
265
|
+
*
|
|
266
|
+
* | Data Attribute | Value | Description |
|
|
267
|
+
* | --- | --- | --- |
|
|
268
|
+
* | `data-state` | `"expanded"` \| `"collapsed"` | On the desktop panel surface. Mirrors the root's expanded state and drives the width collapse to the icon rail; descendant parts style off it with `group-data-[state=collapsed]/sidebar-nav:`. |
|
|
269
|
+
* | `data-hydrated` | present after hydration | Presence-only, desktop panel surface. The CSS-side twin of the `isHydrated` gate: descendant collapse transitions are enabled only under `group-data-[hydrated]/sidebar-nav:`, so an SSR state correction snaps instead of animating on page load. |
|
|
270
|
+
* | `data-mobile` | present in the mobile sheet | Presence-only. Marks the `Sheet.Content` presentation used below the root's `mobileBreakpoint`. |
|
|
271
|
+
* | `data-state` | `"open"` \| `"closed"` | In the mobile sheet only, where the panel *is* the `Sheet`'s Radix dialog content element and Radix owns the attribute — the sheet's open/close animation state, not the desktop expanded state. Consumers style against it too. |
|
|
272
|
+
*
|
|
273
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarnav
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```tsx
|
|
277
|
+
* <Sidebar.Root>
|
|
278
|
+
* <Sidebar.Nav aria-label="Main">
|
|
279
|
+
* <Sidebar.Header>
|
|
280
|
+
* <DropdownMenu.Root>
|
|
281
|
+
* <DropdownMenu.Trigger asChild>
|
|
282
|
+
* <Sidebar.SwitcherTrigger>
|
|
283
|
+
* <GlobeIcon />
|
|
284
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
285
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
286
|
+
* </Sidebar.SwitcherTrigger>
|
|
287
|
+
* </DropdownMenu.Trigger>
|
|
288
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
289
|
+
* </DropdownMenu.Root>
|
|
290
|
+
* </Sidebar.Header>
|
|
291
|
+
* <Sidebar.Body>
|
|
292
|
+
* <Sidebar.Group>
|
|
293
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
294
|
+
* <Sidebar.List>
|
|
295
|
+
* <Sidebar.Item>
|
|
296
|
+
* <Sidebar.ItemButton asChild current>
|
|
297
|
+
* <a href="/endpoints">
|
|
298
|
+
* <GraphIcon />
|
|
299
|
+
* Endpoints
|
|
300
|
+
* </a>
|
|
301
|
+
* </Sidebar.ItemButton>
|
|
302
|
+
* </Sidebar.Item>
|
|
303
|
+
* </Sidebar.List>
|
|
304
|
+
* </Sidebar.Group>
|
|
305
|
+
* </Sidebar.Body>
|
|
306
|
+
* <Sidebar.Footer>
|
|
307
|
+
* <Sidebar.Separator />
|
|
308
|
+
* <DropdownMenu.Root>
|
|
309
|
+
* <DropdownMenu.Trigger asChild>
|
|
310
|
+
* <Sidebar.SwitcherTrigger>
|
|
311
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
312
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
313
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
314
|
+
* </Sidebar.SwitcherTrigger>
|
|
315
|
+
* </DropdownMenu.Trigger>
|
|
316
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
317
|
+
* </DropdownMenu.Root>
|
|
318
|
+
* </Sidebar.Footer>
|
|
319
|
+
* </Sidebar.Nav>
|
|
320
|
+
* <Sidebar.Trigger />
|
|
321
|
+
* </Sidebar.Root>
|
|
322
|
+
* ```
|
|
323
|
+
*/
|
|
324
|
+
declare const Nav: ({ "aria-label": ariaLabelProp, "aria-labelledby": ariaLabelledBy, children, className, "data-slot": dataSlot, ...props }: SidebarNavProps) => import("react").JSX.Element;
|
|
325
|
+
/**
|
|
326
|
+
* The props for `Sidebar.Trigger`. `IconButton`'s props, except the parts the
|
|
327
|
+
* trigger owns: `asChild` and `children` are removed (the trigger renders
|
|
328
|
+
* only its icon and sr-only label — build custom triggers with `useSidebar`
|
|
329
|
+
* instead), and `appearance`, `icon`, `intent`, and `label` become optional
|
|
330
|
+
* with sidebar defaults.
|
|
331
|
+
*/
|
|
332
|
+
type SidebarTriggerProps = Omit<IconButtonProps, "appearance" | "asChild" | "children" | "icon" | "intent" | "label"> & WithDataSlot & {
|
|
333
|
+
/**
|
|
334
|
+
* The visual style of the trigger `IconButton`.
|
|
335
|
+
*
|
|
336
|
+
* @default "ghost"
|
|
337
|
+
*/
|
|
338
|
+
appearance?: IconButtonProps["appearance"];
|
|
339
|
+
/**
|
|
340
|
+
* The icon rendered inside the trigger.
|
|
341
|
+
*
|
|
342
|
+
* @default <SidebarSimpleIcon />
|
|
343
|
+
*/
|
|
344
|
+
icon?: ReactNode;
|
|
345
|
+
/**
|
|
346
|
+
* The color intent of the trigger `IconButton`.
|
|
347
|
+
*
|
|
348
|
+
* @default "neutral"
|
|
349
|
+
*/
|
|
350
|
+
intent?: IconButtonProps["intent"];
|
|
351
|
+
/**
|
|
352
|
+
* The accessible name for the trigger. Visually hidden but announced to
|
|
353
|
+
* assistive technology. Override it for localization.
|
|
354
|
+
*
|
|
355
|
+
* @default "Toggle Sidebar"
|
|
356
|
+
*/
|
|
357
|
+
label?: string;
|
|
358
|
+
};
|
|
359
|
+
/**
|
|
360
|
+
* The button that toggles the sidebar: the mobile sheet below the root's
|
|
361
|
+
* `mobileBreakpoint`, the desktop expanded state otherwise. Renders a ghost
|
|
362
|
+
* neutral `IconButton` with `aria-expanded` and `aria-controls` wired to the
|
|
363
|
+
* sidebar's `<nav>`. Place it in your app shell's header (for example
|
|
364
|
+
* `AppLayout.Header`) — it must stay visible at every breakpoint where the
|
|
365
|
+
* sidebar can collapse, or users have no way to reopen it.
|
|
366
|
+
*
|
|
367
|
+
* **Data attributes:**
|
|
368
|
+
*
|
|
369
|
+
* | Data Attribute | Value | Description |
|
|
370
|
+
* | --- | --- | --- |
|
|
371
|
+
* | `data-state` | `"expanded"` \| `"collapsed"` | Mirrors what the trigger toggles: the mobile sheet below the root's `mobileBreakpoint`, the desktop panel otherwise. Pairs with `aria-expanded`. |
|
|
372
|
+
* | `data-appearance` | `"ghost"` \| `"outlined"` | Read, not stamped: the underlying `IconButton` reflects its `appearance`, which this part defaults to `"ghost"`. |
|
|
373
|
+
* | `data-intent` | `"accent"` \| `"danger"` \| `"neutral"` | Read, not stamped: the underlying `IconButton` reflects its `intent`, which this part defaults to `"neutral"`. |
|
|
374
|
+
* | `data-size` | `"xs"` \| `"sm"` \| `"md"` \| `"lg"` \| `"xl"` | Read, not stamped: the underlying `IconButton` reflects its `size` and its own `"md"` default. |
|
|
375
|
+
*
|
|
376
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebartrigger
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* ```tsx
|
|
380
|
+
* <Sidebar.Root>
|
|
381
|
+
* <Sidebar.Nav aria-label="Main">
|
|
382
|
+
* <Sidebar.Header>
|
|
383
|
+
* <DropdownMenu.Root>
|
|
384
|
+
* <DropdownMenu.Trigger asChild>
|
|
385
|
+
* <Sidebar.SwitcherTrigger>
|
|
386
|
+
* <GlobeIcon />
|
|
387
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
388
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
389
|
+
* </Sidebar.SwitcherTrigger>
|
|
390
|
+
* </DropdownMenu.Trigger>
|
|
391
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
392
|
+
* </DropdownMenu.Root>
|
|
393
|
+
* </Sidebar.Header>
|
|
394
|
+
* <Sidebar.Body>
|
|
395
|
+
* <Sidebar.Group>
|
|
396
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
397
|
+
* <Sidebar.List>
|
|
398
|
+
* <Sidebar.Item>
|
|
399
|
+
* <Sidebar.ItemButton asChild current>
|
|
400
|
+
* <a href="/endpoints">
|
|
401
|
+
* <GraphIcon />
|
|
402
|
+
* Endpoints
|
|
403
|
+
* </a>
|
|
404
|
+
* </Sidebar.ItemButton>
|
|
405
|
+
* </Sidebar.Item>
|
|
406
|
+
* </Sidebar.List>
|
|
407
|
+
* </Sidebar.Group>
|
|
408
|
+
* </Sidebar.Body>
|
|
409
|
+
* <Sidebar.Footer>
|
|
410
|
+
* <Sidebar.Separator />
|
|
411
|
+
* <DropdownMenu.Root>
|
|
412
|
+
* <DropdownMenu.Trigger asChild>
|
|
413
|
+
* <Sidebar.SwitcherTrigger>
|
|
414
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
415
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
416
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
417
|
+
* </Sidebar.SwitcherTrigger>
|
|
418
|
+
* </DropdownMenu.Trigger>
|
|
419
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
420
|
+
* </DropdownMenu.Root>
|
|
421
|
+
* </Sidebar.Footer>
|
|
422
|
+
* </Sidebar.Nav>
|
|
423
|
+
* <Sidebar.Trigger />
|
|
424
|
+
* </Sidebar.Root>
|
|
425
|
+
* ```
|
|
426
|
+
*
|
|
427
|
+
* @example
|
|
428
|
+
* Placement within an `AppLayout` shell:
|
|
429
|
+
* ```tsx
|
|
430
|
+
* <Sidebar.Root>
|
|
431
|
+
* <AppLayout.Workspace>
|
|
432
|
+
* <Sidebar.Nav aria-label="Main">…</Sidebar.Nav>
|
|
433
|
+
* <AppLayout.Content>
|
|
434
|
+
* <AppLayout.Header>
|
|
435
|
+
* <Sidebar.Trigger />
|
|
436
|
+
* </AppLayout.Header>
|
|
437
|
+
* <AppLayout.Body>…</AppLayout.Body>
|
|
438
|
+
* </AppLayout.Content>
|
|
439
|
+
* </AppLayout.Workspace>
|
|
440
|
+
* </Sidebar.Root>
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
declare const Trigger: ({ appearance, "data-slot": dataSlot, icon, intent, label, onClick, ...props }: SidebarTriggerProps) => import("react").JSX.Element;
|
|
444
|
+
type SidebarHeaderProps = ComponentProps<"div"> & WithAsChild & WithDataSlot;
|
|
445
|
+
/**
|
|
446
|
+
* The top container of a `Sidebar.Nav`, pinned above the scrollable
|
|
447
|
+
* `Sidebar.Body`. Typically holds an app/product switcher built from
|
|
448
|
+
* `Sidebar.SwitcherTrigger` composed with a `DropdownMenu` or `Dialog`. Its
|
|
449
|
+
* height is the public `--sidebar-header-height` CSS variable (default
|
|
450
|
+
* `4.5rem`), which centers the switcher row on the same horizontal band as an
|
|
451
|
+
* `AppLayout.Header` toolbar — when a sidebar header is composed inside an
|
|
452
|
+
* `AppLayout`, the toolbar derives its own height from the same variable, so
|
|
453
|
+
* overriding it at a shared ancestor (e.g. `AppLayout.Root`) moves both rows
|
|
454
|
+
* together and the alignment holds by construction.
|
|
455
|
+
*
|
|
456
|
+
* **CSS variables (public API):**
|
|
457
|
+
*
|
|
458
|
+
* | CSS Variable | Default | Description |
|
|
459
|
+
* | --- | --- | --- |
|
|
460
|
+
* | `--sidebar-header-height` | `4.5rem` | The header row height (72px). Set it on a common ancestor of the sidebar and `AppLayout.Header`, not on `Sidebar.Nav`, so both rows read one value. |
|
|
461
|
+
*
|
|
462
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarheader
|
|
463
|
+
*
|
|
464
|
+
* @example
|
|
465
|
+
* ```tsx
|
|
466
|
+
* <Sidebar.Root>
|
|
467
|
+
* <Sidebar.Nav aria-label="Main">
|
|
468
|
+
* <Sidebar.Header>
|
|
469
|
+
* <DropdownMenu.Root>
|
|
470
|
+
* <DropdownMenu.Trigger asChild>
|
|
471
|
+
* <Sidebar.SwitcherTrigger>
|
|
472
|
+
* <GlobeIcon />
|
|
473
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
474
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
475
|
+
* </Sidebar.SwitcherTrigger>
|
|
476
|
+
* </DropdownMenu.Trigger>
|
|
477
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
478
|
+
* </DropdownMenu.Root>
|
|
479
|
+
* </Sidebar.Header>
|
|
480
|
+
* <Sidebar.Body>
|
|
481
|
+
* <Sidebar.Group>
|
|
482
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
483
|
+
* <Sidebar.List>
|
|
484
|
+
* <Sidebar.Item>
|
|
485
|
+
* <Sidebar.ItemButton asChild current>
|
|
486
|
+
* <a href="/endpoints">
|
|
487
|
+
* <GraphIcon />
|
|
488
|
+
* Endpoints
|
|
489
|
+
* </a>
|
|
490
|
+
* </Sidebar.ItemButton>
|
|
491
|
+
* </Sidebar.Item>
|
|
492
|
+
* </Sidebar.List>
|
|
493
|
+
* </Sidebar.Group>
|
|
494
|
+
* </Sidebar.Body>
|
|
495
|
+
* <Sidebar.Footer>
|
|
496
|
+
* <Sidebar.Separator />
|
|
497
|
+
* <DropdownMenu.Root>
|
|
498
|
+
* <DropdownMenu.Trigger asChild>
|
|
499
|
+
* <Sidebar.SwitcherTrigger>
|
|
500
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
501
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
502
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
503
|
+
* </Sidebar.SwitcherTrigger>
|
|
504
|
+
* </DropdownMenu.Trigger>
|
|
505
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
506
|
+
* </DropdownMenu.Root>
|
|
507
|
+
* </Sidebar.Footer>
|
|
508
|
+
* </Sidebar.Nav>
|
|
509
|
+
* <Sidebar.Trigger />
|
|
510
|
+
* </Sidebar.Root>
|
|
511
|
+
* ```
|
|
512
|
+
*/
|
|
513
|
+
declare const Header: ({ asChild, children, className, "data-slot": dataSlot, ...props }: SidebarHeaderProps) => import("react").JSX.Element;
|
|
514
|
+
type SidebarBodyProps = ComponentProps<"div"> & WithAsChild & WithDataSlot;
|
|
515
|
+
/**
|
|
516
|
+
* The scrollable middle region of a `Sidebar.Nav`, growing to fill the space
|
|
517
|
+
* between `Sidebar.Header` and `Sidebar.Footer`. Holds the navigation
|
|
518
|
+
* `Sidebar.Group` children. Overflowing edges fade out via the
|
|
519
|
+
* `scroll-fade-y` mask; inside the collapsed icon rail the scrollbar and its
|
|
520
|
+
* reserved gutter are hidden and the fade is the only overflow signal.
|
|
521
|
+
*
|
|
522
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarbody
|
|
523
|
+
*
|
|
524
|
+
* @example
|
|
525
|
+
* ```tsx
|
|
526
|
+
* <Sidebar.Root>
|
|
527
|
+
* <Sidebar.Nav aria-label="Main">
|
|
528
|
+
* <Sidebar.Header>
|
|
529
|
+
* <DropdownMenu.Root>
|
|
530
|
+
* <DropdownMenu.Trigger asChild>
|
|
531
|
+
* <Sidebar.SwitcherTrigger>
|
|
532
|
+
* <GlobeIcon />
|
|
533
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
534
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
535
|
+
* </Sidebar.SwitcherTrigger>
|
|
536
|
+
* </DropdownMenu.Trigger>
|
|
537
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
538
|
+
* </DropdownMenu.Root>
|
|
539
|
+
* </Sidebar.Header>
|
|
540
|
+
* <Sidebar.Body>
|
|
541
|
+
* <Sidebar.Group>
|
|
542
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
543
|
+
* <Sidebar.List>
|
|
544
|
+
* <Sidebar.Item>
|
|
545
|
+
* <Sidebar.ItemButton asChild current>
|
|
546
|
+
* <a href="/endpoints">
|
|
547
|
+
* <GraphIcon />
|
|
548
|
+
* Endpoints
|
|
549
|
+
* </a>
|
|
550
|
+
* </Sidebar.ItemButton>
|
|
551
|
+
* </Sidebar.Item>
|
|
552
|
+
* </Sidebar.List>
|
|
553
|
+
* </Sidebar.Group>
|
|
554
|
+
* </Sidebar.Body>
|
|
555
|
+
* <Sidebar.Footer>
|
|
556
|
+
* <Sidebar.Separator />
|
|
557
|
+
* <DropdownMenu.Root>
|
|
558
|
+
* <DropdownMenu.Trigger asChild>
|
|
559
|
+
* <Sidebar.SwitcherTrigger>
|
|
560
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
561
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
562
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
563
|
+
* </Sidebar.SwitcherTrigger>
|
|
564
|
+
* </DropdownMenu.Trigger>
|
|
565
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
566
|
+
* </DropdownMenu.Root>
|
|
567
|
+
* </Sidebar.Footer>
|
|
568
|
+
* </Sidebar.Nav>
|
|
569
|
+
* <Sidebar.Trigger />
|
|
570
|
+
* </Sidebar.Root>
|
|
571
|
+
* ```
|
|
572
|
+
*/
|
|
573
|
+
declare const Body: ({ asChild, children, className, "data-slot": dataSlot, ...props }: SidebarBodyProps) => import("react").JSX.Element;
|
|
574
|
+
type SidebarFooterProps = ComponentProps<"div"> & WithAsChild & WithDataSlot;
|
|
575
|
+
/**
|
|
576
|
+
* The bottom container of a `Sidebar.Nav`, pinned below the scrollable
|
|
577
|
+
* `Sidebar.Body`. Typically holds cross-product items and the account/user
|
|
578
|
+
* switcher row (`Sidebar.SwitcherTrigger` with `Sidebar.AccountAvatar` and
|
|
579
|
+
* `Sidebar.UserAvatar`).
|
|
580
|
+
*
|
|
581
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarfooter
|
|
582
|
+
*
|
|
583
|
+
* @example
|
|
584
|
+
* ```tsx
|
|
585
|
+
* <Sidebar.Root>
|
|
586
|
+
* <Sidebar.Nav aria-label="Main">
|
|
587
|
+
* <Sidebar.Header>
|
|
588
|
+
* <DropdownMenu.Root>
|
|
589
|
+
* <DropdownMenu.Trigger asChild>
|
|
590
|
+
* <Sidebar.SwitcherTrigger>
|
|
591
|
+
* <GlobeIcon />
|
|
592
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
593
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
594
|
+
* </Sidebar.SwitcherTrigger>
|
|
595
|
+
* </DropdownMenu.Trigger>
|
|
596
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
597
|
+
* </DropdownMenu.Root>
|
|
598
|
+
* </Sidebar.Header>
|
|
599
|
+
* <Sidebar.Body>
|
|
600
|
+
* <Sidebar.Group>
|
|
601
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
602
|
+
* <Sidebar.List>
|
|
603
|
+
* <Sidebar.Item>
|
|
604
|
+
* <Sidebar.ItemButton asChild current>
|
|
605
|
+
* <a href="/endpoints">
|
|
606
|
+
* <GraphIcon />
|
|
607
|
+
* Endpoints
|
|
608
|
+
* </a>
|
|
609
|
+
* </Sidebar.ItemButton>
|
|
610
|
+
* </Sidebar.Item>
|
|
611
|
+
* </Sidebar.List>
|
|
612
|
+
* </Sidebar.Group>
|
|
613
|
+
* </Sidebar.Body>
|
|
614
|
+
* <Sidebar.Footer>
|
|
615
|
+
* <Sidebar.Separator />
|
|
616
|
+
* <DropdownMenu.Root>
|
|
617
|
+
* <DropdownMenu.Trigger asChild>
|
|
618
|
+
* <Sidebar.SwitcherTrigger>
|
|
619
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
620
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
621
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
622
|
+
* </Sidebar.SwitcherTrigger>
|
|
623
|
+
* </DropdownMenu.Trigger>
|
|
624
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
625
|
+
* </DropdownMenu.Root>
|
|
626
|
+
* </Sidebar.Footer>
|
|
627
|
+
* </Sidebar.Nav>
|
|
628
|
+
* <Sidebar.Trigger />
|
|
629
|
+
* </Sidebar.Root>
|
|
630
|
+
* ```
|
|
631
|
+
*/
|
|
632
|
+
declare const Footer: ({ asChild, children, className, "data-slot": dataSlot, ...props }: SidebarFooterProps) => import("react").JSX.Element;
|
|
633
|
+
type SidebarGroupProps = ComponentProps<"div"> & WithAsChild & WithDataSlot;
|
|
634
|
+
/**
|
|
635
|
+
* A grouping container inside `Sidebar.Body` pairing an optional
|
|
636
|
+
* `Sidebar.GroupLabel` with a `Sidebar.List`. When a label is present, the
|
|
637
|
+
* group wires it to the list via `aria-labelledby` so assistive technology
|
|
638
|
+
* announces the list with the group's name.
|
|
639
|
+
*
|
|
640
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebargroup
|
|
641
|
+
*
|
|
642
|
+
* @example
|
|
643
|
+
* ```tsx
|
|
644
|
+
* <Sidebar.Root>
|
|
645
|
+
* <Sidebar.Nav aria-label="Main">
|
|
646
|
+
* <Sidebar.Header>
|
|
647
|
+
* <DropdownMenu.Root>
|
|
648
|
+
* <DropdownMenu.Trigger asChild>
|
|
649
|
+
* <Sidebar.SwitcherTrigger>
|
|
650
|
+
* <GlobeIcon />
|
|
651
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
652
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
653
|
+
* </Sidebar.SwitcherTrigger>
|
|
654
|
+
* </DropdownMenu.Trigger>
|
|
655
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
656
|
+
* </DropdownMenu.Root>
|
|
657
|
+
* </Sidebar.Header>
|
|
658
|
+
* <Sidebar.Body>
|
|
659
|
+
* <Sidebar.Group>
|
|
660
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
661
|
+
* <Sidebar.List>
|
|
662
|
+
* <Sidebar.Item>
|
|
663
|
+
* <Sidebar.ItemButton asChild current>
|
|
664
|
+
* <a href="/endpoints">
|
|
665
|
+
* <GraphIcon />
|
|
666
|
+
* Endpoints
|
|
667
|
+
* </a>
|
|
668
|
+
* </Sidebar.ItemButton>
|
|
669
|
+
* </Sidebar.Item>
|
|
670
|
+
* </Sidebar.List>
|
|
671
|
+
* </Sidebar.Group>
|
|
672
|
+
* </Sidebar.Body>
|
|
673
|
+
* <Sidebar.Footer>
|
|
674
|
+
* <Sidebar.Separator />
|
|
675
|
+
* <DropdownMenu.Root>
|
|
676
|
+
* <DropdownMenu.Trigger asChild>
|
|
677
|
+
* <Sidebar.SwitcherTrigger>
|
|
678
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
679
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
680
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
681
|
+
* </Sidebar.SwitcherTrigger>
|
|
682
|
+
* </DropdownMenu.Trigger>
|
|
683
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
684
|
+
* </DropdownMenu.Root>
|
|
685
|
+
* </Sidebar.Footer>
|
|
686
|
+
* </Sidebar.Nav>
|
|
687
|
+
* <Sidebar.Trigger />
|
|
688
|
+
* </Sidebar.Root>
|
|
689
|
+
* ```
|
|
690
|
+
*/
|
|
691
|
+
declare const Group: ({ asChild, children, className, "data-slot": dataSlot, ...props }: SidebarGroupProps) => import("react").JSX.Element;
|
|
692
|
+
type SidebarGroupLabelProps = ComponentProps<"div"> & WithAsChild & WithDataSlot;
|
|
693
|
+
/**
|
|
694
|
+
* The muted label of a `Sidebar.Group`, rendered above its `Sidebar.List`.
|
|
695
|
+
* Renders a `<div>` (not a heading, so the sidebar never dictates the page's
|
|
696
|
+
* heading outline); inside a `Sidebar.Group` it is automatically linked to
|
|
697
|
+
* the sibling list via `aria-labelledby`. Pass `asChild` to render a heading
|
|
698
|
+
* at a level you control.
|
|
699
|
+
*
|
|
700
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebargrouplabel
|
|
701
|
+
*
|
|
702
|
+
* @example
|
|
703
|
+
* ```tsx
|
|
704
|
+
* <Sidebar.Root>
|
|
705
|
+
* <Sidebar.Nav aria-label="Main">
|
|
706
|
+
* <Sidebar.Header>
|
|
707
|
+
* <DropdownMenu.Root>
|
|
708
|
+
* <DropdownMenu.Trigger asChild>
|
|
709
|
+
* <Sidebar.SwitcherTrigger>
|
|
710
|
+
* <GlobeIcon />
|
|
711
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
712
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
713
|
+
* </Sidebar.SwitcherTrigger>
|
|
714
|
+
* </DropdownMenu.Trigger>
|
|
715
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
716
|
+
* </DropdownMenu.Root>
|
|
717
|
+
* </Sidebar.Header>
|
|
718
|
+
* <Sidebar.Body>
|
|
719
|
+
* <Sidebar.Group>
|
|
720
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
721
|
+
* <Sidebar.List>
|
|
722
|
+
* <Sidebar.Item>
|
|
723
|
+
* <Sidebar.ItemButton asChild current>
|
|
724
|
+
* <a href="/endpoints">
|
|
725
|
+
* <GraphIcon />
|
|
726
|
+
* Endpoints
|
|
727
|
+
* </a>
|
|
728
|
+
* </Sidebar.ItemButton>
|
|
729
|
+
* </Sidebar.Item>
|
|
730
|
+
* </Sidebar.List>
|
|
731
|
+
* </Sidebar.Group>
|
|
732
|
+
* </Sidebar.Body>
|
|
733
|
+
* <Sidebar.Footer>
|
|
734
|
+
* <Sidebar.Separator />
|
|
735
|
+
* <DropdownMenu.Root>
|
|
736
|
+
* <DropdownMenu.Trigger asChild>
|
|
737
|
+
* <Sidebar.SwitcherTrigger>
|
|
738
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
739
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
740
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
741
|
+
* </Sidebar.SwitcherTrigger>
|
|
742
|
+
* </DropdownMenu.Trigger>
|
|
743
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
744
|
+
* </DropdownMenu.Root>
|
|
745
|
+
* </Sidebar.Footer>
|
|
746
|
+
* </Sidebar.Nav>
|
|
747
|
+
* <Sidebar.Trigger />
|
|
748
|
+
* </Sidebar.Root>
|
|
749
|
+
* ```
|
|
750
|
+
*/
|
|
751
|
+
declare const GroupLabel: ({ asChild, children, className, "data-slot": dataSlot, id: idProp, ...props }: SidebarGroupLabelProps) => import("react").JSX.Element;
|
|
752
|
+
type SidebarListProps = ComponentProps<"ul"> & WithAsChild & WithDataSlot;
|
|
753
|
+
/**
|
|
754
|
+
* The `<ul>` list of navigation rows inside a `Sidebar.Group`. When the group
|
|
755
|
+
* has a `Sidebar.GroupLabel`, the list is announced with the group's name via
|
|
756
|
+
* `aria-labelledby`.
|
|
757
|
+
*
|
|
758
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarlist
|
|
759
|
+
*
|
|
760
|
+
* @example
|
|
761
|
+
* ```tsx
|
|
762
|
+
* <Sidebar.Root>
|
|
763
|
+
* <Sidebar.Nav aria-label="Main">
|
|
764
|
+
* <Sidebar.Header>
|
|
765
|
+
* <DropdownMenu.Root>
|
|
766
|
+
* <DropdownMenu.Trigger asChild>
|
|
767
|
+
* <Sidebar.SwitcherTrigger>
|
|
768
|
+
* <GlobeIcon />
|
|
769
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
770
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
771
|
+
* </Sidebar.SwitcherTrigger>
|
|
772
|
+
* </DropdownMenu.Trigger>
|
|
773
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
774
|
+
* </DropdownMenu.Root>
|
|
775
|
+
* </Sidebar.Header>
|
|
776
|
+
* <Sidebar.Body>
|
|
777
|
+
* <Sidebar.Group>
|
|
778
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
779
|
+
* <Sidebar.List>
|
|
780
|
+
* <Sidebar.Item>
|
|
781
|
+
* <Sidebar.ItemButton asChild current>
|
|
782
|
+
* <a href="/endpoints">
|
|
783
|
+
* <GraphIcon />
|
|
784
|
+
* Endpoints
|
|
785
|
+
* </a>
|
|
786
|
+
* </Sidebar.ItemButton>
|
|
787
|
+
* </Sidebar.Item>
|
|
788
|
+
* </Sidebar.List>
|
|
789
|
+
* </Sidebar.Group>
|
|
790
|
+
* </Sidebar.Body>
|
|
791
|
+
* <Sidebar.Footer>
|
|
792
|
+
* <Sidebar.Separator />
|
|
793
|
+
* <DropdownMenu.Root>
|
|
794
|
+
* <DropdownMenu.Trigger asChild>
|
|
795
|
+
* <Sidebar.SwitcherTrigger>
|
|
796
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
797
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
798
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
799
|
+
* </Sidebar.SwitcherTrigger>
|
|
800
|
+
* </DropdownMenu.Trigger>
|
|
801
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
802
|
+
* </DropdownMenu.Root>
|
|
803
|
+
* </Sidebar.Footer>
|
|
804
|
+
* </Sidebar.Nav>
|
|
805
|
+
* <Sidebar.Trigger />
|
|
806
|
+
* </Sidebar.Root>
|
|
807
|
+
* ```
|
|
808
|
+
*/
|
|
809
|
+
declare const List: ({ "aria-labelledby": ariaLabelledBy, asChild, children, className, "data-slot": dataSlot, ...props }: SidebarListProps) => import("react").JSX.Element;
|
|
810
|
+
type SidebarItemProps = ComponentProps<"li"> & WithAsChild & WithDataSlot;
|
|
811
|
+
/**
|
|
812
|
+
* A single `<li>` row of a `Sidebar.List`. A plain wrapper — the interactive
|
|
813
|
+
* element is the `Sidebar.ItemButton` child, so props, `ref`, and `className`
|
|
814
|
+
* all target the list item itself.
|
|
815
|
+
*
|
|
816
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaritem
|
|
817
|
+
*
|
|
818
|
+
* @example
|
|
819
|
+
* ```tsx
|
|
820
|
+
* <Sidebar.Root>
|
|
821
|
+
* <Sidebar.Nav aria-label="Main">
|
|
822
|
+
* <Sidebar.Header>
|
|
823
|
+
* <DropdownMenu.Root>
|
|
824
|
+
* <DropdownMenu.Trigger asChild>
|
|
825
|
+
* <Sidebar.SwitcherTrigger>
|
|
826
|
+
* <GlobeIcon />
|
|
827
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
828
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
829
|
+
* </Sidebar.SwitcherTrigger>
|
|
830
|
+
* </DropdownMenu.Trigger>
|
|
831
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
832
|
+
* </DropdownMenu.Root>
|
|
833
|
+
* </Sidebar.Header>
|
|
834
|
+
* <Sidebar.Body>
|
|
835
|
+
* <Sidebar.Group>
|
|
836
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
837
|
+
* <Sidebar.List>
|
|
838
|
+
* <Sidebar.Item>
|
|
839
|
+
* <Sidebar.ItemButton asChild current>
|
|
840
|
+
* <a href="/endpoints">
|
|
841
|
+
* <GraphIcon />
|
|
842
|
+
* Endpoints
|
|
843
|
+
* </a>
|
|
844
|
+
* </Sidebar.ItemButton>
|
|
845
|
+
* </Sidebar.Item>
|
|
846
|
+
* </Sidebar.List>
|
|
847
|
+
* </Sidebar.Group>
|
|
848
|
+
* </Sidebar.Body>
|
|
849
|
+
* <Sidebar.Footer>
|
|
850
|
+
* <Sidebar.Separator />
|
|
851
|
+
* <DropdownMenu.Root>
|
|
852
|
+
* <DropdownMenu.Trigger asChild>
|
|
853
|
+
* <Sidebar.SwitcherTrigger>
|
|
854
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
855
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
856
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
857
|
+
* </Sidebar.SwitcherTrigger>
|
|
858
|
+
* </DropdownMenu.Trigger>
|
|
859
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
860
|
+
* </DropdownMenu.Root>
|
|
861
|
+
* </Sidebar.Footer>
|
|
862
|
+
* </Sidebar.Nav>
|
|
863
|
+
* <Sidebar.Trigger />
|
|
864
|
+
* </Sidebar.Root>
|
|
865
|
+
* ```
|
|
866
|
+
*/
|
|
867
|
+
declare const Item: ({ asChild, children, className, "data-slot": dataSlot, ...props }: SidebarItemProps) => import("react").JSX.Element;
|
|
868
|
+
type SidebarItemButtonProps = ComponentProps<"button"> & WithAsChild & WithDataSlot & {
|
|
869
|
+
/**
|
|
870
|
+
* Marks this row as the current page: sets `aria-current="page"` and the
|
|
871
|
+
* `data-current` styling state. Consumers control it from their router,
|
|
872
|
+
* e.g. `current={pathname === "/endpoints"}`.
|
|
873
|
+
*
|
|
874
|
+
* A composed child that sets `aria-current="page"` itself — react-router's
|
|
875
|
+
* `NavLink` does — already gets the current-row treatment, so it needs no
|
|
876
|
+
* `current`. This prop is for the rows whose parent knows.
|
|
877
|
+
*/
|
|
878
|
+
current?: boolean;
|
|
879
|
+
};
|
|
880
|
+
/**
|
|
881
|
+
* The interactive row of a `Sidebar.Item`: a leading icon slot and a
|
|
882
|
+
* truncating label. Renders a `<button>` by default; pass `asChild` to
|
|
883
|
+
* compose with a router link. `current` sets `aria-current="page"` and the
|
|
884
|
+
* `data-current` visual state.
|
|
885
|
+
*
|
|
886
|
+
* The current-row treatment follows either attribute, so a composed child that
|
|
887
|
+
* marks itself as the current page gets it without `current` — a react-router
|
|
888
|
+
* `NavLink` needs nothing but its `to`, since it already resolved the match the
|
|
889
|
+
* parent would otherwise re-derive:
|
|
890
|
+
*
|
|
891
|
+
* ```tsx
|
|
892
|
+
* <Sidebar.ItemButton asChild>
|
|
893
|
+
* <NavLink to="/endpoints">
|
|
894
|
+
* <GraphIcon />
|
|
895
|
+
* Endpoints
|
|
896
|
+
* </NavLink>
|
|
897
|
+
* </Sidebar.ItemButton>
|
|
898
|
+
* ```
|
|
899
|
+
*
|
|
900
|
+
* The row sizes its **leading** icon to 20px and leaves trailing visuals — a
|
|
901
|
+
* caret, a count, a status dot — to size themselves, so a row composed with
|
|
902
|
+
* `DropdownMenu.Trigger asChild` can end in `<CaretDownIcon className="text-muted
|
|
903
|
+
* ml-auto size-4 shrink-0" />` and stays highlighted while its menu is open
|
|
904
|
+
* (`data-state="open"`, supplied by the trigger). Give that menu the same width
|
|
905
|
+
* floor the switcher rows use — `className="min-w-(--sidebar-row-width)"` — so
|
|
906
|
+
* it keeps the expanded row's width instead of shrinking to this row's 28px
|
|
907
|
+
* rail chip (see `Sidebar.SwitcherTrigger` for the whole contract).
|
|
908
|
+
*
|
|
909
|
+
* **Data attributes:**
|
|
910
|
+
*
|
|
911
|
+
* | Data Attribute | Value | Description |
|
|
912
|
+
* | --- | --- | --- |
|
|
913
|
+
* | `data-current` | present when `current` | Presence-only — never `"false"`, since the `data-current:` variant matches the attribute's existence. Styles the current row. |
|
|
914
|
+
* | `aria-current` | `"page"` when `current` | Set alongside `data-current`. The current-row styling follows *either*, so a composed child that marks itself (react-router's `NavLink`) gets the treatment without the prop. |
|
|
915
|
+
* | `data-state` | `"open"` | **Read, not stamped** — supplied by a composing `DropdownMenu.Trigger` / `Dialog.Trigger`. The row styles against it so it stays highlighted while its menu is open. |
|
|
916
|
+
*
|
|
917
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaritembutton
|
|
918
|
+
*
|
|
919
|
+
* @example
|
|
920
|
+
* ```tsx
|
|
921
|
+
* <Sidebar.Root>
|
|
922
|
+
* <Sidebar.Nav aria-label="Main">
|
|
923
|
+
* <Sidebar.Header>
|
|
924
|
+
* <DropdownMenu.Root>
|
|
925
|
+
* <DropdownMenu.Trigger asChild>
|
|
926
|
+
* <Sidebar.SwitcherTrigger>
|
|
927
|
+
* <GlobeIcon />
|
|
928
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
929
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
930
|
+
* </Sidebar.SwitcherTrigger>
|
|
931
|
+
* </DropdownMenu.Trigger>
|
|
932
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
933
|
+
* </DropdownMenu.Root>
|
|
934
|
+
* </Sidebar.Header>
|
|
935
|
+
* <Sidebar.Body>
|
|
936
|
+
* <Sidebar.Group>
|
|
937
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
938
|
+
* <Sidebar.List>
|
|
939
|
+
* <Sidebar.Item>
|
|
940
|
+
* <Sidebar.ItemButton asChild current>
|
|
941
|
+
* <a href="/endpoints">
|
|
942
|
+
* <GraphIcon />
|
|
943
|
+
* Endpoints
|
|
944
|
+
* </a>
|
|
945
|
+
* </Sidebar.ItemButton>
|
|
946
|
+
* </Sidebar.Item>
|
|
947
|
+
* </Sidebar.List>
|
|
948
|
+
* </Sidebar.Group>
|
|
949
|
+
* </Sidebar.Body>
|
|
950
|
+
* <Sidebar.Footer>
|
|
951
|
+
* <Sidebar.Separator />
|
|
952
|
+
* <DropdownMenu.Root>
|
|
953
|
+
* <DropdownMenu.Trigger asChild>
|
|
954
|
+
* <Sidebar.SwitcherTrigger>
|
|
955
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
956
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
957
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
958
|
+
* </Sidebar.SwitcherTrigger>
|
|
959
|
+
* </DropdownMenu.Trigger>
|
|
960
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
961
|
+
* </DropdownMenu.Root>
|
|
962
|
+
* </Sidebar.Footer>
|
|
963
|
+
* </Sidebar.Nav>
|
|
964
|
+
* <Sidebar.Trigger />
|
|
965
|
+
* </Sidebar.Root>
|
|
966
|
+
* ```
|
|
967
|
+
*/
|
|
968
|
+
declare const ItemButton: ({ asChild, children, className, current, "data-slot": dataSlot, type, ...props }: SidebarItemButtonProps) => import("react").JSX.Element;
|
|
969
|
+
type SidebarSwitcherTriggerProps = ComponentProps<"button"> & WithAsChild & WithDataSlot;
|
|
970
|
+
/**
|
|
971
|
+
* The styled row for the sidebar's switchers: the app/product switcher in
|
|
972
|
+
* `Sidebar.Header` and the account/user row in `Sidebar.Footer`. A styled
|
|
973
|
+
* button only — it is not wired to any state; compose it with
|
|
974
|
+
* `DropdownMenu.Trigger asChild` or `Dialog.Trigger asChild`, which supply
|
|
975
|
+
* the open state (`data-state="open"` styling comes for free from those
|
|
976
|
+
* primitives).
|
|
977
|
+
*
|
|
978
|
+
* Inside the collapsed icon rail, the row collapses to
|
|
979
|
+
* its **first child element** — the leading visual (product icon, account
|
|
980
|
+
* avatar) — and the remaining children become visually hidden while staying
|
|
981
|
+
* in the accessibility tree, so the button's accessible name is unchanged.
|
|
982
|
+
* Wrap loose text in an element (e.g. a `<span>`) so it participates.
|
|
983
|
+
*
|
|
984
|
+
* A menu opened from the row should be as wide as the row: `width="trigger"`
|
|
985
|
+
* does that while the panel is expanded, but the row shrinks to a 36px chip in
|
|
986
|
+
* the icon rail and would drag the menu down to it. Floor the menu at the
|
|
987
|
+
* expanded row width with `className="min-w-(--sidebar-row-width)"` — the
|
|
988
|
+
* token `mantle.css` declares at `:root` for exactly this, since the menu
|
|
989
|
+
* renders in a portal and inherits nothing from the panel. The floor is a
|
|
990
|
+
* no-op while the panel is expanded (the row already measures that wide), and
|
|
991
|
+
* inert in the mobile sheet as long as its row is the wider of the two
|
|
992
|
+
* (`--sidebar-width-mobile` minus `1.5rem` and the sheet's 1px border, vs
|
|
993
|
+
* `--sidebar-width` minus `1rem`; 263px vs 240px at the defaults) — so widen
|
|
994
|
+
* `--sidebar-width-mobile` whenever you widen `--sidebar-width`, or the floor
|
|
995
|
+
* overhangs the sheet.
|
|
996
|
+
*
|
|
997
|
+
* **Data attributes:**
|
|
998
|
+
*
|
|
999
|
+
* | Data Attribute | Value | Description |
|
|
1000
|
+
* | --- | --- | --- |
|
|
1001
|
+
* | `data-state` | `"open"` | **Read, not stamped** — supplied by the composing `DropdownMenu.Trigger` / `Dialog.Trigger`. The row styles against it so it stays highlighted while its menu is open. |
|
|
1002
|
+
*
|
|
1003
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarswitchertrigger
|
|
1004
|
+
*
|
|
1005
|
+
* @example
|
|
1006
|
+
* ```tsx
|
|
1007
|
+
* <Sidebar.Root>
|
|
1008
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1009
|
+
* <Sidebar.Header>
|
|
1010
|
+
* <DropdownMenu.Root>
|
|
1011
|
+
* <DropdownMenu.Trigger asChild>
|
|
1012
|
+
* <Sidebar.SwitcherTrigger>
|
|
1013
|
+
* <GlobeIcon />
|
|
1014
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1015
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1016
|
+
* </Sidebar.SwitcherTrigger>
|
|
1017
|
+
* </DropdownMenu.Trigger>
|
|
1018
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1019
|
+
* </DropdownMenu.Root>
|
|
1020
|
+
* </Sidebar.Header>
|
|
1021
|
+
* <Sidebar.Body>
|
|
1022
|
+
* <Sidebar.Group>
|
|
1023
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1024
|
+
* <Sidebar.List>
|
|
1025
|
+
* <Sidebar.Item>
|
|
1026
|
+
* <Sidebar.ItemButton asChild current>
|
|
1027
|
+
* <a href="/endpoints">
|
|
1028
|
+
* <GraphIcon />
|
|
1029
|
+
* Endpoints
|
|
1030
|
+
* </a>
|
|
1031
|
+
* </Sidebar.ItemButton>
|
|
1032
|
+
* </Sidebar.Item>
|
|
1033
|
+
* </Sidebar.List>
|
|
1034
|
+
* </Sidebar.Group>
|
|
1035
|
+
* </Sidebar.Body>
|
|
1036
|
+
* <Sidebar.Footer>
|
|
1037
|
+
* <Sidebar.Separator />
|
|
1038
|
+
* <DropdownMenu.Root>
|
|
1039
|
+
* <DropdownMenu.Trigger asChild>
|
|
1040
|
+
* <Sidebar.SwitcherTrigger>
|
|
1041
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1042
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1043
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1044
|
+
* </Sidebar.SwitcherTrigger>
|
|
1045
|
+
* </DropdownMenu.Trigger>
|
|
1046
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1047
|
+
* </DropdownMenu.Root>
|
|
1048
|
+
* </Sidebar.Footer>
|
|
1049
|
+
* </Sidebar.Nav>
|
|
1050
|
+
* <Sidebar.Trigger />
|
|
1051
|
+
* </Sidebar.Root>
|
|
1052
|
+
* ```
|
|
1053
|
+
*/
|
|
1054
|
+
declare const SwitcherTrigger: ({ asChild, children, className, "data-slot": dataSlot, type, ...props }: SidebarSwitcherTriggerProps) => import("react").JSX.Element;
|
|
1055
|
+
/**
|
|
1056
|
+
* The props for `Sidebar.Tooltip`. `Tooltip.Content`'s props — so `className`,
|
|
1057
|
+
* `style`, `ref`, `asChild`, and any `data-*` reach the tooltip surface — except
|
|
1058
|
+
* the parts this row owns: `children` is the row being labeled (not the tooltip
|
|
1059
|
+
* body, which is `label`), and `side` becomes optional with a sidebar default.
|
|
1060
|
+
*/
|
|
1061
|
+
type SidebarTooltipProps = Omit<ComponentProps<typeof Tooltip.Content>, "children" | "side"> & WithDataSlot & {
|
|
1062
|
+
/**
|
|
1063
|
+
* The row this labels — a `Sidebar.ItemButton` or `Sidebar.SwitcherTrigger`,
|
|
1064
|
+
* optionally already wrapped in a `DropdownMenu.Trigger asChild`.
|
|
1065
|
+
*
|
|
1066
|
+
* A single element, required: `Tooltip.Trigger asChild` clones its child, so
|
|
1067
|
+
* text renders nothing a pointer can hover and no children renders no row at
|
|
1068
|
+
* all — both silently.
|
|
1069
|
+
*/
|
|
1070
|
+
children: ReactElement;
|
|
1071
|
+
/**
|
|
1072
|
+
* What the tooltip says. Normally the row's own label text: the rail clips the
|
|
1073
|
+
* visible one, so this is what a sighted pointer user reads.
|
|
1074
|
+
*/
|
|
1075
|
+
label: ReactNode;
|
|
1076
|
+
/**
|
|
1077
|
+
* Which side of the row the tooltip opens on. The rail sits at the inline
|
|
1078
|
+
* start of the viewport, so the default points the tooltip away from it.
|
|
1079
|
+
*
|
|
1080
|
+
* @default "right"
|
|
1081
|
+
*/
|
|
1082
|
+
side?: ComponentProps<typeof Tooltip.Content>["side"];
|
|
1083
|
+
};
|
|
1084
|
+
/**
|
|
1085
|
+
* Labels a sidebar row while — and only while — the desktop panel is collapsed
|
|
1086
|
+
* to the icon rail. Wrap it around a `Sidebar.ItemButton` or
|
|
1087
|
+
* `Sidebar.SwitcherTrigger`.
|
|
1088
|
+
*
|
|
1089
|
+
* The collapsed rail keeps every row's label in the accessibility tree (clipped,
|
|
1090
|
+
* not removed), which serves screen-reader users but leaves a sighted pointer
|
|
1091
|
+
* user with an unlabeled icon column. This restores the label for them without
|
|
1092
|
+
* duplicating it for anyone else: expanded rows already read their own text, and
|
|
1093
|
+
* the mobile sheet shows full labels, so the tooltip content only mounts in the
|
|
1094
|
+
* collapsed desktop rail.
|
|
1095
|
+
*
|
|
1096
|
+
* **Requires a `TooltipProvider` ancestor**, like any `Tooltip.Root` — mount one
|
|
1097
|
+
* at your app root. This part deliberately does not provide its own, so tooltip
|
|
1098
|
+
* delay and hover settings stay app-wide rather than being overridden per row.
|
|
1099
|
+
*
|
|
1100
|
+
* It composes with a menu trigger: nest `DropdownMenu.Root >
|
|
1101
|
+
* Sidebar.Tooltip > DropdownMenu.Trigger asChild > Sidebar.ItemButton` for a
|
|
1102
|
+
* row that opens a menu *and* labels itself in the rail. `DropdownMenu.Root` must
|
|
1103
|
+
* stay **outside** the tooltip — it is renderless, and `Tooltip.Trigger asChild`
|
|
1104
|
+
* needs a real element to clone.
|
|
1105
|
+
*
|
|
1106
|
+
* `children` is the row; `label` is what the tooltip says. Every other prop is
|
|
1107
|
+
* `Tooltip.Content`'s and lands on the tooltip surface — `className`, `style`,
|
|
1108
|
+
* `ref`, `data-*`, positioning props such as `align` and `sideOffset`, and
|
|
1109
|
+
* `asChild`, which Radix's `Tooltip.Content` implements itself. `side` defaults
|
|
1110
|
+
* to `"right"` so the tooltip opens away from the rail.
|
|
1111
|
+
*
|
|
1112
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebartooltip
|
|
1113
|
+
*
|
|
1114
|
+
* @example
|
|
1115
|
+
* ```tsx
|
|
1116
|
+
* <TooltipProvider>
|
|
1117
|
+
* <Sidebar.Root>
|
|
1118
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1119
|
+
* <Sidebar.Body>
|
|
1120
|
+
* <Sidebar.Group>
|
|
1121
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1122
|
+
* <Sidebar.List>
|
|
1123
|
+
* <Sidebar.Item>
|
|
1124
|
+
* <Sidebar.Tooltip label="Endpoints">
|
|
1125
|
+
* <Sidebar.ItemButton asChild current>
|
|
1126
|
+
* <a href="/endpoints">
|
|
1127
|
+
* <GraphIcon />
|
|
1128
|
+
* Endpoints
|
|
1129
|
+
* </a>
|
|
1130
|
+
* </Sidebar.ItemButton>
|
|
1131
|
+
* </Sidebar.Tooltip>
|
|
1132
|
+
* </Sidebar.Item>
|
|
1133
|
+
* </Sidebar.List>
|
|
1134
|
+
* </Sidebar.Group>
|
|
1135
|
+
* </Sidebar.Body>
|
|
1136
|
+
* <Sidebar.Footer>
|
|
1137
|
+
* <DropdownMenu.Root>
|
|
1138
|
+
* <Sidebar.Tooltip label="Help">
|
|
1139
|
+
* <DropdownMenu.Trigger asChild>
|
|
1140
|
+
* <Sidebar.ItemButton>
|
|
1141
|
+
* <QuestionIcon />
|
|
1142
|
+
* Help
|
|
1143
|
+
* </Sidebar.ItemButton>
|
|
1144
|
+
* </DropdownMenu.Trigger>
|
|
1145
|
+
* </Sidebar.Tooltip>
|
|
1146
|
+
* <DropdownMenu.Content>…</DropdownMenu.Content>
|
|
1147
|
+
* </DropdownMenu.Root>
|
|
1148
|
+
* </Sidebar.Footer>
|
|
1149
|
+
* </Sidebar.Nav>
|
|
1150
|
+
* <Sidebar.Trigger />
|
|
1151
|
+
* </Sidebar.Root>
|
|
1152
|
+
* </TooltipProvider>
|
|
1153
|
+
* ```
|
|
1154
|
+
*/
|
|
1155
|
+
declare const SidebarTooltip: ({ children, "data-slot": dataSlot, label, side, ...props }: SidebarTooltipProps) => import("react").JSX.Element;
|
|
1156
|
+
type SidebarSeparatorProps = ComponentProps<typeof Separator> & WithDataSlot;
|
|
1157
|
+
/**
|
|
1158
|
+
* An inset hairline between sidebar regions. Composes the mantle `Separator`,
|
|
1159
|
+
* staying aligned with the `px-3` content padding of `Sidebar.Body` and
|
|
1160
|
+
* `Sidebar.Footer` (it deliberately does not run edge to edge) with `my-3`
|
|
1161
|
+
* breathing room above and below. When collapsed to the icon rail, it widens
|
|
1162
|
+
* to the same 36px chip width as `Sidebar.SwitcherTrigger`, balancing the
|
|
1163
|
+
* adjacent app-content gutter that sits outside the rail.
|
|
1164
|
+
*
|
|
1165
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarseparator
|
|
1166
|
+
*
|
|
1167
|
+
* @example
|
|
1168
|
+
* ```tsx
|
|
1169
|
+
* <Sidebar.Root>
|
|
1170
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1171
|
+
* <Sidebar.Header>
|
|
1172
|
+
* <DropdownMenu.Root>
|
|
1173
|
+
* <DropdownMenu.Trigger asChild>
|
|
1174
|
+
* <Sidebar.SwitcherTrigger>
|
|
1175
|
+
* <GlobeIcon />
|
|
1176
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1177
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1178
|
+
* </Sidebar.SwitcherTrigger>
|
|
1179
|
+
* </DropdownMenu.Trigger>
|
|
1180
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1181
|
+
* </DropdownMenu.Root>
|
|
1182
|
+
* </Sidebar.Header>
|
|
1183
|
+
* <Sidebar.Body>
|
|
1184
|
+
* <Sidebar.Group>
|
|
1185
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1186
|
+
* <Sidebar.List>
|
|
1187
|
+
* <Sidebar.Item>
|
|
1188
|
+
* <Sidebar.ItemButton asChild current>
|
|
1189
|
+
* <a href="/endpoints">
|
|
1190
|
+
* <GraphIcon />
|
|
1191
|
+
* Endpoints
|
|
1192
|
+
* </a>
|
|
1193
|
+
* </Sidebar.ItemButton>
|
|
1194
|
+
* </Sidebar.Item>
|
|
1195
|
+
* </Sidebar.List>
|
|
1196
|
+
* </Sidebar.Group>
|
|
1197
|
+
* </Sidebar.Body>
|
|
1198
|
+
* <Sidebar.Footer>
|
|
1199
|
+
* <Sidebar.Separator />
|
|
1200
|
+
* <DropdownMenu.Root>
|
|
1201
|
+
* <DropdownMenu.Trigger asChild>
|
|
1202
|
+
* <Sidebar.SwitcherTrigger>
|
|
1203
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1204
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1205
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1206
|
+
* </Sidebar.SwitcherTrigger>
|
|
1207
|
+
* </DropdownMenu.Trigger>
|
|
1208
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1209
|
+
* </DropdownMenu.Root>
|
|
1210
|
+
* </Sidebar.Footer>
|
|
1211
|
+
* </Sidebar.Nav>
|
|
1212
|
+
* <Sidebar.Trigger />
|
|
1213
|
+
* </Sidebar.Root>
|
|
1214
|
+
* ```
|
|
1215
|
+
*/
|
|
1216
|
+
declare const SidebarSeparator: ({ className, "data-slot": dataSlot, ...props }: SidebarSeparatorProps) => import("react").JSX.Element;
|
|
1217
|
+
/**
|
|
1218
|
+
* The props for `Sidebar.AccountAvatar`.
|
|
1219
|
+
*
|
|
1220
|
+
* `children` is valid only with `asChild`, where it is the element the avatar
|
|
1221
|
+
* renders as instead of its own `<div>` — pass an empty one, e.g. `<span />`
|
|
1222
|
+
* when the avatar sits inside a `<button>` (which may not contain a `<div>`).
|
|
1223
|
+
* The initials are derived from `accountName`, which a consumer cannot compute,
|
|
1224
|
+
* so they render *inside* that element in place of its own children.
|
|
1225
|
+
*/
|
|
1226
|
+
type SidebarAccountAvatarProps = Omit<ComponentProps<"div">, "children"> & SelfClosingWithAsChild & WithDataSlot & {
|
|
1227
|
+
/**
|
|
1228
|
+
* The account's stable identifier. Used to deterministically select a
|
|
1229
|
+
* background swatch from the design system's palette so the same account
|
|
1230
|
+
* always gets the same color.
|
|
1231
|
+
*/
|
|
1232
|
+
accountId: string | undefined;
|
|
1233
|
+
/**
|
|
1234
|
+
* The account's display name. The first one or two letters become the
|
|
1235
|
+
* avatar's initials. Falls back to `?` when the name is empty.
|
|
1236
|
+
*/
|
|
1237
|
+
accountName: string | undefined;
|
|
1238
|
+
};
|
|
1239
|
+
/**
|
|
1240
|
+
* A small rounded-square avatar that represents an account (workspace,
|
|
1241
|
+
* organization, etc.). The background color is derived deterministically from
|
|
1242
|
+
* the `accountId` so an account's swatch is stable across renders, sessions,
|
|
1243
|
+
* and devices.
|
|
1244
|
+
*
|
|
1245
|
+
* Accounts are rendered as squares to differentiate them visually from users,
|
|
1246
|
+
* which use a circular `Sidebar.UserAvatar`.
|
|
1247
|
+
*
|
|
1248
|
+
* Pass `asChild` with a single empty element to swap the `<div>` it renders —
|
|
1249
|
+
* a `<span />` inside a `<button>`, or a link. The initials are derived from
|
|
1250
|
+
* `accountName`, so they render inside the swapped element; anything that
|
|
1251
|
+
* element carried of its own is replaced.
|
|
1252
|
+
*
|
|
1253
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaraccountavatar
|
|
1254
|
+
*
|
|
1255
|
+
* @example
|
|
1256
|
+
* ```tsx
|
|
1257
|
+
* <Sidebar.Root>
|
|
1258
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1259
|
+
* <Sidebar.Header>
|
|
1260
|
+
* <DropdownMenu.Root>
|
|
1261
|
+
* <DropdownMenu.Trigger asChild>
|
|
1262
|
+
* <Sidebar.SwitcherTrigger>
|
|
1263
|
+
* <GlobeIcon />
|
|
1264
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1265
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1266
|
+
* </Sidebar.SwitcherTrigger>
|
|
1267
|
+
* </DropdownMenu.Trigger>
|
|
1268
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1269
|
+
* </DropdownMenu.Root>
|
|
1270
|
+
* </Sidebar.Header>
|
|
1271
|
+
* <Sidebar.Body>
|
|
1272
|
+
* <Sidebar.Group>
|
|
1273
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1274
|
+
* <Sidebar.List>
|
|
1275
|
+
* <Sidebar.Item>
|
|
1276
|
+
* <Sidebar.ItemButton asChild current>
|
|
1277
|
+
* <a href="/endpoints">
|
|
1278
|
+
* <GraphIcon />
|
|
1279
|
+
* Endpoints
|
|
1280
|
+
* </a>
|
|
1281
|
+
* </Sidebar.ItemButton>
|
|
1282
|
+
* </Sidebar.Item>
|
|
1283
|
+
* </Sidebar.List>
|
|
1284
|
+
* </Sidebar.Group>
|
|
1285
|
+
* </Sidebar.Body>
|
|
1286
|
+
* <Sidebar.Footer>
|
|
1287
|
+
* <Sidebar.Separator />
|
|
1288
|
+
* <DropdownMenu.Root>
|
|
1289
|
+
* <DropdownMenu.Trigger asChild>
|
|
1290
|
+
* <Sidebar.SwitcherTrigger>
|
|
1291
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1292
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1293
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1294
|
+
* </Sidebar.SwitcherTrigger>
|
|
1295
|
+
* </DropdownMenu.Trigger>
|
|
1296
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1297
|
+
* </DropdownMenu.Root>
|
|
1298
|
+
* </Sidebar.Footer>
|
|
1299
|
+
* </Sidebar.Nav>
|
|
1300
|
+
* <Sidebar.Trigger />
|
|
1301
|
+
* </Sidebar.Root>
|
|
1302
|
+
* ```
|
|
1303
|
+
*/
|
|
1304
|
+
declare const AccountAvatar: ({ accountId, accountName, asChild, children, className, "data-slot": dataSlot, ...props }: SidebarAccountAvatarProps) => import("react").JSX.Element;
|
|
1305
|
+
/**
|
|
1306
|
+
* The props for `Sidebar.UserAvatar`.
|
|
1307
|
+
*
|
|
1308
|
+
* `children` is valid only with `asChild`, where it is the element the avatar
|
|
1309
|
+
* renders as instead of its own `<div>` — pass an empty one, e.g. `<span />`
|
|
1310
|
+
* when the avatar sits inside a `<button>` (which may not contain a `<div>`).
|
|
1311
|
+
* The avatar's visual (the `src` image, or the silhouette fallback) renders
|
|
1312
|
+
* *inside* that element in place of its own children.
|
|
1313
|
+
*/
|
|
1314
|
+
type SidebarUserAvatarProps = Omit<ComponentProps<"div">, "children"> & SelfClosingWithAsChild & WithDataSlot & {
|
|
1315
|
+
/**
|
|
1316
|
+
* Optional URL of the user's profile picture. When provided, the image is
|
|
1317
|
+
* rendered to fill the avatar with `object-cover`. When omitted (or while
|
|
1318
|
+
* loading), a neutral person silhouette is shown.
|
|
1319
|
+
*/
|
|
1320
|
+
src?: string;
|
|
1321
|
+
/**
|
|
1322
|
+
* Accessible label for the avatar. Used as the image's `alt` text and as
|
|
1323
|
+
* the container's `aria-label` when no image is rendered.
|
|
1324
|
+
*
|
|
1325
|
+
* @default "Your account"
|
|
1326
|
+
*/
|
|
1327
|
+
alt?: string;
|
|
1328
|
+
};
|
|
1329
|
+
/**
|
|
1330
|
+
* A circular avatar that represents the currently signed-in user. Renders the
|
|
1331
|
+
* user's profile picture when `src` is provided, otherwise falls back to a
|
|
1332
|
+
* neutral, theme-aware person silhouette.
|
|
1333
|
+
*
|
|
1334
|
+
* Users are rendered as circles to differentiate them visually from accounts,
|
|
1335
|
+
* which use a square `Sidebar.AccountAvatar`.
|
|
1336
|
+
*
|
|
1337
|
+
* Pass `asChild` with a single empty element to swap the `<div>` it renders —
|
|
1338
|
+
* a `<span />` inside a `<button>`, or a link. The image (or the silhouette
|
|
1339
|
+
* fallback) renders inside the swapped element; anything that element carried of
|
|
1340
|
+
* its own is replaced.
|
|
1341
|
+
*
|
|
1342
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaruseravatar
|
|
1343
|
+
*
|
|
1344
|
+
* @example
|
|
1345
|
+
* ```tsx
|
|
1346
|
+
* <Sidebar.Root>
|
|
1347
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1348
|
+
* <Sidebar.Header>
|
|
1349
|
+
* <DropdownMenu.Root>
|
|
1350
|
+
* <DropdownMenu.Trigger asChild>
|
|
1351
|
+
* <Sidebar.SwitcherTrigger>
|
|
1352
|
+
* <GlobeIcon />
|
|
1353
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1354
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1355
|
+
* </Sidebar.SwitcherTrigger>
|
|
1356
|
+
* </DropdownMenu.Trigger>
|
|
1357
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1358
|
+
* </DropdownMenu.Root>
|
|
1359
|
+
* </Sidebar.Header>
|
|
1360
|
+
* <Sidebar.Body>
|
|
1361
|
+
* <Sidebar.Group>
|
|
1362
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1363
|
+
* <Sidebar.List>
|
|
1364
|
+
* <Sidebar.Item>
|
|
1365
|
+
* <Sidebar.ItemButton asChild current>
|
|
1366
|
+
* <a href="/endpoints">
|
|
1367
|
+
* <GraphIcon />
|
|
1368
|
+
* Endpoints
|
|
1369
|
+
* </a>
|
|
1370
|
+
* </Sidebar.ItemButton>
|
|
1371
|
+
* </Sidebar.Item>
|
|
1372
|
+
* </Sidebar.List>
|
|
1373
|
+
* </Sidebar.Group>
|
|
1374
|
+
* </Sidebar.Body>
|
|
1375
|
+
* <Sidebar.Footer>
|
|
1376
|
+
* <Sidebar.Separator />
|
|
1377
|
+
* <DropdownMenu.Root>
|
|
1378
|
+
* <DropdownMenu.Trigger asChild>
|
|
1379
|
+
* <Sidebar.SwitcherTrigger>
|
|
1380
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1381
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1382
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1383
|
+
* </Sidebar.SwitcherTrigger>
|
|
1384
|
+
* </DropdownMenu.Trigger>
|
|
1385
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1386
|
+
* </DropdownMenu.Root>
|
|
1387
|
+
* </Sidebar.Footer>
|
|
1388
|
+
* </Sidebar.Nav>
|
|
1389
|
+
* <Sidebar.Trigger />
|
|
1390
|
+
* </Sidebar.Root>
|
|
1391
|
+
* ```
|
|
1392
|
+
*/
|
|
1393
|
+
declare const UserAvatar: ({ alt, asChild, children, className, "data-slot": dataSlot, src, ...props }: SidebarUserAvatarProps) => import("react").JSX.Element;
|
|
1394
|
+
/**
|
|
1395
|
+
* A composable, collapsible app-navigation sidebar. `Sidebar.Root` owns the
|
|
1396
|
+
* state (no DOM); `Sidebar.Nav` renders the panel — inline on desktop,
|
|
1397
|
+
* collapsing to a skinny icon rail, and a left-side `Sheet` below the root's
|
|
1398
|
+
* `mobileBreakpoint`; and `Sidebar.Trigger` toggles it from anywhere under the
|
|
1399
|
+
* root (typically an `AppLayout.Header`). Navigation is grouped with
|
|
1400
|
+
* `Sidebar.Group`/`Sidebar.GroupLabel`/`Sidebar.List`, and the switcher rows
|
|
1401
|
+
* (app switcher up top, account/user down bottom) compose
|
|
1402
|
+
* `Sidebar.SwitcherTrigger` with your own `DropdownMenu` or `Dialog`.
|
|
1403
|
+
*
|
|
1404
|
+
* The component is routing-agnostic: compose router links via `asChild` on
|
|
1405
|
+
* `Sidebar.ItemButton` and drive `current` from your router's location.
|
|
1406
|
+
*
|
|
1407
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar
|
|
1408
|
+
*
|
|
1409
|
+
* @example
|
|
1410
|
+
* Composition:
|
|
1411
|
+
* ```
|
|
1412
|
+
* Sidebar.Root
|
|
1413
|
+
* ├── Sidebar.Nav
|
|
1414
|
+
* │ ├── Sidebar.Header
|
|
1415
|
+
* │ │ └── Sidebar.SwitcherTrigger
|
|
1416
|
+
* │ ├── Sidebar.Body
|
|
1417
|
+
* │ │ └── Sidebar.Group
|
|
1418
|
+
* │ │ ├── Sidebar.GroupLabel
|
|
1419
|
+
* │ │ └── Sidebar.List
|
|
1420
|
+
* │ │ └── Sidebar.Item
|
|
1421
|
+
* │ │ └── Sidebar.Tooltip
|
|
1422
|
+
* │ │ └── Sidebar.ItemButton
|
|
1423
|
+
* │ └── Sidebar.Footer
|
|
1424
|
+
* │ ├── Sidebar.ItemButton
|
|
1425
|
+
* │ ├── Sidebar.Separator
|
|
1426
|
+
* │ └── Sidebar.SwitcherTrigger
|
|
1427
|
+
* │ ├── Sidebar.AccountAvatar
|
|
1428
|
+
* │ └── Sidebar.UserAvatar
|
|
1429
|
+
* └── Sidebar.Trigger
|
|
1430
|
+
* ```
|
|
1431
|
+
*
|
|
1432
|
+
* @example
|
|
1433
|
+
* ```tsx
|
|
1434
|
+
* <Sidebar.Root>
|
|
1435
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1436
|
+
* <Sidebar.Header>
|
|
1437
|
+
* <DropdownMenu.Root>
|
|
1438
|
+
* <DropdownMenu.Trigger asChild>
|
|
1439
|
+
* <Sidebar.SwitcherTrigger>
|
|
1440
|
+
* <GlobeIcon />
|
|
1441
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1442
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1443
|
+
* </Sidebar.SwitcherTrigger>
|
|
1444
|
+
* </DropdownMenu.Trigger>
|
|
1445
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1446
|
+
* </DropdownMenu.Root>
|
|
1447
|
+
* </Sidebar.Header>
|
|
1448
|
+
* <Sidebar.Body>
|
|
1449
|
+
* <Sidebar.Group>
|
|
1450
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1451
|
+
* <Sidebar.List>
|
|
1452
|
+
* <Sidebar.Item>
|
|
1453
|
+
* <Sidebar.ItemButton asChild current>
|
|
1454
|
+
* <a href="/endpoints">
|
|
1455
|
+
* <GraphIcon />
|
|
1456
|
+
* Endpoints
|
|
1457
|
+
* </a>
|
|
1458
|
+
* </Sidebar.ItemButton>
|
|
1459
|
+
* </Sidebar.Item>
|
|
1460
|
+
* </Sidebar.List>
|
|
1461
|
+
* </Sidebar.Group>
|
|
1462
|
+
* </Sidebar.Body>
|
|
1463
|
+
* <Sidebar.Footer>
|
|
1464
|
+
* <Sidebar.Separator />
|
|
1465
|
+
* <DropdownMenu.Root>
|
|
1466
|
+
* <DropdownMenu.Trigger asChild>
|
|
1467
|
+
* <Sidebar.SwitcherTrigger>
|
|
1468
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1469
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1470
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1471
|
+
* </Sidebar.SwitcherTrigger>
|
|
1472
|
+
* </DropdownMenu.Trigger>
|
|
1473
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1474
|
+
* </DropdownMenu.Root>
|
|
1475
|
+
* </Sidebar.Footer>
|
|
1476
|
+
* </Sidebar.Nav>
|
|
1477
|
+
* <Sidebar.Trigger />
|
|
1478
|
+
* </Sidebar.Root>
|
|
1479
|
+
* ```
|
|
1480
|
+
*/
|
|
1481
|
+
declare const Sidebar: {
|
|
1482
|
+
/**
|
|
1483
|
+
* The state owner for a sidebar. Renders no DOM — provides expanded /
|
|
1484
|
+
* mobile-sheet state to every part below it so the trigger can live in the
|
|
1485
|
+
* app shell without coupling it to the sidebar.
|
|
1486
|
+
*
|
|
1487
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarroot
|
|
1488
|
+
*
|
|
1489
|
+
* @example
|
|
1490
|
+
* ```tsx
|
|
1491
|
+
* <Sidebar.Root>
|
|
1492
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1493
|
+
* <Sidebar.Header>
|
|
1494
|
+
* <DropdownMenu.Root>
|
|
1495
|
+
* <DropdownMenu.Trigger asChild>
|
|
1496
|
+
* <Sidebar.SwitcherTrigger>
|
|
1497
|
+
* <GlobeIcon />
|
|
1498
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1499
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1500
|
+
* </Sidebar.SwitcherTrigger>
|
|
1501
|
+
* </DropdownMenu.Trigger>
|
|
1502
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1503
|
+
* </DropdownMenu.Root>
|
|
1504
|
+
* </Sidebar.Header>
|
|
1505
|
+
* <Sidebar.Body>
|
|
1506
|
+
* <Sidebar.Group>
|
|
1507
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1508
|
+
* <Sidebar.List>
|
|
1509
|
+
* <Sidebar.Item>
|
|
1510
|
+
* <Sidebar.ItemButton asChild current>
|
|
1511
|
+
* <a href="/endpoints">
|
|
1512
|
+
* <GraphIcon />
|
|
1513
|
+
* Endpoints
|
|
1514
|
+
* </a>
|
|
1515
|
+
* </Sidebar.ItemButton>
|
|
1516
|
+
* </Sidebar.Item>
|
|
1517
|
+
* </Sidebar.List>
|
|
1518
|
+
* </Sidebar.Group>
|
|
1519
|
+
* </Sidebar.Body>
|
|
1520
|
+
* <Sidebar.Footer>
|
|
1521
|
+
* <Sidebar.Separator />
|
|
1522
|
+
* <DropdownMenu.Root>
|
|
1523
|
+
* <DropdownMenu.Trigger asChild>
|
|
1524
|
+
* <Sidebar.SwitcherTrigger>
|
|
1525
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1526
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1527
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1528
|
+
* </Sidebar.SwitcherTrigger>
|
|
1529
|
+
* </DropdownMenu.Trigger>
|
|
1530
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1531
|
+
* </DropdownMenu.Root>
|
|
1532
|
+
* </Sidebar.Footer>
|
|
1533
|
+
* </Sidebar.Nav>
|
|
1534
|
+
* <Sidebar.Trigger />
|
|
1535
|
+
* </Sidebar.Root>
|
|
1536
|
+
* ```
|
|
1537
|
+
*/
|
|
1538
|
+
readonly Root: typeof Root;
|
|
1539
|
+
/**
|
|
1540
|
+
* The sidebar panel: an inline panel that collapses to the icon rail on
|
|
1541
|
+
* desktop, a left `Sheet` below the root's `mobileBreakpoint`. Set
|
|
1542
|
+
* `--sidebar-width` / `--sidebar-width-mobile` via its `className` or
|
|
1543
|
+
* `style`.
|
|
1544
|
+
*
|
|
1545
|
+
* **Data attributes:**
|
|
1546
|
+
*
|
|
1547
|
+
* | Data Attribute | Value | Description |
|
|
1548
|
+
* | --- | --- | --- |
|
|
1549
|
+
* | `data-state` | `"expanded"` \| `"collapsed"` | On the desktop panel surface. Mirrors the root's expanded state and drives the width collapse to the icon rail; descendant parts style off it with `group-data-[state=collapsed]/sidebar-nav:`. |
|
|
1550
|
+
* | `data-hydrated` | present after hydration | Presence-only, desktop panel surface. The CSS-side twin of the `isHydrated` gate: descendant collapse transitions are enabled only under `group-data-[hydrated]/sidebar-nav:`, so an SSR state correction snaps instead of animating on page load. |
|
|
1551
|
+
* | `data-mobile` | present in the mobile sheet | Presence-only. Marks the `Sheet.Content` presentation used below the root's `mobileBreakpoint`. |
|
|
1552
|
+
* | `data-state` | `"open"` \| `"closed"` | In the mobile sheet only, where the panel *is* the `Sheet`'s Radix dialog content element and Radix owns the attribute — the sheet's open/close animation state, not the desktop expanded state. Consumers style against it too. |
|
|
1553
|
+
*
|
|
1554
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarnav
|
|
1555
|
+
*
|
|
1556
|
+
* @example
|
|
1557
|
+
* ```tsx
|
|
1558
|
+
* <Sidebar.Root>
|
|
1559
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1560
|
+
* <Sidebar.Header>
|
|
1561
|
+
* <DropdownMenu.Root>
|
|
1562
|
+
* <DropdownMenu.Trigger asChild>
|
|
1563
|
+
* <Sidebar.SwitcherTrigger>
|
|
1564
|
+
* <GlobeIcon />
|
|
1565
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1566
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1567
|
+
* </Sidebar.SwitcherTrigger>
|
|
1568
|
+
* </DropdownMenu.Trigger>
|
|
1569
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1570
|
+
* </DropdownMenu.Root>
|
|
1571
|
+
* </Sidebar.Header>
|
|
1572
|
+
* <Sidebar.Body>
|
|
1573
|
+
* <Sidebar.Group>
|
|
1574
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1575
|
+
* <Sidebar.List>
|
|
1576
|
+
* <Sidebar.Item>
|
|
1577
|
+
* <Sidebar.ItemButton asChild current>
|
|
1578
|
+
* <a href="/endpoints">
|
|
1579
|
+
* <GraphIcon />
|
|
1580
|
+
* Endpoints
|
|
1581
|
+
* </a>
|
|
1582
|
+
* </Sidebar.ItemButton>
|
|
1583
|
+
* </Sidebar.Item>
|
|
1584
|
+
* </Sidebar.List>
|
|
1585
|
+
* </Sidebar.Group>
|
|
1586
|
+
* </Sidebar.Body>
|
|
1587
|
+
* <Sidebar.Footer>
|
|
1588
|
+
* <Sidebar.Separator />
|
|
1589
|
+
* <DropdownMenu.Root>
|
|
1590
|
+
* <DropdownMenu.Trigger asChild>
|
|
1591
|
+
* <Sidebar.SwitcherTrigger>
|
|
1592
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1593
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1594
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1595
|
+
* </Sidebar.SwitcherTrigger>
|
|
1596
|
+
* </DropdownMenu.Trigger>
|
|
1597
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1598
|
+
* </DropdownMenu.Root>
|
|
1599
|
+
* </Sidebar.Footer>
|
|
1600
|
+
* </Sidebar.Nav>
|
|
1601
|
+
* <Sidebar.Trigger />
|
|
1602
|
+
* </Sidebar.Root>
|
|
1603
|
+
* ```
|
|
1604
|
+
*/
|
|
1605
|
+
readonly Nav: typeof Nav;
|
|
1606
|
+
/**
|
|
1607
|
+
* The `IconButton` that toggles the sidebar. Place it in the app shell's
|
|
1608
|
+
* header; it stays functional at every breakpoint.
|
|
1609
|
+
*
|
|
1610
|
+
* **Data attributes:**
|
|
1611
|
+
*
|
|
1612
|
+
* | Data Attribute | Value | Description |
|
|
1613
|
+
* | --- | --- | --- |
|
|
1614
|
+
* | `data-state` | `"expanded"` \| `"collapsed"` | Mirrors what the trigger toggles: the mobile sheet below the root's `mobileBreakpoint`, the desktop panel otherwise. Pairs with `aria-expanded`. |
|
|
1615
|
+
* | `data-appearance` | `"ghost"` \| `"outlined"` | Read, not stamped: the underlying `IconButton` reflects its `appearance`, which this part defaults to `"ghost"`. |
|
|
1616
|
+
* | `data-intent` | `"accent"` \| `"danger"` \| `"neutral"` | Read, not stamped: the underlying `IconButton` reflects its `intent`, which this part defaults to `"neutral"`. |
|
|
1617
|
+
* | `data-size` | `"xs"` \| `"sm"` \| `"md"` \| `"lg"` \| `"xl"` | Read, not stamped: the underlying `IconButton` reflects its `size` and its own `"md"` default. |
|
|
1618
|
+
*
|
|
1619
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebartrigger
|
|
1620
|
+
*
|
|
1621
|
+
* @example
|
|
1622
|
+
* ```tsx
|
|
1623
|
+
* <Sidebar.Root>
|
|
1624
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1625
|
+
* <Sidebar.Header>
|
|
1626
|
+
* <DropdownMenu.Root>
|
|
1627
|
+
* <DropdownMenu.Trigger asChild>
|
|
1628
|
+
* <Sidebar.SwitcherTrigger>
|
|
1629
|
+
* <GlobeIcon />
|
|
1630
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1631
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1632
|
+
* </Sidebar.SwitcherTrigger>
|
|
1633
|
+
* </DropdownMenu.Trigger>
|
|
1634
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1635
|
+
* </DropdownMenu.Root>
|
|
1636
|
+
* </Sidebar.Header>
|
|
1637
|
+
* <Sidebar.Body>
|
|
1638
|
+
* <Sidebar.Group>
|
|
1639
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1640
|
+
* <Sidebar.List>
|
|
1641
|
+
* <Sidebar.Item>
|
|
1642
|
+
* <Sidebar.ItemButton asChild current>
|
|
1643
|
+
* <a href="/endpoints">
|
|
1644
|
+
* <GraphIcon />
|
|
1645
|
+
* Endpoints
|
|
1646
|
+
* </a>
|
|
1647
|
+
* </Sidebar.ItemButton>
|
|
1648
|
+
* </Sidebar.Item>
|
|
1649
|
+
* </Sidebar.List>
|
|
1650
|
+
* </Sidebar.Group>
|
|
1651
|
+
* </Sidebar.Body>
|
|
1652
|
+
* <Sidebar.Footer>
|
|
1653
|
+
* <Sidebar.Separator />
|
|
1654
|
+
* <DropdownMenu.Root>
|
|
1655
|
+
* <DropdownMenu.Trigger asChild>
|
|
1656
|
+
* <Sidebar.SwitcherTrigger>
|
|
1657
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1658
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1659
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1660
|
+
* </Sidebar.SwitcherTrigger>
|
|
1661
|
+
* </DropdownMenu.Trigger>
|
|
1662
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1663
|
+
* </DropdownMenu.Root>
|
|
1664
|
+
* </Sidebar.Footer>
|
|
1665
|
+
* </Sidebar.Nav>
|
|
1666
|
+
* <Sidebar.Trigger />
|
|
1667
|
+
* </Sidebar.Root>
|
|
1668
|
+
* ```
|
|
1669
|
+
*/
|
|
1670
|
+
readonly Trigger: typeof Trigger;
|
|
1671
|
+
/**
|
|
1672
|
+
* The pinned top container of the panel, typically holding the app
|
|
1673
|
+
* switcher (`Sidebar.SwitcherTrigger` + `DropdownMenu`/`Dialog`). Its
|
|
1674
|
+
* height vertically aligns the switcher with an `AppLayout.Header`.
|
|
1675
|
+
*
|
|
1676
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarheader
|
|
1677
|
+
*
|
|
1678
|
+
* @example
|
|
1679
|
+
* ```tsx
|
|
1680
|
+
* <Sidebar.Root>
|
|
1681
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1682
|
+
* <Sidebar.Header>
|
|
1683
|
+
* <DropdownMenu.Root>
|
|
1684
|
+
* <DropdownMenu.Trigger asChild>
|
|
1685
|
+
* <Sidebar.SwitcherTrigger>
|
|
1686
|
+
* <GlobeIcon />
|
|
1687
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1688
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1689
|
+
* </Sidebar.SwitcherTrigger>
|
|
1690
|
+
* </DropdownMenu.Trigger>
|
|
1691
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1692
|
+
* </DropdownMenu.Root>
|
|
1693
|
+
* </Sidebar.Header>
|
|
1694
|
+
* <Sidebar.Body>
|
|
1695
|
+
* <Sidebar.Group>
|
|
1696
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1697
|
+
* <Sidebar.List>
|
|
1698
|
+
* <Sidebar.Item>
|
|
1699
|
+
* <Sidebar.ItemButton asChild current>
|
|
1700
|
+
* <a href="/endpoints">
|
|
1701
|
+
* <GraphIcon />
|
|
1702
|
+
* Endpoints
|
|
1703
|
+
* </a>
|
|
1704
|
+
* </Sidebar.ItemButton>
|
|
1705
|
+
* </Sidebar.Item>
|
|
1706
|
+
* </Sidebar.List>
|
|
1707
|
+
* </Sidebar.Group>
|
|
1708
|
+
* </Sidebar.Body>
|
|
1709
|
+
* <Sidebar.Footer>
|
|
1710
|
+
* <Sidebar.Separator />
|
|
1711
|
+
* <DropdownMenu.Root>
|
|
1712
|
+
* <DropdownMenu.Trigger asChild>
|
|
1713
|
+
* <Sidebar.SwitcherTrigger>
|
|
1714
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1715
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1716
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1717
|
+
* </Sidebar.SwitcherTrigger>
|
|
1718
|
+
* </DropdownMenu.Trigger>
|
|
1719
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1720
|
+
* </DropdownMenu.Root>
|
|
1721
|
+
* </Sidebar.Footer>
|
|
1722
|
+
* </Sidebar.Nav>
|
|
1723
|
+
* <Sidebar.Trigger />
|
|
1724
|
+
* </Sidebar.Root>
|
|
1725
|
+
* ```
|
|
1726
|
+
*/
|
|
1727
|
+
readonly Header: typeof Header;
|
|
1728
|
+
/**
|
|
1729
|
+
* The scrollable middle region holding the navigation groups.
|
|
1730
|
+
*
|
|
1731
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarbody
|
|
1732
|
+
*
|
|
1733
|
+
* @example
|
|
1734
|
+
* ```tsx
|
|
1735
|
+
* <Sidebar.Root>
|
|
1736
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1737
|
+
* <Sidebar.Header>
|
|
1738
|
+
* <DropdownMenu.Root>
|
|
1739
|
+
* <DropdownMenu.Trigger asChild>
|
|
1740
|
+
* <Sidebar.SwitcherTrigger>
|
|
1741
|
+
* <GlobeIcon />
|
|
1742
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1743
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1744
|
+
* </Sidebar.SwitcherTrigger>
|
|
1745
|
+
* </DropdownMenu.Trigger>
|
|
1746
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1747
|
+
* </DropdownMenu.Root>
|
|
1748
|
+
* </Sidebar.Header>
|
|
1749
|
+
* <Sidebar.Body>
|
|
1750
|
+
* <Sidebar.Group>
|
|
1751
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1752
|
+
* <Sidebar.List>
|
|
1753
|
+
* <Sidebar.Item>
|
|
1754
|
+
* <Sidebar.ItemButton asChild current>
|
|
1755
|
+
* <a href="/endpoints">
|
|
1756
|
+
* <GraphIcon />
|
|
1757
|
+
* Endpoints
|
|
1758
|
+
* </a>
|
|
1759
|
+
* </Sidebar.ItemButton>
|
|
1760
|
+
* </Sidebar.Item>
|
|
1761
|
+
* </Sidebar.List>
|
|
1762
|
+
* </Sidebar.Group>
|
|
1763
|
+
* </Sidebar.Body>
|
|
1764
|
+
* <Sidebar.Footer>
|
|
1765
|
+
* <Sidebar.Separator />
|
|
1766
|
+
* <DropdownMenu.Root>
|
|
1767
|
+
* <DropdownMenu.Trigger asChild>
|
|
1768
|
+
* <Sidebar.SwitcherTrigger>
|
|
1769
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1770
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1771
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1772
|
+
* </Sidebar.SwitcherTrigger>
|
|
1773
|
+
* </DropdownMenu.Trigger>
|
|
1774
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1775
|
+
* </DropdownMenu.Root>
|
|
1776
|
+
* </Sidebar.Footer>
|
|
1777
|
+
* </Sidebar.Nav>
|
|
1778
|
+
* <Sidebar.Trigger />
|
|
1779
|
+
* </Sidebar.Root>
|
|
1780
|
+
* ```
|
|
1781
|
+
*/
|
|
1782
|
+
readonly Body: typeof Body;
|
|
1783
|
+
/**
|
|
1784
|
+
* The pinned bottom container, typically holding cross-product items and
|
|
1785
|
+
* the account/user switcher row.
|
|
1786
|
+
*
|
|
1787
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarfooter
|
|
1788
|
+
*
|
|
1789
|
+
* @example
|
|
1790
|
+
* ```tsx
|
|
1791
|
+
* <Sidebar.Root>
|
|
1792
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1793
|
+
* <Sidebar.Header>
|
|
1794
|
+
* <DropdownMenu.Root>
|
|
1795
|
+
* <DropdownMenu.Trigger asChild>
|
|
1796
|
+
* <Sidebar.SwitcherTrigger>
|
|
1797
|
+
* <GlobeIcon />
|
|
1798
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1799
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1800
|
+
* </Sidebar.SwitcherTrigger>
|
|
1801
|
+
* </DropdownMenu.Trigger>
|
|
1802
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1803
|
+
* </DropdownMenu.Root>
|
|
1804
|
+
* </Sidebar.Header>
|
|
1805
|
+
* <Sidebar.Body>
|
|
1806
|
+
* <Sidebar.Group>
|
|
1807
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1808
|
+
* <Sidebar.List>
|
|
1809
|
+
* <Sidebar.Item>
|
|
1810
|
+
* <Sidebar.ItemButton asChild current>
|
|
1811
|
+
* <a href="/endpoints">
|
|
1812
|
+
* <GraphIcon />
|
|
1813
|
+
* Endpoints
|
|
1814
|
+
* </a>
|
|
1815
|
+
* </Sidebar.ItemButton>
|
|
1816
|
+
* </Sidebar.Item>
|
|
1817
|
+
* </Sidebar.List>
|
|
1818
|
+
* </Sidebar.Group>
|
|
1819
|
+
* </Sidebar.Body>
|
|
1820
|
+
* <Sidebar.Footer>
|
|
1821
|
+
* <Sidebar.Separator />
|
|
1822
|
+
* <DropdownMenu.Root>
|
|
1823
|
+
* <DropdownMenu.Trigger asChild>
|
|
1824
|
+
* <Sidebar.SwitcherTrigger>
|
|
1825
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1826
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1827
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1828
|
+
* </Sidebar.SwitcherTrigger>
|
|
1829
|
+
* </DropdownMenu.Trigger>
|
|
1830
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1831
|
+
* </DropdownMenu.Root>
|
|
1832
|
+
* </Sidebar.Footer>
|
|
1833
|
+
* </Sidebar.Nav>
|
|
1834
|
+
* <Sidebar.Trigger />
|
|
1835
|
+
* </Sidebar.Root>
|
|
1836
|
+
* ```
|
|
1837
|
+
*/
|
|
1838
|
+
readonly Footer: typeof Footer;
|
|
1839
|
+
/**
|
|
1840
|
+
* A grouping container pairing a `GroupLabel` with a `List`; wires the
|
|
1841
|
+
* label to the list via `aria-labelledby`.
|
|
1842
|
+
*
|
|
1843
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebargroup
|
|
1844
|
+
*
|
|
1845
|
+
* @example
|
|
1846
|
+
* ```tsx
|
|
1847
|
+
* <Sidebar.Root>
|
|
1848
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1849
|
+
* <Sidebar.Header>
|
|
1850
|
+
* <DropdownMenu.Root>
|
|
1851
|
+
* <DropdownMenu.Trigger asChild>
|
|
1852
|
+
* <Sidebar.SwitcherTrigger>
|
|
1853
|
+
* <GlobeIcon />
|
|
1854
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1855
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1856
|
+
* </Sidebar.SwitcherTrigger>
|
|
1857
|
+
* </DropdownMenu.Trigger>
|
|
1858
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1859
|
+
* </DropdownMenu.Root>
|
|
1860
|
+
* </Sidebar.Header>
|
|
1861
|
+
* <Sidebar.Body>
|
|
1862
|
+
* <Sidebar.Group>
|
|
1863
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1864
|
+
* <Sidebar.List>
|
|
1865
|
+
* <Sidebar.Item>
|
|
1866
|
+
* <Sidebar.ItemButton asChild current>
|
|
1867
|
+
* <a href="/endpoints">
|
|
1868
|
+
* <GraphIcon />
|
|
1869
|
+
* Endpoints
|
|
1870
|
+
* </a>
|
|
1871
|
+
* </Sidebar.ItemButton>
|
|
1872
|
+
* </Sidebar.Item>
|
|
1873
|
+
* </Sidebar.List>
|
|
1874
|
+
* </Sidebar.Group>
|
|
1875
|
+
* </Sidebar.Body>
|
|
1876
|
+
* <Sidebar.Footer>
|
|
1877
|
+
* <Sidebar.Separator />
|
|
1878
|
+
* <DropdownMenu.Root>
|
|
1879
|
+
* <DropdownMenu.Trigger asChild>
|
|
1880
|
+
* <Sidebar.SwitcherTrigger>
|
|
1881
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1882
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1883
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1884
|
+
* </Sidebar.SwitcherTrigger>
|
|
1885
|
+
* </DropdownMenu.Trigger>
|
|
1886
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1887
|
+
* </DropdownMenu.Root>
|
|
1888
|
+
* </Sidebar.Footer>
|
|
1889
|
+
* </Sidebar.Nav>
|
|
1890
|
+
* <Sidebar.Trigger />
|
|
1891
|
+
* </Sidebar.Root>
|
|
1892
|
+
* ```
|
|
1893
|
+
*/
|
|
1894
|
+
readonly Group: typeof Group;
|
|
1895
|
+
/**
|
|
1896
|
+
* The muted label of a group. Renders a `<div>`; pass `asChild` to render
|
|
1897
|
+
* a heading at a level you control.
|
|
1898
|
+
*
|
|
1899
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebargrouplabel
|
|
1900
|
+
*
|
|
1901
|
+
* @example
|
|
1902
|
+
* ```tsx
|
|
1903
|
+
* <Sidebar.Root>
|
|
1904
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1905
|
+
* <Sidebar.Header>
|
|
1906
|
+
* <DropdownMenu.Root>
|
|
1907
|
+
* <DropdownMenu.Trigger asChild>
|
|
1908
|
+
* <Sidebar.SwitcherTrigger>
|
|
1909
|
+
* <GlobeIcon />
|
|
1910
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1911
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1912
|
+
* </Sidebar.SwitcherTrigger>
|
|
1913
|
+
* </DropdownMenu.Trigger>
|
|
1914
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1915
|
+
* </DropdownMenu.Root>
|
|
1916
|
+
* </Sidebar.Header>
|
|
1917
|
+
* <Sidebar.Body>
|
|
1918
|
+
* <Sidebar.Group>
|
|
1919
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1920
|
+
* <Sidebar.List>
|
|
1921
|
+
* <Sidebar.Item>
|
|
1922
|
+
* <Sidebar.ItemButton asChild current>
|
|
1923
|
+
* <a href="/endpoints">
|
|
1924
|
+
* <GraphIcon />
|
|
1925
|
+
* Endpoints
|
|
1926
|
+
* </a>
|
|
1927
|
+
* </Sidebar.ItemButton>
|
|
1928
|
+
* </Sidebar.Item>
|
|
1929
|
+
* </Sidebar.List>
|
|
1930
|
+
* </Sidebar.Group>
|
|
1931
|
+
* </Sidebar.Body>
|
|
1932
|
+
* <Sidebar.Footer>
|
|
1933
|
+
* <Sidebar.Separator />
|
|
1934
|
+
* <DropdownMenu.Root>
|
|
1935
|
+
* <DropdownMenu.Trigger asChild>
|
|
1936
|
+
* <Sidebar.SwitcherTrigger>
|
|
1937
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1938
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1939
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1940
|
+
* </Sidebar.SwitcherTrigger>
|
|
1941
|
+
* </DropdownMenu.Trigger>
|
|
1942
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1943
|
+
* </DropdownMenu.Root>
|
|
1944
|
+
* </Sidebar.Footer>
|
|
1945
|
+
* </Sidebar.Nav>
|
|
1946
|
+
* <Sidebar.Trigger />
|
|
1947
|
+
* </Sidebar.Root>
|
|
1948
|
+
* ```
|
|
1949
|
+
*/
|
|
1950
|
+
readonly GroupLabel: typeof GroupLabel;
|
|
1951
|
+
/**
|
|
1952
|
+
* The `<ul>` of navigation rows in a group.
|
|
1953
|
+
*
|
|
1954
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarlist
|
|
1955
|
+
*
|
|
1956
|
+
* @example
|
|
1957
|
+
* ```tsx
|
|
1958
|
+
* <Sidebar.Root>
|
|
1959
|
+
* <Sidebar.Nav aria-label="Main">
|
|
1960
|
+
* <Sidebar.Header>
|
|
1961
|
+
* <DropdownMenu.Root>
|
|
1962
|
+
* <DropdownMenu.Trigger asChild>
|
|
1963
|
+
* <Sidebar.SwitcherTrigger>
|
|
1964
|
+
* <GlobeIcon />
|
|
1965
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
1966
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
1967
|
+
* </Sidebar.SwitcherTrigger>
|
|
1968
|
+
* </DropdownMenu.Trigger>
|
|
1969
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1970
|
+
* </DropdownMenu.Root>
|
|
1971
|
+
* </Sidebar.Header>
|
|
1972
|
+
* <Sidebar.Body>
|
|
1973
|
+
* <Sidebar.Group>
|
|
1974
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
1975
|
+
* <Sidebar.List>
|
|
1976
|
+
* <Sidebar.Item>
|
|
1977
|
+
* <Sidebar.ItemButton asChild current>
|
|
1978
|
+
* <a href="/endpoints">
|
|
1979
|
+
* <GraphIcon />
|
|
1980
|
+
* Endpoints
|
|
1981
|
+
* </a>
|
|
1982
|
+
* </Sidebar.ItemButton>
|
|
1983
|
+
* </Sidebar.Item>
|
|
1984
|
+
* </Sidebar.List>
|
|
1985
|
+
* </Sidebar.Group>
|
|
1986
|
+
* </Sidebar.Body>
|
|
1987
|
+
* <Sidebar.Footer>
|
|
1988
|
+
* <Sidebar.Separator />
|
|
1989
|
+
* <DropdownMenu.Root>
|
|
1990
|
+
* <DropdownMenu.Trigger asChild>
|
|
1991
|
+
* <Sidebar.SwitcherTrigger>
|
|
1992
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
1993
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
1994
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
1995
|
+
* </Sidebar.SwitcherTrigger>
|
|
1996
|
+
* </DropdownMenu.Trigger>
|
|
1997
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
1998
|
+
* </DropdownMenu.Root>
|
|
1999
|
+
* </Sidebar.Footer>
|
|
2000
|
+
* </Sidebar.Nav>
|
|
2001
|
+
* <Sidebar.Trigger />
|
|
2002
|
+
* </Sidebar.Root>
|
|
2003
|
+
* ```
|
|
2004
|
+
*/
|
|
2005
|
+
readonly List: typeof List;
|
|
2006
|
+
/**
|
|
2007
|
+
* A single `<li>` row wrapper.
|
|
2008
|
+
*
|
|
2009
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaritem
|
|
2010
|
+
*
|
|
2011
|
+
* @example
|
|
2012
|
+
* ```tsx
|
|
2013
|
+
* <Sidebar.Root>
|
|
2014
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2015
|
+
* <Sidebar.Header>
|
|
2016
|
+
* <DropdownMenu.Root>
|
|
2017
|
+
* <DropdownMenu.Trigger asChild>
|
|
2018
|
+
* <Sidebar.SwitcherTrigger>
|
|
2019
|
+
* <GlobeIcon />
|
|
2020
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2021
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2022
|
+
* </Sidebar.SwitcherTrigger>
|
|
2023
|
+
* </DropdownMenu.Trigger>
|
|
2024
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2025
|
+
* </DropdownMenu.Root>
|
|
2026
|
+
* </Sidebar.Header>
|
|
2027
|
+
* <Sidebar.Body>
|
|
2028
|
+
* <Sidebar.Group>
|
|
2029
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2030
|
+
* <Sidebar.List>
|
|
2031
|
+
* <Sidebar.Item>
|
|
2032
|
+
* <Sidebar.ItemButton asChild current>
|
|
2033
|
+
* <a href="/endpoints">
|
|
2034
|
+
* <GraphIcon />
|
|
2035
|
+
* Endpoints
|
|
2036
|
+
* </a>
|
|
2037
|
+
* </Sidebar.ItemButton>
|
|
2038
|
+
* </Sidebar.Item>
|
|
2039
|
+
* </Sidebar.List>
|
|
2040
|
+
* </Sidebar.Group>
|
|
2041
|
+
* </Sidebar.Body>
|
|
2042
|
+
* <Sidebar.Footer>
|
|
2043
|
+
* <Sidebar.Separator />
|
|
2044
|
+
* <DropdownMenu.Root>
|
|
2045
|
+
* <DropdownMenu.Trigger asChild>
|
|
2046
|
+
* <Sidebar.SwitcherTrigger>
|
|
2047
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2048
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2049
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2050
|
+
* </Sidebar.SwitcherTrigger>
|
|
2051
|
+
* </DropdownMenu.Trigger>
|
|
2052
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2053
|
+
* </DropdownMenu.Root>
|
|
2054
|
+
* </Sidebar.Footer>
|
|
2055
|
+
* </Sidebar.Nav>
|
|
2056
|
+
* <Sidebar.Trigger />
|
|
2057
|
+
* </Sidebar.Root>
|
|
2058
|
+
* ```
|
|
2059
|
+
*/
|
|
2060
|
+
readonly Item: typeof Item;
|
|
2061
|
+
/**
|
|
2062
|
+
* The interactive navigation row (icon + truncating label). `asChild` for
|
|
2063
|
+
* router links; `current` for the active page.
|
|
2064
|
+
*
|
|
2065
|
+
* **Data attributes:**
|
|
2066
|
+
*
|
|
2067
|
+
* | Data Attribute | Value | Description |
|
|
2068
|
+
* | --- | --- | --- |
|
|
2069
|
+
* | `data-current` | present when `current` | Presence-only — never `"false"`, since the `data-current:` variant matches the attribute's existence. Styles the current row. |
|
|
2070
|
+
* | `aria-current` | `"page"` when `current` | Set alongside `data-current`. The current-row styling follows *either*, so a composed child that marks itself (react-router's `NavLink`) gets the treatment without the prop. |
|
|
2071
|
+
* | `data-state` | `"open"` | **Read, not stamped** — supplied by a composing `DropdownMenu.Trigger` / `Dialog.Trigger`. The row styles against it so it stays highlighted while its menu is open. |
|
|
2072
|
+
*
|
|
2073
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaritembutton
|
|
2074
|
+
*
|
|
2075
|
+
* @example
|
|
2076
|
+
* ```tsx
|
|
2077
|
+
* <Sidebar.Root>
|
|
2078
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2079
|
+
* <Sidebar.Header>
|
|
2080
|
+
* <DropdownMenu.Root>
|
|
2081
|
+
* <DropdownMenu.Trigger asChild>
|
|
2082
|
+
* <Sidebar.SwitcherTrigger>
|
|
2083
|
+
* <GlobeIcon />
|
|
2084
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2085
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2086
|
+
* </Sidebar.SwitcherTrigger>
|
|
2087
|
+
* </DropdownMenu.Trigger>
|
|
2088
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2089
|
+
* </DropdownMenu.Root>
|
|
2090
|
+
* </Sidebar.Header>
|
|
2091
|
+
* <Sidebar.Body>
|
|
2092
|
+
* <Sidebar.Group>
|
|
2093
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2094
|
+
* <Sidebar.List>
|
|
2095
|
+
* <Sidebar.Item>
|
|
2096
|
+
* <Sidebar.ItemButton asChild current>
|
|
2097
|
+
* <a href="/endpoints">
|
|
2098
|
+
* <GraphIcon />
|
|
2099
|
+
* Endpoints
|
|
2100
|
+
* </a>
|
|
2101
|
+
* </Sidebar.ItemButton>
|
|
2102
|
+
* </Sidebar.Item>
|
|
2103
|
+
* </Sidebar.List>
|
|
2104
|
+
* </Sidebar.Group>
|
|
2105
|
+
* </Sidebar.Body>
|
|
2106
|
+
* <Sidebar.Footer>
|
|
2107
|
+
* <Sidebar.Separator />
|
|
2108
|
+
* <DropdownMenu.Root>
|
|
2109
|
+
* <DropdownMenu.Trigger asChild>
|
|
2110
|
+
* <Sidebar.SwitcherTrigger>
|
|
2111
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2112
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2113
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2114
|
+
* </Sidebar.SwitcherTrigger>
|
|
2115
|
+
* </DropdownMenu.Trigger>
|
|
2116
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2117
|
+
* </DropdownMenu.Root>
|
|
2118
|
+
* </Sidebar.Footer>
|
|
2119
|
+
* </Sidebar.Nav>
|
|
2120
|
+
* <Sidebar.Trigger />
|
|
2121
|
+
* </Sidebar.Root>
|
|
2122
|
+
* ```
|
|
2123
|
+
*/
|
|
2124
|
+
readonly ItemButton: typeof ItemButton;
|
|
2125
|
+
/**
|
|
2126
|
+
* The styled switcher row for the header/footer. Not state-wired — compose
|
|
2127
|
+
* with `DropdownMenu.Trigger asChild` or `Dialog.Trigger asChild`.
|
|
2128
|
+
*
|
|
2129
|
+
* **Data attributes:**
|
|
2130
|
+
*
|
|
2131
|
+
* | Data Attribute | Value | Description |
|
|
2132
|
+
* | --- | --- | --- |
|
|
2133
|
+
* | `data-state` | `"open"` | **Read, not stamped** — supplied by the composing `DropdownMenu.Trigger` / `Dialog.Trigger`. The row styles against it so it stays highlighted while its menu is open. |
|
|
2134
|
+
*
|
|
2135
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarswitchertrigger
|
|
2136
|
+
*
|
|
2137
|
+
* @example
|
|
2138
|
+
* ```tsx
|
|
2139
|
+
* <Sidebar.Root>
|
|
2140
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2141
|
+
* <Sidebar.Header>
|
|
2142
|
+
* <DropdownMenu.Root>
|
|
2143
|
+
* <DropdownMenu.Trigger asChild>
|
|
2144
|
+
* <Sidebar.SwitcherTrigger>
|
|
2145
|
+
* <GlobeIcon />
|
|
2146
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2147
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2148
|
+
* </Sidebar.SwitcherTrigger>
|
|
2149
|
+
* </DropdownMenu.Trigger>
|
|
2150
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2151
|
+
* </DropdownMenu.Root>
|
|
2152
|
+
* </Sidebar.Header>
|
|
2153
|
+
* <Sidebar.Body>
|
|
2154
|
+
* <Sidebar.Group>
|
|
2155
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2156
|
+
* <Sidebar.List>
|
|
2157
|
+
* <Sidebar.Item>
|
|
2158
|
+
* <Sidebar.ItemButton asChild current>
|
|
2159
|
+
* <a href="/endpoints">
|
|
2160
|
+
* <GraphIcon />
|
|
2161
|
+
* Endpoints
|
|
2162
|
+
* </a>
|
|
2163
|
+
* </Sidebar.ItemButton>
|
|
2164
|
+
* </Sidebar.Item>
|
|
2165
|
+
* </Sidebar.List>
|
|
2166
|
+
* </Sidebar.Group>
|
|
2167
|
+
* </Sidebar.Body>
|
|
2168
|
+
* <Sidebar.Footer>
|
|
2169
|
+
* <Sidebar.Separator />
|
|
2170
|
+
* <DropdownMenu.Root>
|
|
2171
|
+
* <DropdownMenu.Trigger asChild>
|
|
2172
|
+
* <Sidebar.SwitcherTrigger>
|
|
2173
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2174
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2175
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2176
|
+
* </Sidebar.SwitcherTrigger>
|
|
2177
|
+
* </DropdownMenu.Trigger>
|
|
2178
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2179
|
+
* </DropdownMenu.Root>
|
|
2180
|
+
* </Sidebar.Footer>
|
|
2181
|
+
* </Sidebar.Nav>
|
|
2182
|
+
* <Sidebar.Trigger />
|
|
2183
|
+
* </Sidebar.Root>
|
|
2184
|
+
* ```
|
|
2185
|
+
*/
|
|
2186
|
+
readonly SwitcherTrigger: typeof SwitcherTrigger;
|
|
2187
|
+
/**
|
|
2188
|
+
* Labels a row while the panel is collapsed to the icon rail — wrap it
|
|
2189
|
+
* around a `Sidebar.ItemButton` or `Sidebar.SwitcherTrigger`. Requires a
|
|
2190
|
+
* `TooltipProvider` ancestor. Takes `Tooltip.Content`'s props (including
|
|
2191
|
+
* `asChild`) on the tooltip surface; `side` defaults to `"right"`.
|
|
2192
|
+
*
|
|
2193
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebartooltip
|
|
2194
|
+
*
|
|
2195
|
+
* @example
|
|
2196
|
+
* ```tsx
|
|
2197
|
+
* <TooltipProvider>
|
|
2198
|
+
* <Sidebar.Root>
|
|
2199
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2200
|
+
* <Sidebar.Header>
|
|
2201
|
+
* <DropdownMenu.Root>
|
|
2202
|
+
* <DropdownMenu.Trigger asChild>
|
|
2203
|
+
* <Sidebar.SwitcherTrigger>
|
|
2204
|
+
* <GlobeIcon />
|
|
2205
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2206
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2207
|
+
* </Sidebar.SwitcherTrigger>
|
|
2208
|
+
* </DropdownMenu.Trigger>
|
|
2209
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2210
|
+
* </DropdownMenu.Root>
|
|
2211
|
+
* </Sidebar.Header>
|
|
2212
|
+
* <Sidebar.Body>
|
|
2213
|
+
* <Sidebar.Group>
|
|
2214
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2215
|
+
* <Sidebar.List>
|
|
2216
|
+
* <Sidebar.Item>
|
|
2217
|
+
* <Sidebar.Tooltip label="Endpoints">
|
|
2218
|
+
* <Sidebar.ItemButton asChild current>
|
|
2219
|
+
* <a href="/endpoints">
|
|
2220
|
+
* <GraphIcon />
|
|
2221
|
+
* Endpoints
|
|
2222
|
+
* </a>
|
|
2223
|
+
* </Sidebar.ItemButton>
|
|
2224
|
+
* </Sidebar.Tooltip>
|
|
2225
|
+
* </Sidebar.Item>
|
|
2226
|
+
* </Sidebar.List>
|
|
2227
|
+
* </Sidebar.Group>
|
|
2228
|
+
* </Sidebar.Body>
|
|
2229
|
+
* <Sidebar.Footer>
|
|
2230
|
+
* <Sidebar.Separator />
|
|
2231
|
+
* <DropdownMenu.Root>
|
|
2232
|
+
* <Sidebar.Tooltip label="Acme Corp">
|
|
2233
|
+
* <DropdownMenu.Trigger asChild>
|
|
2234
|
+
* <Sidebar.SwitcherTrigger>
|
|
2235
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2236
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2237
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2238
|
+
* </Sidebar.SwitcherTrigger>
|
|
2239
|
+
* </DropdownMenu.Trigger>
|
|
2240
|
+
* </Sidebar.Tooltip>
|
|
2241
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2242
|
+
* </DropdownMenu.Root>
|
|
2243
|
+
* </Sidebar.Footer>
|
|
2244
|
+
* </Sidebar.Nav>
|
|
2245
|
+
* <Sidebar.Trigger />
|
|
2246
|
+
* </Sidebar.Root>
|
|
2247
|
+
* </TooltipProvider>
|
|
2248
|
+
* ```
|
|
2249
|
+
*/
|
|
2250
|
+
readonly Tooltip: typeof SidebarTooltip;
|
|
2251
|
+
/**
|
|
2252
|
+
* An inset hairline between sidebar regions, aligned with the content
|
|
2253
|
+
* padding.
|
|
2254
|
+
*
|
|
2255
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebarseparator
|
|
2256
|
+
*
|
|
2257
|
+
* @example
|
|
2258
|
+
* ```tsx
|
|
2259
|
+
* <Sidebar.Root>
|
|
2260
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2261
|
+
* <Sidebar.Header>
|
|
2262
|
+
* <DropdownMenu.Root>
|
|
2263
|
+
* <DropdownMenu.Trigger asChild>
|
|
2264
|
+
* <Sidebar.SwitcherTrigger>
|
|
2265
|
+
* <GlobeIcon />
|
|
2266
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2267
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2268
|
+
* </Sidebar.SwitcherTrigger>
|
|
2269
|
+
* </DropdownMenu.Trigger>
|
|
2270
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2271
|
+
* </DropdownMenu.Root>
|
|
2272
|
+
* </Sidebar.Header>
|
|
2273
|
+
* <Sidebar.Body>
|
|
2274
|
+
* <Sidebar.Group>
|
|
2275
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2276
|
+
* <Sidebar.List>
|
|
2277
|
+
* <Sidebar.Item>
|
|
2278
|
+
* <Sidebar.ItemButton asChild current>
|
|
2279
|
+
* <a href="/endpoints">
|
|
2280
|
+
* <GraphIcon />
|
|
2281
|
+
* Endpoints
|
|
2282
|
+
* </a>
|
|
2283
|
+
* </Sidebar.ItemButton>
|
|
2284
|
+
* </Sidebar.Item>
|
|
2285
|
+
* </Sidebar.List>
|
|
2286
|
+
* </Sidebar.Group>
|
|
2287
|
+
* </Sidebar.Body>
|
|
2288
|
+
* <Sidebar.Footer>
|
|
2289
|
+
* <Sidebar.Separator />
|
|
2290
|
+
* <DropdownMenu.Root>
|
|
2291
|
+
* <DropdownMenu.Trigger asChild>
|
|
2292
|
+
* <Sidebar.SwitcherTrigger>
|
|
2293
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2294
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2295
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2296
|
+
* </Sidebar.SwitcherTrigger>
|
|
2297
|
+
* </DropdownMenu.Trigger>
|
|
2298
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2299
|
+
* </DropdownMenu.Root>
|
|
2300
|
+
* </Sidebar.Footer>
|
|
2301
|
+
* </Sidebar.Nav>
|
|
2302
|
+
* <Sidebar.Trigger />
|
|
2303
|
+
* </Sidebar.Root>
|
|
2304
|
+
* ```
|
|
2305
|
+
*/
|
|
2306
|
+
readonly Separator: typeof SidebarSeparator;
|
|
2307
|
+
/**
|
|
2308
|
+
* A rounded-square account avatar with deterministic, WCAG-compliant
|
|
2309
|
+
* swatch colors derived from the account id. `asChild` swaps its `<div>` for
|
|
2310
|
+
* a single empty element and renders the initials inside it.
|
|
2311
|
+
*
|
|
2312
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaraccountavatar
|
|
2313
|
+
*
|
|
2314
|
+
* @example
|
|
2315
|
+
* ```tsx
|
|
2316
|
+
* <Sidebar.Root>
|
|
2317
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2318
|
+
* <Sidebar.Header>
|
|
2319
|
+
* <DropdownMenu.Root>
|
|
2320
|
+
* <DropdownMenu.Trigger asChild>
|
|
2321
|
+
* <Sidebar.SwitcherTrigger>
|
|
2322
|
+
* <GlobeIcon />
|
|
2323
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2324
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2325
|
+
* </Sidebar.SwitcherTrigger>
|
|
2326
|
+
* </DropdownMenu.Trigger>
|
|
2327
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2328
|
+
* </DropdownMenu.Root>
|
|
2329
|
+
* </Sidebar.Header>
|
|
2330
|
+
* <Sidebar.Body>
|
|
2331
|
+
* <Sidebar.Group>
|
|
2332
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2333
|
+
* <Sidebar.List>
|
|
2334
|
+
* <Sidebar.Item>
|
|
2335
|
+
* <Sidebar.ItemButton asChild current>
|
|
2336
|
+
* <a href="/endpoints">
|
|
2337
|
+
* <GraphIcon />
|
|
2338
|
+
* Endpoints
|
|
2339
|
+
* </a>
|
|
2340
|
+
* </Sidebar.ItemButton>
|
|
2341
|
+
* </Sidebar.Item>
|
|
2342
|
+
* </Sidebar.List>
|
|
2343
|
+
* </Sidebar.Group>
|
|
2344
|
+
* </Sidebar.Body>
|
|
2345
|
+
* <Sidebar.Footer>
|
|
2346
|
+
* <Sidebar.Separator />
|
|
2347
|
+
* <DropdownMenu.Root>
|
|
2348
|
+
* <DropdownMenu.Trigger asChild>
|
|
2349
|
+
* <Sidebar.SwitcherTrigger>
|
|
2350
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2351
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2352
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2353
|
+
* </Sidebar.SwitcherTrigger>
|
|
2354
|
+
* </DropdownMenu.Trigger>
|
|
2355
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2356
|
+
* </DropdownMenu.Root>
|
|
2357
|
+
* </Sidebar.Footer>
|
|
2358
|
+
* </Sidebar.Nav>
|
|
2359
|
+
* <Sidebar.Trigger />
|
|
2360
|
+
* </Sidebar.Root>
|
|
2361
|
+
* ```
|
|
2362
|
+
*/
|
|
2363
|
+
readonly AccountAvatar: typeof AccountAvatar;
|
|
2364
|
+
/**
|
|
2365
|
+
* A circular user avatar with a silhouette fallback. `asChild` swaps its
|
|
2366
|
+
* `<div>` for a single empty element and renders the image inside it.
|
|
2367
|
+
*
|
|
2368
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebaruseravatar
|
|
2369
|
+
*
|
|
2370
|
+
* @example
|
|
2371
|
+
* ```tsx
|
|
2372
|
+
* <Sidebar.Root>
|
|
2373
|
+
* <Sidebar.Nav aria-label="Main">
|
|
2374
|
+
* <Sidebar.Header>
|
|
2375
|
+
* <DropdownMenu.Root>
|
|
2376
|
+
* <DropdownMenu.Trigger asChild>
|
|
2377
|
+
* <Sidebar.SwitcherTrigger>
|
|
2378
|
+
* <GlobeIcon />
|
|
2379
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-base">Universal Gateway</span>
|
|
2380
|
+
* <CaretDownIcon className="text-muted size-4 shrink-0" />
|
|
2381
|
+
* </Sidebar.SwitcherTrigger>
|
|
2382
|
+
* </DropdownMenu.Trigger>
|
|
2383
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2384
|
+
* </DropdownMenu.Root>
|
|
2385
|
+
* </Sidebar.Header>
|
|
2386
|
+
* <Sidebar.Body>
|
|
2387
|
+
* <Sidebar.Group>
|
|
2388
|
+
* <Sidebar.GroupLabel>Traffic</Sidebar.GroupLabel>
|
|
2389
|
+
* <Sidebar.List>
|
|
2390
|
+
* <Sidebar.Item>
|
|
2391
|
+
* <Sidebar.ItemButton asChild current>
|
|
2392
|
+
* <a href="/endpoints">
|
|
2393
|
+
* <GraphIcon />
|
|
2394
|
+
* Endpoints
|
|
2395
|
+
* </a>
|
|
2396
|
+
* </Sidebar.ItemButton>
|
|
2397
|
+
* </Sidebar.Item>
|
|
2398
|
+
* </Sidebar.List>
|
|
2399
|
+
* </Sidebar.Group>
|
|
2400
|
+
* </Sidebar.Body>
|
|
2401
|
+
* <Sidebar.Footer>
|
|
2402
|
+
* <Sidebar.Separator />
|
|
2403
|
+
* <DropdownMenu.Root>
|
|
2404
|
+
* <DropdownMenu.Trigger asChild>
|
|
2405
|
+
* <Sidebar.SwitcherTrigger>
|
|
2406
|
+
* <Sidebar.AccountAvatar accountId="acc_123" accountName="Acme Corp" />
|
|
2407
|
+
* <span className="text-strong min-w-0 flex-1 truncate text-sm font-medium">Acme Corp</span>
|
|
2408
|
+
* <Sidebar.UserAvatar alt="Jane Doe" />
|
|
2409
|
+
* </Sidebar.SwitcherTrigger>
|
|
2410
|
+
* </DropdownMenu.Trigger>
|
|
2411
|
+
* <DropdownMenu.Content width="trigger" className="min-w-(--sidebar-row-width)">…</DropdownMenu.Content>
|
|
2412
|
+
* </DropdownMenu.Root>
|
|
2413
|
+
* </Sidebar.Footer>
|
|
2414
|
+
* </Sidebar.Nav>
|
|
2415
|
+
* <Sidebar.Trigger />
|
|
2416
|
+
* </Sidebar.Root>
|
|
2417
|
+
* ```
|
|
2418
|
+
*/
|
|
2419
|
+
readonly UserAvatar: typeof UserAvatar;
|
|
2420
|
+
};
|
|
2421
|
+
//#endregion
|
|
2422
|
+
//#region src/components/sidebar/sidebar-state-cookie.d.ts
|
|
2423
|
+
/**
|
|
2424
|
+
* The cookie name {@link extractSidebarStateCookie} reads and
|
|
2425
|
+
* {@link serializeSidebarStateCookie} writes.
|
|
2426
|
+
*
|
|
2427
|
+
* Exported so an app can clear the cookie on sign-out, or read it with its own
|
|
2428
|
+
* cookie library, without hard-coding the name.
|
|
2429
|
+
*
|
|
2430
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#sidebar_state_cookie_name
|
|
2431
|
+
*
|
|
2432
|
+
* @example
|
|
2433
|
+
* ```ts
|
|
2434
|
+
* // clear the persisted rail state on sign-out
|
|
2435
|
+
* headers.append("Set-Cookie", `${SIDEBAR_STATE_COOKIE_NAME}=; Max-Age=0; Path=/`);
|
|
2436
|
+
* ```
|
|
2437
|
+
*/
|
|
2438
|
+
declare const SIDEBAR_STATE_COOKIE_NAME = "mantle-sidebar-state";
|
|
2439
|
+
/**
|
|
2440
|
+
* Parse the sidebar's expanded state out of a raw `Cookie` header.
|
|
2441
|
+
*
|
|
2442
|
+
* This is the server half of cookie-backed persistence: unlike storage-backed
|
|
2443
|
+
* persistence, a cookie is available *before* the server renders, so the
|
|
2444
|
+
* server-rendered HTML already carries the right `data-state` and there is no
|
|
2445
|
+
* first-frame correction to hide. Pass the result straight to `defaultOpen` —
|
|
2446
|
+
* controlled `open` is not required.
|
|
2447
|
+
*
|
|
2448
|
+
* Returns `undefined` — not `false` — when the cookie is absent or holds a
|
|
2449
|
+
* value this helper does not recognize, so a first-time visitor is
|
|
2450
|
+
* distinguishable from one who deliberately collapsed the sidebar. Collapse the
|
|
2451
|
+
* state into your own default at the call site with `?? true`.
|
|
2452
|
+
*
|
|
2453
|
+
* Never throws: a header is client-controlled, and a value with a malformed
|
|
2454
|
+
* percent-escape (`mantle-sidebar-state=%E0%A4%A`) is unparseable rather than
|
|
2455
|
+
* fatal, so one hostile or corrupt cookie cannot fail the server render on
|
|
2456
|
+
* every page load.
|
|
2457
|
+
*
|
|
2458
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#persisting-the-collapsed-state
|
|
2459
|
+
*
|
|
2460
|
+
* @example
|
|
2461
|
+
* ```ts
|
|
2462
|
+
* // app/root.tsx loader
|
|
2463
|
+
* export const loader = ({ request }: Route.LoaderArgs) => ({
|
|
2464
|
+
* sidebarOpen: extractSidebarStateCookie(request.headers.get("Cookie")) ?? true,
|
|
2465
|
+
* });
|
|
2466
|
+
* ```
|
|
2467
|
+
*
|
|
2468
|
+
* @param cookieHeader - The raw `Cookie` header string from the request, or null/undefined.
|
|
2469
|
+
* @returns `true` when expanded, `false` when collapsed, `undefined` when unset, undecodable, or unparseable.
|
|
2470
|
+
*/
|
|
2471
|
+
declare function extractSidebarStateCookie(cookieHeader: string | null | undefined): boolean | undefined;
|
|
2472
|
+
/**
|
|
2473
|
+
* Attributes for {@link serializeSidebarStateCookie}. Deliberately omits
|
|
2474
|
+
* `HttpOnly`: the browser writes this cookie from `onOpenChange`, so a
|
|
2475
|
+
* server-only cookie could never be updated when the user toggles the rail.
|
|
2476
|
+
*
|
|
2477
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#serializesidebarstatecookie
|
|
2478
|
+
*
|
|
2479
|
+
* @example
|
|
2480
|
+
* ```ts
|
|
2481
|
+
* serializeSidebarStateCookie(open, { maxAge: 60 * 60 * 24 * 365, sameSite: "Lax" });
|
|
2482
|
+
* ```
|
|
2483
|
+
*/
|
|
2484
|
+
type SerializeSidebarStateCookieOptions = {
|
|
2485
|
+
/**
|
|
2486
|
+
* How long the preference survives, in seconds.
|
|
2487
|
+
*
|
|
2488
|
+
* @default 31_536_000 // one year
|
|
2489
|
+
*/
|
|
2490
|
+
maxAge?: number;
|
|
2491
|
+
/**
|
|
2492
|
+
* The path the cookie applies to. Keep the default unless the sidebar only
|
|
2493
|
+
* exists under one route subtree.
|
|
2494
|
+
*
|
|
2495
|
+
* @default "/"
|
|
2496
|
+
*/
|
|
2497
|
+
path?: string;
|
|
2498
|
+
/**
|
|
2499
|
+
* The domain the cookie applies to. Omitted by default, which scopes it to
|
|
2500
|
+
* the exact current host. Set it (e.g. `".example.com"`) to share the
|
|
2501
|
+
* preference across subdomains.
|
|
2502
|
+
*/
|
|
2503
|
+
domain?: string;
|
|
2504
|
+
/**
|
|
2505
|
+
* `SameSite` policy. `"Lax"` is right for a UI preference — it survives
|
|
2506
|
+
* top-level navigations back to your app without riding along on
|
|
2507
|
+
* cross-site subrequests.
|
|
2508
|
+
*
|
|
2509
|
+
* @default "Lax"
|
|
2510
|
+
*/
|
|
2511
|
+
sameSite?: "Lax" | "Strict" | "None";
|
|
2512
|
+
/**
|
|
2513
|
+
* Whether to add the `Secure` attribute. Omitted by default so the same call
|
|
2514
|
+
* works on `http://localhost` — a `Secure` cookie is silently rejected over
|
|
2515
|
+
* http, which would make the preference appear not to persist in local
|
|
2516
|
+
* development. Set it to `true` in production if your CSP or policy requires
|
|
2517
|
+
* it; this cookie holds no secret, only whether a rail is open.
|
|
2518
|
+
*
|
|
2519
|
+
* @default false
|
|
2520
|
+
*/
|
|
2521
|
+
secure?: boolean;
|
|
2522
|
+
};
|
|
2523
|
+
/**
|
|
2524
|
+
* Serialize the sidebar's expanded state as a cookie string.
|
|
2525
|
+
*
|
|
2526
|
+
* Framework-agnostic by design: the returned string is valid for both
|
|
2527
|
+
* `document.cookie` on the client and a `Set-Cookie` response header on the
|
|
2528
|
+
* server, so the same helper covers whichever side of your app owns the write.
|
|
2529
|
+
*
|
|
2530
|
+
* @see https://mantle.ngrok.com/components/navigation/sidebar#persisting-the-collapsed-state
|
|
2531
|
+
*
|
|
2532
|
+
* @example
|
|
2533
|
+
* ```tsx
|
|
2534
|
+
* // client: persist as the user toggles, and render from the loader value
|
|
2535
|
+
* const { sidebarOpen } = useLoaderData<typeof loader>();
|
|
2536
|
+
* <Sidebar.Root
|
|
2537
|
+
* defaultOpen={sidebarOpen}
|
|
2538
|
+
* onOpenChange={(open) => {
|
|
2539
|
+
* document.cookie = serializeSidebarStateCookie(open);
|
|
2540
|
+
* }}
|
|
2541
|
+
* >
|
|
2542
|
+
* ```
|
|
2543
|
+
*
|
|
2544
|
+
* @example
|
|
2545
|
+
* ```ts
|
|
2546
|
+
* // server: set it from an action instead
|
|
2547
|
+
* return new Response(null, {
|
|
2548
|
+
* headers: { "Set-Cookie": serializeSidebarStateCookie(false, { secure: true }) },
|
|
2549
|
+
* });
|
|
2550
|
+
* ```
|
|
2551
|
+
*
|
|
2552
|
+
* @param open - Whether the sidebar is expanded.
|
|
2553
|
+
* @param options - Cookie attributes; see {@link SerializeSidebarStateCookieOptions}.
|
|
2554
|
+
* @returns A cookie string such as `mantle-sidebar-state=collapsed; Max-Age=31536000; Path=/; SameSite=Lax`.
|
|
2555
|
+
*/
|
|
2556
|
+
declare function serializeSidebarStateCookie(open: boolean, options?: SerializeSidebarStateCookieOptions): string;
|
|
2557
|
+
//#endregion
|
|
2558
|
+
export { SIDEBAR_STATE_COOKIE_NAME, type SerializeSidebarStateCookieOptions, Sidebar, type SidebarMobileBreakpoint, type SidebarState, extractSidebarStateCookie, serializeSidebarStateCookie, useSidebar };
|