@ncds/ui-admin 1.8.12 → 1.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/components/data-display/data-grid/DataGrid.js +6 -4
- package/dist/cjs/src/components/forms-and-input/date-picker/DatePicker.js +17 -20
- package/dist/cjs/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +53 -0
- package/dist/cjs/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +129 -0
- package/dist/cjs/src/components/forms-and-input/select/Select.js +12 -1
- package/dist/cjs/src/components/forms-and-input/select-box/SelectBox.js +5 -2
- package/dist/cjs/src/utils/__tests__/date-picker.test.js +29 -0
- package/dist/cjs/src/utils/date-picker.js +15 -1
- package/dist/esm/src/components/data-display/data-grid/DataGrid.js +6 -4
- package/dist/esm/src/components/forms-and-input/date-picker/DatePicker.js +18 -21
- package/dist/esm/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +50 -0
- package/dist/esm/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +126 -0
- package/dist/esm/src/components/forms-and-input/select/Select.js +12 -1
- package/dist/esm/src/components/forms-and-input/select-box/SelectBox.js +5 -2
- package/dist/esm/src/utils/__tests__/date-picker.test.js +26 -0
- package/dist/esm/src/utils/date-picker.js +13 -0
- package/dist/temp/src/components/data-display/data-grid/DataGrid.d.ts +1 -0
- package/dist/temp/src/components/data-display/data-grid/DataGrid.js +7 -6
- package/dist/temp/src/components/data-display/data-grid/DataGrid.types.d.ts +1 -0
- package/dist/temp/src/components/forms-and-input/date-picker/DatePicker.js +18 -28
- package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.d.ts +1 -0
- package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.js +43 -0
- package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.d.ts +1 -0
- package/dist/temp/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.js +109 -0
- package/dist/temp/src/components/forms-and-input/select/Select.d.ts +1 -0
- package/dist/temp/src/components/forms-and-input/select/Select.js +10 -2
- package/dist/temp/src/components/forms-and-input/select-box/SelectBox.d.ts +1 -0
- package/dist/temp/src/components/forms-and-input/select-box/SelectBox.js +5 -4
- package/dist/temp/src/utils/__tests__/date-picker.test.d.ts +1 -0
- package/dist/temp/src/utils/__tests__/date-picker.test.js +26 -0
- package/dist/temp/src/utils/date-picker.d.ts +2 -0
- package/dist/temp/src/utils/date-picker.js +13 -0
- package/dist/types/src/components/data-display/data-grid/DataGrid.d.ts +1 -0
- package/dist/types/src/components/data-display/data-grid/DataGrid.types.d.ts +1 -0
- package/dist/types/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.d.ts +1 -0
- package/dist/types/src/components/forms-and-input/date-picker/__tests__/DatePicker.test.d.ts +1 -0
- package/dist/types/src/components/forms-and-input/select/Select.d.ts +1 -0
- package/dist/types/src/components/forms-and-input/select-box/SelectBox.d.ts +1 -0
- package/dist/types/src/utils/__tests__/date-picker.test.d.ts +1 -0
- package/dist/types/src/utils/date-picker.d.ts +2 -0
- package/dist/ui-admin/assets/styles/style.css +29 -2
- package/package.json +2 -1
|
@@ -2,9 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import classNames from 'classnames';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
4
|
import { HintText } from '../../shared/hintText/HintText';
|
|
5
|
-
export const Select = forwardRef(({ placeholder, disabledPlaceholder = false, id, className, hintText, children, size = 'xs', type = 'default', destructive = false, value, optionItems, register, disabled = false, ...props }, ref) => {
|
|
5
|
+
export const Select = forwardRef(({ placeholder, disabledPlaceholder = false, id, className, hintText, children, size = 'xs', type = 'default', destructive = false, value, optionItems, register, disabled = false, readOnly = false, ...props }, ref) => {
|
|
6
6
|
return (_jsxs("span", { className: classNames('ncua-select', {
|
|
7
7
|
destructive: destructive,
|
|
8
8
|
'ncua-select--simple': type === 'simple',
|
|
9
|
-
|
|
9
|
+
'ncua-select--readonly': readOnly,
|
|
10
|
+
}, className, `ncua-select--${size}`), children: [_jsx("span", { className: "ncua-select__content", children: _jsxs("select", { value: value, ref: ref, id: id, className: classNames('ncua-select__tag', className), disabled: disabled, "aria-readonly": readOnly, ...register, ...props, onKeyDown: (e) => {
|
|
11
|
+
props.onKeyDown?.(e);
|
|
12
|
+
// native select에는 readonly 속성이 없어 키보드로 값이 바뀐다.
|
|
13
|
+
// 값 변경 키는 막고, Tab/Shift+Tab(포커스 이동)은 허용한다.
|
|
14
|
+
if (readOnly && e.key !== 'Tab') {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
}
|
|
17
|
+
}, children: [placeholder && (_jsx("option", { value: "", disabled: disabledPlaceholder, children: placeholder })), optionItems?.map((item) => (_jsx("option", { value: item.id, children: item.label }, item.id))), children] }) }), hintText && (_jsx(HintText, { destructive: destructive, className: "ncua-hint-text", children: hintText }))] }));
|
|
10
18
|
});
|
|
@@ -16,6 +16,7 @@ type SelectBoxProps = Omit<ComponentPropsWithRef<'div'>, 'size' | 'onChange'> &
|
|
|
16
16
|
value?: OptionValue;
|
|
17
17
|
onChange?: OptionChangeHandler;
|
|
18
18
|
disabled?: boolean;
|
|
19
|
+
readOnly?: boolean;
|
|
19
20
|
register?: UseFormRegisterReturn;
|
|
20
21
|
maxHeight?: number;
|
|
21
22
|
multiple?: boolean;
|
|
@@ -40,7 +40,7 @@ function DisplayValue({ displayValue }) {
|
|
|
40
40
|
}
|
|
41
41
|
return (_jsxs("div", { className: "ncua-selectbox__value-container", children: [displayValue.icon && (_jsx("span", { className: "ncua-selectbox__value-icon", children: _jsx(displayValue.icon, { width: 16, height: 16 }) })), _jsx("span", { className: "ncua-selectbox__value-text", children: displayValue.label })] }));
|
|
42
42
|
}
|
|
43
|
-
const SelectBox = forwardRef(({ placeholder = '선택하세요', disabledPlaceholder = false, hintText, size = 'xs', type = 'default', autoWidth = true, destructive = false, value, optionItems = [], disabled = false, maxHeight = DEFAULT_MAX_HEIGHT, multiple = false, maxSelection, align = 'left', usePortal, id, className, children, register, onChange, onEdit, onComplete, ...props }, ref
|
|
43
|
+
const SelectBox = forwardRef(({ placeholder = '선택하세요', disabledPlaceholder = false, hintText, size = 'xs', type = 'default', autoWidth = true, destructive = false, value, optionItems = [], disabled = false, readOnly = false, maxHeight = DEFAULT_MAX_HEIGHT, multiple = false, maxSelection, align = 'left', usePortal, id, className, children, register, onChange, onEdit, onComplete, ...props }, ref
|
|
44
44
|
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 옵션/멀티/태그/포탈 등 필수 분기 통합
|
|
45
45
|
) => {
|
|
46
46
|
const internalRef = useRef(null);
|
|
@@ -59,7 +59,7 @@ const SelectBox = forwardRef(({ placeholder = '선택하세요', disabledPlaceho
|
|
|
59
59
|
return selectedOption ? selectedOption : placeholder;
|
|
60
60
|
}, [multiple, selectedOption, placeholder]);
|
|
61
61
|
const handleOptionSelect = (option) => {
|
|
62
|
-
if (disabled)
|
|
62
|
+
if (disabled || readOnly)
|
|
63
63
|
return;
|
|
64
64
|
if (multiple) {
|
|
65
65
|
const newValue = tryToggle(option.id, Array.isArray(value) ? value : []);
|
|
@@ -79,7 +79,7 @@ const SelectBox = forwardRef(({ placeholder = '선택하세요', disabledPlaceho
|
|
|
79
79
|
maxHeight,
|
|
80
80
|
itemCount: optionItems.length,
|
|
81
81
|
optionItems,
|
|
82
|
-
disabled,
|
|
82
|
+
disabled: disabled || readOnly,
|
|
83
83
|
multiple,
|
|
84
84
|
onSelect: handleOptionSelect,
|
|
85
85
|
});
|
|
@@ -147,10 +147,11 @@ const SelectBox = forwardRef(({ placeholder = '선택하세요', disabledPlaceho
|
|
|
147
147
|
return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: internalRef, className: classNames('ncua-selectbox', `ncua-selectbox--${size}`, {
|
|
148
148
|
'ncua-selectbox--open': isOpen,
|
|
149
149
|
'ncua-selectbox--disabled': disabled,
|
|
150
|
+
'ncua-selectbox--readonly': readOnly,
|
|
150
151
|
'ncua-selectbox--simple': type === 'simple',
|
|
151
152
|
'ncua-selectbox--multiple': multiple,
|
|
152
153
|
destructive: destructive,
|
|
153
|
-
}, className), ...props, children: [_jsxs("div", { className: classNames('ncua-selectbox__content'), onClick: toggleDropdown, onKeyDown: handleKeyDown, tabIndex: disabled ? -1 : 0, role: "combobox", "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": `selectbox-options-${id || 'default'}`, "aria-disabled": disabled, "aria-label": selectedOption ? selectedOption.label : placeholder, "aria-activedescendant": activeDescendantId, children: [_jsxs("div", { className: "ncua-selectbox__content-inner", children: [_jsx("div", { className: "ncua-selectbox__value", children: _jsx(DisplayValue, { displayValue: displayValue }) }), _jsx(ChevronDown, { width: size === 'xs' ? ICON_SIZE_XS : ICON_SIZE_SM, height: size === 'xs' ? ICON_SIZE_XS : ICON_SIZE_SM, color: disabled ? COLOR.gray300 : COLOR.gray500, className: classNames('ncua-selectbox__arrow', {
|
|
154
|
+
}, className), ...props, children: [_jsxs("div", { className: classNames('ncua-selectbox__content'), onClick: toggleDropdown, onKeyDown: handleKeyDown, tabIndex: disabled ? -1 : 0, role: "combobox", "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-controls": `selectbox-options-${id || 'default'}`, "aria-disabled": disabled, "aria-readonly": readOnly, "aria-label": selectedOption ? selectedOption.label : placeholder, "aria-activedescendant": activeDescendantId, children: [_jsxs("div", { className: "ncua-selectbox__content-inner", children: [_jsx("div", { className: "ncua-selectbox__value", children: _jsx(DisplayValue, { displayValue: displayValue }) }), _jsx(ChevronDown, { width: size === 'xs' ? ICON_SIZE_XS : ICON_SIZE_SM, height: size === 'xs' ? ICON_SIZE_XS : ICON_SIZE_SM, color: disabled ? COLOR.gray300 : COLOR.gray500, className: classNames('ncua-selectbox__arrow', {
|
|
154
155
|
'ncua-selectbox__arrow--up': isOpen,
|
|
155
156
|
}) })] }), !shouldPortal && selectDropdownNode] }), hintText && (_jsx(HintText, { destructive: destructive, className: "ncua-hint-text", children: hintText })), register && (_jsx("input", { type: "hidden", ...register, value: multiple ? JSON.stringify(value || []) : String(value || '') }))] }), selectedTags.length > 0 && (_jsx("div", { className: "ncua-selectbox__tags", children: selectedTags.map((tag) => (_jsx(Tag, { text: tag.label, size: "sm", close: true, onButtonClick: () => handleRemoveTag(tag.id) }, tag.id))) })), portaledDropdown] }));
|
|
156
157
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import moment from 'moment';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { convertToMomentFormat } from '../date-picker';
|
|
4
|
+
describe('convertToMomentFormat', () => {
|
|
5
|
+
it('날짜 전용 포맷을 moment 토큰으로 변환한다 (기존 동작 보존)', () => {
|
|
6
|
+
expect(convertToMomentFormat('Y-m-d')).toBe('YYYY-MM-DD');
|
|
7
|
+
});
|
|
8
|
+
it('2자리 연도(y)를 YY로 변환한다', () => {
|
|
9
|
+
expect(convertToMomentFormat('y-m-d')).toBe('YY-MM-DD');
|
|
10
|
+
});
|
|
11
|
+
it('시간 포함 포맷의 H/i/S를 모두 변환한다 (버그 수정 지점)', () => {
|
|
12
|
+
expect(convertToMomentFormat('Y-m-d H:i')).toBe('YYYY-MM-DD HH:mm');
|
|
13
|
+
expect(convertToMomentFormat('Y-m-d H:i:S')).toBe('YYYY-MM-DD HH:mm:ss');
|
|
14
|
+
});
|
|
15
|
+
it('월(m)과 분(i)이 함께 있어도 서로 침범하지 않는다', () => {
|
|
16
|
+
// m -> MM(월) 먼저, i -> mm(분) 나중 순서가 지켜져야 함
|
|
17
|
+
expect(convertToMomentFormat('Y-m-d H:i')).not.toContain('i');
|
|
18
|
+
expect(convertToMomentFormat('Y-m-d H:i')).toBe('YYYY-MM-DD HH:mm');
|
|
19
|
+
});
|
|
20
|
+
it('실제 moment 출력이 의도한 문자열과 일치한다 (회귀 핵심)', () => {
|
|
21
|
+
const date = moment('2024-03-20 14:30:05', 'YYYY-MM-DD HH:mm:ss').toDate();
|
|
22
|
+
expect(moment(date).format(convertToMomentFormat('Y-m-d'))).toBe('2024-03-20');
|
|
23
|
+
expect(moment(date).format(convertToMomentFormat('Y-m-d H:i'))).toBe('2024-03-20 14:30');
|
|
24
|
+
expect(moment(date).format(convertToMomentFormat('Y-m-d H:i:S'))).toBe('2024-03-20 14:30:05');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -6,6 +6,8 @@ export declare function getSubtractDate({ date, period, unit, }: {
|
|
|
6
6
|
period: DurationInputArg1;
|
|
7
7
|
unit: DurationInputArg2;
|
|
8
8
|
}): Date;
|
|
9
|
+
/** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
|
|
10
|
+
export declare const convertToMomentFormat: (format: string) => string;
|
|
9
11
|
export declare const formatDateInput: (input: string) => string;
|
|
10
12
|
export declare const formatHourInput: (input: string) => string;
|
|
11
13
|
export declare const formatMinuteInput: (input: string) => string;
|
|
@@ -15,6 +15,19 @@ export function getToday() {
|
|
|
15
15
|
export function getSubtractDate({ date = getToday(), period, unit, }) {
|
|
16
16
|
return moment(date).subtract(period, unit).toDate();
|
|
17
17
|
}
|
|
18
|
+
/** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
|
|
19
|
+
export const convertToMomentFormat = (format) => {
|
|
20
|
+
const tokenMap = {
|
|
21
|
+
Y: 'YYYY',
|
|
22
|
+
y: 'YY',
|
|
23
|
+
m: 'MM',
|
|
24
|
+
d: 'DD',
|
|
25
|
+
H: 'HH',
|
|
26
|
+
i: 'mm',
|
|
27
|
+
S: 'ss',
|
|
28
|
+
};
|
|
29
|
+
return format.replace(/[YymdHiS]/g, (matched) => tokenMap[matched] || matched);
|
|
30
|
+
};
|
|
18
31
|
export const formatDateInput = (input) => {
|
|
19
32
|
const dateRegex = /^(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[0-1])$/;
|
|
20
33
|
if (dateRegex.test(input)) {
|
|
@@ -3,6 +3,7 @@ import type { DataGridActionBarProps, DataGridFilterBarProps, DataGridPagination
|
|
|
3
3
|
export declare const DataGrid: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
4
4
|
variant?: import("./DataGrid.types").DataGridVariant | undefined;
|
|
5
5
|
children: ReactNode;
|
|
6
|
+
showActionBar?: boolean | undefined;
|
|
6
7
|
} & import("react").RefAttributes<HTMLDivElement>> & {
|
|
7
8
|
SearchFilter: {
|
|
8
9
|
({ children, className, ...rest }: DataGridSearchFilterProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -6,6 +6,7 @@ export type ActionBarAlign = 'left' | 'right' | 'space-between';
|
|
|
6
6
|
export type DataGridProps = Omit<ComponentProps<'div'>, 'ref'> & {
|
|
7
7
|
variant?: DataGridVariant;
|
|
8
8
|
children: ReactNode;
|
|
9
|
+
showActionBar?: boolean;
|
|
9
10
|
};
|
|
10
11
|
export type DataGridSearchFilterProps = ComponentProps<'div'> & {
|
|
11
12
|
children: ReactNode;
|
package/dist/types/src/components/forms-and-input/date-picker/__tests__/DatePicker.memo.test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -7,6 +7,7 @@ export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, 'size
|
|
|
7
7
|
disabledPlaceholder?: boolean;
|
|
8
8
|
hintText?: string;
|
|
9
9
|
destructive?: boolean;
|
|
10
|
+
readOnly?: boolean;
|
|
10
11
|
size?: Extract<Size, 'xs' | 'sm' | 'md'>;
|
|
11
12
|
optionItems?: OptionType[];
|
|
12
13
|
register?: UseFormRegisterReturn;
|
|
@@ -16,6 +16,7 @@ type SelectBoxProps = Omit<ComponentPropsWithRef<'div'>, 'size' | 'onChange'> &
|
|
|
16
16
|
value?: OptionValue;
|
|
17
17
|
onChange?: OptionChangeHandler;
|
|
18
18
|
disabled?: boolean;
|
|
19
|
+
readOnly?: boolean;
|
|
19
20
|
register?: UseFormRegisterReturn;
|
|
20
21
|
maxHeight?: number;
|
|
21
22
|
multiple?: boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -6,6 +6,8 @@ export declare function getSubtractDate({ date, period, unit, }: {
|
|
|
6
6
|
period: DurationInputArg1;
|
|
7
7
|
unit: DurationInputArg2;
|
|
8
8
|
}): Date;
|
|
9
|
+
/** flatpickr dateFormat 토큰을 moment 포맷 토큰으로 변환 (단일 패스 치환으로 토큰 간 간섭 방지) */
|
|
10
|
+
export declare const convertToMomentFormat: (format: string) => string;
|
|
9
11
|
export declare const formatDateInput: (input: string) => string;
|
|
10
12
|
export declare const formatHourInput: (input: string) => string;
|
|
11
13
|
export declare const formatMinuteInput: (input: string) => string;
|
|
@@ -3415,6 +3415,12 @@ button {
|
|
|
3415
3415
|
.ncua-select__content:has(.ncua-select__tag:disabled) {
|
|
3416
3416
|
border-color: var(--gray-200);
|
|
3417
3417
|
}
|
|
3418
|
+
.ncua-select--readonly .ncua-select__tag {
|
|
3419
|
+
pointer-events: none;
|
|
3420
|
+
background-color: var(--gray-50);
|
|
3421
|
+
color: var(--gray-700);
|
|
3422
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 5.25L7 8.75L10.5 5.25' stroke='%23a4a5a8' stroke-width='1.16667' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
|
3423
|
+
}
|
|
3418
3424
|
.ncua-select.destructive .ncua-select__content {
|
|
3419
3425
|
border-color: var(--primary-red-600);
|
|
3420
3426
|
}
|
|
@@ -3644,7 +3650,7 @@ button {
|
|
|
3644
3650
|
cursor: pointer;
|
|
3645
3651
|
transition: all 0.15s ease-in-out;
|
|
3646
3652
|
}
|
|
3647
|
-
.ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox__content) {
|
|
3653
|
+
.ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox__content):not(.ncua-selectbox--readonly .ncua-selectbox__content) {
|
|
3648
3654
|
border-color: var(--gray-300);
|
|
3649
3655
|
}
|
|
3650
3656
|
.ncua-selectbox__content:focus {
|
|
@@ -3727,6 +3733,16 @@ button {
|
|
|
3727
3733
|
.ncua-selectbox--disabled .ncua-selectbox__arrow {
|
|
3728
3734
|
color: var(--gray-300);
|
|
3729
3735
|
}
|
|
3736
|
+
.ncua-selectbox--readonly .ncua-selectbox__content {
|
|
3737
|
+
background-color: var(--gray-50);
|
|
3738
|
+
cursor: default;
|
|
3739
|
+
}
|
|
3740
|
+
.ncua-selectbox--readonly .ncua-selectbox__value {
|
|
3741
|
+
color: var(--gray-700);
|
|
3742
|
+
}
|
|
3743
|
+
.ncua-selectbox--readonly .ncua-selectbox__arrow {
|
|
3744
|
+
color: var(--gray-300);
|
|
3745
|
+
}
|
|
3730
3746
|
.ncua-selectbox.destructive .ncua-selectbox__content {
|
|
3731
3747
|
border-color: var(--primary-red-600);
|
|
3732
3748
|
}
|
|
@@ -3791,7 +3807,7 @@ button {
|
|
|
3791
3807
|
border: 0;
|
|
3792
3808
|
background-color: transparent;
|
|
3793
3809
|
}
|
|
3794
|
-
.ncua-selectbox--simple .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox--simple .ncua-selectbox__content) {
|
|
3810
|
+
.ncua-selectbox--simple .ncua-selectbox__content:hover:not(.ncua-selectbox--disabled .ncua-selectbox--simple .ncua-selectbox__content):not(.ncua-selectbox--readonly .ncua-selectbox--simple .ncua-selectbox__content) {
|
|
3795
3811
|
border-color: transparent;
|
|
3796
3812
|
}
|
|
3797
3813
|
.ncua-selectbox--simple .ncua-selectbox__content:focus {
|
|
@@ -6818,12 +6834,23 @@ button {
|
|
|
6818
6834
|
.ncua-data-grid__table:first-child {
|
|
6819
6835
|
border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
|
|
6820
6836
|
}
|
|
6837
|
+
.ncua-data-grid__table:first-child .ncua-table {
|
|
6838
|
+
border-top-left-radius: var(--border-radius-md);
|
|
6839
|
+
border-top-right-radius: var(--border-radius-md);
|
|
6840
|
+
}
|
|
6821
6841
|
.ncua-data-grid__table:last-child {
|
|
6822
6842
|
border-radius: 0 0 var(--border-radius-md) var(--border-radius-md);
|
|
6823
6843
|
}
|
|
6844
|
+
.ncua-data-grid__table:last-child .ncua-table {
|
|
6845
|
+
border-bottom-left-radius: var(--border-radius-md);
|
|
6846
|
+
border-bottom-right-radius: var(--border-radius-md);
|
|
6847
|
+
}
|
|
6824
6848
|
.ncua-data-grid__table:first-child:last-child {
|
|
6825
6849
|
border-radius: var(--border-radius-md);
|
|
6826
6850
|
}
|
|
6851
|
+
.ncua-data-grid__table:first-child:last-child .ncua-table {
|
|
6852
|
+
border-radius: var(--border-radius-md);
|
|
6853
|
+
}
|
|
6827
6854
|
.ncua-data-grid__table .ncua-table-wrapper {
|
|
6828
6855
|
border: none;
|
|
6829
6856
|
box-shadow: none;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ncds/ui-admin",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.14",
|
|
4
4
|
"description": "nhn-commerce의 어드민 디자인 시스템입니다.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"barrel": "node barrel.js",
|
|
@@ -105,6 +105,7 @@
|
|
|
105
105
|
"eslint-config-react-app": "7.0.1",
|
|
106
106
|
"file-loader": "6.2.0",
|
|
107
107
|
"html-webpack-plugin": "5.6.6",
|
|
108
|
+
"jsdom": "26.1.0",
|
|
108
109
|
"mini-css-extract-plugin": "2.10.1",
|
|
109
110
|
"prop-types": "15.8.1",
|
|
110
111
|
"react": "18.2.0",
|