@stll/ui 0.60.0 → 0.62.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.
@@ -146,7 +146,7 @@ const slotAt = (ms, options) => rangeFromDrag({
146
146
  * member of a cluster shares the cluster's lane count, so their widths match.
147
147
  */
148
148
  const layoutOverlaps = (ranges) => {
149
- const sorted = ranges.toSorted((left, right) => left.startMs - right.startMs || right.endMs - left.endMs || compareIds(left.id, right.id));
149
+ const sorted = [...ranges].sort((left, right) => left.startMs - right.startMs || right.endMs - left.endMs || compareIds(left.id, right.id));
150
150
  const placements = /* @__PURE__ */ new Map();
151
151
  const seen = /* @__PURE__ */ new Set();
152
152
  let cluster = [];
@@ -186,7 +186,7 @@ const layoutOverlaps = (ranges) => {
186
186
  * an earlier entry already uses it.
187
187
  */
188
188
  const mergeShortSegments = (segments, { thresholdMs }) => {
189
- const sorted = segments.toSorted((left, right) => left.startMs - right.startMs || left.endMs - right.endMs || compareIds(left.id, right.id));
189
+ const sorted = [...segments].sort((left, right) => left.startMs - right.startMs || left.endMs - right.endMs || compareIds(left.id, right.id));
190
190
  const merged = [];
191
191
  const takenIds = new Set(segments.map(({ id }) => id));
192
192
  let run = [];
@@ -1,5 +1,12 @@
1
1
  import * as React$1 from "react";
2
2
  //#region src/components/bidi-text.d.ts
3
+ /**
4
+ * Isolation shields the text around a value, not the value itself: a
5
+ * directional control inside it still reorders its letters, so stored text
6
+ * loses those controls before it renders.
7
+ */
8
+ export declare const stripDirectionalControls: (text: string) => string;
9
+ export declare const withoutDirectionalControls: (children: React$1.ReactNode) => React$1.ReactNode;
3
10
  export declare const BidiText: (props: BidiTextProps) => React$1.JSX.Element;
4
11
  export declare const UserText: typeof BidiText;
5
12
  type BidiDirection = "auto" | "ltr" | "rtl";
@@ -2,37 +2,50 @@
2
2
  import { cn } from "../lib/utils.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/components/bidi-text.tsx
5
+ /** Explicit embeddings, overrides and isolates; implicit marks stay. */
6
+ const DIRECTIONAL_CONTROLS = /[\u202A-\u202E\u2066-\u2069]/gu;
7
+ /**
8
+ * Isolation shields the text around a value, not the value itself: a
9
+ * directional control inside it still reorders its letters, so stored text
10
+ * loses those controls before it renders.
11
+ */
12
+ const stripDirectionalControls = (text) => text.replaceAll(DIRECTIONAL_CONTROLS, "");
13
+ const withoutDirectionalControls = (children) => typeof children === "string" ? stripDirectionalControls(children) : children;
5
14
  const BidiText = (props) => {
6
15
  if (props.as === "span") {
7
- const { as: _as, className, direction = "auto", ...rest } = props;
16
+ const { as: _as, children, className, direction = "auto", ...rest } = props;
8
17
  return /* @__PURE__ */ jsx("span", {
9
18
  className: cn("[unicode-bidi:isolate]", className),
10
19
  dir: direction,
11
- ...rest
20
+ ...rest,
21
+ children: withoutDirectionalControls(children)
12
22
  });
13
23
  }
14
24
  if (props.as === "div") {
15
- const { as: _as, className, direction = "auto", ...rest } = props;
25
+ const { as: _as, children, className, direction = "auto", ...rest } = props;
16
26
  return /* @__PURE__ */ jsx("div", {
17
27
  className: cn("[unicode-bidi:isolate]", className),
18
28
  dir: direction,
19
- ...rest
29
+ ...rest,
30
+ children: withoutDirectionalControls(children)
20
31
  });
21
32
  }
22
33
  if (props.as === "p") {
23
- const { as: _as, className, direction = "auto", ...rest } = props;
34
+ const { as: _as, children, className, direction = "auto", ...rest } = props;
24
35
  return /* @__PURE__ */ jsx("p", {
25
36
  className: cn("[unicode-bidi:isolate]", className),
26
37
  dir: direction,
27
- ...rest
38
+ ...rest,
39
+ children: withoutDirectionalControls(children)
28
40
  });
29
41
  }
30
- const { as: _as, direction = "auto", ...rest } = props;
42
+ const { as: _as, children, direction = "auto", ...rest } = props;
31
43
  return /* @__PURE__ */ jsx("bdi", {
32
44
  dir: direction,
33
- ...rest
45
+ ...rest,
46
+ children: withoutDirectionalControls(children)
34
47
  });
35
48
  };
36
49
  const UserText = BidiText;
37
50
  //#endregion
38
- export { BidiText, UserText };
51
+ export { BidiText, UserText, stripDirectionalControls, withoutDirectionalControls };
@@ -6,6 +6,7 @@ import { MENU_ROW_CLASS_NAME } from "../lib/menu-row.js";
6
6
  import { BUTTON_PLAIN_VARIANT, BUTTON_VARIANT_TOKENS } from "./button.shared.js";
7
7
  import { Loader } from "./loader.js";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { Fragment as Fragment$1, isValidElement } from "react";
9
10
  import { mergeProps } from "@base-ui/react/merge-props";
10
11
  import { useRender } from "@base-ui/react/use-render";
11
12
  import { panic } from "better-result";
@@ -65,7 +66,7 @@ const BUTTON_VARIANT_CLASS_NAMES = {
65
66
  outline: `${tokens("outline")} dark:bg-input/32 data-pressed:border-primary/48 data-pressed:bg-accent dark:data-pressed:bg-input/64 [:hover:not([data-pressed])]:bg-accent/50 dark:[:hover:not([data-pressed])]:bg-input/64 shadow-xs/5 not-dark:bg-clip-padding not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none`,
66
67
  secondary: `${tokens("secondary")} data-pressed:bg-background data-pressed:inset-ring-input active:bg-secondary/80 [:hover:not([data-pressed])]:bg-secondary/90 data-pressed:shadow-xs/5 data-pressed:inset-ring`
67
68
  };
68
- const buttonVariants = cva("focus-visible:ring-ring focus-visible:ring-offset-background relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-lg border text-base font-medium whitespace-nowrap outline-none select-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] focus-visible:ring-2 focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-64 sm:text-sm pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4", {
69
+ const buttonVariants = cva("focus-visible:ring-ring focus-visible:ring-offset-background relative inline-flex max-w-full shrink-0 cursor-pointer items-center justify-center gap-2 rounded-lg border text-base font-medium whitespace-nowrap outline-none select-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] focus-visible:ring-2 focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-64 sm:text-sm pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4", {
69
70
  compoundVariants: [{
70
71
  className: "[:hover:not([data-pressed])]:bg-transparent",
71
72
  size: "inline",
@@ -105,7 +106,7 @@ const buttonVariants = cva("focus-visible:ring-ring focus-visible:ring-offset-ba
105
106
  * inside the box: an outline paints above the content, so a card's own
106
107
  * surface cannot cover it the way it would cover an inset shadow.
107
108
  */
108
- const BUTTON_PLAIN_CLASS = "focus-visible:ring-ring focus-visible:ring-offset-background data-pressed:outline-primary/48 relative inline-block cursor-pointer text-start outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-default data-pressed:outline-2 data-pressed:-outline-offset-2 data-pressed:outline-solid";
109
+ const BUTTON_PLAIN_CLASS = "focus-visible:ring-ring focus-visible:ring-offset-background data-pressed:outline-primary/48 relative inline-block max-w-full cursor-pointer text-start outline-none focus-visible:ring-2 focus-visible:ring-offset-1 disabled:cursor-default data-pressed:outline-2 data-pressed:-outline-offset-2 data-pressed:outline-solid";
109
110
  /**
110
111
  * The outline a plain button's focus ring follows, matching its content:
111
112
  * `box` for a card, row or block of text (the container radius), `round` for
@@ -148,6 +149,53 @@ const BUTTON_SIZE_CONTENT = {
148
149
  xl: BUTTON_CONTENT.text,
149
150
  xs: BUTTON_CONTENT.text
150
151
  };
152
+ /**
153
+ * A button never grows past its container (`max-w-full` on every variant).
154
+ * A one-line text label is cut to fit with an ellipsis; the button's
155
+ * accessible name keeps the whole text, and `tooltip` can show it. The label
156
+ * is a plain span, not a `TruncatedText`: a tooltip root in every button's
157
+ * label would cost every screen with many buttons. `layout="wrap"` lets a
158
+ * label take several lines instead. An inline button is a word in a sentence
159
+ * and a plain button lays out its own content, so neither has a one-line
160
+ * label to cut.
161
+ */
162
+ const BUTTON_LABEL_CLASS = "block min-w-0 truncate";
163
+ const cutsLabel = ({ layout, size, variant }) => layout === void 0 && variant !== "plain" && variant !== "link" && size !== "inline" && BUTTON_SIZE_CONTENT[size ?? BUTTON_DEFAULT_SIZE] === BUTTON_CONTENT.text;
164
+ /**
165
+ * Each run of adjacent text among the children, cut to the button's width.
166
+ * Adjacent text (`Save {count} files`) stays one run, as it is one flex item
167
+ * in the button's box; children React renders as nothing (`null`, `false`)
168
+ * do not split it. Every other child keeps its place in a fragment keyed by
169
+ * its own key, or by its position when it has none, so keyed children keep
170
+ * their state when they move.
171
+ */
172
+ const containedLabel = (children) => {
173
+ const items = Array.isArray(children) ? children : [children];
174
+ const parts = [];
175
+ let run = [];
176
+ const closeRun = () => {
177
+ if (run.length > 0) {
178
+ parts.push(/* @__PURE__ */ jsx("span", {
179
+ className: BUTTON_LABEL_CLASS,
180
+ "data-slot": "button-label",
181
+ children: run
182
+ }, `label:${String(parts.length)}`));
183
+ run = [];
184
+ }
185
+ };
186
+ for (const child of items) {
187
+ if (child === null || child === void 0 || typeof child === "boolean") continue;
188
+ if (typeof child === "string" || typeof child === "number") {
189
+ run.push(child);
190
+ continue;
191
+ }
192
+ closeRun();
193
+ const key = isValidElement(child) && child.key !== null ? `key:${child.key}` : `part:${String(parts.length)}`;
194
+ parts.push(/* @__PURE__ */ jsx(Fragment$1, { children: child }, key));
195
+ }
196
+ closeRun();
197
+ return parts;
198
+ };
151
199
  const implicitTooltip = (size, accessibleName) => {
152
200
  const content = BUTTON_SIZE_CONTENT[size ?? BUTTON_DEFAULT_SIZE];
153
201
  switch (content) {
@@ -174,7 +222,11 @@ function Button({ className, variant: variantProp, size, render, layout, loading
174
222
  "data-slot": "button-loader",
175
223
  size: "sm",
176
224
  variant: "decorative"
177
- }) : icon, children] }),
225
+ }) : icon, cutsLabel({
226
+ layout,
227
+ size,
228
+ variant
229
+ }) ? containedLabel(children) : children] }),
178
230
  className: cn(variant === "plain" ? cn(BUTTON_PLAIN_CLASS, BUTTON_PLAIN_SHAPE_CLASS[shape], className) : cn(disposition === BUTTON_DISPOSITION.enabled && !isActivationPreservingDisabled && size !== "row" && size !== "inline" && variant !== "link" && buttonPressClass, buttonVariants({
179
231
  className,
180
232
  size,
@@ -0,0 +1,26 @@
1
+ import { Collapsible as Collapsible$1 } from "@base-ui/react/collapsible";
2
+ //#region src/components/collapsible.d.ts
3
+ /**
4
+ * One disclosure: a trigger that shows or hides a single panel ("Show
5
+ * details" under a card, a step list in a transcript). A set of sections
6
+ * where each heading opens its own panel is an `Accordion`.
7
+ *
8
+ * The trigger draws nothing of its own. It takes its look from what it
9
+ * renders, usually a `Button` (`render={<Button variant="muted" />}` for a
10
+ * text toggle), so a disclosure reads like every other action of its size.
11
+ */
12
+ declare const Collapsible: (props: Collapsible$1.Root.Props) => import("react").JSX.Element;
13
+ declare const CollapsibleTrigger: (props: Collapsible$1.Trigger.Props) => import("react").JSX.Element;
14
+ /**
15
+ * The disclosed content. It adds no padding or type, so opening it reveals
16
+ * content at the rhythm of the surface around it, as a native `<details>`
17
+ * does. Its height eases open and shut with the accordion's timing, so the
18
+ * two disclosures move alike; under reduced motion it snaps.
19
+ *
20
+ * Closed, the content stays in the document as `hidden="until-found"` (as a
21
+ * native `<details>` keeps it), so find-in-page still reaches it and opens
22
+ * the panel. Pass `hiddenUntilFound={false}` to unmount it instead.
23
+ */
24
+ declare const CollapsiblePanel: ({ className, hiddenUntilFound, ...props }: Collapsible$1.Panel.Props) => import("react").JSX.Element;
25
+ //#endregion
26
+ export { Collapsible, CollapsiblePanel, CollapsibleTrigger };
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Collapsible as Collapsible$1 } from "@base-ui/react/collapsible";
5
+ //#region src/components/collapsible.tsx
6
+ /**
7
+ * One disclosure: a trigger that shows or hides a single panel ("Show
8
+ * details" under a card, a step list in a transcript). A set of sections
9
+ * where each heading opens its own panel is an `Accordion`.
10
+ *
11
+ * The trigger draws nothing of its own. It takes its look from what it
12
+ * renders, usually a `Button` (`render={<Button variant="muted" />}` for a
13
+ * text toggle), so a disclosure reads like every other action of its size.
14
+ */
15
+ const Collapsible = (props) => /* @__PURE__ */ jsx(Collapsible$1.Root, {
16
+ "data-slot": "collapsible",
17
+ ...props
18
+ });
19
+ const CollapsibleTrigger = (props) => /* @__PURE__ */ jsx(Collapsible$1.Trigger, {
20
+ "data-slot": "collapsible-trigger",
21
+ ...props
22
+ });
23
+ /**
24
+ * The disclosed content. It adds no padding or type, so opening it reveals
25
+ * content at the rhythm of the surface around it, as a native `<details>`
26
+ * does. Its height eases open and shut with the accordion's timing, so the
27
+ * two disclosures move alike; under reduced motion it snaps.
28
+ *
29
+ * Closed, the content stays in the document as `hidden="until-found"` (as a
30
+ * native `<details>` keeps it), so find-in-page still reaches it and opens
31
+ * the panel. Pass `hiddenUntilFound={false}` to unmount it instead.
32
+ */
33
+ const CollapsiblePanel = ({ className, hiddenUntilFound = true, ...props }) => /* @__PURE__ */ jsx(Collapsible$1.Panel, {
34
+ className: cn("h-(--collapsible-panel-height) min-w-0 overflow-hidden transition-[height] duration-200 ease-in-out data-ending-style:h-0 data-starting-style:h-0 motion-reduce:transition-none [&[hidden]:not([hidden=until-found])]:hidden", className),
35
+ "data-slot": "collapsible-panel",
36
+ hiddenUntilFound,
37
+ ...props
38
+ });
39
+ //#endregion
40
+ export { Collapsible, CollapsiblePanel, CollapsibleTrigger };
@@ -4,6 +4,12 @@ declare const Field: ({ className, ...props }: Field$1.Root.Props) => import("re
4
4
  declare const FieldLabel: ({ className, ...props }: Field$1.Label.Props) => import("react").JSX.Element;
5
5
  declare const FieldItem: ({ className, ...props }: Field$1.Item.Props) => import("react").JSX.Element;
6
6
  declare const FieldDescription: ({ className, ...props }: Field$1.Description.Props) => import("react").JSX.Element;
7
+ /**
8
+ * The message for an invalid field. With no `match` it shows whatever error
9
+ * the field has, including one the `Form` received in `errors` from the
10
+ * server; with a validity key (`match="valueMissing"`) it shows only for that
11
+ * constraint, so each rule can be worded on its own. See `Form`.
12
+ */
7
13
  declare const FieldError: ({ className, ...props }: Field$1.Error.Props) => import("react").JSX.Element;
8
14
  declare const FieldControl: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").FieldControlProps, "ref"> & import("react").RefAttributes<HTMLElement>>;
9
15
  declare const FieldValidity: import("react").FC<import("@base-ui/react").FieldValidityProps>;
@@ -23,6 +23,12 @@ const FieldDescription = ({ className, ...props }) => /* @__PURE__ */ jsx(Field$
23
23
  "data-slot": "field-description",
24
24
  ...props
25
25
  });
26
+ /**
27
+ * The message for an invalid field. With no `match` it shows whatever error
28
+ * the field has, including one the `Form` received in `errors` from the
29
+ * server; with a validity key (`match="valueMissing"`) it shows only for that
30
+ * constraint, so each rule can be worded on its own. See `Form`.
31
+ */
26
32
  const FieldError = ({ className, ...props }) => /* @__PURE__ */ jsx(Field$1.Error, {
27
33
  className: cn("text-destructive-foreground text-xs", className),
28
34
  "data-slot": "field-error",
@@ -5,10 +5,44 @@ declare const formVariants: (props?: ({
5
5
  density?: "compact" | "default" | "snug" | null | undefined;
6
6
  layout?: "inline" | "stack" | null | undefined;
7
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ /**
9
+ * Errors a server returned for the last submit, keyed by each `Field`'s
10
+ * `name`: one message or several.
11
+ */
12
+ type FormErrors = NonNullable<Form$1.Props["errors"]>;
8
13
  type FormProps = Form$1.Props & VariantProps<typeof formVariants> & {
9
14
  dirty?: boolean;
10
15
  onDiscard?: (() => void) | undefined;
11
16
  };
17
+ /**
18
+ * A form whose fields report their own errors.
19
+ *
20
+ * Validation, in the order a reader meets it:
21
+ *
22
+ * - **In the browser.** A `Field` reads its control's constraints
23
+ * (`required`, `type`, `pattern`, `min`/`max`, a `validate` function) and
24
+ * shows a `FieldError` for the ones that fail. `validationMode` stays
25
+ * Base UI's `onSubmit`: nothing is flagged while a person tabs through an
26
+ * empty form, the first submit marks every invalid field at once, and from
27
+ * then on each field re-validates as it changes. `onBlur` would flag a
28
+ * required field the moment focus passes it, before anyone tried to submit;
29
+ * pass it only where checking a value as soon as it is left is the point
30
+ * (an availability check, a long identifier).
31
+ * - **From the server.** Pass what the server rejected as `errors`, keyed by
32
+ * field `name` (`{ email: "Already invited" }`). The field turns invalid,
33
+ * its control gets `aria-invalid`, and its `FieldError` shows the message.
34
+ * Base UI drops a field's server error as soon as its value changes, so a
35
+ * correction clears the message without a round trip. Keep the errors in
36
+ * state and replace them on the next submit.
37
+ *
38
+ * In a `FieldError`, leave `match` unset to show whichever error the field
39
+ * has, the server's included; `match="valueMissing"` (or another validity
40
+ * key) words one constraint in the product's voice; `match` set to `true`
41
+ * hands visibility to the caller.
42
+ *
43
+ * `dirty` and `onDiscard` register the form with an enclosing `Dialog`'s
44
+ * unsaved-changes guard.
45
+ */
12
46
  declare const Form: ({ className, density, layout, dirty, onDiscard, children, ...props }: FormProps) => import("react").JSX.Element;
13
47
  //#endregion
14
- export { Form, type FormProps, formVariants };
48
+ export { Form, type FormErrors, type FormProps, formVariants };
@@ -22,6 +22,35 @@ const formVariants = cva("flex w-full", {
22
22
  }
23
23
  }
24
24
  });
25
+ /**
26
+ * A form whose fields report their own errors.
27
+ *
28
+ * Validation, in the order a reader meets it:
29
+ *
30
+ * - **In the browser.** A `Field` reads its control's constraints
31
+ * (`required`, `type`, `pattern`, `min`/`max`, a `validate` function) and
32
+ * shows a `FieldError` for the ones that fail. `validationMode` stays
33
+ * Base UI's `onSubmit`: nothing is flagged while a person tabs through an
34
+ * empty form, the first submit marks every invalid field at once, and from
35
+ * then on each field re-validates as it changes. `onBlur` would flag a
36
+ * required field the moment focus passes it, before anyone tried to submit;
37
+ * pass it only where checking a value as soon as it is left is the point
38
+ * (an availability check, a long identifier).
39
+ * - **From the server.** Pass what the server rejected as `errors`, keyed by
40
+ * field `name` (`{ email: "Already invited" }`). The field turns invalid,
41
+ * its control gets `aria-invalid`, and its `FieldError` shows the message.
42
+ * Base UI drops a field's server error as soon as its value changes, so a
43
+ * correction clears the message without a round trip. Keep the errors in
44
+ * state and replace them on the next submit.
45
+ *
46
+ * In a `FieldError`, leave `match` unset to show whichever error the field
47
+ * has, the server's included; `match="valueMissing"` (or another validity
48
+ * key) words one constraint in the product's voice; `match` set to `true`
49
+ * hands visibility to the caller.
50
+ *
51
+ * `dirty` and `onDiscard` register the form with an enclosing `Dialog`'s
52
+ * unsaved-changes guard.
53
+ */
25
54
  const Form = ({ className, density, layout, dirty = false, onDiscard, children, ...props }) => /* @__PURE__ */ jsxs(Form$1, {
26
55
  className: cn(formVariants({
27
56
  density,
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
3
  import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
4
+ import { withoutDirectionalControls } from "./bidi-text.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { useCallback, useId, useState } from "react";
6
7
  //#region src/components/identity-text.tsx
@@ -10,6 +11,7 @@ const IdentityText = ({ children, className }) => {
10
11
  const [overflow, setOverflow] = useState(false);
11
12
  const [hasFocusOwner, setHasFocusOwner] = useState(false);
12
13
  const [open, setOpen] = useState(false);
14
+ const name = withoutDirectionalControls(children);
13
15
  const textRef = useCallback((node) => {
14
16
  if (node === null) return;
15
17
  const measure = () => setOverflow(node.scrollWidth > node.clientWidth);
@@ -56,14 +58,14 @@ const IdentityText = ({ children, className }) => {
56
58
  role: overflow && !hasFocusOwner ? "button" : void 0,
57
59
  tabIndex: overflow && !hasFocusOwner ? 0 : void 0
58
60
  }),
59
- children
61
+ children: name
60
62
  }), /* @__PURE__ */ jsx(TooltipPopup, {
61
63
  className: "max-w-sm",
62
64
  role: "tooltip",
63
65
  children: /* @__PURE__ */ jsx("span", {
64
66
  className: "block max-w-sm wrap-break-word",
65
67
  dir: "auto",
66
- children
68
+ children: name
67
69
  })
68
70
  })]
69
71
  });
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
- import { ScrollArea } from "./scroll-area.js";
4
3
  import { BidiText } from "./bidi-text.js";
4
+ import { ScrollArea } from "./scroll-area.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/components/landing.tsx
7
7
  const LandingLayout = ({ actions, hero, children, footer }) => /* @__PURE__ */ jsxs("div", {
@@ -35,6 +35,7 @@ const SearchField = ({ value, onValueChange, clearLabel, groupClassName, classNa
35
35
  align: "inline-end",
36
36
  children: /* @__PURE__ */ jsx(Button, {
37
37
  "aria-label": clearLabel,
38
+ disabled: props.disabled,
38
39
  onClick: () => {
39
40
  onValueChange("");
40
41
  },
@@ -16,7 +16,8 @@ type SegmentedIconToggleProps<T extends string> = {
16
16
  };
17
17
  /** Compact segmented control of icon buttons (e.g. table row wrap, list
18
18
  * density). One shared shell so every density/mode switch looks and behaves
19
- * the same across the app. */
19
+ * the same across the app. A `ToggleGroup` of icon items that always holds
20
+ * one value: clicking the chosen option keeps it. */
20
21
  export declare const SegmentedIconToggle: <T extends string>({ value, options, onChange, size }: SegmentedIconToggleProps<T>) => import("react").JSX.Element;
21
22
  //#endregion
22
23
  export {};
@@ -1,31 +1,30 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
- import { Tooltip, TooltipContent as TooltipPopup, TooltipTrigger } from "./tooltip.js";
4
- import { Button } from "./button.js";
5
- import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { ToggleGroup, ToggleGroupItem } from "./toggle-group.js";
4
+ import { jsx } from "react/jsx-runtime";
6
5
  //#region src/components/segmented-icon-toggle.tsx
7
6
  /** Compact segmented control of icon buttons (e.g. table row wrap, list
8
7
  * density). One shared shell so every density/mode switch looks and behaves
9
- * the same across the app. */
10
- const SegmentedIconToggle = ({ value, options, onChange, size = "compact" }) => /* @__PURE__ */ jsx("div", {
11
- className: cn("border-border/70 bg-muted/30 inline-flex shrink-0 items-center overflow-hidden rounded-md border p-0.5", size === "touch" ? "h-7 [@media(any-pointer:coarse)]:h-12" : "h-7"),
8
+ * the same across the app. A `ToggleGroup` of icon items that always holds
9
+ * one value: clicking the chosen option keeps it. */
10
+ const SegmentedIconToggle = ({ value, options, onChange, size = "compact" }) => /* @__PURE__ */ jsx(ToggleGroup, {
11
+ className: cn("rounded-md", size === "touch" ? "h-7 [@media(any-pointer:coarse)]:h-12" : "h-7"),
12
12
  "data-slot": "segmented-icon-toggle",
13
+ onValueChange: (next) => {
14
+ const [chosen] = next;
15
+ if (chosen !== void 0 && chosen !== value) onChange(chosen);
16
+ },
17
+ value: [value],
13
18
  children: options.map((option) => {
14
19
  const Icon = option.icon;
15
- const isActive = value === option.value;
16
- return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
17
- render: /* @__PURE__ */ jsx(Button, {
18
- "aria-label": option.label,
19
- "aria-pressed": isActive,
20
- className: cn("text-muted-foreground h-6 min-h-0 w-7 rounded-[4px] p-0", size === "touch" && "[@media(any-pointer:coarse)]:h-11 [@media(any-pointer:coarse)]:min-h-11 [@media(any-pointer:coarse)]:w-11", isActive && "bg-muted text-foreground ring-border/80 hover:bg-muted hover:text-foreground shadow-xs ring-1"),
21
- "data-control-value": option.value,
22
- onClick: () => onChange(option.value),
23
- size: "icon-xs",
24
- type: "button",
25
- variant: "ghost"
26
- }),
20
+ return /* @__PURE__ */ jsx(ToggleGroupItem, {
21
+ "aria-label": option.label,
22
+ className: cn("h-6 w-7 rounded-[4px] sm:h-6", size === "touch" && "[@media(any-pointer:coarse)]:h-11 [@media(any-pointer:coarse)]:w-11"),
23
+ "data-control-value": option.value,
24
+ size: "icon-xs",
25
+ value: option.value,
27
26
  children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5" })
28
- }), /* @__PURE__ */ jsx(TooltipPopup, { children: option.label })] }, option.value);
27
+ }, option.value);
29
28
  })
30
29
  });
31
30
  //#endregion
@@ -1,5 +1,24 @@
1
+ import * as React$1 from "react";
1
2
  import { Switch as Switch$1 } from "@base-ui/react/switch";
2
3
  //#region src/components/switch.d.ts
3
- declare const Switch: ({ className, ...props }: Switch$1.Root.Props) => import("react").JSX.Element;
4
+ /**
5
+ * `default` is a setting's own control; `sm` sits in a dense row or a menu
6
+ * beside small type.
7
+ */
8
+ type SwitchSize = "sm" | "default";
9
+ type SwitchProps = Switch$1.Root.Props & {
10
+ size?: SwitchSize | undefined;
11
+ };
12
+ declare const Switch: ({ className, size, ...props }: SwitchProps) => React$1.JSX.Element;
13
+ /**
14
+ * A setting row: its label and an optional description at the start, the
15
+ * switch at the end. The whole row is the label, so a click anywhere on it
16
+ * flips the switch, and the row is at least 44px tall for touch. The
17
+ * description is linked to the switch, so it is read after the name.
18
+ */
19
+ declare const SwitchField: ({ className, description, label, size, ...props }: SwitchProps & {
20
+ label: React$1.ReactNode;
21
+ description?: React$1.ReactNode;
22
+ }) => React$1.JSX.Element;
4
23
  //#endregion
5
- export { Switch };
24
+ export { Switch, SwitchField, type SwitchProps, type SwitchSize };
@@ -1,16 +1,55 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
- import { jsx } from "react/jsx-runtime";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useId } from "react";
4
5
  import { Switch as Switch$1 } from "@base-ui/react/switch";
5
6
  //#region src/components/switch.tsx
6
- const Switch = ({ className, ...props }) => /* @__PURE__ */ jsx(Switch$1.Root, {
7
- className: cn("focus-visible:ring-ring focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input relative inline-flex h-5 w-9 shrink-0 items-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64", className),
7
+ const SWITCH_ROOT_SIZE_CLASS_NAME = {
8
+ default: "h-5 w-9",
9
+ sm: "h-4 w-7"
10
+ };
11
+ const SWITCH_THUMB_SIZE_CLASS_NAME = {
12
+ default: "size-4 ltr:data-checked:translate-x-4.5 ltr:data-unchecked:translate-x-0.5 rtl:data-checked:-translate-x-4.5 rtl:data-unchecked:-translate-x-0.5",
13
+ sm: "size-3 ltr:data-checked:translate-x-3.5 ltr:data-unchecked:translate-x-0.5 rtl:data-checked:-translate-x-3.5 rtl:data-unchecked:-translate-x-0.5"
14
+ };
15
+ const Switch = ({ className, size = "default", ...props }) => /* @__PURE__ */ jsx(Switch$1.Root, {
16
+ className: cn("focus-visible:ring-ring focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input relative inline-flex shrink-0 items-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64", SWITCH_ROOT_SIZE_CLASS_NAME[size], className),
17
+ "data-size": size,
8
18
  "data-slot": "switch",
9
19
  ...props,
10
20
  children: /* @__PURE__ */ jsx(Switch$1.Thumb, {
11
- className: "bg-background pointer-events-none block size-4 rounded-full shadow-xs transition-transform ltr:data-checked:translate-x-4.5 ltr:data-unchecked:translate-x-0.5 rtl:data-checked:-translate-x-4.5 rtl:data-unchecked:-translate-x-0.5",
21
+ className: cn("bg-background pointer-events-none block rounded-full shadow-xs transition-transform", SWITCH_THUMB_SIZE_CLASS_NAME[size]),
12
22
  "data-slot": "switch-thumb"
13
23
  })
14
24
  });
25
+ /**
26
+ * A setting row: its label and an optional description at the start, the
27
+ * switch at the end. The whole row is the label, so a click anywhere on it
28
+ * flips the switch, and the row is at least 44px tall for touch. The
29
+ * description is linked to the switch, so it is read after the name.
30
+ */
31
+ const SwitchField = ({ className, description, label, size, ...props }) => {
32
+ const descriptionId = useId();
33
+ return /* @__PURE__ */ jsxs("label", {
34
+ className: cn("flex min-h-11 cursor-pointer items-center justify-between gap-4 py-2 has-data-disabled:cursor-not-allowed", className),
35
+ "data-slot": "switch-field",
36
+ children: [/* @__PURE__ */ jsxs("span", {
37
+ className: "flex min-w-0 flex-col gap-0.5 in-[label:has([data-disabled])]:opacity-64",
38
+ children: [/* @__PURE__ */ jsx("span", {
39
+ className: "text-foreground text-sm font-medium",
40
+ children: label
41
+ }), description === void 0 ? null : /* @__PURE__ */ jsx("span", {
42
+ className: "text-muted-foreground text-xs",
43
+ "data-slot": "switch-field-description",
44
+ id: descriptionId,
45
+ children: description
46
+ })]
47
+ }), /* @__PURE__ */ jsx(Switch, {
48
+ "aria-describedby": description === void 0 ? void 0 : descriptionId,
49
+ size,
50
+ ...props
51
+ })]
52
+ });
53
+ };
15
54
  //#endregion
16
- export { Switch };
55
+ export { Switch, SwitchField };
@@ -14,11 +14,25 @@ type TableInset = "default" | "card";
14
14
  * become the reference box of a sticky header and stop it from sticking.
15
15
  */
16
16
  type TableScroll = "self" | "parent";
17
+ /**
18
+ * How tightly a table sets its cells.
19
+ *
20
+ * `default` is a data table: padded cells on one line, rows that light up
21
+ * under the pointer. `compact` is a small reading table inside a card or a
22
+ * review (a term set against a standard, a presence matrix): cells sit at
23
+ * text leading with no side padding, headings keep a trailing gap so a
24
+ * right-aligned heading never touches the next column, values wrap, and rows
25
+ * do not highlight because nothing in them is a row-wide target. A row
26
+ * header (`<TableHead scope="row">`) in a compact body reads as the row's
27
+ * first cell rather than as a column heading.
28
+ */
29
+ type TableDensity = "default" | "compact";
17
30
  type TableProps = React$1.ComponentProps<"table"> & {
31
+ density?: TableDensity;
18
32
  inset?: TableInset;
19
33
  scroll?: TableScroll;
20
34
  };
21
- declare const Table: ({ className, inset, scroll, ...props }: TableProps) => React$1.JSX.Element;
35
+ declare const Table: ({ className, density, inset, scroll, ...props }: TableProps) => React$1.JSX.Element;
22
36
  type TableHeaderProps = React$1.ComponentProps<"thead"> & {
23
37
  /**
24
38
  * `muted` lays the header row on a muted band, separating it from the rows
@@ -95,4 +109,4 @@ type SortableHeadProps = Omit<TableHeadProps, "onClick"> & {
95
109
  declare const SortableHead: ({ children, sortDirection, onSort, trailing, className, align, numeric, ...props }: SortableHeadProps) => React$1.JSX.Element;
96
110
  declare const TableCaption: ({ className, ...props }: React$1.ComponentProps<"caption">) => React$1.JSX.Element;
97
111
  //#endregion
98
- export { type SortDirection, SortableHead, Table, type TableAlign, TableBody, TableCaption, TableCell, type TableCellProps, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, type TableInset, type TableProps, TableRow, type TableScroll, type TableTone };
112
+ export { type SortDirection, SortableHead, Table, type TableAlign, TableBody, TableCaption, TableCell, type TableCellProps, type TableDensity, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, type TableInset, type TableProps, TableRow, type TableScroll, type TableTone };
@@ -3,9 +3,10 @@ import { cn } from "../lib/utils.js";
3
3
  import { Button } from "./button.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/table.tsx
6
- const Table = ({ className, inset = "default", scroll = "self", ...props }) => {
6
+ const Table = ({ className, density = "default", inset = "default", scroll = "self", ...props }) => {
7
7
  const table = /* @__PURE__ */ jsx("table", {
8
8
  className: cn("w-full caption-bottom text-sm in-data-[slot=frame]:border-separate in-data-[slot=frame]:border-spacing-0", className),
9
+ "data-density": density,
9
10
  "data-inset": inset,
10
11
  "data-slot": "table",
11
12
  ...props
@@ -33,7 +34,7 @@ const TableFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("tfoot", {
33
34
  ...props
34
35
  });
35
36
  const TableRow = ({ className, tone = "default", ...props }) => /* @__PURE__ */ jsx("tr", {
36
- className: cn("hover:bg-muted/72 data-[state=selected]:bg-muted/72 border-b in-data-[slot=frame]:hover:bg-transparent in-data-[slot=frame]:data-[state=selected]:bg-transparent", tone === "muted" && "text-muted-foreground", className),
37
+ className: cn("hover:bg-muted/72 data-[state=selected]:bg-muted/72 border-b in-data-[density=compact]:hover:bg-transparent in-data-[slot=frame]:hover:bg-transparent in-data-[slot=frame]:data-[state=selected]:bg-transparent", tone === "muted" && "text-muted-foreground", className),
37
38
  "data-slot": "table-row",
38
39
  ...props
39
40
  });
@@ -44,14 +45,14 @@ const TABLE_ALIGN_CLASS = {
44
45
  };
45
46
  const resolveTableAlign = (align, numeric) => align ?? (numeric ? "end" : void 0);
46
47
  const TableHead = ({ className, align, numeric = false, ...props }) => /* @__PURE__ */ jsx("th", {
47
- className: cn("text-muted-foreground h-10 px-2.5 align-middle leading-none font-medium whitespace-nowrap in-data-[inset=card]:px-4 has-[[role=checkbox]]:w-px has-[[role=checkbox]]:pe-0", TABLE_ALIGN_CLASS[resolveTableAlign(align, numeric) ?? "start"], numeric && "tabular-nums", className),
48
+ className: cn("text-muted-foreground h-10 px-2.5 align-middle leading-none font-medium whitespace-nowrap in-data-[inset=card]:px-4 has-[[role=checkbox]]:w-px has-[[role=checkbox]]:pe-0", "in-data-[density=compact]:h-auto in-data-[density=compact]:px-0 in-data-[density=compact]:py-1 in-data-[density=compact]:pe-3 in-data-[density=compact]:text-xs", "in-data-[density=compact]:[tbody_&]:py-1.5 in-data-[density=compact]:[tbody_&]:text-sm in-data-[density=compact]:[tbody_&]:leading-6 in-data-[density=compact]:[tbody_&]:font-normal in-data-[density=compact]:[tbody_&]:whitespace-normal in-data-[density=compact]:[tbody_&]:text-inherit", TABLE_ALIGN_CLASS[resolveTableAlign(align, numeric) ?? "start"], numeric && "tabular-nums", className),
48
49
  "data-slot": "table-head",
49
50
  ...props
50
51
  });
51
52
  const TableCell = ({ className, align, tone = "default", numeric = false, truncate = false, flush = false, ...props }) => {
52
53
  const resolvedAlign = resolveTableAlign(align, numeric);
53
54
  return /* @__PURE__ */ jsx("td", {
54
- className: cn("align-middle leading-none whitespace-nowrap has-[[role=checkbox]]:pe-0", flush ? "p-0" : "p-2.5 in-data-[inset=card]:px-4 in-data-[slot=frame]:first:p-[calc(--spacing(2.5)-1px)] in-data-[slot=frame]:last:p-[calc(--spacing(2.5)-1px)]", resolvedAlign !== void 0 && TABLE_ALIGN_CLASS[resolvedAlign], tone === "muted" && "text-muted-foreground", numeric && "tabular-nums", truncate && "truncate", className),
55
+ className: cn("align-middle leading-none whitespace-nowrap has-[[role=checkbox]]:pe-0", flush ? "p-0" : "p-2.5 in-data-[density=compact]:px-0 in-data-[density=compact]:py-1.5 in-data-[inset=card]:px-4 in-data-[slot=frame]:first:p-[calc(--spacing(2.5)-1px)] in-data-[slot=frame]:last:p-[calc(--spacing(2.5)-1px)]", "in-data-[density=compact]:leading-6 in-data-[density=compact]:whitespace-normal", resolvedAlign !== void 0 && TABLE_ALIGN_CLASS[resolvedAlign], tone === "muted" && "text-muted-foreground", numeric && "tabular-nums", truncate && "truncate", className),
55
56
  "data-slot": "table-cell",
56
57
  ...props
57
58
  });
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn, composeRefs } from "../lib/utils.js";
3
- import { hasTabOrderChanged } from "../lib/tab-order.js";
3
+ import { hasTabOrderChanged, revealActiveTab } from "../lib/tab-order.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
6
6
  import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
@@ -21,6 +21,17 @@ const TabsList = ({ variant = "default", className, children, ref, ...props }) =
21
21
  tabOrderRef.current = tabs;
22
22
  if (hasTabOrderChanged(previousTabs, tabs)) setRemeasureToken((token) => token + 1);
23
23
  });
24
+ useIsoLayoutEffect(() => {
25
+ const list = listRef.current;
26
+ if (list === null || typeof ResizeObserver === "undefined") return;
27
+ const observer = new ResizeObserver(() => {
28
+ revealActiveTab(list);
29
+ });
30
+ observer.observe(list);
31
+ return () => {
32
+ observer.disconnect();
33
+ };
34
+ }, []);
24
35
  return /* @__PURE__ */ jsxs(Tabs$1.List, {
25
36
  className: cn("text-muted-foreground relative z-0 flex w-fit max-w-full items-center justify-center-safe gap-x-0.5", "scrollbar-none overflow-auto data-[orientation=horizontal]:overflow-y-hidden data-[orientation=horizontal]:overscroll-x-contain data-[orientation=vertical]:overflow-x-hidden data-[orientation=vertical]:overscroll-y-contain [&::-webkit-scrollbar]:hidden", "data-[orientation=vertical]:flex-col", variant === "default" ? "bg-muted text-foreground-label rounded-lg p-0.5" : "*:data-[slot=tabs-tab]:hover:bg-accent data-[orientation=horizontal]:py-1 data-[orientation=vertical]:px-1", className),
26
37
  "data-slot": "tabs-list",
@@ -0,0 +1,32 @@
1
+ import "./button.js";
2
+ import * as React$1 from "react";
3
+ import { ButtonSize } from "./button.shared.js";
4
+ import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
5
+ import { ToggleProps } from "./toggle.js";
6
+ //#region src/components/toggle-group.d.ts
7
+ /**
8
+ * A segmented control: a row of toggles in one tray, of which one (or, with
9
+ * `multiple`, several) is on. Use it for view modes, density, and filter
10
+ * tabs over a list; `Tabs` is for switching between panels of content.
11
+ *
12
+ * The chosen item is raised out of the tray, so the choice reads at a glance
13
+ * and differs from the hover fill. Arrow keys move between items and the
14
+ * group exposes the pressed state of each.
15
+ *
16
+ * Base UI lets the pressed item be clicked off, leaving no value. A control
17
+ * that must always hold one ignores an empty change in `onValueChange`.
18
+ */
19
+ declare const ToggleGroup: <Value extends string>({ className, size, ...props }: ToggleGroupProps<Value>) => React$1.JSX.Element;
20
+ /**
21
+ * One choice in a `ToggleGroup`. It takes the group's size unless it names
22
+ * its own (an icon item names an `icon-*` size and an `aria-label`, which
23
+ * doubles as its tooltip).
24
+ */
25
+ declare const ToggleGroupItem: <Value extends string>({ className, size, variant, ...props }: ToggleProps<Value>) => React$1.JSX.Element;
26
+ type ToggleGroupProps<Value extends string> = ToggleGroup$1.Props<Value> & {
27
+ /** The size every item takes unless it names its own. */
28
+ size?: ButtonSize | undefined;
29
+ children?: React$1.ReactNode;
30
+ };
31
+ //#endregion
32
+ export { ToggleGroup, ToggleGroupItem, type ToggleGroupProps };
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Toggle } from "./toggle.js";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { createContext, useContext } from "react";
6
+ import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
7
+ //#region src/components/toggle-group.tsx
8
+ const ToggleGroupSizeContext = createContext("xs");
9
+ /**
10
+ * A segmented control: a row of toggles in one tray, of which one (or, with
11
+ * `multiple`, several) is on. Use it for view modes, density, and filter
12
+ * tabs over a list; `Tabs` is for switching between panels of content.
13
+ *
14
+ * The chosen item is raised out of the tray, so the choice reads at a glance
15
+ * and differs from the hover fill. Arrow keys move between items and the
16
+ * group exposes the pressed state of each.
17
+ *
18
+ * Base UI lets the pressed item be clicked off, leaving no value. A control
19
+ * that must always hold one ignores an empty change in `onValueChange`.
20
+ */
21
+ const ToggleGroup = ({ className, size = "xs", ...props }) => /* @__PURE__ */ jsx(ToggleGroupSizeContext, {
22
+ value: size,
23
+ children: /* @__PURE__ */ jsx(ToggleGroup$1, {
24
+ className: cn("border-border/70 bg-muted/30 inline-flex w-fit shrink-0 items-center gap-0.5 rounded-lg border p-0.5 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch", className),
25
+ "data-slot": "toggle-group",
26
+ ...props
27
+ })
28
+ });
29
+ /**
30
+ * One choice in a `ToggleGroup`. It takes the group's size unless it names
31
+ * its own (an icon item names an `icon-*` size and an `aria-label`, which
32
+ * doubles as its tooltip).
33
+ */
34
+ const ToggleGroupItem = ({ className, size, variant = "muted", ...props }) => {
35
+ const groupSize = useContext(ToggleGroupSizeContext);
36
+ return /* @__PURE__ */ jsx(Toggle, {
37
+ className: cn("data-pressed:bg-background data-pressed:text-foreground", className),
38
+ "data-slot": "toggle-group-item",
39
+ size: size ?? groupSize,
40
+ variant,
41
+ ...props
42
+ });
43
+ };
44
+ //#endregion
45
+ export { ToggleGroup, ToggleGroupItem };
@@ -0,0 +1,26 @@
1
+ import "./button.js";
2
+ import * as React$1 from "react";
3
+ import { ButtonSize } from "./button.shared.js";
4
+ import { Toggle as Toggle$1 } from "@base-ui/react/toggle";
5
+ //#region src/components/toggle.d.ts
6
+ /**
7
+ * A button that stays pressed: a formatting mark, "show resolved", a pinned
8
+ * view. It is a `Button` underneath, so it shares the button's sizes, focus
9
+ * ring, tooltip and disabled disposition, and its pressed state is the
10
+ * button's selected treatment, distinct from hover. Base UI owns
11
+ * `aria-pressed`.
12
+ *
13
+ * Several toggles that choose one value (view modes, filter tabs) are a
14
+ * `ToggleGroup`, not a row of these.
15
+ */
16
+ declare const Toggle: <Value extends string>({ size, tooltip, variant, ...props }: ToggleProps<Value>) => React$1.JSX.Element;
17
+ /** The quiet button looks a pressed state reads well on. */
18
+ type ToggleVariant = "ghost" | "muted" | "outline";
19
+ type ToggleProps<Value extends string> = Toggle$1.Props<Value> & {
20
+ size?: ButtonSize | undefined;
21
+ /** The hint, and the accessible name source for an icon size. */
22
+ tooltip?: React$1.ReactNode;
23
+ variant?: ToggleVariant | undefined;
24
+ };
25
+ //#endregion
26
+ export { Toggle, type ToggleProps, type ToggleVariant };
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { Button } from "./button.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Toggle as Toggle$1 } from "@base-ui/react/toggle";
5
+ //#region src/components/toggle.tsx
6
+ /**
7
+ * A button that stays pressed: a formatting mark, "show resolved", a pinned
8
+ * view. It is a `Button` underneath, so it shares the button's sizes, focus
9
+ * ring, tooltip and disabled disposition, and its pressed state is the
10
+ * button's selected treatment, distinct from hover. Base UI owns
11
+ * `aria-pressed`.
12
+ *
13
+ * Several toggles that choose one value (view modes, filter tabs) are a
14
+ * `ToggleGroup`, not a row of these.
15
+ */
16
+ const Toggle = ({ size = "sm", tooltip, variant = "muted", ...props }) => /* @__PURE__ */ jsx(Toggle$1, {
17
+ "data-slot": "toggle",
18
+ render: /* @__PURE__ */ jsx(Button, {
19
+ size,
20
+ tooltip,
21
+ variant
22
+ }),
23
+ ...props
24
+ });
25
+ //#endregion
26
+ export { Toggle };
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "./components/avatar.js";
9
9
  import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OverlayLayer, SHELL_CHROME_LAYER_CLASS_NAME } from "./lib/overlay-layer.js";
10
10
  import { BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Button, ButtonFocusRing, ButtonPlainShape, ButtonProps, ButtonTextRun, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
11
11
  import { Badge, BadgeProps, BadgeSize, BadgeTone, badgeVariants } from "./components/badge.js";
12
- import { BidiDirection, BidiText, BidiTextProps, UserText } from "./components/bidi-text.js";
12
+ import { BidiDirection, BidiText, BidiTextProps, UserText, stripDirectionalControls, withoutDirectionalControls } from "./components/bidi-text.js";
13
13
  import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./components/breadcrumb.js";
14
14
  import { BuildKanbanBoardMatrixParams, CreateKanbanDropIntentParams, KANBAN_BOARD_AXES, KanbanBoardAxis, KanbanBoardCell, KanbanBoardColumn, KanbanBoardCoordinate, KanbanBoardDestination, KanbanBoardLane, KanbanBoardMatrix, KanbanDropAxisChange, KanbanDropIntent, OrderKanbanCellsByColumnsParams, ResolveKanbanGroupValueParams, buildKanbanBoardMatrix, createKanbanDropIntent, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, orderKanbanCellsByColumns } from "./kanban/matrix.js";
15
15
  import { ButtonSize, ButtonVariant } from "./components/button.shared.js";
@@ -18,6 +18,7 @@ import { COPIED_RESET_MS, CopyButton, CopyFeedback, useCopiedFeedback, useCopyCo
18
18
  import { CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow } from "./calendar/primitives.js";
19
19
  import { CalendarDateRange, ResourceCalendarLaneLayout, ResourceCalendarLanePlacement, ResourceCalendarPlacement, assertConsecutiveCalendarDates, getResourceCalendarPlacement, layoutResourceCalendarEntries, nextCalendarDate } from "./calendar/resource-calendar.logic.js";
20
20
  import { Checkbox } from "./components/checkbox.js";
21
+ import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from "./components/collapsible.js";
21
22
  import { ColorPicker, ColorPickerContent, ColorPickerContentProps, ColorPickerProps, ColorPreset, DEFAULT_PRESETS } from "./components/color-picker.js";
22
23
  import { ColorVariants, OptionColor, emptyColor, optionColors, resolveOptionColor } from "./lib/option-color.js";
23
24
  import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue } from "./components/combobox.js";
@@ -34,7 +35,7 @@ import { DiscordLogoIcon, GitHubLogoIcon, XLogoIcon } from "./components/brand-i
34
35
  import { DropdownMenu as Menu, DropdownMenuCheckboxItem as MenuCheckboxItem, DropdownMenuContent as MenuPopup, DropdownMenuCreateHandle as MenuCreateHandle, DropdownMenuGroup as MenuGroup, DropdownMenuItem as MenuItem, DropdownMenuLabel as MenuGroupLabel, DropdownMenuPortal as MenuPortal, DropdownMenuRadioGroup as MenuRadioGroup, DropdownMenuRadioItem as MenuRadioItem, DropdownMenuSeparator as MenuSeparator, DropdownMenuShortcut as MenuShortcut, DropdownMenuSub as MenuSub, DropdownMenuSubContent as MenuSubPopup, DropdownMenuSubTrigger as MenuSubTrigger, DropdownMenuTrigger as MenuTrigger, MenuAnchor } from "./components/menu.js";
35
36
  import { Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity } from "./components/field.js";
36
37
  import { FileInput, FileInputProps } from "./components/file-input.js";
37
- import { Form, FormProps, formVariants } from "./components/form.js";
38
+ import { Form, FormErrors, FormProps, formVariants } from "./components/form.js";
38
39
  import { Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle } from "./components/frame.js";
39
40
  import { HexColorPicker, HexColorPickerProps } from "./components/hex-color-picker.js";
40
41
  import { HoverCard as PreviewCard, HoverCardContent as PreviewCardPopup, HoverCardTrigger as PreviewCardTrigger, PreviewCardPrimitive } from "./components/preview-card.js";
@@ -91,13 +92,15 @@ import { Select, SelectContent as SelectPopup, SelectGroup, SelectGroupLabel, Se
91
92
  import { Separator, TextSeparator } from "./components/separator.js";
92
93
  import { Sheet, SheetBackdrop, SheetClose, SheetContent as SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetSide, SheetTitle, SheetTrigger } from "./components/sheet.js";
93
94
  import { Skeleton } from "./components/skeleton.js";
94
- import { SortDirection, SortableHead, Table, TableAlign, TableBody, TableCaption, TableCell, TableCellProps, TableFooter, TableHead, TableHeadProps, TableHeader, TableHeaderProps, TableInset, TableProps, TableRow, TableScroll, TableTone } from "./components/table.js";
95
+ import { SortDirection, SortableHead, Table, TableAlign, TableBody, TableCaption, TableCell, TableCellProps, TableDensity, TableFooter, TableHead, TableHeadProps, TableHeader, TableHeaderProps, TableInset, TableProps, TableRow, TableScroll, TableTone } from "./components/table.js";
95
96
  import { StellaMark } from "./components/stella-mark.js";
96
97
  import { StellaWordmarkLatin } from "./components/stella-wordmark.js";
97
98
  import { TOOLTIP_OPEN_DELAY_MS, Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger } from "./components/tooltip.js";
98
99
  import { TableColumnCapabilities, TableColumnDescriptor, TableSchema, duplicateColumnIds, findTableColumn, hideableColumnIds, sortableColumnIds, tableColumnIds, tableColumnSizing, visibleColumnIds } from "./data-table/schema.js";
99
100
  import { Tabs, TabsContent as TabsPanel, TabsList, TabsTab } from "./components/tabs.js";
100
101
  import { Textarea, TextareaProps } from "./components/textarea.js";
102
+ import { Toggle, ToggleProps, ToggleVariant } from "./components/toggle.js";
103
+ import { ToggleGroup, ToggleGroupItem, ToggleGroupProps } from "./components/toggle-group.js";
101
104
  import { TruncatedText, TruncatedTextLines, TruncatedTextProps, isTextOverflowing } from "./components/truncated-text.js";
102
105
  import { TypedCharacterEvent, typedCharacter } from "./lib/typed-character.js";
103
106
  import { WorkspaceCompactNavigation, WorkspaceEndRail, WorkspaceEndRailChatAction, WorkspaceEndRailProps, WorkspaceNavigation, WorkspaceShell, WorkspaceShellProps, WorkspaceTopBarContext } from "./components/workspace-shell.js";
@@ -109,4 +112,4 @@ import { getInitials } from "./lib/initials.js";
109
112
  import { useIsMobile } from "./hooks/use-mobile.js";
110
113
  import { useLatest } from "./hooks/use-latest.js";
111
114
  import { useViewportWidth } from "./hooks/use-viewport-width.js";
112
- export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Badge, type BadgeProps, type BadgeSize, type BadgeTone, type BidiDirection, BidiText, type BidiTextProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, type BuildKanbanBoardMatrixParams, Button, type ButtonFocusRing, type ButtonPlainShape, type ButtonProps, type ButtonSize, ButtonTextRun, type ButtonVariant, CONTROL_SIZE, CONTROL_SIZES, COPIED_RESET_MS, CalendarCell, CalendarDateRange, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, type ColorPickerContentProps, type ColorPickerProps, type ColorPreset, ColorVariants, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, type ControlSize, CopyButton, CopyFeedback, type CreateKanbanDropIntentParams, DEFAULT_PRESETS, DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, DataTable, type DataTableAriaSort, type DataTableColumn, type DataTableProps, type DataTableRowAction, DatePickerPopover, type DatePickerPopoverProps, DestructiveActionConfirmation, DestructiveConfirmDialog, type DestructiveConfirmDialogProps, type DestructiveConfirmOutcome, DetailsGrid, DetailsItem, type DetailsOrientation, type DetailsVariant, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogFormState, DialogHeader, type DialogLabels, type DialogMobileLayout, DialogPanel, DialogPortal, DialogProvider, type DialogSize, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, FileInput, type FileInputProps, Form, type FormProps, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, type HexColorPickerProps, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, InlineRenameInput, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, type InspectorDockMount, InspectorEmptyRow, InspectorEntityTab, type InspectorEntityTabInactiveIcon, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, type KanbanCardDragPreview, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, type KanbanCardSelectionModifiers, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneColumnActionContext, type KanbanSubgroupLaneColumnSummaryContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, LEGAL_TEXT_CLASS_NAME, Label, type LabelVariant, List, ListEmpty, ListGroup, ListGroupAction, ListGroupCount, ListGroupDescription, ListGroupHeader, ListGroupHeading, ListGroupTitle, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemMedia, ListItemStatus, ListItemTitle, MenuAnchor, MenuPreviewLayout, MenuSection, OUTLINE_CONTROL_MIN_SIZE, OUTLINE_EMPHASIS, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OptionColor, type OrderKanbanCellsByColumnsParams, OutlineEmphasis, OutlineItem, OutlineRail, OutlineRailProps, OverlayLayer, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PanelTrigger, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, Prose, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, ResourceCalendar, ResourceCalendarColumn, ResourceCalendarEntry, ResourceCalendarEntryTone, ResourceCalendarLaneLayout, ResourceCalendarLanePlacement, ResourceCalendarPlacement, ResourceCalendarResource, ReviewAuthorAvatar, ReviewCommentAuthor, ReviewCommentCard, ReviewDecisionActions, ReviewDecisionSize, ReviewDecisionState, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffSegmentType, ReviewDiffText, ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone, ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusBadge, ReviewStatusDot, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, ScrollToTopProps, SearchField, type SearchFieldProps, SecretInput, type SecretInputProps, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, type SheetSide, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, type SortDirection, SortableHead, type StatusTone, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TOOLTIP_OPEN_DELAY_MS, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, type TableAlign, TableBody, TableCaption, TableCell, type TableCellProps, type TableColumnCapabilities, type TableColumnDescriptor, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, type TableInset, type TableProps, TableRow, type TableSchema, type TableScroll, type TableTone, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, type TextareaProps, type ToastPosition, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger, TruncatedText, type TruncatedTextLines, type TruncatedTextProps, TypedCharacterEvent, UNKNOWN_AUTHOR_LABEL, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, UserText, type WorkspaceCompactNavigation, WorkspaceEndRail, type WorkspaceEndRailChatAction, type WorkspaceEndRailProps, type WorkspaceNavigation, WorkspaceShell, type WorkspaceShellProps, type WorkspaceTopBarContext, XLogoIcon, assertConsecutiveCalendarDates, badgeVariants, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, formVariants, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, isTextOverflowing, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, outlineEntryText, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, resolveToastUpdateTimeout, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sidebarIdentityTriggerClassName, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, toastCountdownMs, toastDedupeId, typedCharacter, useContentDir, useCopiedFeedback, useCopyConfirmation, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useSidebarLayout, useViewportWidth, visibleColumnIds };
115
+ export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Badge, type BadgeProps, type BadgeSize, type BadgeTone, type BidiDirection, BidiText, type BidiTextProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, type BuildKanbanBoardMatrixParams, Button, type ButtonFocusRing, type ButtonPlainShape, type ButtonProps, type ButtonSize, ButtonTextRun, type ButtonVariant, CONTROL_SIZE, CONTROL_SIZES, COPIED_RESET_MS, CalendarCell, CalendarDateRange, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, Collapsible, CollapsiblePanel, CollapsibleTrigger, ColorPicker, ColorPickerContent, type ColorPickerContentProps, type ColorPickerProps, type ColorPreset, ColorVariants, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, type ControlSize, CopyButton, CopyFeedback, type CreateKanbanDropIntentParams, DEFAULT_PRESETS, DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, DataTable, type DataTableAriaSort, type DataTableColumn, type DataTableProps, type DataTableRowAction, DatePickerPopover, type DatePickerPopoverProps, DestructiveActionConfirmation, DestructiveConfirmDialog, type DestructiveConfirmDialogProps, type DestructiveConfirmOutcome, DetailsGrid, DetailsItem, type DetailsOrientation, type DetailsVariant, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogFormState, DialogHeader, type DialogLabels, type DialogMobileLayout, DialogPanel, DialogPortal, DialogProvider, type DialogSize, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, FileInput, type FileInputProps, Form, type FormErrors, type FormProps, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, type HexColorPickerProps, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, InlineRenameInput, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, type InspectorDockMount, InspectorEmptyRow, InspectorEntityTab, type InspectorEntityTabInactiveIcon, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, type KanbanBandToggleActivation, type KanbanBoardAxis, type KanbanBoardCell, type KanbanBoardColumn, type KanbanBoardCoordinate, type KanbanBoardDestination, type KanbanBoardLane, type KanbanBoardMatrix, type KanbanBuiltInGroup, type KanbanCardDragPreview, KanbanCardDragSurface, type KanbanCardDragSurfaceProps, type KanbanCardFieldSelection, type KanbanCardSelectionModifiers, KanbanCardShell, type KanbanCardShellProps, KanbanCellAction, type KanbanCellActionProps, type KanbanCellVirtualNavigation, KanbanCollapsedBandCaption, type KanbanCollapsedBandCaptionProps, type KanbanColumnBand, KanbanColumnBandHeader, type KanbanColumnBandHeaderProps, type KanbanColumnBandSpan, KanbanColumnHeader, type KanbanColumnHeaderProps, type KanbanDirection, type KanbanDragCancelEvent, type KanbanDragEndEvent, KanbanDragHandle, type KanbanDragHandleProps, type KanbanDragOverEvent, type KanbanDragStartEvent, type KanbanDropAxisChange, type KanbanDropIntent, type KanbanGroup, type KanbanGroupOption, type KanbanGrouping, type KanbanHorizontalEdge, type KanbanSchema, type KanbanSortableActivationMode, type KanbanSortableBindings, KanbanSortableBoard, type KanbanSortableBoardProps, type KanbanSortableCellPosition, type KanbanSubgroupBandHeaderContext, KanbanSubgroupBoard, type KanbanSubgroupBoardProps, type KanbanSubgroupCellContext, type KanbanSubgroupCollapsedBandCellContext, type KanbanSubgroupColumnHeaderContext, type KanbanSubgroupLaneColumnActionContext, type KanbanSubgroupLaneColumnSummaryContext, type KanbanSubgroupLaneIdentityContext, KanbanVirtualCell, type KanbanVirtualCellPagination, type KanbanVirtualCellProps, type KanbanVirtualCellSortableContext, type KanbanVirtualScrollRequest, LEGAL_TEXT_CLASS_NAME, Label, type LabelVariant, List, ListEmpty, ListGroup, ListGroupAction, ListGroupCount, ListGroupDescription, ListGroupHeader, ListGroupHeading, ListGroupTitle, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemMedia, ListItemStatus, ListItemTitle, MenuAnchor, MenuPreviewLayout, MenuSection, OUTLINE_CONTROL_MIN_SIZE, OUTLINE_EMPHASIS, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OptionColor, type OrderKanbanCellsByColumnsParams, OutlineEmphasis, OutlineItem, OutlineRail, OutlineRailProps, OverlayLayer, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PanelTrigger, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, Prose, type RegisterKanbanBoardAutoScrollOptions, type RegisterKanbanCardDragOptions, type ResolveKanbanGroupValueParams, type ResolveKanbanGroupingParams, ResourceCalendar, ResourceCalendarColumn, ResourceCalendarEntry, ResourceCalendarEntryTone, ResourceCalendarLaneLayout, ResourceCalendarLanePlacement, ResourceCalendarPlacement, ResourceCalendarResource, ReviewAuthorAvatar, ReviewCommentAuthor, ReviewCommentCard, ReviewDecisionActions, ReviewDecisionSize, ReviewDecisionState, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffSegment, ReviewDiffSegmentType, ReviewDiffText, ReviewOutOfDateNotice, ReviewOutOfDateReason, ReviewOutOfDateTone, ReviewSeverityDot, ReviewSeverityLevel, ReviewStatusBadge, ReviewStatusDot, ReviewStatusSize, ReviewStatusTone, ReviewStatusVariant, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, ScrollToTopProps, SearchField, type SearchFieldProps, SecretInput, type SecretInputProps, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, type SheetSide, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, type SortDirection, SortableHead, type StatusTone, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TOOLTIP_OPEN_DELAY_MS, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, type TableAlign, TableBody, TableCaption, TableCell, type TableCellProps, type TableColumnCapabilities, type TableColumnDescriptor, type TableDensity, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, type TableInset, type TableProps, TableRow, type TableSchema, type TableScroll, type TableTone, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, type TextareaProps, type ToastPosition, ToastProvider, Toggle, ToggleGroup, ToggleGroupItem, type ToggleGroupProps, type ToggleProps, type ToggleVariant, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger, TruncatedText, type TruncatedTextLines, type TruncatedTextProps, TypedCharacterEvent, UNKNOWN_AUTHOR_LABEL, type UseKanbanDropTargetOptions, type UseKanbanSortableOptions, UserText, type WorkspaceCompactNavigation, WorkspaceEndRail, type WorkspaceEndRailChatAction, type WorkspaceEndRailProps, type WorkspaceNavigation, WorkspaceShell, type WorkspaceShellProps, type WorkspaceTopBarContext, XLogoIcon, assertConsecutiveCalendarDates, badgeVariants, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, formVariants, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, isTextOverflowing, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, outlineEntryText, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, resolveToastUpdateTimeout, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sidebarIdentityTriggerClassName, sortableColumnIds, stellaToast, stripDirectionalControls, tableColumnIds, tableColumnSizing, toastCountdownMs, toastDedupeId, typedCharacter, useContentDir, useCopiedFeedback, useCopyConfirmation, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useSidebarLayout, useViewportWidth, visibleColumnIds, withoutDirectionalControls };
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ import { BOARD_DRAG_OVERLAY_Z_INDEX, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CL
6
6
  import { TOOLTIP_OPEN_DELAY_MS, Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger } from "./components/tooltip.js";
7
7
  import { AlertDialog, AlertDialogBackdrop, AlertDialogClose, AlertDialogContent as AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport } from "./components/alert-dialog.js";
8
8
  import { useIsMobile } from "./hooks/use-mobile.js";
9
+ import { BidiText, UserText, stripDirectionalControls, withoutDirectionalControls } from "./components/bidi-text.js";
9
10
  import { Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorEmptyRow, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle } from "./inspector/chrome.js";
10
11
  import { StellaMark } from "./components/stella-mark.js";
11
12
  import { BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Button, ButtonTextRun, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
@@ -14,11 +15,11 @@ import { Sheet, SheetBackdrop, SheetClose, SheetContent as SheetPopup, SheetDesc
14
15
  import { WorkspaceEndRail, WorkspaceShell } from "./components/workspace-shell.js";
15
16
  import { Avatar, AvatarFallback, AvatarImage } from "./components/avatar.js";
16
17
  import { Badge, badgeVariants } from "./components/badge.js";
17
- import { BidiText, UserText } from "./components/bidi-text.js";
18
18
  import { DiscordLogoIcon, GitHubLogoIcon, XLogoIcon } from "./components/brand-icons.js";
19
19
  import { DirectionalIcon } from "./components/directional-icon.js";
20
20
  import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./components/breadcrumb.js";
21
21
  import { Checkbox } from "./components/checkbox.js";
22
+ import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from "./components/collapsible.js";
22
23
  import { ColorPicker, ColorPickerContent, DEFAULT_PRESETS } from "./components/color-picker.js";
23
24
  import { containedEventHandler, containedHandler } from "./hooks/use-contained-handler.js";
24
25
  import { CONTROL_SIZE, CONTROL_SIZES } from "./lib/control-size.js";
@@ -61,6 +62,8 @@ import { MenuPreviewLayout, PreviewPane } from "./components/preview-pane.js";
61
62
  import { LEGAL_TEXT_CLASS_NAME, Prose } from "./components/prose.js";
62
63
  import { ScrollToTop } from "./components/scroll-to-top.js";
63
64
  import { SecretInput } from "./components/secret-input.js";
65
+ import { Toggle } from "./components/toggle.js";
66
+ import { ToggleGroup, ToggleGroupItem } from "./components/toggle-group.js";
64
67
  import { SegmentedIconToggle } from "./components/segmented-icon-toggle.js";
65
68
  import { Separator, TextSeparator } from "./components/separator.js";
66
69
  import { Skeleton } from "./components/skeleton.js";
@@ -105,4 +108,4 @@ import { ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, TRACKED_DELETI
105
108
  import { ReviewOutOfDateNotice } from "./review/review-out-of-date-notice.js";
106
109
  import { ReviewSeverityDot, ReviewStatusDot, reviewSeverityTone } from "./review/review-severity-dot.js";
107
110
  import { ReviewStatusBadge } from "./review/review-status-badge.js";
108
- export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Badge, BidiText, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonTextRun, CONTROL_SIZE, CONTROL_SIZES, COPIED_RESET_MS, CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, ColorPicker, ColorPickerContent, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, CopyButton, CopyFeedback, DEFAULT_PRESETS, DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, DataTable, DatePickerPopover, DestructiveActionConfirmation, DestructiveConfirmDialog, DetailsGrid, DetailsItem, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogFormState, DialogHeader, DialogPanel, DialogPortal, DialogProvider, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, FileInput, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, InlineRenameInput, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSubgroupBoard, KanbanVirtualCell, LEGAL_TEXT_CLASS_NAME, Label, List, ListEmpty, ListGroup, ListGroupAction, ListGroupCount, ListGroupDescription, ListGroupHeader, ListGroupHeading, ListGroupTitle, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemMedia, ListItemStatus, ListItemTitle, MenuAnchor, MenuPreviewLayout, MenuSection, OUTLINE_CONTROL_MIN_SIZE, OUTLINE_EMPHASIS, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OutlineRail, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PanelTrigger, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, Prose, ResourceCalendar, ReviewAuthorAvatar, ReviewCommentCard, ReviewDecisionActions, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, ReviewOutOfDateNotice, ReviewSeverityDot, ReviewStatusBadge, ReviewStatusDot, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, SearchField, SecretInput, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TOOLTIP_OPEN_DELAY_MS, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, ToastProvider, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger, TruncatedText, UNKNOWN_AUTHOR_LABEL, UserText, WorkspaceEndRail, WorkspaceShell, XLogoIcon, assertConsecutiveCalendarDates, badgeVariants, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, formVariants, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, isTextOverflowing, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, outlineEntryText, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, resolveToastUpdateTimeout, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sidebarIdentityTriggerClassName, sortableColumnIds, stellaToast, tableColumnIds, tableColumnSizing, toastCountdownMs, toastDedupeId, typedCharacter, useContentDir, useCopiedFeedback, useCopyConfirmation, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useSidebarLayout, useViewportWidth, visibleColumnIds };
111
+ export { APPLICATION_RAIL_BUTTON_SIZE, APPLICATION_RAIL_ICON_SIZE, APPLICATION_RAIL_WIDTH, Accordion, AccordionPanel as AccordionContent, AccordionPanel, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogBackdrop, AlertDialogBackdrop as AlertDialogOverlay, AlertDialogClose, AlertDialogPopup as AlertDialogContent, AlertDialogPopup, AlertDialogCreateHandle, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogPanel, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertDialogViewport, AnchoredToastProvider, ApplicationRail, ApplicationRailButton, ApplicationRailContent, ApplicationRailFooter, ApplicationRailHeader, ApplicationRailMenu, ApplicationRailSeparator, Avatar, AvatarFallback, AvatarImage, BOARD_DRAG_OVERLAY_Z_INDEX, BUTTON_CONTENT, BUTTON_SIZE_CONTENT, Badge, BidiText, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonTextRun, CONTROL_SIZE, CONTROL_SIZES, COPIED_RESET_MS, CalendarCell, CalendarEntryButton, CalendarEntrySurface, CalendarGrid, CalendarHeaderCell, CalendarHeaderRow, Checkbox, Collapsible, CollapsiblePanel, CollapsibleTrigger, ColorPicker, ColorPickerContent, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxClear, ComboboxCollection, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxList, ComboboxPopup, ComboboxRow, ComboboxSeparator, ComboboxStatus, ComboboxTrigger, ComboboxValue, Command, CommandCollection, CommandDialog, CommandDialogPopup, CommandDialogTrigger, CommandEmpty, CommandFooter, CommandGroup, CommandGroupLabel, CommandInput, CommandItem, CommandList, CommandPanel, CommandSeparator, CommandShortcut, CopyButton, CopyFeedback, DEFAULT_PRESETS, DIALOG_MOBILE_LAYOUT, DIALOG_SIZE_CLASS_NAMES, DataTable, DatePickerPopover, DestructiveActionConfirmation, DestructiveConfirmDialog, DetailsGrid, DetailsItem, Dialog, DialogBackdrop, DialogBackdrop as DialogOverlay, DialogClose, DialogPopup as DialogContent, DialogPopup, DialogCreateHandle, DialogDescription, DialogFooter, DialogFormState, DialogHeader, DialogPanel, DialogPortal, DialogProvider, DialogTitle, DialogTrigger, DialogViewport, DirectionalIcon, DiscordLogoIcon, Menu as DropdownMenu, Menu, MenuCheckboxItem as DropdownMenuCheckboxItem, MenuCheckboxItem, MenuPopup as DropdownMenuContent, MenuPopup, MenuCreateHandle as DropdownMenuCreateHandle, MenuCreateHandle, MenuGroup as DropdownMenuGroup, MenuGroup, MenuItem as DropdownMenuItem, MenuItem, MenuGroupLabel as DropdownMenuLabel, MenuGroupLabel, MenuPortal as DropdownMenuPortal, MenuPortal, MenuRadioGroup as DropdownMenuRadioGroup, MenuRadioGroup, MenuRadioItem as DropdownMenuRadioItem, MenuRadioItem, MenuSeparator as DropdownMenuSeparator, MenuSeparator, MenuShortcut as DropdownMenuShortcut, MenuShortcut, MenuSub as DropdownMenuSub, MenuSub, MenuSubPopup as DropdownMenuSubContent, MenuSubPopup, MenuSubTrigger as DropdownMenuSubTrigger, MenuSubTrigger, MenuTrigger as DropdownMenuTrigger, MenuTrigger, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, FileInput, Form, Frame, FrameDescription, FrameFooter, FrameHeader, FramePanel, FrameTitle, GitHubLogoIcon, HexColorPicker, PreviewCard as HoverCard, PreviewCard, PreviewCardPopup as HoverCardContent, PreviewCardPopup, PreviewCardTrigger as HoverCardTrigger, PreviewCardTrigger, INSPECTOR_CONTENT_MIN_WIDTH, INSPECTOR_EDITOR_MIN_WIDTH, INSPECTOR_PANE_DEFAULT_WIDTH, INSPECTOR_PANE_KEYBOARD_PAGE_STEP, INSPECTOR_PANE_KEYBOARD_STEP, INSPECTOR_PANE_MAX_WIDTH, INSPECTOR_PANE_MIN_WIDTH, INSPECTOR_RAIL_WIDTH, InlineRenameInput, Input, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Inspector, InspectorActions, InspectorContent, InspectorDescription, InspectorDock, InspectorEmptyRow, InspectorEntityTab, InspectorFacetBar, InspectorHeader, InspectorHeaderText, InspectorProperty, InspectorPropertyLabel, InspectorPropertyList, InspectorPropertyValue, InspectorRail, InspectorRailCell, InspectorRailContent, InspectorRailFooter, InspectorRailIconButton, InspectorRailTab, InspectorSection, InspectorSectionTitle, InspectorTitle, KANBAN_BAND_CAPTION_ROW_HEIGHT, KANBAN_BAND_CAPTION_ROW_HEIGHT_PX, KANBAN_BAND_PEEK_DELAY_MS, KANBAN_BAND_PEEK_LINGER_MS, KANBAN_BOARD_AUTO_SCROLL_OPTIONS, KANBAN_BOARD_AUTO_SCROLL_SOURCES, KANBAN_BOARD_AXES, KANBAN_BOARD_COLLISION_DETECTION, KANBAN_CARD_DRAG_MIME, KANBAN_CARD_STICKY_TOP_VAR, KANBAN_CHROME_ROW_HEIGHT, KANBAN_CHROME_ROW_HEIGHT_PX, KANBAN_COLLAPSED_BAND_WIDTH_CLASS, KANBAN_COLLAPSED_BAND_WIDTH_PX, KANBAN_COLUMN_GAP_PX, KANBAN_COLUMN_WIDTH_CLASS, KANBAN_COLUMN_WIDTH_PX, KANBAN_DIRECTIONS, KANBAN_DRAG_OVERLAY_Z_INDEX, KANBAN_HORIZONTAL_EDGES, KANBAN_MOUSE_ACTIVATION_DISTANCE, KANBAN_SORTABLE_ACTIVATION_MODES, KANBAN_STICKY_TOP_VAR, KANBAN_TOUCH_ACTIVATION_CONSTRAINT, KANBAN_VIRTUAL_CELL_PAGINATION, KanbanCardDragSurface, KanbanCardShell, KanbanCellAction, KanbanCollapsedBandCaption, KanbanColumnBandHeader, KanbanColumnHeader, KanbanDragHandle, KanbanSortableBoard, KanbanSubgroupBoard, KanbanVirtualCell, LEGAL_TEXT_CLASS_NAME, Label, List, ListEmpty, ListGroup, ListGroupAction, ListGroupCount, ListGroupDescription, ListGroupHeader, ListGroupHeading, ListGroupTitle, ListItem, ListItemActions, ListItemContent, ListItemDescription, ListItemMedia, ListItemStatus, ListItemTitle, MenuAnchor, MenuPreviewLayout, MenuSection, OUTLINE_CONTROL_MIN_SIZE, OUTLINE_EMPHASIS, OVERLAY_COLLISION_PADDING, OVERLAY_LAYER_CLASS_NAMES, OutlineRail, PROPERTY_ROW_GRID, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PanelTrigger, Popover, PopoverClose, PopoverPopup as PopoverContent, PopoverPopup, PopoverCreateHandle, PopoverDescription, PopoverPanel, PopoverTitle, PopoverTrigger, PreviewCardPrimitive, PreviewPane, Prose, ResourceCalendar, ReviewAuthorAvatar, ReviewCommentCard, ReviewDecisionActions, ReviewDiffDeletion, ReviewDiffInsertion, ReviewDiffText, ReviewOutOfDateNotice, ReviewSeverityDot, ReviewStatusBadge, ReviewStatusDot, SHELL_CHROME_LAYER_CLASS_NAME, SIDEBAR_WIDTH_ICON_PX, SIDEBAR_WIDTH_PX, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, SIDE_RAIL_TAB_ICON_SIZE, SIDE_RAIL_WIDTH, ScrollArea, ScrollBar, ScrollToTop, SearchField, SecretInput, SegmentedIconToggle, Select, SelectPopup as SelectContent, SelectPopup, SelectGroup, SelectGroupLabel, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetBackdrop, SheetBackdrop as SheetOverlay, SheetClose, SheetPopup as SheetContent, SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, SortableHead, StellaMark, StellaWordmarkLatin, TOAST_RIGHT_OFFSET_VAR, TOOLBAR_ROW_HEIGHT, TOOLBAR_ROW_HEIGHT_PX, TOOLTIP_OPEN_DELAY_MS, TRACKED_DELETION_STYLE, TRACKED_INSERTION_STYLE, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsPanel, TabsList, TabsTab, TabsTab as TabsTrigger, TextSeparator, Textarea, ToastProvider, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipPopup as TooltipContent, TooltipPopup, TooltipCreateHandle, TooltipFactTrigger, TooltipProvider, TooltipTrigger, TruncatedText, UNKNOWN_AUTHOR_LABEL, UserText, WorkspaceEndRail, WorkspaceShell, XLogoIcon, assertConsecutiveCalendarDates, badgeVariants, buildKanbanBoardMatrix, buttonAccessibleDisabledClass, buttonVariants, cn, composeRefs, containedEventHandler, containedHandler, contentDir, createKanbanDropIntent, duplicateColumnIds, emptyColor, entityTabGlyph, findTableColumn, formVariants, getFirstWeekday, getInitials, getKanbanBoardColumnIdentity, getKanbanBoardLaneIdentity, getKanbanGroupingPropertyId, getKanbanGroups, getKanbanHorizontalEdge, getLocaleWeekInfo, getResourceCalendarPlacement, getWeekendDays, hasKanbanColumnBands, hideableColumnIds, isKanbanGroupingRenderable, isStructuredInputType, isTextOverflowing, kanbanKeyboardCoordinates, layoutResourceCalendarEntries, nextCalendarDate, optionColors, orderKanbanCellsByColumns, outlineEntryText, registerKanbanBoardAutoScroll, registerKanbanCardDrag, resolveDragWidth, resolveInspectorDockWidth, resolveInspectorPaneMaxWidth, resolveInspectorPaneWidth, resolveKanbanColumnBands, resolveKanbanGroupOptions, resolveKanbanGrouping, resolveKeyboardWidth, resolveOptionColor, resolveToastUpdateTimeout, reviewDiffSegmentKeys, reviewSeverityTone, selectKanbanCardFieldIds, selectKanbanRows, shouldForceSidebarCollapsed, sidebarIdentityTriggerClassName, sortableColumnIds, stellaToast, stripDirectionalControls, tableColumnIds, tableColumnSizing, toastCountdownMs, toastDedupeId, typedCharacter, useContentDir, useCopiedFeedback, useCopyConfirmation, useDestructiveActionConfirmation, useInspectorPaneWidth, useIsMobile, useKanbanDropTarget, useKanbanSortable, useKanbanSortableSensors, useLatest, useSidebar, useSidebarInlineSize, useSidebarLayout, useViewportWidth, visibleColumnIds, withoutDirectionalControls };
@@ -1,5 +1,6 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { PROPERTY_ROW_GRID, SIDE_RAIL_CONTAINER_CLASS, SIDE_RAIL_ICON_BUTTON_SIZE, TOOLBAR_ROW_HEIGHT } from "./layout-tokens.js";
3
+ import { withoutDirectionalControls } from "../components/bidi-text.js";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region src/inspector/chrome.tsx
5
6
  /**
@@ -91,7 +92,7 @@ const InspectorTitle = ({ children, className, ...props }) => /* @__PURE__ */ js
91
92
  "data-slot": "inspector-title",
92
93
  dir: "auto",
93
94
  ...props,
94
- children
95
+ children: withoutDirectionalControls(children)
95
96
  });
96
97
  const InspectorDescription = ({ className, ...props }) => /* @__PURE__ */ jsx("p", {
97
98
  className: cn("text-muted-foreground text-2xs truncate [unicode-bidi:isolate]", className),
@@ -83,14 +83,18 @@ const InspectorFacetBar = ({ facet, facets, labels, disabledFacets, pulseSeq, ac
83
83
  "data-slot": "inspector-facet-bar",
84
84
  ref: containerRef,
85
85
  children: [
86
- visibleFacets.map((value) => /* @__PURE__ */ jsx(FacetChip, {
87
- activeBadge,
88
- disabled: disabledFacets?.has(value) ?? false,
89
- isActive: value === facet,
90
- label: labels[value],
91
- onSelect: () => onChange(value),
92
- value
93
- }, value)),
86
+ /* @__PURE__ */ jsx("div", {
87
+ className: "contents",
88
+ role: "tablist",
89
+ children: visibleFacets.map((value) => /* @__PURE__ */ jsx(FacetChip, {
90
+ activeBadge,
91
+ disabled: disabledFacets?.has(value) ?? false,
92
+ isActive: value === facet,
93
+ label: labels[value],
94
+ onSelect: () => onChange(value),
95
+ value
96
+ }, value))
97
+ }),
94
98
  overflowing && /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, {
95
99
  "aria-label": overflowMenuLabel,
96
100
  className: "ms-auto",
@@ -161,11 +165,13 @@ const CHIP_CLASS = "shrink-0 rounded-md px-1.5 py-1 text-xs font-medium whitespa
161
165
  const INACTIVE_CHIP_CLASS = "text-muted-foreground hover:bg-muted hover:text-foreground";
162
166
  const FacetChip = ({ label, value, isActive, disabled, activeBadge, onSelect }) => /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
163
167
  render: /* @__PURE__ */ jsx("button", {
168
+ "aria-selected": isActive,
164
169
  className: cn(CHIP_CLASS, isActive ? "bg-foreground text-background" : INACTIVE_CHIP_CLASS, disabled && "cursor-not-allowed opacity-40 hover:bg-transparent"),
165
170
  "data-facet-chip-active": isActive ? "" : void 0,
166
171
  "data-facet-value": value,
167
172
  disabled,
168
173
  onClick: onSelect,
174
+ role: "tab",
169
175
  type: "button"
170
176
  }),
171
177
  children: label
@@ -37,7 +37,7 @@ const resolveKanbanColumnBands = (columns) => {
37
37
  last.columns.push(column);
38
38
  continue;
39
39
  }
40
- if (last?.band !== null && last?.band !== void 0) closedBandIds.add(last.band.id);
40
+ if (last !== void 0 && last.band !== null) closedBandIds.add(last.band.id);
41
41
  if (band !== null && closedBandIds.has(band.id)) return panic(`Kanban column band "${band.id}" is not contiguous: it resumes at column ${getKanbanBoardColumnIdentity(column)}`);
42
42
  spans.push({
43
43
  band,
@@ -6,9 +6,9 @@ const toInlineDropPosition = (edge, direction) => {
6
6
  /** The new order, or null when the drop leaves the order unchanged. */
7
7
  const reorderInlineIds = ({ ids, draggedId, targetId, position }) => {
8
8
  if (draggedId === targetId || !ids.includes(draggedId) || !ids.includes(targetId)) return null;
9
- const withoutDragged = ids.filter((id) => id !== draggedId);
10
- const targetIndex = withoutDragged.indexOf(targetId);
11
- const reordered = withoutDragged.toSpliced(position === "after" ? targetIndex + 1 : targetIndex, 0, draggedId);
9
+ const reordered = ids.filter((id) => id !== draggedId);
10
+ const targetIndex = reordered.indexOf(targetId);
11
+ reordered.splice(position === "after" ? targetIndex + 1 : targetIndex, 0, draggedId);
12
12
  return reordered.every((id, index) => id === ids[index]) ? null : reordered;
13
13
  };
14
14
  //#endregion
@@ -10,5 +10,23 @@
10
10
  * the whole of the workaround, so compare identity rather than count, because
11
11
  * React moves the same nodes when it reorders keyed children.
12
12
  */
13
+ type TabEdges = {
14
+ left: number;
15
+ right: number;
16
+ };
17
+ type TabStrip = {
18
+ scrollLeft: number;
19
+ getBoundingClientRect: () => TabEdges;
20
+ querySelector: (selector: string) => {
21
+ getBoundingClientRect: () => TabEdges;
22
+ } | null;
23
+ };
24
+ /**
25
+ * Brings the active tab back inside a horizontal strip that scrolled it out of
26
+ * view. Moves the strip only, never an ancestor, and works from rendered edges
27
+ * so a right-to-left strip needs no separate case.
28
+ */
29
+ export declare const revealActiveTab: (list: TabStrip) => void;
13
30
  export declare const hasTabOrderChanged: <T>(previous: readonly T[], next: readonly T[]) => boolean;
14
- //#endregion
31
+ //#endregion
32
+ export {};
@@ -1,15 +1,17 @@
1
1
  //#region src/lib/tab-order.ts
2
2
  /**
3
- * Whether a committed tab list holds different elements, or the same elements
4
- * in a different order, than the previous commit.
5
- *
6
- * Base UI measures the tabs indicator during render, so it reads the DOM as it
7
- * stood before the commit. Its correction is a `ResizeObserver`, which catches
8
- * an insertion or a removal (the list's own width changes) but not a reorder:
9
- * there the tabs swap places without anything changing size. Detecting that is
10
- * the whole of the workaround, so compare identity rather than count, because
11
- * React moves the same nodes when it reorders keyed children.
3
+ * Brings the active tab back inside a horizontal strip that scrolled it out of
4
+ * view. Moves the strip only, never an ancestor, and works from rendered edges
5
+ * so a right-to-left strip needs no separate case.
12
6
  */
7
+ const revealActiveTab = (list) => {
8
+ const active = list.querySelector("[role=\"tab\"][aria-selected=\"true\"]");
9
+ if (active === null) return;
10
+ const strip = list.getBoundingClientRect();
11
+ const tab = active.getBoundingClientRect();
12
+ if (tab.left < strip.left) list.scrollLeft -= strip.left - tab.left;
13
+ else if (tab.right > strip.right) list.scrollLeft += tab.right - strip.right;
14
+ };
13
15
  const hasTabOrderChanged = (previous, next) => previous.length !== next.length || next.some((tab, index) => tab !== previous[index]);
14
16
  //#endregion
15
- export { hasTabOrderChanged };
17
+ export { hasTabOrderChanged, revealActiveTab };
@@ -1,7 +1,7 @@
1
1
  import { CheckIcon, RotateCcwIcon, Trash2Icon } from "../icons.js";
2
2
  import { cn } from "../lib/utils.js";
3
- import { Button } from "../components/button.js";
4
3
  import { BidiText } from "../components/bidi-text.js";
4
+ import { Button } from "../components/button.js";
5
5
  import { ReviewAuthorAvatar } from "./review-author-avatar.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Temporal } from "temporal-polyfill/full";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/ui",
3
- "version": "0.60.0",
3
+ "version": "0.62.0",
4
4
  "description": "Stella's design system: bidi-aware React primitives built on Base UI, the dockable inspector pane, and the Tailwind v4 theme they are styled with.",
5
5
  "keywords": [
6
6
  "base-ui",
@@ -50,6 +50,10 @@
50
50
  "types": "./dist/components/accordion.d.ts",
51
51
  "import": "./dist/components/accordion.js"
52
52
  },
53
+ "./collapsible": {
54
+ "types": "./dist/components/collapsible.d.ts",
55
+ "import": "./dist/components/collapsible.js"
56
+ },
53
57
  "./application-rail": {
54
58
  "types": "./dist/components/application-rail.d.ts",
55
59
  "import": "./dist/components/application-rail.js"
@@ -502,6 +506,14 @@
502
506
  "types": "./dist/components/toast.d.ts",
503
507
  "import": "./dist/components/toast.js"
504
508
  },
509
+ "./toggle": {
510
+ "types": "./dist/components/toggle.d.ts",
511
+ "import": "./dist/components/toggle.js"
512
+ },
513
+ "./toggle-group": {
514
+ "types": "./dist/components/toggle-group.d.ts",
515
+ "import": "./dist/components/toggle-group.js"
516
+ },
505
517
  "./tooltip": {
506
518
  "types": "./dist/components/tooltip.d.ts",
507
519
  "import": "./dist/components/tooltip.js"