@frontend-engineering-system-lyz/ui 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) [2026] [Lyz]
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @frontend-engineering-system-lyz/ui
2
+
3
+ Shared React UI components for frontend-engineering-system.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @frontend-engineering-system-lyz/ui react react-dom
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```tsx
14
+ import { Button } from '@frontend-engineering-system-lyz/ui';
15
+ import '@frontend-engineering-system-lyz/ui/styles.css';
16
+
17
+ export function Example() {
18
+ return <Button>Save</Button>;
19
+ }
20
+ ```
@@ -0,0 +1,7 @@
1
+ import type { ComponentPropsWithoutRef } from 'react';
2
+ type BadgeVariant = 'neutral' | 'success' | 'warning' | 'danger' | 'brand';
3
+ type BadgeProps = ComponentPropsWithoutRef<'span'> & {
4
+ variant?: BadgeVariant;
5
+ };
6
+ export declare function Badge({ variant, className, ...props }: BadgeProps): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1,44 @@
1
+ import type { ComponentPropsWithoutRef } from 'react';
2
+ import { type ButtonSize, type ButtonVariant } from './button-styles';
3
+ /**
4
+ * Button 的 props。
5
+ *
6
+ * 前半部分 `ComponentPropsWithoutRef<'button'>` 的意思是:
7
+ * “把原生 `<button>` 支持的全部属性都继承过来”。
8
+ * 这样调用方可以直接写 `<Button disabled />`、`<Button aria-label="关闭" />`、
9
+ * `<Button onClick={...} />`,而不需要我们在这里把几十个原生属性逐个手写,
10
+ * 浏览器以后新增属性也能自动跟上。
11
+ *
12
+ * 为什么是 `WithoutRef`(去掉 ref)而不是 `ComponentProps`:
13
+ * `ref` 是 React 用来拿到真实 DOM 元素的特殊属性,需要配合 `forwardRef` 之类的写法才会生效。
14
+ * 当前这个 Button 并没有处理 `ref`,如果把它算进 props,就等于类型上“声称支持”,
15
+ * 实际调用方写了 `ref` 却没有任何效果。所以这里主动把 `ref` 排除掉。
16
+ * 将来若确实需要支持 ref,再改用 `forwardRef` 或 `ComponentPropsWithRef`。
17
+ *
18
+ * 末尾的 `& { ... }` 表示在原生属性之外,再补充 Button 自己新增的属性。
19
+ */
20
+ type ButtonProps = ComponentPropsWithoutRef<'button'> & {
21
+ /** 视觉样式,默认 `'primary'` */
22
+ variant?: ButtonVariant;
23
+ /** 尺寸,默认 `'md'` */
24
+ size?: ButtonSize;
25
+ };
26
+ /**
27
+ * 基础按钮组件:在原生 `<button>` 之上提供 variant / size 两套视觉配置,
28
+ * 其余原生属性(type、disabled、onClick、aria-* 等)全部原样透传给真实 DOM。
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * // 输入:默认用法
33
+ * <Button onClick={handleSave}>保存</Button>
34
+ * // 输出:variant=primary、size=md、type=button 的主色按钮
35
+ *
36
+ * // 输入:指定样式并透传原生属性
37
+ * <Button variant="danger" size="sm" disabled aria-label="删除">
38
+ * 删除
39
+ * </Button>
40
+ * // 输出:危险色小号按钮,且 disabled / aria-label 在真实 DOM 上正常生效
41
+ * ```
42
+ */
43
+ export declare function Button({ variant, size, className, type, ...props }: ButtonProps): import("react").JSX.Element;
44
+ export {};
package/dist/Card.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ type CardProps = ComponentPropsWithoutRef<'section'> & {
3
+ title?: string;
4
+ description?: string;
5
+ footer?: ReactNode;
6
+ };
7
+ export declare function Card({ title, description, footer, children, className, ...props }: CardProps): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ type PageTitleProps = {
2
+ title: string;
3
+ subtitle?: string;
4
+ };
5
+ export declare function PageTitle({ title, subtitle }: PageTitleProps): import("react").JSX.Element;
6
+ export {};
@@ -0,0 +1,9 @@
1
+ export type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost';
2
+ export type ButtonSize = 'sm' | 'md' | 'lg';
3
+ type ButtonClassNameOptions = {
4
+ variant?: ButtonVariant;
5
+ size?: ButtonSize;
6
+ className?: string;
7
+ };
8
+ export declare function getButtonClassName({ variant, size, className, }?: ButtonClassNameOptions): string;
9
+ export {};
@@ -0,0 +1,7 @@
1
+ import './styles.css';
2
+ export { Badge } from './Badge';
3
+ export { Button } from './Button';
4
+ export { Card } from './Card';
5
+ export { PageTitle } from './PageTitle';
6
+ export { getButtonClassName } from './button-styles';
7
+ export type { ButtonSize, ButtonVariant } from './button-styles';
package/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/Badge.tsx
3
+ var n = {
4
+ neutral: "bg-surface-100 text-surface-900",
5
+ success: "bg-success-50 text-success-700",
6
+ warning: "bg-warning-50 text-warning-700",
7
+ danger: "bg-danger-50 text-danger-700",
8
+ brand: "bg-brand-50 text-brand-700"
9
+ };
10
+ function r({ variant: t = "neutral", className: r, ...i }) {
11
+ return /* @__PURE__ */ e("span", {
12
+ className: [
13
+ "inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold",
14
+ n[t],
15
+ r
16
+ ].filter(Boolean).join(" "),
17
+ ...i
18
+ });
19
+ }
20
+ //#endregion
21
+ //#region src/button-styles.ts
22
+ var i = "inline-flex items-center justify-center rounded-md font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-60", a = {
23
+ primary: "bg-brand-600 text-surface-0 hover:bg-brand-700",
24
+ secondary: "bg-surface-100 text-surface-900 hover:bg-surface-50",
25
+ danger: "bg-danger-700 text-surface-0 hover:bg-danger-700/90",
26
+ ghost: "bg-transparent text-surface-900 hover:bg-surface-100"
27
+ }, o = {
28
+ sm: "px-3 py-1.5 text-sm",
29
+ md: "px-4 py-2 text-sm",
30
+ lg: "px-5 py-2.5 text-base"
31
+ };
32
+ function s({ variant: e = "primary", size: t = "md", className: n } = {}) {
33
+ return [
34
+ i,
35
+ a[e],
36
+ o[t],
37
+ n
38
+ ].filter(Boolean).join(" ");
39
+ }
40
+ //#endregion
41
+ //#region src/Button.tsx
42
+ function c({ variant: t = "primary", size: n = "md", className: r, type: i = "button", ...a }) {
43
+ return /* @__PURE__ */ e("button", {
44
+ className: s({
45
+ variant: t,
46
+ size: n,
47
+ className: r
48
+ }),
49
+ type: i,
50
+ ...a
51
+ });
52
+ }
53
+ //#endregion
54
+ //#region src/Card.tsx
55
+ function l({ title: n, description: r, footer: i, children: a, className: o, ...s }) {
56
+ return /* @__PURE__ */ t("section", {
57
+ className: ["rounded-(--radius-card) border border-surface-100 bg-surface-0 p-6 shadow-sm", o].filter(Boolean).join(" "),
58
+ ...s,
59
+ children: [
60
+ n || r ? /* @__PURE__ */ t("header", {
61
+ className: "mb-4",
62
+ children: [n ? /* @__PURE__ */ e("h2", {
63
+ className: "text-base font-semibold text-surface-900",
64
+ children: n
65
+ }) : null, r ? /* @__PURE__ */ e("p", {
66
+ className: "mt-1 text-sm text-surface-900/70",
67
+ children: r
68
+ }) : null]
69
+ }) : null,
70
+ a,
71
+ i ? /* @__PURE__ */ e("footer", {
72
+ className: "mt-4",
73
+ children: i
74
+ }) : null
75
+ ]
76
+ });
77
+ }
78
+ //#endregion
79
+ //#region src/PageTitle.tsx
80
+ function u({ title: n, subtitle: r }) {
81
+ return /* @__PURE__ */ t("section", {
82
+ className: "mb-6",
83
+ children: [/* @__PURE__ */ e("h1", {
84
+ className: "text-3xl font-semibold tracking-tight text-surface-900",
85
+ children: n
86
+ }), r ? /* @__PURE__ */ e("p", {
87
+ className: "mt-2 max-w-2xl text-sm leading-6 text-surface-900/70",
88
+ children: r
89
+ }) : null]
90
+ });
91
+ }
92
+ //#endregion
93
+ export { r as Badge, c as Button, l as Card, u as PageTitle, s as getButtonClassName };
@@ -0,0 +1,3 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:Inter, ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-md:.375rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-brand-50:#eff6ff;--color-brand-600:#2563eb;--color-brand-700:#1d4ed8;--color-surface-0:#fff;--color-surface-50:#f8fafc;--color-surface-100:#f1f5f9;--color-surface-900:#0f172a;--color-success-50:#ecfdf5;--color-success-700:#047857;--color-warning-50:#fffbeb;--color-warning-700:#b45309;--color-danger-50:#fef2f2;--color-danger-700:#b91c1c;--radius-card:.75rem}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.inline-flex{display:inline-flex}.max-w-2xl{max-width:var(--container-2xl)}.items-center{align-items:center}.justify-center{justify-content:center}.rounded-\(--radius-card\){border-radius:var(--radius-card)}.rounded-full{border-radius:2147483647px}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-surface-100{border-color:var(--color-surface-100)}.bg-brand-50{background-color:var(--color-brand-50)}.bg-brand-600{background-color:var(--color-brand-600)}.bg-danger-50{background-color:var(--color-danger-50)}.bg-danger-700{background-color:var(--color-danger-700)}.bg-success-50{background-color:var(--color-success-50)}.bg-surface-0{background-color:var(--color-surface-0)}.bg-surface-100{background-color:var(--color-surface-100)}.bg-transparent{background-color:#0000}.bg-warning-50{background-color:var(--color-warning-50)}.p-6{padding:calc(var(--spacing) * 6)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.text-brand-700{color:var(--color-brand-700)}.text-danger-700{color:var(--color-danger-700)}.text-success-700{color:var(--color-success-700)}.text-surface-0{color:var(--color-surface-0)}.text-surface-900{color:var(--color-surface-900)}.text-surface-900\/70{color:#0f172ab3}@supports (color:color-mix(in lab, red, red)){.text-surface-900\/70{color:color-mix(in oklab, var(--color-surface-900) 70%, transparent)}}.text-warning-700{color:var(--color-warning-700)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-brand-700:hover{background-color:var(--color-brand-700)}.hover\:bg-danger-700\/90:hover{background-color:#b91c1ce6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger-700\/90:hover{background-color:color-mix(in oklab, var(--color-danger-700) 90%, transparent)}}.hover\:bg-surface-50:hover{background-color:var(--color-surface-50)}.hover\:bg-surface-100:hover{background-color:var(--color-surface-100)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-60:disabled{opacity:.6}}:root{color:var(--color-surface-900);background:var(--color-surface-50);font-family:var(--font-sans)}*{box-sizing:border-box}body{margin:0}button,input,textarea,select{font:inherit}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
3
+ /*$vite$:1*/
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@frontend-engineering-system-lyz/ui",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./styles.css": "./dist/styles.css"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "sideEffects": [
22
+ "**/*.css"
23
+ ],
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org/",
26
+ "access": "public"
27
+ },
28
+ "peerDependencies": {
29
+ "react": "^19.2.7",
30
+ "react-dom": "^19.2.7"
31
+ },
32
+ "devDependencies": {
33
+ "@storybook/react-vite": "^10.6.1",
34
+ "@tailwindcss/vite": "^4.3.3",
35
+ "@types/react": "^19.2.17",
36
+ "@types/react-dom": "^19.2.3",
37
+ "@vitejs/plugin-react": "^6.1.0",
38
+ "eslint": "^10.6.0",
39
+ "eslint-plugin-storybook": "^10.6.1",
40
+ "react": "^19.2.7",
41
+ "react-dom": "^19.2.7",
42
+ "storybook": "^10.6.1",
43
+ "tailwindcss": "^4.3.3",
44
+ "typescript": "~6.0.2",
45
+ "vite": "^8.2.2",
46
+ "@frontend-engineering-system-lyz/eslint-config": "0.0.0",
47
+ "@frontend-engineering-system-lyz/ts-config": "0.0.0"
48
+ },
49
+ "scripts": {
50
+ "build": "pnpm build:js && pnpm build:types",
51
+ "build:js": "vite build",
52
+ "build:types": "tsc -p tsconfig.build.json",
53
+ "lint": "eslint .",
54
+ "typecheck": "tsc --noEmit",
55
+ "storybook": "storybook dev -p 6006",
56
+ "build-storybook": "storybook build",
57
+ "pack:check": "npm pack --dry-run"
58
+ }
59
+ }