@ngrok/mantle 0.68.7 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,8 +48,6 @@ Mantle ships runtime components from `@ngrok/mantle`, while build-time and serve
48
48
 
49
49
  This keeps Vite/Shiki/parser dependencies out of frontend installs that only need Mantle's runtime UI package.
50
50
 
51
- For a concrete service implementation, see [`apps/highlight-server`](../../apps/highlight-server/README.md), a Bun + Hono syntax-highlighting API that preloads Shiki and serves highlighted HTML for server-side use cases.
52
-
53
51
  ### Vite + MDX
54
52
 
55
53
  ```ts
@@ -70,6 +68,16 @@ const result = await highlighter.highlight({
70
68
  });
71
69
  ```
72
70
 
71
+ ## Scaffolding a New Component
72
+
73
+ If you're contributing a new mantle component and use [Claude Code](https://claude.com/claude-code), run the `/scaffold-component` slash command to scaffold one end-to-end (component files, package.json export, docs page, route, navigation entry, and changeset):
74
+
75
+ ```
76
+ /scaffold-component <component-name>
77
+ ```
78
+
79
+ See [`.claude/commands/scaffold-component.md`](https://github.com/ngrok-oss/mantle/blob/main/.claude/commands/scaffold-component.md) for the full step-by-step reference — it's also useful if you'd rather scaffold by hand.
80
+
73
81
  ## Git Hooks
74
82
 
75
83
  Pre-commit hooks run automatically via [husky](https://typicode.github.io/husky/) and [lint-staged](https://github.com/lint-staged/lint-staged). On every commit, staged files are formatted with oxfmt and linted with oxlint.
@@ -149,7 +149,7 @@ declare const AlertDialog: {
149
149
  readonly Action: _$react.ForwardRefExoticComponent<(Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
150
150
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
151
151
  isLoading?: boolean | null | undefined;
152
- priority?: "danger" | "neutral" | "default" | null | undefined;
152
+ priority?: "default" | "danger" | "neutral" | null | undefined;
153
153
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
154
154
  icon?: ReactNode;
155
155
  iconPlacement?: "start" | "end";
@@ -159,7 +159,7 @@ declare const AlertDialog: {
159
159
  }, "ref"> | Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
160
160
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
161
161
  isLoading?: boolean | null | undefined;
162
- priority?: "danger" | "neutral" | "default" | null | undefined;
162
+ priority?: "default" | "danger" | "neutral" | null | undefined;
163
163
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
164
164
  icon?: ReactNode;
165
165
  iconPlacement?: "start" | "end";
@@ -206,7 +206,7 @@ declare const AlertDialog: {
206
206
  readonly Cancel: _$react.ForwardRefExoticComponent<(Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
207
207
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
208
208
  isLoading?: boolean | null | undefined;
209
- priority?: "danger" | "neutral" | "default" | null | undefined;
209
+ priority?: "default" | "danger" | "neutral" | null | undefined;
210
210
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
211
211
  icon?: ReactNode;
212
212
  iconPlacement?: "start" | "end";
@@ -216,7 +216,7 @@ declare const AlertDialog: {
216
216
  }, "ref"> | Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
217
217
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
218
218
  isLoading?: boolean | null | undefined;
219
- priority?: "danger" | "neutral" | "default" | null | undefined;
219
+ priority?: "default" | "danger" | "neutral" | null | undefined;
220
220
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
221
221
  icon?: ReactNode;
222
222
  iconPlacement?: "start" | "end";
@@ -9,7 +9,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
9
9
  declare const buttonVariants: (props?: ({
10
10
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
11
11
  isLoading?: boolean | null | undefined;
12
- priority?: "danger" | "neutral" | "default" | null | undefined;
12
+ priority?: "default" | "danger" | "neutral" | null | undefined;
13
13
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
14
14
  type ButtonVariants = VariantProps$1<typeof buttonVariants>;
15
15
  /**
@@ -93,7 +93,7 @@ type ButtonProps = ComponentProps<"button"> & ButtonVariants & {
93
93
  declare const Button: _$react.ForwardRefExoticComponent<(Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
94
94
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
95
95
  isLoading?: boolean | null | undefined;
96
- priority?: "danger" | "neutral" | "default" | null | undefined;
96
+ priority?: "default" | "danger" | "neutral" | null | undefined;
97
97
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
98
98
  /**
99
99
  * An icon to render inside the button. If the `state` is `"pending"`, then
@@ -139,7 +139,7 @@ declare const Button: _$react.ForwardRefExoticComponent<(Omit<_$react.ClassAttri
139
139
  }, "ref"> | Omit<_$react.ClassAttributes<HTMLButtonElement> & _$react.ButtonHTMLAttributes<HTMLButtonElement> & Partial<DeepNonNullable<_$class_variance_authority0.VariantProps<(props?: ({
140
140
  appearance?: "filled" | "link" | "ghost" | "outlined" | null | undefined;
141
141
  isLoading?: boolean | null | undefined;
142
- priority?: "danger" | "neutral" | "default" | null | undefined;
142
+ priority?: "default" | "danger" | "neutral" | null | undefined;
143
143
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string>>> & {
144
144
  /**
145
145
  * An icon to render inside the button. If the `state` is `"pending"`, then
@@ -172,4 +172,4 @@ declare const Button: _$react.ForwardRefExoticComponent<(Omit<_$react.ClassAttri
172
172
  }, "ref">) & _$react.RefAttributes<HTMLButtonElement>>;
173
173
  //#endregion
174
174
  export { ButtonProps as n, Button as t };
175
- //# sourceMappingURL=button-CX98GGHD.d.ts.map
175
+ //# sourceMappingURL=button-BaNwe1ud.d.ts.map
package/dist/button.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { n as IconButtonProps, t as IconButton } from "./icon-button-gO-7F_MZ.js";
2
- import { n as ButtonProps, t as Button } from "./button-CX98GGHD.js";
3
- import { n as ButtonGroupProps, t as ButtonGroup } from "./index-Cj2NX2Dg.js";
2
+ import { n as ButtonProps, t as Button } from "./button-BaNwe1ud.js";
3
+ import { n as ButtonGroupProps, t as ButtonGroup } from "./index-BCZ3y0yi.js";
4
4
  export { Button, ButtonGroup, ButtonGroupProps, ButtonProps, IconButton, IconButtonProps };
@@ -19,7 +19,7 @@ type CheckedState = boolean | "indeterminate";
19
19
  * </form>
20
20
  * ```
21
21
  */
22
- declare const Checkbox: _$react.ForwardRefExoticComponent<Omit<Omit<_$react.DetailedHTMLProps<_$react.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "type" | "defaultChecked" | "checked"> & WithValidation & {
22
+ declare const Checkbox: _$react.ForwardRefExoticComponent<Omit<Omit<_$react.DetailedHTMLProps<_$react.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "checked" | "type" | "defaultChecked"> & WithValidation & {
23
23
  /**
24
24
  * The controlled checked state of the checkbox. Must be used in conjunction with onChange.
25
25
  */
package/dist/command.d.ts CHANGED
@@ -178,7 +178,7 @@ declare const Command: {
178
178
  ref?: React.Ref<HTMLInputElement>;
179
179
  } & {
180
180
  asChild?: boolean;
181
- }, "key" | "asChild" | keyof _$react.InputHTMLAttributes<HTMLInputElement>>, "type" | "onChange" | "value"> & {
181
+ }, "key" | keyof _$react.InputHTMLAttributes<HTMLInputElement> | "asChild">, "type" | "value" | "onChange"> & {
182
182
  value?: string;
183
183
  onValueChange?: (search: string) => void;
184
184
  } & _$react.RefAttributes<HTMLInputElement>, "ref"> & _$react.RefAttributes<HTMLDivElement>>;
@@ -239,7 +239,7 @@ declare const Command: {
239
239
  ref?: React.Ref<HTMLDivElement>;
240
240
  } & {
241
241
  asChild?: boolean;
242
- }, "key" | keyof _$react.HTMLAttributes<HTMLDivElement> | "asChild">, "heading" | "value"> & {
242
+ }, "key" | keyof _$react.HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "heading"> & {
243
243
  heading?: React.ReactNode;
244
244
  value?: string;
245
245
  forceMount?: boolean;
@@ -262,7 +262,7 @@ declare const Command: {
262
262
  ref?: React.Ref<HTMLDivElement>;
263
263
  } & {
264
264
  asChild?: boolean;
265
- }, "key" | keyof _$react.HTMLAttributes<HTMLDivElement> | "asChild">, "disabled" | "onSelect" | "value"> & {
265
+ }, "key" | keyof _$react.HTMLAttributes<HTMLDivElement> | "asChild">, "disabled" | "value" | "onSelect"> & {
266
266
  disabled?: boolean;
267
267
  onSelect?: (value: string) => void;
268
268
  value?: string;
@@ -1,4 +1,4 @@
1
- import { t as Button } from "./button-CX98GGHD.js";
1
+ import { t as Button } from "./button-BaNwe1ud.js";
2
2
  import { s as SortingMode } from "./direction-MVSxfKWx.js";
3
3
  import { t as Table$1 } from "./table-C7BejaFW.js";
4
4
  import * as _$react from "react";
@@ -0,0 +1,149 @@
1
+ import { t as SvgAttributes } from "./types-yU-Byhue.js";
2
+ import { t as WithAsChild } from "./as-child-CRRsxi3Y.js";
3
+ import { ComponentProps, HTMLAttributes, ReactNode } from "react";
4
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+
6
+ //#region src/components/empty/empty.d.ts
7
+ type EmptyIconProps = Omit<SvgAttributes, "children"> & {
8
+ /**
9
+ * A single SVG icon element.
10
+ */
11
+ svg: ReactNode;
12
+ };
13
+ /**
14
+ * Compound component for rendering empty states. Use with `Empty.Root`,
15
+ * `Empty.Icon`, `Empty.Title`, `Empty.Description`, and `Empty.Actions`.
16
+ *
17
+ * @see https://mantle.ngrok.com/components/empty
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * <Empty.Root>
22
+ * <Empty.Icon svg={<GhostIcon />} />
23
+ * <Empty.Title>No endpoints yet</Empty.Title>
24
+ * <Empty.Description>
25
+ * Create your first endpoint to get started.
26
+ * </Empty.Description>
27
+ * <Empty.Actions>
28
+ * <Button>Create endpoint</Button>
29
+ * </Empty.Actions>
30
+ * </Empty.Root>
31
+ * ```
32
+ */
33
+ declare const Empty: {
34
+ /**
35
+ * The root container for an empty state. Centers content vertically and
36
+ * horizontally with consistent padding and max-width.
37
+ *
38
+ * @see https://mantle.ngrok.com/components/empty
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * <Empty.Root>
43
+ * <Empty.Icon svg={<GhostIcon />} />
44
+ * <Empty.Title>No endpoints yet</Empty.Title>
45
+ * <Empty.Description>Create your first endpoint to get started.</Empty.Description>
46
+ * <Empty.Actions>
47
+ * <Button>Create endpoint</Button>
48
+ * </Empty.Actions>
49
+ * </Empty.Root>
50
+ * ```
51
+ */
52
+ readonly Root: {
53
+ ({
54
+ children,
55
+ className,
56
+ ...props
57
+ }: ComponentProps<"div">): _$react_jsx_runtime0.JSX.Element;
58
+ displayName: string;
59
+ };
60
+ /**
61
+ * Renders a large icon for the empty state. Pass a single SVG icon element
62
+ * via the `svg` prop.
63
+ *
64
+ * @see https://mantle.ngrok.com/components/empty
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * <Empty.Icon svg={<GhostIcon />} />
69
+ * ```
70
+ */
71
+ readonly Icon: {
72
+ ({
73
+ className,
74
+ svg,
75
+ ...props
76
+ }: EmptyIconProps): _$react_jsx_runtime0.JSX.Element;
77
+ displayName: string;
78
+ };
79
+ /**
80
+ * The heading text for the empty state. Renders as an `h3` by default.
81
+ * Use `asChild` to render as a different heading level.
82
+ *
83
+ * @see https://mantle.ngrok.com/components/empty
84
+ *
85
+ * @example
86
+ * ```tsx
87
+ * <Empty.Title>No results found</Empty.Title>
88
+ *
89
+ * <Empty.Title asChild>
90
+ * <h2>No results found</h2>
91
+ * </Empty.Title>
92
+ * ```
93
+ */
94
+ readonly Title: {
95
+ ({
96
+ asChild,
97
+ children,
98
+ className,
99
+ ...props
100
+ }: HTMLAttributes<HTMLHeadingElement> & WithAsChild): _$react_jsx_runtime0.JSX.Element;
101
+ displayName: string;
102
+ };
103
+ /**
104
+ * Supporting descriptive text below the title. Renders as a `div` with
105
+ * `space-y-4` for multiple paragraphs. Use `asChild` to render as a
106
+ * different element.
107
+ *
108
+ * @see https://mantle.ngrok.com/components/empty
109
+ *
110
+ * @example
111
+ * ```tsx
112
+ * <Empty.Description>
113
+ * <p>Please try again in a few minutes.</p>
114
+ * </Empty.Description>
115
+ * ```
116
+ */
117
+ readonly Description: {
118
+ ({
119
+ asChild,
120
+ children,
121
+ className,
122
+ ...props
123
+ }: ComponentProps<"div"> & WithAsChild): _$react_jsx_runtime0.JSX.Element;
124
+ displayName: string;
125
+ };
126
+ /**
127
+ * A container for action buttons or links in the empty state.
128
+ *
129
+ * @see https://mantle.ngrok.com/components/empty
130
+ *
131
+ * @example
132
+ * ```tsx
133
+ * <Empty.Actions>
134
+ * <Button>Clear filters</Button>
135
+ * </Empty.Actions>
136
+ * ```
137
+ */
138
+ readonly Actions: {
139
+ ({
140
+ children,
141
+ className,
142
+ ...props
143
+ }: ComponentProps<"div">): _$react_jsx_runtime0.JSX.Element;
144
+ displayName: string;
145
+ };
146
+ };
147
+ //#endregion
148
+ export { Empty };
149
+ //# sourceMappingURL=empty.d.ts.map
package/dist/empty.js ADDED
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./cx-D1HYnpvA.js";import{t}from"./svg-only-DnZldAY9.js";import{t as n}from"./slot-D_ZUrdEW.js";import{jsx as r}from"react/jsx-runtime";const i=({children:t,className:n,...i})=>r(`div`,{className:e(`mx-auto flex max-w-lg flex-col items-center py-14 text-center`,n),...i,children:t});i.displayName=`Empty`;const a=({className:n,svg:i,...a})=>r(t,{className:e(`mb-2 size-16 text-muted`,n),svg:i,...a});a.displayName=`EmptyIcon`;const o=({asChild:t,children:i,className:a,...o})=>r(t?n:`h3`,{className:e(`text-strong text-xl font-medium`,a),...o,children:i});o.displayName=`EmptyTitle`;const s=({asChild:t,children:i,className:a,...o})=>r(t?n:`div`,{className:e(`text-body mt-1 space-y-4 text-sm`,a),...o,children:i});s.displayName=`EmptyDescription`;const c=({children:t,className:n,...i})=>r(`div`,{className:e(`mt-4 flex items-center gap-2`,n),...i,children:t});c.displayName=`EmptyActions`;const l={Root:i,Icon:a,Title:o,Description:s,Actions:c};export{l as Empty};
2
+ //# sourceMappingURL=empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty.js","names":[],"sources":["../src/components/empty/empty.tsx"],"sourcesContent":["import type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport type { WithAsChild } from \"../../types/as-child.js\";\nimport { cx } from \"../../utils/cx/cx.js\";\nimport { SvgOnly } from \"../icon/svg-only.js\";\nimport type { SvgAttributes } from \"../icon/types.js\";\nimport { Slot } from \"../slot/index.js\";\n\n/**\n * The root container for an empty state. Centers content horizontally\n * with consistent vertical padding and max-width.\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Root>\n * <Empty.Icon svg={<GhostIcon />} />\n * <Empty.Title>No results found</Empty.Title>\n * <Empty.Description>Try adjusting your search or filters.</Empty.Description>\n * <Empty.Actions>\n * <Button>Clear filters</Button>\n * </Empty.Actions>\n * </Empty.Root>\n * ```\n */\nconst Root = ({ children, className, ...props }: ComponentProps<\"div\">) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={cx(\"mx-auto flex max-w-lg flex-col items-center py-14 text-center\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\nRoot.displayName = \"Empty\";\n\ntype EmptyIconProps = Omit<SvgAttributes, \"children\"> & {\n\t/**\n\t * A single SVG icon element.\n\t */\n\tsvg: ReactNode;\n};\n\n/**\n * Renders a large icon for the empty state. Pass a single SVG icon element\n * via the `svg` prop (e.g. from `@phosphor-icons/react`).\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Icon svg={<GhostIcon />} />\n * ```\n */\nconst Icon = ({ className, svg, ...props }: EmptyIconProps) => {\n\treturn <SvgOnly className={cx(\"mb-2 size-16 text-muted\", className)} svg={svg} {...props} />;\n};\nIcon.displayName = \"EmptyIcon\";\n\n/**\n * The heading text for the empty state. Renders as an `h3` by default. Use the\n * `asChild` prop to render as a different heading level (e.g. `h1`, `h2`).\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Title>No results found</Empty.Title>\n *\n * <Empty.Title asChild>\n * <h2>No results found</h2>\n * </Empty.Title>\n * ```\n */\nconst Title = ({\n\tasChild,\n\tchildren,\n\tclassName,\n\t...props\n}: HTMLAttributes<HTMLHeadingElement> & WithAsChild) => {\n\tconst Comp = asChild ? Slot : \"h3\";\n\n\treturn (\n\t\t<Comp className={cx(\"text-strong text-xl font-medium\", className)} {...props}>\n\t\t\t{children}\n\t\t</Comp>\n\t);\n};\nTitle.displayName = \"EmptyTitle\";\n\n/**\n * Supporting descriptive text below the title. Renders as a `div` with\n * `space-y-4` so multiple paragraphs can be placed inside. Use the `asChild`\n * prop to render as a different element.\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Description>\n * <p>Try adjusting your search or filters.</p>\n * </Empty.Description>\n *\n * <Empty.Description>\n * <p>Something went wrong.</p>\n * <p>Please try again in a few minutes.</p>\n * </Empty.Description>\n * ```\n */\nconst Description = ({\n\tasChild,\n\tchildren,\n\tclassName,\n\t...props\n}: ComponentProps<\"div\"> & WithAsChild) => {\n\tconst Comp = asChild ? Slot : \"div\";\n\n\treturn (\n\t\t<Comp className={cx(\"text-body mt-1 space-y-4 text-sm\", className)} {...props}>\n\t\t\t{children}\n\t\t</Comp>\n\t);\n};\nDescription.displayName = \"EmptyDescription\";\n\n/**\n * A container for action buttons or links in the empty state.\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Actions>\n * <Button>Clear filters</Button>\n * <Button appearance=\"outlined\">Go back</Button>\n * </Empty.Actions>\n * ```\n */\nconst Actions = ({ children, className, ...props }: ComponentProps<\"div\">) => {\n\treturn (\n\t\t<div className={cx(\"mt-4 flex items-center gap-2\", className)} {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\nActions.displayName = \"EmptyActions\";\n\n/**\n * Compound component for rendering empty states. Use with `Empty.Root`,\n * `Empty.Icon`, `Empty.Title`, `Empty.Description`, and `Empty.Actions`.\n *\n * @see https://mantle.ngrok.com/components/empty\n *\n * @example\n * ```tsx\n * <Empty.Root>\n * <Empty.Icon svg={<GhostIcon />} />\n * <Empty.Title>No endpoints yet</Empty.Title>\n * <Empty.Description>\n * Create your first endpoint to get started.\n * </Empty.Description>\n * <Empty.Actions>\n * <Button>Create endpoint</Button>\n * </Empty.Actions>\n * </Empty.Root>\n * ```\n */\nconst Empty = {\n\t/**\n\t * The root container for an empty state. Centers content vertically and\n\t * horizontally with consistent padding and max-width.\n\t *\n\t * @see https://mantle.ngrok.com/components/empty\n\t *\n\t * @example\n\t * ```tsx\n\t * <Empty.Root>\n\t * <Empty.Icon svg={<GhostIcon />} />\n\t * <Empty.Title>No endpoints yet</Empty.Title>\n\t * <Empty.Description>Create your first endpoint to get started.</Empty.Description>\n\t * <Empty.Actions>\n\t * <Button>Create endpoint</Button>\n\t * </Empty.Actions>\n\t * </Empty.Root>\n\t * ```\n\t */\n\tRoot,\n\t/**\n\t * Renders a large icon for the empty state. Pass a single SVG icon element\n\t * via the `svg` prop.\n\t *\n\t * @see https://mantle.ngrok.com/components/empty\n\t *\n\t * @example\n\t * ```tsx\n\t * <Empty.Icon svg={<GhostIcon />} />\n\t * ```\n\t */\n\tIcon,\n\t/**\n\t * The heading text for the empty state. Renders as an `h3` by default.\n\t * Use `asChild` to render as a different heading level.\n\t *\n\t * @see https://mantle.ngrok.com/components/empty\n\t *\n\t * @example\n\t * ```tsx\n\t * <Empty.Title>No results found</Empty.Title>\n\t *\n\t * <Empty.Title asChild>\n\t * <h2>No results found</h2>\n\t * </Empty.Title>\n\t * ```\n\t */\n\tTitle,\n\t/**\n\t * Supporting descriptive text below the title. Renders as a `div` with\n\t * `space-y-4` for multiple paragraphs. Use `asChild` to render as a\n\t * different element.\n\t *\n\t * @see https://mantle.ngrok.com/components/empty\n\t *\n\t * @example\n\t * ```tsx\n\t * <Empty.Description>\n\t * <p>Please try again in a few minutes.</p>\n\t * </Empty.Description>\n\t * ```\n\t */\n\tDescription,\n\t/**\n\t * A container for action buttons or links in the empty state.\n\t *\n\t * @see https://mantle.ngrok.com/components/empty\n\t *\n\t * @example\n\t * ```tsx\n\t * <Empty.Actions>\n\t * <Button>Clear filters</Button>\n\t * </Empty.Actions>\n\t * ```\n\t */\n\tActions,\n} as const;\n\nexport {\n\t//,\n\tEmpty,\n};\n"],"mappings":"0JAyBA,MAAM,GAAQ,CAAE,WAAU,YAAW,GAAG,KAEtC,EAAC,MAAD,CACC,UAAW,EAAG,gEAAiE,EAAU,CACzF,GAAI,EAEH,WACI,CAAA,CAGR,EAAK,YAAc,QAoBnB,MAAM,GAAQ,CAAE,YAAW,MAAK,GAAG,KAC3B,EAAC,EAAD,CAAS,UAAW,EAAG,0BAA2B,EAAU,CAAO,MAAK,GAAI,EAAS,CAAA,CAE7F,EAAK,YAAc,YAiBnB,MAAM,GAAS,CACd,UACA,WACA,YACA,GAAG,KAKF,EAHY,EAAU,EAAO,KAG7B,CAAM,UAAW,EAAG,kCAAmC,EAAU,CAAE,GAAI,EACrE,WACK,CAAA,CAGT,EAAM,YAAc,aAqBpB,MAAM,GAAe,CACpB,UACA,WACA,YACA,GAAG,KAKF,EAHY,EAAU,EAAO,MAG7B,CAAM,UAAW,EAAG,mCAAoC,EAAU,CAAE,GAAI,EACtE,WACK,CAAA,CAGT,EAAY,YAAc,mBAe1B,MAAM,GAAW,CAAE,WAAU,YAAW,GAAG,KAEzC,EAAC,MAAD,CAAK,UAAW,EAAG,+BAAgC,EAAU,CAAE,GAAI,EACjE,WACI,CAAA,CAGR,EAAQ,YAAc,eAsBtB,MAAM,EAAQ,CAmBb,OAYA,OAgBA,QAeA,cAaA,UACA"}
package/dist/hooks.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as MarginType, o as useComposedRefs } from "./in-view-DS0PgFGa.js";
2
- import { RefObject, useLayoutEffect } from "react";
2
+ import { RefObject, useEffect } from "react";
3
3
 
4
4
  //#region src/hooks/use-breakpoint.d.ts
5
5
  /**
@@ -177,7 +177,7 @@ declare function useIsHydrated(): boolean;
177
177
  /**
178
178
  * useIsomorphicLayoutEffect is a hook that uses useLayoutEffect on the client and useEffect on the server.
179
179
  */
180
- declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
180
+ declare const useIsomorphicLayoutEffect: typeof useEffect;
181
181
  //#endregion
182
182
  //#region src/hooks/use-matches-media-query.d.ts
183
183
  /**
@@ -5,7 +5,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
5
5
 
6
6
  //#region src/components/button/button-group.d.ts
7
7
  declare const buttonGroupVariants: (props?: ({
8
- appearance?: "ghost" | "outlined" | "panel" | null | undefined;
8
+ appearance?: "panel" | "ghost" | "outlined" | null | undefined;
9
9
  } & _$class_variance_authority_types0.ClassProp) | undefined) => string;
10
10
  type ButtonGroupVariants = VariantProps<typeof buttonGroupVariants>;
11
11
  type ButtonGroupProps = ComponentProps<"div"> & ButtonGroupVariants;
@@ -26,4 +26,4 @@ type ButtonGroupProps = ComponentProps<"div"> & ButtonGroupVariants;
26
26
  declare const ButtonGroup: _$react.ForwardRefExoticComponent<Omit<ButtonGroupProps, "ref"> & _$react.RefAttributes<HTMLDivElement>>;
27
27
  //#endregion
28
28
  export { ButtonGroupProps as n, ButtonGroup as t };
29
- //# sourceMappingURL=index-Cj2NX2Dg.d.ts.map
29
+ //# sourceMappingURL=index-BCZ3y0yi.d.ts.map
@@ -23,7 +23,7 @@ type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "
23
23
  * />
24
24
  * ```
25
25
  */
26
- declare const Input: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "autoComplete"> & WithAutoComplete & WithInputType & WithValidation & {
26
+ declare const Input: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "type"> & WithAutoComplete & WithInputType & WithValidation & {
27
27
  children?: _$react.ReactNode | undefined;
28
28
  } & _$react.RefAttributes<HTMLInputElement>>;
29
29
  type InputCaptureProps = Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "type"> & BaseProps;
@@ -41,7 +41,7 @@ type InputCaptureProps = Omit<InputHTMLAttributes<HTMLInputElement>, "autoComple
41
41
  * </Input>
42
42
  * ```
43
43
  */
44
- declare const InputCapture: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "autoComplete"> & WithAutoComplete & WithInputType & WithValidation & _$react.RefAttributes<HTMLInputElement>>;
44
+ declare const InputCapture: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "type"> & WithAutoComplete & WithInputType & WithValidation & _$react.RefAttributes<HTMLInputElement>>;
45
45
  //#endregion
46
46
  //#region src/components/input/password-input.d.ts
47
47
  type PasswordInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "type"> & WithValidation & WithAutoComplete & {
@@ -70,7 +70,7 @@ type PasswordInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "autoCompl
70
70
  * />
71
71
  * ```
72
72
  */
73
- declare const PasswordInput: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "autoComplete"> & WithValidation & WithAutoComplete & {
73
+ declare const PasswordInput: _$react.ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "autoComplete" | "type"> & WithValidation & WithAutoComplete & {
74
74
  /**
75
75
  * Callback for when the visibility of the password value changes.
76
76
  */
@@ -100,4 +100,4 @@ declare const PasswordInput: _$react.ForwardRefExoticComponent<Omit<InputHTMLAtt
100
100
  declare function isInput(value: unknown): value is HTMLInputElement;
101
101
  //#endregion
102
102
  export { InputCapture as a, Input as i, PasswordInput as n, InputCaptureProps as o, PasswordInputProps as r, InputProps as s, isInput as t };
103
- //# sourceMappingURL=index-Bw97R9Kw.d.ts.map
103
+ //# sourceMappingURL=index-DXuVn00J.d.ts.map
package/dist/input.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { a as WithInputType, i as WithAutoComplete, n as InputType, o as WithValidation, r as Validation, t as AutoComplete } from "./types-Cq6RWU7Q.js";
2
- import { a as InputCapture, i as Input, n as PasswordInput, o as InputCaptureProps, r as PasswordInputProps, s as InputProps, t as isInput } from "./index-Bw97R9Kw.js";
2
+ import { a as InputCapture, i as Input, n as PasswordInput, o as InputCaptureProps, r as PasswordInputProps, s as InputProps, t as isInput } from "./index-DXuVn00J.js";
3
3
  export { AutoComplete, Input, InputCapture, InputCaptureProps, InputProps, InputType, PasswordInput, PasswordInputProps, Validation, WithAutoComplete, WithInputType, WithValidation, isInput };
@@ -1,5 +1,5 @@
1
1
  import { t as WithAsChild } from "./as-child-CRRsxi3Y.js";
2
- import { t as ButtonGroup } from "./index-Cj2NX2Dg.js";
2
+ import { t as ButtonGroup } from "./index-BCZ3y0yi.js";
3
3
  import { t as Select } from "./select-DJmjfGjt.js";
4
4
  import * as _$react from "react";
5
5
  import { ComponentProps } from "react";
@@ -1,5 +1,5 @@
1
1
  import { t as IconButton } from "./icon-button-gO-7F_MZ.js";
2
- import { t as Button } from "./button-CX98GGHD.js";
2
+ import { t as Button } from "./button-BaNwe1ud.js";
3
3
  import { t as DropdownMenu } from "./dropdown-menu-D6MiVSR-.js";
4
4
  import * as _$react from "react";
5
5
  import { ComponentProps, ReactNode } from "react";
package/dist/theme.d.ts CHANGED
@@ -203,7 +203,7 @@ declare function useTheme(): ThemeProviderState;
203
203
  */
204
204
  declare function readThemeFromHtmlElement(): {
205
205
  appliedTheme: "dark" | "light" | "light-high-contrast" | "dark-high-contrast" | undefined;
206
- theme: "dark" | "light" | "system" | "light-high-contrast" | "dark-high-contrast" | undefined;
206
+ theme: "dark" | "light" | "light-high-contrast" | "dark-high-contrast" | "system" | undefined;
207
207
  };
208
208
  /**
209
209
  * If the theme is "system", it will resolve the theme based on the user's media query preferences, otherwise it will return the theme as is.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngrok/mantle",
3
- "version": "0.68.7",
3
+ "version": "0.69.0",
4
4
  "description": "mantle is ngrok's UI library and design system.",
5
5
  "homepage": "https://mantle.ngrok.com",
6
6
  "license": "MIT",
@@ -154,6 +154,11 @@
154
154
  "types": "./dist/dropdown-menu.d.ts",
155
155
  "import": "./dist/dropdown-menu.js"
156
156
  },
157
+ "./empty": {
158
+ "@ngrok/src-live-types": "./src/components/empty/index.ts",
159
+ "types": "./dist/empty.d.ts",
160
+ "import": "./dist/empty.js"
161
+ },
157
162
  "./flag": {
158
163
  "@ngrok/src-live-types": "./src/components/flag/index.ts",
159
164
  "types": "./dist/flag.d.ts",