sellmate-design-system-react 2.2.0 → 3.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.
Files changed (113) hide show
  1. package/AGENTS.md +661 -0
  2. package/README.md +85 -0
  3. package/dist/components/SActionModal/README.md +41 -0
  4. package/dist/components/SBadge/README.md +25 -0
  5. package/dist/components/SBarcodeInput/README.md +64 -0
  6. package/dist/components/SButton/README.md +49 -0
  7. package/dist/components/SCalendar/README.md +42 -0
  8. package/dist/components/SCallout/README.md +29 -0
  9. package/dist/components/SCallout/SCallout.cjs +76 -1
  10. package/dist/components/SCallout/SCallout.cjs.map +1 -1
  11. package/dist/components/SCallout/SCallout.d.ts +6 -2
  12. package/dist/components/SCallout/SCallout.js +76 -1
  13. package/dist/components/SCallout/SCallout.js.map +1 -1
  14. package/dist/components/SCard/README.md +12 -0
  15. package/dist/components/SCheckbox/README.md +44 -0
  16. package/dist/components/SChip/README.md +57 -0
  17. package/dist/components/SChipInput/README.md +77 -0
  18. package/dist/components/SCircleProgress/README.md +35 -0
  19. package/dist/components/SConfirmModal/README.md +61 -0
  20. package/dist/components/SDatePicker/README.md +62 -0
  21. package/dist/components/SDateRangePicker/README.md +64 -0
  22. package/dist/components/SDivider/README.md +25 -0
  23. package/dist/components/SDraggableItem/README.md +40 -0
  24. package/dist/components/SDraggableItem/SDraggableItem.cjs +3079 -0
  25. package/dist/components/SDraggableItem/SDraggableItem.cjs.map +1 -0
  26. package/dist/components/SDraggableItem/SDraggableItem.d.ts +33 -0
  27. package/dist/components/SDraggableItem/SDraggableItem.js +3077 -0
  28. package/dist/components/SDraggableItem/SDraggableItem.js.map +1 -0
  29. package/dist/components/SDraggableItem/index.d.ts +1 -0
  30. package/dist/components/SDropdownButton/README.md +50 -0
  31. package/dist/components/SExpansionItem/README.md +40 -0
  32. package/dist/components/SExpansionItem/SExpansionItem.cjs +6 -15
  33. package/dist/components/SExpansionItem/SExpansionItem.cjs.map +1 -1
  34. package/dist/components/SExpansionItem/SExpansionItem.js +6 -15
  35. package/dist/components/SExpansionItem/SExpansionItem.js.map +1 -1
  36. package/dist/components/SField/README.md +91 -0
  37. package/dist/components/SFilePicker/README.md +72 -0
  38. package/dist/components/SForm/README.md +31 -0
  39. package/dist/components/SGhostButton/README.md +76 -0
  40. package/dist/components/SGnb/README.md +56 -0
  41. package/dist/components/SGuide/README.md +34 -0
  42. package/dist/components/SIcon/README.md +91 -0
  43. package/dist/components/SInput/README.md +66 -0
  44. package/dist/components/SKeyValueTable/README.md +59 -0
  45. package/dist/components/SLayout/README.md +42 -0
  46. package/dist/components/SLinearProgress/README.md +17 -0
  47. package/dist/components/SList/README.md +14 -0
  48. package/dist/components/SList/SList.cjs +38 -0
  49. package/dist/components/SList/SList.cjs.map +1 -0
  50. package/dist/components/SList/SList.d.ts +10 -0
  51. package/dist/components/SList/SList.js +36 -0
  52. package/dist/components/SList/SList.js.map +1 -0
  53. package/dist/components/SList/index.d.ts +1 -0
  54. package/dist/components/SListItem/README.md +19 -0
  55. package/dist/components/SListItem/SListItem.cjs +83 -0
  56. package/dist/components/SListItem/SListItem.cjs.map +1 -0
  57. package/dist/components/SListItem/SListItem.d.ts +26 -0
  58. package/dist/components/SListItem/SListItem.js +81 -0
  59. package/dist/components/SListItem/SListItem.js.map +1 -0
  60. package/dist/components/SListItem/index.d.ts +1 -0
  61. package/dist/components/SLoadingContainer/README.md +29 -0
  62. package/dist/components/SLoadingModal/README.md +52 -0
  63. package/dist/components/SModal/README.md +192 -0
  64. package/dist/components/SModalContainer/README.md +49 -0
  65. package/dist/components/SNumberInput/README.md +74 -0
  66. package/dist/components/SPage/README.md +25 -0
  67. package/dist/components/SPagination/README.md +40 -0
  68. package/dist/components/SPopover/README.md +54 -0
  69. package/dist/components/SPopup/README.md +38 -0
  70. package/dist/components/SPortal/README.md +51 -0
  71. package/dist/components/SRadio/README.md +57 -0
  72. package/dist/components/SRadioButton/README.md +24 -0
  73. package/dist/components/SScrollArea/README.md +16 -0
  74. package/dist/components/SSectionHeaderCard/README.md +51 -0
  75. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs +3414 -0
  76. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs.map +1 -0
  77. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +32 -0
  78. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js +3392 -0
  79. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js.map +1 -0
  80. package/dist/components/SSectionHeaderCard/index.d.ts +1 -0
  81. package/dist/components/SSelect/README.md +79 -0
  82. package/dist/components/SStepper/README.md +30 -0
  83. package/dist/components/SSwitch/README.md +24 -0
  84. package/dist/components/STable/README.md +82 -0
  85. package/dist/components/STableBar/README.md +28 -0
  86. package/dist/components/STabs/README.md +37 -0
  87. package/dist/components/STag/README.md +44 -0
  88. package/dist/components/STextLink/README.md +48 -0
  89. package/dist/components/STextarea/README.md +60 -0
  90. package/dist/components/STimePicker/README.md +65 -0
  91. package/dist/components/STimeRangePicker/README.md +63 -0
  92. package/dist/components/SToast/README.md +70 -0
  93. package/dist/components/SToggle/README.md +22 -0
  94. package/dist/components/STooltip/README.md +57 -0
  95. package/dist/index.cjs +815 -419
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.d.ts +4 -0
  98. package/dist/index.js +815 -423
  99. package/dist/index.js.map +1 -1
  100. package/dist/llms.txt +3496 -0
  101. package/dist/styles.css +545 -19
  102. package/dist/theme.css +22 -0
  103. package/eslint/index.mjs +66 -0
  104. package/eslint/lib/class-names.mjs +119 -0
  105. package/eslint/lib/table-column.mjs +53 -0
  106. package/eslint/rules/no-arbitrary-class.mjs +91 -0
  107. package/eslint/rules/no-off-scale-spacing.mjs +67 -0
  108. package/eslint/rules/no-raw-html-control.mjs +117 -0
  109. package/eslint/rules/prefer-typo-preset.mjs +73 -0
  110. package/eslint/rules/require-locale-number.mjs +78 -0
  111. package/eslint/rules/table-numeric-align.mjs +93 -0
  112. package/eslint/scale.gen.mjs +16 -0
  113. package/package.json +9 -4
