diff --git a/apps/ui-site/package.json b/apps/ui-site/package.json
index bd6b25e..345fff4 100644
--- a/apps/ui-site/package.json
+++ b/apps/ui-site/package.json
@@ -12,7 +12,7 @@
"dependencies": {
"react": "^19.2.0",
"react-dom": "^19.2.0",
- "@defgov/ui-headless": "workspace:*"
+ "@defgov/ui": "workspace:*"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
diff --git a/apps/ui-site/src/App.tsx b/apps/ui-site/src/App.tsx
index 5f9a8df..7340ec4 100644
--- a/apps/ui-site/src/App.tsx
+++ b/apps/ui-site/src/App.tsx
@@ -1,16 +1,10 @@
import { ThemeProvider } from "@defgov/ui";
import { ButtonGallery } from "./gallery/ButtonGallery";
-import { CheckboxGallery } from "./gallery/CheckboxGallery";
-import { RadioGallery } from "./gallery/RadioGallery";
-import { TooltipGallery } from "./gallery/TootipGallery";
const App = () => {
return (
-
-
-
);
};
diff --git a/apps/ui-site/src/gallery/CheckboxGallery.tsx b/apps/ui-site/src/gallery/CheckboxGallery.tsx
deleted file mode 100644
index cff234d..0000000
--- a/apps/ui-site/src/gallery/CheckboxGallery.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Checkbox } from "@defgov/ui";
-import { InnerWrap } from "../common/InnerWrap";
-import { OuterWrap } from "../common/OuterWrap";
-
-export const CheckboxGallery = () => {
- return (
-
-
- Apple
- Apple
-
-
- );
-};
diff --git a/apps/ui-site/src/gallery/RadioGallery.tsx b/apps/ui-site/src/gallery/RadioGallery.tsx
deleted file mode 100644
index c299c50..0000000
--- a/apps/ui-site/src/gallery/RadioGallery.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Radio, RadioGroup } from "@defgov/ui";
-import { InnerWrap } from "../common/InnerWrap";
-import { OuterWrap } from "../common/OuterWrap";
-
-export const RadioGallery = () => {
- return (
-
-
-
- Apple
- Orange
-
-
-
-
- Apple
- Orange
-
-
-
- );
-};
diff --git a/apps/ui-site/src/gallery/TootipGallery.tsx b/apps/ui-site/src/gallery/TootipGallery.tsx
deleted file mode 100644
index ca5ce66..0000000
--- a/apps/ui-site/src/gallery/TootipGallery.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Button, CutSvg, Tooltip } from "@defgov/ui";
-import { OuterWrap } from "../common/OuterWrap";
-import { InnerWrap } from "../common/InnerWrap";
-
-export const TooltipGallery = () => {
- return (
-
-
-
- } iconOnly={true}>
-
-
-
- );
-};
diff --git a/package.json b/package.json
index cfd4d8d..73fba74 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
"devDependencies": {
"turbo": "^2.8.0"
},
- "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
+ "packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be",
"engines": {
"node": ">=20"
}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index d3a76ee..da6037c 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -40,7 +40,7 @@
"vite-plugin-dts": "^4.5.4"
},
"dependencies": {
- "@floating-ui/react": "^0.27.18",
+ "@base-ui/react": "^1.3.0",
"@tailwindcss/vite": "^4.2.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
diff --git a/packages/ui/src/lv1-fundamental/Box/Box.tsx b/packages/ui/src/common/Box.tsx
similarity index 88%
rename from packages/ui/src/lv1-fundamental/Box/Box.tsx
rename to packages/ui/src/common/Box.tsx
index 421ea5f..35fb579 100644
--- a/packages/ui/src/lv1-fundamental/Box/Box.tsx
+++ b/packages/ui/src/common/Box.tsx
@@ -1,8 +1,7 @@
import React from "react";
-import { useThemeContext } from "../ThemeProvider/useThemeContext";
+import { useThemeContext } from "./ThemeProvider/useThemeContext";
import { cn } from "tailwind-variants";
import type { CommonProps } from "@/common/CommonProps";
-import { boxRoot } from "./Box.recipe";
// 别名<约束>=值
// 千万不要 C = As extend React.ElementType,这样子连等号,会切断推导
@@ -29,7 +28,7 @@ const Box = (
throw new Error("Box must be used within a ThemeProvider");
}
- const boxRootClass = cn(themeClass, boxRoot(), className);
+ const boxRootClass = cn(themeClass, className);
return (
diff --git a/packages/ui/src/lv1-fundamental/Slot/Slot.tsx b/packages/ui/src/common/Slot.tsx
similarity index 100%
rename from packages/ui/src/lv1-fundamental/Slot/Slot.tsx
rename to packages/ui/src/common/Slot.tsx
diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeContext.ts b/packages/ui/src/common/ThemeProvider/ThemeContext.ts
similarity index 100%
rename from packages/ui/src/lv1-fundamental/ThemeProvider/ThemeContext.ts
rename to packages/ui/src/common/ThemeProvider/ThemeContext.ts
diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeProvider.tsx b/packages/ui/src/common/ThemeProvider/ThemeProvider.tsx
similarity index 100%
rename from packages/ui/src/lv1-fundamental/ThemeProvider/ThemeProvider.tsx
rename to packages/ui/src/common/ThemeProvider/ThemeProvider.tsx
diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/useThemeContext.ts b/packages/ui/src/common/ThemeProvider/useThemeContext.ts
similarity index 100%
rename from packages/ui/src/lv1-fundamental/ThemeProvider/useThemeContext.ts
rename to packages/ui/src/common/ThemeProvider/useThemeContext.ts
diff --git a/packages/ui/src/component/button/Button.tsx b/packages/ui/src/component/button/Button.tsx
new file mode 100644
index 0000000..9dd79eb
--- /dev/null
+++ b/packages/ui/src/component/button/Button.tsx
@@ -0,0 +1,45 @@
+"use client";
+import * as BUI from "@base-ui/react/button";
+import { cn } from "tailwind-variants";
+import type { CommonProps } from "@/common/CommonProps";
+import { itemRootRecipe } from "@/styles/recipe/ItemRoot.recipe";
+import { variantRecipe } from "@/styles/recipe/variant.recipe";
+import type { ReactNode } from "react";
+import { inlineRootRecipe } from "@/styles/recipe/IinlineRoot.recipe";
+
+type ButtonProps = CommonProps & {
+ size?: "md" | "lg" | "xl";
+ variant?: "filled" | "outline" | "subtle";
+ loading?: boolean;
+ icon?: ReactNode;
+ iconOnly?: boolean;
+ hideIcon?: boolean;
+};
+
+export const Button = (props: ButtonProps) => {
+ const {
+ className,
+ children,
+ size = "md",
+ variant = "filled",
+ loading,
+ disabled,
+ icon,
+ iconOnly,
+ hideIcon,
+ } = props;
+
+ const buttonCls = cn(
+ itemRootRecipe({ size }),
+ variantRecipe({ variant, disabled: loading || disabled }),
+ className,
+ );
+
+ const iconCls = cn(inlineRootRecipe({ size, iconOnly }));
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index 2323754..13a4d4c 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -23,14 +23,14 @@ export * from './assets/svg/VolumeLowSvg.tsx';
export * from './assets/svg/VolumeMediumSvg.tsx';
export * from './assets/svg/VolumeMuteSvg.tsx';
export * from './common/CommonProps.ts';
-export * from './lv1-fundamental/Box/Box.tsx';
+export * from './common/Box.tsx';
export * from './lv1-fundamental/Slot/Slot.tsx';
-export * from './lv1-fundamental/ThemeProvider/ThemeContext.ts';
-export * from './lv1-fundamental/ThemeProvider/ThemeProvider.tsx';
-export * from './lv1-fundamental/ThemeProvider/useThemeContext.ts';
+export * from './common/ThemeProvider/ThemeContext.ts';
+export * from './common/ThemeProvider/ThemeProvider.tsx';
+export * from './common/ThemeProvider/useThemeContext.ts';
export * from './lv2-sized/Root/RootInline.recipe';
export * from './lv2-sized/Root/RootInline.ts';
-export * from './lv2-sized/ItemRoot/ItemRoot.recipe.ts';
+export * from './styles/recipe/ItemRoot.recipe.ts';
export * from './lv2-sized/ItemRoot/ItemRoot.tsx';
export * from './lv2-sized/Section/Section.recipe.ts';
export * from './lv2-sized/Section/Section.tsx';
diff --git a/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts b/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts
deleted file mode 100644
index 3e04f10..0000000
--- a/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const boxRoot = tv({
- base: "flex justify-center items-center",
-});
diff --git a/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx b/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx
deleted file mode 100644
index 6cb5340..0000000
--- a/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { cn } from "tailwind-variants";
-import Box, { type PolymorphicProps } from "@/lv1-fundamental/Box/Box";
-import { inlineRootRecipe } from "./IinlineRoot.recipe";
-
-interface ItemInlineRootProps extends CommonProps {
- as?: C;
- size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
- shape?: "square" | "rounded" | "circle";
- variant?: "filled" | "outline" | "subtle";
- brand?: "success" | "danger" | "info" | "warning" | "emphasis";
- iconOnly?: boolean;
-}
-
-const ItemInlineRoot = (
- props: PolymorphicProps>,
- ref?: React.ComponentPropsWithRef["ref"],
-) => {
- const {
- as = "span",
- size = "sm",
- shape = "square",
- brand,
- iconOnly = false,
- variant,
- onClick,
- disabled = false,
- className,
- children,
- ...rest
- } = props;
-
- const handleClick = (e: React.MouseEvent) => {
- if (disabled) {
- e.preventDefault();
- return;
- }
- onClick?.(e);
- };
-
- const itemInlineRootClass = cn(
- inlineRootRecipe({
- variant,
- size,
- shape,
- iconOnly,
- disabled,
- brand,
- }),
- className,
- );
-
- return (
-
- {children}
-
- );
-};
-
-ItemInlineRoot.displayName = "ItemInlineRoot";
-
-export type ItemInlineRootComponent = (
- props: PolymorphicProps> & {
- ref?: React.ComponentPropsWithRef["ref"];
- },
-) => React.ReactElement | null;
-
-export default ItemInlineRoot as ItemInlineRootComponent;
diff --git a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx b/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx
deleted file mode 100644
index 38a64c5..0000000
--- a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { itemRootRecipe } from "./ItemRoot.recipe";
-import { cn } from "tailwind-variants";
-import Box, { type PolymorphicProps } from "@/lv1-fundamental/Box/Box";
-
-interface ItemRootProps extends CommonProps {
- as?: C;
- size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
- shape?: "square" | "rounded" | "circle";
- variant?: "filled" | "outline" | "subtle";
- brand?: "success" | "danger" | "info" | "warning" | "emphasis";
- hasShadow?: boolean;
- iconOnly?: boolean;
-}
-
-const ItemRoot = (
- props: PolymorphicProps>,
- ref?: React.ComponentPropsWithRef["ref"],
-) => {
- const {
- as = "div",
- size = "sm",
- shape = "rounded",
- brand: propBrand,
- iconOnly = false,
- variant,
- hasShadow = false,
- onClick,
- disabled = false,
- className,
- children,
- ...rest
- } = props;
-
- const brand =
- variant == "filled" && propBrand == undefined ? "info" : propBrand;
-
- const handleClick = (e: React.MouseEvent) => {
- if (disabled) {
- e.preventDefault();
- return;
- }
- onClick?.(e);
- };
-
- const itemRootClass = cn(
- itemRootRecipe({
- variant,
- size,
- shape,
- iconOnly,
- disabled,
- hasShadow,
- brand,
- }),
- className,
- );
-
- return (
-
- {children}
-
- );
-};
-
-ItemRoot.displayName = "ItemRoot";
-
-export type ItemRootComponent = (
- props: PolymorphicProps> & {
- ref?: React.ComponentPropsWithRef["ref"];
- },
-) => React.ReactElement | null;
-
-export default ItemRoot as ItemRootComponent;
diff --git a/packages/ui/src/lv2-sized/Section/Section.recipe.ts b/packages/ui/src/lv2-sized/Section/Section.recipe.ts
deleted file mode 100644
index d9583fe..0000000
--- a/packages/ui/src/lv2-sized/Section/Section.recipe.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const sectionRoot = tv({
- base: "",
- variants: {
- align: {
- start: "justify-start",
- center: "justify-center",
- end: "justify-end",
- },
- },
-});
diff --git a/packages/ui/src/lv2-sized/Section/Section.tsx b/packages/ui/src/lv2-sized/Section/Section.tsx
deleted file mode 100644
index 45b12d9..0000000
--- a/packages/ui/src/lv2-sized/Section/Section.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef } from "react";
-import { sectionRoot } from "./Section.recipe";
-import Box from "@/lv1-fundamental/Box/Box";
-import { cn } from "tailwind-variants";
-
-type SectionProps = CommonProps & {
- align?: "start" | "center" | "end";
-};
-
-export const Section = forwardRef(
- (props, ref) => {
- const { className, align, children, ...rest } = props;
-
- const sectionRootClass = cn(sectionRoot({ align }), className);
-
- return (
-
- {children}
-
- );
- },
-);
diff --git a/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts b/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts
deleted file mode 100644
index b9a54fb..0000000
--- a/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const iconRoot = tv({
- base: "dg-icon",
-});
-
-export const iconSvg = tv({
- base: "dg-icon-svg",
- variants: {
- size: {
- xs: "dg-icon-svg_size--xs",
- sm: "dg-icon-svg_size--sm",
- md: "dg-icon-svg_size--md",
- lg: "dg-icon-svg_size--lg",
- xl: "dg-icon-svg_size--xl",
- "2xl": "dg-icon-svg_size--2xl",
- },
- },
-});
diff --git a/packages/ui/src/lv3-partial/Icon/Icon.tsx b/packages/ui/src/lv3-partial/Icon/Icon.tsx
deleted file mode 100644
index a359775..0000000
--- a/packages/ui/src/lv3-partial/Icon/Icon.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef } from "react";
-import { iconRoot, iconSvg } from "./Icon.recipe.ts";
-import { Slot } from "@/lv1-fundamental/Slot/Slot";
-import { cn } from "tailwind-variants";
-import InlineRoot from "@/lv2-sized/InlineRoot/InlineRoot.tsx";
-
-type IconProps = CommonProps & {
- size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
-};
-
-export const Icon = forwardRef((props, ref) => {
- const { size, children, className, ...rest } = props;
-
- const iconRootClass = cn(iconRoot(), className);
- const iconSvgClass = iconSvg({ size });
-
- return (
-
- {children}
-
- );
-});
-
-Icon.displayName = "Icon";
diff --git a/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts b/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts
deleted file mode 100644
index a0d2835..0000000
--- a/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const indicatorInput = tv({ base: "pointer-none" });
-export const indicatorBoxSvg = tv({ base: "absolute z-10" });
-export const indicatorCheckSvg = tv({ base: "absolute z-20" });
diff --git a/packages/ui/src/lv3-partial/Indicator/Indicator.tsx b/packages/ui/src/lv3-partial/Indicator/Indicator.tsx
deleted file mode 100644
index 459ea9d..0000000
--- a/packages/ui/src/lv3-partial/Indicator/Indicator.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { forwardRef, type ReactNode } from "react";
-import {
- // indicatorBoxSvg,
- // indicatorCheckSvg,
- indicatorInput,
-} from "./Indicator.recipe";
-import type { CommonProps } from "@/common/CommonProps";
-import InlineRoot from "@/lv2-sized/InlineRoot/InlineRoot";
-// import { CheckIndicatorOutlineSvg } from "@/assets/svg/CheckIndicatorOutlineSvg";
-// import { RadioIndicatorOutlineSvg } from "@/assets/svg/RadioIndicatorOutlineSvg";
-// import { RadioIndicatorSvg } from "@/assets/svg/RadioIndicatorSvg";
-// import { CheckIndicatorSvg } from "@/assets/svg/CheckIndicatorSvg";
-
-type IndicatorProps = CommonProps & {
- size?: "xs" | "sm";
- type?: "checkbox" | "radio";
- boxSvg?: ReactNode;
- checkSvg?: ReactNode;
- checked?: boolean;
- id?: string;
-};
-
-export const Indicator = forwardRef(
- (props, ref) => {
- const {
- size = "sm",
- type = "checkbox",
- // boxSvg,
- // checkSvg,
- checked,
- id,
- disabled,
- } = props;
-
- // const currentBoxSvg = boxSvg ? (
- // boxSvg
- // ) : type == "checkbox" ? (
- //
- // ) : (
- //
- // );
-
- // const currentCheckSvg = checkSvg ? (
- // checkSvg
- // ) : type == "checkbox" ? (
- //
- // ) : (
- //
- // );
-
- const indicatorInputClass = indicatorInput();
- // const indicatorBoxSvgClass = indicatorBoxSvg();
- // const indicatorCheckSvgClass = indicatorCheckSvg();
-
- return (
-
- ) => {
- e.preventDefault(); // 阻止默认行为,防止闪烁
- return false;
- }}
- // 此处仅用于阻止默认行为,不要处理 keydown 逻辑
- onKeyDown={(e: React.KeyboardEvent) => {
- e.preventDefault(); // 阻止默认行为,防止闪烁
- return false;
- }}
- disabled={disabled} // 交互类 disabled 需要手动传入,而不是依靠父元素灰色滤镜
- className={indicatorInputClass}
- />
-
- {/*
- {currentBoxSvg}
-
-
- {checked && (
-
- {currentCheckSvg}
-
- )} */}
-
- );
- },
-);
-Indicator.displayName = "Indicator";
diff --git a/packages/ui/src/lv3-partial/Label/Label.scss b/packages/ui/src/lv3-partial/Label/Label.scss
deleted file mode 100644
index 7f54a6e..0000000
--- a/packages/ui/src/lv3-partial/Label/Label.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-label {
- @include add-specificity(3) {
- }
-}
-.dg-label_align--start {
- @include add-specificity(3) {
- @include justify-start;
- }
-}
-.dg-label_align--center {
- @include add-specificity(3) {
- @include justify-center;
- }
-}
-.dg-label_align--end {
- @include add-specificity(3) {
- @include justify-end;
- }
-}
-.dg-label_is-subtext--true {
- @include add-specificity(3) {
- @include color-subtext;
- }
-}
-.dg-label_is-subtext--false {
- @include add-specificity(3) {
- }
-}
diff --git a/packages/ui/src/lv3-partial/Label/Label.style.ts b/packages/ui/src/lv3-partial/Label/Label.style.ts
deleted file mode 100644
index 00c8d84..0000000
--- a/packages/ui/src/lv3-partial/Label/Label.style.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const labelRoot = tv({
- base: "dg-label",
- variants: {
- align: {
- start: "dg-label_align--start",
- center: "dg-label_align--center",
- end: "dg-label_align--end",
- },
- isSubText: {
- true: "dg-label_is-subtext--true",
- false: "dg-label_is-subtext--false",
- },
- },
-});
diff --git a/packages/ui/src/lv3-partial/Label/Label.tsx b/packages/ui/src/lv3-partial/Label/Label.tsx
deleted file mode 100644
index 0de8adc..0000000
--- a/packages/ui/src/lv3-partial/Label/Label.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef } from "react";
-import { cn } from "tailwind-variants";
-import { labelRoot } from "./Label.style";
-import { RootInline } from "@/lv2-sized/Root/RootInline";
-
-type LabelProps = CommonProps & {
- size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
- align?: "start" | "center" | "end";
- isSubText?: boolean;
- for?: string;
-};
-
-export const Label = forwardRef((props, ref) => {
- const {
- size,
- isSubText = false,
- align,
- children,
- className,
- ...rest
- } = props;
-
- const labelRootClass = cn(labelRoot({ align, isSubText }), className);
-
- return (
-
- {children}
-
- );
-});
-
-Label.displayName = "Label";
diff --git a/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss b/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss
deleted file mode 100644
index 3cd256a..0000000
--- a/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-tooltip-dropdown {
- @include add-specificity(3) {
- border: 1px solid;
- }
-}
diff --git a/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx b/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx
deleted file mode 100644
index 0d06e25..0000000
--- a/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { Slot } from "@/lv1-fundamental/Slot/Slot";
-import Root from "@/lv2-sized/ItemRoot/ItemRoot";
-import type { CommonProps } from "@/common/CommonProps";
-import {
- autoUpdate,
- flip,
- FloatingPortal,
- offset,
- shift,
- useDismiss,
- useFloating,
- useFocus,
- useHover,
- useInteractions,
- useRole,
- type Placement,
-} from "@floating-ui/react";
-import { useState, type ReactNode } from "react";
-
-type TooltipProps = CommonProps & {
- title?: ReactNode;
- placement?: Placement;
-};
-
-export const Tooltip = (props: TooltipProps) => {
- const { children, placement = "top", title } = props;
- const [open, setOpen] = useState(false);
-
- const { refs, floatingStyles, context } = useFloating({
- open: open,
- onOpenChange: setOpen,
- placement: placement,
- middleware: [offset(4), flip(), shift()],
- whileElementsMounted: autoUpdate,
- });
-
- const hover = useHover(context, {
- delay: { open: 0, close: 0 },
- });
- const focus = useFocus(context);
- const dismiss = useDismiss(context);
- const role = useRole(context, { role: "tooltip" });
- const { getReferenceProps, getFloatingProps } = useInteractions([
- hover,
- focus,
- dismiss,
- role,
- ]);
-
- return (
- <>
-
- {children}
-
- {open && (
-
-
- {title}
-
-
- )}
- >
- );
-};
diff --git a/packages/ui/src/lv4-normal/Button/Button.recipe.ts b/packages/ui/src/lv4-normal/Button/Button.recipe.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/ui/src/lv4-normal/Button/Button.scss b/packages/ui/src/lv4-normal/Button/Button.scss
deleted file mode 100644
index 7b3049a..0000000
--- a/packages/ui/src/lv4-normal/Button/Button.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-button {
- @include add-specificity(4) {
- padding-block: 0;
- }
-}
-.dg-button-content {
- @include add-specificity(4) {
- }
-}
-
-.dg-button_isloading--true {
- @include add-specificity(4) {
- @include loading-true;
- }
-}
-.dg-button_isloading--false {
- @include add-specificity(4) {
- @include loading-false;
- }
-}
-.dg-button-loading-icon {
- @include add-specificity(4) {
- @include absolute;
- }
-}
-.dg-button-icon {
- @include add-specificity(4) {
- }
-}
diff --git a/packages/ui/src/lv4-normal/Button/Button.tsx b/packages/ui/src/lv4-normal/Button/Button.tsx
deleted file mode 100644
index 3e63857..0000000
--- a/packages/ui/src/lv4-normal/Button/Button.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import Box from "@/lv1-fundamental/Box/Box";
-import Root from "@/lv2-sized/ItemRoot/ItemRoot";
-import { Icon } from "@/lv3-partial/Icon/Icon";
-import { Label } from "@/lv3-partial/Label/Label";
-
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef } from "react";
-import {
- buttonContent,
- buttonIcon,
- buttonLoadingIcon,
- buttonRoot,
-} from "./Button.recipe";
-import { cn } from "tailwind-variants";
-import { SpinnerSvg } from "@/assets/svg/SpinnerSvg";
-
-type ButtonProps = CommonProps & {
- size?: "xs" | "sm" | "md" | "lg";
- shape?: "circle" | "rounded" | "square";
- variant?: "filled" | "outline" | "subtle";
- isLoading?: boolean;
- loadingIcon?: React.ReactNode;
- iconSvg?: React.ReactNode;
- iconOnly?: boolean;
- hideIcon?: boolean; // not a state just a attribute
- onClick?: () => void;
-};
-
-export const Button = forwardRef(
- (props, ref) => {
- const {
- size = "md",
- shape = "rounded",
- variant = "filled",
- iconOnly = false,
- iconSvg,
- hideIcon = false,
- isLoading,
- loadingIcon,
- children,
- className,
- disabled,
- ...rest
- } = props;
-
- const buttonRootClass = cn(buttonRoot({ iconOnly }), className);
- const buttonIconClass = buttonIcon();
- const buttonContentClass =
- (isLoading != undefined && buttonContent({ isLoading })) || "";
- const buttonLoadingIconClass = buttonLoadingIcon({
- isLoading,
- });
-
- return (
-
-
- {iconOnly && (
- // if iconOnly
-
- {iconSvg && !hideIcon ? iconSvg : null}
-
- )}
-
- {!iconOnly &&
- // if not iconOnly
- iconSvg &&
- !hideIcon ? (
- {iconSvg}
- ) : null}
-
- {!iconOnly ? : null}
-
-
- {isLoading != undefined && (
-
-
-
- )}
-
- );
- },
-);
-
-Button.displayName = "Button";
diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts b/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts
deleted file mode 100644
index 979e4fe..0000000
--- a/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const checkboxRoot = tv({
- base: "dg-checkbox",
-});
-export const checkboxLabel = tv({
- base: "dg-checkbox-label",
-});
\ No newline at end of file
diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss b/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss
deleted file mode 100644
index 1151d3b..0000000
--- a/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-checkbox {
- @include add-specificity(4) {
- cursor: pointer;
- padding-block: 0;
- }
-}
-.dg-checkbox-label {
- @include add-specificity(4) {
- cursor: pointer;
- }
-}
diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx b/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx
deleted file mode 100644
index 0be442f..0000000
--- a/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import { RootInline } from "@/lv2-sized/Root/RootInline";
-import { Icon } from "@/lv3-partial/Icon/Icon";
-import { Label } from "@/lv3-partial/Label/Label";
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef, useState, type ReactNode } from "react";
-import { cn } from "tailwind-variants";
-import { checkboxLabel, checkboxRoot } from "./Checkbox.recipe";
-import Root from "@/lv2-sized/ItemRoot/ItemRoot";
-import { Indicator } from "@/lv3-partial/Indicator/Indicator";
-
-type CheckboxProps = CommonProps & {
- id?: string;
- checked?: boolean;
- defaultChecked?: boolean;
- onChange?: (v: boolean) => void;
- size?: "xs" | "sm";
- isPlaceholder?: boolean;
- indicatorBoxSvg?: ReactNode;
- indicatorCheckSvg?: ReactNode;
- iconSvg?: ReactNode;
-};
-
-export const Checkbox = forwardRef(
- (props, ref) => {
- const {
- id,
- checked: controllerChecked,
- defaultChecked = false,
- onChange,
- size = "sm",
- isPlaceholder = false,
- indicatorBoxSvg,
- indicatorCheckSvg,
- iconSvg,
- className,
- children,
- disabled = false,
- ...rest
- } = props;
-
- const isControlled = controllerChecked !== undefined;
- const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false);
- const currentChecked = isControlled ? controllerChecked : innerChecked;
-
- const handleClick = (_e: React.MouseEvent) => {
- // 若受控,点击不变
- if (isControlled) {
- return false;
- }
- // 若不受控,点击变更
- const next = !currentChecked;
- setInnerChecked(next);
- onChange?.(next);
- };
-
- const handleKeyDown = (e: React.KeyboardEvent) => {
- // 若受控,点击不变
- if (isControlled) {
- return false;
- }
- // 若不受控,点击变更
- const next = !currentChecked;
- if (e.key === " " || e.key === "Enter") {
- setInnerChecked(next);
- }
- onChange?.(next);
- };
-
- const checkboxRootClass = cn(checkboxRoot(), className);
- const checkboxLabelClass = checkboxLabel();
-
- return (
-
- {isPlaceholder ? (
-
- ) : (
-
- )}
-
- {iconSvg ? {iconSvg} : null}
-
-
-
- );
- },
-);
-
-Checkbox.displayName = "Checkbox";
diff --git a/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts b/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts
deleted file mode 100644
index 500dc17..0000000
--- a/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const radioRoot = tv({
- base: "dg-radio",
-});
-
-export const radioLabel = tv({
- base: "dg-radio-label",
-});
diff --git a/packages/ui/src/lv4-normal/Radio/Radio.scss b/packages/ui/src/lv4-normal/Radio/Radio.scss
deleted file mode 100644
index 97b7b8f..0000000
--- a/packages/ui/src/lv4-normal/Radio/Radio.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-radio {
- @include add-specificity(4) {
- cursor: pointer;
- padding-block: 0;
- }
-}
-.dg-radio-label {
- @include add-specificity(4) {
- cursor: pointer;
- }
-}
diff --git a/packages/ui/src/lv4-normal/Radio/Radio.tsx b/packages/ui/src/lv4-normal/Radio/Radio.tsx
deleted file mode 100644
index 1ea5172..0000000
--- a/packages/ui/src/lv4-normal/Radio/Radio.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import { RootInline } from "@/lv2-sized/Root/RootInline";
-import { Icon } from "@/lv3-partial/Icon/Icon";
-import { Label } from "@/lv3-partial/Label/Label";
-import type { CommonProps } from "@/common/CommonProps";
-import { forwardRef, useContext, useState, type ReactNode } from "react";
-import { cn } from "tailwind-variants";
-import { radioLabel, radioRoot } from "./Radio.recipe";
-import { RadioGroupContext } from "./RadioGroupContext";
-import { Indicator } from "@/lv3-partial/Indicator/Indicator";
-import Root from "@/lv2-sized/ItemRoot/ItemRoot";
-
-type RadioProps = CommonProps & {
- id?: string;
- name?: string;
- value: string;
- checked?: boolean;
- defaultChecked?: boolean;
- onChange?: (name: string, value: boolean) => void;
- size?: "xs" | "sm";
- isPlaceholder?: boolean;
- indicatorBoxSvg?: ReactNode;
- indicatorCheckSvg?: ReactNode;
- iconSvg?: ReactNode;
-};
-
-export const Radio = forwardRef((props, ref) => {
- const {
- checked: controllerChecked,
- defaultChecked = false,
- onChange,
- size = "sm",
- isPlaceholder = false,
- indicatorBoxSvg,
- indicatorCheckSvg,
- iconSvg,
- className,
- children,
- disabled = false,
- id,
- name,
- value,
- ...rest
- } = props;
-
- const ctx = useContext(RadioGroupContext);
- if (!ctx) {
- throw new Error("Radio must be used within a RadioGroup");
- }
-
- const isControlled = controllerChecked !== undefined;
- const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false);
- const currentChecked = isControlled ? controllerChecked : innerChecked;
-
- const currentSize = ctx.size ?? size;
- const currentName = ctx.name ?? name;
-
- const handleClick = (_e: React.MouseEvent) => {
- // 若受控,点击不变
- if (isControlled) {
- return false;
- }
- // 若不受控,点击变更
- const next = !currentChecked;
- setInnerChecked(next);
- onChange?.(currentName, next);
- };
-
- const handleKeyDown = (e: React.KeyboardEvent) => {
- // 若受控,点击不变
- if (isControlled) {
- return false;
- }
- // 若不受控,点击变更
- const next = !currentChecked;
- if (e.key === " " || e.key === "Enter") {
- setInnerChecked(next);
- }
- onChange?.(currentName, next);
- };
-
- const radioRootClass = cn(radioRoot(), className);
- const radioLabelClass = radioLabel();
-
- return (
-
- {isPlaceholder ? (
-
- ) : (
-
- )}
-
- {iconSvg ? {iconSvg} : null}
-
-
-
- );
-});
-
-Radio.displayName = "Radio";
diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts b/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts
deleted file mode 100644
index 4957c3a..0000000
--- a/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { tv } from "tailwind-variants";
-
-export const radioGroupRoot = tv({
- base: "dg-radio-group",
- variants: {
- direction: {
- horizontal: "dg-radio-group_direction--horizontal",
- vertical: "dg-radio-group_direction--vertical",
- },
- },
-});
-
-export const radioGroupList = tv({
- base: "dg-radio-group-list",
-});
diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.scss b/packages/ui/src/lv4-normal/Radio/RadioGroup.scss
deleted file mode 100644
index 0c9912e..0000000
--- a/packages/ui/src/lv4-normal/Radio/RadioGroup.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-@use "../../styles/index.scss" as *;
-
-.dg-radio-group {
- @include add-specificity(4) {
- @include flex-col;
- }
-}
-.dg-radio-group_direction--horizontal {
- @include add-specificity(4) {
- @include flex-row;
- }
-}
-.dg-radio-group_direction--vertical {
- @include add-specificity(4) {
- @include flex-col;
- }
-}
-.dg-radio-group-list {
- @include add-specificity(4) {
- @include flex-col;
- @include justify-start;
- @include items-start;
- }
-}
diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx b/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx
deleted file mode 100644
index 6414965..0000000
--- a/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import type { CommonProps } from "@/common/CommonProps";
-import { RadioGroupContext } from "./RadioGroupContext";
-import { useState } from "react";
-import { Label } from "@/lv3-partial/Label/Label";
-import Root from "@/lv2-sized/ItemRoot/ItemRoot";
-import { radioGroupList, radioGroupRoot } from "./RadioGroup.recipe";
-import Box from "@/lv1-fundamental/Box/Box";
-
-type RadioGroupProps = CommonProps & {
- name: string;
- label?: string;
- defaultValue?: string;
- onChange?: (value: string) => void;
- size?: "xs" | "sm";
- direction?: "vertical" | "horizontal";
-};
-
-export const RadioGroup = (props: RadioGroupProps) => {
- const {
- name,
- defaultValue,
- onChange,
- label,
- size = "sm",
- direction = "horizontal",
- className,
- children,
- ...rest
- } = props;
-
- const [value, setValue] = useState(defaultValue ?? "");
-
- const handleChange = (v: string) => {
- setValue(v);
- onChange?.(v);
- };
-
- const radioGroupRootClass = radioGroupRoot({ direction });
- const radioGroupListClass = radioGroupList();
-
- return (
-
-
-
- {label && (
-
-
-
- )}
- {children}
-
-
-
- );
-};
diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts b/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts
deleted file mode 100644
index 22e4cc9..0000000
--- a/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { createContext } from "react";
-
-export type RadioGroupContextType = {
- name: string;
- onChange: (v: string) => void;
- value: string;
- size: "xs" | "sm";
-};
-
-export const RadioGroupContext = createContext(
- null,
-);
diff --git a/packages/ui/src/lv2-sized/InlineRoot/IinlineRoot.recipe.ts b/packages/ui/src/styles/recipe/IinlineRoot.recipe.ts
similarity index 100%
rename from packages/ui/src/lv2-sized/InlineRoot/IinlineRoot.recipe.ts
rename to packages/ui/src/styles/recipe/IinlineRoot.recipe.ts
diff --git a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts b/packages/ui/src/styles/recipe/ItemRoot.recipe.ts
similarity index 79%
rename from packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts
rename to packages/ui/src/styles/recipe/ItemRoot.recipe.ts
index f602c78..a0310bc 100644
--- a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts
+++ b/packages/ui/src/styles/recipe/ItemRoot.recipe.ts
@@ -16,11 +16,6 @@ export const itemRootRecipe = tv({
rounded: "",
circle: "rounded-full",
},
- variant: {
- filled: "variant-filled",
- outline: "variant-outline",
- subtle: "variant-subtle",
- },
brand: {
success: "brand-success",
danger: "brand-danger",
@@ -103,21 +98,5 @@ export const itemRootRecipe = tv({
size: "2xl",
class: "w-2xl",
},
- // --------------------------------------------------
- {
- disabled: true,
- variant: "filled",
- class: "variant-filled-disabled",
- },
- {
- disabled: true,
- variant: "outline",
- class: "variant-outline-disabled",
- },
- {
- disabled: true,
- variant: "subtle",
- class: "variant-subtle-disabled",
- },
],
});
diff --git a/packages/ui/src/styles/recipe/variant.recipe.ts b/packages/ui/src/styles/recipe/variant.recipe.ts
new file mode 100644
index 0000000..c6ba73e
--- /dev/null
+++ b/packages/ui/src/styles/recipe/variant.recipe.ts
@@ -0,0 +1,32 @@
+import { tv } from "tailwind-variants";
+
+export const variantRecipe = tv({
+ variants: {
+ variant: {
+ filled: "variant-filled",
+ outline: "variant-outline",
+ subtle: "variant-subtle",
+ },
+ disabled: {
+ true: "",
+ false: "",
+ },
+ },
+ compoundVariants: [
+ {
+ disabled: true,
+ variant: "filled",
+ class: "variant-filled-disabled",
+ },
+ {
+ disabled: true,
+ variant: "outline",
+ class: "variant-outline-disabled",
+ },
+ {
+ disabled: true,
+ variant: "subtle",
+ class: "variant-subtle-disabled",
+ },
+ ],
+});
diff --git a/packages/ui/src/styles/theme/theme-base.css b/packages/ui/src/styles/theme/theme-base.css
index 13a3995..95db713 100644
--- a/packages/ui/src/styles/theme/theme-base.css
+++ b/packages/ui/src/styles/theme/theme-base.css
@@ -1,11 +1,11 @@
@theme {
+ --color-transparent: transparent;
--danger-fg: var(--base-fg);
--danger-bg-low-hover: var(--color-red-100);
--danger-bg-low-active: var(--color-red-200);
--danger-bg: var(--color-red-600);
--danger-bg-high-hover: var(--color-red-700);
--danger-bg-high-active: var(--color-red-800);
- --danger-border-color: var(--color-transparent);
--success-fg: var(--base-fg);
--success-bg-low-hover: var(--color-green-100);
--success-bg-low-active: var(--color-green-200);
@@ -18,19 +18,16 @@
--info-bg: var(--color-sky-600);
--info-bg-high-hover: var(--color-sky-700);
--info-bg-high-active: var(--color-sky-800);
- --info-border-color: var(--color-transparent);
--warning-fg: var(--base-fg);
--warning-bg-low-hover: var(--color-amber-100);
--warning-bg-low-active: var(--color-amber-200);
--warning-bg: var(--color-amber-600);
--warning-bg-high-hover: var(--color-amber-700);
--warning-bg-high-active: var(--color-amber-800);
- --warning-border-color: var(--color-transparent);
- --emphasis-fg: var(--base-fg);
- --emphasis-bg-low-hover: var(--color-gray-100);
- --emphasis-bg-low-active: var(--color-gray-200);
- --emphasis-bg: var(--color-gray-600);
- --emphasis-bgr-high-hover: var(--color-gray-700);
- --emphasis-bg-high-active: var(--color-gray-800);
- --emphasis-border-color: var(--color-transparent);
+ --default-fg: var(--base-fg);
+ --default-bg-low-hover: var(--color-gray-100);
+ --default-bg-low-active: var(--color-gray-200);
+ --default-bg: var(--color-gray-600);
+ --default-bgr-high-hover: var(--color-gray-700);
+ --default-bg-high-active: var(--color-gray-800);
}
diff --git a/packages/ui/src/styles/theme/theme-variant.css b/packages/ui/src/styles/theme/theme-variant.css
index d9f2f42..ee45fb2 100644
--- a/packages/ui/src/styles/theme/theme-variant.css
+++ b/packages/ui/src/styles/theme/theme-variant.css
@@ -1,25 +1,25 @@
@theme {
--filled-fg: var(--color-white);
- --filled-fg-hover: var(--brand-fg);
- --filled-fg-active: var(--brand-fg);
+ --filled-fg-hover: var(--color-white);
+ --filled-fg-active: var(--color-white);
--filled-bg: var(--brand-bg);
--filled-bg-hover: var(--brand-bg-high-hover);
--filled-bg-active: var(--brand-bg-high-active);
- --filled-border-color: var(--brand-border-color);
+ --filled-border-color: var(--color-transparent);
- --outline-fg: var(--brand-bg);
+ --outline-fg: var(--base-fg);
--outline-fg-hover: var(--brand-bg);
--outline-fg-active: var(--brand-bg);
- --outline-bg: var(--brand-border-color);
+ --outline-bg: var(--color-transparent);
--outline-bg-hover: var(--brand-bg-low-hover);
--outline-bg-active: var(--brand-bg-low-active);
--outline-border-color: var(--brand-bg);
- --subtle-fg: var(--brand-bg);
+ --subtle-fg: var(--base-fg);
--subtle-fg-hover: var(--brand-bg);
--subtle-fg-active: var(--brand-bg);
- --subtle-bg: var(--brand-border-color);
+ --subtle-bg: var(--color-transparent);
--subtle-bg-hover: var(--brand-bg-low-hover);
--subtle-bg-active: var(--brand-bg-low-active);
- --subtle-border-color: var(--brand-border-color);
+ --subtle-border-color: var(--color-transparent);
}
diff --git a/packages/ui/src/styles/utility/brand.css b/packages/ui/src/styles/utility/brand.css
index d25926c..81293a0 100644
--- a/packages/ui/src/styles/utility/brand.css
+++ b/packages/ui/src/styles/utility/brand.css
@@ -1,45 +1,35 @@
@utility brand-info {
- --brand-fg: var(--info-fg);
--brand-bg-low-hover: var(--info-bg-low-hover);
--brand-bg-low-active: var(--info-bg-low-active);
--brand-bg: var(--info-bg);
--brand-bg-high-hover: var(--info-bg-high-hover);
--brand-bg-high-active: var(--info-bg-high-active);
- --brand-border-color: var(--info-border-color);
}
@utility brand-danger {
- --brand-fg: var(--danger-fg);
--brand-bg-low-hover: var(--danger-bg-low-hover);
--brand-bg-low-active: var(--danger-bg-low-active);
--brand-bg: var(--danger-bg);
--brand-bg-high-hover: var(--danger-bg-high-hover);
--brand-bg-high-active: var(--danger-bg-high-active);
- --brand-border-color: var(--danger-border-color);
}
@utility brand-success {
- --brand-fg: var(--success-fg);
--brand-bg-low-hover: var(--success-bg-low-hover);
--brand-bg-low-active: var(--success-bg-low-active);
--brand-bg: var(--success-bg);
--brand-bg-high-hover: var(--success-bg-high-hover);
--brand-bg-high-active: var(--success-bg-high-active);
- --brand-border-color: var(--success-border-color);
}
@utility brand-warning {
- --brand-fg: var(--warning-fg);
--brand-bg-low-hover: var(--warning-bg-low-hover);
--brand-bg-low-active: var(--warning-bg-low-active);
--brand-bg: var(--warning-bg);
--brand-bg-high-hover: var(--warning-bg-high-hover);
--brand-bg-high-active: var(--warning-bg-high-active);
- --brand-border-color: var(--warning-border-color);
}
-@utility brand-emphasis {
- --brand-fg: var(--emphasis-fg);
- --brand-bg-low-hover: var(--emphasis-bg-low-hover);
- --brand-bg-low-active: var(--emphasis-bg-low-active);
- --brand-bg: var(--emphasis-bg);
- --brand-bg-high-hover: var(--emphasis-bg-high-hover);
- --brand-bg-high-active: var(--emphasis-bg-high-active);
- --brand-border-color: var(--emphasis-border-color);
+@utility brand-default {
+ --brand-bg-low-hover: var(--default-bg-low-hover);
+ --brand-bg-low-active: var(--default-bg-low-active);
+ --brand-bg: var(--default-bg);
+ --brand-bg-high-hover: var(--default-bg-high-hover);
+ --brand-bg-high-active: var(--default-bg-high-active);
}
diff --git a/packages/ui/src/styles/utility/variant.css b/packages/ui/src/styles/utility/variant.css
index a39107d..c944bf9 100644
--- a/packages/ui/src/styles/utility/variant.css
+++ b/packages/ui/src/styles/utility/variant.css
@@ -5,14 +5,17 @@
&:hover {
background-color: var(--filled-bg-hover);
+ color: var(--filid-fg-hover);
}
&:active {
background-color: var(--filled-bg-active);
+ color: var(--filid-fg-active);
}
&:focus-visible {
background-color: var(--filled-bg-hover);
+ color: var(--filid-fg-hover);
}
}
@@ -23,14 +26,17 @@
&:hover {
background-color: var(--outline-bg-hover);
+ color: var(--outline-fg-hover);
}
&:active {
background-color: var(--outline-bg-active);
+ color: var(--outline-fg-active);
}
&:focus-visible {
background-color: var(--outline-bg-hover);
+ color: var(--outline-fg-hover);
}
}
@@ -41,14 +47,17 @@
&:hover {
background-color: var(--subtle-bg-hover);
+ color: var(--subtle-fg-hover);
}
&:active {
background-color: var(--subtle-bg-active);
+ color: var(--subtle-fg-active);
}
&:focus-visible {
background-color: var(--subtle-bg-hover);
+ color: var(--subtle-fg-hover);
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5ca1193..5c0f5c6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,9 +14,9 @@ importers:
apps/ui-site:
dependencies:
- '@defgov/ui-headless':
+ '@defgov/ui':
specifier: workspace:*
- version: link:../../packages/ui-headless
+ version: link:../../packages/ui
react:
specifier: ^19.2.0
version: 19.2.4
@@ -61,63 +61,11 @@ importers:
specifier: ^7.3.1
version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- packages/headless-ui:
- dependencies:
- '@floating-ui/react-dom':
- specifier: ^2.1.7
- version: 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- '@floating-ui/utils':
- specifier: ^0.2.10
- version: 0.2.10
- devDependencies:
- '@tailwindcss/vite':
- specifier: ^4.2.1
- version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
- '@tsconfig/vite-react':
- specifier: ^7.0.2
- version: 7.0.2
- '@types/node':
- specifier: ^25.3.3
- version: 25.3.3
- '@types/react':
- specifier: ^19.2.10
- version: 19.2.14
- '@types/react-dom':
- specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.14)
- '@vitejs/plugin-react':
- specifier: ^5.1.4
- version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
- glob:
- specifier: ^13.0.3
- version: 13.0.3
- react:
- specifier: ^19.2.4
- version: 19.2.4
- react-dom:
- specifier: ^19.2.4
- version: 19.2.4(react@19.2.4)
- tailwindcss:
- specifier: ^4.2.1
- version: 4.2.1
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3)
- typescript:
- specifier: ^5.9.3
- version: 5.9.3
- vite:
- specifier: ^7.3.1
- version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- vite-plugin-dts:
- specifier: ^4.5.4
- version: 4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
-
packages/ui:
dependencies:
- '@floating-ui/react':
- specifier: ^0.27.18
- version: 0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@base-ui/react':
+ specifier: ^1.3.0
+ version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@tailwindcss/vite':
specifier: ^4.2.1
version: 4.2.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
@@ -174,101 +122,6 @@ importers:
specifier: ^4.5.4
version: 4.5.4(@types/node@25.2.0)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
- packages/ui-headless:
- dependencies:
- '@floating-ui/react':
- specifier: ^0.27.18
- version: 0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- '@tailwindcss/vite':
- specifier: ^4.2.1
- version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
- react:
- specifier: ^19.2.4
- version: 19.2.4
- react-dom:
- specifier: ^19.2.4
- version: 19.2.4(react@19.2.4)
- tailwind-merge:
- specifier: ^3.5.0
- version: 3.5.0
- tailwind-variants:
- specifier: ^3.2.2
- version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1)
- tailwindcss:
- specifier: ^4.2.1
- version: 4.2.1
- devDependencies:
- '@tsconfig/vite-react':
- specifier: ^7.0.2
- version: 7.0.2
- '@types/node':
- specifier: ^25.1.0
- version: 25.3.3
- '@types/react':
- specifier: ^19.2.10
- version: 19.2.14
- '@types/react-dom':
- specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.14)
- '@vitejs/plugin-react':
- specifier: ^5.1.2
- version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
- autoprefixer:
- specifier: ^10.4.24
- version: 10.4.24(postcss@8.5.6)
- glob:
- specifier: ^13.0.3
- version: 13.0.3
- prettier:
- specifier: ^3.8.1
- version: 3.8.1
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3)
- typescript:
- specifier: ^5.9.3
- version: 5.9.3
- vite:
- specifier: ^7.3.1
- version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- vite-plugin-dts:
- specifier: ^4.5.4
- version: 4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))
-
- packages/ui-headless-style:
- dependencies:
- tailwind-merge:
- specifier: ^3.5.0
- version: 3.5.0
- tailwind-variants:
- specifier: ^3.2.2
- version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1)
-
- packages/ui-headless-tailwind-style:
- dependencies:
- tailwind-merge:
- specifier: ^3.5.0
- version: 3.5.0
- tailwind-variants:
- specifier: ^3.2.2
- version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1)
- tailwindcss:
- specifier: '>=4.2.1 <5.0.0'
- version: 4.2.1
- devDependencies:
- '@types/node':
- specifier: ^25.3.3
- version: 25.3.3
- glob:
- specifier: ^13.0.3
- version: 13.0.3
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3)
- typescript:
- specifier: ^5.9.3
- version: 5.9.3
-
packages:
'@babel/code-frame@7.29.0':
@@ -342,6 +195,10 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ engines: {node: '>=6.9.0'}
+
'@babel/template@7.28.6':
resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
engines: {node: '>=6.9.0'}
@@ -354,6 +211,27 @@ packages:
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
+ '@base-ui/react@1.3.0':
+ resolution: {integrity: sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@base-ui/utils@0.2.6':
+ resolution: {integrity: sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
@@ -552,26 +430,20 @@ packages:
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@floating-ui/core@1.7.4':
- resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==}
+ '@floating-ui/core@1.7.5':
+ resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
- '@floating-ui/dom@1.7.5':
- resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==}
+ '@floating-ui/dom@1.7.6':
+ resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
- '@floating-ui/react-dom@2.1.7':
- resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==}
+ '@floating-ui/react-dom@2.1.8':
+ resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
- '@floating-ui/react@0.27.18':
- resolution: {integrity: sha512-xJWJxvmy3a05j643gQt+pRbht5XnTlGpsEsAPnMi5F5YTOEEJymA90uZKBD8OvIv5XvZ1qi4GcccSlqT3Bq44Q==}
- peerDependencies:
- react: '>=17.0.0'
- react-dom: '>=17.0.0'
-
- '@floating-ui/utils@0.2.10':
- resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+ '@floating-ui/utils@0.2.11':
+ resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
@@ -1029,9 +901,6 @@ packages:
'@types/node@25.2.0':
resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
- '@types/node@25.3.3':
- resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==}
-
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
@@ -1801,6 +1670,9 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
+ reselect@5.1.1:
+ resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -1984,9 +1856,6 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
- undici-types@7.18.2:
- resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
-
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@@ -2000,6 +1869,11 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
@@ -2178,6 +2052,8 @@ snapshots:
'@babel/core': 7.29.0
'@babel/helper-plugin-utils': 7.28.6
+ '@babel/runtime@7.29.2': {}
+
'@babel/template@7.28.6':
dependencies:
'@babel/code-frame': 7.29.0
@@ -2201,6 +2077,30 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
+ '@base-ui/react@1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@base-ui/utils': 0.2.6(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@floating-ui/utils': 0.2.11
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ tabbable: 6.4.0
+ use-sync-external-store: 1.6.0(react@19.2.4)
+ optionalDependencies:
+ '@types/react': 19.2.14
+
+ '@base-ui/utils@0.2.6(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@floating-ui/utils': 0.2.11
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ reselect: 5.1.1
+ use-sync-external-store: 1.6.0(react@19.2.4)
+ optionalDependencies:
+ '@types/react': 19.2.14
+
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
@@ -2329,30 +2229,22 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
- '@floating-ui/core@1.7.4':
+ '@floating-ui/core@1.7.5':
dependencies:
- '@floating-ui/utils': 0.2.10
+ '@floating-ui/utils': 0.2.11
- '@floating-ui/dom@1.7.5':
+ '@floating-ui/dom@1.7.6':
dependencies:
- '@floating-ui/core': 1.7.4
- '@floating-ui/utils': 0.2.10
+ '@floating-ui/core': 1.7.5
+ '@floating-ui/utils': 0.2.11
- '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@floating-ui/dom': 1.7.5
+ '@floating-ui/dom': 1.7.6
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
- '@floating-ui/react@0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
- dependencies:
- '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
- '@floating-ui/utils': 0.2.10
- react: 19.2.4
- react-dom: 19.2.4(react@19.2.4)
- tabbable: 6.4.0
-
- '@floating-ui/utils@0.2.10': {}
+ '@floating-ui/utils@0.2.11': {}
'@humanfs/core@0.19.1': {}
@@ -2399,14 +2291,6 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor-model@7.33.1(@types/node@25.3.3)':
- dependencies:
- '@microsoft/tsdoc': 0.16.0
- '@microsoft/tsdoc-config': 0.18.0
- '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3)
- transitivePeerDependencies:
- - '@types/node'
-
'@microsoft/api-extractor@7.57.3(@types/node@25.2.0)':
dependencies:
'@microsoft/api-extractor-model': 7.33.1(@types/node@25.2.0)
@@ -2426,25 +2310,6 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor@7.57.3(@types/node@25.3.3)':
- dependencies:
- '@microsoft/api-extractor-model': 7.33.1(@types/node@25.3.3)
- '@microsoft/tsdoc': 0.16.0
- '@microsoft/tsdoc-config': 0.18.0
- '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3)
- '@rushstack/rig-package': 0.7.1
- '@rushstack/terminal': 0.22.1(@types/node@25.3.3)
- '@rushstack/ts-command-line': 5.3.1(@types/node@25.3.3)
- diff: 8.0.3
- lodash: 4.17.23
- minimatch: 10.2.1
- resolve: 1.22.11
- semver: 7.5.4
- source-map: 0.6.1
- typescript: 5.8.2
- transitivePeerDependencies:
- - '@types/node'
-
'@microsoft/tsdoc-config@0.18.0':
dependencies:
'@microsoft/tsdoc': 0.16.0
@@ -2613,27 +2478,10 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
- '@rushstack/node-core-library@5.20.1(@types/node@25.3.3)':
- dependencies:
- ajv: 8.13.0
- ajv-draft-04: 1.0.0(ajv@8.13.0)
- ajv-formats: 3.0.1(ajv@8.13.0)
- fs-extra: 11.3.3
- import-lazy: 4.0.0
- jju: 1.4.0
- resolve: 1.22.11
- semver: 7.5.4
- optionalDependencies:
- '@types/node': 25.3.3
-
'@rushstack/problem-matcher@0.2.1(@types/node@25.2.0)':
optionalDependencies:
'@types/node': 25.2.0
- '@rushstack/problem-matcher@0.2.1(@types/node@25.3.3)':
- optionalDependencies:
- '@types/node': 25.3.3
-
'@rushstack/rig-package@0.7.1':
dependencies:
resolve: 1.22.11
@@ -2647,14 +2495,6 @@ snapshots:
optionalDependencies:
'@types/node': 25.2.0
- '@rushstack/terminal@0.22.1(@types/node@25.3.3)':
- dependencies:
- '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3)
- '@rushstack/problem-matcher': 0.2.1(@types/node@25.3.3)
- supports-color: 8.1.1
- optionalDependencies:
- '@types/node': 25.3.3
-
'@rushstack/ts-command-line@5.3.1(@types/node@25.2.0)':
dependencies:
'@rushstack/terminal': 0.22.1(@types/node@25.2.0)
@@ -2664,15 +2504,6 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
- '@rushstack/ts-command-line@5.3.1(@types/node@25.3.3)':
- dependencies:
- '@rushstack/terminal': 0.22.1(@types/node@25.3.3)
- '@types/argparse': 1.0.38
- argparse: 1.0.10
- string-argv: 0.3.2
- transitivePeerDependencies:
- - '@types/node'
-
'@tailwindcss/node@4.2.1':
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -2741,13 +2572,6 @@ snapshots:
tailwindcss: 4.2.1
vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))':
- dependencies:
- '@tailwindcss/node': 4.2.1
- '@tailwindcss/oxide': 4.2.1
- tailwindcss: 4.2.1
- vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
-
'@tsconfig/node10@1.0.12': {}
'@tsconfig/node12@1.0.11': {}
@@ -2793,10 +2617,6 @@ snapshots:
dependencies:
undici-types: 7.16.0
- '@types/node@25.3.3':
- dependencies:
- undici-types: 7.18.2
-
'@types/react-dom@19.2.3(@types/react@19.2.14)':
dependencies:
'@types/react': 19.2.14
@@ -2920,18 +2740,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))':
- dependencies:
- '@babel/core': 7.29.0
- '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
- '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
- '@rolldown/pluginutils': 1.0.0-rc.3
- '@types/babel__core': 7.20.5
- react-refresh: 0.18.0
- vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- transitivePeerDependencies:
- - supports-color
-
'@volar/language-core@2.4.28':
dependencies:
'@volar/source-map': 2.4.28
@@ -3590,6 +3398,8 @@ snapshots:
require-from-string@2.0.2: {}
+ reselect@5.1.1: {}
+
resolve-from@4.0.0: {}
resolve@1.22.11:
@@ -3715,24 +3525,6 @@ snapshots:
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
- ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3):
- dependencies:
- '@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.12
- '@tsconfig/node12': 1.0.11
- '@tsconfig/node14': 1.0.3
- '@tsconfig/node16': 1.0.4
- '@types/node': 25.3.3
- acorn: 8.15.0
- acorn-walk: 8.3.4
- arg: 4.1.3
- create-require: 1.1.1
- diff: 4.0.4
- make-error: 1.3.6
- typescript: 5.9.3
- v8-compile-cache-lib: 3.0.1
- yn: 3.1.1
-
turbo-darwin-64@2.8.3:
optional: true
@@ -3783,8 +3575,6 @@ snapshots:
undici-types@7.16.0: {}
- undici-types@7.18.2: {}
-
universalify@2.0.1: {}
update-browserslist-db@1.2.3(browserslist@4.28.1):
@@ -3797,6 +3587,10 @@ snapshots:
dependencies:
punycode: 2.3.1
+ use-sync-external-store@1.6.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+
v8-compile-cache-lib@3.0.1: {}
vite-plugin-dts@4.5.4(@types/node@25.2.0)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)):
@@ -3818,25 +3612,6 @@ snapshots:
- rollup
- supports-color
- vite-plugin-dts@4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)):
- dependencies:
- '@microsoft/api-extractor': 7.57.3(@types/node@25.3.3)
- '@rollup/pluginutils': 5.3.0(rollup@4.57.1)
- '@volar/typescript': 2.4.28
- '@vue/language-core': 2.2.0(typescript@5.9.3)
- compare-versions: 6.1.1
- debug: 4.4.3
- kolorist: 1.8.0
- local-pkg: 1.1.2
- magic-string: 0.30.21
- typescript: 5.9.3
- optionalDependencies:
- vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)
- transitivePeerDependencies:
- - '@types/node'
- - rollup
- - supports-color
-
vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3):
dependencies:
esbuild: 0.27.2
@@ -3867,21 +3642,6 @@ snapshots:
lightningcss: 1.31.1
sass: 1.97.3
- vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3):
- dependencies:
- esbuild: 0.27.2
- fdir: 6.5.0(picomatch@4.0.3)
- picomatch: 4.0.3
- postcss: 8.5.6
- rollup: 4.57.1
- tinyglobby: 0.2.15
- optionalDependencies:
- '@types/node': 25.3.3
- fsevents: 2.3.3
- jiti: 2.6.1
- lightningcss: 1.31.1
- sass: 1.97.3
-
vscode-uri@3.1.0: {}
which@2.0.2: