sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.40
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/AGENTS.md +642 -88
- package/README.md +111 -9
- package/dist/components/SAccountListBox/AccountListBoxPortal.d.ts +31 -0
- package/dist/components/SAccountListBox/README.md +86 -0
- package/dist/components/SAccountListBox/SAccountListBox.d.ts +79 -0
- package/dist/components/SAccountListBox/SystemMenuPortal.d.ts +58 -0
- package/dist/components/SAccountListBox/accountListBox.config.d.ts +64 -0
- package/dist/components/SAccountListBox/index.d.ts +2 -0
- package/dist/components/SBadge/README.md +26 -0
- package/dist/components/SBadge/SBadge.d.ts +1 -1
- package/dist/components/SBarcodeInput/README.md +9 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +7 -1
- package/dist/components/SButton/README.md +38 -0
- package/dist/components/SCalendar/README.md +13 -0
- package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
- package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
- package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
- package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
- package/dist/components/SCalendarBoard/README.md +137 -0
- package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
- package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
- package/dist/components/SCalendarBoard/index.d.ts +3 -0
- package/dist/components/SCalendarBoard/types.d.ts +31 -0
- package/dist/components/SCallout/README.md +16 -1
- package/dist/components/SCallout/SCallout.d.ts +9 -4
- package/dist/components/SCard/README.md +16 -0
- package/dist/components/SCard/SCard.d.ts +17 -2
- package/dist/components/SCheckbox/README.md +8 -0
- package/dist/components/SChipFilter/README.md +339 -14
- package/dist/components/SChipFilter/SChipFilter.d.ts +150 -60
- package/dist/components/SChipFilter/index.d.ts +1 -1
- package/dist/components/SChipInput/README.md +15 -1
- package/dist/components/SChipInput/SChipInput.d.ts +7 -1
- package/dist/components/SChipInput/index.d.ts +1 -1
- package/dist/components/SCircleProgress/README.md +8 -0
- package/dist/components/SConfirmModal/README.md +17 -1
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
- package/dist/components/SConfirmModal/index.d.ts +1 -1
- package/dist/components/SDatePicker/README.md +20 -2
- package/dist/components/SDatePicker/SDatePicker.d.ts +27 -4
- package/dist/components/SDateRangePicker/README.md +17 -2
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -3
- package/dist/components/SDivider/README.md +7 -0
- package/dist/components/SDivider/SDivider.d.ts +11 -0
- package/dist/components/SDraggableItem/README.md +37 -0
- package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
- package/dist/components/SDraggableItem/index.d.ts +1 -1
- package/dist/components/SDraggableList/README.md +30 -0
- package/dist/components/SDraggableList/SDraggableList.d.ts +11 -0
- package/dist/components/SDraggableList/index.d.ts +1 -1
- package/dist/components/SDrawer/README.md +8 -0
- package/dist/components/SDropdownButton/README.md +19 -0
- package/dist/components/SEditor/EditorBody.d.ts +36 -0
- package/dist/components/SEditor/EditorToolbar.d.ts +93 -0
- package/dist/components/SEditor/README.md +203 -0
- package/dist/components/SEditor/SEditor.d.ts +114 -0
- package/dist/components/SEditor/editor-icons.d.ts +63 -0
- package/dist/components/SEditor/editor.config.d.ts +119 -0
- package/dist/components/SEditor/index.d.ts +8 -0
- package/dist/components/SEditor/tiptap-api.d.ts +29 -0
- package/dist/components/SEditor/use-is-mobile.d.ts +14 -0
- package/dist/components/SExpansionItem/README.md +36 -0
- package/dist/components/SExpansionItem/index.d.ts +1 -1
- package/dist/components/SField/README.md +27 -3
- package/dist/components/SField/SField.d.ts +12 -6
- package/dist/components/SFilePicker/README.md +15 -1
- package/dist/components/SFilePicker/SFilePicker.d.ts +7 -1
- package/dist/components/SFooter/README.md +25 -0
- package/dist/components/SFooter/SFooter.d.ts +4 -3
- package/dist/components/SForm/README.md +11 -0
- package/dist/components/SGhostButton/README.md +22 -4
- package/dist/components/SGnb/README.md +51 -0
- package/dist/components/SGnb/SGnb.d.ts +50 -0
- package/dist/components/SGnb/gnb.config.d.ts +10 -3
- package/dist/components/SGnb/index.d.ts +1 -1
- package/dist/components/SGnbSystem/README.md +186 -0
- package/dist/components/SGnbSystem/SGnbSystem.d.ts +179 -0
- package/dist/components/SGnbSystem/gnbSystem.config.d.ts +122 -0
- package/dist/components/SGnbSystem/index.d.ts +2 -0
- package/dist/components/SGuide/README.md +15 -0
- package/dist/components/SIcon/README.md +10 -0
- package/dist/components/SIcon/SIcon.d.ts +1 -1
- package/dist/components/SIcon/icons.gen.d.ts +4 -0
- package/dist/components/SImage/README.md +14 -0
- package/dist/components/SInput/README.md +3 -1
- package/dist/components/SInput/SInput.d.ts +7 -1
- package/dist/components/SKeyValueTable/README.md +86 -0
- package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +6 -2
- package/dist/components/SKeyValueTable/index.d.ts +1 -1
- package/dist/components/SLayout/README.md +21 -0
- package/dist/components/SLayout/SLayout.d.ts +4 -0
- package/dist/components/SLayout/index.d.ts +1 -1
- package/dist/components/SLinearProgress/README.md +15 -0
- package/dist/components/SLinearProgress/SLinearProgress.d.ts +3 -0
- package/dist/components/SLinearProgress/index.d.ts +1 -1
- package/dist/components/SList/README.md +5 -1
- package/dist/components/SList/SList.d.ts +0 -2
- package/dist/components/SListItem/README.md +41 -0
- package/dist/components/SListItem/index.d.ts +1 -1
- package/dist/components/SLoadingContainer/loading.d.ts +18 -2
- package/dist/components/SLoadingModal/README.md +9 -1
- package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
- package/dist/components/SLoadingModal/index.d.ts +1 -1
- package/dist/components/SNumberInput/README.md +9 -1
- package/dist/components/SNumberInput/SNumberInput.d.ts +7 -1
- package/dist/components/SPage/README.md +47 -4
- package/dist/components/SPage/SPage.d.ts +15 -10
- package/dist/components/SPage/SPageHeader.d.ts +18 -11
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page-column.d.ts +25 -0
- package/dist/components/SPopover/README.md +15 -0
- package/dist/components/SPopup/README.md +19 -0
- package/dist/components/SPortal/README.md +18 -0
- package/dist/components/SRadio/README.md +20 -0
- package/dist/components/SRadioButton/README.md +18 -0
- package/dist/components/SRadioButton/SRadioButton.d.ts +1 -1
- package/dist/components/SRadioCard/README.md +78 -0
- package/dist/components/SRadioCard/SRadioCard.d.ts +29 -0
- package/dist/components/SRadioCard/SRadioCardGroup.d.ts +36 -0
- package/dist/components/SRadioCard/index.d.ts +2 -0
- package/dist/components/SScrollArea/README.md +27 -0
- package/dist/components/SSearchInput/README.md +63 -0
- package/dist/components/SSearchInput/SSearchInput.d.ts +52 -0
- package/dist/components/SSearchInput/index.d.ts +1 -0
- package/dist/components/SSectionHeaderCard/README.md +37 -0
- package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -0
- package/dist/components/SSelect/README.md +24 -6
- package/dist/components/SSelect/SSelect.d.ts +14 -2
- package/dist/components/SSplitter/README.md +15 -0
- package/dist/components/SStepper/README.md +26 -0
- package/dist/components/SSwitch/README.md +13 -0
- package/dist/components/SSystemActionButton/README.md +221 -0
- package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +161 -0
- package/dist/components/SSystemActionButton/index.d.ts +2 -0
- package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +93 -0
- package/dist/components/STable/README.md +86 -1
- package/dist/components/STable/STable.d.ts +121 -11
- package/dist/components/STable/index.d.ts +1 -1
- package/dist/components/STabs/README.md +12 -1
- package/dist/components/STabs/STabs.d.ts +2 -4
- package/dist/components/STabs/index.d.ts +1 -1
- package/dist/components/STabs/tabs.config.d.ts +3 -4
- package/dist/components/STag/README.md +52 -0
- package/dist/components/STag/STag.d.ts +3 -1
- package/dist/components/STextLink/README.md +18 -0
- package/dist/components/STextLink/STextLink.d.ts +4 -0
- package/dist/components/STextarea/README.md +1 -1
- package/dist/components/STextarea/STextarea.d.ts +7 -1
- package/dist/components/STimePicker/README.md +15 -1
- package/dist/components/STimePicker/STimePicker.d.ts +7 -1
- package/dist/components/STimePicker/timepicker.config.d.ts +4 -2
- package/dist/components/STimeRangePicker/README.md +27 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +7 -1
- package/dist/components/SToast/README.md +24 -0
- package/dist/components/SToggle/README.md +8 -0
- package/dist/components/SToggle/index.d.ts +1 -1
- package/dist/components/STooltip/README.md +24 -0
- package/dist/components/STree/README.md +41 -0
- package/dist/components/STree/STree.d.ts +8 -0
- package/dist/components/STree/index.d.ts +1 -1
- package/dist/docs/Gallery.d.ts +9 -0
- package/dist/docs/gallery-previews.d.ts +24 -0
- package/dist/index.cjs +10754 -5244
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +10718 -5244
- package/dist/index.js.map +1 -1
- package/dist/lib/doc-sections.d.ts +35 -0
- package/dist/lib/field-width.d.ts +31 -0
- package/dist/lib/floating-height.d.ts +15 -0
- package/dist/lib/story-docs.d.ts +19 -3
- package/dist/lib/truncated-value-tooltip.d.ts +18 -0
- package/dist/llms-full.txt +3263 -228
- package/dist/llms.txt +647 -90
- package/dist/playground/categories.d.ts +19 -0
- package/dist/styles.css +1725 -169
- package/dist/theme.css +216 -24
- package/eslint/index.mjs +14 -0
- package/eslint/lib/table-column.mjs +26 -0
- package/eslint/rules/divider-vertical-height.mjs +137 -0
- package/eslint/rules/field-width-grade.d.mts +41 -0
- package/eslint/rules/field-width-grade.mjs +311 -0
- package/eslint/rules/table-column-width.mjs +110 -0
- package/eslint/scale.gen.mjs +5 -2
- package/package.json +13 -1
package/dist/theme.css
CHANGED
|
@@ -77,10 +77,10 @@
|
|
|
77
77
|
--color-olive-95: #2C2C00;
|
|
78
78
|
--color-olive-05: #FEFED9;
|
|
79
79
|
--color-green-15: #E8F9EF;
|
|
80
|
-
--color-green-25: #
|
|
81
|
-
--color-green-45: #
|
|
82
|
-
--color-green-55: #
|
|
83
|
-
--color-green-65: #
|
|
80
|
+
--color-green-25: #D8F2E2;
|
|
81
|
+
--color-green-45: #AEEAC7;
|
|
82
|
+
--color-green-55: #84DEA8;
|
|
83
|
+
--color-green-65: #4CC77D;
|
|
84
84
|
--color-green-70: #12B553;
|
|
85
85
|
--color-green-75: #00973C;
|
|
86
86
|
--color-green-80: #007B31;
|
|
@@ -208,6 +208,7 @@
|
|
|
208
208
|
--color-field-icon-default: #888888;
|
|
209
209
|
--color-control-bg-inverseHover: #0075FF;
|
|
210
210
|
--color-navigation-gnb-bg-dark: #001B39;
|
|
211
|
+
--color-navigation-gnb-bg-system: #004177;
|
|
211
212
|
--color-primary-10: #EFF6FF;
|
|
212
213
|
--color-primary-20: #E6F1FF;
|
|
213
214
|
--color-primary-25: #D9EAFF;
|
|
@@ -237,10 +238,10 @@
|
|
|
237
238
|
--color-danger-strong: #FB4444;
|
|
238
239
|
--color-danger-subtle: #FCEFEF;
|
|
239
240
|
--color-success-15: #E8F9EF;
|
|
240
|
-
--color-success-25: #
|
|
241
|
-
--color-success-45: #
|
|
242
|
-
--color-success-55: #
|
|
243
|
-
--color-success-65: #
|
|
241
|
+
--color-success-25: #D8F2E2;
|
|
242
|
+
--color-success-45: #AEEAC7;
|
|
243
|
+
--color-success-55: #84DEA8;
|
|
244
|
+
--color-success-65: #4CC77D;
|
|
244
245
|
--color-success-70: #12B553;
|
|
245
246
|
--color-success-75: #00973C;
|
|
246
247
|
--color-success-80: #007B31;
|
|
@@ -318,6 +319,7 @@
|
|
|
318
319
|
--font-weight-black: 900;
|
|
319
320
|
--font-base: Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif;
|
|
320
321
|
--border-width-1: 1px;
|
|
322
|
+
--border-width-2: 2px;
|
|
321
323
|
--border-width-4: 4px;
|
|
322
324
|
--border-width-6: 6px;
|
|
323
325
|
--border-width-control-default: 1px;
|
|
@@ -325,18 +327,19 @@
|
|
|
325
327
|
--border-width-navigation-default: 1px;
|
|
326
328
|
--border-width-item-default: 1px;
|
|
327
329
|
--opacity-005: 5%;
|
|
330
|
+
--opacity-008: 8%;
|
|
328
331
|
--opacity-040: 40%;
|
|
329
332
|
--opacity-060: 60%;
|
|
330
333
|
--z-raised: 1;
|
|
331
|
-
--shadow-normal-xs: 0px 0px 16px -4px rgba(34,34,34,0.12), 2px
|
|
332
|
-
--shadow-normal-sm: 0px 0px 24px -6px rgba(34,34,34,0.12), 4px
|
|
333
|
-
--shadow-normal-md: 0px 8px 36px -6px rgba(34,34,34,0.16), 4px 12px
|
|
334
|
+
--shadow-normal-xs: 0px 0px 16px -4px rgba(34,34,34,0.12), 2px 2px 6px -2px rgba(34,34,34,0.16);
|
|
335
|
+
--shadow-normal-sm: 0px 0px 24px -6px rgba(34,34,34,0.12), 4px 4px 16px -4px rgba(34,34,34,0.2);
|
|
336
|
+
--shadow-normal-md: 0px 8px 36px -6px rgba(34,34,34,0.16), 4px 8px 12px -4px rgba(34,34,34,0.16);
|
|
334
337
|
--shadow-spread-sm: 0px 0px 8px 0px rgba(34,34,34,0.1);
|
|
335
338
|
--shadow-spread-md: 0px 0px 24px 0px rgba(34,34,34,0.2);
|
|
336
339
|
--shadow-focus: 0px 0px 8px 0px rgba(0,117,255,0.25);
|
|
337
|
-
--shadow-overlay: 0px 0px 16px -4px rgba(34,34,34,0.12), 2px
|
|
338
|
-
--shadow-floating: 0px 0px 24px -6px rgba(34,34,34,0.12), 4px
|
|
339
|
-
--shadow-dialog: 0px 8px 36px -6px rgba(34,34,34,0.16), 4px 12px
|
|
340
|
+
--shadow-overlay: 0px 0px 16px -4px rgba(34,34,34,0.12), 2px 2px 6px -2px rgba(34,34,34,0.16);
|
|
341
|
+
--shadow-floating: 0px 0px 24px -6px rgba(34,34,34,0.12), 4px 4px 16px -4px rgba(34,34,34,0.2);
|
|
342
|
+
--shadow-dialog: 0px 8px 36px -6px rgba(34,34,34,0.16), 4px 8px 12px -4px rgba(34,34,34,0.16);
|
|
340
343
|
}
|
|
341
344
|
|
|
342
345
|
/* 시맨틱 토큰 (별칭 해석값) — var()로 참조 */
|
|
@@ -497,6 +500,7 @@
|
|
|
497
500
|
--sys-color-field-icon-default: #888888;
|
|
498
501
|
--sys-color-control-bg-inverseHover: #0075FF;
|
|
499
502
|
--sys-color-navigation-gnb-bg-dark: #001B39;
|
|
503
|
+
--sys-color-navigation-gnb-bg-system: #004177;
|
|
500
504
|
|
|
501
505
|
/* 컴포넌트 토큰 */
|
|
502
506
|
--cmp-button-xs-height: 24px;
|
|
@@ -671,7 +675,10 @@
|
|
|
671
675
|
--cmp-radioButton-xs-paddingX: 8px;
|
|
672
676
|
--cmp-radioButton-sm-height: 28px;
|
|
673
677
|
--cmp-radioButton-sm-paddingX: 12px;
|
|
674
|
-
--cmp-radioButton-
|
|
678
|
+
--cmp-radioButton-md-height: 36px;
|
|
679
|
+
--cmp-radioButton-md-paddingX: 20px;
|
|
680
|
+
--cmp-radioButton-radius-sm: 4px;
|
|
681
|
+
--cmp-radioButton-radius-md: 6px;
|
|
675
682
|
--cmp-radioButton-border-width: 1px;
|
|
676
683
|
--cmp-radioButton-border-default: #CCCCCC;
|
|
677
684
|
--cmp-radioButton-border-select: #0075FF;
|
|
@@ -685,6 +692,22 @@
|
|
|
685
692
|
--cmp-radioButton-content-select: #0075FF;
|
|
686
693
|
--cmp-radioButton-content-disabled: #888888;
|
|
687
694
|
--cmp-radioButton-group-gap: -1px;
|
|
695
|
+
--cmp-radioCard-radius: 8px;
|
|
696
|
+
--cmp-radioCard-paddingX: 16px;
|
|
697
|
+
--cmp-radioCard-paddingY: 8px;
|
|
698
|
+
--cmp-radioCard-border-width: 1px;
|
|
699
|
+
--cmp-radioCard-border-default: #E1E1E1;
|
|
700
|
+
--cmp-radioCard-border-selected: #93C4FF;
|
|
701
|
+
--cmp-radioCard-border-hover: #AAAAAA;
|
|
702
|
+
--cmp-radioCard-bg-default: #FFFFFF;
|
|
703
|
+
--cmp-radioCard-bg-selected: #EFF6FF;
|
|
704
|
+
--cmp-radioCard-bg-hover: #F9F9F9;
|
|
705
|
+
--cmp-radioCard-bg-disabled: #EEEEEE;
|
|
706
|
+
--cmp-radioCard-gap: 8px;
|
|
707
|
+
--cmp-radioCard-label-color: #222222;
|
|
708
|
+
--cmp-radioCard-subtitle-paddingLeft: 24px;
|
|
709
|
+
--cmp-radioCard-subtitle-color: #555555;
|
|
710
|
+
--cmp-radioCard-group-gap: 8px;
|
|
688
711
|
--cmp-listBoxItem-paddingY: 4px;
|
|
689
712
|
--cmp-listBoxItem-paddingRight: 12px;
|
|
690
713
|
--cmp-listBoxItem-gap: 8px;
|
|
@@ -746,6 +769,11 @@
|
|
|
746
769
|
--cmp-field-errorMessage-color: #E30000;
|
|
747
770
|
--cmp-field-contents-gap: 4px;
|
|
748
771
|
--cmp-field-message-paddingX: 8px;
|
|
772
|
+
--cmp-field-width-xs: 80px;
|
|
773
|
+
--cmp-field-width-sm: 120px;
|
|
774
|
+
--cmp-field-width-md: 160px;
|
|
775
|
+
--cmp-field-width-lg: 240px;
|
|
776
|
+
--cmp-field-width-xl: 480px;
|
|
749
777
|
--cmp-textinput-sm-height: 28px;
|
|
750
778
|
--cmp-textinput-sm-paddingX: 12px;
|
|
751
779
|
--cmp-textinput-sm-paddingY: 4px;
|
|
@@ -954,6 +982,70 @@
|
|
|
954
982
|
--cmp-timepicker-selector-range-heading-color: #555555;
|
|
955
983
|
--cmp-timepicker-selector-range-heading-gap: 16px;
|
|
956
984
|
--cmp-timepicker-selector-range-section-gap: 12px;
|
|
985
|
+
--cmp-calendarBoard-radius: 8px;
|
|
986
|
+
--cmp-calendarBoard-bg: #FFFFFF;
|
|
987
|
+
--cmp-calendarBoard-border: #E1E1E1;
|
|
988
|
+
--cmp-calendarBoard-header-content-color: #222222;
|
|
989
|
+
--cmp-calendarBoard-header-content-divider-height: 16px;
|
|
990
|
+
--cmp-calendarBoard-header-content-gap: 8px;
|
|
991
|
+
--cmp-calendarBoard-header-gap: 16px;
|
|
992
|
+
--cmp-calendarBoard-grid-bg: #F9F9F9;
|
|
993
|
+
--cmp-calendarBoard-grid-weekRow-color: #555555;
|
|
994
|
+
--cmp-calendarBoard-grid-gap: 8px;
|
|
995
|
+
--cmp-calendarBoard-grid-paddingTop: 6px;
|
|
996
|
+
--cmp-calendarBoard-grid-month-border: #E1E1E1;
|
|
997
|
+
--cmp-calendarBoard-daySequence-size: 24px;
|
|
998
|
+
--cmp-calendarBoard-daySequence-radius: 9999px;
|
|
999
|
+
--cmp-calendarBoard-daySequence-bg-today: #0075FF;
|
|
1000
|
+
--cmp-calendarBoard-daySequence-border-selected: #0075FF;
|
|
1001
|
+
--cmp-calendarBoard-daySequence-text-default: #222222;
|
|
1002
|
+
--cmp-calendarBoard-daySequence-text-today: #FFFFFF;
|
|
1003
|
+
--cmp-calendarBoard-daySequence-text-otherMonth: #AAAAAA;
|
|
1004
|
+
--cmp-calendarBoard-dayCard-minWidth: 100px;
|
|
1005
|
+
--cmp-calendarBoard-dayCard-minHeight: 100px;
|
|
1006
|
+
--cmp-calendarBoard-dayCard-bg: #FFFFFF;
|
|
1007
|
+
--cmp-calendarBoard-dayCard-paddingX: 8px;
|
|
1008
|
+
--cmp-calendarBoard-dayCard-header-paddingTop: 8px;
|
|
1009
|
+
--cmp-calendarBoard-dayCard-header-paddingBottom: 6px;
|
|
1010
|
+
--cmp-calendarBoard-dayCard-grid-paddingBottom: 8px;
|
|
1011
|
+
--cmp-calendarBoard-dayCard-grid-gap: 4px;
|
|
1012
|
+
--cmp-calendarBoard-dayCard-focus-border-width: 2px;
|
|
1013
|
+
--cmp-calendarBoard-dayCard-focus-border-color: #93C4FF;
|
|
1014
|
+
--cmp-calendarBoard-dayCard-focus-border-radius: 2px;
|
|
1015
|
+
--cmp-calendarBoard-item-height: 20px;
|
|
1016
|
+
--cmp-calendarBoard-item-paddingX: 8px;
|
|
1017
|
+
--cmp-calendarBoard-item-radius: 6px;
|
|
1018
|
+
--cmp-calendarBoard-moreButton-gap: 4px;
|
|
1019
|
+
--cmp-calendarBoard-moreButton-bg: #FFFFFF;
|
|
1020
|
+
--cmp-calendarBoard-moreButton-count-color: #004290;
|
|
1021
|
+
--cmp-calendarBoard-moreButton-label-color: #222222;
|
|
1022
|
+
--cmp-calendarBoard-moreButton-hover-overlay-color: #555555;
|
|
1023
|
+
--cmp-calendarBoard-moreButton-hover-overlay-opacity: 8%;
|
|
1024
|
+
--cmp-calendarBoard-eventButton-inline-gap: 8px;
|
|
1025
|
+
--cmp-calendarBoard-eventButton-label-gap: 4px;
|
|
1026
|
+
--cmp-calendarBoard-eventButton-bg-default: #E6F1FF;
|
|
1027
|
+
--cmp-calendarBoard-eventButton-bg-blue: #D9EAFF;
|
|
1028
|
+
--cmp-calendarBoard-eventButton-bg-oceanBlue: #D9F2FD;
|
|
1029
|
+
--cmp-calendarBoard-eventButton-bg-lightBlue: #EAF5FE;
|
|
1030
|
+
--cmp-calendarBoard-eventButton-bg-green: #E8F9EF;
|
|
1031
|
+
--cmp-calendarBoard-eventButton-bg-yellow: #FEF1C4;
|
|
1032
|
+
--cmp-calendarBoard-eventButton-bg-orange: #FFEAD7;
|
|
1033
|
+
--cmp-calendarBoard-eventButton-bg-red: #FCE6E6;
|
|
1034
|
+
--cmp-calendarBoard-eventButton-bg-white: #FFFFFF;
|
|
1035
|
+
--cmp-calendarBoard-eventButton-text-color-default: #222222;
|
|
1036
|
+
--cmp-calendarBoard-eventButton-text-color-separator: #AAAAAA;
|
|
1037
|
+
--cmp-calendarBoard-eventButton-hover-overlay-color: #555555;
|
|
1038
|
+
--cmp-calendarBoard-eventButton-hover-overlay-opacity: 8%;
|
|
1039
|
+
--cmp-calendarBoard-dayEvent-width: 280px;
|
|
1040
|
+
--cmp-calendarBoard-dayEvent-minWidth: 280px;
|
|
1041
|
+
--cmp-calendarBoard-dayEvent-minHeight: 200px;
|
|
1042
|
+
--cmp-calendarBoard-dayEvent-maxHeight: 312px;
|
|
1043
|
+
--cmp-calendarBoard-dayEvent-header-paddingX: 20px;
|
|
1044
|
+
--cmp-calendarBoard-dayEvent-header-paddingY: 12px;
|
|
1045
|
+
--cmp-calendarBoard-dayEvent-header-gap: 4px;
|
|
1046
|
+
--cmp-calendarBoard-dayEvent-body-paddingX: 12px;
|
|
1047
|
+
--cmp-calendarBoard-dayEvent-body-paddingBottom: 20px;
|
|
1048
|
+
--cmp-calendarBoard-dayEvent-body-gap: 8px;
|
|
957
1049
|
--cmp-tag-xs-height: 20px;
|
|
958
1050
|
--cmp-tag-xs-paddingX: 8px;
|
|
959
1051
|
--cmp-tag-xs-gap: 4px;
|
|
@@ -971,20 +1063,30 @@
|
|
|
971
1063
|
--cmp-tag-md-radius: 8px;
|
|
972
1064
|
--cmp-tag-red-content: #FB4444;
|
|
973
1065
|
--cmp-tag-red-bg: #FCEFEF;
|
|
1066
|
+
--cmp-tag-red-deep-bg: #FB4444;
|
|
974
1067
|
--cmp-tag-orange-content: #FF6B00;
|
|
975
1068
|
--cmp-tag-orange-bg: #FEF1EA;
|
|
1069
|
+
--cmp-tag-orange-deep-bg: #FF6B00;
|
|
976
1070
|
--cmp-tag-yellow-content: #916C0D;
|
|
977
1071
|
--cmp-tag-yellow-bg: #FFF7DD;
|
|
1072
|
+
--cmp-tag-yellow-deep-bg: #FFC700;
|
|
1073
|
+
--cmp-tag-yellow-deep-content: #222222;
|
|
978
1074
|
--cmp-tag-green-content: #00973C;
|
|
979
1075
|
--cmp-tag-green-bg: #E8F9EF;
|
|
1076
|
+
--cmp-tag-green-deep-bg: #00973C;
|
|
980
1077
|
--cmp-tag-blue-content: #0075FF;
|
|
981
1078
|
--cmp-tag-blue-bg: #E6F1FF;
|
|
1079
|
+
--cmp-tag-blue-deep-bg: #0075FF;
|
|
982
1080
|
--cmp-tag-darkblue-content: #006AC1;
|
|
983
1081
|
--cmp-tag-darkblue-bg: #EAF5FE;
|
|
1082
|
+
--cmp-tag-darkblue-deep-bg: #006AC1;
|
|
984
1083
|
--cmp-tag-indigo-content: #004290;
|
|
985
1084
|
--cmp-tag-indigo-bg: #EFF6FF;
|
|
1085
|
+
--cmp-tag-indigo-deep-bg: #004290;
|
|
986
1086
|
--cmp-tag-grey-content: #737373;
|
|
987
1087
|
--cmp-tag-grey-bg: #EEEEEE;
|
|
1088
|
+
--cmp-tag-grey-deep-bg: #737373;
|
|
1089
|
+
--cmp-tag-deep-content: #FFFFFF;
|
|
988
1090
|
--cmp-tag-group-gap: 8px;
|
|
989
1091
|
--cmp-badge-size: 6px;
|
|
990
1092
|
--cmp-badge-radius: 9999px;
|
|
@@ -1149,8 +1251,10 @@
|
|
|
1149
1251
|
--cmp-guide-contents-typography-color: #222222;
|
|
1150
1252
|
--cmp-guide-contents-icon: #00973C;
|
|
1151
1253
|
--cmp-guide-contents-radius: 8px;
|
|
1152
|
-
--cmp-guide-contents-depth-paddingLeft:
|
|
1153
|
-
--cmp-progress-linear-height:
|
|
1254
|
+
--cmp-guide-contents-depth-paddingLeft: 24px;
|
|
1255
|
+
--cmp-progress-linear-height-xs: 12px;
|
|
1256
|
+
--cmp-progress-linear-height-sm: 20px;
|
|
1257
|
+
--cmp-progress-linear-height-md: 24px;
|
|
1154
1258
|
--cmp-progress-linear-radius: 9999px;
|
|
1155
1259
|
--cmp-progress-linear-gap: 12px;
|
|
1156
1260
|
--cmp-progress-circular-size: 80px;
|
|
@@ -1238,10 +1342,8 @@
|
|
|
1238
1342
|
--cmp-stepper-vertical-title-paddingTop: 12px;
|
|
1239
1343
|
--cmp-stepper-vertical-title-paddingBottom: 6px;
|
|
1240
1344
|
--cmp-stepper-vertical-title-text: #004290;
|
|
1241
|
-
--cmp-tab-main-
|
|
1242
|
-
--cmp-tab-main-
|
|
1243
|
-
--cmp-tab-main-md-height: 36px;
|
|
1244
|
-
--cmp-tab-main-md-paddingX: 24px;
|
|
1345
|
+
--cmp-tab-main-height: 36px;
|
|
1346
|
+
--cmp-tab-main-paddingX: 24px;
|
|
1245
1347
|
--cmp-tab-main-gap: 8px;
|
|
1246
1348
|
--cmp-tab-main-container-gap: 4px;
|
|
1247
1349
|
--cmp-tab-main-radius: 6px;
|
|
@@ -1310,6 +1412,86 @@
|
|
|
1310
1412
|
--cmp-gnb-rail-item-radius: 8px;
|
|
1311
1413
|
--cmp-gnb-rail-item-icon: 24px;
|
|
1312
1414
|
--cmp-gnb-rail-item-width: 44px;
|
|
1415
|
+
--cmp-gnb-system-panel-light-bg: #FFFFFF;
|
|
1416
|
+
--cmp-gnb-system-panel-light-border: #E1E1E1;
|
|
1417
|
+
--cmp-gnb-system-panel-dark-bg: #004177;
|
|
1418
|
+
--cmp-gnb-system-panel-dark-border: #006AC1;
|
|
1419
|
+
--cmp-gnb-system-panel-gap: 8px;
|
|
1420
|
+
--cmp-gnb-system-panel-divider-color-light: #E1E1E1;
|
|
1421
|
+
--cmp-gnb-system-panel-divider-color-dark: #006AC1;
|
|
1422
|
+
--cmp-gnb-system-panel-divider-color-darker: #004290;
|
|
1423
|
+
--cmp-gnb-system-domainTag-paddingX: 12px;
|
|
1424
|
+
--cmp-gnb-system-domainTag-paddingY: 2px;
|
|
1425
|
+
--cmp-gnb-system-domainTag-radius: 6px;
|
|
1426
|
+
--cmp-gnb-system-domainTag-light-bg: #F6F6F6;
|
|
1427
|
+
--cmp-gnb-system-domainTag-light-text: #555555;
|
|
1428
|
+
--cmp-gnb-system-domainTag-dark-bg: #07284A;
|
|
1429
|
+
--cmp-gnb-system-domainTag-dark-text: #FFFFFF;
|
|
1430
|
+
--cmp-gnb-system-domainTag-darker-bg: #004177;
|
|
1431
|
+
--cmp-gnb-system-domainTag-darker-text: #FFFFFF;
|
|
1432
|
+
--cmp-gnb-system-item-height: 32px;
|
|
1433
|
+
--cmp-gnb-system-item-radius: 8px;
|
|
1434
|
+
--cmp-gnb-system-item-icon-frame: 24px;
|
|
1435
|
+
--cmp-gnb-system-item-icon-glyph: 20px;
|
|
1436
|
+
--cmp-gnb-system-item-icon-radius: 4px;
|
|
1437
|
+
--cmp-gnb-system-item-iconLabelGap: 8px;
|
|
1438
|
+
--cmp-gnb-system-item-light-bg-default: #FFFFFF;
|
|
1439
|
+
--cmp-gnb-system-item-light-bg-hover: #F6F6F6;
|
|
1440
|
+
--cmp-gnb-system-item-light-icon-bg: #FFFFFF;
|
|
1441
|
+
--cmp-gnb-system-item-light-icon-default: #888888;
|
|
1442
|
+
--cmp-gnb-system-item-light-text: #222222;
|
|
1443
|
+
--cmp-gnb-system-item-dark-bg-default: #004177;
|
|
1444
|
+
--cmp-gnb-system-item-dark-bg-hover: #025497;
|
|
1445
|
+
--cmp-gnb-system-item-dark-icon-bg-default: #004177;
|
|
1446
|
+
--cmp-gnb-system-item-dark-icon-bg-hover: #FFFFFF;
|
|
1447
|
+
--cmp-gnb-system-item-dark-text: #FFFFFF;
|
|
1448
|
+
--cmp-gnb-system-item-darker-bg-default: #001B39;
|
|
1449
|
+
--cmp-gnb-system-item-darker-bg-hover: #002B5E;
|
|
1450
|
+
--cmp-gnb-system-item-darker-icon-bg-default: #001B39;
|
|
1451
|
+
--cmp-gnb-system-item-darker-icon-bg-hover: #FFFFFF;
|
|
1452
|
+
--cmp-gnb-system-item-darker-text: #FFFFFF;
|
|
1453
|
+
--cmp-gnb-system-actionButton-paddingLeft: 4px;
|
|
1454
|
+
--cmp-gnb-system-actionButton-paddingRight: 6px;
|
|
1455
|
+
--cmp-gnb-system-actionButton-selectData-gap: 4px;
|
|
1456
|
+
--cmp-gnb-system-actionButton-selectData-icon: 16px;
|
|
1457
|
+
--cmp-gnb-system-actionButton-selectData-text-light: #005CC9;
|
|
1458
|
+
--cmp-gnb-system-actionButton-selectData-text-dark: #BBDAFF;
|
|
1459
|
+
--cmp-gnb-system-actionButton-switch-icon: 16px;
|
|
1460
|
+
--cmp-gnb-system-actionButton-switch-text-light: #555555;
|
|
1461
|
+
--cmp-gnb-system-actionButton-switch-text-dark: #FFFFFF;
|
|
1462
|
+
--cmp-gnb-system-actionButton-select-icon: 16px;
|
|
1463
|
+
--cmp-gnb-system-accountButton-paddingY: 4px;
|
|
1464
|
+
--cmp-gnb-system-accountButton-paddingX: 12px;
|
|
1465
|
+
--cmp-gnb-system-accountButton-gap: 8px;
|
|
1466
|
+
--cmp-gnb-system-accountButton-icon: 16px;
|
|
1467
|
+
--cmp-gnb-system-accountButton-bg-default: #FFFFFF;
|
|
1468
|
+
--cmp-gnb-system-accountButton-bg-hover: #F6F6F6;
|
|
1469
|
+
--cmp-gnb-system-accountButton-bg-negativeHover: #FCEFEF;
|
|
1470
|
+
--cmp-gnb-system-accountButton-content-default: #222222;
|
|
1471
|
+
--cmp-gnb-system-accountButton-content-negative: #E30000;
|
|
1472
|
+
--cmp-gnb-system-accountButton-selectData-gap: 4px;
|
|
1473
|
+
--cmp-gnb-system-accountButton-selectData-icon: 16px;
|
|
1474
|
+
--cmp-gnb-system-accountButton-selectData-text: #005CC9;
|
|
1475
|
+
--cmp-gnb-system-accountListBox-width: 240px;
|
|
1476
|
+
--cmp-gnb-system-accountListBox-bg: #FFFFFF;
|
|
1477
|
+
--cmp-gnb-system-accountListBox-radius: 4px;
|
|
1478
|
+
--cmp-gnb-system-accountListBox-userdata-bg: #F9F9F9;
|
|
1479
|
+
--cmp-gnb-system-accountListBox-userdata-paddingX: 12px;
|
|
1480
|
+
--cmp-gnb-system-accountListBox-userdata-paddingY: 8px;
|
|
1481
|
+
--cmp-gnb-system-accountListBox-userdata-email-color: #888888;
|
|
1482
|
+
--cmp-gnb-system-accountListBox-userdata-name-color: #555555;
|
|
1483
|
+
--cmp-gnb-system-accountListBox-userdata-role-color: #888888;
|
|
1484
|
+
--cmp-gnb-system-accountListBox-list-paddingY: 4px;
|
|
1485
|
+
--cmp-gnb-system-alertButton-paddingX: 4px;
|
|
1486
|
+
--cmp-gnb-system-alertButton-count-color-light: #0075FF;
|
|
1487
|
+
--cmp-gnb-system-alertButton-count-color-dark: #FFD643;
|
|
1488
|
+
--cmp-gnb-system-alertButton-bg-notificationHover-light: #EFF6FF;
|
|
1489
|
+
--cmp-gnb-system-alertButton-icon-color-notification-light: #64ABFF;
|
|
1490
|
+
--cmp-gnb-system-alertButton-icon-color-notification-dark: #FEE17C;
|
|
1491
|
+
--cmp-gnb-system-setting-paddingX: 4px;
|
|
1492
|
+
--cmp-gnb-system-min-padding: 8px;
|
|
1493
|
+
--cmp-gnb-system-project-gap: 8px;
|
|
1494
|
+
--cmp-gnb-system-project-padding: 8px;
|
|
1313
1495
|
--cmp-list-group-gap: 8px;
|
|
1314
1496
|
--cmp-list-group-padding: 16px;
|
|
1315
1497
|
--cmp-listItem-paddingX: 16px;
|
|
@@ -1362,7 +1544,6 @@
|
|
|
1362
1544
|
--cmp-listDraggableItem-bordered-border-hover: #AAAAAA;
|
|
1363
1545
|
--cmp-listDraggableItem-bordered-dragging-bg: #EFF6FF;
|
|
1364
1546
|
--cmp-listDraggableItem-bordered-dragging-border-color: #2D8DFF;
|
|
1365
|
-
--cmp-listDraggableItem-bordered-dragging-border-width: 2px;
|
|
1366
1547
|
--cmp-listDraggableItem-border-default: #E1E1E1;
|
|
1367
1548
|
--cmp-listDraggableItem-border-width-default: 1px;
|
|
1368
1549
|
--cmp-listDraggableItem-text-default: #222222;
|
|
@@ -1397,9 +1578,8 @@
|
|
|
1397
1578
|
--cmp-tree-item-rowGap: 8px;
|
|
1398
1579
|
--cmp-tree-item-contentGap: 12px;
|
|
1399
1580
|
--cmp-tree-item-text-default: #222222;
|
|
1400
|
-
--cmp-tree-item-text-selected: #0075FF;
|
|
1401
1581
|
--cmp-tree-item-arrow-icon: 16px;
|
|
1402
|
-
--cmp-tree-connector-line-color: #
|
|
1582
|
+
--cmp-tree-connector-line-color: #E1E1E1;
|
|
1403
1583
|
--cmp-pageHeader-paddingX: 16px;
|
|
1404
1584
|
--cmp-pageHeader-gap: 12px;
|
|
1405
1585
|
--cmp-pageHeader-title-paddingLeft: 4px;
|
|
@@ -1559,6 +1739,12 @@
|
|
|
1559
1739
|
font-weight: 500;
|
|
1560
1740
|
line-height: 20px;
|
|
1561
1741
|
}
|
|
1742
|
+
.typo-body-sm-semibold {
|
|
1743
|
+
font-family: Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif;
|
|
1744
|
+
font-size: 12px;
|
|
1745
|
+
font-weight: 600;
|
|
1746
|
+
line-height: 20px;
|
|
1747
|
+
}
|
|
1562
1748
|
.typo-body-sm-bold {
|
|
1563
1749
|
font-family: Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif;
|
|
1564
1750
|
font-size: 12px;
|
|
@@ -1577,6 +1763,12 @@
|
|
|
1577
1763
|
font-weight: 500;
|
|
1578
1764
|
line-height: 24px;
|
|
1579
1765
|
}
|
|
1766
|
+
.typo-body-md-semibold {
|
|
1767
|
+
font-family: Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif;
|
|
1768
|
+
font-size: 14px;
|
|
1769
|
+
font-weight: 600;
|
|
1770
|
+
line-height: 24px;
|
|
1771
|
+
}
|
|
1580
1772
|
.typo-body-md-bold {
|
|
1581
1773
|
font-family: Pretendard Variable, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Segoe UI, Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, Apple Color Emoji, Segoe UI Emoji, sans-serif;
|
|
1582
1774
|
font-size: 14px;
|
package/eslint/index.mjs
CHANGED
|
@@ -11,6 +11,9 @@ import preferTypoPreset from "./rules/prefer-typo-preset.mjs";
|
|
|
11
11
|
import tableNumericAlign from "./rules/table-numeric-align.mjs";
|
|
12
12
|
import requireLocaleNumber from "./rules/require-locale-number.mjs";
|
|
13
13
|
import componentGroupGap from "./rules/component-group-gap.mjs";
|
|
14
|
+
import fieldWidthGrade from "./rules/field-width-grade.mjs";
|
|
15
|
+
import tableColumnWidth from "./rules/table-column-width.mjs";
|
|
16
|
+
import dividerVerticalHeight from "./rules/divider-vertical-height.mjs";
|
|
14
17
|
|
|
15
18
|
const PLUGIN_NAME = "sellmate";
|
|
16
19
|
|
|
@@ -24,6 +27,9 @@ const plugin = {
|
|
|
24
27
|
"table-numeric-align": tableNumericAlign,
|
|
25
28
|
"require-locale-number": requireLocaleNumber,
|
|
26
29
|
"component-group-gap": componentGroupGap,
|
|
30
|
+
"field-width-grade": fieldWidthGrade,
|
|
31
|
+
"table-column-width": tableColumnWidth,
|
|
32
|
+
"divider-vertical-height": dividerVerticalHeight,
|
|
27
33
|
},
|
|
28
34
|
};
|
|
29
35
|
|
|
@@ -48,12 +54,18 @@ const recommended = [
|
|
|
48
54
|
[`${PLUGIN_NAME}/no-off-scale-spacing`]: "error",
|
|
49
55
|
// 생 <button>/<table> 은 디자인 시스템을 통째로 우회하는 것 (스타일 자유와 무관)
|
|
50
56
|
[`${PLUGIN_NAME}/no-raw-html-control`]: "error",
|
|
57
|
+
// 세로 SDivider 에 className 으로 높이를 주면 self-stretch 가 무효가 되어 선이 위로 솟는다
|
|
58
|
+
[`${PLUGIN_NAME}/divider-vertical-height`]: "error",
|
|
51
59
|
|
|
52
60
|
// 아래는 디자인 컨벤션 — 권고만 한다
|
|
53
61
|
[`${PLUGIN_NAME}/prefer-typo-preset`]: "warn",
|
|
54
62
|
[`${PLUGIN_NAME}/component-group-gap`]: "warn",
|
|
55
63
|
[`${PLUGIN_NAME}/table-numeric-align`]: "warn",
|
|
56
64
|
[`${PLUGIN_NAME}/require-locale-number`]: "warn",
|
|
65
|
+
// 폭 등급 환산이 아직 잠정치라 권고에 둔다 (디자인 확정표가 오면 error 승격 검토)
|
|
66
|
+
[`${PLUGIN_NAME}/field-width-grade`]: "warn",
|
|
67
|
+
// 컬럼 폭 — 폭 미지정(기본 120px)·스페이서 오용은 권고, % · clamp() 는 조용히 깨지므로 error
|
|
68
|
+
[`${PLUGIN_NAME}/table-column-width`]: "warn",
|
|
57
69
|
|
|
58
70
|
// 앱 고유 치수(w-[280px])·일회성 값에는 임의 값이 정당하다. 필요한 팀만 켠다.
|
|
59
71
|
[`${PLUGIN_NAME}/no-arbitrary-class`]: "off",
|
|
@@ -79,6 +91,8 @@ const strict = [
|
|
|
79
91
|
[`${PLUGIN_NAME}/component-group-gap`]: "error",
|
|
80
92
|
[`${PLUGIN_NAME}/table-numeric-align`]: "error",
|
|
81
93
|
[`${PLUGIN_NAME}/require-locale-number`]: "error",
|
|
94
|
+
[`${PLUGIN_NAME}/field-width-grade`]: "error",
|
|
95
|
+
[`${PLUGIN_NAME}/table-column-width`]: "error",
|
|
82
96
|
},
|
|
83
97
|
},
|
|
84
98
|
];
|
|
@@ -73,6 +73,32 @@ export function literalString(node) {
|
|
|
73
73
|
: undefined;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/**
|
|
77
|
+
* STableColumn 자리인지 — `asColumn` 보다 넓게, 값을 그리지 않는 스페이서 열까지 본다.
|
|
78
|
+
*
|
|
79
|
+
* `name` · `label` 만으로는 판정하지 않는다. 소비 앱의 검색 필터 필드·상세 모달 키-값 필드가
|
|
80
|
+
* 정확히 같은 모양(`{ name, label, type, ... }`)이라, 그것만 보면 잡히는 것의 대부분이 표와
|
|
81
|
+
* 무관한 객체가 된다 — 실측에서 265건 중 261건이 오탐이었다.
|
|
82
|
+
*
|
|
83
|
+
* 그래서 `STableColumn` 타입의 판별 유니온을 그대로 옮긴다 — 값을 그리는 열은 `field` 를,
|
|
84
|
+
* 값을 그리지 않는 스페이서 열은 `autoWidth` 를 반드시 갖는다. 둘 다 없으면 컬럼이 아니다.
|
|
85
|
+
* 폭 규칙이 봐야 하는 스페이서 열은 `autoWidth` 쪽으로 그대로 들어온다.
|
|
86
|
+
*
|
|
87
|
+
* 놓치는 것: `{ ...base, name, label }` 처럼 `field` 가 스프레드로 들어오는 컬럼. 정적으로는
|
|
88
|
+
* 검색 필터 필드와 구분되지 않아 보고하지 않는다 (`asColumn` 을 쓰는 다른 두 규칙과 같은 한계).
|
|
89
|
+
* @returns {{ nameProp, labelProp, columnName: string | undefined } | null}
|
|
90
|
+
*/
|
|
91
|
+
export function asColumnShape(node) {
|
|
92
|
+
const nameProp = prop(node, "name");
|
|
93
|
+
const labelProp = prop(node, "label");
|
|
94
|
+
if (!nameProp || !labelProp) return null;
|
|
95
|
+
if (!prop(node, "field") && !prop(node, "autoWidth")) return null;
|
|
96
|
+
// name 이 문자열 리터럴이 아니면 컬럼 정의로 단정하지 않는다 (일반 객체 오탐 방지)
|
|
97
|
+
const columnName = literalString(nameProp);
|
|
98
|
+
if (columnName === undefined) return null;
|
|
99
|
+
return { nameProp, labelProp, columnName };
|
|
100
|
+
}
|
|
101
|
+
|
|
76
102
|
/**
|
|
77
103
|
* STableColumn 형태인지 — name·label·field 셋을 모두 가진 객체만 컬럼으로 본다.
|
|
78
104
|
* @returns {{ nameProp, labelProp, label: string } | null}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 세로 `SDivider` 의 높이를 `className="h-*"` 로 주면 정렬이 조용히 깨지는 것을 잡는다.
|
|
3
|
+
*
|
|
4
|
+
* 세로 분할선의 기본값은 `h-auto ... self-stretch` 라, 높이를 주지 않으면 부모 줄 높이를
|
|
5
|
+
* 그대로 채운다. 그런데 `align-self: stretch` 는 **교차축 크기가 auto 일 때만** 늘리므로
|
|
6
|
+
* className 으로 높이가 정해지는 순간 stretch 가 무효가 되고 flex-start 처럼 줄 맨 위에
|
|
7
|
+
* 붙는다. tailwind-merge 는 `h-auto` 만 교체하고 `self-stretch` 는 남기므로 경고도 없다.
|
|
8
|
+
*
|
|
9
|
+
* 높이와 정렬은 같이 정해져야 하는 값이라 컴포넌트가 함께 맡는다 — `height` prop 을 쓴다.
|
|
10
|
+
*
|
|
11
|
+
* <SDivider vertical height={20} /> // 높이 + self-center
|
|
12
|
+
* <SDivider vertical className="h-sd-20" /> // 위로 솟는다
|
|
13
|
+
*
|
|
14
|
+
* 정렬을 **직접 지정한 경우**(`self-center` `self-start` `my-auto` …)는 알고 쓰는 것으로
|
|
15
|
+
* 보고 잡지 않는다.
|
|
16
|
+
*
|
|
17
|
+
* AGENTS.md §3-6.
|
|
18
|
+
*/
|
|
19
|
+
import { collectClassTokens, stripVariants, stripModifiers } from "../lib/class-names.mjs";
|
|
20
|
+
|
|
21
|
+
/** 높이를 정하는 유틸리티인가 — `h-auto` 만 예외(기본값과 같아 stretch 가 살아 있다) */
|
|
22
|
+
function heightUtil(util) {
|
|
23
|
+
const m = /^h-(.+)$/.exec(util);
|
|
24
|
+
if (!m || m[1] === "auto") return null;
|
|
25
|
+
return m[1];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** 교차축 정렬을 이미 직접 지정했는가 */
|
|
29
|
+
function alignsSelf(util) {
|
|
30
|
+
return /^self-/.test(util) || util === "my-auto" || util === "mt-auto" || util === "mb-auto";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 높이 유틸리티 값을 `height` prop 값으로 옮긴다. 옮길 수 없으면 null (수정 제안 없음).
|
|
35
|
+
* h-sd-20 → {20}
|
|
36
|
+
* h-[20px] → {20}
|
|
37
|
+
* h-[var(--x)] → "var(--x)"
|
|
38
|
+
*/
|
|
39
|
+
function toHeightProp(value) {
|
|
40
|
+
const scaled = /^sd-(\d+)$/.exec(value);
|
|
41
|
+
if (scaled) return `{${scaled[1]}}`;
|
|
42
|
+
const arbitrary = /^\[(.+)\]$/.exec(value);
|
|
43
|
+
if (!arbitrary) return null;
|
|
44
|
+
const inner = arbitrary[1].replace(/_/g, " ");
|
|
45
|
+
const px = /^(\d+(?:\.\d+)?)px$/.exec(inner);
|
|
46
|
+
if (px) return `{${px[1]}}`;
|
|
47
|
+
if (inner.includes('"')) return null;
|
|
48
|
+
return `"${inner}"`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const isClassAttr = (a) =>
|
|
52
|
+
a.type === "JSXAttribute" && (a.name?.name === "className" || a.name?.name === "class");
|
|
53
|
+
|
|
54
|
+
export default {
|
|
55
|
+
meta: {
|
|
56
|
+
type: "problem",
|
|
57
|
+
docs: {
|
|
58
|
+
description: "세로 SDivider 의 높이는 className 이 아니라 height prop 으로 지정",
|
|
59
|
+
},
|
|
60
|
+
schema: [],
|
|
61
|
+
messages: {
|
|
62
|
+
useHeightProp:
|
|
63
|
+
"세로 SDivider 의 높이는 `height` prop 으로 주세요{{suggestion}} — `className` 으로 주면 `align-self: stretch` 가 무효가 되어 선이 줄 맨 위에 붙습니다. (AGENTS.md §3-6)",
|
|
64
|
+
},
|
|
65
|
+
fixable: "code",
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
create(context) {
|
|
69
|
+
return {
|
|
70
|
+
JSXOpeningElement(node) {
|
|
71
|
+
if (node.name.type !== "JSXIdentifier" || node.name.name !== "SDivider") return;
|
|
72
|
+
|
|
73
|
+
const attrs = node.attributes;
|
|
74
|
+
const named = (n) => attrs.find((a) => a.type === "JSXAttribute" && a.name?.name === n);
|
|
75
|
+
|
|
76
|
+
// 세로 분할선만 대상. `vertical={expr}` 처럼 값이 정적이지 않으면 판단하지 않는다.
|
|
77
|
+
const vertical = named("vertical");
|
|
78
|
+
if (!vertical) return;
|
|
79
|
+
if (vertical.value !== null && vertical.value?.expression?.value !== true) return;
|
|
80
|
+
|
|
81
|
+
// 이미 height prop 을 쓰고 있으면 컴포넌트가 정렬까지 맡는다
|
|
82
|
+
if (named("height")) return;
|
|
83
|
+
|
|
84
|
+
const classAttr = attrs.find(isClassAttr);
|
|
85
|
+
if (!classAttr) return;
|
|
86
|
+
|
|
87
|
+
const tokens = collectClassTokens(classAttr);
|
|
88
|
+
let height = null;
|
|
89
|
+
for (const { token } of tokens) {
|
|
90
|
+
const util = stripModifiers(stripVariants(token));
|
|
91
|
+
if (alignsSelf(util)) return; // 정렬을 직접 정했다 — 의도한 것으로 본다
|
|
92
|
+
// variant 가 붙은 높이(`md:h-sd-20`)는 prop 으로 옮길 수 없어 판단에서 뺀다
|
|
93
|
+
if (height === null && token === util) height = heightUtil(util);
|
|
94
|
+
}
|
|
95
|
+
if (height === null) return;
|
|
96
|
+
|
|
97
|
+
const propValue = toHeightProp(height);
|
|
98
|
+
|
|
99
|
+
context.report({
|
|
100
|
+
node,
|
|
101
|
+
messageId: "useHeightProp",
|
|
102
|
+
data: { suggestion: propValue ? ` (\`height=${propValue}\`)` : "" },
|
|
103
|
+
fix(fixer) {
|
|
104
|
+
if (!propValue) return null;
|
|
105
|
+
// className 이 통짜 문자열일 때만 안전하게 손댄다 (cn()·템플릿 리터럴은 제외)
|
|
106
|
+
const raw =
|
|
107
|
+
classAttr.value?.type === "Literal"
|
|
108
|
+
? classAttr.value
|
|
109
|
+
: classAttr.value?.type === "JSXExpressionContainer" &&
|
|
110
|
+
classAttr.value.expression.type === "Literal"
|
|
111
|
+
? classAttr.value.expression
|
|
112
|
+
: null;
|
|
113
|
+
if (!raw || typeof raw.value !== "string") return null;
|
|
114
|
+
|
|
115
|
+
const rest = raw.value
|
|
116
|
+
.split(/\s+/)
|
|
117
|
+
.filter(Boolean)
|
|
118
|
+
.filter((t) => t !== `h-${height}`);
|
|
119
|
+
if (rest.length === raw.value.split(/\s+/).filter(Boolean).length) return null;
|
|
120
|
+
|
|
121
|
+
const fixes = [fixer.insertTextAfter(vertical, ` height=${propValue}`)];
|
|
122
|
+
if (rest.length > 0) {
|
|
123
|
+
fixes.push(fixer.replaceText(raw, `"${rest.join(" ")}"`));
|
|
124
|
+
} else {
|
|
125
|
+
// 속성만 지우면 공백이 두 칸 남는다 — 앞 공백까지 함께 지운다
|
|
126
|
+
const src = context.sourceCode ?? context.getSourceCode();
|
|
127
|
+
const [start, end] = classAttr.range;
|
|
128
|
+
const from = /\s/.test(src.text[start - 1]) ? start - 1 : start;
|
|
129
|
+
fixes.push(fixer.removeRange([from, end]));
|
|
130
|
+
}
|
|
131
|
+
return fixes;
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
},
|
|
137
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* playground 의 실측 페이지(FieldWidthGradePage)가 규칙과 같은 계산을 쓰기 위한 타입 선언.
|
|
3
|
+
* 규칙 본체는 소비 앱이 그대로 실행하는 plain ESM 이라 .mjs 로 두고, 타입만 여기에 붙인다.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type FieldGrade = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
7
|
+
export type FieldSize = 'sm' | 'md';
|
|
8
|
+
|
|
9
|
+
export interface FieldComponentSpec {
|
|
10
|
+
/** 스키마 상한을 담는 prop — 숫자 필드는 maxLength 가 아니라 max 다 */
|
|
11
|
+
lengthProp: 'maxLength' | 'max';
|
|
12
|
+
font: Record<FieldSize, number>;
|
|
13
|
+
/** 글자가 쓸 수 없는 폭의 합 (좌우 패딩 · 테두리 · 스테퍼) */
|
|
14
|
+
chrome: Record<FieldSize, number>;
|
|
15
|
+
/** 한글이 들어갈 수 있는가 */
|
|
16
|
+
korean: boolean;
|
|
17
|
+
grades: FieldGrade[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export declare const GRADES: Record<FieldGrade, number>;
|
|
21
|
+
export declare const CHAR_RATIO: { narrow: number; wide: number };
|
|
22
|
+
export declare const COMPONENTS: Record<string, FieldComponentSpec>;
|
|
23
|
+
|
|
24
|
+
export declare function capacity(
|
|
25
|
+
spec: FieldComponentSpec,
|
|
26
|
+
size: FieldSize,
|
|
27
|
+
grade: FieldGrade,
|
|
28
|
+
ratio: number,
|
|
29
|
+
grades?: Record<FieldGrade, number>,
|
|
30
|
+
): number;
|
|
31
|
+
|
|
32
|
+
export declare function smallestGradeFor(
|
|
33
|
+
spec: FieldComponentSpec,
|
|
34
|
+
size: FieldSize,
|
|
35
|
+
len: number,
|
|
36
|
+
ratio: number,
|
|
37
|
+
grades?: Record<FieldGrade, number>,
|
|
38
|
+
): FieldGrade | undefined;
|
|
39
|
+
|
|
40
|
+
declare const rule: unknown;
|
|
41
|
+
export default rule;
|