sellmate-design-system-react 9.0.0-beta.79 → 9.0.0-beta.80

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 @@
1
+ export default function CategoryManagePage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ConsultConsolePage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ProductBulkUploadPage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function ProductOverlayPage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function SalesDashboardPage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function SettingsPage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export default function StoreSetupPage(): import("react").JSX.Element;
@@ -89,3 +89,132 @@ export declare function useExcelFiles(query: {
89
89
  total: number;
90
90
  lastPage: number;
91
91
  };
92
+ /** 대시보드 지표 — 조회 기간(`period`)을 받아 요약 값·차트 데이터를 한 번에 돌려준다 */
93
+ export declare function useSalesDashboard(query: {
94
+ period: SDateRangeValue;
95
+ channel?: string;
96
+ }): {
97
+ summary: {
98
+ value: number;
99
+ label: string;
100
+ unit: string;
101
+ change: number;
102
+ }[];
103
+ daily: {
104
+ categories: string[];
105
+ dates: string[];
106
+ data: number[];
107
+ };
108
+ channelShare: {
109
+ name: string;
110
+ value: number;
111
+ }[];
112
+ topProducts: {
113
+ categories: string[];
114
+ data: number[];
115
+ };
116
+ };
117
+ export declare const CHANNEL_OPTIONS: {
118
+ label: string;
119
+ value: string;
120
+ }[];
121
+ /** 카테고리 트리 — 대분류 아래 중분류가 달린다 */
122
+ export interface Category {
123
+ id: string;
124
+ name: string;
125
+ code: string;
126
+ productCount: number;
127
+ children?: Category[];
128
+ }
129
+ export declare function useCategoryTree(): Category[];
130
+ /** 고른 카테고리 하나 — 상위 이름을 경로로 붙여 돌려준다 */
131
+ export declare function useCategory(id: string): {
132
+ path: string;
133
+ useYn: string;
134
+ memo: string;
135
+ id: string;
136
+ name: string;
137
+ code: string;
138
+ productCount: number;
139
+ children?: Category[];
140
+ } | undefined;
141
+ export declare function saveCategory(values: Record<string, unknown>): Promise<void>;
142
+ export declare function removeCategory(id: string): Promise<void>;
143
+ export declare const SETTINGS_TABS: {
144
+ label: string;
145
+ value: string;
146
+ }[];
147
+ /** 환경 설정 — 탭마다 따로 읽고 따로 저장한다 */
148
+ export declare function useSettings(tab: string): Record<string, unknown>;
149
+ export declare function saveSettings(tab: string, values: Record<string, unknown>): Promise<void>;
150
+ /** 엑셀 일괄 등록 — 올린 파일을 검증한 결과 */
151
+ export interface UploadRow {
152
+ id: number;
153
+ row: number;
154
+ name: string;
155
+ price: number;
156
+ error?: string;
157
+ [key: string]: unknown;
158
+ }
159
+ export declare function validateUpload(values: Record<string, unknown>): Promise<UploadRow[]>;
160
+ export declare function downloadErrorRows(rows: UploadRow[]): Promise<void>;
161
+ export declare function commitUpload(rows: UploadRow[]): Promise<number>;
162
+ /** 초기 설정 — 단계마다 따로 저장하고, 저장한 단계는 완료로 남는다 */
163
+ export declare const SETUP_STEPS: {
164
+ label: string;
165
+ value: string;
166
+ group: string;
167
+ }[];
168
+ /**
169
+ * 서버가 아는 단계별 상태 — 완료한 단계와 다시 확인해야 하는 단계.
170
+ * 오류는 완료한 단계에도 남을 수 있다 (연동은 끝냈지만 인증이 만료된 판매처 등).
171
+ */
172
+ export declare function useSetupStatus(): {
173
+ completed: string[];
174
+ error: string[];
175
+ };
176
+ export declare function useSetupStep(step: string): Record<string, unknown>;
177
+ export declare function saveSetupStep(step: string, values: Record<string, unknown>): Promise<void>;
178
+ /** 상담 — 왼쪽 목록의 한 건 */
179
+ export interface Consult {
180
+ id: string;
181
+ customer: string;
182
+ topic: string;
183
+ lastMessage: string;
184
+ status: 'waiting' | 'active' | 'closed';
185
+ }
186
+ export declare const CONSULTS: Consult[];
187
+ /** 대화 한 줄 — 사람이 보낸 메시지이거나, 대화 중간에 시스템이 알리는 사실이다 */
188
+ export type ChatEntry = {
189
+ kind: 'message';
190
+ id: string;
191
+ direction: 'incoming' | 'outgoing';
192
+ /** YYYY-MM-DD — 날짜가 바뀌는 자리에 구분선을 끼운다 */
193
+ date: string;
194
+ time: string;
195
+ text?: string;
196
+ variant?: 'default' | 'template';
197
+ read?: boolean;
198
+ file?: {
199
+ name: string;
200
+ size: number;
201
+ };
202
+ } | {
203
+ kind: 'system';
204
+ id: string;
205
+ date: string;
206
+ text: string;
207
+ };
208
+ export declare function useConsultMessages(consultId: string): ChatEntry[];
209
+ /** 답변 템플릿 — 분류마다 여러 개 */
210
+ export declare const REPLY_TEMPLATES: {
211
+ id: string;
212
+ name: string;
213
+ items: {
214
+ id: string;
215
+ title: string;
216
+ body: string;
217
+ }[];
218
+ }[];
219
+ export declare function sendChatMessage(consultId: string, text: string): Promise<void>;
220
+ export declare function closeConsult(consultId: string): Promise<void>;
package/dist/styles.css CHANGED
@@ -423,6 +423,9 @@
423
423
  --animate-floating-out-bottom: floating-out-bottom 0.15s ease-in forwards;
424
424
  --animate-floating-out-left: floating-out-left 0.15s ease-in forwards;
425
425
  --animate-floating-out-right: floating-out-right 0.15s ease-in forwards;
426
+ --animate-skeleton-wave: skeleton-wave 1.5s linear 0.5s infinite;
427
+ --animate-skeleton-pulse: skeleton-pulse 1.5s ease-in-out 0.5s infinite;
428
+ --animate-skeleton-fade: skeleton-fade 1.5s linear 0.5s infinite;
426
429
  }