@@ -0,0 +1,78 @@
1
+ /**
2
+ * 숫자 컬럼은 예외 없이 `toLocaleString()` 으로 세 자리 콤마를 넣도록 강제한다.
3
+ *
4
+ * 전화번호·사업자번호처럼 하이픈이 들어가는 값은 숫자가 아니라 서식이 정해진
5
+ * 문자열이므로 대상에서 뺀다. 그 밖에 예외가 필요하면 `allow` 로 컬럼을 지정한다.
6
+ *
7
+ * AGENTS.md §1-4 / §3-4.
8
+ */
9
+ import {
10
+ NUMERIC_LABEL,
11
+ IDENTIFIER_ONLY,
12
+ prop,
13
+ asColumn,
14
+ } from "../lib/table-column.mjs";
15
+
16
+ export default {
17
+ meta: {
18
+ type: "problem",
19
+ docs: {
20
+ description: "금액·수량 등 숫자 표시에 toLocaleString 사용",
21
+ },
22
+ schema: [
23
+ {
24
+ type: "object",
25
+ properties: {
26
+ /** 검사에서 뺄 컬럼 name */
27
+ allow: { type: "array", items: { type: "string" }, uniqueItems: true },
28
+ },
29
+ additionalProperties: false,
30
+ },
31
+ ],
32
+ messages: {
33
+ missingFormat:
34
+ "숫자 컬럼 `{{label}}` 에 format 이 없습니다. `format: (v) => `${Number(v).toLocaleString()}{{unit}}`` 처럼 세 자리 구분을 넣으세요. (AGENTS.md §1-4)",
35
+ missingLocale:
36
+ "숫자 컬럼 `{{label}}` 의 format 이 toLocaleString 을 쓰지 않습니다. 세 자리 구분 없이 표시됩니다. (AGENTS.md §1-4)",
37
+ },
38
+ },
39
+
40
+ create(context) {
41
+ const allow = new Set(context.options[0]?.allow ?? []);
42
+
43
+ return {
44
+ ObjectExpression(node) {
45
+ const column = asColumn(node);
46
+ if (!column) return;
47
+
48
+ const { labelProp, label, columnName } = column;
49
+ if (columnName && allow.has(columnName)) return;
50
+
51
+ // 숫자 컬럼이면 모두 대상 — 하이픈 서식 문자열(전화번호 등)만 뺀다
52
+ if (!NUMERIC_LABEL.test(label) || IDENTIFIER_ONLY.test(label)) return;
53
+
54
+ // render 로 셀을 직접 그리는 경우는 이 규칙이 판단하지 않는다
55
+ if (prop(node, "render")) return;
56
+
57
+ const unit = /금액|가격|단가|판매가|원가|비용|수수료|배송비|할인|합계|총액|잔액/.test(label)
58
+ ? "원"
59
+ : "";
60
+
61
+ const formatProp = prop(node, "format");
62
+ if (!formatProp) {
63
+ context.report({
64
+ node: labelProp,
65
+ messageId: "missingFormat",
66
+ data: { label, unit },
67
+ });
68
+ return;
69
+ }
70
+
71
+ const src = context.sourceCode.getText(formatProp);
72
+ if (!src.includes("toLocaleString")) {
73
+ context.report({ node: formatProp, messageId: "missingLocale", data: { label } });
74
+ }
75
+ },
76
+ };
77
+ },
78
+ };
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 숫자 컬럼이 오른쪽 정렬(`align: 'right'`)인지 검사한다.
3
+ *
4
+ * 자릿수가 세로로 맞아야 값의 크기를 비교할 수 있으므로,
5
+ * 금액·수량·개수처럼 숫자가 들어가는 컬럼은 예외 없이 오른쪽 정렬한다.
6
+ *
7
+ * 대상은 `name` · `label` · `field` 를 모두 가진 객체 리터럴(= STableColumn 형태)뿐이라
8
+ * 일반 객체를 오탐하지 않는다.
9
+ *
10
+ * AGENTS.md §3-4.
11
+ */
12
+
13
+ import {
14
+ NUMERIC_LABEL,
15
+ IDENTIFIER_ONLY,
16
+ NUMERIC_FORMAT,
17
+ prop,
18
+ literalString,
19
+ asColumn,
20
+ } from "../lib/table-column.mjs";
21
+
22
+ export default {
23
+ meta: {
24
+ type: "problem",
25
+ docs: {
26
+ description: "테이블의 숫자 컬럼은 오른쪽 정렬",
27
+ },
28
+ schema: [
29
+ {
30
+ type: "object",
31
+ properties: {
32
+ /** 검사에서 뺄 컬럼 name */
33
+ allow: { type: "array", items: { type: "string" }, uniqueItems: true },
34
+ },
35
+ additionalProperties: false,
36
+ },
37
+ ],
38
+ messages: {
39
+ needsRight:
40
+ "숫자 컬럼 `{{label}}` 은 `align: 'right'` 로 오른쪽 정렬해야 합니다{{reason}}. (AGENTS.md §3-4)",
41
+ },
42
+ fixable: "code",
43
+ },
44
+
45
+ create(context) {
46
+ const allow = new Set(context.options[0]?.allow ?? []);
47
+
48
+ return {
49
+ ObjectExpression(node) {
50
+ const column = asColumn(node);
51
+ if (!column) return;
52
+
53
+ const { labelProp, label, columnName } = column;
54
+ if (columnName && allow.has(columnName)) return;
55
+
56
+ // 숫자 판정 — label 키워드 또는 format 의 숫자 서식
57
+ let reason = "";
58
+ let numeric = false;
59
+
60
+ if (NUMERIC_LABEL.test(label) && !IDENTIFIER_ONLY.test(label)) {
61
+ numeric = true;
62
+ }
63
+
64
+ const formatProp = prop(node, "format");
65
+ if (formatProp) {
66
+ const src = context.sourceCode.getText(formatProp);
67
+ if (NUMERIC_FORMAT.test(src)) {
68
+ numeric = true;
69
+ reason = " (format 이 숫자를 서식화하고 있습니다)";
70
+ }
71
+ }
72
+
73
+ if (!numeric) return;
74
+
75
+ const alignProp = prop(node, "align");
76
+ if (literalString(alignProp) === "right") return;
77
+
78
+ context.report({
79
+ node: alignProp ?? labelProp,
80
+ messageId: "needsRight",
81
+ data: { label, reason },
82
+ fix(fixer) {
83
+ if (alignProp) {
84
+ return fixer.replaceText(alignProp.value, "'right'");
85
+ }
86
+ // align 이 없으면 label 뒤에 추가한다
87
+ return fixer.insertTextAfter(labelProp, ", align: 'right'");
88
+ },
89
+ });
90
+ },
91
+ };
92
+ },
93
+ };
@@ -0,0 +1,16 @@
1
+ /* 자동 생성: npm run build (scripts/gen-eslint-scale.mjs). 직접 수정 금지. */
2
+
3
+ /** gap-*, p-*, m-* 등 간격 유틸리티가 받을 수 있는 값 (px) */
4
+ export const SPACING = [2,4,6,8,10,12,16,19,20,22,24,28,32,36,40,44,48,56,60,62,80];
5
+
6
+ /** text-* 숫자 유틸리티가 받을 수 있는 값 (px) */
7
+ export const TEXT_SIZES = [10,11,12,13,14,16,18,20,24,28,32];
8
+
9
+ /** rounded-* 가 받을 수 있는 키 */
10
+ export const RADIUS = ["2","4","6","8","full","control-sm","control-md","feedback-xs-square","feedback-sm-square","feedback-pill","field-sm","field-md","navigation","item-bordered"];
11
+
12
+ /** 타이포그래피 프리셋 클래스 */
13
+ export const TYPO_PRESETS = ["typo-body-lg-bold","typo-body-lg-default","typo-body-lg-medium","typo-body-md-bold","typo-body-md-default","typo-body-md-medium","typo-body-sm-bold","typo-body-sm-default","typo-body-sm-medium","typo-body-xs-default","typo-control-lg","typo-control-md-default","typo-control-md-underline","typo-control-sm-default","typo-control-sm-underline","typo-control-xs-bold","typo-control-xs-default","typo-control-xs-medium","typo-control-xs-underline","typo-feedback-md-bold","typo-feedback-md-medium","typo-feedback-md-underline","typo-feedback-sm-bold","typo-feedback-sm-medium","typo-feedback-sm-regular","typo-feedback-sm-underline","typo-feedback-xs","typo-field-lg-bold","typo-field-lg-default","typo-field-lg-medium","typo-field-md-bold","typo-field-md-default","typo-field-md-medium","typo-field-sm-bold","typo-field-sm-default","typo-field-sm-medium","typo-field-xs-default","typo-heading-lg","typo-heading-md","typo-heading-sm","typo-heading-xs","typo-navigation-lg-bold","typo-navigation-lg-medium","typo-navigation-md-bold","typo-navigation-sm-bold","typo-navigation-sm-default","typo-navigation-sm-medium","typo-navigation-xs-bold","typo-navigation-xs-medium","typo-table-accent","typo-table-body","typo-table-header"];
14
+
15
+ /** 색상 유틸리티 키 (text-*, bg-*, border-* 공통) */
16
+ export const COLORS = ["bg-accent","bg-accentBright","bg-accentFaint","bg-accentLight","bg-brand","bg-caution","bg-danger","bg-dangerLight","bg-deep","bg-frame","bg-neutralBright","bg-neutralLight","bg-progress","bg-screen","bg-subtle","bg-success","bg-successLight","bg-tableHeader","bg-warning","black","blue-strong","blue-subtle","border-accent","border-accentLight","border-danger","border-default","border-strong","border-success","brilliantblue-05","brilliantblue-10","brilliantblue-20","brilliantblue-25","brilliantblue-40","brilliantblue-50","brilliantblue-60","brilliantblue-70","brilliantblue-75","brilliantblue-80","brilliantblue-85","brilliantblue-90","brilliantblue-95","brilliantblue-99","control-bg-inverseHover","danger-15","danger-20","danger-30","danger-45","danger-60","danger-70","danger-75","danger-80","danger-85","danger-90","danger-95","danger-99","danger-strong","danger-subtle","darkblue-strong","darkblue-subtle","disabled-bg","disabled-border","disabled-icon","disabled-text","divider-default","fg-accent","fg-accentLight","fg-brand","fg-danger","fg-dangerLight","fg-deep","fg-inverse","fg-primary","fg-quaternary","fg-secondary","fg-subtleCool","fg-subtleWarm","fg-success","fg-tertiary","fg-warning","field-bg-default","field-bg-hover","field-bg-readOnly","field-border-danger","field-border-default","field-border-focus","field-border-hover","field-border-success","field-icon-default","field-text-default","field-text-placeholder","field-text-readOnly","green-15","green-25","green-45","green-55","green-65","green-70","green-75","green-80","green-85","green-90","green-95","green-99","green-strong","green-subtle","grey-05","grey-10","grey-20","grey-25","grey-30","grey-35","grey-45","grey-50","grey-55","grey-60","grey-65","grey-70","grey-80","grey-85","grey-90","grey-95","grey-strong","grey-subtle","indigo-strong","indigo-subtle","lightblue-strong","lightblue-subtle","link-accent","navigation-gnb-bg-dark","oceanblue-15","oceanblue-25","oceanblue-50","oceanblue-60","oceanblue-65","oceanblue-70","oceanblue-75","oceanblue-80","oceanblue-85","oceanblue-90","oceanblue-95","oceanblue-99","olive-05","olive-10","olive-15","olive-20","olive-30","olive-45","olive-55","olive-65","olive-70","olive-80","olive-90","olive-95","orange-10","orange-20","orange-35","orange-45","orange-55","orange-60","orange-65","orange-75","orange-85","orange-90","orange-95","orange-99","orange-strong","orange-subtle","primary-05","primary-10","primary-20","primary-25","primary-40","primary-50","primary-60","primary-70","primary-75","primary-80","primary-85","primary-90","primary-95","primary-99","red-15","red-20","red-30","red-45","red-60","red-70","red-75","red-80","red-85","red-90","red-95","red-99","red-strong","red-subtle","steelblue-10","steelblue-25","steelblue-45","steelblue-60","steelblue-65","steelblue-70","steelblue-75","steelblue-80","steelblue-85","steelblue-90","steelblue-95","steelblue-99","success-15","success-25","success-45","success-55","success-65","success-70","success-75","success-80","success-85","success-90","success-95","success-99","success-strong","success-subtle","warning-10","warning-20","warning-35","warning-45","warning-55","warning-60","warning-65","warning-75","warning-85","warning-90","warning-95","warning-99","warning-strong","warning-subtle","white","yellow-10","yellow-20","yellow-25","yellow-30","yellow-40","yellow-45","yellow-50","yellow-60","yellow-70","yellow-80","yellow-90","yellow-95","yellow-moderate","yellow-strong","yellow-subtle"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sellmate-design-system-react",
3
- "version": "2.2.0",
3
+ "version": "3.1.0",
4
4
  "description": "Sellmate Design System — React (TypeScript + Tailwind v4) port",
5
5
  "license": "UNLICENSED",
6
6
  "keywords": [
@@ -16,7 +16,10 @@
16
16
  "**/*.css"
17
17
  ],
18
18
  "files": [
19
- "dist"
19
+ "dist",
20
+ "eslint",
21
+ "!eslint/__tests__",
22
+ "AGENTS.md"
20
23
  ],
21
24
  "exports": {
22
25
  ".": {
@@ -25,7 +28,8 @@
25
28
  "require": "./dist/index.cjs"
26
29
  },
27
30
  "./theme.css": "./dist/theme.css",
28
- "./styles.css": "./dist/styles.css"
31
+ "./styles.css": "./dist/styles.css",
32
+ "./eslint": "./eslint/index.mjs"
29
33
  },
30
34
  "main": "./dist/index.cjs",
31
35
  "module": "./dist/index.js",
@@ -33,7 +37,7 @@
33
37
  "scripts": {
34
38
  "prepublishOnly": "node scripts/guard-publish-branch.mjs",
35
39
  "prepack": "npm run build",
36
- "build": "npm run gen:tokens && tsup && node scripts/preserve-directives.mjs && npm run build:dts && npm run build:css",
40
+ "build": "npm run gen:tokens && tsup && node scripts/preserve-directives.mjs && npm run build:dts && npm run build:css && node scripts/copy-docs.mjs && node scripts/gen-eslint-scale.mjs && node scripts/gen-llms.mjs",
37
41
  "build:dts": "tsc -p tsconfig.build.json --emitDeclarationOnly",
38
42
  "gen:tokens": "node scripts/generate-tokens.mjs",
39
43
  "docs:gen": "node scripts/gen-docs.mjs",
@@ -46,6 +50,7 @@
46
50
  "storybook": "storybook dev -p 6006",
47
51
  "build-storybook": "storybook build",
48
52
  "test:spec": "npm run build && node --test ./src/components/**/*.test.mjs",
53
+ "test:eslint": "node --test ./eslint/__tests__/*.test.mjs",
49
54
  "typecheck": "tsc --noEmit",
50
55
  "lint": "eslint \"src/**/*.{ts,tsx}\"",
51
56
  "lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix",