@stll/ui 0.28.2 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,22 @@
1
1
  import { OverlayLayer } from "../lib/overlay-layer.js";
2
- import { buttonVariants } from "./button-variants.js";
3
2
  import * as React$1 from "react";
4
3
  import { useRender } from "@base-ui/react/use-render";
5
4
  import { VariantProps } from "class-variance-authority";
6
5
  //#region src/components/button.d.ts
6
+ /**
7
+ * Disabled styling for a button that is only `aria-disabled`.
8
+ *
9
+ * The `disabled:` utilities below are CSS `:disabled`, which cannot match an
10
+ * element that carries no native `disabled` attribute, and `pointer-events-none`
11
+ * is deliberately not repeated: that rule is the reason a disabled button's
12
+ * tooltip can never open. Matches the treatment `disabled:opacity-64` gives, and
13
+ * swaps the cursor so the control still reads as unavailable on hover.
14
+ */
15
+ declare const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
16
+ declare const buttonVariants: (props?: ({
17
+ size?: "default" | "chip" | "icon" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "lg" | "sm" | "xl" | "xs" | null | undefined;
18
+ variant?: "link" | "default" | "destructive" | "destructive-outline" | "destructive-ghost" | "ghost" | "muted" | "outline" | "secondary" | null | undefined;
19
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
20
  type ButtonProps = {
8
21
  variant?: VariantProps<typeof buttonVariants>["variant"];
9
22
  size?: VariantProps<typeof buttonVariants>["size"];
@@ -17,4 +30,4 @@ type ButtonProps = {
17
30
  } & useRender.ComponentProps<"button">;
18
31
  declare function Button({ className, variant, size, render, loading, children, disabled, tooltip, tooltipLayer, ...props }: ButtonProps): React$1.JSX.Element;
19
32
  //#endregion
20
- export { Button };
33
+ export { Button, buttonAccessibleDisabledClass, buttonVariants };
@@ -2,12 +2,54 @@
2
2
  import { cn } from "../lib/utils.js";
3
3
  import { renderTooltipTrigger } from "./tooltip-trigger-helper.js";
4
4
  import { BUTTON_DISPOSITION, blockDisabledActivation, blockDisabledKeyActivation, resolveButtonDisposition } from "../lib/button-disposition.js";
5
- import { buttonVariants } from "./button-variants.js";
6
5
  import { LoaderIcon } from "lucide-react";
7
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
7
  import { mergeProps } from "@base-ui/react/merge-props";
9
8
  import { useRender } from "@base-ui/react/use-render";
9
+ import { cva } from "class-variance-authority";
10
10
  //#region src/components/button.tsx
11
+ /**
12
+ * Disabled styling for a button that is only `aria-disabled`.
13
+ *
14
+ * The `disabled:` utilities below are CSS `:disabled`, which cannot match an
15
+ * element that carries no native `disabled` attribute, and `pointer-events-none`
16
+ * is deliberately not repeated: that rule is the reason a disabled button's
17
+ * tooltip can never open. Matches the treatment `disabled:opacity-64` gives, and
18
+ * swaps the cursor so the control still reads as unavailable on hover.
19
+ */
20
+ const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
21
+ 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 transition-shadow outline-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", {
22
+ defaultVariants: {
23
+ size: "default",
24
+ variant: "default"
25
+ },
26
+ variants: {
27
+ size: {
28
+ chip: "h-7 gap-1.5 rounded-full px-2.5 text-xs before:rounded-full sm:text-xs",
29
+ default: "h-9 px-[calc(--spacing(3)-1px)] sm:h-8",
30
+ icon: "size-9 sm:size-8",
31
+ "icon-lg": "size-10 sm:size-9",
32
+ "icon-sm": "size-8 sm:size-7",
33
+ "icon-xl": "size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
34
+ "icon-xs": "size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5",
35
+ lg: "h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9",
36
+ sm: "h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] text-sm sm:h-7 sm:text-xs",
37
+ xl: "h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
38
+ xs: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5"
39
+ },
40
+ variant: {
41
+ default: "border-primary bg-primary text-primary-foreground shadow-primary/24 [:hover,[data-pressed]]:bg-primary/90 shadow-xs not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none",
42
+ destructive: "border-destructive/32 bg-destructive/10 text-destructive-foreground shadow-destructive/8 [:hover,[data-pressed]]:border-destructive/40 [:hover,[data-pressed]]:bg-destructive/14 [:active,[data-pressed]]:bg-destructive/18 shadow-xs not-dark:bg-clip-padding not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] [:disabled,:active,[data-pressed]]:shadow-none",
43
+ "destructive-outline": "border-input bg-popover text-destructive-foreground dark:bg-input/32 [:hover,[data-pressed]]:border-destructive/32 [:hover,[data-pressed]]:bg-destructive/4 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",
44
+ "destructive-ghost": "text-destructive data-pressed:bg-destructive/10 [:hover,[data-pressed]]:bg-destructive/10 border-transparent",
45
+ ghost: "text-foreground data-pressed:bg-accent [:hover,[data-pressed]]:bg-accent border-transparent",
46
+ link: "border-transparent underline-offset-4 [:hover,[data-pressed]]:underline",
47
+ muted: "text-muted-foreground data-pressed:bg-accent data-pressed:text-foreground [:hover,[data-pressed]]:bg-accent [:hover,[data-pressed]]:text-foreground border-transparent",
48
+ outline: "border-input bg-popover text-foreground dark:bg-input/32 [:hover,[data-pressed]]:bg-accent/50 dark:[:hover,[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",
49
+ secondary: "bg-secondary text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80 [:hover,[data-pressed]]:bg-secondary/90 border-transparent"
50
+ }
51
+ }
52
+ });
11
53
  function Button({ className, variant, size, render, loading, children, disabled, tooltip, tooltipLayer, ...props }) {
12
54
  const typeValue = render ? void 0 : "button";
13
55
  const tooltipContent = tooltip ?? props["aria-label"] ?? props.title;
@@ -53,4 +95,4 @@ function Button({ className, variant, size, render, loading, children, disabled,
53
95
  });
54
96
  }
55
97
  //#endregion
56
- export { Button };
98
+ export { Button, buttonAccessibleDisabledClass, buttonVariants };
@@ -147,12 +147,12 @@ const CustomColorControls = ({ handleInputChange, handlePickerChange, inputHex,
147
147
  className: "flex items-center gap-1.5",
148
148
  children: [
149
149
  /* @__PURE__ */ jsx("span", {
150
- className: "text-muted-foreground text-[11px]",
150
+ className: "text-muted-foreground text-2xs",
151
151
  children: "#"
152
152
  }),
153
153
  /* @__PURE__ */ jsx("input", {
154
154
  "aria-label": "Custom hex color",
155
- className: "border-input bg-background text-foreground h-6 flex-1 rounded border px-1.5 font-mono text-[11px] outline-none",
155
+ className: "border-input bg-background text-foreground text-2xs h-6 flex-1 rounded border px-1.5 font-mono outline-none",
156
156
  dir: "ltr",
157
157
  maxLength: 6,
158
158
  onChange: (event) => handleInputChange(event.target.value),
@@ -248,7 +248,7 @@ const ColorPickerContent = ({ value, onSelect, onClear, presets, columns, defaul
248
248
  onClear && /* @__PURE__ */ jsxs(Popover.Close, {
249
249
  render: /* @__PURE__ */ jsx("button", {
250
250
  "aria-label": "No color",
251
- className: "text-muted-foreground hover:bg-accent hover:text-accent-foreground flex h-6 w-full items-center gap-1.5 rounded px-1 text-[11px] transition-colors",
251
+ className: "text-muted-foreground hover:bg-accent hover:text-accent-foreground text-2xs flex h-6 w-full items-center gap-1.5 rounded px-1 transition-colors",
252
252
  onClick: onClear,
253
253
  type: "button"
254
254
  }),
@@ -271,7 +271,7 @@ const ColorPickerContent = ({ value, onSelect, onClear, presets, columns, defaul
271
271
  }, preset.value))
272
272
  }),
273
273
  !expanded ? /* @__PURE__ */ jsxs("button", {
274
- className: "text-muted-foreground hover:text-foreground flex items-center justify-center gap-1 py-0.5 text-[11px] transition-colors",
274
+ className: "text-muted-foreground hover:text-foreground text-2xs flex items-center justify-center gap-1 py-0.5 transition-colors",
275
275
  onClick: () => setExpanded(true),
276
276
  type: "button",
277
277
  children: [moreLabel, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-3" })]
@@ -69,7 +69,7 @@ export declare const COMPOSER_SEND_BUTTON_CLASS = "bg-foreground text-background
69
69
  * law home's scope and jurisdiction): quiet text with a hover surface, so
70
70
  * the row stays subordinate to the box above it.
71
71
  */
72
- export declare const COMPOSER_PICKER_TRIGGER_CLASS = "text-muted-foreground hover:text-foreground hover:bg-accent inline-flex min-w-0 shrink items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] transition-colors";
72
+ export declare const COMPOSER_PICKER_TRIGGER_CLASS = "text-muted-foreground hover:text-foreground hover:bg-accent inline-flex min-w-0 shrink items-center gap-1 rounded-md px-1.5 py-0.5 text-2xs transition-colors";
73
73
  type ComposerStatusRowProps = {
74
74
  /** Left cluster: matter picker, web-search / anonymize toggles, ... */
75
75
  start?: ReactNode | undefined;
@@ -73,7 +73,7 @@ const COMPOSER_SEND_BUTTON_CLASS = "bg-foreground text-background hover:bg-foreg
73
73
  * law home's scope and jurisdiction): quiet text with a hover surface, so
74
74
  * the row stays subordinate to the box above it.
75
75
  */
76
- const COMPOSER_PICKER_TRIGGER_CLASS = "text-muted-foreground hover:text-foreground hover:bg-accent inline-flex min-w-0 shrink items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] transition-colors";
76
+ const COMPOSER_PICKER_TRIGGER_CLASS = "text-muted-foreground hover:text-foreground hover:bg-accent inline-flex min-w-0 shrink items-center gap-1 rounded-md px-1.5 py-0.5 text-2xs transition-colors";
77
77
  /**
78
78
  * The slim status row rendered beneath a composer box: a `text-xs` row with
79
79
  * a start cluster and an end slot pinned to the far edge. Shared by every
@@ -355,8 +355,8 @@ const DatePickerPopoverContent = ({ id, labelledBy, value: rawValue, onChange, l
355
355
  })
356
356
  ]
357
357
  }), /* @__PURE__ */ jsx(PopoverPopup, {
358
- className: "*:data-[slot=popover-viewport]:p-2!",
359
358
  layer,
359
+ padding: "sm",
360
360
  side: "bottom",
361
361
  sideOffset: 4,
362
362
  children: /* @__PURE__ */ jsxs("div", {
@@ -403,7 +403,7 @@ const DatePickerPopoverContent = ({ id, labelledBy, value: rawValue, onChange, l
403
403
  role: "row",
404
404
  "aria-hidden": "true",
405
405
  children: weekdays.map((weekday) => /* @__PURE__ */ jsx("span", {
406
- className: cn("py-1 text-center text-[10px]", weekday.isWeekend ? "text-muted-foreground" : "text-foreground-label"),
406
+ className: cn("text-3xs py-1 text-center", weekday.isWeekend ? "text-muted-foreground" : "text-foreground-label"),
407
407
  children: weekday.label
408
408
  }, weekday.label))
409
409
  }), /* @__PURE__ */ jsx("div", {
@@ -510,7 +510,7 @@ const MonthGrid = ({ locale, viewYear, currentMonth, currentYear, onSelect, toda
510
510
  type: "button",
511
511
  children: [!/^\d/u.test(labels[month] ?? "") && /* @__PURE__ */ jsx("span", {
512
512
  "aria-hidden": "true",
513
- className: cn("me-1 text-[10px] tabular-nums opacity-50", !isSelected && "text-muted-foreground"),
513
+ className: cn("text-3xs me-1 tabular-nums opacity-50", !isSelected && "text-muted-foreground"),
514
514
  children: month + 1
515
515
  }), labels[month]]
516
516
  }, month);
@@ -5,7 +5,7 @@ import { VariantProps } from "class-variance-authority";
5
5
  //#region src/components/input-group.d.ts
6
6
  declare const InputGroup: ({ className, ...props }: React$1.ComponentProps<"div">) => React$1.JSX.Element;
7
7
  declare const inputGroupAddonVariants: (props?: ({
8
- align?: "inline-start" | "block-end" | "block-start" | "inline-end" | null | undefined;
8
+ align?: "inline-end" | "inline-start" | "block-start" | "block-end" | null | undefined;
9
9
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
10
  declare const InputGroupAddon: ({ className, align, ...props }: React$1.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>) => React$1.JSX.Element;
11
11
  declare const InputGroupText: ({ className, ...props }: React$1.ComponentProps<"span">) => React$1.JSX.Element;
@@ -38,7 +38,7 @@ const LoaderState = ({ label, detail, hint, className }) => /* @__PURE__ */ jsxs
38
38
  children: detail
39
39
  }),
40
40
  hint !== void 0 && /* @__PURE__ */ jsx("p", {
41
- className: "text-muted-foreground text-[11px] text-pretty",
41
+ className: "text-muted-foreground text-2xs text-pretty",
42
42
  children: hint
43
43
  })
44
44
  ]
@@ -315,7 +315,7 @@ const OutlineRail = ({ items, scrollContainerRef, resolvePct, onJump, activeId,
315
315
  })] })
316
316
  }), /* @__PURE__ */ jsx(TooltipPopup, { children: outlineEntryText(node.item) })] }),
317
317
  node.item.meta !== void 0 && /* @__PURE__ */ jsx("span", {
318
- className: "text-foreground-placeholder shrink-0 ps-2 text-[11px] tabular-nums",
318
+ className: "text-foreground-placeholder text-2xs shrink-0 ps-2 tabular-nums",
319
319
  children: node.item.meta
320
320
  })
321
321
  ]
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
- import { buttonVariants } from "./button-variants.js";
3
+ import { buttonVariants } from "./button.js";
4
4
  import { DirectionalIcon } from "./directional-icon.js";
5
5
  import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -8,7 +8,20 @@ declare const Popover: typeof Popover$1.Root;
8
8
  declare function PopoverTrigger({ tooltip, ...props }: Popover$1.Trigger.Props & {
9
9
  tooltip?: React$1.ReactNode;
10
10
  }): React$1.JSX.Element;
11
- declare const PopoverPopup: ({ children, className, side, align, sideOffset, alignOffset, tooltipStyle, anchor, layer, ...props }: Popover$1.Popup.Props & {
11
+ /**
12
+ * Viewport padding. The inline value also feeds the page-width calculation of
13
+ * the viewport, so both axes change together.
14
+ */
15
+ declare const POPOVER_PADDING: {
16
+ readonly none: "py-0 [--viewport-inline-padding:0px]";
17
+ readonly xs: "py-1 [--viewport-inline-padding:--spacing(1)]";
18
+ readonly sm: "py-2 [--viewport-inline-padding:--spacing(2)]";
19
+ readonly md: "py-3 [--viewport-inline-padding:--spacing(3)]";
20
+ readonly default: "py-4 [--viewport-inline-padding:--spacing(4)]";
21
+ };
22
+ type PopoverPadding = keyof typeof POPOVER_PADDING;
23
+ declare const PopoverPopup: ({ children, className, side, align, sideOffset, alignOffset, tooltipStyle, padding, anchor, layer, ...props }: Popover$1.Popup.Props & {
24
+ padding?: PopoverPadding;
12
25
  side?: Popover$1.Positioner.Props["side"];
13
26
  align?: Popover$1.Positioner.Props["align"];
14
27
  sideOffset?: Popover$1.Positioner.Props["sideOffset"];
@@ -17,7 +17,18 @@ function PopoverTrigger({ tooltip, ...props }) {
17
17
  })
18
18
  });
19
19
  }
20
- const PopoverPopup = ({ children, className, side = "bottom", align = "center", sideOffset = 4, alignOffset = 0, tooltipStyle = false, anchor, layer = "default", ...props }) => /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, {
20
+ /**
21
+ * Viewport padding. The inline value also feeds the page-width calculation of
22
+ * the viewport, so both axes change together.
23
+ */
24
+ const POPOVER_PADDING = {
25
+ none: "py-0 [--viewport-inline-padding:0px]",
26
+ xs: "py-1 [--viewport-inline-padding:--spacing(1)]",
27
+ sm: "py-2 [--viewport-inline-padding:--spacing(2)]",
28
+ md: "py-3 [--viewport-inline-padding:--spacing(3)]",
29
+ default: "py-4 [--viewport-inline-padding:--spacing(4)]"
30
+ };
31
+ const PopoverPopup = ({ children, className, side = "bottom", align = "center", sideOffset = 4, alignOffset = 0, tooltipStyle = false, padding = "default", anchor, layer = "default", ...props }) => /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, {
21
32
  align,
22
33
  alignOffset,
23
34
  anchor,
@@ -31,7 +42,7 @@ const PopoverPopup = ({ children, className, side = "bottom", align = "center",
31
42
  "data-slot": "popover-popup",
32
43
  ...props,
33
44
  children: /* @__PURE__ */ jsx(Popover$1.Viewport, {
34
- className: cn("relative size-full max-h-(--available-height) overflow-clip px-(--viewport-inline-padding) py-4 outline-none [--viewport-inline-padding:--spacing(4)] **:data-current:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-current:opacity-100 **:data-current:transition-opacity **:data-current:data-ending-style:opacity-0 data-instant:transition-none **:data-previous:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:opacity-100 **:data-previous:transition-opacity **:data-previous:data-ending-style:opacity-0 **:data-current:data-starting-style:opacity-0 **:data-previous:data-starting-style:opacity-0", tooltipStyle ? "py-1 [--viewport-inline-padding:--spacing(2)]" : "not-data-transitioning:overflow-y-auto"),
45
+ className: cn("relative size-full max-h-(--available-height) overflow-clip px-(--viewport-inline-padding) outline-none **:data-current:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-current:opacity-100 **:data-current:transition-opacity **:data-current:data-ending-style:opacity-0 data-instant:transition-none **:data-previous:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:opacity-100 **:data-previous:transition-opacity **:data-previous:data-ending-style:opacity-0 **:data-current:data-starting-style:opacity-0 **:data-previous:data-starting-style:opacity-0", tooltipStyle ? "py-1 [--viewport-inline-padding:--spacing(2)]" : [POPOVER_PADDING[padding], "not-data-transitioning:overflow-y-auto"]),
35
46
  "data-slot": "popover-viewport",
36
47
  children
37
48
  })
@@ -40,7 +40,7 @@ const SelectTrigger = ({ className, size = CONTROL_SIZE.default, children, ...pr
40
40
  })]
41
41
  });
42
42
  const SELECT_TRIGGER_SIZE_CLASS_NAMES = {
43
- [CONTROL_SIZE.sm]: "min-h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:min-h-7",
43
+ [CONTROL_SIZE.sm]: "min-h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] text-sm sm:min-h-7 sm:text-xs",
44
44
  [CONTROL_SIZE.default]: void 0,
45
45
  [CONTROL_SIZE.lg]: "min-h-10 sm:min-h-9"
46
46
  };
@@ -30,7 +30,7 @@ declare function useSidebar(): SidebarContextProps;
30
30
  * left for the content column. Mobile reports 0: there the sidebar is an
31
31
  * overlay sheet and occupies no layout width.
32
32
  */
33
- declare function useSidebarInlineSize(): 0 | 48 | 256;
33
+ declare function useSidebarInlineSize(): 0 | 256 | 48;
34
34
  declare const SidebarProvider: ({ defaultOpen, forceCollapsed, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<"div"> & {
35
35
  defaultOpen?: boolean;
36
36
  forceCollapsed?: boolean;
@@ -83,7 +83,7 @@ declare const SidebarMenu: ({ className, ...props }: React.ComponentProps<"ul">)
83
83
  declare const SidebarMenuItem: ({ className, ...props }: React.ComponentProps<"li">) => import("react").JSX.Element;
84
84
  declare const sidebarMenuButtonVariants: (props?: ({
85
85
  variant?: "default" | "outline" | null | undefined;
86
- size?: "sm" | "default" | "lg" | "rail" | null | undefined;
86
+ size?: "default" | "lg" | "sm" | "rail" | null | undefined;
87
87
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
88
88
  declare const SidebarMenuButton: ({ asChild, isActive, variant, size, tooltip, className, ...props }: React.ComponentProps<"button"> & {
89
89
  asChild?: boolean;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/utils.js";
3
- import { buttonVariants } from "./button-variants.js";
3
+ import { buttonVariants } from "./button.js";
4
4
  import { CircleAlertIcon, CircleCheckIcon, InfoIcon, LoaderCircleIcon, TriangleAlertIcon, XIcon } from "lucide-react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as React$1 from "react";
package/dist/index.d.ts CHANGED
@@ -10,8 +10,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "./components/avatar.js";
10
10
  import { BidiDirection, BidiText, BidiTextProps, UserText } from "./components/bidi-text.js";
11
11
  import { DiscordLogoIcon, GitHubLogoIcon } from "./components/brand-icons.js";
12
12
  import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./components/breadcrumb.js";
13
- import { buttonAccessibleDisabledClass, buttonVariants } from "./components/button-variants.js";
14
- import { Button } from "./components/button.js";
13
+ import { Button, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
15
14
  import { Checkbox } from "./components/checkbox.js";
16
15
  import { ColorPicker, ColorPickerContent, ColorPickerContentProps, ColorPickerProps, ColorPreset, DEFAULT_PRESETS } from "./components/color-picker.js";
17
16
  import { CONTROL_SIZE, CONTROL_SIZES, ControlSize } from "./lib/control-size.js";
package/dist/index.js CHANGED
@@ -7,8 +7,7 @@ import { Tooltip, TooltipContent as TooltipPopup, TooltipCreateHandle, TooltipPr
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
9
  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
- import { buttonAccessibleDisabledClass, buttonVariants } from "./components/button-variants.js";
11
- import { Button } from "./components/button.js";
10
+ import { Button, buttonAccessibleDisabledClass, buttonVariants } from "./components/button.js";
12
11
  import { ScrollArea, ScrollBar } from "./components/scroll-area.js";
13
12
  import { Sheet, SheetBackdrop, SheetClose, SheetContent as SheetPopup, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetPortal, SheetTitle, SheetTrigger } from "./components/sheet.js";
14
13
  import { WorkspaceEndRail, WorkspaceShell } from "./components/workspace-shell.js";
@@ -94,7 +94,7 @@ const InspectorTitle = ({ children, className, ...props }) => /* @__PURE__ */ js
94
94
  children
95
95
  });
96
96
  const InspectorDescription = ({ className, ...props }) => /* @__PURE__ */ jsx("p", {
97
- className: cn("text-muted-foreground truncate text-[11px] [unicode-bidi:isolate]", className),
97
+ className: cn("text-muted-foreground text-2xs truncate [unicode-bidi:isolate]", className),
98
98
  "data-slot": "inspector-description",
99
99
  dir: "auto",
100
100
  ...props
@@ -5,6 +5,6 @@ declare const CONTROL_SIZE: Readonly<{
5
5
  readonly lg: "lg";
6
6
  }>;
7
7
  type ControlSize = (typeof CONTROL_SIZE)[keyof typeof CONTROL_SIZE];
8
- declare const CONTROL_SIZES: readonly ("sm" | "default" | "lg")[];
8
+ declare const CONTROL_SIZES: readonly ("default" | "lg" | "sm")[];
9
9
  //#endregion
10
10
  export { CONTROL_SIZE, CONTROL_SIZES, type ControlSize };
@@ -22,7 +22,7 @@ const ReviewCommentCard = ({ author, timestamp, formattedTime, body, anchorText,
22
22
  className: "min-w-0 flex-1",
23
23
  children: [
24
24
  /* @__PURE__ */ jsxs("p", {
25
- className: "text-muted-foreground flex min-w-0 items-baseline gap-1.5 text-[11px]",
25
+ className: "text-muted-foreground text-2xs flex min-w-0 items-baseline gap-1.5",
26
26
  children: [/* @__PURE__ */ jsx(BidiText, {
27
27
  as: "span",
28
28
  className: "text-foreground-strong-muted truncate font-medium",
@@ -40,11 +40,11 @@ const ReviewCommentCard = ({ author, timestamp, formattedTime, body, anchorText,
40
40
  }),
41
41
  anchorText === void 0 || anchorText === "" ? null : /* @__PURE__ */ jsx(BidiText, {
42
42
  as: "p",
43
- className: "text-muted-foreground mt-0.5 truncate text-[11px] italic",
43
+ className: "text-muted-foreground text-2xs mt-0.5 truncate italic",
44
44
  children: anchorText
45
45
  }),
46
46
  isStale && staleLabel !== void 0 ? /* @__PURE__ */ jsx("p", {
47
- className: "text-muted-foreground mt-0.5 text-[11px]",
47
+ className: "text-muted-foreground text-2xs mt-0.5",
48
48
  children: staleLabel
49
49
  }) : null
50
50
  ]
@@ -54,11 +54,10 @@ const renderControls = ({ acceptLabel, acceptTooltip, disabled, onAccept, onReje
54
54
  case "dismissed":
55
55
  if (onRevert === void 0 && onReopen === void 0) return null;
56
56
  return /* @__PURE__ */ jsxs(Fragment, { children: [onRevert === void 0 ? null : /* @__PURE__ */ jsx(Button, {
57
- className: "text-muted-foreground hover:text-foreground",
58
57
  disabled,
59
58
  onClick: onRevert,
60
59
  size,
61
- variant: "ghost",
60
+ variant: "muted",
62
61
  children: revertLabel
63
62
  }), onReopen === void 0 ? null : /* @__PURE__ */ jsx(Button, {
64
63
  "aria-label": reopenLabel,
@@ -10,7 +10,7 @@ const ReviewStatusBadge = ({ tone, variant = "outline", size = "xs", icon, class
10
10
  });
11
11
  const REVIEW_STATUS_BADGE_BASE_CLASS = "inline-flex shrink-0 items-center rounded-full border font-medium whitespace-nowrap";
12
12
  const SIZE_CLASS = {
13
- xs: "gap-1 px-1.5 py-0.5 text-[11px]",
13
+ xs: "gap-1 px-1.5 py-0.5 text-2xs",
14
14
  sm: "gap-1.5 px-2 py-0.5 text-xs"
15
15
  };
16
16
  const TONE_CLASS = {
@@ -20,6 +20,16 @@
20
20
  --font-sans:
21
21
  "DM Sans", "Noto Sans Arabic", ui-sans-serif, system-ui, sans-serif,
22
22
  "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
23
+ /* Below Tailwind's `text-xs`: badges, counts, and captions. */
24
+ --text-2xs: 0.6875rem;
25
+ --text-2xs--line-height: 1rem;
26
+ --text-3xs: 0.625rem;
27
+ --text-3xs--line-height: 0.875rem;
28
+ /* Floating surfaces (cards, previews, docked bars) share one elevation. */
29
+ --shadow-floating: 0 1px 2px rgb(0 0 0 / 0.04), 0 8px 24px rgb(0 0 0 / 0.06);
30
+ --shadow-floating-ring:
31
+ 0 0 0 1px rgb(0 0 0 / 0.02), 0 1px 2px rgb(0 0 0 / 0.03),
32
+ 0 8px 20px rgb(0 0 0 / 0.05);
23
33
  --color-background: var(--background);
24
34
  --color-foreground: var(--foreground);
25
35
  --color-sidebar-ring: var(--sidebar-ring);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/ui",
3
- "version": "0.28.2",
3
+ "version": "0.29.1",
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",
@@ -73,10 +73,6 @@
73
73
  "types": "./dist/components/button.d.ts",
74
74
  "import": "./dist/components/button.js"
75
75
  },
76
- "./button-variants": {
77
- "types": "./dist/components/button-variants.d.ts",
78
- "import": "./dist/components/button-variants.js"
79
- },
80
76
  "./checkbox": {
81
77
  "types": "./dist/components/checkbox.d.ts",
82
78
  "import": "./dist/components/checkbox.js"
@@ -390,10 +386,6 @@
390
386
  "types": "./dist/components/button.d.ts",
391
387
  "import": "./dist/components/button.js"
392
388
  },
393
- "./components/button-variants": {
394
- "types": "./dist/components/button-variants.d.ts",
395
- "import": "./dist/components/button-variants.js"
396
- },
397
389
  "./components/checkbox": {
398
390
  "types": "./dist/components/checkbox.d.ts",
399
391
  "import": "./dist/components/checkbox.js"
@@ -618,7 +610,7 @@
618
610
  "@playwright/test": "^1.63.0",
619
611
  "@stll/typescript-config": "0.0.0",
620
612
  "@tailwindcss/vite": "4.3.3",
621
- "@tanstack/react-virtual": "^3.14.11",
613
+ "@tanstack/react-virtual": "^3.14.12",
622
614
  "@types/react": "^19.2.17",
623
615
  "@types/react-dom": "^19.2.7",
624
616
  "bun-types": "1.4.2",
@@ -634,7 +626,7 @@
634
626
  "@base-ui/react": "^1.7.0",
635
627
  "@dnd-kit/core": "^6.3.1",
636
628
  "@dnd-kit/sortable": "^10.0.0",
637
- "@tanstack/react-virtual": "^3.14.11",
629
+ "@tanstack/react-virtual": "^3.14.12",
638
630
  "react": ">=19",
639
631
  "react-dom": ">=19",
640
632
  "tailwindcss": "^4.3.0"
@@ -1,16 +0,0 @@
1
- //#region src/components/button-variants.d.ts
2
- /**
3
- * Disabled styling for a button that is only `aria-disabled`.
4
- *
5
- * The `disabled:` utilities below are CSS `:disabled`, which cannot match an
6
- * element that carries no native `disabled` attribute, and `pointer-events-none`
7
- * is deliberately not repeated: that rule is the reason a disabled button's
8
- * tooltip can never open. Matches the treatment `disabled:opacity-64` gives, and
9
- * swaps the cursor so the control still reads as unavailable on hover.
10
- */
11
- export declare const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
12
- export declare const buttonVariants: (props?: ({
13
- size?: "sm" | "default" | "lg" | "icon" | "chip" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "xl" | "xs" | null | undefined;
14
- variant?: "link" | "default" | "outline" | "destructive" | "destructive-outline" | "ghost" | "secondary" | null | undefined;
15
- } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
- //#endregion
@@ -1,44 +0,0 @@
1
- import { cva } from "class-variance-authority";
2
- //#region src/components/button-variants.tsx
3
- /**
4
- * Disabled styling for a button that is only `aria-disabled`.
5
- *
6
- * The `disabled:` utilities below are CSS `:disabled`, which cannot match an
7
- * element that carries no native `disabled` attribute, and `pointer-events-none`
8
- * is deliberately not repeated: that rule is the reason a disabled button's
9
- * tooltip can never open. Matches the treatment `disabled:opacity-64` gives, and
10
- * swaps the cursor so the control still reads as unavailable on hover.
11
- */
12
- const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
13
- 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 transition-shadow outline-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", {
14
- defaultVariants: {
15
- size: "default",
16
- variant: "default"
17
- },
18
- variants: {
19
- size: {
20
- chip: "h-7 gap-1.5 rounded-full px-2.5 text-xs before:rounded-full sm:text-xs",
21
- default: "h-9 px-[calc(--spacing(3)-1px)] sm:h-8",
22
- icon: "size-9 sm:size-8",
23
- "icon-lg": "size-10 sm:size-9",
24
- "icon-sm": "size-8 sm:size-7",
25
- "icon-xl": "size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
26
- "icon-xs": "size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5",
27
- lg: "h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9",
28
- sm: "h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7",
29
- xl: "h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5",
30
- xs: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5"
31
- },
32
- variant: {
33
- default: "border-primary bg-primary text-primary-foreground shadow-primary/24 [:hover,[data-pressed]]:bg-primary/90 shadow-xs not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none",
34
- destructive: "border-destructive/32 bg-destructive/10 text-destructive-foreground shadow-destructive/8 [:hover,[data-pressed]]:border-destructive/40 [:hover,[data-pressed]]:bg-destructive/14 [:active,[data-pressed]]:bg-destructive/18 shadow-xs not-dark:bg-clip-padding not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] [:disabled,:active,[data-pressed]]:shadow-none",
35
- "destructive-outline": "border-input bg-popover text-destructive-foreground dark:bg-input/32 [:hover,[data-pressed]]:border-destructive/32 [:hover,[data-pressed]]:bg-destructive/4 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",
36
- ghost: "text-foreground data-pressed:bg-accent [:hover,[data-pressed]]:bg-accent border-transparent",
37
- link: "border-transparent underline-offset-4 [:hover,[data-pressed]]:underline",
38
- outline: "border-input bg-popover text-foreground dark:bg-input/32 [:hover,[data-pressed]]:bg-accent/50 dark:[:hover,[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",
39
- secondary: "bg-secondary text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80 [:hover,[data-pressed]]:bg-secondary/90 border-transparent"
40
- }
41
- }
42
- });
43
- //#endregion
44
- export { buttonAccessibleDisabledClass, buttonVariants };