427
430
  }
428
431
  @layer base {
@@ -870,6 +873,12 @@
870
873
  .mt-\[24px\] {
871
874
  margin-top: 24px;
872
875
  }
876
+ .mt-\[var\(--cmp-chatMessage-group-message-gap\)\] {
877
+ margin-top: var(--cmp-chatMessage-group-message-gap);
878
+ }
879
+ .mt-\[var\(--cmp-chatMessage-group-system-gap\)\] {
880
+ margin-top: var(--cmp-chatMessage-group-system-gap);
881
+ }
873
882
  .mt-\[var\(--cmp-guide-contents-gap\)\] {
874
883
  margin-top: var(--cmp-guide-contents-gap);
875
884
  }
@@ -1274,6 +1283,9 @@
1274
1283
  .min-h-\[var\(--cmp-datepicker-calendar-day-circle-size\)\] {
1275
1284
  min-height: var(--cmp-datepicker-calendar-day-circle-size);
1276
1285
  }
1286
+ .min-h-full {
1287
+ min-height: 100%;
1288
+ }
1277
1289
  .min-h-screen {
1278
1290
  min-height: 100vh;
1279
1291
  }
@@ -1487,6 +1499,9 @@
1487
1499
  .w-sd-8 {
1488
1500
  width: var(--spacing-sd-8);
1489
1501
  }
1502
+ .max-w-\[280px\] {
1503
+ max-width: 280px;
1504
+ }
1490
1505
  .max-w-\[360px\] {
1491
1506
  max-width: 360px;
1492
1507
  }
@@ -1592,6 +1607,9 @@
1592
1607
  .flex-none {
1593
1608
  flex: none;
1594
1609
  }
1610
+ .flex-shrink {
1611
+ flex-shrink: 1;
1612
+ }
1595
1613
  .flex-shrink-0 {
1596
1614
  flex-shrink: 0;
1597
1615
  }
@@ -1654,6 +1672,10 @@
1654
1672
  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
1655
1673
  translate: var(--tw-translate-x) var(--tw-translate-y);
1656
1674
  }
