@stll/ui 0.34.5 → 0.36.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.
Files changed (37) hide show
  1. package/dist/components/application-rail.js +1 -1
  2. package/dist/components/breadcrumb.js +1 -1
  3. package/dist/components/button.d.ts +1 -1
  4. package/dist/components/button.js +2 -2
  5. package/dist/components/checkbox.js +1 -1
  6. package/dist/components/color-picker.js +3 -3
  7. package/dist/components/combobox.js +1 -1
  8. package/dist/components/composer.d.ts +2 -2
  9. package/dist/components/composer.js +2 -2
  10. package/dist/components/date-picker-popover.js +5 -5
  11. package/dist/components/input-control.d.ts +1 -1
  12. package/dist/components/input-control.js +1 -1
  13. package/dist/components/input-group.d.ts +1 -1
  14. package/dist/components/input-group.js +1 -1
  15. package/dist/components/input-otp.js +1 -1
  16. package/dist/components/input.js +1 -1
  17. package/dist/components/landing.d.ts +2 -2
  18. package/dist/components/landing.js +3 -3
  19. package/dist/components/menu.js +2 -2
  20. package/dist/components/scroll-area.js +1 -1
  21. package/dist/components/select.js +1 -1
  22. package/dist/components/sidebar.d.ts +2 -2
  23. package/dist/components/table.js +1 -1
  24. package/dist/components/textarea.js +1 -1
  25. package/dist/components/toast.js +2 -2
  26. package/dist/inspector/chrome.js +2 -2
  27. package/dist/inspector/dock.js +1 -1
  28. package/dist/inspector/facet-bar.js +1 -1
  29. package/dist/kanban/card-shell.js +1 -1
  30. package/dist/kanban/column-band-header.js +1 -1
  31. package/dist/kanban/subgroup-board.js +1 -1
  32. package/dist/kanban/virtual-cell.js +1 -1
  33. package/dist/lib/control-size.d.ts +1 -1
  34. package/dist/review/text-mark.d.ts +75 -0
  35. package/dist/review/text-mark.js +120 -0
  36. package/dist/styles/theme.css +56 -0
  37. package/package.json +6 -2
@@ -32,7 +32,7 @@ const ApplicationRailMenu = ({ className, ...props }) => /* @__PURE__ */ jsx("di
32
32
  ...props
33
33
  });
