@stll/ui 0.34.6 → 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.
@@ -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({
@@ -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;
@@ -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"];
@@ -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.6",
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"