1675
+ .scale-y-50 {
1676
+ --tw-scale-y: 50%;
1677
+ scale: var(--tw-scale-x) var(--tw-scale-y);
1678
+ }
1657
1679
  .scale-\[0\.3\] {
1658
1680
  scale: 0.3;
1659
1681
  }
@@ -1708,6 +1730,15 @@
1708
1730
  .animate-modal-shake {
1709
1731
  animation: var(--animate-modal-shake);
1710
1732
  }
1733
+ .animate-skeleton-fade {
1734
+ animation: var(--animate-skeleton-fade);
1735
+ }
1736
+ .animate-skeleton-pulse {
1737
+ animation: var(--animate-skeleton-pulse);
1738
+ }
1739
+ .animate-skeleton-wave {
1740
+ animation: var(--animate-skeleton-wave);
1741
+ }
1711
1742
  .cursor-col-resize {
1712
1743
  cursor: col-resize;
1713
1744
  }
@@ -1729,6 +1760,9 @@
1729
1760
  .cursor-text {
1730
1761
  cursor: text;
1731
1762
  }
1763
+ .cursor-wait {
1764
+ cursor: wait;
1765
+ }
1732
1766
  .touch-none {
1733
1767
  touch-action: none;
1734
1768
  }
@@ -1747,18 +1781,30 @@
1747
1781
  .\[scrollbar-width\:none\] {
1748
1782
  scrollbar-width: none;
1749
1783
  }
1784
+ .list-disc {
1785
+ list-style-type: disc;
1786
+ }
1750
1787
  .list-none {
1751
1788
  list-style-type: none;
1752
1789
  }
1753
1790
  .grid-cols-1 {
1754
1791
  grid-template-columns: repeat(1, minmax(0, 1fr));
1755
1792
  }
1793
+ .grid-cols-2 {
1794
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1795
+ }
1796
+ .grid-cols-4 {
1797
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1798
+ }
1756
1799
  .grid-cols-7 {
1757
1800
  grid-template-columns: repeat(7, minmax(0, 1fr));
1758
1801
  }
1759
1802
  .grid-cols-\[200px_1fr\] {
1760
1803
  grid-template-columns: 200px 1fr;
1761
1804
  }
1805
+ .grid-cols-\[240px_auto_1fr\] {
1806
+ grid-template-columns: 240px auto 1fr;
1807
+ }
1762
1808
  .grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\] {
1763
1809
  grid-template-columns: minmax(0,1fr) minmax(0,1fr);
1764
1810
  }
@@ -3356,6 +3402,9 @@
3356
3402
  .px-\(--cmp-listDraggableItem-paddingX\) {
3357
3403
  padding-inline: var(--cmp-listDraggableItem-paddingX);
3358
3404
  }
3405
+ .px-\(--cmp-listItem-paddingX\) {
3406
+ padding-inline: var(--cmp-listItem-paddingX);
3407
+ }
3359
3408
  .px-\(--cmp-pageHeader-paddingX\) {
3360
3409
  padding-inline: var(--cmp-pageHeader-paddingX);
3361
3410
  }
@@ -3482,6 +3531,9 @@
3482
3531
  .px-sd-16 {
3483
3532
  padding-inline: var(--spacing-sd-16);
3484
3533
  }