34
34
  const ApplicationRailButton = ({ className, ...props }) => /* @__PURE__ */ jsx("button", {
35
- className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground flex shrink-0 items-center justify-center rounded-md outline-hidden transition-colors focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", APPLICATION_RAIL_BUTTON_SIZE, className),
35
+ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground flex shrink-0 items-center justify-center rounded-md outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", APPLICATION_RAIL_BUTTON_SIZE, className),
36
36
  "data-slot": "application-rail-button",
37
37
  type: "button",
38
38
  ...props
@@ -23,7 +23,7 @@ const BreadcrumbItem = ({ className, ...props }) => /* @__PURE__ */ jsx("li", {
23
23
  });
24
24
  function BreadcrumbLink({ className, render, ...props }) {
25
25
  const defaultProps = {
26
- className: cn("hover:text-foreground transition-colors", className),
26
+ className: cn("hover:text-foreground", className),
27
27
  "data-slot": "breadcrumb-link"
28
28
  };
29
29
  return useRender({
@@ -13,7 +13,7 @@ import { VariantProps } from "class-variance-authority";
13
13
  */
14
14
  declare const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
15
15
  declare const buttonVariants: (props?: ({
16
- size?: "default" | "sm" | "lg" | "row" | "chip" | "icon" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "xl" | "xs" | null | undefined;
16
+ size?: "default" | "chip" | "icon" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "lg" | "row" | "sm" | "xl" | "xs" | null | undefined;
17
17
  variant?: "link" | "default" | "destructive" | "destructive-outline" | "destructive-ghost" | "ghost" | "muted" | "outline" | "secondary" | null | undefined;
18
18
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
19
19
  type ButtonProps = {
@@ -19,7 +19,7 @@ import { cva } from "class-variance-authority";
19
19
  * swaps the cursor so the control still reads as unavailable on hover.
20
20
  */
21
21
  const buttonAccessibleDisabledClass = "cursor-not-allowed opacity-64";
22
- 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
+ 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 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", {
23
23
  defaultVariants: {
24
24
  size: "default",
25
25
  variant: "default"
@@ -63,7 +63,7 @@ function Button({ className, variant, size, render, loading, children, disabled,
63
63
  const isAccessibleDisabled = disposition === BUTTON_DISPOSITION.accessibleDisabled;
64
64
  const defaultProps = {
65
65
  children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(LoaderIcon, {
66
- className: "animate-spin",
66
+ className: "animate-spin [transition:opacity_150ms_ease-out,scale_320ms_var(--ease-spring)] motion-reduce:transition-none starting:scale-50 starting:opacity-0",
67
67
  "data-slot": "button-loader"
68
68
  }), children] }) : children,
69
69
  className: cn(buttonVariants({
@@ -4,7 +4,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
5
5
  //#region src/components/checkbox.tsx
6
6
  const Checkbox = ({ className, ...props }) => /* @__PURE__ */ jsx(Checkbox$1.Root, {
7
- className: cn("border-input bg-background ring-ring focus-visible:ring-offset-background aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/48 dark:not-data-checked:bg-input/32 dark:aria-invalid:ring-destructive/24 relative inline-flex size-4.5 shrink-0 items-center justify-center rounded-[4px] border shadow-xs/5 transition-shadow outline-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[3px] not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64 sm:size-4 dark:not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [[data-disabled],[data-checked],[aria-invalid]]:shadow-none", className),
7
+ className: cn("border-input bg-background ring-ring focus-visible:ring-offset-background aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/48 dark:not-data-checked:bg-input/32 dark:aria-invalid:ring-destructive/24 relative inline-flex size-4.5 shrink-0 items-center justify-center rounded-[4px] border shadow-xs/5 outline-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[3px] not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64 sm:size-4 dark:not-data-disabled:not-data-checked:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [[data-disabled],[data-checked],[aria-invalid]]:shadow-none", className),
8
8
  "data-slot": "checkbox",
9
9
  ...props,
10
10
  children: /* @__PURE__ */ jsx(Checkbox$1.Indicator, {
@@ -125,7 +125,7 @@ const ColorSwatch = ({ cssColor, selected, label, isLight, onClick, presentation
125
125
  const swatch = /* @__PURE__ */ jsx("button", {
126
126
  "aria-label": label,
127
127
  "aria-pressed": selected,
128
- className: cn(presentation === "inline" ? "ring-offset-popover relative grid size-11 shrink-0 place-items-center rounded-full border ring-offset-2 transition-transform outline-none hover:scale-105 focus-visible:ring-2" : "hover:border-foreground relative flex size-6 items-center justify-center rounded-md border transition-[transform,border-color] hover:scale-115 sm:size-5", selectionClassName, isLight && !selected && "border-border"),
128
+ className: cn(presentation === "inline" ? "ring-offset-popover relative grid size-11 shrink-0 place-items-center rounded-full border ring-offset-2 transition-transform outline-none hover:scale-105 focus-visible:ring-2" : "hover:border-foreground relative flex size-6 items-center justify-center rounded-md border transition-transform hover:scale-115 sm:size-5", selectionClassName, isLight && !selected && "border-border"),
129
129
  onClick,
130
130
  style: { backgroundColor: cssColor },
131
131
  type: "button",
@@ -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 text-2xs flex h-6 w-full items-center gap-1.5 rounded px-1 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",
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 text-2xs flex items-center justify-center gap-1 py-0.5 transition-colors",
274
+ className: "text-muted-foreground hover:text-foreground text-2xs flex items-center justify-center gap-1 py-0.5",
275
275
  onClick: () => setExpanded(true),
276
276
  type: "button",
277
277
  children: [moreLabel, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-3" })]
@@ -198,7 +198,7 @@ const ComboboxCollection = (props) => /* @__PURE__ */ jsx(Combobox$1.Collection,
198
198
  const ComboboxChips = ({ className, children, startAddon, ...props }) => {
199
199
  const { chipsRef } = React$1.use(ComboboxContext);
200
200
  return /* @__PURE__ */ jsxs(Combobox$1.Chips, {
201
- className: cn("border-input bg-background ring-ring/24 focus-within:border-ring has-autofill:bg-foreground/4 has-aria-invalid:border-destructive/36 focus-within:has-aria-invalid:border-destructive/64 focus-within:has-aria-invalid:ring-destructive/16 dark:not-has-disabled:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex min-h-9 w-full flex-wrap gap-1 rounded-lg border p-[calc(--spacing(1)-1px)] text-base shadow-xs/5 transition-shadow outline-none *:min-h-7 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-within:ring-[3px] has-disabled:pointer-events-none has-disabled:opacity-64 has-data-[size=lg]:min-h-10 has-data-[size=lg]:*:min-h-8 has-data-[size=sm]:min-h-8 has-data-[size=sm]:*:min-h-6 has-[:disabled,:focus-within,[aria-invalid]]:shadow-none sm:min-h-8 sm:text-sm sm:*:min-h-6 sm:has-data-[size=lg]:min-h-9 sm:has-data-[size=lg]:*:min-h-7 sm:has-data-[size=sm]:min-h-7 sm:has-data-[size=sm]:*:min-h-5 dark:not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]", className),
201
+ className: cn("border-input bg-background ring-ring/24 focus-within:border-ring has-autofill:bg-foreground/4 has-aria-invalid:border-destructive/36 focus-within:has-aria-invalid:border-destructive/64 focus-within:has-aria-invalid:ring-destructive/16 dark:not-has-disabled:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex min-h-9 w-full flex-wrap gap-1 rounded-lg border p-[calc(--spacing(1)-1px)] text-base shadow-xs/5 outline-none *:min-h-7 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-within:ring-[3px] has-disabled:pointer-events-none has-disabled:opacity-64 has-data-[size=lg]:min-h-10 has-data-[size=lg]:*:min-h-8 has-data-[size=sm]:min-h-8 has-data-[size=sm]:*:min-h-6 has-[:disabled,:focus-within,[aria-invalid]]:shadow-none sm:min-h-8 sm:text-sm sm:*:min-h-6 sm:has-data-[size=lg]:min-h-9 sm:has-data-[size=lg]:*:min-h-7 sm:has-data-[size=sm]:min-h-7 sm:has-data-[size=sm]:*:min-h-5 dark:not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]", className),
202
202
  "data-slot": "combobox-chips",
203
203
  onMouseDown: containedHandler(chipsRef, (e) => {
204
204
  const { target } = e;
@@ -15,7 +15,7 @@ export declare const COMPOSER_CONTROL_BUTTON_SIZE: "icon-sm";
15
15
  * radius is the docked bar's original `rounded-2xl`: at the compact row's
16
16
  * stature it reads as a soft pill, which is the shape the composers were
17
17
  * meant to unify on. */
18
- export declare const COMPOSER_BOX_CLASS = "bg-background rounded-2xl border transition-colors";
18
+ export declare const COMPOSER_BOX_CLASS = "bg-background rounded-2xl border";
19
19
  /** The box's focus ring in its default (non-anonymized) treatment. */
20
20
  export declare const COMPOSER_BOX_FOCUS_CLASS = "focus-within:border-ring";
21
21
  /**
@@ -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-2xs 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";
73
73
  type ComposerStatusRowProps = {
74
74
  /** Left cluster: matter picker, web-search / anonymize toggles, ... */
75
75
  start?: ReactNode | undefined;
@@ -19,7 +19,7 @@ const COMPOSER_CONTROL_BUTTON_SIZE = "icon-sm";
19
19
  * radius is the docked bar's original `rounded-2xl`: at the compact row's
20
20
  * stature it reads as a soft pill, which is the shape the composers were
21
21
  * meant to unify on. */
22
- const COMPOSER_BOX_CLASS = "bg-background rounded-2xl border transition-colors";
22
+ const COMPOSER_BOX_CLASS = "bg-background rounded-2xl border";
23
23
  /** The box's focus ring in its default (non-anonymized) treatment. */
24
24
  const COMPOSER_BOX_FOCUS_CLASS = "focus-within:border-ring";
25
25
  /**
@@ -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-2xs 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";
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
@@ -334,7 +334,7 @@ const DatePickerPopoverContent = ({ id, labelledBy, value: rawValue, onChange, l
334
334
  render: /* @__PURE__ */ jsx("button", {
335
335
  "aria-label": !labelledBy && value ? displayLabel : void 0,
336
336
  "aria-labelledby": labelledBy ? `${labelledBy} ${displayValueId}` : void 0,
337
- className: cn("flex h-auto min-h-7 w-full min-w-0 items-center gap-1.5", "rounded-md px-1.5 text-sm", "hover:bg-muted transition-colors", (() => {
337
+ className: cn("flex h-auto min-h-7 w-full min-w-0 items-center gap-1.5", "rounded-md px-1.5 text-sm", "hover:bg-muted", (() => {
338
338
  if (isOverdue) return "text-destructive";
339
339
  if (value) return "text-foreground";
340
340
  return "text-muted-foreground";
@@ -379,7 +379,7 @@ const DatePickerPopoverContent = ({ id, labelledBy, value: rawValue, onChange, l
379
379
  children: /* @__PURE__ */ jsx(DirectionalIcon, { icon: ChevronLeftIcon })
380
380
  }),
381
381
  /* @__PURE__ */ jsx("button", {
382
- className: cn("text-xs font-medium transition-colors", view !== "years" && "hover:bg-muted cursor-pointer rounded-md px-2 py-0.5", view === "years" && "cursor-default"),
382
+ className: cn("text-xs font-medium", view !== "years" && "hover:bg-muted cursor-pointer rounded-md px-2 py-0.5", view === "years" && "cursor-default"),
383
383
  onClick: handleHeaderClick,
384
384
  tabIndex: view === "years" ? -1 : 0,
385
385
  type: "button",
@@ -422,7 +422,7 @@ const DatePickerPopoverContent = ({ id, labelledBy, value: rawValue, onChange, l
422
422
  "aria-disabled": disabled || void 0,
423
423
  "aria-label": formatDayLabel(day.date),
424
424
  "aria-selected": isSelected || void 0,
425
- className: cn("flex size-8 items-center justify-center", "rounded-full text-xs transition-colors", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", disabled ? "text-foreground-disabled cursor-not-allowed" : "hover:bg-muted cursor-pointer", !day.isCurrentMonth && !disabled && "text-foreground-disabled", day.isWeekend && day.isCurrentMonth && !disabled && !isSelected && "text-foreground-label", day.isToday && !isSelected && !disabled && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
425
+ className: cn("flex size-8 items-center justify-center", "rounded-full text-xs", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", disabled ? "text-foreground-disabled cursor-not-allowed" : "hover:bg-muted cursor-pointer", !day.isCurrentMonth && !disabled && "text-foreground-disabled", day.isWeekend && day.isCurrentMonth && !disabled && !isSelected && "text-foreground-label", day.isToday && !isSelected && !disabled && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
426
426
  "data-date": day.date,
427
427
  onClick: () => {
428
428
  if (!disabled) onChange(day.date);
@@ -504,7 +504,7 @@ const MonthGrid = ({ locale, viewYear, currentMonth, currentYear, onSelect, toda
504
504
  const isSelected = currentMonth !== null && currentYear !== null && month === currentMonth && viewYear === currentYear;
505
505
  return /* @__PURE__ */ jsxs("button", {
506
506
  "aria-selected": isSelected || void 0,
507
- className: cn("rounded-md px-2 py-1.5 text-xs transition-colors", "hover:bg-muted cursor-pointer", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", month === todayMonth && viewYear === todayYear && !isSelected && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
507
+ className: cn("rounded-md px-2 py-1.5 text-xs", "hover:bg-muted cursor-pointer", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", month === todayMonth && viewYear === todayYear && !isSelected && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
508
508
  onClick: () => onSelect(month),
509
509
  role: "gridcell",
510
510
  type: "button",
@@ -536,7 +536,7 @@ const YearGrid = ({ decadeBase, currentYear, onSelect, today }) => {
536
536
  const isSelected = currentYear !== null && year === currentYear;
537
537
  return /* @__PURE__ */ jsx("button", {
538
538
  "aria-selected": isSelected || void 0,
539
- className: cn("rounded-md px-2 py-1.5 text-xs transition-colors", "hover:bg-muted cursor-pointer", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", isOutside && !isSelected && "text-foreground-subtle", year === todayYear && !isSelected && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
539
+ className: cn("rounded-md px-2 py-1.5 text-xs", "hover:bg-muted cursor-pointer", "focus-visible:ring-ring focus-visible:ring-1 focus-visible:outline-none", isOutside && !isSelected && "text-foreground-subtle", year === todayYear && !isSelected && "ring-foreground font-medium ring-1", isSelected && "bg-primary text-primary-foreground hover:bg-primary/90"),
540
540
  onClick: () => onSelect(year),
541
541
  role: "gridcell",
542
542
  type: "button",
@@ -9,7 +9,7 @@
9
9
  * two boxes drift apart the moment a caller sizes the wrapper: the text sits
10
10
  * at the top of the control while the icon stays centred.
11
11
  */
12
- export declare const INPUT_CONTROL_CLASS_NAME = "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11";
12
+ export declare const INPUT_CONTROL_CLASS_NAME = "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11";
13
13
  export declare const INPUT_ELEMENT_CLASS_NAME = "placeholder:text-foreground-placeholder h-full min-h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none [transition:background-color_5000000s_ease-in-out_0s] sm:min-h-7.5 sm:leading-7.5";
14
14
  export declare const INPUT_SIZE_CLASS_NAMES: {
15
15
  readonly sm: "min-h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:min-h-6.5 sm:leading-6.5";
@@ -10,7 +10,7 @@ import { CONTROL_SIZE } from "../lib/control-size.js";
10
10
  * two boxes drift apart the moment a caller sizes the wrapper: the text sits
11
11
  * at the top of the control while the icon stays centred.
12
12
  */
13
- const INPUT_CONTROL_CLASS_NAME = "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11";
13
+ const INPUT_CONTROL_CLASS_NAME = "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11";
14
14
  const INPUT_ELEMENT_CLASS_NAME = "placeholder:text-foreground-placeholder h-full min-h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none [transition:background-color_5000000s_ease-in-out_0s] sm:min-h-7.5 sm:leading-7.5";
15
15
  const INPUT_SIZE_CLASS_NAMES = {
16
16
  [CONTROL_SIZE.sm]: "min-h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:min-h-6.5 sm:leading-6.5",
@@ -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-end" | "block-start" | 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;
@@ -6,7 +6,7 @@ import { jsx } from "react/jsx-runtime";
6
6
  import { cva } from "class-variance-authority";
7
7
  //#region src/components/input-group.tsx
8
8
  const InputGroup = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
9
- className: cn("border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 relative inline-flex w-full min-w-0 items-center rounded-lg border text-base shadow-xs/5 transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-data-[align=block-end]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:h-auto has-data-[align=block-start]:flex-col has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] has-[textarea]:h-auto sm:text-sm dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=inline-start]:**:[input]:ps-2 has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)] **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5", className),
9
+ className: cn("border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 relative inline-flex w-full min-w-0 items-center rounded-lg border text-base shadow-xs/5 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/4%)] has-data-[align=block-end]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:h-auto has-data-[align=block-start]:flex-col has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] has-[textarea]:h-auto sm:text-sm dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=inline-start]:**:[input]:ps-2 has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)] **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5", className),
10
10
  "data-slot": "input-group",
11
11
  role: "group",
12
12
  ...props
@@ -19,7 +19,7 @@ const InputOTPGroup = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
19
19
  const InputOTPSlot = ({ index, className, ...props }) => {
20
20
  const { char, hasFakeCaret, isActive } = React$1.use(OTPInputContext).slots[index] ?? {};
21
21
  return /* @__PURE__ */ jsxs("div", {
22
- className: cn("border-input aria-invalid:border-destructive data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40 relative flex h-9 w-9 items-center justify-center border-y border-e text-sm shadow-xs transition-[border-color,outline] outline-none first:rounded-s-md first:border-s last:rounded-e-md data-[active=true]:z-10 data-[active=true]:ring-[3px]", className),
22
+ className: cn("border-input aria-invalid:border-destructive data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40 relative flex h-9 w-9 items-center justify-center border-y border-e text-sm shadow-xs outline-none first:rounded-s-md first:border-s last:rounded-e-md data-[active=true]:z-10 data-[active=true]:ring-[3px]", className),
23
23
  "data-active": isActive,
24
24
  "data-slot": "input-otp-slot",
25
25
  ...props,
@@ -20,7 +20,7 @@ const Input = ({ className, size = CONTROL_SIZE.default, unstyled = false, nativ
20
20
  };
21
21
  const inputClassName = cn(INPUT_ELEMENT_CLASS_NAME, INPUT_SIZE_CLASS_NAMES[controlSize], props.type === "search" && "ps-8 [&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none");
22
22
  return /* @__PURE__ */ jsxs("span", {
23
- className: cn(!unstyled && "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11", className) || void 0,
23
+ className: cn(!unstyled && "border-input bg-background text-foreground ring-ring/24 has-autofill:bg-foreground/4 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-autofill:bg-foreground/8 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:min-h-11", className) || void 0,
24
24
  "data-size": size,
25
25
  "data-slot": "input-control",
26
26
  dir: contentDir.dir,
@@ -25,9 +25,9 @@ type LandingGreetingProps = {
25
25
  };
26
26
  export declare const LandingGreeting: ({ icon, children }: LandingGreetingProps) => import("react").JSX.Element;
27
27
  /** A column's heading: an icon and an uppercase label, as a link or a trigger. */
28
- export declare const LANDING_SECTION_HEADING_CLASS = "text-muted-foreground hover:text-foreground focus-visible:ring-ring flex items-center gap-2 rounded-md px-1 text-xs font-semibold tracking-widest uppercase transition-colors outline-none focus-visible:ring-2";
28
+ export declare const LANDING_SECTION_HEADING_CLASS = "text-muted-foreground hover:text-foreground focus-visible:ring-ring flex items-center gap-2 rounded-md px-1 text-xs font-semibold tracking-widest uppercase outline-none focus-visible:ring-2";
29
29
  /** A row of a column, as a link or a button. */
30
- export declare const LANDING_ROW_CLASS = "group hover:bg-accent/50 focus-visible:ring-ring rounded-md px-2 py-1.5 text-start transition-colors outline-none focus-visible:ring-2";
30
+ export declare const LANDING_ROW_CLASS = "group hover:bg-accent/50 focus-visible:ring-ring rounded-md px-2 py-1.5 text-start outline-none focus-visible:ring-2";
31
31
  type LandingSectionProps = {
32
32
  children: ReactNode;
33
33
  heading: ReactNode;
@@ -40,9 +40,9 @@ const LandingGreeting = ({ icon, children }) => /* @__PURE__ */ jsxs("div", {
40
40
  })]
41
41
  });
42
42
  /** A column's heading: an icon and an uppercase label, as a link or a trigger. */
43
- const LANDING_SECTION_HEADING_CLASS = "text-muted-foreground hover:text-foreground focus-visible:ring-ring flex items-center gap-2 rounded-md px-1 text-xs font-semibold tracking-widest uppercase transition-colors outline-none focus-visible:ring-2";
43
+ const LANDING_SECTION_HEADING_CLASS = "text-muted-foreground hover:text-foreground focus-visible:ring-ring flex items-center gap-2 rounded-md px-1 text-xs font-semibold tracking-widest uppercase outline-none focus-visible:ring-2";
44
44
  /** A row of a column, as a link or a button. */
45
- const LANDING_ROW_CLASS = "group hover:bg-accent/50 focus-visible:ring-ring rounded-md px-2 py-1.5 text-start transition-colors outline-none focus-visible:ring-2";
45
+ const LANDING_ROW_CLASS = "group hover:bg-accent/50 focus-visible:ring-ring rounded-md px-2 py-1.5 text-start outline-none focus-visible:ring-2";
46
46
  /** A column: its heading stays put, its rows scroll beneath it. */
47
47
  const LandingSection = ({ children, heading }) => /* @__PURE__ */ jsxs("section", {
48
48
  className: "flex min-h-0 min-w-0 flex-col",
@@ -86,7 +86,7 @@ const LandingItemText = ({ icon, iconTone = "muted", meta, title }) => /* @__PUR
86
86
  })]
87
87
  });
88
88
  const LandingRowIcon = ({ children, tone = "muted" }) => /* @__PURE__ */ jsx("span", {
89
- className: cn("mt-0.5 flex size-4 shrink-0 items-center justify-center transition-colors", tone === "muted" && "text-foreground-muted group-hover:text-muted-foreground"),
89
+ className: cn("mt-0.5 flex size-4 shrink-0 items-center justify-center", tone === "muted" && "text-foreground-muted group-hover:text-muted-foreground"),
90
90
  children
91
91
  });
92
92
  const LandingEmpty = ({ children }) => /* @__PURE__ */ jsx("div", {
@@ -58,9 +58,9 @@ const MenuCheckboxItem = ({ className, children, checked, variant = "default", .
58
58
  className: "col-start-1",
59
59
  children
60
60
  }), /* @__PURE__ */ jsx(Menu$1.CheckboxItemIndicator, {
61
- className: "focus-visible:ring-ring focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px inset-shadow-[0_1px_--theme(--color-black/4%)] transition-[background-color,box-shadow] duration-200 outline-none [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]",
61
+ className: "focus-visible:ring-ring focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px inset-shadow-[0_1px_--theme(--color-black/4%)] outline-none [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-offset-1 data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]",
62
62
  keepMounted: true,
63
- children: /* @__PURE__ */ jsx("span", { className: "bg-background pointer-events-none block aspect-square h-full origin-left rounded-(--thumb-size) shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s] in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)]" })
63
+ children: /* @__PURE__ */ jsx("span", { className: "bg-background pointer-events-none block aspect-square h-full origin-left rounded-(--thumb-size) shadow-sm/5 will-change-transform [transition:translate_.15s,scale_.1s_.1s,transform-origin_.15s] in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)]" })
64
64
  })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Menu$1.CheckboxItemIndicator, {
65
65
  className: "col-start-1",
66
66
  children: /* @__PURE__ */ jsxs("svg", {
@@ -13,7 +13,7 @@ const ScrollArea = ({ axis = "both", className, children, scrollFade = false, sc
13
13
  children: [
14
14
  /* @__PURE__ */ jsx(ScrollArea$1.Viewport, {
15
15
  ref: viewportRef,
16
- className: cn("focus-visible:ring-ring focus-visible:ring-offset-background h-full overscroll-contain rounded-[inherit] transition-shadow outline-none focus-visible:ring-2 focus-visible:ring-offset-1 data-has-overflow-x:overscroll-x-contain", scrollFade && "mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] [--fade-size:1.5rem]", scrollbarGutter && "data-has-overflow-x:pb-2.5 data-has-overflow-y:pe-2.5", AXIS_VIEWPORT_CLASS[axis]),
16
+ className: cn("focus-visible:ring-ring focus-visible:ring-offset-background h-full overscroll-contain rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-offset-1 data-has-overflow-x:overscroll-x-contain", scrollFade && "mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] [--fade-size:1.5rem]", scrollbarGutter && "data-has-overflow-x:pb-2.5 data-has-overflow-y:pe-2.5", AXIS_VIEWPORT_CLASS[axis]),
17
17
  "data-slot": "scroll-area-viewport",
18
18
  children
19
19
  }),
@@ -31,7 +31,7 @@ const Select = ({ children, isItemEqualToValue, itemToStringLabel, itemToStringV
31
31
  });
32
32
  };
33
33
  const SelectTrigger = ({ className, size = CONTROL_SIZE.default, children, ...props }) => /* @__PURE__ */ jsxs(Select$1.Trigger, {
34
- className: cn("border-input bg-background text-foreground ring-ring/24 focus-visible:border-ring aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 dark:bg-input/32 dark:aria-invalid:ring-destructive/24 relative inline-flex min-h-9 w-full min-w-36 items-center justify-center gap-2 rounded-lg border px-[calc(--spacing(3)-1px)] text-start text-base shadow-xs/5 transition-shadow outline-none select-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-[3px] data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [[data-disabled],:focus-visible,[aria-invalid],[data-pressed]]:shadow-none", SELECT_TRIGGER_SIZE_CLASS_NAMES[size], className),
34
+ className: cn("border-input bg-background text-foreground ring-ring/24 focus-visible:border-ring aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 dark:bg-input/32 dark:aria-invalid:ring-destructive/24 relative inline-flex min-h-9 w-full min-w-36 items-center justify-center gap-2 rounded-lg border px-[calc(--spacing(3)-1px)] text-start text-base shadow-xs/5 outline-none select-none not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:ring-[3px] data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [[data-disabled],:focus-visible,[aria-invalid],[data-pressed]]:shadow-none", SELECT_TRIGGER_SIZE_CLASS_NAMES[size], className),
35
35
  "data-slot": "select-trigger",
36
36
  ...props,
37
37
  children: [children, /* @__PURE__ */ jsx(Select$1.Icon, {
@@ -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?: "default" | "sm" | "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;
@@ -27,7 +27,7 @@ const TableFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("tfoot", {
27
27
  ...props
28
28
  });
29
29
  const TableRow = ({ className, ...props }) => /* @__PURE__ */ jsx("tr", {
30
- className: cn("hover:bg-muted/72 data-[state=selected]:bg-muted/72 border-b transition-colors in-data-[slot=frame]:hover:bg-transparent in-data-[slot=frame]:data-[state=selected]:bg-transparent", className),
30
+ 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", className),
31
31
  "data-slot": "table-row",
32
32
  ...props
33
33
  });
@@ -18,7 +18,7 @@ const Textarea = ({ className, size = CONTROL_SIZE.default, unstyled = false, di
18
18
  onChange?.(event);
19
19
  };
20
20
  return /* @__PURE__ */ jsx("span", {
21
- className: cn(!unstyled && "border-input bg-background text-foreground ring-ring/24 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]", className) || void 0,
21
+ className: cn(!unstyled && "border-input bg-background text-foreground ring-ring/24 has-focus-visible:border-ring has-aria-invalid:border-destructive/36 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base shadow-xs/5 not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]", className) || void 0,
22
22
  "data-size": size,
23
23
  "data-slot": "textarea-control",
24
24
  children: /* @__PURE__ */ jsx(Field.Control, { render: (defaultProps) => /* @__PURE__ */ jsx("textarea", {
@@ -66,7 +66,7 @@ const Toasts = ({ position }) => {
66
66
  children: toasts.map((toastItem) => {
67
67
  const Icon = getToastIcon(toastItem.type);
68
68
  return /* @__PURE__ */ jsx(Toast.Root, {
69
- className: cn("bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 [transition:transform_.5s_cubic-bezier(.22,1,.36,1),opacity_.5s,height_.15s] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", "data-[position*=right]:start-auto data-[position*=right]:end-0", "data-[position*=left]:start-0 data-[position*=left]:end-auto", "data-[position*=center]:start-0 data-[position*=center]:end-0", "data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top", "data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom", "after:absolute after:start-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full", "data-[position*=top]:after:top-full", "data-[position*=bottom]:after:bottom-full", "[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]", "data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]", "data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]", "data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-limited:opacity-0", "data-expanded:h-(--toast-height)", "data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]", "data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]", "data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:opacity-0", "data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]"),
69
+ className: cn("bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 [transition:transform_.5s_var(--ease-smooth),opacity_.5s,height_.15s] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] motion-reduce:transition-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", "data-[position*=right]:start-auto data-[position*=right]:end-0", "data-[position*=left]:start-0 data-[position*=left]:end-auto", "data-[position*=center]:start-0 data-[position*=center]:end-0", "data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top", "data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom", "after:absolute after:start-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full", "data-[position*=top]:after:top-full", "data-[position*=bottom]:after:bottom-full", "[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]", "data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]", "data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]", "data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]", "data-limited:opacity-0", "data-expanded:h-(--toast-height)", "data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]", "data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]", "data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:opacity-0", "data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]", "data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]", "data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]"),
70
70
  "data-position": position,
71
71
  swipeDirection: (() => {
72
72
  if (position.includes("center")) return [isTop ? "up" : "down"];
@@ -99,7 +99,7 @@ const Toasts = ({ position }) => {
99
99
  "data-slot": "toast-action",
100
100
  children: toastItem.actionProps.children
101
101
  }), /* @__PURE__ */ jsx(Toast.Close, {
102
- className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-0.5 transition-colors select-none",
102
+ className: "text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-0.5 select-none",
103
103
  "data-slot": "toast-close",
104
104
  "aria-label": "Close notification",
105
105
  children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
@@ -56,7 +56,7 @@ const InspectorRailFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("di
56
56
  ...props
57
57
  });
58
58
  const InspectorRailIconButton = ({ className, ...props }) => /* @__PURE__ */ jsx("button", {
59
- className: cn("text-muted-foreground hover:bg-accent hover:text-foreground flex items-center justify-center rounded-md outline-hidden transition-colors focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", SIDE_RAIL_ICON_BUTTON_SIZE, className),
59
+ className: cn("text-muted-foreground hover:bg-accent hover:text-foreground flex items-center justify-center rounded-md outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", SIDE_RAIL_ICON_BUTTON_SIZE, className),
60
60
  "data-slot": "inspector-rail-icon-button",
61
61
  type: "button",
62
62
  ...props
@@ -69,7 +69,7 @@ const InspectorRailIconButton = ({ className, ...props }) => /* @__PURE__ */ jsx
69
69
  */
70
70
  const InspectorRailTab = ({ active = false, className, ...props }) => /* @__PURE__ */ jsx("button", {
71
71
  "aria-current": active ? "true" : void 0,
72
- className: cn("group/tab relative flex w-full shrink-0 items-center justify-center border-b transition-colors", TOOLBAR_ROW_HEIGHT, active ? "bg-background text-foreground before:bg-primary before:absolute before:inset-y-0 before:inset-s-0 before:w-0.5" : "text-muted-foreground hover:bg-accent hover:text-foreground", className),
72
+ className: cn("group/tab relative flex w-full shrink-0 items-center justify-center border-b", TOOLBAR_ROW_HEIGHT, active ? "bg-background text-foreground before:bg-primary before:absolute before:inset-y-0 before:inset-s-0 before:w-0.5" : "text-muted-foreground hover:bg-accent hover:text-foreground", className),
73
73
  "data-active": active ? "" : void 0,
74
74
  "data-slot": "inspector-rail-tab",
75
75
  type: "button",
@@ -37,7 +37,7 @@ const InspectorDock = ({ children, className, mount = "shell-end", onResetWidth,
37
37
  className: "bg-border group-hover:bg-primary group-active:bg-primary absolute inset-y-0 start-1/2 w-px -translate-x-1/2"
38
38
  }), /* @__PURE__ */ jsx("span", {
39
39
  "aria-hidden": "true",
40
- className: "bg-background/80 text-foreground-placeholder ring-border/60 group-hover:bg-accent group-hover:text-foreground group-focus-visible:bg-accent group-focus-visible:text-foreground relative flex h-5 w-3 items-center justify-center rounded-full opacity-0 shadow-xs ring-1 backdrop-blur-sm transition-[color,background-color,opacity] group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100",
40
+ className: "bg-background/80 text-foreground-placeholder ring-border/60 group-hover:bg-accent group-hover:text-foreground group-focus-visible:bg-accent group-focus-visible:text-foreground relative flex h-5 w-3 items-center justify-center rounded-full opacity-0 shadow-xs ring-1 backdrop-blur-sm transition-opacity group-hover:opacity-100 group-focus-visible:opacity-100 group-active:opacity-100",
41
41
  "data-slot": "inspector-resize-grip",
42
42
  children: /* @__PURE__ */ jsx(EllipsisIcon, { className: "size-3 rotate-90" })
43
43
  })]
@@ -157,7 +157,7 @@ const flashFacetChip = (el) => {
157
157
  easing: "ease-in-out"
158
158
  });
159
159
  };
160
- const CHIP_CLASS = "shrink-0 rounded-md px-1.5 py-1 text-xs font-medium whitespace-nowrap transition-colors";
160
+ const CHIP_CLASS = "shrink-0 rounded-md px-1.5 py-1 text-xs font-medium whitespace-nowrap";
161
161
  const INACTIVE_CHIP_CLASS = "text-muted-foreground hover:bg-muted hover:text-foreground";
162
162
  const FacetChip = ({ label, value, isActive, disabled, activeBadge, onSelect }) => /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
163
163
  render: /* @__PURE__ */ jsx("button", {
@@ -44,7 +44,7 @@ const KanbanCardShell = ({ children, appearance = "standard", actions, actionsVi
44
44
  "data-active": active ? "true" : void 0,
45
45
  ref: dragRef,
46
46
  children: /* @__PURE__ */ jsx("div", {
47
- className: cn(CARD_CLASS, appearance === "proposal" && "border-dashed", "cursor-pointer transition-shadow hover:shadow-md", active && ACTIVE_CLASS, className),
47
+ className: cn(CARD_CLASS, appearance === "proposal" && "border-dashed", "cursor-pointer hover:shadow-md", active && ACTIVE_CLASS, className),
48
48
  onClick: containedEventHandler(onOpen),
49
49
  onKeyDown: (event) => {
50
50
  if (event.key !== "Enter" && event.key !== " ") return;
@@ -22,7 +22,7 @@ const KanbanColumnBandHeader = ({ title, swatch, meta, collapsed, compact = coll
22
22
  children: [/* @__PURE__ */ jsx("button", {
23
23
  "aria-expanded": !collapsed,
24
24
  "aria-label": toggleLabel,
25
- className: cn("hover:bg-muted/60 text-muted-foreground hover:text-foreground flex size-7 shrink-0 items-center justify-center rounded-md transition-[background-color]", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
25
+ className: cn("hover:bg-muted/60 text-muted-foreground hover:text-foreground flex size-7 shrink-0 items-center justify-center rounded-md", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
26
26
  onClick: (event) => onCollapsedChange(!collapsed, { viaPointer: event.detail > 0 }),
27
27
  title: toggleLabel,
28
28
  type: "button",
@@ -359,7 +359,7 @@ const KanbanSubgroupBoard = ({ scrollRef, matrix, renderColumnHeader, renderLane
359
359
  "data-kanban-lane-identity": "",
360
360
  children: /* @__PURE__ */ jsxs("button", {
361
361
  "aria-expanded": !collapsed,
362
- className: cn("hover:bg-muted/60 flex items-center gap-2 rounded-lg px-2 text-start text-sm font-medium transition-[background-color]", "h-9", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
362
+ className: cn("hover:bg-muted/60 flex items-center gap-2 rounded-lg px-2 text-start text-sm font-medium", "h-9", KANBAN_CHROME_TOGGLE_COARSE_TARGET_CLASS),
363
363
  onClick: () => setLaneCollapsed(group, count, !collapsed),
364
364
  type: "button",
365
365
  children: [
@@ -128,7 +128,7 @@ const KanbanVirtualCell = ({ rows, getRowKey, renderRow, pagination, sortable, c
128
128
  })
129
129
  }) : null;
130
130
  const content = /* @__PURE__ */ jsxs("div", {
131
- className: cn(KANBAN_CELL_SURFACE_CLASS, "min-h-20 rounded-xl p-2 transition-[background-color,outline-color]", rows.length === 0 ? "overflow-visible" : "max-h-[min(60vh,40rem)] overflow-y-auto overscroll-y-contain", active && accentVariants === void 0 && "bg-primary/5 ring-primary/50 ring-2", className),
131
+ className: cn(KANBAN_CELL_SURFACE_CLASS, "min-h-20 rounded-xl p-2", rows.length === 0 ? "overflow-visible" : "max-h-[min(60vh,40rem)] overflow-y-auto overscroll-y-contain", active && accentVariants === void 0 && "bg-primary/5 ring-primary/50 ring-2", className),
132
132
  "data-kanban-cell": sortable?.dropTarget.id,
133
133
  "data-kanban-cell-accent": accentVariants === void 0 ? void 0 : "true",
134
134
  onScroll: handleScroll,
@@ -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 ("default" | "sm" | "lg")[];
8
+ declare const CONTROL_SIZES: readonly ("default" | "lg" | "sm")[];
9
9
  //#endregion
10
10
  export { CONTROL_SIZE, CONTROL_SIZES, type ControlSize };
@@ -0,0 +1,75 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/review/text-mark.d.ts
3
+ /**
4
+ * One mark for words in running text: a search or find hit, a reader's own
5
+ * highlight, a verdict under a claim. Every surface that points at words
6
+ * draws them this way, so a found word, a note and a finding differ only in
7
+ * hue and line, never in shape.
8
+ *
9
+ * Marks stay inline with no padding or rounding: a mark over several lines or
10
+ * inline runs is several boxes, and only a flat, cloned background reads as
11
+ * one continuous mark. The hue travels as the `--text-mark` custom property,
12
+ * so each variant and state is spelled once and every tone reuses it.
13
+ */
14
+ export declare const TextMark: ({ variant, tone, state, weight, className, ...props }: TextMarkProps) => import("react").JSX.Element;
15
+ export type TextMarkVariant = "fill" | "underline" | "dotted" | "wavy" | "strike";
16
+ export type TextMarkTone = "warning" | "success" | "destructive" | "muted" | "option-yellow" | "option-green" | "option-sky" | "option-violet" | "option-red" | "option-purple";
17
+ /**
18
+ * `matched` is a line mark picked out by a filter: it gains a faint wash of
19
+ * its hue. A fill mark is already a wash, so it looks the same at rest and
20
+ * matched. `active` is the one mark being pointed at (the current find hit,
21
+ * the selected claim): a stronger wash of the same hue and a ring of it.
22
+ */
23
+ export type TextMarkState = "rest" | "matched" | "active";
24
+ /** Search hits read a touch heavier than the words around them. */
25
+ export type TextMarkWeight = "inherit" | "medium";
26
+ export type TextMarkOptions = {
27
+ variant: TextMarkVariant;
28
+ tone: TextMarkTone;
29
+ state?: TextMarkState | undefined;
30
+ weight?: TextMarkWeight | undefined;
31
+ };
32
+ type TextMarkProps = ComponentProps<"mark"> & TextMarkOptions;
33
+ /** The CSS value of each tone's hue. */
34
+ export declare const TEXT_MARK_TONE_COLOR: {
35
+ readonly warning: "var(--warning)";
36
+ readonly success: "var(--success)";
37
+ readonly destructive: "var(--destructive)";
38
+ readonly muted: "var(--muted-foreground)";
39
+ readonly "option-yellow": "var(--option-yellow)";
40
+ readonly "option-green": "var(--option-green)";
41
+ readonly "option-sky": "var(--option-sky)";
42
+ readonly "option-violet": "var(--option-violet)";
43
+ readonly "option-red": "var(--option-red)";
44
+ readonly "option-purple": "var(--option-purple)";
45
+ };
46
+ /** How a found word is marked everywhere: readers, snippets, PDFs, tables. */
47
+ export declare const SEARCH_HIT_MARK: {
48
+ readonly variant: "fill";
49
+ readonly tone: "warning";
50
+ readonly weight: "medium";
51
+ };
52
+ /** The classes of one mark, for markup that is not a `<TextMark>` (a claim
53
+ * button, a PDF text-layer box, an element a DOM walker creates). */
54
+ export declare const textMarkClass: ({ variant, tone, state, weight }: TextMarkOptions) => string;
55
+ /**
56
+ * The search-hit mark reached through a descendant selector, for markup that
57
+ * arrives already highlighted (the search endpoints' `<mark>` snippets).
58
+ * Spelled out because Tailwind emits only the classes it can read in the
59
+ * source; `text-mark.test.ts` holds it to `textMarkClass(SEARCH_HIT_MARK)`.
60
+ */
61
+ export declare const SEARCH_HIT_DESCENDANT_MARK_CLASS = "[&_mark]:box-decoration-clone [&_mark]:text-foreground [&_mark]:[--text-mark:var(--warning)] [&_mark]:bg-(--text-mark)/30 [&_mark]:dark:bg-(--text-mark)/20 [&_mark]:font-medium";
62
+ type TextMarkHighlightRuleOptions = {
63
+ /** The registered `CSS.highlights` name. */
64
+ name: string;
65
+ tone: TextMarkTone;
66
+ state: Exclude<TextMarkState, "matched">;
67
+ };
68
+ /**
69
+ * A fill mark for the CSS Custom Highlight API. `::highlight()` takes colours
70
+ * but no classes, custom properties or rings, so a find that marks ranges
71
+ * rather than elements gets the fill's wash as a rule; the active range is
72
+ * told apart by its stronger wash alone.
73
+ */
74
+ export declare const textMarkHighlightRule: ({ name, tone, state }: TextMarkHighlightRuleOptions) => string;
75
+ //#endregion
@@ -0,0 +1,120 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/review/text-mark.tsx
4
+ /**
5
+ * One mark for words in running text: a search or find hit, a reader's own
6
+ * highlight, a verdict under a claim. Every surface that points at words
7
+ * draws them this way, so a found word, a note and a finding differ only in
8
+ * hue and line, never in shape.
9
+ *
10
+ * Marks stay inline with no padding or rounding: a mark over several lines or
11
+ * inline runs is several boxes, and only a flat, cloned background reads as
12
+ * one continuous mark. The hue travels as the `--text-mark` custom property,
13
+ * so each variant and state is spelled once and every tone reuses it.
14
+ */
15
+ const TextMark = ({ variant, tone, state, weight, className, ...props }) => /* @__PURE__ */ jsx("mark", {
16
+ className: cn(textMarkClass({
17
+ variant,
18
+ tone,
19
+ state,
20
+ weight
21
+ }), className),
22
+ "data-slot": "text-mark",
23
+ ...props
24
+ });
25
+ /** The CSS value of each tone's hue. */
26
+ const TEXT_MARK_TONE_COLOR = {
27
+ warning: "var(--warning)",
28
+ success: "var(--success)",
29
+ destructive: "var(--destructive)",
30
+ muted: "var(--muted-foreground)",
31
+ "option-yellow": "var(--option-yellow)",
32
+ "option-green": "var(--option-green)",
33
+ "option-sky": "var(--option-sky)",
34
+ "option-violet": "var(--option-violet)",
35
+ "option-red": "var(--option-red)",
36
+ "option-purple": "var(--option-purple)"
37
+ };
38
+ /** How a found word is marked everywhere: readers, snippets, PDFs, tables. */
39
+ const SEARCH_HIT_MARK = {
40
+ variant: "fill",
41
+ tone: "warning",
42
+ weight: "medium"
43
+ };
44
+ /** The classes of one mark, for markup that is not a `<TextMark>` (a claim
45
+ * button, a PDF text-layer box, an element a DOM walker creates). */
46
+ const textMarkClass = ({ variant, tone, state = "rest", weight = "inherit" }) => [
47
+ TEXT_MARK_BASE_CLASS,
48
+ VARIANT_CLASS[variant],
49
+ TONE_CLASS[tone],
50
+ WASH_CLASS[variant === "fill" ? "fill" : "line"][state],
51
+ WEIGHT_CLASS[weight]
52
+ ].filter((part) => part !== "").join(" ");
53
+ /**
54
+ * The search-hit mark reached through a descendant selector, for markup that
55
+ * arrives already highlighted (the search endpoints' `<mark>` snippets).
56
+ * Spelled out because Tailwind emits only the classes it can read in the
57
+ * source; `text-mark.test.ts` holds it to `textMarkClass(SEARCH_HIT_MARK)`.
58
+ */
59
+ const SEARCH_HIT_DESCENDANT_MARK_CLASS = "[&_mark]:box-decoration-clone [&_mark]:text-foreground [&_mark]:[--text-mark:var(--warning)] [&_mark]:bg-(--text-mark)/30 [&_mark]:dark:bg-(--text-mark)/20 [&_mark]:font-medium";
60
+ /**
61
+ * A fill mark for the CSS Custom Highlight API. `::highlight()` takes colours
62
+ * but no classes, custom properties or rings, so a find that marks ranges
63
+ * rather than elements gets the fill's wash as a rule; the active range is
64
+ * told apart by its stronger wash alone.
65
+ */
66
+ const textMarkHighlightRule = ({ name, tone, state }) => {
67
+ const color = TEXT_MARK_TONE_COLOR[tone];
68
+ const { light, dark } = FILL_PERCENT[state];
69
+ return [`::highlight(${name}) { background-color: color-mix(in oklab, ${color} ${light}%, transparent); color: inherit; }`, `.dark ::highlight(${name}) { background-color: color-mix(in oklab, ${color} ${dark}%, transparent); }`].join("\n");
70
+ };
71
+ const TEXT_MARK_BASE_CLASS = "box-decoration-clone";
72
+ const LINE_CLASS = "text-inherit underline decoration-2 underline-offset-3 decoration-[color:var(--text-mark)]";
73
+ const VARIANT_CLASS = {
74
+ fill: "text-foreground",
75
+ underline: LINE_CLASS,
76
+ dotted: `${LINE_CLASS} decoration-dotted`,
77
+ wavy: `${LINE_CLASS} decoration-wavy`,
78
+ strike: "text-inherit line-through decoration-2 decoration-[color:var(--text-mark)]"
79
+ };
80
+ const TONE_CLASS = {
81
+ warning: "[--text-mark:var(--warning)]",
82
+ success: "[--text-mark:var(--success)]",
83
+ destructive: "[--text-mark:var(--destructive)]",
84
+ muted: "[--text-mark:var(--muted-foreground)]",
85
+ "option-yellow": "[--text-mark:var(--option-yellow)]",
86
+ "option-green": "[--text-mark:var(--option-green)]",
87
+ "option-sky": "[--text-mark:var(--option-sky)]",
88
+ "option-violet": "[--text-mark:var(--option-violet)]",
89
+ "option-red": "[--text-mark:var(--option-red)]",
90
+ "option-purple": "[--text-mark:var(--option-purple)]"
91
+ };
92
+ /** The fill's wash, in percent of the hue, for the highlight rule. */
93
+ const FILL_PERCENT = {
94
+ rest: {
95
+ light: 30,
96
+ dark: 20
97
+ },
98
+ active: {
99
+ light: 45,
100
+ dark: 35
101
+ }
102
+ };
103
+ const WASH_CLASS = {
104
+ fill: {
105
+ rest: "bg-(--text-mark)/30 dark:bg-(--text-mark)/20",
106
+ matched: "bg-(--text-mark)/30 dark:bg-(--text-mark)/20",
107
+ active: "bg-(--text-mark)/45 dark:bg-(--text-mark)/35 ring-1 ring-(--text-mark)"
108
+ },
109
+ line: {
110
+ rest: "bg-transparent",
111
+ matched: "bg-(--text-mark)/15",
112
+ active: "bg-(--text-mark)/30 dark:bg-(--text-mark)/20 ring-1 ring-(--text-mark)"
113
+ }
114
+ };
115
+ const WEIGHT_CLASS = {
116
+ inherit: "",
117
+ medium: "font-medium"
118
+ };
119
+ //#endregion
120
+ export { SEARCH_HIT_DESCENDANT_MARK_CLASS, SEARCH_HIT_MARK, TEXT_MARK_TONE_COLOR, TextMark, textMarkClass, textMarkHighlightRule };
@@ -72,6 +72,62 @@
72
72
  --color-popover: var(--popover);
73
73
  --color-card-foreground: var(--card-foreground);
74
74
  --color-card: var(--card);
75
+ /* Closed-form spring step responses sampled into linear():
76
+ spring moves (damping 0.75, ~2.8% overshoot); smooth enters (critical damping, no overshoot). */
77
+ --ease-spring: linear(
78
+ 0,
79
+ 0.053,
80
+ 0.177,
81
+ 0.33,
82
+ 0.486,
83
+ 0.627,
84
+ 0.746,
85
+ 0.84,
86
+ 0.911,
87
+ 0.961,
88
+ 0.995,
89
+ 1.014,
90
+ 1.025,
91
+ 1.028,
92
+ 1.028,
93
+ 1.024,
94
+ 1.02,
95
+ 1.016,
96
+ 1.012,
97
+ 1.008,
98
+ 1.005,
99
+ 1.003,
100
+ 1.001,
101
+ 1,
102
+ 1
103
+ );
104
+ --ease-smooth: linear(
105
+ 0,
106
+ 0.059,
107
+ 0.185,
108
+ 0.328,
109
+ 0.464,
110
+ 0.583,
111
+ 0.681,
112
+ 0.759,
113
+ 0.82,
114
+ 0.867,
115
+ 0.902,
116
+ 0.929,
117
+ 0.948,
118
+ 0.963,
119
+ 0.973,
120
+ 0.981,
121
+ 0.986,
122
+ 0.99,
123
+ 0.993,
124
+ 0.995,
125
+ 0.997,
126
+ 0.998,
127
+ 0.998,
128
+ 0.999,
129
+ 1
130
+ );
75
131
  --animate-skeleton: skeleton 2s -1s infinite linear;
76
132
  --animate-caret-blink: caret-blink 1.25s ease-out infinite;
77
133
  /* One-shot tint pulse for a surface that just became relevant.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/ui",
3
- "version": "0.34.5",
3
+ "version": "0.36.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",
@@ -245,6 +245,10 @@
245
245
  "types": "./dist/review/review-status-badge.d.ts",
246
246
  "import": "./dist/review/review-status-badge.js"
247
247
  },
248
+ "./text-mark": {
249
+ "types": "./dist/review/text-mark.d.ts",
250
+ "import": "./dist/review/text-mark.js"
251
+ },
248
252
  "./scroll-area": {
249
253
  "types": "./dist/components/scroll-area.d.ts",
250
254
  "import": "./dist/components/scroll-area.js"
@@ -611,7 +615,7 @@
611
615
  "test:browser": "playwright test --config playwright.config.ts",
612
616
  "pack:check": "cd ../.. && bun scripts/check-published-exports.ts packages/ui",
613
617
  "typecheck": "bun ../../packages/scripts/src/tsc-native.ts --noEmit",
614
- "lint": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --report-unused-disable-directives-severity=error --type-aware packages/ui",
618
+ "lint": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --report-unused-disable-directives-severity=error --type-aware --type-check packages/ui",
615
619
  "lint:fix": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --type-aware --fix packages/ui",
616
620
  "format": "bun ../../scripts/run-oxfmt.ts .",
617
621
  "prepack": "bun run build"