@waveso/ui 0.15.0 → 0.16.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/README.md +25 -22
- package/dist/accordion.d.ts +4 -20
- package/dist/accordion.js +2 -2
- package/dist/action-bar.d.ts +1 -10
- package/dist/action-bar.js +6 -5
- package/dist/alert-dialog.d.ts +12 -52
- package/dist/alert-dialog.js +5 -5
- package/dist/alert.d.ts +13 -22
- package/dist/alert.js +13 -4
- package/dist/animate.d.ts +6 -49
- package/dist/animate.js +8 -13
- package/dist/aspect-ratio.d.ts +3 -8
- package/dist/autocomplete.d.ts +21 -88
- package/dist/autocomplete.js +3 -3
- package/dist/avatar.d.ts +7 -28
- package/dist/avatar.js +4 -4
- package/dist/badge.d.ts +3 -11
- package/dist/badge.js +6 -6
- package/dist/breadcrumb.d.ts +7 -31
- package/dist/button-group.d.ts +7 -20
- package/dist/button-group.js +5 -4
- package/dist/button.d.ts +4 -12
- package/dist/button.js +6 -6
- package/dist/card.d.ts +16 -33
- package/dist/card.js +27 -14
- package/dist/checkbox.d.ts +1 -6
- package/dist/checkbox.js +2 -2
- package/dist/collapsible.d.ts +3 -12
- package/dist/combobox.d.ts +18 -81
- package/dist/combobox.js +4 -4
- package/dist/context-menu.d.ts +17 -68
- package/dist/context-menu.js +14 -14
- package/dist/count.d.ts +1 -15
- package/dist/count.js +3 -2
- package/dist/dialog.d.ts +10 -41
- package/dist/dialog.js +5 -5
- package/dist/direction.d.ts +0 -1
- package/dist/drawer.d.ts +11 -44
- package/dist/drawer.js +1 -1
- package/dist/encrypted-text.d.ts +15 -14
- package/dist/encrypted-text.js +205 -66
- package/dist/field.d.ts +27 -30
- package/dist/field.js +36 -8
- package/dist/fieldset.d.ts +14 -0
- package/dist/fieldset.js +26 -0
- package/dist/film-grain-shader.d.ts +3 -4
- package/dist/film-grain-webgl.d.ts +2 -9
- package/dist/film-grain-webgl.js +4 -1
- package/dist/film-grain.d.ts +1 -11
- package/dist/form.d.ts +23 -42
- package/dist/form.js +7 -4
- package/dist/glyph-matrix.d.ts +25 -0
- package/dist/glyph-matrix.js +266 -0
- package/dist/gradient-reveal-text.d.ts +4 -17
- package/dist/gradient-reveal-text.js +8 -8
- package/dist/hooks/use-mobile.d.ts +2 -3
- package/dist/infinite-scroll.d.ts +1 -16
- package/dist/input-group.d.ts +11 -37
- package/dist/input-group.js +1 -1
- package/dist/input-otp.d.ts +4 -20
- package/dist/input-otp.js +2 -2
- package/dist/input.d.ts +3 -11
- package/dist/input.js +1 -1
- package/dist/item.d.ts +14 -51
- package/dist/item.js +17 -11
- package/dist/kbd.d.ts +3 -11
- package/dist/kbd.js +2 -2
- package/dist/label.d.ts +1 -6
- package/dist/label.js +1 -1
- package/dist/lib/focus.d.ts +3 -5
- package/dist/lib/internal-icons.d.ts +19 -22
- package/dist/lib/merge-refs.d.ts +9 -0
- package/dist/lib/merge-refs.js +16 -0
- package/dist/lib/utils.d.ts +3 -5
- package/dist/lib/utils.js +9 -1
- package/dist/masonry.d.ts +2 -16
- package/dist/masonry.js +5 -3
- package/dist/menu.d.ts +17 -65
- package/dist/menu.js +7 -7
- package/dist/menubar.d.ts +16 -55
- package/dist/menubar.js +1 -1
- package/dist/pagination.d.ts +9 -33
- package/dist/pagination.js +1 -1
- package/dist/popover.d.ts +9 -43
- package/dist/popover.js +1 -1
- package/dist/preview-card.d.ts +5 -25
- package/dist/preview-card.js +1 -1
- package/dist/progress.d.ts +5 -24
- package/dist/progress.js +2 -2
- package/dist/radio-group.d.ts +2 -9
- package/dist/radio-group.js +1 -1
- package/dist/radio.d.ts +2 -10
- package/dist/radio.js +2 -2
- package/dist/resizable.d.ts +43 -0
- package/dist/resizable.js +53 -0
- package/dist/scroll-area.d.ts +14 -13
- package/dist/scroll-area.js +26 -7
- package/dist/select.d.ts +15 -64
- package/dist/select.js +4 -4
- package/dist/separator.d.ts +1 -7
- package/dist/separator.js +1 -1
- package/dist/sidebar.d.ts +29 -126
- package/dist/sidebar.js +14 -14
- package/dist/skeleton.d.ts +1 -6
- package/dist/slider.d.ts +1 -14
- package/dist/slider.js +5 -5
- package/dist/spinner.d.ts +8 -6
- package/dist/spinner.js +24 -6
- package/dist/styles.css +575 -182
- package/dist/switch.d.ts +2 -9
- package/dist/switch.js +6 -6
- package/dist/table.d.ts +14 -34
- package/dist/table.js +40 -9
- package/dist/tabs.d.ts +5 -22
- package/dist/tabs.js +3 -3
- package/dist/textarea.d.ts +3 -12
- package/dist/textarea.js +1 -1
- package/dist/toast.d.ts +13 -39
- package/dist/toast.js +4 -4
- package/dist/toggle-group.d.ts +3 -19
- package/dist/toggle-group.js +16 -10
- package/dist/toggle.d.ts +3 -11
- package/dist/toggle.js +11 -6
- package/dist/tooltip.d.ts +6 -24
- package/dist/tooltip.js +10 -6
- package/dist/typewriter.d.ts +1 -14
- package/dist/video-text.d.ts +25 -0
- package/dist/video-text.js +147 -0
- package/package.json +57 -51
package/dist/tooltip.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn } from "./lib/utils.js";
|
|
3
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
|
|
6
6
|
//#region src/tooltip.tsx
|
|
@@ -41,20 +41,24 @@ function TooltipTrigger({ children, ...props }) {
|
|
|
41
41
|
children
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
-
function TooltipContent({ className, positionerClassName, side = "top", sideOffset
|
|
44
|
+
function TooltipContent({ className, positionerClassName, side = "top", sideOffset, align = "center", alignOffset = 0, anchor, arrow = false, children, ...props }) {
|
|
45
|
+
const resolvedSideOffset = sideOffset ?? (arrow ? 12 : 8);
|
|
45
46
|
return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, {
|
|
46
47
|
"data-slot": "tooltip-positioner",
|
|
47
48
|
anchor,
|
|
48
49
|
align,
|
|
49
50
|
alignOffset,
|
|
50
51
|
side,
|
|
51
|
-
sideOffset,
|
|
52
|
+
sideOffset: resolvedSideOffset,
|
|
52
53
|
className: cn("isolate z-50", positionerClassName),
|
|
53
|
-
children: /* @__PURE__ */
|
|
54
|
+
children: /* @__PURE__ */ jsxs(Tooltip$1.Popup, {
|
|
54
55
|
"data-slot": "tooltip-content",
|
|
55
|
-
className: cn("motion-pop-md bg-surface-inverse text-contrast-inverse z-50 w-fit max-w-xs
|
|
56
|
+
className: cn("motion-pop-md bg-surface-inverse text-contrast-inverse z-50 w-fit max-w-xs rounded-sm px-3 py-1.5 text-xs", "inline-flex items-center gap-1.5 has-data-[slot=kbd]:pe-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-lg", className),
|
|
56
57
|
...props,
|
|
57
|
-
children
|
|
58
|
+
children: [children, arrow ? /* @__PURE__ */ jsx(Tooltip$1.Arrow, {
|
|
59
|
+
"data-slot": "tooltip-arrow",
|
|
60
|
+
className: "bg-surface-inverse size-2.5 rounded-[2px] translate-y-[calc(-50%-2px)] rotate-45 data-[side=bottom]:top-1 data-[side=inline-end]:-start-1 data-[side=inline-end]:translate-x-[1.5px] rtl:data-[side=inline-end]:-translate-x-[1.5px] data-[side=inline-end]:translate-y-0 data-[side=inline-start]:-end-1 data-[side=inline-start]:translate-x-[-1.5px] rtl:data-[side=inline-start]:-translate-x-[-1.5px] data-[side=inline-start]:translate-y-0 data-[side=left]:-right-1 data-[side=left]:translate-x-[-1.5px] rtl:data-[side=left]:-translate-x-[-1.5px] data-[side=left]:translate-y-0 data-[side=right]:-left-1 data-[side=right]:translate-x-[1.5px] rtl:data-[side=right]:-translate-x-[1.5px] data-[side=right]:translate-y-0 data-[side=top]:-bottom-2.5"
|
|
61
|
+
}) : null]
|
|
58
62
|
})
|
|
59
63
|
}) });
|
|
60
64
|
}
|
package/dist/typewriter.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
1
|
import { ReactElement } from "react";
|
|
3
|
-
|
|
4
2
|
//#region src/typewriter.d.ts
|
|
5
3
|
interface TextSegment {
|
|
6
4
|
text: string;
|
|
@@ -63,17 +61,6 @@ interface TypewriterProps {
|
|
|
63
61
|
* </Typewriter>
|
|
64
62
|
* ```
|
|
65
63
|
*/
|
|
66
|
-
declare function Typewriter({
|
|
67
|
-
text,
|
|
68
|
-
children,
|
|
69
|
-
speed,
|
|
70
|
-
delay,
|
|
71
|
-
cursor,
|
|
72
|
-
cursorChar,
|
|
73
|
-
onView,
|
|
74
|
-
once,
|
|
75
|
-
variant,
|
|
76
|
-
smoothDuration
|
|
77
|
-
}: TypewriterProps): _$react_jsx_runtime0.JSX.Element;
|
|
64
|
+
declare function Typewriter({ text, children, speed, delay, cursor, cursorChar, onView, once, variant, smoothDuration }: TypewriterProps): import("react").JSX.Element;
|
|
78
65
|
//#endregion
|
|
79
66
|
export { type TextSegment, Typewriter, type TypewriterProps };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
3
|
+
//#region src/video-text.d.ts
|
|
4
|
+
interface VideoTextProps extends Omit<useRender.ComponentProps<"div">, "children"> {
|
|
5
|
+
/** Video source URL. */
|
|
6
|
+
src: string;
|
|
7
|
+
/** The text the video shows through. Rendered as real, selectable text. */
|
|
8
|
+
text: string;
|
|
9
|
+
/** Image shown in the letters until the video can play. */
|
|
10
|
+
poster?: string;
|
|
11
|
+
autoPlay?: boolean;
|
|
12
|
+
muted?: boolean;
|
|
13
|
+
loop?: boolean;
|
|
14
|
+
preload?: "auto" | "metadata" | "none";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Text cut out of a playing video. The text is real: it wraps, aligns and
|
|
18
|
+
* takes its font from the usual classes (`text-*`, `font-*`, web fonts
|
|
19
|
+
* included), and `render` can make it a heading. Each word is measured and
|
|
20
|
+
* copied into an SVG clip path that the video is clipped to. Until that's
|
|
21
|
+
* measured, and while the video loads, the letters show in the text color.
|
|
22
|
+
*/
|
|
23
|
+
declare function VideoText({ src, text, poster, autoPlay, muted, loop, preload, className, render, ref, ...props }: VideoTextProps): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { VideoText, type VideoTextProps };
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./lib/utils.js";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { mergeProps } from "@base-ui/react/merge-props";
|
|
6
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
7
|
+
//#region src/video-text.tsx
|
|
8
|
+
function isSameLayout(a, b) {
|
|
9
|
+
return a.length === b.length && a.every((box, index) => box.x === b[index]?.x && box.y === b[index]?.y);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Text cut out of a playing video. The text is real: it wraps, aligns and
|
|
13
|
+
* takes its font from the usual classes (`text-*`, `font-*`, web fonts
|
|
14
|
+
* included), and `render` can make it a heading. Each word is measured and
|
|
15
|
+
* copied into an SVG clip path that the video is clipped to. Until that's
|
|
16
|
+
* measured, and while the video loads, the letters show in the text color.
|
|
17
|
+
*/
|
|
18
|
+
function VideoText({ src, text, poster, autoPlay = true, muted = true, loop = true, preload = "auto", className, render, ref, ...props }) {
|
|
19
|
+
const rootRef = React.useRef(null);
|
|
20
|
+
const labelRef = React.useRef(null);
|
|
21
|
+
const baselineRef = React.useRef(null);
|
|
22
|
+
const videoRef = React.useRef(null);
|
|
23
|
+
const [boxes, setBoxes] = React.useState([]);
|
|
24
|
+
const clipId = `video-text-${React.useId().replace(/[^\w-]/g, "")}`;
|
|
25
|
+
const clipPath = `url(#${clipId})`;
|
|
26
|
+
const words = React.useMemo(() => text.split(/\s+/).filter(Boolean), [text]);
|
|
27
|
+
const isMeasured = words.length > 0 && boxes.length === words.length;
|
|
28
|
+
React.useLayoutEffect(() => {
|
|
29
|
+
const root = rootRef.current;
|
|
30
|
+
const label = labelRef.current;
|
|
31
|
+
const baseline = baselineRef.current;
|
|
32
|
+
if (!root || !label || !baseline) return;
|
|
33
|
+
const measure = () => {
|
|
34
|
+
const rootRect = root.getBoundingClientRect();
|
|
35
|
+
const scale = root.offsetWidth ? rootRect.width / root.offsetWidth : 1;
|
|
36
|
+
const left = rootRect.left + root.clientLeft * scale;
|
|
37
|
+
const top = rootRect.top + root.clientTop * scale;
|
|
38
|
+
const spans = label.querySelectorAll("[data-slot=\"video-text-word\"]");
|
|
39
|
+
const first = spans[0]?.getBoundingClientRect();
|
|
40
|
+
const offset = first ? baseline.getBoundingClientRect().top - first.top : 0;
|
|
41
|
+
const next = words.map((_, index) => {
|
|
42
|
+
const rect = spans[index]?.getBoundingClientRect();
|
|
43
|
+
return rect ? {
|
|
44
|
+
x: (rect.left - left) / scale,
|
|
45
|
+
y: (rect.top + offset - top) / scale
|
|
46
|
+
} : {
|
|
47
|
+
x: 0,
|
|
48
|
+
y: 0
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
setBoxes((prev) => isSameLayout(prev, next) ? prev : next);
|
|
52
|
+
};
|
|
53
|
+
measure();
|
|
54
|
+
const observer = new ResizeObserver(measure);
|
|
55
|
+
observer.observe(root);
|
|
56
|
+
document.fonts.addEventListener("loadingdone", measure);
|
|
57
|
+
return () => {
|
|
58
|
+
observer.disconnect();
|
|
59
|
+
document.fonts.removeEventListener("loadingdone", measure);
|
|
60
|
+
};
|
|
61
|
+
}, [words]);
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
const video = videoRef.current;
|
|
64
|
+
if (!video) return;
|
|
65
|
+
const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
66
|
+
const hold = () => {
|
|
67
|
+
if (reducedMotion.matches) video.pause();
|
|
68
|
+
};
|
|
69
|
+
const sync = () => {
|
|
70
|
+
if (reducedMotion.matches) video.pause();
|
|
71
|
+
else if (video.autoplay) video.play().catch(() => {});
|
|
72
|
+
};
|
|
73
|
+
hold();
|
|
74
|
+
video.addEventListener("play", hold);
|
|
75
|
+
reducedMotion.addEventListener("change", sync);
|
|
76
|
+
return () => {
|
|
77
|
+
video.removeEventListener("play", hold);
|
|
78
|
+
reducedMotion.removeEventListener("change", sync);
|
|
79
|
+
};
|
|
80
|
+
}, []);
|
|
81
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
82
|
+
/* @__PURE__ */ jsxs("span", {
|
|
83
|
+
ref: labelRef,
|
|
84
|
+
"data-slot": "video-text-label",
|
|
85
|
+
className: cn(isMeasured && "text-transparent"),
|
|
86
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
87
|
+
ref: baselineRef,
|
|
88
|
+
"data-slot": "video-text-baseline",
|
|
89
|
+
className: "inline-block size-0 align-baseline"
|
|
90
|
+
}), words.map((word, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [index > 0 && " ", /* @__PURE__ */ jsx("span", {
|
|
91
|
+
"data-slot": "video-text-word",
|
|
92
|
+
children: word
|
|
93
|
+
})] }, `${index}-${word}`))]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ jsx("svg", {
|
|
96
|
+
"data-slot": "video-text-defs",
|
|
97
|
+
"aria-hidden": "true",
|
|
98
|
+
className: "absolute size-0 overflow-hidden [direction:ltr]",
|
|
99
|
+
children: /* @__PURE__ */ jsx("clipPath", {
|
|
100
|
+
id: clipId,
|
|
101
|
+
"data-slot": "video-text-clip",
|
|
102
|
+
clipPathUnits: "userSpaceOnUse",
|
|
103
|
+
children: words.map((word, index) => /* @__PURE__ */ jsx("text", {
|
|
104
|
+
"data-slot": "video-text-clip-word",
|
|
105
|
+
x: boxes[index]?.x ?? 0,
|
|
106
|
+
y: boxes[index]?.y ?? 0,
|
|
107
|
+
children: word
|
|
108
|
+
}, `${index}-${word}`))
|
|
109
|
+
})
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ jsx("span", {
|
|
112
|
+
"data-slot": "video-text-mask",
|
|
113
|
+
"aria-hidden": "true",
|
|
114
|
+
className: cn("pointer-events-none absolute inset-0 bg-current", !isMeasured && "invisible"),
|
|
115
|
+
style: {
|
|
116
|
+
clipPath,
|
|
117
|
+
WebkitClipPath: clipPath
|
|
118
|
+
},
|
|
119
|
+
children: /* @__PURE__ */ jsx("video", {
|
|
120
|
+
ref: videoRef,
|
|
121
|
+
"data-slot": "video-text-video",
|
|
122
|
+
className: "block size-full object-cover",
|
|
123
|
+
src,
|
|
124
|
+
poster,
|
|
125
|
+
autoPlay,
|
|
126
|
+
muted,
|
|
127
|
+
loop,
|
|
128
|
+
preload,
|
|
129
|
+
playsInline: true,
|
|
130
|
+
disablePictureInPicture: true,
|
|
131
|
+
disableRemotePlayback: true
|
|
132
|
+
})
|
|
133
|
+
})
|
|
134
|
+
] });
|
|
135
|
+
return useRender({
|
|
136
|
+
defaultTagName: "div",
|
|
137
|
+
ref: ref ? [rootRef, ref] : rootRef,
|
|
138
|
+
render,
|
|
139
|
+
props: mergeProps({
|
|
140
|
+
className: cn("relative font-sans font-bold", className),
|
|
141
|
+
children: content
|
|
142
|
+
}, props),
|
|
143
|
+
state: { slot: "video-text" }
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { VideoText };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@waveso/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Wave UI component library built on Base UI and Tailwind CSS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -42,34 +42,16 @@
|
|
|
42
42
|
"dist",
|
|
43
43
|
"package.json"
|
|
44
44
|
],
|
|
45
|
-
"scripts": {
|
|
46
|
-
"build": "tsdown",
|
|
47
|
-
"dev": "tsdown --watch",
|
|
48
|
-
"typecheck": "tsc --noEmit",
|
|
49
|
-
"lint": "biome check",
|
|
50
|
-
"lint:fix": "biome check --write",
|
|
51
|
-
"format": "biome format --write",
|
|
52
|
-
"test": "vitest run --passWithNoTests",
|
|
53
|
-
"test:watch": "vitest",
|
|
54
|
-
"check:package": "publint && attw --pack . --ignore-rules no-resolution",
|
|
55
|
-
"clean": "rm -rf dist",
|
|
56
|
-
"storybook": "storybook dev -p 6006",
|
|
57
|
-
"build-storybook": "storybook build",
|
|
58
|
-
"chromatic": "chromatic --exit-zero-on-changes",
|
|
59
|
-
"prepublishOnly": "npm run build",
|
|
60
|
-
"changeset": "changeset",
|
|
61
|
-
"version": "changeset version",
|
|
62
|
-
"release": "npm run build && changeset publish"
|
|
63
|
-
},
|
|
64
45
|
"peerDependencies": {
|
|
65
46
|
"@base-ui/react": "^1.6.0",
|
|
66
47
|
"class-variance-authority": "^0.7.0",
|
|
67
48
|
"clsx": "^2.0.0",
|
|
68
49
|
"input-otp": "^1.4.0",
|
|
69
|
-
"motion": "^12.0.0",
|
|
50
|
+
"motion": "^12.0.0 || ^13.0.0",
|
|
70
51
|
"react": "^19.0.0",
|
|
71
52
|
"react-dom": "^19.0.0",
|
|
72
53
|
"react-hook-form": "^7.0.0",
|
|
54
|
+
"react-resizable-panels": "^4.14.0",
|
|
73
55
|
"tailwind-merge": "^3.0.0",
|
|
74
56
|
"tailwindcss": "^4.0.0"
|
|
75
57
|
},
|
|
@@ -82,39 +64,63 @@
|
|
|
82
64
|
},
|
|
83
65
|
"react-hook-form": {
|
|
84
66
|
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"react-resizable-panels": {
|
|
69
|
+
"optional": true
|
|
85
70
|
}
|
|
86
71
|
},
|
|
87
72
|
"devDependencies": {
|
|
88
|
-
"@arethetypeswrong/cli": "^0.18.
|
|
89
|
-
"@base-ui/react": "^1.
|
|
90
|
-
"@
|
|
91
|
-
"@
|
|
92
|
-
"@storybook/addon-
|
|
93
|
-
"@storybook/
|
|
94
|
-
"@
|
|
95
|
-
"@
|
|
96
|
-
"@testing-library/dom": "^
|
|
97
|
-
"@testing-library/
|
|
98
|
-
"@testing-library/
|
|
99
|
-
"@
|
|
100
|
-
"@types/react": "^19",
|
|
101
|
-
"
|
|
102
|
-
"chromatic": "^18.0.1",
|
|
73
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
74
|
+
"@base-ui/react": "^1.8.0",
|
|
75
|
+
"@changesets/cli": "^3.0.3",
|
|
76
|
+
"@storybook/addon-a11y": "~10.6.0",
|
|
77
|
+
"@storybook/addon-docs": "~10.6.0",
|
|
78
|
+
"@storybook/react-vite": "~10.6.0",
|
|
79
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
80
|
+
"@testing-library/dom": "^10.4.2",
|
|
81
|
+
"@testing-library/jest-dom": "^7.0.1",
|
|
82
|
+
"@testing-library/react": "^16.3.3",
|
|
83
|
+
"@testing-library/user-event": "^14.6.7",
|
|
84
|
+
"@types/react": "^19.3.0",
|
|
85
|
+
"@types/react-dom": "^19.3.0",
|
|
86
|
+
"chromatic": "^18.9.5",
|
|
103
87
|
"class-variance-authority": "^0.7.1",
|
|
104
88
|
"clsx": "^2.1.1",
|
|
105
|
-
"input-otp": "^1.
|
|
106
|
-
"jsdom": "^
|
|
107
|
-
"motion": "^
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"react
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
89
|
+
"input-otp": "^1.5.0",
|
|
90
|
+
"jsdom": "^30.1.1",
|
|
91
|
+
"motion": "^13.4.4",
|
|
92
|
+
"oxfmt": "0.71.0",
|
|
93
|
+
"oxlint": "^1.86.0",
|
|
94
|
+
"publint": "^0.3.24",
|
|
95
|
+
"react": "^19.3.0",
|
|
96
|
+
"react-dom": "^19.3.0",
|
|
97
|
+
"react-hook-form": "^7.89.0",
|
|
98
|
+
"react-resizable-panels": "^4.14.6",
|
|
99
|
+
"storybook": "~10.6.0",
|
|
100
|
+
"tailwind-merge": "^3.7.0",
|
|
101
|
+
"tailwindcss": "^4.3.3",
|
|
102
|
+
"tsdown": "0.23.0",
|
|
103
|
+
"typescript": "^7.0.2",
|
|
104
|
+
"vite": "^8.3.1",
|
|
105
|
+
"vitest": "^5.0.2"
|
|
106
|
+
},
|
|
107
|
+
"scripts": {
|
|
108
|
+
"build": "tsdown",
|
|
109
|
+
"dev": "tsdown --watch",
|
|
110
|
+
"typecheck": "tsc --noEmit",
|
|
111
|
+
"lint": "oxlint",
|
|
112
|
+
"lint:fix": "oxlint --fix",
|
|
113
|
+
"format": "oxfmt --write '**/*.ts' '**/*.tsx'",
|
|
114
|
+
"format:check": "oxfmt --check '**/*.ts' '**/*.tsx'",
|
|
115
|
+
"test": "vitest run --passWithNoTests",
|
|
116
|
+
"test:watch": "vitest",
|
|
117
|
+
"check:package": "publint && attw --pack . --ignore-rules no-resolution",
|
|
118
|
+
"clean": "rm -rf dist",
|
|
119
|
+
"storybook": "storybook dev -p 6006",
|
|
120
|
+
"build-storybook": "storybook build",
|
|
121
|
+
"chromatic": "chromatic --exit-zero-on-changes",
|
|
122
|
+
"changeset": "changeset",
|
|
123
|
+
"version": "changeset version",
|
|
124
|
+
"release": "pnpm build && changeset publish"
|
|
119
125
|
}
|
|
120
|
-
}
|
|
126
|
+
}
|