@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.
Files changed (115) hide show
  1. package/dist/accordion.js +1 -1
  2. package/dist/agent.json +4 -1
  3. package/dist/alert-BWwNPOMI.d.ts +391 -0
  4. package/dist/alert-center.d.ts +647 -0
  5. package/dist/alert-center.js +1 -0
  6. package/dist/alert-dialog.js +1 -1
  7. package/dist/alert-vwFd7qdp.js +1 -0
  8. package/dist/alert.d.ts +1 -390
  9. package/dist/alert.js +1 -1
  10. package/dist/{anchor-DfeXTpKW.js → anchor-3OGK2UKU.js} +1 -1
  11. package/dist/anchor.js +1 -1
  12. package/dist/app-layout.d.ts +566 -0
  13. package/dist/app-layout.js +1 -0
  14. package/dist/area-chart.js +1 -1
  15. package/dist/badge.js +1 -1
  16. package/dist/bar-chart.js +1 -1
  17. package/dist/breadcrumb.d.ts +1 -1
  18. package/dist/breadcrumb.js +1 -1
  19. package/dist/browser-only-CmEEzfU3.js +1 -0
  20. package/dist/browser-only.js +1 -1
  21. package/dist/{button-DjpEKt2X.js → button-Cnja9Bsr.js} +1 -1
  22. package/dist/{button-D9n09xUg.js → button-DmJkYfyl.js} +1 -1
  23. package/dist/{button-BAno7KIU.js → button-IlxHhjPK.js} +1 -1
  24. package/dist/button.js +1 -1
  25. package/dist/calendar.d.ts +1 -1
  26. package/dist/card.js +1 -1
  27. package/dist/centered-layout.d.ts +9 -9
  28. package/dist/centered-layout.js +1 -1
  29. package/dist/chart-B3pAvmkk.js +2 -0
  30. package/dist/{choice-BHwFSSyv.js → choice-CnwfjSEu.js} +1 -1
  31. package/dist/choice.js +1 -1
  32. package/dist/code-block.js +1 -1
  33. package/dist/code.js +1 -1
  34. package/dist/combobox.js +1 -1
  35. package/dist/command.js +1 -1
  36. package/dist/cookie-ca4g5CKp.js +1 -0
  37. package/dist/{copy-to-clipboard-BsCQ9m6K.js → copy-to-clipboard-B4UB6pts.js} +1 -1
  38. package/dist/data-slot-EM6s2WEU.js +1 -0
  39. package/dist/data-table.js +1 -1
  40. package/dist/description-list.js +1 -1
  41. package/dist/{dialog-DWZWd5Jt.js → dialog-DozL6n-F.js} +1 -1
  42. package/dist/dialog.d.ts +1 -1
  43. package/dist/dialog.js +1 -1
  44. package/dist/dropdown-menu-BRH0Wd_z.js +1 -0
  45. package/dist/dropdown-menu.js +1 -1
  46. package/dist/empty.js +1 -1
  47. package/dist/field.d.ts +1 -1
  48. package/dist/field.js +1 -1
  49. package/dist/hooks.js +1 -1
  50. package/dist/{icons-DLCs1hLP.js → icons-Bb_zF2OV.js} +1 -1
  51. package/dist/icons.js +1 -1
  52. package/dist/input.js +1 -1
  53. package/dist/line-chart.js +1 -1
  54. package/dist/{list-51KQvENW.js → list-CJABVHwi.js} +1 -1
  55. package/dist/list.js +1 -1
  56. package/dist/llms.txt +4 -1
  57. package/dist/main.d.ts +35 -1
  58. package/dist/main.js +1 -1
  59. package/dist/mantle.css +21 -1
  60. package/dist/media-object.js +1 -1
  61. package/dist/multi-select.d.ts +10 -2
  62. package/dist/multi-select.js +1 -1
  63. package/dist/otp-input.js +1 -1
  64. package/dist/pagination.js +1 -1
  65. package/dist/platform-BVD3gpKD.js +1 -0
  66. package/dist/{primitive-trJDqIXJ.js → primitive-D-9GIFWb.js} +1 -1
  67. package/dist/progress.d.ts +8 -8
  68. package/dist/qr-code.js +1 -1
  69. package/dist/radio-group.d.ts +10 -0
  70. package/dist/radio-group.js +1 -1
  71. package/dist/sandboxed-on-click.js +1 -1
  72. package/dist/scatter-plot.d.ts +2 -1
  73. package/dist/scatter-plot.js +1 -1
  74. package/dist/{select-BCHWvmyC.js → select-BReznXaw.js} +1 -1
  75. package/dist/select.js +1 -1
  76. package/dist/selectable-list.js +1 -1
  77. package/dist/{separator-bpE_kooz.js → separator-D0D6VyyM.js} +1 -1
  78. package/dist/separator.js +1 -1
  79. package/dist/sheet-BxvTfPLM.js +1 -0
  80. package/dist/sheet.d.ts +1 -1
  81. package/dist/sheet.js +1 -1
  82. package/dist/sidebar.d.ts +2558 -0
  83. package/dist/sidebar.js +1 -0
  84. package/dist/{skeleton-CsbUHbBA.js → skeleton-BhcJMpem.js} +1 -1
  85. package/dist/skeleton.js +1 -1
  86. package/dist/skip-to-main-link.js +1 -1
  87. package/dist/slot-DdgxmuI5.d.ts +67 -0
  88. package/dist/slot-DpNWVci8.js +1 -0
  89. package/dist/slot.d.ts +1 -1
  90. package/dist/slot.js +1 -1
  91. package/dist/split-button.js +1 -1
  92. package/dist/tabs.js +1 -1
  93. package/dist/theme-BorfgnNh.js +1 -0
  94. package/dist/theme-switcher.d.ts +1 -1
  95. package/dist/theme-switcher.js +1 -1
  96. package/dist/theme.js +1 -1
  97. package/dist/toast.js +1 -1
  98. package/dist/tooltip-Dnu35cjU.js +1 -0
  99. package/dist/tooltip-mrpLz4DZ.d.ts +218 -0
  100. package/dist/tooltip.d.ts +1 -217
  101. package/dist/tooltip.js +1 -1
  102. package/dist/use-breakpoint-Wd7_5-Mu.js +1 -0
  103. package/dist/use-copy-to-clipboard-CSyp4Zk0.js +1 -0
  104. package/dist/use-is-hydrated-DDCqXmju.js +1 -0
  105. package/dist/{use-prefers-reduced-motion-CagaNRgm.js → use-prefers-reduced-motion-Bk5zAfHY.js} +1 -1
  106. package/dist/utils.js +1 -1
  107. package/dist/well.js +1 -1
  108. package/package.json +16 -13
  109. package/dist/browser-only-CPH56Xw_.js +0 -1
  110. package/dist/chart-Do2qkrxl.js +0 -2
  111. package/dist/dropdown-menu-RyDWoKHx.js +0 -1
  112. package/dist/slot-BtwKJTLq.d.ts +0 -25
  113. package/dist/slot-CDk0Bb9z.js +0 -1
  114. package/dist/theme-C26-Xolp.js +0 -1
  115. 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 };