
@@ -28,7 +43,7 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) {
- 통합플랫폼관리
+ {siteInfo?.siteNm}
diff --git a/packages/common/components/src/ui/icon-finder/data.ts b/packages/common/components/src/ui/icon-finder/data.ts
new file mode 100644
index 000000000..b5b2d8c2b
--- /dev/null
+++ b/packages/common/components/src/ui/icon-finder/data.ts
@@ -0,0 +1,592 @@
+export default [
+ "account-box",
+ "account-circle",
+ "add-image",
+ "add-Note",
+ "alarm-add",
+ "alarm-clock",
+ "alarm-off",
+ "alarm-on",
+ "alarm",
+ "alternate",
+ "analytics",
+ "android",
+ "announcement",
+ "app-indicator",
+ "app-list",
+ "app-square",
+ "apple",
+ "apps-square",
+ "apps",
+ "archive-fill",
+ "archive",
+ "arrow-90left-down",
+ "arrow-90left-up",
+ "arrow-90left",
+ "arrow-90right-down",
+ "arrow-90right-up",
+ "arrow-90right",
+ "arrow-back-square-fill",
+ "arrow-back",
+ "arrow-down-square-fill",
+ "arrow-down-square",
+ "arrow-down",
+ "arrow-forward-square-fill",
+ "arrow-forward",
+ "arrow-left-right",
+ "arrow-left-square-fill",
+ "arrow-left-square",
+ "arrow-left",
+ "arrow-lr-up-down",
+ "arrow-reflash",
+ "arrow-reset",
+ "arrow-right-square-fill",
+ "arrow-right-square",
+ "arrow-right",
+ "arrow-up-down",
+ "arrow-up-square-fill",
+ "arrow-up-square",
+ "arrow-up",
+ "arrows-angle-contract",
+ "arrows-angle-expand",
+ "arrows-fullscreen",
+ "aspect-ratio-fill",
+ "aspect-ratio",
+ "assignment-ind",
+ "assignment-turned-in",
+ "assignment",
+ "asterisk",
+ "atm",
+ "badge-4k-fill",
+ "badge-4k",
+ "badge-8k-fill",
+ "badge-8k",
+ "badge-ad-fill",
+ "badge-ad",
+ "badge-cc-fill",
+ "badge-cc",
+ "badge-hd-fill",
+ "badge-hd",
+ "badge-tm-fill",
+ "badge-tm",
+ "bag-check-fill",
+ "bag-check",
+ "bag-fill",
+ "bag",
+ "bags",
+ "bar-chart-fill",
+ "bar-chart",
+ "battery-charging",
+ "battery-emty",
+ "battery-full",
+ "battery-harf",
+ "bell-alert-box-fill",
+ "bell-alert-box",
+ "bell-alert-fill",
+ "bell-alert",
+ "bell-notification-fill",
+ "bell-notification-on-fill",
+ "bell-notification-on",
+ "bell-notification",
+ "bike",
+ "bluetooth",
+ "boat",
+ "book",
+ "bookmark-check-fill",
+ "bookmark-check",
+ "bookmark-fill",
+ "bookmark-new-fill",
+ "bookmark-new",
+ "bookmark-star-fill",
+ "bookmark-star",
+ "bookmark",
+ "boostzone",
+ "box-arrow-backup",
+ "box-arrow-download",
+ "box-arrow-link-blank",
+ "box-arrow-upload",
+ "box-seam",
+ "box",
+ "braces",
+ "briefcase-fill",
+ "briefcase",
+ "brightness-fill",
+ "brightness",
+ "broadcast-pin",
+ "broadcast",
+ "bug-fill",
+ "bug",
+ "building",
+ "bus",
+ "calculator-fill",
+ "calculator",
+ "calendar-check-fill",
+ "calendar-check",
+ "calendar-day-fill",
+ "calendar-day",
+ "calendar-event-fill",
+ "calendar-event",
+ "calendar-fill",
+ "calendar-week-fill",
+ "calendar-week",
+ "calendar",
+ "call-end",
+ "call",
+ "camera-fill",
+ "camera-video-fill",
+ "camera-video",
+ "camera",
+ "car",
+ "card-fill",
+ "card",
+ "caret-down-fill",
+ "caret-down-square-fill",
+ "caret-down-square",
+ "caret-left-fill",
+ "caret-left-square-fill",
+ "caret-left-square",
+ "caret-right-fill",
+ "caret-right-square-fill",
+ "caret-right-square",
+ "caret-up-fill",
+ "caret-up-square-fill",
+ "caret-up-square",
+ "cart-fill",
+ "cart",
+ "cash-stack",
+ "cash",
+ "cast",
+ "cctv",
+ "chat-box-left-dots-fill",
+ "chat-box-left-dots",
+ "chat-box-left-fill",
+ "chat-box-left-text-fill",
+ "chat-box-left-text",
+ "chat-box-left",
+ "chat-box-right-dots-fill",
+ "chat-box-right-dots",
+ "chat-box-right-fill",
+ "chat-box-right-text-fill",
+ "chat-box-right-text",
+ "chat-box-right",
+ "chat-circle-left-dot-fill",
+ "chat-circle-left-dot",
+ "chat-circle-left-fill",
+ "chat-circle-left-text-fill",
+ "chat-circle-left-text",
+ "chat-circle-left",
+ "chat-circle-right-dot-fill",
+ "chat-circle-right-dot",
+ "chat-circle-right-fill",
+ "chat-circle-right-text-fill",
+ "chat-circle-right-text",
+ "chat-circle-right",
+ "check-box",
+ "check-circle-fill",
+ "check-circle-line",
+ "check-circle",
+ "check-square-fill",
+ "check-square-line",
+ "check-square",
+ "check",
+ "chevron-bar-contract",
+ "chevron-bar-down",
+ "chevron-bar-expand",
+ "chevron-bar-left",
+ "chevron-bar-right",
+ "chevron-bar-up",
+ "chevron-contract",
+ "chevron-double-down",
+ "chevron-double-left",
+ "chevron-double-right",
+ "chevron-double-up",
+ "chevron-down",
+ "chevron-expand",
+ "chevron-left",
+ "chevron-right",
+ "chevron-up",
+ "clipboard-check",
+ "clipboard-data",
+ "clipboard-text",
+ "clipboard",
+ "clock-fill",
+ "clock-history",
+ "clock",
+ "cloud-arrow-down-fill",
+ "cloud-arrow-down",
+ "cloud-arrow-up-fill",
+ "cloud-arrow-up",
+ "cloud-check-fill",
+ "cloud-check",
+ "cloud-fill",
+ "cloud",
+ "code-square",
+ "code",
+ "collection-fill",
+ "collection",
+ "compass-fill",
+ "compass",
+ "cone",
+ "controller-fill",
+ "controller",
+ "copyright-sign",
+ "copyright-symbol",
+ "COVID-19-fill",
+ "COVID-19",
+ "cpu-fill",
+ "cpu",
+ "crop",
+ "cup-fill",
+ "cup-straw",
+ "cup",
+ "cursor-fill",
+ "cursor-text",
+ "cursor",
+ "dash-circle-fill",
+ "dash-circle",
+ "dash-square-fill",
+ "dash-square",
+ "dash",
+ "dashboard",
+ "diagram",
+ "diamond-fill",
+ "diamond",
+ "diamond2",
+ "display-fill",
+ "display",
+ "dns",
+ "door-closed-fill",
+ "door-closed",
+ "download_app",
+ "download",
+ "email-fill-notification",
+ "email-fill-open",
+ "email-fill",
+ "email-notification",
+ "email-open",
+ "email",
+ "emergenc_call",
+ "emergenc",
+ "exclamation-chat-fill",
+ "exclamation-chat",
+ "exclamation-circle-fill",
+ "exclamation-circle",
+ "exclamation-diamond-fill",
+ "exclamation-diamond",
+ "exclamation-square-circle",
+ "exclamation-square-fill",
+ "exclamation-square",
+ "exclamation-triangle-fill",
+ "exclamation-triangle",
+ "exclamation",
+ "exclude",
+ "face-id",
+ "facebook-circle",
+ "facebook-square",
+ "favorite-hart",
+ "favorite-star",
+ "file-copy",
+ "file-excel",
+ "file-image",
+ "file-keynote",
+ "file-numbers",
+ "file-powerpoint",
+ "file-text",
+ "file-word",
+ "file",
+ "filter-circle-fill",
+ "filter-circle",
+ "filter-left",
+ "filter-right",
+ "filter-square-fill",
+ "filter-square",
+ "filter",
+ "finder-folder",
+ "finder",
+ "fingerprint",
+ "flag-fill",
+ "flag",
+ "flashlight",
+ "folder-check",
+ "folder-delet",
+ "folder-fill",
+ "folder-open-fill",
+ "folder-open",
+ "folder-plus",
+ "folder-share",
+ "folder-x",
+ "folder",
+ "font",
+ "fullscreen-exit",
+ "fullscreen",
+ "gear-fill",
+ "gear-square-fill",
+ "gear-system-update",
+ "gear",
+ "gem",
+ "geo-alt",
+ "geo-location",
+ "geo-my-location",
+ "gift-fill",
+ "gift",
+ "graph-down",
+ "graph-up",
+ "grid-2-fill",
+ "grid-3-fill",
+ "grid",
+ "grip-horizontal",
+ "grip-vertical",
+ "group",
+ "group2",
+ "hand-index",
+ "harf",
+ "hart-fill",
+ "hart-half",
+ "hash",
+ "hdd-network",
+ "hdd",
+ "hexagon-fill",
+ "hexagon-harf",
+ "hexagon",
+ "history",
+ "home-fill",
+ "home",
+ "hotel_bed",
+ "hotel",
+ "image-fill",
+ "image",
+ "images",
+ "info-box",
+ "info-circle",
+ "info-fill",
+ "info",
+ "instagram-circle",
+ "instagram-fill",
+ "instagram",
+ "intersect",
+ "justify-left",
+ "justify-right",
+ "justify",
+ "kakao-alim-talk",
+ "kakao-circle",
+ "kakao-firend-talk",
+ "kakao-story-circle",
+ "kakao-story",
+ "kakao-talk",
+ "key",
+ "keyboard",
+ "label",
+ "language",
+ "laptop-fill",
+ "laptop",
+ "layer-back",
+ "layer-front",
+ "layer",
+ "lightning-fill",
+ "lightning",
+ "list-check",
+ "list",
+ "local-airport-land",
+ "local-airport",
+ "local-atm",
+ "local-bar",
+ "local-cafe",
+ "local-dining",
+ "local-ev-station",
+ "local-fastfood",
+ "local-gas-station",
+ "local-hospital",
+ "local-laundry",
+ "local-library",
+ "local-museum",
+ "local-restaurant",
+ "local-store",
+ "lock-open",
+ "lock",
+ "map-fill",
+ "map",
+ "menu-close-fill",
+ "menu-close",
+ "menu-open-fill",
+ "menu-open",
+ "mic-fill",
+ "mic-mute-fill",
+ "mic-mute",
+ "mic",
+ "minus",
+ "mobile-android",
+ "mobile-flip",
+ "mobile-fold",
+ "mobile-ios",
+ "mobile-pad",
+ "mobile-store",
+ "mobile",
+ "moon-crescent",
+ "moon-half",
+ "moon",
+ "more-horiz",
+ "more-vert",
+ "movie-fill",
+ "movie",
+ "music-backward-fill",
+ "music-backward",
+ "music-forward-fill",
+ "music-forward",
+ "music-list",
+ "music-pause-fill",
+ "music-pause",
+ "music-play-fill",
+ "music-play",
+ "music-stop-fill",
+ "music-stop",
+ "music",
+ "naver-blog",
+ "naver-circle",
+ "naver",
+ "news",
+ "option",
+ "paperclip",
+ "payment",
+ "pen-fill",
+ "pen",
+ "pencil-fill",
+ "pencil-square",
+ "pencil",
+ "person-fill",
+ "person",
+ "personal-information",
+ "pet",
+ "power",
+ "print",
+ "problem",
+ "profile-smile",
+ "profile",
+ "push-assemble",
+ "push-fill",
+ "push-notification",
+ "push",
+ "question-answer",
+ "question-circle-fill",
+ "question-circle",
+ "question-diamond-fill",
+ "question-diamond",
+ "question-square-fill",
+ "question-square",
+ "question",
+ "radio",
+ "receipt",
+ "refresh-fill",
+ "refresh",
+ "reset-fill",
+ "reset",
+ "rotation-lock",
+ "rotation",
+ "rwis",
+ "search",
+ "server",
+ "share",
+ "shield",
+ "shift-fill",
+ "shift",
+ "shuffle",
+ "silent",
+ "sim",
+ "slash",
+ "sliders",
+ "smart-watch",
+ "sort-alpha-down-alt",
+ "sort-alpha-down",
+ "sort-alpha-up-alt",
+ "sort-alpha-up",
+ "sort-down-alt",
+ "sort-down",
+ "sort-numeric-down-alt",
+ "sort-numeric-down",
+ "sort-numeric-up-alt",
+ "sort-numeric-up",
+ "sort-up-alt",
+ "sort-up",
+ "sound",
+ "soundwave",
+ "square-fill",
+ "square",
+ "star-circle",
+ "star-fill",
+ "star",
+ "statistics-circle",
+ "statistics",
+ "sticky-fill",
+ "sticky",
+ "stoplights-fill",
+ "stoplights",
+ "sunny",
+ "tab",
+ "table",
+ "terminal-fill",
+ "terminal",
+ "ternnel",
+ "textarea-t",
+ "textarea",
+ "thermometer-full",
+ "thermometer-half",
+ "thermometer",
+ "time-end",
+ "time-full",
+ "time-start",
+ "toggle-off",
+ "toggle-on",
+ "toggle",
+ "train",
+ "trash-fill",
+ "trash",
+ "truck-fill",
+ "truck",
+ "ui-checks-grid",
+ "ui-radios-grid",
+ "upload",
+ "vibration",
+ "vms",
+ "volume-down-fill",
+ "volume-down",
+ "volume-mute-fill",
+ "volume-mute",
+ "volume-off-fill",
+ "volume-off",
+ "volume-up-fill",
+ "volume-up",
+ "weather-cloud-fill",
+ "weather-cloud",
+ "weather-cloudy-gusts",
+ "weather-cloudy-windy",
+ "weather-cloudy",
+ "weather-fahrenheit",
+ "weather-fog",
+ "weather-hail",
+ "weather-humidity",
+ "weather-hurricane",
+ "weather-lightning",
+ "weather-rain",
+ "weather-rainny",
+ "weather-snow",
+ "weather-snowflake",
+ "weather-sunny-overcast",
+ "weather-sunny",
+ "weather-thunderstorm",
+ "weather-umbrella",
+ "weather-windy",
+ "whater",
+ "whather-celsius",
+ "wifi-1",
+ "wifi-2",
+ "wifi-off",
+ "wifi",
+ "window",
+ "x-circle-fill",
+ "x-circle",
+ "x-square-fill",
+ "x-square",
+ "x",
+ "zoom-in",
+ "zoom-out",
+ "server-line",
+];
diff --git a/packages/common/components/src/ui/icon-finder/icon-finder.stories.tsx b/packages/common/components/src/ui/icon-finder/icon-finder.stories.tsx
new file mode 100644
index 000000000..59a37c8c7
--- /dev/null
+++ b/packages/common/components/src/ui/icon-finder/icon-finder.stories.tsx
@@ -0,0 +1,16 @@
+import type { Meta, StoryObj } from "@storybook/react";
+import { IconFinder } from "./index";
+
+const meta: Meta
= {
+ title: "UI/IconFinder",
+ component: IconFinder,
+ tags: ["autodocs"],
+ argTypes: {},
+};
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => ,
+};
diff --git a/packages/common/components/src/ui/icon-finder/index.tsx b/packages/common/components/src/ui/icon-finder/index.tsx
new file mode 100644
index 000000000..62e6e195a
--- /dev/null
+++ b/packages/common/components/src/ui/icon-finder/index.tsx
@@ -0,0 +1,74 @@
+import { useState } from "react";
+import { Button } from "../button";
+import { Dialog, DialogContent, DialogTrigger } from "../dialog";
+import { cn } from "../../lib";
+import iconNames from "./data";
+
+type IconFinderProps = {
+ handleClick: (icon: string) => void;
+};
+
+const IconFinder = ({ handleClick }: IconFinderProps) => {
+ const [selectedIcon, setSelectedIcon] = useState("");
+
+ const handleIconClick = (icon: string) => {
+ setSelectedIcon(icon);
+ handleClick(icon);
+ };
+
+ return (
+
+ );
+};
+
+const IconItem = ({
+ icon,
+ selectedIcon,
+ handleClick,
+}: {
+ icon: string;
+ selectedIcon: string;
+ handleClick: (icon: string) => void;
+}) => {
+ return (
+ handleClick(icon)}
+ >
+
+
+ {icon}
+
+ );
+};
+
+export { IconFinder };
diff --git a/packages/common/components/src/ui/index.ts b/packages/common/components/src/ui/index.ts
index 438c18dbd..650eb30e1 100644
--- a/packages/common/components/src/ui/index.ts
+++ b/packages/common/components/src/ui/index.ts
@@ -7,8 +7,8 @@ export * from "./data-table";
export * from "./date-picker";
export * from "./dialog";
export * from "./dropdown-menu";
-export * from "./input";
export * from "./file-search";
+export * from "./icon-finder";
export * from "./input";
export * from "./label";
export * from "./layout";
diff --git a/packages/common/components/src/ui/layout/base.tsx b/packages/common/components/src/ui/layout/base.tsx
index 19b64511f..9dd778e03 100644
--- a/packages/common/components/src/ui/layout/base.tsx
+++ b/packages/common/components/src/ui/layout/base.tsx
@@ -1,28 +1,35 @@
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-
-import { LNB } from "./lnb";
+import { QueryProvider } from "../../provider/query-provider";
+import { SidebarProvider } from "../sidebar";
+import { LNB } from "../lnb";
import { Header } from "../header";
import { Footer } from "./footer";
import "./common.css";
+import type { QueryClient } from "@tanstack/react-query";
-const queryClient = new QueryClient();
-
-export function BaseLayout({ children }: { children: React.ReactNode }) {
+export function BaseLayout({
+ children,
+ queryClient,
+}: {
+ children: React.ReactNode;
+ queryClient?: QueryClient;
+}) {
return (
-
-
-
-
-
-
-
-
+
+
);
}
diff --git a/packages/common/components/src/ui/layout/lnb.tsx b/packages/common/components/src/ui/layout/lnb.tsx
deleted file mode 100644
index f7d3a9be8..000000000
--- a/packages/common/components/src/ui/layout/lnb.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-export function LNB() {
- return (
-
- );
-}
diff --git a/packages/common/components/src/ui/layout/vbase.tsx b/packages/common/components/src/ui/layout/vbase.tsx
index 5a4ca8df4..d73f14254 100644
--- a/packages/common/components/src/ui/layout/vbase.tsx
+++ b/packages/common/components/src/ui/layout/vbase.tsx
@@ -1,28 +1,35 @@
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-
-import { LNB } from "./lnb";
+import { QueryProvider } from "../../provider/query-provider";
+import { SidebarProvider } from "../sidebar";
+import { LNB } from "../lnb";
import { Header } from "../header";
import { Footer } from "./footer";
import "./common.css";
+import type { QueryClient } from "@tanstack/react-query";
-const queryClient = new QueryClient();
-
-export function VBaseLayout({ children }: { children: React.ReactNode }) {
+export function VBaseLayout({
+ children,
+ queryClient,
+}: {
+ children: React.ReactNode;
+ queryClient?: QueryClient;
+}) {
return (
-
-
-
-
-
-
-
-
+
+
);
}
diff --git a/packages/common/components/src/ui/lnb/index.tsx b/packages/common/components/src/ui/lnb/index.tsx
new file mode 100644
index 000000000..b1a7fe094
--- /dev/null
+++ b/packages/common/components/src/ui/lnb/index.tsx
@@ -0,0 +1,100 @@
+import { useState } from "react";
+import { useQuery } from "@tanstack/react-query";
+import { ChevronRight } from "lucide-react";
+import { cn } from "../../lib/utils";
+import { ENDPOINT, SITE_ID } from "../../config";
+import { getMenuList, type MenuItem } from "../../api";
+import {
+ Sidebar,
+ SidebarContent,
+ SidebarMenu,
+ SidebarMenuButton,
+ SidebarMenuItem,
+ SidebarMenuSub,
+} from "../sidebar";
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from "../collapsible";
+import { getParentIds } from "./lib";
+
+export function LNB({ viewOnly }: { viewOnly?: boolean }) {
+ const { data: menuList } = useQuery({
+ queryKey: [ENDPOINT.CMS_SERVICE.MENU_ROLES],
+ queryFn: () => getMenuList(SITE_ID),
+ enabled: !viewOnly,
+ });
+
+ const [openMenuIds, setOpenMenuIds] = useState
([]);
+
+ function MenuItem({ item }: { item: MenuItem }) {
+ if (item.children) {
+ return ;
+ }
+
+ return (
+
+
+
+ {item.menuKornNm}
+
+
+ );
+ }
+
+ function MenuGroup({ item }: { item: MenuItem }) {
+ const isOpen = openMenuIds.includes(item.menuCd);
+
+ const handleOpenChange = (open: boolean) => {
+ if (open) {
+ if (!openMenuIds.includes(item.menuCd)) {
+ const parentIds = getParentIds(item.menuCd)(menuList ?? []);
+ setOpenMenuIds([...parentIds, item.menuCd]);
+ }
+ } else {
+ setOpenMenuIds((prev) => prev.filter((id) => id !== item.menuCd));
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+ {item.menuKornNm}
+
+
+
+
+
+
+
+ {item.children?.map((child) => (
+
+ ))}
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ {menuList?.map((item) => )}
+
+
+
+ );
+}
diff --git a/packages/common/components/src/ui/lnb/lib.ts b/packages/common/components/src/ui/lnb/lib.ts
new file mode 100644
index 000000000..4ad81fcd0
--- /dev/null
+++ b/packages/common/components/src/ui/lnb/lib.ts
@@ -0,0 +1,36 @@
+import type { MenuItem } from "../../api";
+
+function getParentIds(menuCd: number): (menuList: MenuItem[]) => number[] {
+ return (menuList: MenuItem[]) => {
+ const parentIds: number[] = [];
+ let currentId = menuCd;
+
+ while (true) {
+ const menu = findMenuById(currentId)(menuList);
+ if (!menu || !menu.parentId) break;
+ parentIds.push(menu.parentId);
+ currentId = menu.parentId;
+ }
+
+ return parentIds;
+ };
+}
+
+function findMenuById(
+ menuCd: number,
+): (menuList: MenuItem[]) => MenuItem | undefined {
+ function findInMenu(items: MenuItem[]): MenuItem | undefined {
+ for (const item of items) {
+ if (item.menuCd === menuCd) return item;
+ if (item.children) {
+ const found = findInMenu(item.children);
+ if (found) return found;
+ }
+ }
+ return undefined;
+ }
+
+ return findInMenu;
+}
+
+export { getParentIds, findMenuById };
diff --git a/packages/common/components/src/ui/loading/loading.stories.tsx b/packages/common/components/src/ui/loading/loading.stories.tsx
index ba59300af..54dcecd21 100644
--- a/packages/common/components/src/ui/loading/loading.stories.tsx
+++ b/packages/common/components/src/ui/loading/loading.stories.tsx
@@ -11,7 +11,7 @@ type Story = StoryObj;
export const Primary: Story = {
render: () => (
-
+
@@ -21,7 +21,7 @@ export const Primary: Story = {
export const Secondary: Story = {
render: () => (
-
+
@@ -31,7 +31,7 @@ export const Secondary: Story = {
export const PrimaryWithImage: Story = {
render: () => (
-
+
@@ -41,7 +41,7 @@ export const PrimaryWithImage: Story = {
export const SecondaryWithImage: Story = {
render: () => (
-
+
diff --git a/packages/common/components/src/ui/sidebar/index.tsx b/packages/common/components/src/ui/sidebar/index.tsx
index eee581419..317fb46de 100644
--- a/packages/common/components/src/ui/sidebar/index.tsx
+++ b/packages/common/components/src/ui/sidebar/index.tsx
@@ -3,7 +3,7 @@ import { Slot } from "@radix-ui/react-slot";
import { type VariantProps, cva } from "class-variance-authority";
import { PanelLeft } from "lucide-react";
-import { useIsMobile } from "../../hooks/use-mobile";
+import { useIsMobile } from "../../lib/use-mobile";
import { cn } from "../../lib/utils";
import { Button } from "../button";
import { Input } from "../input";
@@ -25,7 +25,7 @@ import {
const SIDEBAR_COOKIE_NAME = "sidebar_state";
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
-const SIDEBAR_WIDTH = "16rem";
+const SIDEBAR_WIDTH = "22rem";
const SIDEBAR_WIDTH_MOBILE = "18rem";
const SIDEBAR_WIDTH_ICON = "3rem";
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
diff --git a/packages/common/components/src/ui/table/table.css b/packages/common/components/src/ui/table/table.css
index 5f49d89d8..08233787a 100644
--- a/packages/common/components/src/ui/table/table.css
+++ b/packages/common/components/src/ui/table/table.css
@@ -5,7 +5,7 @@
@apply bg-[#5987bf] px-4 py-[1.2rem] text-[1.3rem] font-medium leading-[1.2] text-[#fff];
}
.table-ui td {
- @apply border-b border-b-border px-2 py-[1.2rem] text-[1.3rem] font-normal leading-[1.2] text-[#666];
+ @apply border-b border-b-border px-2 py-[1.2rem] text-[1.3rem] font-normal leading-[1.2] text-label;
}
.table-ui.secondary th {
@@ -24,7 +24,7 @@
@apply border-b border-b-border;
}
- [data-mode="dark"] {
+ [data-theme="black"] {
.table-ui th {
@apply bg-[#5e7b9c] text-[#fff];
}
diff --git a/packages/common/components/tailwind.config.js b/packages/common/components/tailwind.config.js
index 5638e09ec..c6fc89183 100644
--- a/packages/common/components/tailwind.config.js
+++ b/packages/common/components/tailwind.config.js
@@ -3,7 +3,6 @@ import presetConfig from "../../../tailwind.config.preset";
/** @type {import('tailwindcss').Config} */
export default {
presets: [presetConfig],
- darkMode: ["class", "[data-mode='dark']"],
content: ["./src/**/*.{ts,tsx,js,jsx}", "./.storybook/**/*.{ts,tsx,js,jsx}"],
plugins: [require("tailwindcss-animate")],
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e0f40b152..82f59a6cd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,6 +51,9 @@ importers:
'@hookform/resolvers':
specifier: ^4.1.3
version: 4.1.3(react-hook-form@7.54.2)
+ '@minoru/react-dnd-treeview':
+ specifier: ^3.5.0
+ version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1)
'@radix-ui/react-label':
specifier: ^2.1.2
version: 2.1.2(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1)
@@ -81,6 +84,9 @@ importers:
react-chartjs-2:
specifier: ^5.3.0
version: 5.3.0(chart.js@4.4.8)(react@18.3.1)
+ react-dnd:
+ specifier: ^16.0.1
+ version: 16.0.1(@types/node@22.13.5)(@types/react@18.3.18)(react@18.3.1)
react-hook-form:
specifier: ^7.54.2
version: 7.54.2(react@18.3.1)
@@ -354,6 +360,9 @@ importers:
'@common/assets':
specifier: workspace:*
version: link:../assets
+ '@frontend-opensource/use-react-hooks':
+ specifier: ^1.1.4
+ version: 1.1.4
'@minoru/react-dnd-treeview':
specifier: ^3.5.0
version: 3.5.0(dnd-core@16.0.1)(react-dnd@16.0.1)(react-dom@18.3.1)(react@18.3.1)
@@ -363,6 +372,9 @@ importers:
'@radix-ui/react-checkbox':
specifier: ^1.1.4
version: 1.1.4(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1)
+ '@radix-ui/react-collapsible':
+ specifier: ^1.1.3
+ version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1)
'@radix-ui/react-dialog':
specifier: ^1.1.6
version: 1.1.6(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1)