@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.
- package/dist/components/application-rail.js +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +2 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/color-picker.js +3 -3
- package/dist/components/combobox.js +1 -1
- package/dist/components/composer.d.ts +2 -2
- package/dist/components/composer.js +2 -2
- package/dist/components/date-picker-popover.js +5 -5
- package/dist/components/input-control.d.ts +1 -1
- package/dist/components/input-control.js +1 -1
- package/dist/components/input-group.d.ts +1 -1
- package/dist/components/input-group.js +1 -1
- package/dist/components/input-otp.js +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/landing.d.ts +2 -2
- package/dist/components/landing.js +3 -3
- package/dist/components/menu.js +2 -2
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sidebar.d.ts +2 -2
- package/dist/components/table.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/toast.js +2 -2
- package/dist/inspector/chrome.js +2 -2
- package/dist/inspector/dock.js +1 -1
- package/dist/inspector/facet-bar.js +1 -1
- package/dist/kanban/card-shell.js +1 -1
- package/dist/kanban/column-band-header.js +1 -1
- package/dist/kanban/subgroup-board.js +1 -1
- package/dist/kanban/virtual-cell.js +1 -1
- package/dist/lib/control-size.d.ts +1 -1
- package/dist/review/text-mark.d.ts +75 -0
- package/dist/review/text-mark.js +120 -0
- package/dist/styles/theme.css +56 -0
- 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
|
|
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
|
|
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" | "
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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,
|
package/dist/components/input.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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", {
|
package/dist/components/menu.js
CHANGED
|
@@ -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%)]
|
|
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,
|
|
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]
|
|
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
|
|
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 |
|
|
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" | "
|
|
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;
|
package/dist/components/table.js
CHANGED
|
@@ -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
|
|
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
|
|
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", {
|
package/dist/components/toast.js
CHANGED
|
@@ -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_.
|
|
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
|
|
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" })
|
package/dist/inspector/chrome.js
CHANGED
|
@@ -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
|
|
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
|
|
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",
|
package/dist/inspector/dock.js
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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" | "
|
|
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 };
|
package/dist/styles/theme.css
CHANGED
|
@@ -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.
|
|
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"
|