3534
+ .px-sd-24 {
3535
+ padding-inline: var(--spacing-sd-24);
3536
+ }
3485
3537
  .py-\(--cmp-calendarBoard-dayEvent-header-paddingY\) {
3486
3538
  padding-block: var(--cmp-calendarBoard-dayEvent-header-paddingY);
3487
3539
  }
@@ -3632,6 +3684,9 @@
3632
3684
  .py-sd-24 {
3633
3685
  padding-block: var(--spacing-sd-24);
3634
3686
  }
3687
+ .py-sd-48 {
3688
+ padding-block: var(--spacing-sd-48);
3689
+ }
3635
3690
  .pt-\(--cmp-calendarBoard-dayCard-header-paddingTop\) {
3636
3691
  padding-top: var(--cmp-calendarBoard-dayCard-header-paddingTop);
3637
3692
  }
@@ -3677,6 +3732,9 @@
3677
3732
  .pr-\[var\(--cmp-overlay-header-paddingX\)\] {
3678
3733
  padding-right: var(--cmp-overlay-header-paddingX);
3679
3734
  }
3735
+ .pr-sd-4 {
3736
+ padding-right: var(--spacing-sd-4);
3737
+ }
3680
3738
  .pb-\(--cmp-calendarBoard-dayCard-grid-paddingBottom\) {
3681
3739
  padding-bottom: var(--cmp-calendarBoard-dayCard-grid-paddingBottom);
3682
3740
  }
@@ -3743,6 +3801,12 @@
3743
3801
  .pl-\[var\(--cmp-overlay-header-paddingX\)\] {
3744
3802
  padding-left: var(--cmp-overlay-header-paddingX);
3745
3803
  }
3804
+ .pl-sd-4 {
3805
+ padding-left: var(--spacing-sd-4);
3806
+ }
3807
+ .pl-sd-16 {
3808
+ padding-left: var(--spacing-sd-16);
3809
+ }
3746
3810
  .pl-sd-24 {
3747
3811
  padding-left: var(--spacing-sd-24);
3748
3812
  }
@@ -4398,6 +4462,9 @@
4398
4462
  .text-link-accent {
4399
4463
  color: var(--color-link-accent);
4400
4464
  }
4465
+ .text-oceanblue-75 {
4466
+ color: var(--color-oceanblue-75);
4467
+ }
4401
4468
  .text-red-75 {
4402
4469
  color: var(--color-red-75);
4403
4470
  }
@@ -5611,6 +5678,16 @@
5611
5678
  scrollbar-color: var(--color-grey-45) var(--color-white);
5612
5679
  }
5613
5680
  }
5681
+ .motion-reduce\:hidden {
5682
+ @media (prefers-reduced-motion: reduce) {
5683
+ display: none;
5684
+ }
5685
+ }
5686
+ .motion-reduce\:animate-none {
5687
+ @media (prefers-reduced-motion: reduce) {
5688
+ animation: none;
5689
+ }
5690
+ }
5614
5691
  .motion-reduce\:transition-none {
5615
5692
  @media (prefers-reduced-motion: reduce) {
5616
5693
  transition-property: none;
@@ -6454,6 +6531,11 @@
6454
6531
  flex: 1;
6455
6532
  }
6456
6533
  }
6534
+ .\[\&\>div\:last-child\]\:overflow-y-auto {
6535
+ &>div:last-child {
6536
+ overflow-y: auto;
6537
+ }
6538
+ }
6457
6539
  .\[\&\>svg\]\:w-full\! {
6458
6540
  &>svg {
6459
6541
  width: 100% !important;
@@ -9415,6 +9497,30 @@
9415
9497
  transform: translateX(-4px);
9416
9498
  }
9417
9499
  }
9500
+ @keyframes skeleton-wave {
9501
+ 0% {
9502
+ transform: translateX(-100%);
9503
+ }
9504
+ 100% {
9505
+ transform: translateX(100%);
9506
+ }
9507
+ }
9508
+ @keyframes skeleton-pulse {
9509
+ 0%, 100% {
9510
+ transform: scale(1);
9511
+ }
9512
+ 50% {
9513
+ transform: scale(0.85);
9514
+ }
9515
+ }
9516
+ @keyframes skeleton-fade {
9517
+ 0%, 100% {
9518
+ opacity: 1;
9519
+ }
9520
+ 50% {
9521
+ opacity: 0.4;
9522
+ }
9523
+ }
9418
9524
  @property --tw-border-spacing-x {
9419
9525
  syntax: "<length>";
9420
9526
  inherits: false;
@@ -9440,6 +9546,21 @@
9440
9546
  inherits: false;
9441
9547
  initial-value: 0;
9442
9548
  }
9549
+ @property --tw-scale-x {
9550
+ syntax: "*";
9551
+ inherits: false;
9552
+ initial-value: 1;
9553
+ }
9554
+ @property --tw-scale-y {
9555
+ syntax: "*";
9556
+ inherits: false;
9557
+ initial-value: 1;
9558
+ }
9559
+ @property --tw-scale-z {
9560
+ syntax: "*";
9561
+ inherits: false;
9562
+ initial-value: 1;
9563
+ }
9443
9564
  @property --tw-rotate-x {
9444
9565
  syntax: "*";
9445
9566
  inherits: false;
@@ -9626,6 +9747,9 @@
9626
9747
  --tw-translate-x: 0;
9627
9748
  --tw-translate-y: 0;
9628
9749
  --tw-translate-z: 0;
9750
+ --tw-scale-x: 1;
9751
+ --tw-scale-y: 1;
9752
+ --tw-scale-z: 1;
9629
9753
  --tw-rotate-x: initial;
9630
9754
  --tw-rotate-y: initial;
9631
9755
  --tw-rotate-z: initial;
package/dist/theme.css CHANGED
@@ -2446,6 +2446,11 @@
2446
2446
  --animate-floating-out-bottom: floating-out-bottom 0.15s ease-in forwards;
2447
2447
  --animate-floating-out-left: floating-out-left 0.15s ease-in forwards;
2448
2448
  --animate-floating-out-right: floating-out-right 0.15s ease-in forwards;
2449
+
2450
+ /* 스켈레톤 (Quasar QSkeleton 포팅). 속도는 SSkeleton 이 animation-duration 으로 덮어쓴다 */
2451
+ --animate-skeleton-wave: skeleton-wave 1.5s linear 0.5s infinite;
2452
+ --animate-skeleton-pulse: skeleton-pulse 1.5s ease-in-out 0.5s infinite;
2453
+ --animate-skeleton-fade: skeleton-fade 1.5s linear 0.5s infinite;
2449
2454
  }
2450
2455
  @keyframes linear-indeterminate {
2451
2456
  0% { transform: translateX(-100%) scaleX(0.2); }
@@ -2491,3 +2496,7 @@
2491
2496
  @keyframes floating-out-bottom { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-4px); } }
2492
2497
  @keyframes floating-out-left { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(4px); } }
2493
2498
  @keyframes floating-out-right { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-4px); } }
2499
+ /* 스켈레톤: wave 는 하이라이트 띠가 왼→오로 지나가고, pulse 는 크기, fade 는 투명도가 숨쉬듯 바뀐다 */
2500
+ @keyframes skeleton-wave { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }
2501
+ @keyframes skeleton-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(0.85); } }
2502
+ @keyframes skeleton-fade { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sellmate-design-system-react",
3
- "version": "9.0.0-beta.79",
3
+ "version": "9.0.0-beta.80",
4
4
  "description": "Sellmate Design System — React (TypeScript + Tailwind v4) port",
5
5
  "license": "UNLICENSED",
6
6
  "keywords": [