@imfusion/web-ui 0.9.1-dev.9.gdfff1530 → 0.10.1-dev.11.g9f5bc06e

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 (32) hide show
  1. package/CHANGELOG.md +116 -21
  2. package/dist/code-NTcddiYk.js +139 -0
  3. package/dist/components/app-shell/app-shell.d.ts +1 -1
  4. package/dist/components/dialog/dialog.d.ts +148 -0
  5. package/dist/components/dialog/dialog.meta.d.ts +2 -0
  6. package/dist/components/dialog/index.d.ts +2 -0
  7. package/dist/components/drawer/drawer.d.ts +1 -1
  8. package/dist/components/scroll-area/index.d.ts +2 -0
  9. package/dist/components/scroll-area/scroll-area.d.ts +49 -0
  10. package/dist/components/scroll-area/scroll-area.meta.d.ts +2 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +2072 -1743
  13. package/dist/integrations/code-highlight.js +2 -2
  14. package/dist/integrations/frame-selection.js +1 -1
  15. package/dist/integrations/image-display-options.js +121 -111
  16. package/dist/{rolldown-runtime-Dy4uBu1J.js → resolve-state-props-DQf9WiGv.js} +12 -1
  17. package/dist/scroll-area-z9Lf9uIk.js +89 -0
  18. package/dist/slider-Bf274cMe.js +106 -0
  19. package/dist/style.css +1 -1
  20. package/dist/{tabs-DRyqtS04.js → tabs-Do0BFL12.js} +31 -32
  21. package/package.json +1 -1
  22. package/src/docgen/doc.gen.json +1099 -0
  23. package/src/llms/llms.gen.txt +12 -0
  24. package/src/llms/skills/imf-web-ui-conventions/templates/AUDIT_CHECKLIST.md +1 -0
  25. package/src/llms/skills/imf-web-ui-conventions/topics/authentication.md +2 -3
  26. package/src/llms/skills/imf-web-ui-conventions/topics/components.md +4 -1
  27. package/src/llms/skills/imf-web-ui-conventions/topics/data.md +11 -5
  28. package/src/llms/skills/imf-web-ui-conventions/topics/project-structure.md +11 -0
  29. package/src/llms/skills/imf-web-ui-conventions/topics/react.md +6 -4
  30. package/src/llms/skills/imf-web-ui-update/SKILL.md +20 -10
  31. package/dist/code-BYkr5k55.js +0 -134
  32. package/dist/slider-Cqpreglu.js +0 -116
package/CHANGELOG.md CHANGED
@@ -2,39 +2,98 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ### Breaking
6
+
7
+ - **Breaking:** `AppShell.Main`, the AppShell aside drawer, and `Drawer.Content` scroll in a `ScrollArea` and pad their
8
+ content inside it ([WEBSDK-247](https://imfusion.atlassian.net/browse/WEBSDK-247)). — Nikolaus Brunner <brunner@imfusion.com>
9
+ - `AppShell.Main` stays the scrolling element and pads with `--imf-ui-appshell-padding`; a `padding` set on it adds to
10
+ that.
11
+ - `Drawer.Content` pads with `--imf-ui-drawer-content-padding`; a `padding`, `gap`, or grid set on it applies outside the
12
+ padded layer and does not reach the children.
13
+ - The aside drawer pads its content inside the scroll area; a `padding` on `AppShell.Aside` in drawer mode adds to it.
14
+
15
+ ### Added
16
+
17
+ - `ScrollArea` is a scrolling region with a slim primary-colored thumb that floats over the content and shows while the
18
+ area is hovered or scrolled, and a fade at each edge with more content behind it. `ScrollArea.Auto` wraps children with
19
+ the scrollbars for `orientation` (`vertical`, `horizontal`, `both`, or `none`); the parts compose by hand for anything else
20
+ ([WEBSDK-247](https://imfusion.atlassian.net/browse/WEBSDK-247)) — Nikolaus Brunner <brunner@imfusion.com>
21
+ - `Dialog` is a modal window over a dimmed page, adapted from Base UI with all its parts. `Dialog.Header` takes a
22
+ `variant` (`main`, `support`, `minor`, or `primary` with light text); `Dialog.Title` renders as `Typo.H2` and
23
+ `Dialog.Description` as `Typo.P`. `Dialog.Body` scrolls in a `ScrollArea` while header and footer stay in view.
24
+ `Dialog.Popup` comes in `sm`, `md`, `lg`, and `full`, and stops at 40rem high (`--imf-ui-dialog-max-height`) except in
25
+ `full`. `Dialog.Status` adds a tinted status column like `Card.Status`, on top of the width the size sets.
26
+ `Dialog.Simple` builds the whole dialog from props, and `Dialog.Inline` opens it from a term inside running text
27
+ ([WEBSDK-247](https://imfusion.atlassian.net/browse/WEBSDK-247)) — Nikolaus Brunner <brunner@imfusion.com>
28
+
29
+ ### Changed
30
+
31
+ - Agent skills — Nikolaus Brunner <brunner@imfusion.com>
32
+ - `imf-web-ui-conventions` has query factories own a numeric `staleTime` chosen by how fast other people change the data.
33
+ Loaders call `queryClient.query(options)` without an override, and `"static"` no longer appears in factories or
34
+ `defaultOptions`, where it blocked invalidation refetches.
35
+ - `imf-web-ui-conventions` puts a route's own views, forms, hooks, and tests in a `-<file-name>/` folder beside the route
36
+ file, and reserves `partials/` for parts that more than one route uses.
37
+ - Components ([WEBSDK-247](https://imfusion.atlassian.net/browse/WEBSDK-247)) — Nikolaus Brunner <brunner@imfusion.com>
38
+ - The AppShell navbar drawer, `Code`, and `ImageDisplayOptions` scroll in a `ScrollArea`, with its overlay thumb and edge
39
+ fades.
40
+
41
+ ---
42
+
43
+ ## `0.10.0` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2026.10.15
44
+
45
+ ### Highlights
46
+
47
+ #### New and updated components
48
+
49
+ - `RichLink` is new. It is a link that fills a row: an optional icon on a tile tinted in the primary color, a label, an
50
+ optional description, and a trailing arrow that `endGlyph` replaces. It renders a plain anchor, so TanStack Router's
51
+ `createLink` can wrap it. `imf-web-ui-ux` picks it for a link that fills its own row, and `ChipLink` for one inside text
52
+ ([WEBSDK-272](https://imfusion.atlassian.net/browse/WEBSDK-272)).
53
+
54
+ ![RichLink in a stack, light](docs/assets/changelog/0.10.0-rich-link-light.webp)
55
+ ![RichLink in a stack, dark](docs/assets/changelog/0.10.0-rich-link-dark.webp)
56
+
57
+ - `Skeleton.Root` takes `loading` and fades the data in over the bones when it turns false.
58
+
59
+ - The `variant="position"` `Slider` thumb is primary at rest and gray on hover. It is opaque, so a `Slider.Indicator` under
60
+ it stays hidden. Every Slider thumb now draws its focus ring on keyboard focus.
61
+
62
+ ![Slider position variant, light](docs/assets/changelog/0.10.0-slider-position-light.webp)
63
+ ![Slider position variant, dark](docs/assets/changelog/0.10.0-slider-position-dark.webp)
64
+
65
+ #### A type hierarchy that holds at every width
66
+
67
+ Every fluid font size grows across the same viewport range, 360px to 1920px, so a heading never ends up smaller than the one
68
+ below it. `--imf-ui-font-size-fluid-0` to `fluid-2` follow one ratio scale above `--imf-ui-font-size-body`: `fluid-0` runs
69
+ from 19.2px to 25px, `fluid-1` from 23px to 31.25px, and `fluid-2` from 27.6px to 39px.
70
+
71
+ Headings change with it, so check your pages. `Typo.H3` uses `fluid-1` and `Typo.H4` uses `fluid-0`, both at the regular
72
+ weight. `Typo.H2` is medium weight, `Typo.Blockquote` uses `fluid-0`, and `--imf-ui-font-lineheight-title` follows the larger
73
+ H2 range. The Typo page has a Hierarchy story that shows every member at 360px, 768px, 1440px, and 1920px side by side.
74
+
5
75
  ### Added
6
76
 
7
- - `RichLink` is a link that fills a row: an optional icon on a tile tinted in the primary color, a label, an optional
8
- description line, and a trailing arrow for where it leads, which `endGlyph` replaces. It renders a plain anchor, so
9
- TanStack Router's `createLink` can wrap it
10
- ([WEBSDK-272](https://imfusion.atlassian.net/browse/WEBSDK-272)) — Nikolaus Brunner <brunner@imfusion.com>
11
77
  - Agent skills — Nikolaus Brunner <brunner@imfusion.com>
12
78
  - `imf-web-ui-conventions` puts a stand-in for a missing Web UI component in `components/web-ui-pending/`, built as
13
79
  the library would ship it and deleted once it does.
14
- - Components — Nikolaus Brunner <brunner@imfusion.com>
15
- - `Skeleton.Root` takes `loading` and fades the data in over the bones when it turns false.
80
+ - Storybook — Nikolaus Brunner <brunner@imfusion.com>
81
+ - A click on a screenshot in a docs carousel opens it full width in a dialog.
16
82
 
17
83
  ### Changed
18
84
 
19
85
  - Agent skills — Nikolaus Brunner <brunner@imfusion.com>
20
- - `imf-web-ui-ux` picks `ChipLink` for a link inside text or a row of chips and `RichLink` for a link that fills its own
21
- row ([WEBSDK-272](https://imfusion.atlassian.net/browse/WEBSDK-272)).
22
- - Components — Nikolaus Brunner <brunner@imfusion.com>
23
- - The `variant="position"` Slider thumb is primary at rest and gray on hover, with an outline ring on keyboard focus. It is
24
- opaque, so a `Slider.Indicator` under it stays hidden.
25
- - Typography — Nikolaus Brunner <brunner@imfusion.com>
26
- - Every fluid font size grows across the same viewport range, 360px to 1920px, so the type hierarchy keeps its order at
27
- every width. `--imf-ui-font-size-fluid-0` to `fluid-2` follow one ratio scale above `--imf-ui-font-size-body`:
28
- `fluid-0` runs from 19.2px to 25px, `fluid-1` from 23px to 31.25px, and `fluid-2` from 27.6px to 39px.
29
- - `Typo.H3` uses `--imf-ui-font-size-fluid-1` and `Typo.H4` uses `--imf-ui-font-size-fluid-0`, both at the regular
30
- weight. `Typo.H2` uses the medium weight, and `Typo.Blockquote` uses `--imf-ui-font-size-fluid-0`.
31
- - `--imf-ui-font-lineheight-title` follows the larger H2 range.
32
- - The Typo page has a Hierarchy story that renders every member at 360px, 768px, 1440px, and 1920px side by side.
86
+ - The `web-ui-dev-new-component` interview asks where the design comes from: a new Claude Design canvas, a local HTML
87
+ sketch when the session has no Claude Design, an existing design or placeholder, or a sibling to copy. The plan links
88
+ the design source, and verification checks the built stories against it.
89
+ - `web-ui-dev-update-component` and `web-ui-dev-design-component` ask how to preview a visual change when the session has
90
+ Claude Design, and recommend a canvas for a bigger change. A canvas is made in the Claude app before plan mode.
91
+ - Documentation — Nikolaus Brunner <brunner@imfusion.com>
92
+ - `docs/design-system.md` says to start new designs in the Claude app and when an agent session has Claude Design. The
93
+ standalone project's README marks it as legacy.
33
94
 
34
95
  ### Fixed
35
96
 
36
- - Components — Nikolaus Brunner <brunner@imfusion.com>
37
- - Slider thumbs draw their focus ring on keyboard focus.
38
97
  - Storybook — Nikolaus Brunner <brunner@imfusion.com>
39
98
  - The Slider `All` story renders the position variant without an indicator, as the `Position` story does.
40
99
 
@@ -215,6 +274,37 @@ AppShell sections draw no dividers. Delete overrides of the border properties, w
215
274
  - --imf-ui-appshell-border-width: var(--imf-ui-border-size-2);
216
275
  ```
217
276
 
277
+ Navbar sections pad themselves with `--imf-ui-appshell-navbar-padding`, and that rule outranks a single class. Delete your
278
+ own section padding, and set the variable when the gutter needs to change:
279
+
280
+ ```diff
281
+ - .navSection { padding: 0 var(--imf-ui-appshell-padding); }
282
+ + .root { --imf-ui-appshell-navbar-padding: var(--imf-ui-size-5); }
283
+ ```
284
+
285
+ Nav links widen past the gutter only as `AppShell.NavItem`. Replace hand-built navbar links, and pass a router link through
286
+ `render`:
287
+
288
+ ```diff
289
+ - <MyNavLink to="/products" icon={Box} label="Products" />
290
+ + <AppShell.NavItem render={<Link to="/products" />} icon={<Icon glyph={Box} />}>Products</AppShell.NavItem>
291
+ ```
292
+
293
+ Above `lg` the aside docks whether or not `open` is set. Render no aside when there is nothing to show, not an empty one:
294
+
295
+ ```diff
296
+ - <AppShell.Aside>{selected ? <Details /> : <div />}</AppShell.Aside>
297
+ + {selected ? <AppShell.Aside><Details /></AppShell.Aside> : null}
298
+ ```
299
+
300
+ The navbar's first row and Main's offset read the header height while an `AppShell.Header` is rendered, even when CSS hides
301
+ it. Render the header conditionally instead of hiding it or setting the height to `0`:
302
+
303
+ ```diff
304
+ - <AppShell.Header className={styles.hiddenOnDesktop}>…</AppShell.Header>
305
+ + {isDesktop ? null : <AppShell.Header>…</AppShell.Header>}
306
+ ```
307
+
218
308
  ### Breaking
219
309
 
220
310
  - **Breaking:** The library supports Safari 17.5, Chrome 123, and Firefox 120 or newer. — Nikolaus Brunner <brunner@imfusion.com>
@@ -222,6 +312,11 @@ AppShell sections draw no dividers. Delete overrides of the border properties, w
222
312
  - The JavaScript build targets the same versions.
223
313
  - **Breaking:** AppShell sections draw no dividers, and the `--imf-ui-appshell-border-color`, `--imf-ui-appshell-border-width`, and `--imf-ui-appshell-border-style` properties are removed. ([WEBSDK-243](https://imfusion.atlassian.net/browse/WEBSDK-243)) — Nikolaus Brunner <brunner@imfusion.com>
224
314
  - **Breaking:** `AppShell.Main` is the scroll container and the document does not scroll; window scroll listeners, scroll restoration, and `scrollTo` target `AppShell.Main`. ([WEBSDK-243](https://imfusion.atlassian.net/browse/WEBSDK-243)) — Nikolaus Brunner <brunner@imfusion.com>
315
+ - **Breaking:** AppShell owns its navbar and aside layout. ([WEBSDK-243](https://imfusion.atlassian.net/browse/WEBSDK-243)) — Nikolaus Brunner <brunner@imfusion.com>
316
+ - Navbar sections pad themselves with `--imf-ui-appshell-navbar-padding` through a rule that outranks a single class.
317
+ - Only `AppShell.NavItem` widens past the navbar gutter.
318
+ - Above `lg` the aside docks whether or not `open` is set.
319
+ - The navbar's first row and Main's offset read the header height whenever an `AppShell.Header` is rendered.
225
320
 
226
321
  ### Added
227
322
 
@@ -0,0 +1,139 @@
1
+ import { r as e } from "./resolve-state-props-DQf9WiGv.js";
2
+ import { Xo as t, ja as n, pM as r } from "./icons-BsK_o-Cb.js";
3
+ import { t as i } from "./meta-V_KyLeGn.js";
4
+ import { a, i as o, n as s, o as c, s as l } from "./scroll-area-z9Lf9uIk.js";
5
+ import { cx as u } from "class-variance-authority";
6
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
7
+ import { useCallback as m, useEffect as h, useRef as g, useState as _ } from "react";
8
+ import { mergeProps as v } from "@base-ui/react/merge-props";
9
+ import { useRender as y } from "@base-ui/react/use-render";
10
+ //#region src/hooks/use-clipboard.ts
11
+ function b({ timeout: e = 1500 } = {}) {
12
+ let [t, n] = _(!1), r = g(void 0);
13
+ return h(() => () => clearTimeout(r.current), []), {
14
+ copied: t,
15
+ copy: m((t) => {
16
+ navigator.clipboard.writeText(t).then(() => {
17
+ n(!0), clearTimeout(r.current), r.current = setTimeout(() => n(!1), e);
18
+ });
19
+ }, [e])
20
+ };
21
+ }
22
+ var x = {
23
+ block: "imf-ui-code-module-block",
24
+ copy: "imf-ui-code-module-copy",
25
+ inline: "imf-ui-code-module-inline",
26
+ inlineCopy: "imf-ui-code-module-inlineCopy",
27
+ inlineLink: "imf-ui-code-module-inlineLink",
28
+ language: "imf-ui-code-module-language",
29
+ pre: "imf-ui-code-module-pre",
30
+ separator: "imf-ui-code-module-separator"
31
+ }, S = /* @__PURE__ */ e({
32
+ Block: () => T,
33
+ Inline: () => C,
34
+ InlineLink: () => w
35
+ });
36
+ function C({ copyable: e = !1, children: i, render: a, ...o }) {
37
+ let { copied: s, copy: c } = b(), l = g(null), u = s ? n : t;
38
+ return y({
39
+ defaultTagName: "code",
40
+ render: a,
41
+ props: {
42
+ ...v(o, {
43
+ className: x.inline,
44
+ children: /* @__PURE__ */ p(d, { children: [
45
+ /* @__PURE__ */ f("span", {
46
+ ref: l,
47
+ children: i
48
+ }),
49
+ e && /* @__PURE__ */ f("span", { className: x.separator }),
50
+ e && /* @__PURE__ */ f("button", {
51
+ type: "button",
52
+ className: x.inlineCopy,
53
+ "data-copied": s || void 0,
54
+ "aria-label": s ? "Copied" : "Copy",
55
+ onClick: () => c(l.current?.textContent ?? ""),
56
+ children: /* @__PURE__ */ f(r, {
57
+ glyph: u,
58
+ size: 12,
59
+ strokeWidth: 2,
60
+ "aria-hidden": !0
61
+ })
62
+ })
63
+ ] })
64
+ }),
65
+ "data-imf-ui-component": "Code.Inline"
66
+ }
67
+ });
68
+ }
69
+ C.displayName = "Code.Inline";
70
+ function w({ kind: e = "external", ...t }) {
71
+ let n = e === "external" ? {
72
+ target: "_blank",
73
+ rel: "noreferrer"
74
+ } : {};
75
+ return y({
76
+ defaultTagName: "a",
77
+ render: t.render,
78
+ props: {
79
+ ...v(n, t, {
80
+ className: u(x.inline, x.inlineLink, t.className),
81
+ children: t.children
82
+ }),
83
+ "data-imf-ui-component": "Code.InlineLink",
84
+ "data-kind": e
85
+ }
86
+ });
87
+ }
88
+ w.displayName = "Code.InlineLink";
89
+ function T({ className: e, language: i, hideCopy: d = !1, children: m, ...h }) {
90
+ let { copied: _, copy: v } = b(), y = g(null), S = _ ? n : t;
91
+ return /* @__PURE__ */ p("div", {
92
+ "data-imf-ui-component": "Code.Block",
93
+ className: u(x.block, e),
94
+ children: [
95
+ i != null && /* @__PURE__ */ f("span", {
96
+ className: x.language,
97
+ children: i
98
+ }),
99
+ !d && /* @__PURE__ */ f("button", {
100
+ type: "button",
101
+ className: x.copy,
102
+ "data-copied": _ || void 0,
103
+ "aria-label": _ ? "Copied" : "Copy",
104
+ onClick: () => v(y.current?.textContent ?? ""),
105
+ children: /* @__PURE__ */ f(r, {
106
+ glyph: S,
107
+ size: 12,
108
+ strokeWidth: 2,
109
+ "aria-hidden": !0
110
+ })
111
+ }),
112
+ /* @__PURE__ */ p(o, { children: [/* @__PURE__ */ f(l, { children: /* @__PURE__ */ f(s, { children: /* @__PURE__ */ f("pre", {
113
+ ...h,
114
+ className: x.pre,
115
+ children: /* @__PURE__ */ f("code", {
116
+ ref: y,
117
+ children: m
118
+ })
119
+ }) }) }), /* @__PURE__ */ f(a, {
120
+ orientation: "horizontal",
121
+ children: /* @__PURE__ */ f(c, {})
122
+ })] })
123
+ ]
124
+ });
125
+ }
126
+ T.displayName = "Code.Block";
127
+ //#endregion
128
+ //#region src/components/code/code.meta.ts
129
+ var E = {
130
+ name: "Code",
131
+ category: i.display,
132
+ status: "stable",
133
+ namespace: !0,
134
+ description: "Displays source code inline or in a block, with optional language labels and copying. Also called a code snippet or code block.",
135
+ origin: "native",
136
+ internalDependencies: ["ScrollArea"]
137
+ };
138
+ //#endregion
139
+ export { S as a, w as i, T as n, b as o, C as r, E as t };
@@ -44,7 +44,7 @@ declare function Footer(props: React.ComponentProps<"footer">): import("react/js
44
44
  declare namespace Footer {
45
45
  var displayName: string;
46
46
  }
47
- declare function Main(props: React.ComponentProps<"main">): import("react/jsx-runtime").JSX.Element;
47
+ declare function Main({ children, ...props }: React.ComponentProps<"main">): import("react/jsx-runtime").JSX.Element;
48
48
  declare namespace Main {
49
49
  var displayName: string;
50
50
  }
@@ -0,0 +1,148 @@
1
+ import { Dialog as DialogPrimitive } from '@base-ui/react/dialog';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as ScrollArea from '../scroll-area/scroll-area';
4
+ type HeaderVariant = "primary" | "main" | "support" | "minor";
5
+ declare const dialogTrigger: (props?: ({
6
+ inline?: boolean | null | undefined;
7
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
8
+ declare const dialogStatus: (props?: ({
9
+ variant?: "positive" | "negative" | "warning" | "info" | null | undefined;
10
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
11
+ export declare const createHandle: typeof DialogPrimitive.createHandle;
12
+ type RootProps<Payload = unknown> = React.ComponentProps<typeof DialogPrimitive.Root<Payload>>;
13
+ /**
14
+ * Dialog.Root — container that manages open/closed state.
15
+ *
16
+ * @see https://base-ui.com/react/components/dialog
17
+ * @llm https://base-ui.com/react/components/dialog.md
18
+ */
19
+ export declare function Root<Payload = unknown>(props: RootProps<Payload>): import("react/jsx-runtime").JSX.Element;
20
+ export declare namespace Root {
21
+ var displayName: string;
22
+ }
23
+ /** Dialog.Trigger — button that opens the dialog. `inline` styles it as a dashed-underlined term inside running text. */
24
+ export declare function Trigger({ inline, ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger> & VariantProps<typeof dialogTrigger>): import("react/jsx-runtime").JSX.Element;
25
+ export declare namespace Trigger {
26
+ var displayName: string;
27
+ }
28
+ /** Dialog.Portal — renders backdrop and popup in a portal outside the main document flow. */
29
+ export declare function Portal(props: React.ComponentProps<typeof DialogPrimitive.Portal>): import("react/jsx-runtime").JSX.Element;
30
+ export declare namespace Portal {
31
+ var displayName: string;
32
+ }
33
+ /** Dialog.Backdrop — flat dark overlay that dims the page behind the dialog. */
34
+ export declare function Backdrop(props: React.ComponentProps<typeof DialogPrimitive.Backdrop>): import("react/jsx-runtime").JSX.Element;
35
+ export declare namespace Backdrop {
36
+ var displayName: string;
37
+ }
38
+ /** Dialog.Viewport — full-screen container that centres the popup. */
39
+ export declare function Viewport(props: React.ComponentProps<typeof DialogPrimitive.Viewport>): import("react/jsx-runtime").JSX.Element;
40
+ export declare namespace Viewport {
41
+ var displayName: string;
42
+ }
43
+ interface PopupProps extends React.ComponentProps<typeof DialogPrimitive.Popup> {
44
+ /**
45
+ * Width of the window. `full` fills the screen minus a margin.
46
+ * @default 'md'
47
+ */
48
+ size?: "sm" | "md" | "lg" | "full";
49
+ }
50
+ /** Dialog.Popup — the window. Holds Header, Body, and Footer, or any free content. */
51
+ export declare function Popup({ size, ...props }: PopupProps): import("react/jsx-runtime").JSX.Element;
52
+ export declare namespace Popup {
53
+ var displayName: string;
54
+ }
55
+ type HeaderProps = React.ComponentProps<"div"> & {
56
+ /**
57
+ * Colour of the header band. On `primary` the title, description, and close button turn light.
58
+ * @default 'main'
59
+ */
60
+ variant?: HeaderVariant;
61
+ };
62
+ /** Dialog.Header — band at the top of the popup that holds the title, description, and close button. */
63
+ export declare function Header({ variant, ...props }: HeaderProps): import("react/jsx-runtime").JSX.Element;
64
+ export declare namespace Header {
65
+ var displayName: string;
66
+ }
67
+ /** Dialog.Body — the scrolling region between header and footer, a ScrollArea with the library's thumb and edge fades. */
68
+ export declare function Body({ children, ...props }: React.ComponentProps<typeof ScrollArea.Auto>): import("react/jsx-runtime").JSX.Element;
69
+ export declare namespace Body {
70
+ var displayName: string;
71
+ }
72
+ /** Dialog.Footer — row of actions pinned to the bottom of the popup. */
73
+ export declare function Footer(props: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
74
+ export declare namespace Footer {
75
+ var displayName: string;
76
+ }
77
+ type StatusProps = React.ComponentProps<"div"> & VariantProps<typeof dialogStatus>;
78
+ /**
79
+ * Dialog.Status — a tinted column at the start of the popup, spanning its full height, that marks the dialog's
80
+ * status with the variant's glyph. Place it first inside `Dialog.Popup`. Pass children to replace the glyph.
81
+ * Decorative (`aria-hidden`); the title carries the status.
82
+ */
83
+ export declare function Status({ variant, children, ...props }: StatusProps): import("react/jsx-runtime").JSX.Element;
84
+ export declare namespace Status {
85
+ var displayName: string;
86
+ }
87
+ /** Dialog.Title — heading that names the dialog for screen readers, set as `Typo.H2`. Light on a `primary` header. */
88
+ export declare function Title(props: React.ComponentProps<typeof DialogPrimitive.Title>): import("react/jsx-runtime").JSX.Element;
89
+ export declare namespace Title {
90
+ var displayName: string;
91
+ }
92
+ /** Dialog.Description — supplementary paragraph that describes the dialog for screen readers, set as `Typo.P`. */
93
+ export declare function Description(props: React.ComponentProps<typeof DialogPrimitive.Description>): import("react/jsx-runtime").JSX.Element;
94
+ export declare namespace Description {
95
+ var displayName: string;
96
+ }
97
+ /**
98
+ * Dialog.Close — button that closes the dialog. With no `children` and no `render` it renders the library's ghost close
99
+ * button (an × icon labelled "Close"); otherwise render your own `Button`.
100
+ */
101
+ export declare function Close(props: React.ComponentProps<typeof DialogPrimitive.Close>): import("react/jsx-runtime").JSX.Element;
102
+ export declare namespace Close {
103
+ var displayName: string;
104
+ }
105
+ type ComposedProps = Omit<React.ComponentProps<typeof DialogPrimitive.Root>, "children"> & {
106
+ /** Heading of the dialog. */
107
+ title: React.ReactNode;
108
+ /** Short uppercase label above the title. */
109
+ eyebrow?: React.ReactNode;
110
+ /** Line of context under the title. */
111
+ description?: React.ReactNode;
112
+ /** Adds a `Dialog.Status` with this variant at the start of the popup. */
113
+ status?: NonNullable<VariantProps<typeof dialogStatus>["variant"]>;
114
+ /**
115
+ * Colour of the header band.
116
+ */
117
+ headerVariant?: HeaderVariant;
118
+ /**
119
+ * Width of the window.
120
+ */
121
+ size?: PopupProps["size"];
122
+ /** Content of the footer, usually buttons. The footer renders only when this is set. */
123
+ actions?: React.ReactNode;
124
+ /** Content of the body. */
125
+ children?: React.ReactNode;
126
+ };
127
+ type SimpleProps = ComposedProps & {
128
+ /** Element rendered as the trigger, such as a `Button`. Omit it for a controlled dialog. */
129
+ trigger?: React.ReactElement;
130
+ };
131
+ /**
132
+ * Dialog.Simple — pre-composed dialog: trigger, header with title, description, optional status and close button, a
133
+ * scrolling body, and an optional footer. Root props pass through.
134
+ */
135
+ export declare function Simple({ trigger, headerVariant, size, ...props }: SimpleProps): import("react/jsx-runtime").JSX.Element;
136
+ export declare namespace Simple {
137
+ var displayName: string;
138
+ }
139
+ type InlineProps = ComposedProps & {
140
+ /** Text of the trigger, set as an inline term inside running prose. */
141
+ trigger: React.ReactNode;
142
+ };
143
+ /** Dialog.Inline — like Dialog.Simple, but the trigger is text inside a sentence. */
144
+ export declare function Inline({ trigger, headerVariant, size, ...props }: InlineProps): import("react/jsx-runtime").JSX.Element;
145
+ export declare namespace Inline {
146
+ var displayName: string;
147
+ }
148
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ComponentMeta } from '../../types/meta';
2
+ export declare const dialogMeta: ComponentMeta;
@@ -0,0 +1,2 @@
1
+ export * as Dialog from './dialog';
2
+ export { dialogMeta } from './dialog.meta';
@@ -63,7 +63,7 @@ export declare namespace Popup {
63
63
  var displayName: string;
64
64
  }
65
65
  /** Drawer.Content — scrollable content wrapper inside the popup. */
66
- export declare function Content(props: React.ComponentProps<typeof DrawerPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
66
+ export declare function Content({ children, ...props }: React.ComponentProps<typeof DrawerPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
67
67
  export declare namespace Content {
68
68
  var displayName: string;
69
69
  }
@@ -0,0 +1,2 @@
1
+ export * as ScrollArea from './scroll-area';
2
+ export { scrollAreaMeta } from './scroll-area.meta';
@@ -0,0 +1,49 @@
1
+ import { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';
2
+ /**
3
+ * ScrollArea.Root — groups the viewport and its scrollbars. Give it a height or max-height.
4
+ *
5
+ * @see https://base-ui.com/react/components/scroll-area
6
+ * @llm https://base-ui.com/react/components/scroll-area.md
7
+ */
8
+ export declare function Root(props: React.ComponentProps<typeof ScrollAreaPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
9
+ export declare namespace Root {
10
+ var displayName: string;
11
+ }
12
+ /** ScrollArea.Viewport — the scrolling box. It fades its content out at each edge with more to scroll. */
13
+ export declare function Viewport(props: React.ComponentProps<typeof ScrollAreaPrimitive.Viewport>): import("react/jsx-runtime").JSX.Element;
14
+ export declare namespace Viewport {
15
+ var displayName: string;
16
+ }
17
+ /** ScrollArea.Content — wraps the scrolled content so the viewport can measure it. */
18
+ export declare function Content(props: React.ComponentProps<typeof ScrollAreaPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
19
+ export declare namespace Content {
20
+ var displayName: string;
21
+ }
22
+ /** ScrollArea.Scrollbar — overlay bar that shows while the area is hovered or scrolling. */
23
+ export declare function Scrollbar(props: React.ComponentProps<typeof ScrollAreaPrimitive.Scrollbar>): import("react/jsx-runtime").JSX.Element;
24
+ export declare namespace Scrollbar {
25
+ var displayName: string;
26
+ }
27
+ /** ScrollArea.Thumb — the draggable part of the scrollbar. */
28
+ export declare function Thumb(props: React.ComponentProps<typeof ScrollAreaPrimitive.Thumb>): import("react/jsx-runtime").JSX.Element;
29
+ export declare namespace Thumb {
30
+ var displayName: string;
31
+ }
32
+ /** ScrollArea.Corner — the square where a vertical and a horizontal scrollbar meet. */
33
+ export declare function Corner(props: React.ComponentProps<typeof ScrollAreaPrimitive.Corner>): import("react/jsx-runtime").JSX.Element;
34
+ export declare namespace Corner {
35
+ var displayName: string;
36
+ }
37
+ interface AutoProps extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {
38
+ /**
39
+ * Which scrollbars to render. `both` also adds the Corner; `none` scrolls and fades without a visible bar.
40
+ * @default 'vertical'
41
+ */
42
+ orientation?: "vertical" | "horizontal" | "both" | "none";
43
+ }
44
+ /** ScrollArea.Auto — Root, Viewport, Content, and the scrollbars for `orientation`, around `children`. */
45
+ export declare function Auto({ orientation, children, ...props }: AutoProps): import("react/jsx-runtime").JSX.Element;
46
+ export declare namespace Auto {
47
+ var displayName: string;
48
+ }
49
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ComponentMeta } from '../../types/meta';
2
+ export declare const scrollAreaMeta: ComponentMeta;
package/dist/index.d.ts CHANGED
@@ -15,10 +15,12 @@ export { Toggle, toggleMeta } from './components/toggle';
15
15
  export { ToggleGroup, toggleGroupMeta } from './components/toggle-group';
16
16
  export { AppShell, appShellMeta } from './components/app-shell';
17
17
  export { Card, cardMeta } from './components/card';
18
+ export { Dialog, dialogMeta } from './components/dialog';
18
19
  export { Drawer, drawerMeta } from './components/drawer';
19
20
  export { Popover, popoverMeta } from './components/popover';
20
21
  export { Prose, proseMeta } from './components/prose';
21
22
  export { Row, rowMeta } from './components/row';
23
+ export { ScrollArea, scrollAreaMeta } from './components/scroll-area';
22
24
  export { Separator, separatorMeta } from './components/separator';
23
25
  export { Stack, stackMeta } from './components/stack';
24
26
  export { AccountCard, accountCardMeta } from './components/account-card';