@samkwang/ui-kit 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.
@@ -0,0 +1,391 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React$1 from 'react';
3
+ import { HTMLAttributes, ReactNode } from 'react';
4
+ import { VariantProps } from 'class-variance-authority';
5
+ import * as LabelPrimitive from '@radix-ui/react-label';
6
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
7
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
8
+ import * as react_jsx_runtime from 'react/jsx-runtime';
9
+ import { ColumnDef, RowSelectionState, SortingState, Column } from '@tanstack/react-table';
10
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
11
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
12
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
13
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
14
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
15
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
16
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
17
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
18
+ import { ClassValue } from 'clsx';
19
+
20
+ declare const buttonVariants: (props?: ({
21
+ variant?: "primary" | "secondary" | "danger" | "ghost" | "link" | null | undefined;
22
+ size?: "sm" | "default" | "lg" | "icon" | null | undefined;
23
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
24
+ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
25
+ asChild?: boolean;
26
+ loading?: boolean;
27
+ fullWidth?: boolean;
28
+ }
29
+ declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
30
+
31
+ interface InputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
32
+ label?: string;
33
+ helperText?: string;
34
+ errorText?: string;
35
+ inputSize?: "sm" | "default" | "lg";
36
+ }
37
+ declare const Input: React$1.ForwardRefExoticComponent<InputProps & React$1.RefAttributes<HTMLInputElement>>;
38
+
39
+ interface LabelProps extends React$1.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {
40
+ required?: boolean;
41
+ }
42
+ declare const Label: React$1.ForwardRefExoticComponent<LabelProps & React$1.RefAttributes<HTMLLabelElement>>;
43
+
44
+ interface TextareaProps extends React$1.TextareaHTMLAttributes<HTMLTextAreaElement> {
45
+ label?: string;
46
+ helperText?: string;
47
+ errorText?: string;
48
+ }
49
+ declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$1.RefAttributes<HTMLTextAreaElement>>;
50
+
51
+ interface SelectOption {
52
+ value: string;
53
+ label: string;
54
+ disabled?: boolean;
55
+ }
56
+ interface SelectProps extends Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "size"> {
57
+ label?: string;
58
+ helperText?: string;
59
+ errorText?: string;
60
+ options: SelectOption[];
61
+ placeholder?: string;
62
+ selectSize?: "sm" | "default" | "lg";
63
+ }
64
+ declare const Select: React$1.ForwardRefExoticComponent<SelectProps & React$1.RefAttributes<HTMLSelectElement>>;
65
+
66
+ interface CheckboxProps extends React$1.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {
67
+ label?: string;
68
+ }
69
+ declare const Checkbox: React$1.ForwardRefExoticComponent<CheckboxProps & React$1.RefAttributes<HTMLButtonElement>>;
70
+
71
+ interface SwitchProps extends React$1.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root> {
72
+ label?: string;
73
+ switchSize?: "sm" | "default";
74
+ }
75
+ declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.RefAttributes<HTMLButtonElement>>;
76
+
77
+ interface SearchProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size" | "type"> {
78
+ searchSize?: "sm" | "lg";
79
+ onClear?: () => void;
80
+ }
81
+ declare const Search: React$1.ForwardRefExoticComponent<SearchProps & React$1.RefAttributes<HTMLInputElement>>;
82
+
83
+ /** plm-ui-standard 시맨틱 상태 (--color-danger / warning / success / info) */
84
+ type PlmBadgeVariant = "danger" | "warning" | "success" | "info" | "neutral";
85
+ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
86
+ variant: PlmBadgeVariant;
87
+ }
88
+ /**
89
+ * 상태·라벨용 공통 배지. 배경은 틴트(color-mix), 텍스트는 시맨틱 색.
90
+ */
91
+ declare function Badge({ variant, className, children, ...rest }: BadgeProps): react_jsx_runtime.JSX.Element;
92
+
93
+ interface TableProps extends HTMLAttributes<HTMLTableElement> {
94
+ children: ReactNode;
95
+ /** 스크롤 래퍼(폭 100%)에 추가 클래스 */
96
+ frameClassName?: string;
97
+ }
98
+ /**
99
+ * 통합 테이블 래퍼: 부모 폭 100%, 가로 스크롤, 내부 `<table class="plm-table">`.
100
+ * 셀 패딩·구분선은 전역 `.plm-table` 스타일을 따른다.
101
+ */
102
+ declare function Table({ frameClassName, className, children, ...tableProps }: TableProps): react_jsx_runtime.JSX.Element;
103
+
104
+ interface TablePaginationProps {
105
+ pageIndex: number;
106
+ pageCount: number;
107
+ onPageChange: (nextIndex: number) => void;
108
+ className?: string;
109
+ /** 접근성 라벨 */
110
+ "aria-label"?: string;
111
+ }
112
+ /**
113
+ * 테이블 하단 우측 미니 페이지네이션 (참고 UI: ◀ 1 2 … ▶).
114
+ */
115
+ declare function TablePagination({ pageIndex, pageCount, onPageChange, className, "aria-label": ariaLabel, }: TablePaginationProps): react_jsx_runtime.JSX.Element | null;
116
+
117
+ type DataTableVariant = "service-desk" | "data-table" | "project-task";
118
+ interface SortButtonProps<TData> {
119
+ column: Column<TData, unknown>;
120
+ children: React.ReactNode;
121
+ variant: DataTableVariant;
122
+ sortButtonClassName?: string;
123
+ }
124
+ /** TanStack 컬럼 헤더용 정렬 버튼 */
125
+ declare function SortButton<TData>({ column, children, variant, sortButtonClassName, }: SortButtonProps<TData>): react_jsx_runtime.JSX.Element;
126
+ interface DataTableProps<TData> {
127
+ data: TData[];
128
+ columns: ColumnDef<TData, any>[];
129
+ getRowId?: (row: TData, index: number) => string;
130
+ onRowClick?: (row: TData) => void;
131
+ /** 단일 행 선택 (클릭 기반) */
132
+ enableRowSelection?: boolean;
133
+ selectedRowId?: string | null;
134
+ onSelectedRowChange?: (rowId: string | null, row: TData | null) => void;
135
+ /** 멀티 행 선택 (체크박스 기반) — enableRowSelection과 독립 동작 */
136
+ enableMultiSelect?: boolean;
137
+ selectedRowIds?: RowSelectionState;
138
+ onSelectedRowsChange?: (selectedIds: RowSelectionState, selectedRows: TData[]) => void;
139
+ rowClassName?: (row: TData) => string | undefined;
140
+ emptyMessage?: string;
141
+ variant?: DataTableVariant;
142
+ wrapClassName?: string;
143
+ tableClassName?: string;
144
+ initialSorting?: SortingState;
145
+ enableSorting?: boolean;
146
+ /** 설정 시 클라이언트 페이지네이션 및 하단 페이지 바 표시 */
147
+ pageSize?: number;
148
+ }
149
+ declare function DataTable<TData>({ data, columns: userColumns, getRowId, onRowClick, enableRowSelection, selectedRowId, onSelectedRowChange, enableMultiSelect, selectedRowIds: controlledRowSelection, onSelectedRowsChange, rowClassName, emptyMessage, variant, wrapClassName, tableClassName, initialSorting, enableSorting, pageSize, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
150
+
151
+ declare const Tabs: React$1.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React$1.RefAttributes<HTMLDivElement>>;
152
+ declare const TabsList: React$1.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & {
153
+ variant?: "line" | "contained";
154
+ } & React$1.RefAttributes<HTMLDivElement>>;
155
+ declare const TabsTrigger: React$1.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React$1.RefAttributes<HTMLButtonElement>, "ref"> & {
156
+ variant?: "line" | "contained";
157
+ } & React$1.RefAttributes<HTMLButtonElement>>;
158
+ declare const TabsContent: React$1.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
159
+
160
+ interface TreeNode {
161
+ id: string;
162
+ label: string;
163
+ icon?: React$1.ReactNode;
164
+ children?: TreeNode[];
165
+ disabled?: boolean;
166
+ }
167
+ interface TreeViewProps {
168
+ data: TreeNode[];
169
+ defaultExpanded?: string[];
170
+ onSelect?: (node: TreeNode) => void;
171
+ selectedId?: string;
172
+ className?: string;
173
+ }
174
+ declare function TreeView({ data, defaultExpanded, onSelect, selectedId, className }: TreeViewProps): react_jsx_runtime.JSX.Element;
175
+
176
+ interface ListProps extends React$1.HTMLAttributes<HTMLUListElement> {
177
+ variant?: "default" | "contained";
178
+ }
179
+ declare const List: React$1.ForwardRefExoticComponent<ListProps & React$1.RefAttributes<HTMLUListElement>>;
180
+ interface ListItemProps extends React$1.LiHTMLAttributes<HTMLLIElement> {
181
+ active?: boolean;
182
+ disabled?: boolean;
183
+ interactive?: boolean;
184
+ }
185
+ declare const ListItem: React$1.ForwardRefExoticComponent<ListItemProps & React$1.RefAttributes<HTMLLIElement>>;
186
+ interface ListHeaderProps extends React$1.HTMLAttributes<HTMLDivElement> {
187
+ }
188
+ declare const ListHeader: React$1.ForwardRefExoticComponent<ListHeaderProps & React$1.RefAttributes<HTMLDivElement>>;
189
+
190
+ declare const Accordion: React$1.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & React$1.RefAttributes<HTMLDivElement>>;
191
+ declare const AccordionItem: React$1.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
192
+ declare const AccordionTrigger: React$1.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React$1.RefAttributes<HTMLButtonElement>, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
193
+ declare const AccordionContent: React$1.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
194
+
195
+ declare const Dialog: React$1.FC<DialogPrimitive.DialogProps>;
196
+ declare const DialogTrigger: React$1.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
197
+ declare const DialogClose: React$1.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
198
+ declare const DialogContent: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & {
199
+ size?: "sm" | "default" | "lg" | "xl" | "full";
200
+ hideClose?: boolean;
201
+ } & React$1.RefAttributes<HTMLDivElement>>;
202
+ declare const DialogHeader: ({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>) => react_jsx_runtime.JSX.Element;
203
+ declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
204
+ declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
205
+ declare const DialogBody: ({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>) => react_jsx_runtime.JSX.Element;
206
+ declare const DialogFooter: ({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>) => react_jsx_runtime.JSX.Element;
207
+
208
+ /**
209
+ * 표준 모달 공통 타입
210
+ */
211
+ interface StandardModalProps {
212
+ open: boolean;
213
+ onClose: () => void;
214
+ title: string;
215
+ children: React.ReactNode;
216
+ /** 저장 시 호출. 없으면 저장 버튼 미노출 */
217
+ onSave?: () => void | Promise<void>;
218
+ cancelLabel?: string;
219
+ saveLabel?: string;
220
+ /** true이면 닫기/취소 시 확인 */
221
+ hasUnsavedChanges?: boolean;
222
+ saveDisabled?: boolean;
223
+ /** 헤더에 추가로 표시할 요소 (기본: 취소/저장 버튼) */
224
+ headerActions?: React.ReactNode;
225
+ /** overlay 클릭 시 닫기 (기본 true) */
226
+ closeOnOverlayClick?: boolean;
227
+ /** aria-label for dialog */
228
+ ariaLabel?: string;
229
+ /** `.standard-modal`에 추가 클래스 (예: standard-modal--wide) */
230
+ modalClassName?: string;
231
+ }
232
+ interface ModalSectionProps {
233
+ title: string;
234
+ children: React.ReactNode;
235
+ /** 단일 열 레이아웃 사용 시 true */
236
+ fullWidth?: boolean;
237
+ }
238
+ interface FormGridProps {
239
+ children: React.ReactNode;
240
+ /** true면 1열 (grid-column: 1 / -1) */
241
+ fullWidth?: boolean;
242
+ }
243
+ interface ModalActionButtonsProps {
244
+ onCancel: () => void;
245
+ onSave?: () => void | Promise<void>;
246
+ cancelLabel?: string;
247
+ saveLabel?: string;
248
+ saveDisabled?: boolean;
249
+ }
250
+
251
+ /**
252
+ * 표준 Form Modal: 헤더(제목 + 취소/저장) 고정, Body 스크롤, ESC/닫기 경고
253
+ */
254
+ declare function StandardModal({ open, onClose, title, children, onSave, cancelLabel, saveLabel, hasUnsavedChanges, saveDisabled, headerActions, closeOnOverlayClick, ariaLabel, modalClassName, }: StandardModalProps): React$1.ReactPortal | null;
255
+
256
+ interface ModalHeaderProps {
257
+ title: string;
258
+ /** 우측 액션 (기본: ModalActionButtons) */
259
+ actions?: ReactNode;
260
+ }
261
+ /**
262
+ * 모달 상단: [ 제목 | 액션(취소/저장) ]
263
+ */
264
+ declare function ModalHeader({ title, actions }: ModalHeaderProps): react_jsx_runtime.JSX.Element;
265
+
266
+ /**
267
+ * 모달 내 섹션: 제목 + 구분선 + 내용
268
+ */
269
+ declare function ModalSection({ title, children, fullWidth }: ModalSectionProps): react_jsx_runtime.JSX.Element;
270
+
271
+ /**
272
+ * 2열 그리드 (1fr 1fr, gap 16px). fullWidth면 단일 열.
273
+ */
274
+ declare function FormGrid({ children, fullWidth }: FormGridProps): react_jsx_runtime.JSX.Element;
275
+
276
+ interface FormFieldProps {
277
+ label: string;
278
+ required?: boolean;
279
+ helper?: string;
280
+ /** 단일 열로 span (FormGrid 내에서) */
281
+ fullWidth?: boolean;
282
+ children: ReactNode;
283
+ }
284
+ /**
285
+ * 라벨(* 옵션) + children + 보조 설명(helper)
286
+ */
287
+ declare function FormField({ label, required, helper, fullWidth, children }: FormFieldProps): react_jsx_runtime.JSX.Element;
288
+
289
+ /**
290
+ * 모달 헤더용 액션 버튼: [취소] [저장]
291
+ * 취소 = Ghost/Secondary, 저장 = Primary
292
+ */
293
+ declare function ModalActionButtons({ onCancel, onSave, cancelLabel, saveLabel, saveDisabled, }: ModalActionButtonsProps): react_jsx_runtime.JSX.Element;
294
+
295
+ declare const DropdownMenu: React$1.FC<DropdownMenuPrimitive.DropdownMenuProps>;
296
+ declare const DropdownMenuTrigger: React$1.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
297
+ declare const DropdownMenuGroup: React$1.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & React$1.RefAttributes<HTMLDivElement>>;
298
+ declare const DropdownMenuSub: React$1.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
299
+ declare const DropdownMenuSubTrigger: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
300
+ declare const DropdownMenuSubContent: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
301
+ declare const DropdownMenuContent: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
302
+ declare const DropdownMenuItem: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & {
303
+ destructive?: boolean;
304
+ } & React$1.RefAttributes<HTMLDivElement>>;
305
+ declare const DropdownMenuCheckboxItem: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
306
+ declare const DropdownMenuSeparator: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
307
+ declare const DropdownMenuLabel: React$1.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
308
+
309
+ declare const Popover: React$1.FC<PopoverPrimitive.PopoverProps>;
310
+ declare const PopoverTrigger: React$1.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
311
+ declare const PopoverAnchor: React$1.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React$1.RefAttributes<HTMLDivElement>>;
312
+ declare const PopoverClose: React$1.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
313
+ declare const PopoverContent: React$1.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
314
+
315
+ declare const TooltipProvider: React$1.FC<TooltipPrimitive.TooltipProviderProps>;
316
+ interface TooltipProps {
317
+ content: React$1.ReactNode;
318
+ children: React$1.ReactNode;
319
+ side?: "top" | "bottom" | "left" | "right";
320
+ delayDuration?: number;
321
+ className?: string;
322
+ }
323
+ declare function Tooltip({ content, children, side, delayDuration, className }: TooltipProps): react_jsx_runtime.JSX.Element;
324
+
325
+ declare const notificationVariants: (props?: ({
326
+ variant?: "warning" | "success" | "info" | "error" | null | undefined;
327
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
328
+ interface NotificationProps extends VariantProps<typeof notificationVariants> {
329
+ title: string;
330
+ message?: string;
331
+ onClose?: () => void;
332
+ closable?: boolean;
333
+ action?: {
334
+ label: string;
335
+ onClick: () => void;
336
+ };
337
+ className?: string;
338
+ }
339
+ declare function Notification({ variant, title, message, onClose, closable, action, className, }: NotificationProps): react_jsx_runtime.JSX.Element;
340
+
341
+ interface SkeletonProps extends React$1.HTMLAttributes<HTMLDivElement> {
342
+ variant?: "text" | "circular" | "rectangular";
343
+ }
344
+ declare const Skeleton: React$1.ForwardRefExoticComponent<SkeletonProps & React$1.RefAttributes<HTMLDivElement>>;
345
+
346
+ interface SpinnerProps {
347
+ size?: "sm" | "default" | "lg";
348
+ label?: string;
349
+ className?: string;
350
+ }
351
+ declare function Spinner({ size, label, className }: SpinnerProps): react_jsx_runtime.JSX.Element;
352
+ declare function SpinnerInline({ className }: {
353
+ className?: string;
354
+ }): react_jsx_runtime.JSX.Element;
355
+
356
+ interface DatePickerProps {
357
+ value?: string;
358
+ onChange: (value: string) => void;
359
+ placeholder?: string;
360
+ disabled?: boolean;
361
+ id?: string;
362
+ required?: boolean;
363
+ className?: string;
364
+ minDate?: string;
365
+ maxDate?: string;
366
+ /** 포커스가 빠질 때 (부모에서 자동 저장 등에 사용) */
367
+ onBlur?: () => void;
368
+ }
369
+ declare function DatePicker({ value, onChange, placeholder, disabled, id, required, className, minDate, maxDate, onBlur, }: DatePickerProps): react_jsx_runtime.JSX.Element;
370
+
371
+ declare const Separator: React$1.ForwardRefExoticComponent<Omit<SeparatorPrimitive.SeparatorProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
372
+
373
+ declare const ScrollArea: React$1.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
374
+ declare const ScrollBar: React$1.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
375
+
376
+ /**
377
+ * plm-ui-standard: Header → Filter → Content 구조의 공통 페이지 래퍼.
378
+ */
379
+ interface PlmPageShellProps {
380
+ title: string;
381
+ subtitle?: string;
382
+ headerActions?: React.ReactNode;
383
+ filters?: React.ReactNode;
384
+ children: React.ReactNode;
385
+ className?: string;
386
+ }
387
+ declare function PlmPageShell({ title, subtitle, headerActions, filters, children, className, }: PlmPageShellProps): react_jsx_runtime.JSX.Element;
388
+
389
+ declare function cn(...inputs: ClassValue[]): string;
390
+
391
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Badge, type BadgeProps, Button, type ButtonProps, Checkbox, type CheckboxProps, DataTable, type DataTableProps, type DataTableVariant, DatePicker, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FormField, FormGrid, type FormGridProps, Input, type InputProps, Label, type LabelProps, List, ListHeader, type ListHeaderProps, ListItem, type ListItemProps, type ListProps, ModalActionButtons, type ModalActionButtonsProps, ModalHeader, ModalSection, type ModalSectionProps, Notification, type NotificationProps, type PlmBadgeVariant, PlmPageShell, type PlmPageShellProps, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, ScrollArea, ScrollBar, Search, type SearchProps, Select, type SelectOption, type SelectProps, Separator, Skeleton, type SkeletonProps, SortButton, type SortButtonProps, Spinner, SpinnerInline, type SpinnerProps, StandardModal, type StandardModalProps, Switch, type SwitchProps, Table, TablePagination, type TablePaginationProps, type TableProps, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Tooltip, type TooltipProps, TooltipProvider, type TreeNode, TreeView, type TreeViewProps, buttonVariants, cn, notificationVariants };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import*as cr from"react";import{Slot as Ca}from"@radix-ui/react-slot";import{cva as Da}from"class-variance-authority";import{clsx as Sa}from"clsx";import{twMerge as Ta}from"tailwind-merge";function o(...e){return Ta(Sa(e))}import{jsx as sr,jsxs as Na}from"react/jsx-runtime";var xe=Da("inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors duration-[110ms] ease-[cubic-bezier(0,0,0.38,0.9)] disabled:pointer-events-none disabled:opacity-40 [&_svg]:pointer-events-none [&_svg]:shrink-0",{variants:{variant:{primary:"bg-[var(--color-brand)] text-[var(--app-text-on-color)] hover:bg-[var(--color-brand-hover)] active:bg-[var(--color-brand-active)]",secondary:"border border-[var(--app-border-strong)] bg-transparent text-[var(--app-text)] hover:bg-[var(--app-hover)]",danger:"bg-[var(--color-accent)] text-[var(--app-text-on-color)] hover:bg-[var(--color-accent-hover)]",ghost:"bg-transparent text-[var(--color-brand)] hover:bg-[var(--app-hover)]",link:"bg-transparent text-[var(--color-brand)] underline-offset-4 hover:underline"},size:{sm:"h-8 px-4 text-xs",default:"h-10 px-6 text-sm",lg:"h-12 px-8 text-base",icon:"h-10 w-10"}},defaultVariants:{variant:"primary",size:"default"}}),we=cr.forwardRef(({className:e,variant:r,size:a,asChild:t=!1,loading:i,fullWidth:p,disabled:n,children:d,...l},m)=>Na(t?Ca:"button",{className:o(xe({variant:r,size:a}),p&&"w-full",e),ref:m,disabled:n||i,...l,children:[i&&sr("svg",{className:"h-4 w-4 animate-spin",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:sr("path",{d:"M12 2a10 10 0 0 1 10 10",strokeLinecap:"round"})}),d]}));we.displayName="Button";import*as $ from"react";import*as mr from"react";import*as br from"@radix-ui/react-label";import{jsx as Ma,jsxs as La}from"react/jsx-runtime";var z=mr.forwardRef(({className:e,required:r,children:a,...t},i)=>La(br.Root,{ref:i,className:o("text-xs font-medium text-[var(--app-text-secondary)] peer-disabled:cursor-not-allowed peer-disabled:opacity-40",e),...t,children:[a,r&&Ma("span",{className:"ml-0.5 text-[var(--color-error)]",children:"*"})]}));z.displayName="Label";import{jsx as G,jsxs as Ia}from"react/jsx-runtime";var Ea={sm:"h-8 text-xs",default:"h-10 text-sm",lg:"h-12 text-base"},_e=$.forwardRef(({className:e,label:r,helperText:a,errorText:t,required:i,inputSize:p="default",id:n,...d},l)=>{let m=n||$.useId();return Ia("div",{className:"flex flex-col gap-1",children:[r&&G(z,{htmlFor:m,required:i,children:r}),G("input",{id:m,ref:l,required:i,className:o("w-full bg-[var(--app-field)] px-4 font-[var(--font-sans)] text-[var(--app-text)] outline-none border-0 border-b transition-colors duration-[110ms]","placeholder:text-[var(--app-text-placeholder)]","disabled:cursor-not-allowed disabled:opacity-40",!!t?"border-b-2 border-[var(--color-error)]":"border-b border-[var(--app-border-strong)] focus:border-b-2 focus:border-[var(--app-focus)]",Ea[p],e),...d}),t&&G("span",{className:"text-xs text-[var(--color-error)]",children:t}),!t&&a&&G("span",{className:"text-xs text-[var(--app-text-secondary)]",children:a})]})});_e.displayName="Input";import*as K from"react";import{jsx as U,jsxs as qa}from"react/jsx-runtime";var ke=K.forwardRef(({className:e,label:r,helperText:a,errorText:t,required:i,rows:p=4,id:n,...d},l)=>{let m=n||K.useId();return qa("div",{className:"flex flex-col gap-1",children:[r&&U(z,{htmlFor:m,required:i,children:r}),U("textarea",{id:m,ref:l,rows:p,required:i,className:o("w-full resize-y bg-[var(--app-field)] px-4 py-3 font-[var(--font-sans)] text-sm text-[var(--app-text)] outline-none border-0 border-b transition-colors duration-[110ms]","placeholder:text-[var(--app-text-placeholder)]","disabled:cursor-not-allowed disabled:opacity-40",!!t?"border-b-2 border-[var(--color-error)]":"border-b border-[var(--app-border-strong)] focus:border-b-2 focus:border-[var(--app-focus)]",e),...d}),t&&U("span",{className:"text-xs text-[var(--color-error)]",children:t}),!t&&a&&U("span",{className:"text-xs text-[var(--app-text-secondary)]",children:a})]})});ke.displayName="Textarea";import*as Y from"react";import{ChevronDown as Aa}from"lucide-react";import{jsx as E,jsxs as ye}from"react/jsx-runtime";var Ba={sm:"h-8 text-xs",default:"h-10 text-sm",lg:"h-12 text-base"},ze=Y.forwardRef(({className:e,label:r,helperText:a,errorText:t,options:i,placeholder:p,required:n,selectSize:d="default",id:l,...m},b)=>{let j=l||Y.useId();return ye("div",{className:"flex flex-col gap-1",children:[r&&E(z,{htmlFor:j,required:n,children:r}),ye("div",{className:"relative",children:[ye("select",{id:j,ref:b,required:n,className:o("w-full appearance-none bg-[var(--app-field)] px-4 pr-10 font-[var(--font-sans)] text-[var(--app-text)] outline-none border-0 border-b transition-colors duration-[110ms] cursor-pointer","disabled:cursor-not-allowed disabled:opacity-40",!!t?"border-b-2 border-[var(--color-error)]":"border-b border-[var(--app-border-strong)] focus:border-b-2 focus:border-[var(--app-focus)]",Ba[d],e),...m,children:[p&&E("option",{value:"",disabled:!0,children:p}),i.map(u=>E("option",{value:u.value,disabled:u.disabled,children:u.label},u.value))]}),E(Aa,{className:"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-[var(--app-text-secondary)]"})]}),t&&E("span",{className:"text-xs text-[var(--color-error)]",children:t}),!t&&a&&E("span",{className:"text-xs text-[var(--app-text-secondary)]",children:a})]})});ze.displayName="Select";import*as J from"react";import*as Q from"@radix-ui/react-checkbox";import{Check as Ha}from"lucide-react";import{jsx as X,jsxs as Va}from"react/jsx-runtime";var Pe=J.forwardRef(({className:e,label:r,id:a,...t},i)=>{let p=a||J.useId();return Va("div",{className:"flex items-center gap-2",children:[X(Q.Root,{ref:i,id:p,className:o("peer h-4 w-4 shrink-0 border border-[var(--app-border-strong)] bg-transparent","focus-visible:outline-2 focus-visible:outline-[var(--app-focus)] focus-visible:outline-offset-2","disabled:cursor-not-allowed disabled:opacity-40","data-[state=checked]:bg-[var(--color-brand)] data-[state=checked]:border-[var(--color-brand)] data-[state=checked]:text-[var(--app-text-on-color)]",e),...t,children:X(Q.Indicator,{className:"flex items-center justify-center",children:X(Ha,{className:"h-3.5 w-3.5",strokeWidth:3})})}),r&&X("label",{htmlFor:p,className:"text-sm text-[var(--app-text)] cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-40",children:r})]})});Pe.displayName="Checkbox";import*as Z from"react";import*as ee from"@radix-ui/react-switch";import{jsx as je,jsxs as Wa}from"react/jsx-runtime";var Re=Z.forwardRef(({className:e,label:r,switchSize:a="default",id:t,...i},p)=>{let n=t||Z.useId(),d=a==="sm";return Wa("div",{className:"flex items-center gap-2",children:[je(ee.Root,{ref:p,id:n,className:o("peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors duration-[150ms]","focus-visible:outline-2 focus-visible:outline-[var(--app-focus)] focus-visible:outline-offset-2","disabled:cursor-not-allowed disabled:opacity-40","data-[state=checked]:bg-[var(--color-brand)] data-[state=unchecked]:bg-[var(--app-border-strong)]",d?"h-4 w-8":"h-6 w-12",e),...i,children:je(ee.Thumb,{className:o("pointer-events-none block rounded-full bg-white shadow transition-transform duration-[150ms]",d?"h-3 w-3 data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0":"h-5 w-5 data-[state=checked]:translate-x-6 data-[state=unchecked]:translate-x-0")})}),r&&je("label",{htmlFor:n,className:"text-sm text-[var(--app-text)] cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-40",children:r})]})});Re.displayName="Switch";import*as gr from"react";import{Search as Oa,X as Fa}from"lucide-react";import{jsx as re,jsxs as Ga}from"react/jsx-runtime";var Se=gr.forwardRef(({className:e,searchSize:r="lg",value:a,onClear:t,onChange:i,...p},n)=>{let d=a!==void 0&&a!=="";return Ga("div",{className:o("relative",e),children:[re(Oa,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-[var(--app-text-secondary)]"}),re("input",{ref:n,type:"search",value:a,onChange:i,className:o("w-full bg-[var(--app-field)] pl-10 pr-10 font-[var(--font-sans)] text-[var(--app-text)] outline-none border-0 border-b border-[var(--app-border-strong)] transition-colors duration-[110ms]","placeholder:text-[var(--app-text-placeholder)]","focus:border-b-2 focus:border-[var(--app-focus)]","[&::-webkit-search-cancel-button]:hidden",r==="sm"?"h-8 text-xs":"h-10 text-sm"),...p}),d&&re("button",{type:"button",onClick:t,className:"absolute right-3 top-1/2 -translate-y-1/2 text-[var(--app-text-secondary)] hover:text-[var(--app-text)] transition-colors","aria-label":"\uAC80\uC0C9\uC5B4 \uC0AD\uC81C",children:re(Fa,{className:"h-4 w-4"})})]})});Se.displayName="Search";import{jsx as Ua}from"react/jsx-runtime";var $a={danger:"text-[var(--color-danger)] bg-[color-mix(in_srgb,var(--color-danger)_14%,var(--app-bg))] border-[color-mix(in_srgb,var(--color-danger)_32%,var(--app-border))]",warning:"text-[var(--color-warning)] bg-[color-mix(in_srgb,var(--color-warning)_14%,var(--app-bg))] border-[color-mix(in_srgb,var(--color-warning)_32%,var(--app-border))]",success:"text-[var(--color-success)] bg-[color-mix(in_srgb,var(--color-success)_14%,var(--app-bg))] border-[color-mix(in_srgb,var(--color-success)_32%,var(--app-border))]",info:"text-[var(--color-info)] bg-[color-mix(in_srgb,var(--color-info)_14%,var(--app-bg))] border-[color-mix(in_srgb,var(--color-info)_32%,var(--app-border))]",neutral:"text-[var(--app-muted)] bg-[var(--app-bg-subtle)] border-[var(--app-border)]"};function vr({variant:e,className:r="",children:a,...t}){return Ua("span",{className:["inline-flex min-h-6 items-center justify-center whitespace-nowrap rounded-md border border-solid px-2.5 py-0.5 align-middle text-xs font-semibold leading-[1.2] tracking-[-0.02em]",$a[e],r].filter(Boolean).join(" "),...t,children:a})}import{jsx as fr}from"react/jsx-runtime";function ae({frameClassName:e,className:r,children:a,...t}){return fr("div",{className:["plm-table-frame w-full max-w-full min-h-0 overflow-x-auto overflow-y-hidden bg-transparent",e].filter(Boolean).join(" "),children:fr("table",{className:["plm-table w-max min-w-full border-collapse table-auto bg-[var(--plm-table-bg)] text-[var(--app-text)] text-sm leading-[1.2] tracking-[-0.025em]",r].filter(Boolean).join(" "),...t,children:a})})}import{jsx as Te,jsxs as Ka}from"react/jsx-runtime";function te({pageIndex:e,pageCount:r,onPageChange:a,className:t="","aria-label":i="\uD398\uC774\uC9C0 \uC774\uB3D9"}){if(r<=1)return null;let p=e>0,n=e<r-1,d="min-h-8 min-w-8 cursor-pointer rounded-md border border-solid border-[var(--plm-table-row-border)] bg-[var(--plm-table-bg)] px-2 py-1 text-sm leading-[1.2] text-[var(--plm-table-th-fg)] transition-colors hover:bg-[var(--plm-table-hover)] hover:text-[var(--app-text)] disabled:cursor-not-allowed disabled:opacity-45",l=m=>[d,m?"border-[var(--plm-table-sort-fg)] bg-[color-mix(in_srgb,var(--plm-table-sort-fg)_16%,var(--plm-table-bg))] font-semibold text-[var(--plm-table-sort-fg)]":""].filter(Boolean).join(" ");return Ka("nav",{className:["inline-flex flex-wrap items-center gap-1",t].filter(Boolean).join(" "),"aria-label":i,children:[Te("button",{type:"button",className:d,disabled:!p,onClick:()=>a(e-1),"aria-label":"\uC774\uC804 \uD398\uC774\uC9C0",children:"\u2039"}),Array.from({length:r},(m,b)=>Te("button",{type:"button",className:l(b===e),onClick:()=>a(b),"aria-current":b===e?"page":void 0,children:b+1},b)),Te("button",{type:"button",className:d,disabled:!n,onClick:()=>a(e+1),"aria-label":"\uB2E4\uC74C \uD398\uC774\uC9C0",children:"\u203A"})]})}import{flexRender as ur,getCoreRowModel as Ya,getPaginationRowModel as Xa,getSortedRowModel as Ja,useReactTable as Qa}from"@tanstack/react-table";import{Icon as Za}from"@iconify/react";import{useEffect as et,useState as oe,useCallback as rt}from"react";import{Fragment as ot,jsx as f,jsxs as Ce}from"react/jsx-runtime";var xr={"service-desk":{wrap:"service-desk-list__table-wrap",table:"service-desk-table",sortBtn:""},"data-table":{wrap:"",table:"",sortBtn:""},"project-task":{wrap:"plm-ui-page__table-wrap",table:"project-task-table",sortBtn:""}};function at(e){let r=e.getIsSorted();return r==="asc"?"ascending":r==="desc"?"descending":"none"}function tt(e,r){let a=e.column.columnDef.meta,t=[];return r==="service-desk"&&a?.headerAlign==="left"&&t.push("service-desk-table__th--left"),e.column.getIsSorted()&&(t.push("text-[var(--plm-table-sort-fg)]"),r==="service-desk"&&t.push("service-desk-table__th--active")),t.filter(Boolean).join(" ")}function wr({column:e,children:r,variant:a,sortButtonClassName:t}){let p=["plm-table__sort-btn inline-flex w-full items-center justify-start gap-1 rounded border-0 bg-transparent p-1 text-left transition-colors hover:bg-[var(--plm-table-hover)] hover:text-[var(--plm-table-th-fg)] focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2",xr[a].sortBtn,t].filter(Boolean).join(" ");if(!e.getCanSort())return f("span",{className:"font-inherit text-inherit",children:r});let n=e.getIsSorted();return Ce("button",{type:"button",className:p,onClick:e.getToggleSortingHandler(),"aria-label":n?`${String(r)}, ${n==="asc"?"\uC624\uB984\uCC28\uC21C":"\uB0B4\uB9BC\uCC28\uC21C"}, \uC815\uB82C \uC804\uD658`:`${String(r)}, \uC815\uB82C`,children:[r,n?f("span",{className:"shrink-0 text-[var(--plm-table-sort-fg)] opacity-95","aria-hidden":!0,children:f(Za,{icon:n==="asc"?"mdi:chevron-up":"mdi:chevron-down",width:8,height:8})}):null]})}function hr({checked:e,indeterminate:r,onChange:a,ariaLabel:t}){return f("input",{type:"checkbox",checked:e,ref:i=>{i&&(i.indeterminate=r??!1)},onChange:a,"aria-label":t,className:"h-4 w-4 cursor-pointer accent-[var(--color-brand)] border-[var(--app-border-strong)]",onClick:i=>i.stopPropagation()})}function _r({data:e,columns:r,getRowId:a,onRowClick:t,enableRowSelection:i=!0,selectedRowId:p,onSelectedRowChange:n,enableMultiSelect:d=!1,selectedRowIds:l,onSelectedRowsChange:m,rowClassName:b,emptyMessage:j="\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",variant:C="data-table",wrapClassName:u,tableClassName:ge,initialSorting:ve,enableSorting:M=!0,pageSize:D}){let dr=xr[C],[ba,ga]=oe(()=>ve??[]),[va,fa]=oe(null),[ua,ha]=oe({}),N=D!=null&&D>0,[xa,lr]=oe(()=>({pageIndex:0,pageSize:N?D:Math.max(1,e.length||1)})),fe=l??ua,wa=rt(c=>{let v=typeof c=="function"?c(fe):c;if(l||ha(v),m){let B=e.filter((F,ue)=>{let w=a?a(F,ue):String(ue);return v[w]});m(v,B)}},[fe,l,m,e,a]);et(()=>{N&&lr(c=>({...c,pageSize:D,pageIndex:0}))},[N,D,e.length]);let _a=d?[{id:"_select",size:40,enableSorting:!1,header:({table:c})=>f(hr,{checked:c.getIsAllPageRowsSelected(),indeterminate:c.getIsSomePageRowsSelected(),onChange:c.getToggleAllPageRowsSelectedHandler(),ariaLabel:"\uC804\uCCB4 \uC120\uD0DD"}),cell:({row:c})=>f(hr,{checked:c.getIsSelected(),onChange:c.getToggleSelectedHandler(),ariaLabel:`\uD589 ${c.id} \uC120\uD0DD`})},...r]:r,L=Qa({data:e,columns:_a,state:{sorting:ba,...N?{pagination:xa}:{},...d?{rowSelection:fe}:{}},onSortingChange:ga,onPaginationChange:N?lr:void 0,...d?{onRowSelectionChange:wa,enableRowSelection:!0}:{},getCoreRowModel:Ya(),getSortedRowModel:Ja(),...N?{getPaginationRowModel:Xa()}:{},getRowId:a,enableSorting:M}),ka=[dr.wrap,u].filter(Boolean).join(" "),ya=[dr.table,ge].filter(Boolean).join(" "),za=p??va;if(e.length===0)return f("div",{className:"px-8 py-8 text-center text-base leading-[1.35] text-[var(--app-muted)]",role:"status",children:j});let Pa=N&&L.getPageCount()>1;return Ce(ot,{children:[Ce(ae,{frameClassName:ka,className:ya,children:[f("thead",{children:L.getHeaderGroups().map(c=>f("tr",{children:c.headers.map(v=>{let A=v.column.columnDef.meta?.align,B={...A?{textAlign:A}:{},whiteSpace:"nowrap"};return f("th",{colSpan:v.colSpan,scope:"col",className:["h-7 border-b border-solid border-[var(--plm-table-row-border)] bg-[var(--plm-table-header-bg)] px-2 text-left align-middle text-sm font-semibold whitespace-nowrap text-[var(--plm-table-th-fg)]",tt(v,C)].filter(Boolean).join(" "),"aria-sort":v.column.getCanSort()?at(v.column):void 0,"data-plm-align":A,style:B,children:v.isPlaceholder?null:ur(v.column.columnDef.header,v.getContext())},v.id)})},c.id))}),f("tbody",{children:L.getRowModel().rows.map(c=>{let v=i&&za===c.id,B=[b?.(c.original)??""].filter(Boolean).join(" "),F=!!(t||i);return f("tr",{className:B,onClick:F?()=>{if(i){let w=v?null:c.id;p==null&&fa(w),n?.(w,w?c.original:null)}t?.(c.original)}:void 0,style:F?{cursor:"pointer"}:void 0,children:c.getVisibleCells().map(w=>{let ja=w.column.columnDef.meta?.tdClassName??"",he=w.column.columnDef.meta?.align,Ra={...he?{textAlign:he}:{},whiteSpace:"nowrap"};return f("td",{className:["h-7 whitespace-nowrap border-b border-solid border-[var(--plm-table-row-border)] px-2 align-middle text-[var(--app-text)]",v?"bg-[color-mix(in_srgb,var(--app-muted)_24%,var(--plm-table-bg))]":"bg-[var(--plm-table-bg)]",ja].filter(Boolean).join(" "),"data-plm-align":he,style:Ra,children:ur(w.column.columnDef.cell,w.getContext())},w.id)})},c.id)})})]}),Pa?f("div",{className:"flex w-full items-center justify-end box-border px-2 pt-3",children:f(te,{pageIndex:L.getState().pagination.pageIndex,pageCount:L.getPageCount(),onPageChange:c=>L.setPageIndex(c)})}):null]})}import*as ie from"react";import*as R from"@radix-ui/react-tabs";import{jsx as Le}from"react/jsx-runtime";var kr=R.Root,De=ie.forwardRef(({className:e,variant:r="line",...a},t)=>Le(R.List,{ref:t,className:o("inline-flex items-center",r==="line"&&"gap-0 border-b border-[var(--app-border)]",r==="contained"&&"gap-0 bg-[var(--app-surface)]",e),...a}));De.displayName="TabsList";var Ne=ie.forwardRef(({className:e,variant:r="line",...a},t)=>Le(R.Trigger,{ref:t,className:o("inline-flex items-center justify-center whitespace-nowrap px-4 py-2 text-sm font-medium transition-colors duration-[110ms]","disabled:pointer-events-none disabled:opacity-40","focus-visible:outline-2 focus-visible:outline-[var(--app-focus)] focus-visible:outline-offset-[-2px]",r==="line"&&["border-b-2 border-transparent text-[var(--app-text-secondary)]","hover:text-[var(--app-text)] hover:bg-[var(--app-hover)]","data-[state=active]:border-[var(--color-brand)] data-[state=active]:text-[var(--app-text)] data-[state=active]:font-semibold"],r==="contained"&&["border border-[var(--app-border)] text-[var(--app-text-secondary)]","hover:bg-[var(--app-hover)]","data-[state=active]:bg-[var(--app-bg)] data-[state=active]:text-[var(--app-text)] data-[state=active]:font-semibold data-[state=active]:border-b-[var(--app-bg)]"],e),...a}));Ne.displayName="TabsTrigger";var Me=ie.forwardRef(({className:e,...r},a)=>Le(R.Content,{ref:a,className:o("mt-4 focus-visible:outline-none",e),...r}));Me.displayName="TabsContent";import*as pe from"react";import{ChevronRight as it}from"lucide-react";import{jsx as S,jsxs as yr}from"react/jsx-runtime";function zr({node:e,level:r,expanded:a,onToggle:t,onSelect:i,selectedId:p}){let n=e.children&&e.children.length>0,d=a.has(e.id),l=p===e.id;return yr("li",{role:"treeitem","aria-expanded":n?d:void 0,children:[yr("button",{type:"button",disabled:e.disabled,className:o("flex w-full items-center gap-1 py-1.5 text-sm outline-none transition-colors duration-[70ms]","hover:bg-[var(--app-hover)]","focus-visible:outline-2 focus-visible:outline-[var(--app-focus)]","disabled:pointer-events-none disabled:opacity-40",l&&"bg-[var(--app-selected)] font-medium",!l&&"text-[var(--app-text)]"),style:{paddingLeft:`${r*24+8}px`},onClick:()=>{n&&t(e.id),i?.(e)},children:[n?S(it,{className:o("h-4 w-4 shrink-0 text-[var(--app-text-secondary)] transition-transform duration-[150ms]",d&&"rotate-90")}):S("span",{className:"w-4 shrink-0"}),e.icon&&S("span",{className:"shrink-0",children:e.icon}),S("span",{className:"truncate",children:e.label})]}),n&&d&&S("ul",{role:"group",children:e.children.map(m=>S(zr,{node:m,level:r+1,expanded:a,onToggle:t,onSelect:i,selectedId:p},m.id))})]})}function Pr({data:e,defaultExpanded:r=[],onSelect:a,selectedId:t,className:i}){let[p,n]=pe.useState(new Set(r)),d=pe.useCallback(l=>{n(m=>{let b=new Set(m);return b.has(l)?b.delete(l):b.add(l),b})},[]);return S("ul",{role:"tree",className:o("text-sm",i),children:e.map(l=>S(zr,{node:l,level:0,expanded:p,onToggle:d,onSelect:a,selectedId:t},l.id))})}import*as ne from"react";import{jsx as Ae}from"react/jsx-runtime";var Ee=ne.forwardRef(({className:e,variant:r="default",...a},t)=>Ae("ul",{ref:t,className:o("text-sm text-[var(--app-text)]",r==="contained"&&"border border-[var(--app-border)]",e),...a}));Ee.displayName="List";var Ie=ne.forwardRef(({className:e,active:r,disabled:a,interactive:t=!0,...i},p)=>Ae("li",{ref:p,className:o("flex items-center gap-3 px-4 py-2 border-b border-[var(--app-border)] last:border-b-0",t&&"cursor-pointer hover:bg-[var(--app-hover)] transition-colors duration-[70ms]",r&&"bg-[var(--app-selected)]",a&&"pointer-events-none opacity-40",e),...i}));Ie.displayName="ListItem";var qe=ne.forwardRef(({className:e,...r},a)=>Ae("div",{ref:a,className:o("px-4 py-2 text-xs font-semibold text-[var(--app-text-secondary)] bg-[var(--app-surface)] border-b border-[var(--app-border)]",e),...r}));qe.displayName="ListHeader";import*as de from"react";import*as _ from"@radix-ui/react-accordion";import{ChevronDown as pt}from"lucide-react";import{jsx as H,jsxs as nt}from"react/jsx-runtime";var jr=_.Root,Be=de.forwardRef(({className:e,...r},a)=>H(_.Item,{ref:a,className:o("border-b border-[var(--app-border)]",e),...r}));Be.displayName="AccordionItem";var He=de.forwardRef(({className:e,children:r,...a},t)=>H(_.Header,{className:"flex",children:nt(_.Trigger,{ref:t,className:o("flex flex-1 items-center justify-between py-3 px-4 text-sm font-medium text-[var(--app-text)] transition-all duration-[150ms]","hover:bg-[var(--app-hover)]","[&[data-state=open]>svg]:rotate-180",e),...a,children:[r,H(pt,{className:"h-4 w-4 shrink-0 text-[var(--app-text-secondary)] transition-transform duration-[150ms]"})]})}));He.displayName="AccordionTrigger";var Ve=de.forwardRef(({className:e,children:r,...a},t)=>H(_.Content,{ref:t,className:"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...a,children:H("div",{className:o("px-4 pb-3 text-[var(--app-text-secondary)]",e),children:r})}));Ve.displayName="AccordionContent";import*as V from"react";import*as g from"@radix-ui/react-dialog";import{X as dt}from"lucide-react";import{jsx as P,jsxs as We}from"react/jsx-runtime";var Rr=g.Root,Sr=g.Trigger,Tr=g.Close,Cr=g.Portal,Oe=V.forwardRef(({className:e,...r},a)=>P(g.Overlay,{ref:a,className:o("fixed inset-0 z-50 bg-black/60 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...r}));Oe.displayName="DialogOverlay";var Fe=V.forwardRef(({className:e,children:r,size:a="default",hideClose:t,...i},p)=>We(Cr,{children:[P(Oe,{}),We(g.Content,{ref:p,className:o("fixed left-1/2 top-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2","bg-[var(--app-bg)] text-[var(--app-text)] shadow-[var(--shadow-modal)]","duration-[240ms] ease-[cubic-bezier(0,0,0.38,0.9)]","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","max-h-[85vh] overflow-y-auto",{sm:"max-w-md",default:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl",full:"max-w-[90vw]"}[a],e),...i,children:[r,!t&&We(g.Close,{className:"absolute right-4 top-4 text-[var(--app-text-secondary)] hover:text-[var(--app-text)] transition-colors",children:[P(dt,{className:"h-5 w-5"}),P("span",{className:"sr-only",children:"\uB2EB\uAE30"})]})]})]}));Fe.displayName="DialogContent";var Dr=({className:e,...r})=>P("div",{className:o("px-6 py-4 border-b border-[var(--app-border)]",e),...r}),Ge=V.forwardRef(({className:e,...r},a)=>P(g.Title,{ref:a,className:o("text-lg font-semibold text-[var(--app-text)]",e),...r}));Ge.displayName="DialogTitle";var $e=V.forwardRef(({className:e,...r},a)=>P(g.Description,{ref:a,className:o("text-sm text-[var(--app-text-secondary)]",e),...r}));$e.displayName="DialogDescription";var Nr=({className:e,...r})=>P("div",{className:o("px-6 py-4",e),...r}),Mr=({className:e,...r})=>P("div",{className:o("flex justify-end gap-2 px-6 py-4 border-t border-[var(--app-border)]",e),...r});import{useEffect as ct,useCallback as mt}from"react";import{createPortal as bt}from"react-dom";import{jsx as Lr,jsxs as lt}from"react/jsx-runtime";function le({title:e,actions:r}){return lt("div",{className:"standard-modal-header",children:[Lr("h2",{className:"standard-modal-title",children:e}),r!=null&&Lr("div",{className:"standard-modal-header-actions-wrap",children:r})]})}import{jsx as Er,jsxs as st}from"react/jsx-runtime";function se({onCancel:e,onSave:r,cancelLabel:a="\uCDE8\uC18C",saveLabel:t="\uC800\uC7A5",saveDisabled:i=!1}){return st("div",{className:"standard-modal-header-actions",children:[Er("button",{type:"button",className:"btn-standard-modal btn-ghost",onClick:e,children:a}),r!=null&&Er("button",{type:"button",className:"btn-standard-modal btn-primary",onClick:()=>{let p=r();p!=null&&typeof p?.then=="function"&&p.catch(()=>{})},disabled:i,children:t})]})}import{jsx as ce,jsxs as gt}from"react/jsx-runtime";function Ir({open:e,onClose:r,title:a,children:t,onSave:i,cancelLabel:p,saveLabel:n,hasUnsavedChanges:d=!1,saveDisabled:l=!1,headerActions:m,closeOnOverlayClick:b=!1,ariaLabel:j,modalClassName:C}){let u=mt(()=>{d&&!window.confirm("\uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uB2EB\uC73C\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?")||r()},[r,d]);if(ct(()=>{if(!e)return;let M=D=>{D.key==="Escape"&&u()};return window.addEventListener("keydown",M),()=>window.removeEventListener("keydown",M)},[e,u]),!e)return null;let ge=m??ce(se,{onCancel:u,onSave:i,cancelLabel:p,saveLabel:n,saveDisabled:l}),ve=ce("div",{className:"standard-modal-overlay",role:"dialog","aria-modal":"true","aria-label":j??a,onClick:b?u:void 0,children:gt("div",{className:["standard-modal",C].filter(Boolean).join(" "),onClick:M=>M.stopPropagation(),children:[ce(le,{title:a,actions:ge}),ce("div",{className:"standard-modal-body",children:t})]})});return bt(ve,document.body)}import{jsx as qr,jsxs as vt}from"react/jsx-runtime";function Ar({title:e,children:r,fullWidth:a}){return vt("section",{className:`standard-modal-section ${a?"standard-modal-section--full":""}`,children:[qr("h3",{className:"standard-modal-section-title",children:e}),qr("div",{className:"standard-modal-section-body",children:r})]})}import{jsx as ft}from"react/jsx-runtime";function Br({children:e,fullWidth:r}){return ft("div",{className:`standard-form-grid ${r?"standard-form-grid--full":""}`,children:e})}import{jsx as Hr,jsxs as Vr}from"react/jsx-runtime";function Wr({label:e,required:r,helper:a,fullWidth:t,children:i}){return Vr("div",{className:`standard-form-field ${t?"standard-form-field--full":""}`,children:[Vr("label",{children:[e,r&&Hr("span",{className:"required","aria-hidden":!0,children:" *"})]}),i,a!=null&&Hr("p",{className:"helper",children:a})]})}import*as T from"react";import*as s from"@radix-ui/react-dropdown-menu";import{Check as ut,ChevronRight as ht}from"lucide-react";import{jsx as k,jsxs as Ur}from"react/jsx-runtime";var Or=s.Root,Fr=s.Trigger,Gr=s.Group;var $r=s.Sub;var Ue=T.forwardRef(({className:e,children:r,...a},t)=>Ur(s.SubTrigger,{ref:t,className:o("flex cursor-pointer items-center gap-2 px-4 py-2 text-sm outline-none select-none","text-[var(--app-text)] hover:bg-[var(--app-hover)] data-[state=open]:bg-[var(--app-hover)]",e),...a,children:[r,k(ht,{className:"ml-auto h-4 w-4"})]}));Ue.displayName="DropdownMenuSubTrigger";var Ke=T.forwardRef(({className:e,...r},a)=>k(s.SubContent,{ref:a,className:o("z-50 min-w-[8rem] overflow-hidden bg-[var(--app-bg)] border border-[var(--app-border)] text-[var(--app-text)] shadow-[var(--shadow-dropdown)]","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...r}));Ke.displayName="DropdownMenuSubContent";var Ye=T.forwardRef(({className:e,sideOffset:r=4,...a},t)=>k(s.Portal,{children:k(s.Content,{ref:t,sideOffset:r,className:o("z-50 min-w-[8rem] overflow-hidden bg-[var(--app-bg)] border border-[var(--app-border)] py-1 text-[var(--app-text)] shadow-[var(--shadow-dropdown)]","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...a})}));Ye.displayName="DropdownMenuContent";var Xe=T.forwardRef(({className:e,destructive:r,...a},t)=>k(s.Item,{ref:t,className:o("relative flex cursor-pointer items-center gap-2 px-4 py-2 text-sm outline-none select-none transition-colors","focus:bg-[var(--app-hover)]","data-[disabled]:pointer-events-none data-[disabled]:opacity-40",r&&"text-[var(--color-error)] focus:text-[var(--color-error)]",!r&&"text-[var(--app-text)]",e),...a}));Xe.displayName="DropdownMenuItem";var Je=T.forwardRef(({className:e,children:r,checked:a,...t},i)=>Ur(s.CheckboxItem,{ref:i,className:o("relative flex cursor-pointer items-center py-2 pl-8 pr-4 text-sm outline-none select-none transition-colors","text-[var(--app-text)] focus:bg-[var(--app-hover)]","data-[disabled]:pointer-events-none data-[disabled]:opacity-40",e),checked:a,...t,children:[k("span",{className:"absolute left-2 flex h-4 w-4 items-center justify-center",children:k(s.ItemIndicator,{children:k(ut,{className:"h-4 w-4"})})}),r]}));Je.displayName="DropdownMenuCheckboxItem";var Qe=T.forwardRef(({className:e,...r},a)=>k(s.Separator,{ref:a,className:o("my-1 h-px bg-[var(--app-border)]",e),...r}));Qe.displayName="DropdownMenuSeparator";var Ze=T.forwardRef(({className:e,...r},a)=>k(s.Label,{ref:a,className:o("px-4 py-2 text-xs font-semibold text-[var(--app-text-secondary)]",e),...r}));Ze.displayName="DropdownMenuLabel";import*as Yr from"react";import*as h from"@radix-ui/react-popover";import{jsx as Kr}from"react/jsx-runtime";var Xr=h.Root,Jr=h.Trigger,Qr=h.Anchor,Zr=h.Close,er=Yr.forwardRef(({className:e,align:r="center",sideOffset:a=4,...t},i)=>Kr(h.Portal,{children:Kr(h.Content,{ref:i,align:r,sideOffset:a,className:o("z-50 w-72 bg-[var(--app-bg)] border border-[var(--app-border)] p-4 text-[var(--app-text)] shadow-[var(--shadow-dropdown)] outline-none","data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t})}));er.displayName="PopoverContent";import"react";import*as x from"@radix-ui/react-tooltip";import{jsx as rr,jsxs as ea}from"react/jsx-runtime";var ra=x.Provider;function aa({content:e,children:r,side:a="top",delayDuration:t=200,className:i}){return ea(x.Root,{delayDuration:t,children:[rr(x.Trigger,{asChild:!0,children:r}),rr(x.Portal,{children:ea(x.Content,{side:a,sideOffset:4,className:o("z-50 max-w-[240px] bg-[var(--app-text)] px-4 py-2 text-xs text-[var(--app-text-on-color)]","animate-in fade-in-0 zoom-in-95 duration-[110ms]","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",i),children:[e,rr(x.Arrow,{className:"fill-[var(--app-text)]",width:12,height:6})]})})]})}import{CheckCircle2 as xt,AlertTriangle as wt,XCircle as _t,Info as kt,X as yt}from"lucide-react";import{cva as zt}from"class-variance-authority";import{jsx as I,jsxs as oa}from"react/jsx-runtime";var ar=zt("relative flex items-start gap-3 p-4 border-l-[3px] text-sm",{variants:{variant:{success:"border-l-[var(--color-success)] bg-[color-mix(in_srgb,var(--color-success)_10%,var(--app-bg))]",warning:"border-l-[var(--color-warning)] bg-[color-mix(in_srgb,var(--color-warning)_10%,var(--app-bg))]",error:"border-l-[var(--color-error)] bg-[color-mix(in_srgb,var(--color-error)_10%,var(--app-bg))]",info:"border-l-[var(--color-info)] bg-[color-mix(in_srgb,var(--color-info)_10%,var(--app-bg))]"}},defaultVariants:{variant:"info"}}),Pt={success:xt,warning:wt,error:_t,info:kt},ta={success:"text-[var(--color-success)]",warning:"text-[var(--color-warning)]",error:"text-[var(--color-error)]",info:"text-[var(--color-info)]"};function ia({variant:e="info",title:r,message:a,onClose:t,closable:i=!0,action:p,className:n}){let d=Pt[e];return oa("div",{className:o(ar({variant:e}),n),role:"alert",children:[I(d,{className:o("mt-0.5 h-5 w-5 shrink-0",ta[e])}),oa("div",{className:"flex-1 min-w-0",children:[I("p",{className:"font-medium text-[var(--app-text)]",children:r}),a&&I("p",{className:"mt-1 text-xs text-[var(--app-text-secondary)]",children:a}),p&&I("button",{type:"button",onClick:p.onClick,className:o("mt-2 text-xs font-medium underline-offset-2 hover:underline",ta[e]),children:p.label})]}),i&&t&&I("button",{type:"button",onClick:t,className:"shrink-0 text-[var(--app-text-secondary)] hover:text-[var(--app-text)] transition-colors","aria-label":"\uB2EB\uAE30",children:I(yt,{className:"h-4 w-4"})})]})}import*as pa from"react";import{jsx as jt}from"react/jsx-runtime";var tr=pa.forwardRef(({className:e,variant:r="rectangular",...a},t)=>jt("div",{ref:t,className:o("animate-pulse bg-[var(--app-surface)]",r==="text"&&"h-4 w-full",r==="circular"&&"rounded-full",r==="rectangular"&&"w-full",e),...a}));tr.displayName="Skeleton";import{jsx as q,jsxs as Tt}from"react/jsx-runtime";var Rt={sm:16,default:32,lg:64},St={sm:2,default:3,lg:4};function na({size:e="default",label:r,className:a}){let t=Rt[e],i=St[e],p=(t-i)/2;return Tt("div",{className:o("inline-flex flex-col items-center gap-2",a),role:"status",children:[q("svg",{width:t,height:t,viewBox:`0 0 ${t} ${t}`,className:"animate-spin",style:{animationDuration:"700ms"},children:q("circle",{cx:t/2,cy:t/2,r:p,fill:"none",stroke:"var(--color-brand)",strokeWidth:i,strokeLinecap:"round",strokeDasharray:`${p*Math.PI*1.5} ${p*Math.PI*2}`})}),r&&q("span",{className:"text-xs text-[var(--app-text-secondary)]",children:r}),q("span",{className:"sr-only",children:r||"\uB85C\uB529 \uC911"})]})}function da({className:e}){return q("svg",{width:16,height:16,viewBox:"0 0 16 16",className:o("animate-spin",e),style:{animationDuration:"700ms"},role:"status",children:q("circle",{cx:8,cy:8,r:6,fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeDasharray:`${6*Math.PI*1.5} ${6*Math.PI*2}`})})}import Ct from"react-datepicker";import{ko as Dt}from"date-fns/locale";function me(e){if(!e)return null;let[r,a,t]=e.split("-").map(Number);return r==null||a==null||t==null?null:new Date(r,a-1,t)}function la(e){if(!e)return"";let r=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),t=String(e.getDate()).padStart(2,"0");return`${r}-${a}-${t}`}import"react-datepicker/dist/react-datepicker.css";import{jsx as Mt}from"react/jsx-runtime";var Nt="yyyy-MM-dd";function sa({value:e,onChange:r,placeholder:a="\uB0A0\uC9DC \uC120\uD0DD",disabled:t=!1,id:i,required:p,className:n,minDate:d,maxDate:l,onBlur:m}){let b=me(e??""),j=d?me(d):void 0,C=l?me(l):void 0;return Mt(Ct,{id:i,selected:b,onChange:u=>r(u?la(u):""),dateFormat:Nt,locale:Dt,placeholderText:a,isClearable:!0,disabled:t,required:p,minDate:j??void 0,maxDate:C??void 0,className:n??"",wrapperClassName:"datepicker-wrapper",onBlur:m})}import*as ca from"react";import*as ma from"@radix-ui/react-separator";import{jsx as Lt}from"react/jsx-runtime";var or=ca.forwardRef(({className:e,orientation:r="horizontal",decorative:a=!0,...t},i)=>Lt(ma.Root,{ref:i,decorative:a,orientation:r,className:o("shrink-0 bg-[var(--app-border)]",r==="horizontal"?"h-px w-full":"h-full w-px",e),...t}));or.displayName="Separator";import*as ir from"react";import*as y from"@radix-ui/react-scroll-area";import{jsx as W,jsxs as Et}from"react/jsx-runtime";var pr=ir.forwardRef(({className:e,children:r,...a},t)=>Et(y.Root,{ref:t,className:o("relative overflow-hidden",e),...a,children:[W(y.Viewport,{className:"h-full w-full rounded-[inherit]",children:r}),W(be,{}),W(y.Corner,{})]}));pr.displayName="ScrollArea";var be=ir.forwardRef(({className:e,orientation:r="vertical",...a},t)=>W(y.ScrollAreaScrollbar,{ref:t,orientation:r,className:o("flex touch-none select-none transition-colors",r==="vertical"&&"h-full w-2 border-l border-l-transparent p-px",r==="horizontal"&&"h-2 flex-col border-t border-t-transparent p-px",e),...a,children:W(y.ScrollAreaThumb,{className:"relative flex-1 rounded-full bg-[var(--app-border-strong)]"})}));be.displayName="ScrollBar";import{jsx as O,jsxs as nr}from"react/jsx-runtime";function It({title:e,subtitle:r,headerActions:a,filters:t,children:i,className:p}){return nr("div",{className:["plm-ui-page",p].filter(Boolean).join(" "),children:[nr("header",{className:"plm-ui-page__header-row",children:[nr("div",{children:[O("h1",{className:"plm-ui-page__title",children:e}),r?O("p",{className:"plm-ui-page__subtitle",children:r}):null]}),a?O("div",{className:"plm-ui-page__header-actions",children:a}):null]}),t?O("section",{className:"plm-ui-page__filters","aria-label":"\uD544\uD130",children:t}):null,O("div",{className:"plm-ui-page__content",children:i})]})}export{jr as Accordion,Ve as AccordionContent,Be as AccordionItem,He as AccordionTrigger,vr as Badge,we as Button,Pe as Checkbox,_r as DataTable,sa as DatePicker,Rr as Dialog,Nr as DialogBody,Tr as DialogClose,Fe as DialogContent,$e as DialogDescription,Mr as DialogFooter,Dr as DialogHeader,Ge as DialogTitle,Sr as DialogTrigger,Or as DropdownMenu,Je as DropdownMenuCheckboxItem,Ye as DropdownMenuContent,Gr as DropdownMenuGroup,Xe as DropdownMenuItem,Ze as DropdownMenuLabel,Qe as DropdownMenuSeparator,$r as DropdownMenuSub,Ke as DropdownMenuSubContent,Ue as DropdownMenuSubTrigger,Fr as DropdownMenuTrigger,Wr as FormField,Br as FormGrid,_e as Input,z as Label,Ee as List,qe as ListHeader,Ie as ListItem,se as ModalActionButtons,le as ModalHeader,Ar as ModalSection,ia as Notification,It as PlmPageShell,Xr as Popover,Qr as PopoverAnchor,Zr as PopoverClose,er as PopoverContent,Jr as PopoverTrigger,pr as ScrollArea,be as ScrollBar,Se as Search,ze as Select,or as Separator,tr as Skeleton,wr as SortButton,na as Spinner,da as SpinnerInline,Ir as StandardModal,Re as Switch,ae as Table,te as TablePagination,kr as Tabs,Me as TabsContent,De as TabsList,Ne as TabsTrigger,ke as Textarea,aa as Tooltip,ra as TooltipProvider,Pr as TreeView,xe as buttonVariants,o as cn,ar as notificationVariants};
3
+ //# sourceMappingURL=index.js.map