@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.
Files changed (129) hide show
  1. package/README.md +25 -22
  2. package/dist/accordion.d.ts +4 -20
  3. package/dist/accordion.js +2 -2
  4. package/dist/action-bar.d.ts +1 -10
  5. package/dist/action-bar.js +6 -5
  6. package/dist/alert-dialog.d.ts +12 -52
  7. package/dist/alert-dialog.js +5 -5
  8. package/dist/alert.d.ts +13 -22
  9. package/dist/alert.js +13 -4
  10. package/dist/animate.d.ts +6 -49
  11. package/dist/animate.js +8 -13
  12. package/dist/aspect-ratio.d.ts +3 -8
  13. package/dist/autocomplete.d.ts +21 -88
  14. package/dist/autocomplete.js +3 -3
  15. package/dist/avatar.d.ts +7 -28
  16. package/dist/avatar.js +4 -4
  17. package/dist/badge.d.ts +3 -11
  18. package/dist/badge.js +6 -6
  19. package/dist/breadcrumb.d.ts +7 -31
  20. package/dist/button-group.d.ts +7 -20
  21. package/dist/button-group.js +5 -4
  22. package/dist/button.d.ts +4 -12
  23. package/dist/button.js +6 -6
  24. package/dist/card.d.ts +16 -33
  25. package/dist/card.js +27 -14
  26. package/dist/checkbox.d.ts +1 -6
  27. package/dist/checkbox.js +2 -2
  28. package/dist/collapsible.d.ts +3 -12
  29. package/dist/combobox.d.ts +18 -81
  30. package/dist/combobox.js +4 -4
  31. package/dist/context-menu.d.ts +17 -68
  32. package/dist/context-menu.js +14 -14
  33. package/dist/count.d.ts +1 -15
  34. package/dist/count.js +3 -2
  35. package/dist/dialog.d.ts +10 -41
  36. package/dist/dialog.js +5 -5
  37. package/dist/direction.d.ts +0 -1
  38. package/dist/drawer.d.ts +11 -44
  39. package/dist/drawer.js +1 -1
  40. package/dist/encrypted-text.d.ts +15 -14
  41. package/dist/encrypted-text.js +205 -66
  42. package/dist/field.d.ts +27 -30
  43. package/dist/field.js +36 -8
  44. package/dist/fieldset.d.ts +14 -0
  45. package/dist/fieldset.js +26 -0
  46. package/dist/film-grain-shader.d.ts +3 -4
  47. package/dist/film-grain-webgl.d.ts +2 -9
  48. package/dist/film-grain-webgl.js +4 -1
  49. package/dist/film-grain.d.ts +1 -11
  50. package/dist/form.d.ts +23 -42
  51. package/dist/form.js +7 -4
  52. package/dist/glyph-matrix.d.ts +25 -0
  53. package/dist/glyph-matrix.js +266 -0
  54. package/dist/gradient-reveal-text.d.ts +4 -17
  55. package/dist/gradient-reveal-text.js +8 -8
  56. package/dist/hooks/use-mobile.d.ts +2 -3
  57. package/dist/infinite-scroll.d.ts +1 -16
  58. package/dist/input-group.d.ts +11 -37
  59. package/dist/input-group.js +1 -1
  60. package/dist/input-otp.d.ts +4 -20
  61. package/dist/input-otp.js +2 -2
  62. package/dist/input.d.ts +3 -11
  63. package/dist/input.js +1 -1
  64. package/dist/item.d.ts +14 -51
  65. package/dist/item.js +17 -11
  66. package/dist/kbd.d.ts +3 -11
  67. package/dist/kbd.js +2 -2
  68. package/dist/label.d.ts +1 -6
  69. package/dist/label.js +1 -1
  70. package/dist/lib/focus.d.ts +3 -5
  71. package/dist/lib/internal-icons.d.ts +19 -22
  72. package/dist/lib/merge-refs.d.ts +9 -0
  73. package/dist/lib/merge-refs.js +16 -0
  74. package/dist/lib/utils.d.ts +3 -5
  75. package/dist/lib/utils.js +9 -1
  76. package/dist/masonry.d.ts +2 -16
  77. package/dist/masonry.js +5 -3
  78. package/dist/menu.d.ts +17 -65
  79. package/dist/menu.js +7 -7
  80. package/dist/menubar.d.ts +16 -55
  81. package/dist/menubar.js +1 -1
  82. package/dist/pagination.d.ts +9 -33
  83. package/dist/pagination.js +1 -1
  84. package/dist/popover.d.ts +9 -43
  85. package/dist/popover.js +1 -1
  86. package/dist/preview-card.d.ts +5 -25
  87. package/dist/preview-card.js +1 -1
  88. package/dist/progress.d.ts +5 -24
  89. package/dist/progress.js +2 -2
  90. package/dist/radio-group.d.ts +2 -9
  91. package/dist/radio-group.js +1 -1
  92. package/dist/radio.d.ts +2 -10
  93. package/dist/radio.js +2 -2
  94. package/dist/resizable.d.ts +43 -0
  95. package/dist/resizable.js +53 -0
  96. package/dist/scroll-area.d.ts +14 -13
  97. package/dist/scroll-area.js +26 -7
  98. package/dist/select.d.ts +15 -64
  99. package/dist/select.js +4 -4
  100. package/dist/separator.d.ts +1 -7
  101. package/dist/separator.js +1 -1
  102. package/dist/sidebar.d.ts +29 -126
  103. package/dist/sidebar.js +14 -14
  104. package/dist/skeleton.d.ts +1 -6
  105. package/dist/slider.d.ts +1 -14
  106. package/dist/slider.js +5 -5
  107. package/dist/spinner.d.ts +8 -6
  108. package/dist/spinner.js +24 -6
  109. package/dist/styles.css +575 -182
  110. package/dist/switch.d.ts +2 -9
  111. package/dist/switch.js +6 -6
  112. package/dist/table.d.ts +14 -34
  113. package/dist/table.js +40 -9
  114. package/dist/tabs.d.ts +5 -22
  115. package/dist/tabs.js +3 -3
  116. package/dist/textarea.d.ts +3 -12
  117. package/dist/textarea.js +1 -1
  118. package/dist/toast.d.ts +13 -39
  119. package/dist/toast.js +4 -4
  120. package/dist/toggle-group.d.ts +3 -19
  121. package/dist/toggle-group.js +16 -10
  122. package/dist/toggle.d.ts +3 -11
  123. package/dist/toggle.js +11 -6
  124. package/dist/tooltip.d.ts +6 -24
  125. package/dist/tooltip.js +10 -6
  126. package/dist/typewriter.d.ts +1 -14
  127. package/dist/video-text.d.ts +25 -0
  128. package/dist/video-text.js +147 -0
  129. 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 = 4, align = "center", alignOffset = 0, anchor, children, ...props }) {
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__ */ jsx(Tooltip$1.Popup, {
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 origin-(--transform-origin) rounded-sm px-3 py-1.5 text-xs", className),
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
  }
@@ -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.15.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.4",
89
- "@base-ui/react": "^1.6.0",
90
- "@biomejs/biome": "2.5.2",
91
- "@changesets/cli": "^2.27.0",
92
- "@storybook/addon-a11y": "~10.4.0",
93
- "@storybook/addon-docs": "~10.4.0",
94
- "@storybook/react-vite": "~10.4.0",
95
- "@tailwindcss/vite": "^4.2.1",
96
- "@testing-library/dom": "^10.4.1",
97
- "@testing-library/jest-dom": "^6.9.1",
98
- "@testing-library/react": "^16.3.2",
99
- "@testing-library/user-event": "^14.6.1",
100
- "@types/react": "^19",
101
- "@types/react-dom": "^19",
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.4.2",
106
- "jsdom": "^29.1.1",
107
- "motion": "^12.31.0",
108
- "publint": "^0.3.21",
109
- "react": "^19.2.0",
110
- "react-dom": "^19.2.0",
111
- "react-hook-form": "^7.66.0",
112
- "storybook": "~10.4.0",
113
- "tailwind-merge": "^3.4.0",
114
- "tailwindcss": "^4.2.1",
115
- "tsdown": "0.21.10",
116
- "typescript": "^5.7.0",
117
- "vite": "^7.3.1",
118
- "vitest": "^4.1.7"
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
+ }