sellmate-design-system-react 9.0.0-beta.2 → 9.0.0-beta.4
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 +123 -38
- package/dist/components/SChipFilter/README.md +2 -1
- package/dist/components/SChipFilter/SChipFilter.d.ts +13 -6
- package/dist/components/SDatePicker/README.md +41 -3
- package/dist/components/SDatePicker/SDatePicker.d.ts +36 -3
- package/dist/components/SDatePicker/index.d.ts +1 -1
- package/dist/components/SField/README.md +1 -0
- package/dist/components/SField/SField.d.ts +12 -0
- package/dist/components/SKeyValueTable/README.md +1 -0
- package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +8 -1
- package/dist/components/SPage/README.md +1 -0
- package/dist/components/SPage/SPage.d.ts +12 -1
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page.config.d.ts +8 -0
- package/dist/components/SSectionHeaderCard/README.md +10 -23
- package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +21 -14
- package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
- package/dist/components/SSelect/README.md +2 -0
- package/dist/components/STable/README.md +1 -0
- package/dist/components/STable/STable.d.ts +20 -0
- package/dist/components/STimePicker/timepicker.config.d.ts +5 -0
- package/dist/index.cjs +681 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +679 -83
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +180 -65
- package/dist/llms.txt +123 -38
- package/dist/styles.css +92 -8
- package/dist/theme.css +14 -0
- package/package.json +1 -1
package/dist/llms.txt
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
| --- | --- |
|
|
38
38
|
| **버튼·링크** | `SButton` `SGhostButton` `SDropdownButton` `STextLink` `SSwitch` `SToggle` |
|
|
39
39
|
| **입력 (폼)** | `SForm` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SChip` `SChipInput` `SBarcodeInput` `SFilePicker` |
|
|
40
|
-
| **날짜·시간** | `SCalendar` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
40
|
+
| **날짜·시간** | `SCalendar` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` |
|
|
41
41
|
| **표·목록** | `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SListItem` `SExpansionList` `SDraggableList` `SDraggableItem` `STree` |
|
|
42
42
|
| **레이아웃** | `SLayout` `SGnb` `SPage`(제목 영역은 `header` prop) `SSectionHeaderCard` `SCard` `SDivider` `SSplitter` `SScrollArea` `SExpansionItem` |
|
|
43
43
|
| **내비게이션** | `STabs` `SPagination` `SStepper` |
|
|
@@ -81,7 +81,7 @@ AI 에이전트는 코드를 생성하기 전에 이 목록을 반드시 지킨
|
|
|
81
81
|
| `alert()`, `confirm()` | `SToast`, `SModal.confirm(...)` |
|
|
82
82
|
| 직접 만든 탭/페이지네이션/스텝퍼 | `STabs`, `SPagination`, `SStepper` |
|
|
83
83
|
| `<ul>`/`<li>` 로 만든 목록 UI | `SList` + `SListItem` (드래그 정렬은 `SDraggableItem`) |
|
|
84
|
-
| 직접 만든 섹션 카드(제목 바 + 본문 박스) | `SSectionHeaderCard`
|
|
84
|
+
| 직접 만든 섹션 카드(제목 바 + 본문 박스) | `SSectionHeaderCard` 의 `title` / `padding` props |
|
|
85
85
|
| `<svg>` 직접 삽입, 이모지 아이콘 | `SIcon` |
|
|
86
86
|
| `<hr>` | `SDivider` |
|
|
87
87
|
| `<details>` / `<summary>` | `SExpansionItem` |
|
|
@@ -147,7 +147,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
147
147
|
| --- | --- | --- |
|
|
148
148
|
| **셸** | 앱 전체 뼈대. 페이지가 바뀌어도 남는다 | `SLayout` `SGnb` `SPage`(제목 영역은 `header` prop) |
|
|
149
149
|
| **블록** | `SPage` 의 직계 자식. 페이지를 세로로 쌓는 단위 | `SSectionHeaderCard` `SCard` `SForm` `SSplitter` `SScrollArea` `STable` `STableBar` `SChipFilter` `SKeyValueTable` `SList` `SExpansionList` `SDraggableList` `STree` `SCallout` `STabs` `SStepper` `SPagination` `SDivider` |
|
|
150
|
-
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
150
|
+
| **요소** | 블록 **안에** 놓이는 컨트롤. 혼자 페이지에 서지 않는다 | `SButton` `SGhostButton` `SDropdownButton` `SField` `SInput` `SNumberInput` `STextarea` `SSelect` `SCheckbox` `SRadio` `SRadioGroup` `SRadioButton` `SSwitch` `SToggle` `SChipInput` `SBarcodeInput` `SFilePicker` `SDatePicker` `SDatePickerYearListbox` `SDatePickerMonthListbox` `SDateRangePicker` `STimePicker` `STimeRangePicker` `SCalendar` `SListItem` `SExpansionItem` `SDraggableItem` `SImage` `SLinearProgress` `SCircleProgress` |
|
|
151
151
|
| **인라인** | 텍스트 흐름·셀·라벨 안에 섞인다. 혼자 블록이 되지 않는다 | `STag` `SBadge` `SIcon` `STextLink` `SChip` |
|
|
152
152
|
| **레이어** | 문서 흐름 **밖**에 떠서 그려진다. 어느 층에서 띄우든 레이아웃에 영향이 없다 | `SModal` `SActionModal` `SConfirmModal` `SPopup` `SDrawer` `SPopover` `STooltip` `SPortal` `SToast` `SLoadingModal` `SLoadingContainer` `SGuide` |
|
|
153
153
|
|
|
@@ -167,7 +167,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
167
167
|
| 담는 것 | 올 수 있는 것 | 오면 안 되는 것 |
|
|
168
168
|
| --- | --- | --- |
|
|
169
169
|
| `SPage` | **블록만** | **요소를 직접** — 버튼 하나도 블록에 담아 놓는다 |
|
|
170
|
-
| `SSectionHeaderCard
|
|
170
|
+
| `SSectionHeaderCard` 의 `children` | 그리는 블록 · 요소 | `SSectionHeaderCard` · `SCard` (카드 겹침, §3-7-8) |
|
|
171
171
|
| `SCard` | 그리는 블록 · 요소 | `SCard` · `SSectionHeaderCard` |
|
|
172
172
|
| `SForm` | 블록 (보통 `SKeyValueTable` + 하단 액션) | — |
|
|
173
173
|
| `SSplitter.Before` / `.After` | 블록 | — |
|
|
@@ -231,7 +231,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
231
231
|
|
|
232
232
|
페이지 제목만 18px 로 크게 두고 그 아래는 14 / 12 로 촘촘하게 간다. 중간 크기(16px)는 기본 골격에서 쓰지 않는다.
|
|
233
233
|
|
|
234
|
-
- **페이지·섹션 제목의 타이포를 직접 주지 않는다.** `SPage` 의 `header.title`, `SSectionHeaderCard
|
|
234
|
+
- **페이지·섹션 제목의 타이포를 직접 주지 않는다.** `SPage` 의 `header.title`, `SSectionHeaderCard` 의 `header.title` 이 이미 넣는다 — 그 위에 `typo-heading-lg`/`typo-heading-sm` 을 또 씌우지 않는다.
|
|
235
235
|
- **하위 제목이 필요하면 먼저 섹션을 나눌 수 없는지 본다.** 한 섹션 안에서 제목이 두 단으로 갈린다는 것은 대개 섹션이 둘이라는 뜻이다 (§3-7-8).
|
|
236
236
|
- 본문 안에서 한 단어를 강조할 때는 `typo-body-sm-medium` 을 쓴다. `typo-body-sm-bold` 는 제목 성격의 짧은 라벨에만 쓴다. <!-- TODO(디자인): 강조 굵기 기준 확정 -->
|
|
237
237
|
|
|
@@ -301,7 +301,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
301
301
|
|
|
302
302
|
**페이지 프레임은 예외 없이 `SPage` 가 넣는다.** 아래 규칙은 그 안의 **섹션·패널 레벨에만** 적용된다.
|
|
303
303
|
|
|
304
|
-
**컴포넌트가 자체 여백을 가지면 컴포넌트 기준이 우선한다.** `SKeyValueTable`·`STable` 처럼 자기 여백을 토큰으로 갖고 있는 컴포넌트에는 이 판정을 적용하지 않는다 — 손댈 것이 없다. 아래 판정이 필요한 자리는 **직접 만든 컨테이너**와 **`SSectionHeaderCard
|
|
304
|
+
**컴포넌트가 자체 여백을 가지면 컴포넌트 기준이 우선한다.** `SKeyValueTable`·`STable` 처럼 자기 여백을 토큰으로 갖고 있는 컴포넌트에는 이 판정을 적용하지 않는다 — 손댈 것이 없다. 아래 판정이 필요한 자리는 **직접 만든 컨테이너**와 **`SSectionHeaderCard` 의 `padding`** 두 곳뿐이다.
|
|
305
305
|
|
|
306
306
|
판정은 **그 영역이 담고 있는 콘텐츠 덩어리의 종류 수**로 한다.
|
|
307
307
|
|
|
@@ -336,14 +336,47 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
336
336
|
|
|
337
337
|
**중첩되면 안쪽 여백을 주지 않는다.** 24 영역 안에 또 여백을 주면 가장자리가 40 으로 벌어져 한 면적처럼 읽힌다. 안쪽 카드·목록이 **배경색이 다르거나 테두리가 있어** 경계가 스스로 보이는 경우에만 자기 여백을 유지한다.
|
|
338
338
|
|
|
339
|
-
`SSectionHeaderCard
|
|
339
|
+
`SSectionHeaderCard` 는 이 규칙을 **`padding` prop 으로 받는다** — 직접 `p-sd-*` 를 주지 않는다.
|
|
340
340
|
|
|
341
341
|
```tsx
|
|
342
|
-
<SSectionHeaderCard
|
|
343
|
-
<SSectionHeaderCard
|
|
344
|
-
<SSectionHeaderCard
|
|
342
|
+
<SSectionHeaderCard title="기본 정보">…</SSectionHeaderCard> {/* 기본 = 16 */}
|
|
343
|
+
<SSectionHeaderCard title="기본 정보" padding="wide">…</SSectionHeaderCard> {/* 3종류 이상 */}
|
|
344
|
+
<SSectionHeaderCard title="기본 정보" padding="none">…</SSectionHeaderCard> {/* 표를 가장자리까지 */}
|
|
345
345
|
```
|
|
346
346
|
|
|
347
|
+
##### 카드 가장자리까지 채우는 표는 자기 테두리를 끈다
|
|
348
|
+
|
|
349
|
+
여기서 "표"는 **`STable` 과 `SKeyValueTable` 둘 다**다. 두 컴포넌트 모두 자기 바깥 테두리를 그리는데, 카드도 바깥 테두리를 그린다. `padding="none"` 으로 붙이면 **1px 두 개가 나란히 놓여 그 변만 2px** 로 보인다(카드의 다른 변은 1px 그대로라 굵기가 어긋난다).
|
|
350
|
+
|
|
351
|
+
```tsx
|
|
352
|
+
<SSectionHeaderCard title="발주 내역" padding="none">
|
|
353
|
+
<SKeyValueTable fields={…} bordered={false} radius="useTop" />
|
|
354
|
+
<STable columns={…} rows={…} bordered={false} radius="useTop" />
|
|
355
|
+
</SSectionHeaderCard>
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
- **`bordered={false}`** 로 표의 테두리를 끈다. 카드가 이미 그린다.
|
|
359
|
+
- **`radius="useTop"`** 으로 위쪽 모서리를 죽인다. 아래쪽 라운드는 카드가 처리한다.
|
|
360
|
+
- `STable` 은 **페이지네이션 바의 테두리와 `-mt-px` 겹침도 함께 꺼진다** — 본문 테두리가 없으면 겹칠 대상이 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다.
|
|
361
|
+
|
|
362
|
+
#### 본문 바탕 눌러앉히기 (선택)
|
|
363
|
+
|
|
364
|
+
`SSectionHeaderCard` 는 **`background="neutral"`** 로 본문 바탕을 한 단계 눌러앉힐 수 있다. 흰 면 덩어리(표·리스트)가 여럿일 때 그 덩어리들이 **"면 위에 놓인 객체"로 읽혀 묶음이 더 강하게 보인다.**
|
|
365
|
+
|
|
366
|
+
```tsx
|
|
367
|
+
<SSectionHeaderCard title="발주 상세" background="neutral">…흰 면 표 여럿…</SSectionHeaderCard>
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**기본값(`frame`, 흰 면)이 틀린 것이 아니다.** 이 저장소의 표·리스트는 테두리·라운드·헤더 줄과 `gap-sd-12` 를 이미 갖고 있어 흰 바탕에서도 경계가 읽힌다. 위계를 한 단계 더 주고 싶을 때 고르는 수단이지, 덩어리가 둘 이상이면 반드시 깔아야 하는 규칙이 아니다.
|
|
371
|
+
|
|
372
|
+
깔아도 **효과가 없는** 자리는 있다.
|
|
373
|
+
|
|
374
|
+
- **덩어리가 가장자리까지 차는 경우** — `padding="none"` 으로 표를 채우면 깐 바탕이 표에 완전히 가려 보이지 않는다.
|
|
375
|
+
- **덩어리에 회색 면이 섞인 경우** — 그 덩어리가 바탕과 같은 색이 되어 묻힌다.
|
|
376
|
+
- **맨 텍스트·폼 컨트롤만 있는 본문** — 떠오를 흰 면이 없다.
|
|
377
|
+
|
|
378
|
+
바탕을 깐 경우, 표 사이 구분선(`SDivider`)은 대개 불필요해진다 — 색이 이미 경계를 만든다.
|
|
379
|
+
|
|
347
380
|
#### 스크롤 영역의 하단 여백
|
|
348
381
|
|
|
349
382
|
스크롤을 끝까지 내렸을 때 마지막 항목이 화면 경계에 붙으면 **목록이 끝난 것인지 더 있는 것인지** 읽히지 않는다. 그래서 스크롤 영역은 **하단만** 넓게 둔다. 나머지 세 방향은 위 16 / 24 규칙 그대로다.
|
|
@@ -353,7 +386,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
353
386
|
| **패널 자체 스크롤** (좌측 목록, 중앙 대화 등) | 그 패널 안쪽 하단에 `pb-[var(--cmp-pageBody-padding-scrollEnd)]` — `SPage` 와 같은 토큰이라 값이 바뀌어도 함께 따라간다 |
|
|
354
387
|
| **페이지 단위 스크롤** | **`SPage` 가 넣는다. 직접 주지 않는다** |
|
|
355
388
|
|
|
356
|
-
`SPage` 는 기본으로 넣으므로 **아무것도 하지 않으면 맞다.**
|
|
389
|
+
`SPage` 는 기본으로 넣으므로 **아무것도 하지 않으면 맞다.** 직접 끌 일은 없다 — **페이지네이션이 붙은 테이블**은 `contentHeight="fill"` 을 쓰고, 이 모드에서는 페이지가 스크롤하지 않아 스크롤 끝 여백이 **자동으로 무시**된다 (§4-2 목록 페이지).
|
|
357
390
|
|
|
358
391
|
### 2-3. 색상
|
|
359
392
|
|
|
@@ -428,6 +461,8 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
428
461
|
| 입력된 값 하나를 지우거나 고치게 한다 | `SChip` | §3-1 |
|
|
429
462
|
| 파일을 받는다 | `SFilePicker` | |
|
|
430
463
|
| 날짜 하나를 받는다 | `SDatePicker` | §3-7-4 |
|
|
464
|
+
| 연도 선택 리스트만 커스텀 조합에 넣는다 | `SDatePickerYearListbox` | §3-7-4 |
|
|
465
|
+
| 연도+월 선택 리스트만 커스텀 조합에 넣는다 | `SDatePickerMonthListbox` | §3-7-4 |
|
|
431
466
|
| 날짜 기간을 받는다 | `SDateRangePicker` | §3-7-4 |
|
|
432
467
|
| 시각 하나를 받는다 | `STimePicker` | |
|
|
433
468
|
| 시각 범위를 받는다 | `STimeRangePicker` | |
|
|
@@ -559,9 +594,26 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
|
|
|
559
594
|
| | 무엇인가 | 크기 |
|
|
560
595
|
| --- | --- | --- |
|
|
561
596
|
| **SPopup** | **별도 브라우저 창** (`window.open` 으로 여는 전용 라우트) | 창 크기 = 콘텐츠 크기 |
|
|
562
|
-
| **SActionModal** | 같은 창 위 오버레이 카드 | `width`
|
|
597
|
+
| **SActionModal** | 같은 창 위 오버레이 카드 | `width` prop. **높이는 주지 않는다** (아래) |
|
|
563
598
|
| **SModal.confirm** (`SConfirmModal`) | 같은 창 위 확인창 | 고정 |
|
|
564
599
|
|
|
600
|
+
##### 모달 높이는 내용이 정하고, 상한은 시스템이 건다
|
|
601
|
+
|
|
602
|
+
**`height` 를 주지 않는다.** 높이는 내용이 정하고, 카드는 **뷰포트의 85%** 에서 멈춘다(시스템이 모든 모달에 건다). 데이터가 적으면 내용만큼 작아지고, 많으면 85% 에서 멈춘다.
|
|
603
|
+
|
|
604
|
+
가로는 좌우 24px 씩을 뺀 값으로 클램핑하는데 **세로만 비율**인 이유는, 모달이 화면을 거의 다 덮으면 뒤 맥락이 사라져 "떠 있는 것"으로 읽히지 않기 때문이다.
|
|
605
|
+
|
|
606
|
+
**상한에 닿았을 때 스크롤되어야 하는 것은 모달 본문이 아니라 표다.**
|
|
607
|
+
|
|
608
|
+
```tsx
|
|
609
|
+
<SActionModal modalTitle="발주 검토" button={{ label: '확정', onClick: submit }}>
|
|
610
|
+
{/* 표가 남은 높이를 먹고 자기 안에서 스크롤한다 — 헤더·합계·푸터는 늘 보인다 */}
|
|
611
|
+
<STable className="min-h-0 flex-1" columns={columns} rows={rows} />
|
|
612
|
+
</SActionModal>
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
본문(`overflow-auto` 영역)이 통째로 스크롤되면 표 헤더와 합계 줄이 위로 밀려 사라진다. `SActionModal` 의 본문은 이미 `min-h-0 flex-1` 이므로, 표에 `min-h-0 flex-1` 을 주면 세로 축이 이어져 표만 스크롤한다 (§4-2 목록 페이지와 같은 사슬이다).
|
|
616
|
+
|
|
565
617
|
**성격이 먼저 둘로 갈린다.**
|
|
566
618
|
|
|
567
619
|
| 성격 | 정의 | 컴포넌트 |
|
|
@@ -749,6 +801,7 @@ const columns: STableColumn[] = [
|
|
|
749
801
|
|
|
750
802
|
컬럼 폭은 `width` 로 **고정**되고, `<td>` 는 그 폭을 넘는 내용을 잘라낸다(`overflow: hidden`). 텍스트라면 말줄임으로 끝나지만, 셀에 `STag` · `SButton` · `SGhostButton` · `SSelect` · `SInput` · `SNumberInput` 처럼 **자기 폭을 가진 요소**를 넣으면 요소 자체가 잘려 **누르거나 읽거나 입력할 수 없게 된다.** `width` 를 생략해도 내용에 맞춰 늘어나지 않고 `STable` 의 기본 폭이 될 뿐이므로, 컨트롤이 들어가는 컬럼은 폭을 직접 판단해서 준다.
|
|
751
803
|
|
|
804
|
+
- **컨트롤이 들어가는 컬럼에는 `contentType: 'control'` 을 함께 준다.** 좌우 패딩이 텍스트용(넓게)에서 컨트롤용(좁게)으로 바뀌어, 같은 컬럼 폭에서도 요소가 쓸 폭이 넓어진다. 기본값은 `text` 다.
|
|
752
805
|
- 기준은 **요소가 온전히 보이는 폭 + 셀 좌우 패딩**이다. 좌우 패딩은 `STable` 이 토큰으로 넣으므로(직접 주지 않는다) 그만큼을 뺀 나머지가 요소 몫이라는 점을 계산에 넣는다.
|
|
753
806
|
- 요소가 둘 이상이면 요소 폭의 합에 **`gap` 까지** 더한다 (행 내부 인라인 액션 간격은 `gap-sd-4` 고정, §3-5-5).
|
|
754
807
|
- 값에 따라 폭이 달라지는 요소(`STag` 라벨, 라벨 있는 버튼)는 **가장 긴 값** 기준으로 잡는다. `판매중` 에 맞춰두면 `판매중지 요청` 에서 잘린다.
|
|
@@ -756,6 +809,13 @@ const columns: STableColumn[] = [
|
|
|
756
809
|
- 폭을 넉넉히 줄 수 없는 자리는 폭을 줄이는 게 아니라 **요소를 바꾼다** — 라벨 버튼 대신 아이콘만 있는 `SGhostButton`, `size="xs"` (§3-5-2, §3-5-5).
|
|
757
810
|
- **`autoWidth` 는 해법이 아니다.** 내용에 맞춰 늘어나는 게 아니라 고정폭 컬럼들이 가져가고 **남은 폭을 나눠 갖는 것**이라, 테이블이 좁으면 역시 잘린다. 컨트롤 컬럼은 `width` 로 직접 확보한다.
|
|
758
811
|
|
|
812
|
+
```tsx
|
|
813
|
+
{ name: 'normal', label: '정상', field: 'normal', width: '96px',
|
|
814
|
+
align: 'center', contentType: 'control', render: row => <SNumberInput … /> },
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
**셀 좌우 여백은 내용이 정한다.** 텍스트는 넓게, 컨트롤은 좁게다 — `SKeyValueTable` 은 `field.type` 으로 이 판정을 스스로 하지만, `STable` 의 셀은 소비 앱이 넘긴 임의의 `render` 결과라 컴포넌트가 알 수 없다. 그래서 `contentType` 으로 알려준다. 여백 값 자체는 토큰이 정하므로 `tdClass` 로 패딩을 직접 덮어쓰지 않는다.
|
|
818
|
+
|
|
759
819
|
**`resizable` 테이블이면 `minWidth` 를 함께 준다.** resize 하한 기본값은 어떤 컨트롤도 담지 못할 만큼 작아, 사용자가 끝까지 끌면 그대로 잘린다. `width` 를 정한 근거와 같은 값을 하한으로 둔다 — 텍스트 컬럼과 달리 여기서는 더 줄일 여지가 없다.
|
|
760
820
|
|
|
761
821
|
```tsx
|
|
@@ -1014,11 +1074,25 @@ const columns: STableColumn[] = [
|
|
|
1014
1074
|
| 판별 | 사용 |
|
|
1015
1075
|
| --- | --- |
|
|
1016
1076
|
| 날짜 **하나**를 값으로 받는다 | `SDatePicker` |
|
|
1077
|
+
| 연도 선택 리스트만 필요하다 (트리거·팝오버는 직접 조합) | `SDatePickerYearListbox` |
|
|
1078
|
+
| 연도+월 선택 리스트만 필요하다 (트리거·팝오버는 직접 조합) | `SDatePickerMonthListbox` |
|
|
1017
1079
|
| **시작~종료** 를 값으로 받는다 | `SDateRangePicker` |
|
|
1018
1080
|
| 달력 격자 **자체가 화면 콘텐츠** 다 (일정·이벤트 보기) | `SCalendar` |
|
|
1019
1081
|
|
|
1020
1082
|
- **기간을 `SDatePicker` 두 개로 만들지 않는다.** 시작이 종료보다 뒤인 입력을 막는 검증과 한쪽만 고른 중간 상태 처리가 `SDateRangePicker` 안에 이미 있다. 두 개로 쪼개면 그게 전부 앱 몫이 된다.
|
|
1021
1083
|
- `SDatePicker`·`SDateRangePicker` 는 내부적으로 `SCalendar` 를 팝오버로 띄운다. 값을 받는 자리에 `SCalendar` 를 직접 쓰지 않는다.
|
|
1084
|
+
- `SDatePickerYearListbox`·`SDatePickerMonthListbox` 는 `SDatePicker` 의 mode listbox 조각만 떼어낸 컴포넌트다. 일반 폼 입력에는 `SDatePicker mode="year" | "month"` 를 우선 쓰고, 다른 트리거·팝오버 안에 리스트만 끼워 넣을 때만 직접 쓴다.
|
|
1085
|
+
|
|
1086
|
+
**날짜·시간 피커는 폭 상한을 스스로 갖는다 — `width` 를 주지 않는다.** 값 길이가 `YYYY-MM-DD` 처럼 정해져 있어 컴포넌트가 사이즈별 상한을 안다. `SKeyValueTable` 이 모든 컨트롤에 `width="100%"` 를 넘기지만, 이 상한 덕분에 행 전체로 늘어나지 않고 제 폭에서 멈춘다.
|
|
1087
|
+
|
|
1088
|
+
| 컴포넌트 | `size="sm"` | `size="md"` |
|
|
1089
|
+
| --- | --- | --- |
|
|
1090
|
+
| `SDatePicker` | md | lg |
|
|
1091
|
+
| `SDateRangePicker` | lg | xl |
|
|
1092
|
+
| `STimePicker` | md | lg |
|
|
1093
|
+
| `STimeRangePicker` | md | lg (오전/오후 표시는 두 사이즈 모두 lg) |
|
|
1094
|
+
|
|
1095
|
+
`SDateRangePicker` 가 한 등급씩 위인 것은 값이 `YYYY-MM-DD ~ YYYY-MM-DD` 로 두 배가 넘기 때문이다. 같은 이유로 `STimeRangePicker` 의 오전/오후 모드도 sm 에서 한 등급 위를 쓴다 — 그 모드의 최소 폭이 md 등급을 이미 넘어, 그대로 두면 하한이 상한을 넘어 상한이 무력해진다.
|
|
1022
1096
|
|
|
1023
1097
|
#### 3-7-5. SField 를 직접 쓰는 경우
|
|
1024
1098
|
|
|
@@ -1066,7 +1140,7 @@ const columns: STableColumn[] = [
|
|
|
1066
1140
|
|
|
1067
1141
|
- 페이지 골격에서 콘텐츠를 묶는 섹션은 **사실상 전부 `SSectionHeaderCard`** 다 (§4-4·§4-5). 제목·필수 표시·도움말·헤더 우측 액션이 전부 여기 붙는다.
|
|
1068
1142
|
- **카드 안에 카드를 겹치지 않는다.** 섹션 안을 더 나눠야 하면 `SDivider` 로 끊거나(§3-6) 섹션을 둘로 분리한다.
|
|
1069
|
-
- 안쪽 여백은 `SSectionHeaderCard
|
|
1143
|
+
- 안쪽 여백은 `SSectionHeaderCard` 의 `padding` prop 으로 준다 — `p-sd-*` 를 직접 주지 않는다 (§2-2).
|
|
1070
1144
|
|
|
1071
1145
|
#### 3-7-9. SLinearProgress vs SCircleProgress
|
|
1072
1146
|
|
|
@@ -1138,15 +1212,27 @@ export default function AppShell({
|
|
|
1138
1212
|
children,
|
|
1139
1213
|
header,
|
|
1140
1214
|
scrollEndSpacing,
|
|
1141
|
-
|
|
1215
|
+
contentHeight,
|
|
1216
|
+
}: {
|
|
1217
|
+
children: React.ReactNode;
|
|
1218
|
+
header?: SPageHeaderProps;
|
|
1219
|
+
scrollEndSpacing?: boolean;
|
|
1220
|
+
contentHeight?: SPageContentHeight;
|
|
1221
|
+
}) {
|
|
1142
1222
|
return (
|
|
1143
1223
|
<SLayout type="box" header="fix">
|
|
1144
1224
|
{/* type/header/folded 는 SLayout 에만 준다 — SGnb 는 context 에서 읽는다 */}
|
|
1145
1225
|
<SGnb items={MENU} value={current} onValueChange={navigate} logo={<Logo />} />
|
|
1146
1226
|
{/* 콘텐츠 패딩은 SPage 가 토큰으로 넣는다 — p-sd-* 로 덮어쓰지 않는다 */}
|
|
1147
1227
|
{/* 스크롤 끝 여백도 SPage 가 넣는다. 끄는 건 페이지네이션 있는 목록뿐이라 페이지가 정한다 */}
|
|
1228
|
+
{/* 본문이 남은 높이를 채우는 목록 페이지는 contentHeight="fill" 을 넘긴다 (§4-2) */}
|
|
1148
1229
|
{/* header 는 페이지마다 달라 AppShell 이 그대로 받아 넘긴다 — 페이지 제목은 여기서 만들지 않는다 */}
|
|
1149
|
-
<SPage
|
|
1230
|
+
<SPage
|
|
1231
|
+
background="frame"
|
|
1232
|
+
scrollEndSpacing={scrollEndSpacing}
|
|
1233
|
+
contentHeight={contentHeight}
|
|
1234
|
+
header={header}
|
|
1235
|
+
>
|
|
1150
1236
|
{children}
|
|
1151
1237
|
</SPage>
|
|
1152
1238
|
</SLayout>
|
|
@@ -1188,7 +1274,7 @@ import { SModalOutlet } from 'sellmate-design-system-react';
|
|
|
1188
1274
|
|
|
1189
1275
|
**최소 너비는 `SLayout` 이 보장한다 — 앱이 `min-w-*` 를 직접 주지 않는다.** 창이 최소 너비(`SLAYOUT_MIN_WIDTH`, GNB 포함한 전체 기준)보다 좁아지면 GNB·상단바는 제자리에 남고 **`SPage` 안에만 가로 스크롤이 생긴다.** 문서(브라우저 창)에는 가로 스크롤이 생기지 않는다. 그래서 셸을 감싸는 요소에 `min-width` 나 `overflow-x` 를 걸지 않는다 — 걸면 창 전체가 스크롤되어 GNB 가 화면 밖으로 밀린다.
|
|
1190
1276
|
|
|
1191
|
-
**셸의 `SPage` 는 모든 페이지가 공유하므로,
|
|
1277
|
+
**셸의 `SPage` 는 모든 페이지가 공유하므로, 페이지마다 달라지는 것은 페이지가 셸에 알려야 한다.** 위처럼 프레임 컴포넌트가 `scrollEndSpacing` · `contentHeight` 를 받아 그대로 넘기고, 페이지네이션이 있는 목록 페이지만 `contentHeight="fill"` 을 준다 (§4-2). 나머지 페이지는 넘기지 않으면 기본값(`auto`, 스크롤 끝 여백 켬)이 적용된다.
|
|
1192
1278
|
|
|
1193
1279
|
**상단바 배치는 `header` 가 정한다.** 요소 순서가 달라지므로 슬롯을 채우기 전에 어느 쪽인지부터 정한다.
|
|
1194
1280
|
|
|
@@ -1246,7 +1332,9 @@ import { SModalOutlet } from 'sellmate-design-system-react';
|
|
|
1246
1332
|
- **페이지 제목 줄에는 이 페이지의 주요 액션을 두지 않는다.** 부가적인 것만 `header.slot` 에 `SButton size="sm"` 으로 온다 (§4-1 "페이지 헤더 사용 규칙").
|
|
1247
1333
|
- **주요 액션(등록 등)은 `STableBar` 의 `rightActions`** 에 둔다.
|
|
1248
1334
|
- **선택 상태 액션(선택 삭제 등)은 `STableBar` 의 `actions`** 에 둔다. `actions` 슬롯은 건수 요약이 있으면 앞에 구분선(`SDivider`)을 **자동으로** 넣으므로 직접 구분선을 만들지 않는다.
|
|
1249
|
-
- **페이지네이션이 있으면
|
|
1335
|
+
- **페이지네이션이 있으면 본문이 남은 높이를 채우게 한다** — `AppShell` 에 `contentHeight="fill"` 을 넘긴다. 페이지가 통째로 스크롤되면 페이지네이션이 화면 밖으로 밀려 "여기서 끝"이 읽히지 않는다. `fill` 이면 **표만 자기 안에서 스크롤하고 페이지네이션은 하단에 고정**된다.
|
|
1336
|
+
- 본문 루트에 `h-full min-h-0` 으로 세로 축을 잇고, 남은 높이를 먹을 `STable` 에 `min-h-0 flex-1` 을 준다. 이 사슬이 하나라도 끊기면 표가 높이를 못 잡는다.
|
|
1337
|
+
- `fill` 에서는 페이지가 스크롤하지 않으므로 **`scrollEndSpacing` 은 무시된다** — 따로 끄지 않는다 (§2-2).
|
|
1250
1338
|
|
|
1251
1339
|
```tsx
|
|
1252
1340
|
import {
|
|
@@ -1294,9 +1382,10 @@ export default function ProductListPage() {
|
|
|
1294
1382
|
// 이 페이지의 주요 액션이 아니라 부가 액션 — slot 은 sm 버튼으로만 채운다
|
|
1295
1383
|
slot: <SButton size="sm" color="neutral" outline label="이용 가이드" onClick={openGuide} />,
|
|
1296
1384
|
}}
|
|
1297
|
-
|
|
1385
|
+
contentHeight="fill" // 표가 남은 높이를 채우고 페이지네이션이 하단에 고정된다
|
|
1298
1386
|
>
|
|
1299
|
-
|
|
1387
|
+
{/* h-full min-h-0 → STable 의 min-h-0 flex-1 로 세로 축이 이어진다 */}
|
|
1388
|
+
<div className="flex h-full min-h-0 flex-col gap-sd-12">
|
|
1300
1389
|
{/* 필터 — search 를 켜면 우측에 검색 패널이 붙는다 */}
|
|
1301
1390
|
<SKeyValueTable
|
|
1302
1391
|
fields={filterFields}
|
|
@@ -1321,7 +1410,9 @@ export default function ProductListPage() {
|
|
|
1321
1410
|
}
|
|
1322
1411
|
/>
|
|
1323
1412
|
|
|
1413
|
+
{/* 남은 높이를 채우고 본문만 스크롤한다 — 페이지네이션 바는 표 안에서 하단 고정 */}
|
|
1324
1414
|
<STable
|
|
1415
|
+
className="min-h-0 flex-1"
|
|
1325
1416
|
columns={columns}
|
|
1326
1417
|
rows={rows}
|
|
1327
1418
|
rowKey="id"
|
|
@@ -1407,7 +1498,7 @@ export default function ProductCreatePage() {
|
|
|
1407
1498
|
|
|
1408
1499
|
- 조회 값은 `type: 'text'` 행으로 표시한다. **상태·분류 태그도 별도 영역이 아니라 표의 한 행**으로 넣는다 (`render` 에 `STag`).
|
|
1409
1500
|
- 행이 많아지면 **유형별로 섹션을 나누고, 각 섹션을 `SSectionHeaderCard` 로 감싼다.**
|
|
1410
|
-
|
|
1501
|
+
섹션 제목은 `title` prop 으로, 바디 여백은 `padding` prop 으로 준다.
|
|
1411
1502
|
- **수정·삭제 버튼은 하단에 둔다.** 내용이 짧아 우측 상단에 두는 변형도 있으나 기본은 하단이다.
|
|
1412
1503
|
|
|
1413
1504
|
```tsx
|
|
@@ -1440,24 +1531,18 @@ export default function ProductDetailPage() {
|
|
|
1440
1531
|
// 목록에서 들어온 상세 페이지 — onBack 으로 뒤로가기를 준다
|
|
1441
1532
|
<AppShell header={{ fix: true, title: '클래식 셔츠', onBack: goList }}>
|
|
1442
1533
|
<div className="flex flex-col gap-sd-12">
|
|
1443
|
-
<SSectionHeaderCard>
|
|
1444
|
-
<
|
|
1445
|
-
<SSectionHeaderCard.Body>
|
|
1446
|
-
<SKeyValueTable fields={basicFields} values={product} />
|
|
1447
|
-
</SSectionHeaderCard.Body>
|
|
1534
|
+
<SSectionHeaderCard title="기본 정보" marker thickness="accent">
|
|
1535
|
+
<SKeyValueTable fields={basicFields} values={product} />
|
|
1448
1536
|
</SSectionHeaderCard>
|
|
1449
1537
|
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
/>
|
|
1458
|
-
<SSectionHeaderCard.Body>
|
|
1459
|
-
<SKeyValueTable fields={priceFields} values={product} />
|
|
1460
|
-
</SSectionHeaderCard.Body>
|
|
1538
|
+
{/* 헤더 우측에 액션이 필요하면 slot 을 쓴다 */}
|
|
1539
|
+
<SSectionHeaderCard
|
|
1540
|
+
title="가격 정보"
|
|
1541
|
+
marker
|
|
1542
|
+
helpText={['부가세 포함 금액입니다.']}
|
|
1543
|
+
slot={<SButton size="sm" color="secondary" label="이력" onClick={openHistory} />}
|
|
1544
|
+
>
|
|
1545
|
+
<SKeyValueTable fields={priceFields} values={product} />
|
|
1461
1546
|
</SSectionHeaderCard>
|
|
1462
1547
|
|
|
1463
1548
|
{/* 액션은 하단 — 목록(되돌리기)은 왼쪽 끝, 실행 액션은 오른쪽 끝 */}
|
|
@@ -1506,8 +1591,8 @@ export default function ProductDetailPage() {
|
|
|
1506
1591
|
- [ ] 텍스트 회색 위계를 순차 적용했는가 (기본 → `text-fg-secondary` → `text-fg-tertiary`, 단계 건너뛰기 ❌)
|
|
1507
1592
|
- [ ] `SPage`·`SPopup` 의 기본 패딩을 `p-sd-*` 로 덮어쓰지 않았는가, 블록·섹션 **간격**이 `gap-sd-12` 인가 (`gap-sd-16`/`gap-sd-24` ❌ — 24 는 안쪽 여백에만 열린다)
|
|
1508
1593
|
- [ ] 섹션·패널의 안쪽 **여백**이 §2-2 판정과 맞는가 (덩어리 두 종류 → 16 / 세 종류 이상 → 24, 서면 16)
|
|
1509
|
-
- [ ] `SSectionHeaderCard
|
|
1510
|
-
- [ ] 자체 스크롤하는 패널의 하단에 `pb-[var(--cmp-pageBody-padding-scrollEnd)]` 이 있는가, 페이지네이션 있는 목록에서 `
|
|
1594
|
+
- [ ] `SSectionHeaderCard` 의 여백을 `p-sd-*` 가 아니라 `padding` prop 으로 줬는가
|
|
1595
|
+
- [ ] 자체 스크롤하는 패널의 하단에 `pb-[var(--cmp-pageBody-padding-scrollEnd)]` 이 있는가, 페이지네이션 있는 목록에서 `contentHeight="fill"` 을 넘기고 `h-full min-h-0` → `STable` 의 `min-h-0 flex-1` 사슬을 이었는가
|
|
1511
1596
|
- [ ] 같은 컴포넌트를 나열할 때 §2-2 그룹 간격을 썼는가 (체크박스 가로 `gap-sd-24` 등)
|
|
1512
1597
|
- [ ] 페이지가 §4의 표준 골격에서 시작했는가
|
|
1513
1598
|
- [ ] `header.fix` 가 프로젝트 전체와 같은 값인가 (다른 페이지와 다르게 섞어 쓰지 않았는가, §4-1)
|
package/dist/styles.css
CHANGED
|
@@ -1026,15 +1026,15 @@
|
|
|
1026
1026
|
.h-sd-48 {
|
|
1027
1027
|
height: var(--spacing-sd-48);
|
|
1028
1028
|
}
|
|
1029
|
+
.max-h-\[85dvh\] {
|
|
1030
|
+
max-height: 85dvh;
|
|
1031
|
+
}
|
|
1029
1032
|
.max-h-\[220px\] {
|
|
1030
1033
|
max-height: 220px;
|
|
1031
1034
|
}
|
|
1032
1035
|
.max-h-\[240px\] {
|
|
1033
1036
|
max-height: 240px;
|
|
1034
1037
|
}
|
|
1035
|
-
.max-h-\[calc\(100dvh-48px\)\] {
|
|
1036
|
-
max-height: calc(100dvh - 48px);
|
|
1037
|
-
}
|
|
1038
1038
|
.min-h-\(--cmp-chipInput-md-minHeight\) {
|
|
1039
1039
|
min-height: var(--cmp-chipInput-md-minHeight);
|
|
1040
1040
|
}
|
|
@@ -1071,8 +1071,8 @@
|
|
|
1071
1071
|
.min-h-\[364px\] {
|
|
1072
1072
|
min-height: 364px;
|
|
1073
1073
|
}
|
|
1074
|
-
.min-h-\[min\(320px\,
|
|
1075
|
-
min-height: min(320px,
|
|
1074
|
+
.min-h-\[min\(320px\,85dvh\)\] {
|
|
1075
|
+
min-height: min(320px, 85dvh);
|
|
1076
1076
|
}
|
|
1077
1077
|
.min-h-\[var\(--cmp-datepicker-calendar-day-circle-size\)\] {
|
|
1078
1078
|
min-height: var(--cmp-datepicker-calendar-day-circle-size);
|
|
@@ -1179,6 +1179,9 @@
|
|
|
1179
1179
|
.w-\[calc\(14px\+var\(--cmp-tree-item-arrow-icon\)\)\] {
|
|
1180
1180
|
width: calc(14px + var(--cmp-tree-item-arrow-icon));
|
|
1181
1181
|
}
|
|
1182
|
+
.w-\[var\(--border-width-1\)\] {
|
|
1183
|
+
width: var(--border-width-1);
|
|
1184
|
+
}
|
|
1182
1185
|
.w-\[var\(--cmp-checkbox-size\)\] {
|
|
1183
1186
|
width: var(--cmp-checkbox-size);
|
|
1184
1187
|
}
|
|
@@ -1191,6 +1194,12 @@
|
|
|
1191
1194
|
.w-\[var\(--cmp-datepicker-calendar-day-width\)\] {
|
|
1192
1195
|
width: var(--cmp-datepicker-calendar-day-width);
|
|
1193
1196
|
}
|
|
1197
|
+
.w-\[var\(--cmp-datepicker-mode-year-width\)\] {
|
|
1198
|
+
width: var(--cmp-datepicker-mode-year-width);
|
|
1199
|
+
}
|
|
1200
|
+
.w-\[var\(--cmp-datepicker-mode-yearMonth-column-width\)\] {
|
|
1201
|
+
width: var(--cmp-datepicker-mode-yearMonth-column-width);
|
|
1202
|
+
}
|
|
1194
1203
|
.w-\[var\(--cmp-pagination-height\)\] {
|
|
1195
1204
|
width: var(--cmp-pagination-height);
|
|
1196
1205
|
}
|
|
@@ -1293,6 +1302,9 @@
|
|
|
1293
1302
|
.flex-shrink-0 {
|
|
1294
1303
|
flex-shrink: 0;
|
|
1295
1304
|
}
|
|
1305
|
+
.shrink {
|
|
1306
|
+
flex-shrink: 1;
|
|
1307
|
+
}
|
|
1296
1308
|
.shrink-0 {
|
|
1297
1309
|
flex-shrink: 0;
|
|
1298
1310
|
}
|
|
@@ -1605,6 +1617,12 @@
|
|
|
1605
1617
|
.gap-\[var\(--cmp-datepicker-calendar-time-unit-gap\)\] {
|
|
1606
1618
|
gap: var(--cmp-datepicker-calendar-time-unit-gap);
|
|
1607
1619
|
}
|
|
1620
|
+
.gap-\[var\(--cmp-datepicker-mode-item-gap\)\] {
|
|
1621
|
+
gap: var(--cmp-datepicker-mode-item-gap);
|
|
1622
|
+
}
|
|
1623
|
+
.gap-\[var\(--cmp-datepicker-mode-yearMonth-gap\)\] {
|
|
1624
|
+
gap: var(--cmp-datepicker-mode-yearMonth-gap);
|
|
1625
|
+
}
|
|
1608
1626
|
.gap-\[var\(--cmp-filepicker-md-gap\)\] {
|
|
1609
1627
|
gap: var(--cmp-filepicker-md-gap);
|
|
1610
1628
|
}
|
|
@@ -1750,6 +1768,9 @@
|
|
|
1750
1768
|
.overflow-y-hidden {
|
|
1751
1769
|
overflow-y: hidden;
|
|
1752
1770
|
}
|
|
1771
|
+
.overscroll-contain {
|
|
1772
|
+
overscroll-behavior: contain;
|
|
1773
|
+
}
|
|
1753
1774
|
.rounded {
|
|
1754
1775
|
border-radius: 0.25rem;
|
|
1755
1776
|
}
|
|
@@ -1798,6 +1819,9 @@
|
|
|
1798
1819
|
.rounded-\[var\(--cmp-datepicker-calendar-time-radius\)\] {
|
|
1799
1820
|
border-radius: var(--cmp-datepicker-calendar-time-radius);
|
|
1800
1821
|
}
|
|
1822
|
+
.rounded-\[var\(--cmp-datepicker-mode-radius\)\] {
|
|
1823
|
+
border-radius: var(--cmp-datepicker-mode-radius);
|
|
1824
|
+
}
|
|
1801
1825
|
.rounded-\[var\(--cmp-datepicker-sm-radius\)\] {
|
|
1802
1826
|
border-radius: var(--cmp-datepicker-sm-radius);
|
|
1803
1827
|
}
|
|
@@ -1969,9 +1993,6 @@
|
|
|
1969
1993
|
--tw-border-style: solid;
|
|
1970
1994
|
border-style: solid;
|
|
1971
1995
|
}
|
|
1972
|
-
.\!border-\[\#93C4FF\] {
|
|
1973
|
-
border-color: #93C4FF !important;
|
|
1974
|
-
}
|
|
1975
1996
|
.\!border-border-accentLight {
|
|
1976
1997
|
border-color: var(--color-border-accentLight) !important;
|
|
1977
1998
|
}
|
|
@@ -2245,6 +2266,12 @@
|
|
|
2245
2266
|
.bg-\[var\(--cmp-datepicker-calendar-time-bg-selected\)\] {
|
|
2246
2267
|
background-color: var(--cmp-datepicker-calendar-time-bg-selected);
|
|
2247
2268
|
}
|
|
2269
|
+
.bg-\[var\(--cmp-datepicker-mode-bg\)\] {
|
|
2270
|
+
background-color: var(--cmp-datepicker-mode-bg);
|
|
2271
|
+
}
|
|
2272
|
+
.bg-\[var\(--cmp-datepicker-mode-item-bg-default\)\] {
|
|
2273
|
+
background-color: var(--cmp-datepicker-mode-item-bg-default);
|
|
2274
|
+
}
|
|
2248
2275
|
.bg-\[var\(--cmp-drawer-bg\)\] {
|
|
2249
2276
|
background-color: var(--cmp-drawer-bg);
|
|
2250
2277
|
}
|
|
@@ -2545,6 +2572,9 @@
|
|
|
2545
2572
|
.px-\[var\(--cmp-datepicker-calendar-time-paddingX\)\] {
|
|
2546
2573
|
padding-inline: var(--cmp-datepicker-calendar-time-paddingX);
|
|
2547
2574
|
}
|
|
2575
|
+
.px-\[var\(--cmp-datepicker-mode-item-paddingX\)\] {
|
|
2576
|
+
padding-inline: var(--cmp-datepicker-mode-item-paddingX);
|
|
2577
|
+
}
|
|
2548
2578
|
.px-\[var\(--cmp-guide-button-paddingX\)\] {
|
|
2549
2579
|
padding-inline: var(--cmp-guide-button-paddingX);
|
|
2550
2580
|
}
|
|
@@ -2662,6 +2692,9 @@
|
|
|
2662
2692
|
.py-\[var\(--cmp-datepicker-calendar-time-paddingY\)\] {
|
|
2663
2693
|
padding-block: var(--cmp-datepicker-calendar-time-paddingY);
|
|
2664
2694
|
}
|
|
2695
|
+
.py-\[var\(--cmp-datepicker-mode-item-paddingY\)\] {
|
|
2696
|
+
padding-block: var(--cmp-datepicker-mode-item-paddingY);
|
|
2697
|
+
}
|
|
2665
2698
|
.py-\[var\(--cmp-overlay-footer-paddingY\)\] {
|
|
2666
2699
|
padding-block: var(--cmp-overlay-footer-paddingY);
|
|
2667
2700
|
}
|
|
@@ -2776,6 +2809,9 @@
|
|
|
2776
2809
|
.align-middle {
|
|
2777
2810
|
vertical-align: middle;
|
|
2778
2811
|
}
|
|
2812
|
+
.font-base {
|
|
2813
|
+
font-family: var(--font-base);
|
|
2814
|
+
}
|
|
2779
2815
|
.text-base {
|
|
2780
2816
|
font-size: var(--text-base);
|
|
2781
2817
|
line-height: var(--tw-leading, var(--text-base--line-height));
|
|
@@ -3074,6 +3110,15 @@
|
|
|
3074
3110
|
.text-\[color\:var\(--cmp-datepicker-calendar-week-color\)\] {
|
|
3075
3111
|
color: var(--cmp-datepicker-calendar-week-color);
|
|
3076
3112
|
}
|
|
3113
|
+
.text-\[color\:var\(--cmp-datepicker-mode-item-content-default\)\] {
|
|
3114
|
+
color: var(--cmp-datepicker-mode-item-content-default);
|
|
3115
|
+
}
|
|
3116
|
+
.text-\[color\:var\(--cmp-datepicker-mode-item-content-disabled\)\] {
|
|
3117
|
+
color: var(--cmp-datepicker-mode-item-content-disabled);
|
|
3118
|
+
}
|
|
3119
|
+
.text-\[color\:var\(--cmp-datepicker-mode-item-content-selected\)\] {
|
|
3120
|
+
color: var(--cmp-datepicker-mode-item-content-selected);
|
|
3121
|
+
}
|
|
3077
3122
|
.text-\[color\:var\(--cmp-datepicker-text-default\)\] {
|
|
3078
3123
|
color: var(--cmp-datepicker-text-default);
|
|
3079
3124
|
}
|
|
@@ -3648,6 +3693,12 @@
|
|
|
3648
3693
|
content: var(--tw-content);
|
|
3649
3694
|
}
|
|
3650
3695
|
}
|
|
3696
|
+
.last\:border-b-0 {
|
|
3697
|
+
&:last-child {
|
|
3698
|
+
border-bottom-style: var(--tw-border-style);
|
|
3699
|
+
border-bottom-width: 0px;
|
|
3700
|
+
}
|
|
3701
|
+
}
|
|
3651
3702
|
.autofill\:\[box-shadow\:0_0_0_1000px_var\(--sys-color-field-bg-default\)_inset\] {
|
|
3652
3703
|
&:autofill {
|
|
3653
3704
|
box-shadow: 0 0 0 1000px var(--sys-color-field-bg-default) inset;
|
|
@@ -3855,6 +3906,13 @@
|
|
|
3855
3906
|
}
|
|
3856
3907
|
}
|
|
3857
3908
|
}
|
|
3909
|
+
.hover\:bg-\[var\(--cmp-datepicker-mode-item-bg-hover\)\] {
|
|
3910
|
+
&:hover {
|
|
3911
|
+
@media (hover: hover) {
|
|
3912
|
+
background-color: var(--cmp-datepicker-mode-item-bg-hover);
|
|
3913
|
+
}
|
|
3914
|
+
}
|
|
3915
|
+
}
|
|
3858
3916
|
.hover\:bg-\[var\(--cmp-listBoxItem-bg-hover\)\] {
|
|
3859
3917
|
&:hover {
|
|
3860
3918
|
@media (hover: hover) {
|
|
@@ -3950,6 +4008,13 @@
|
|
|
3950
4008
|
}
|
|
3951
4009
|
}
|
|
3952
4010
|
}
|
|
4011
|
+
.hover\:text-\[color\:var\(--cmp-datepicker-mode-item-content-hover\)\] {
|
|
4012
|
+
&:hover {
|
|
4013
|
+
@media (hover: hover) {
|
|
4014
|
+
color: var(--cmp-datepicker-mode-item-content-hover);
|
|
4015
|
+
}
|
|
4016
|
+
}
|
|
4017
|
+
}
|
|
3953
4018
|
.hover\:text-\[color\:var\(--cmp-listBoxItem-content-hover\)\] {
|
|
3954
4019
|
&:hover {
|
|
3955
4020
|
@media (hover: hover) {
|
|
@@ -4417,6 +4482,11 @@
|
|
|
4417
4482
|
border-color: var(--color-border-strong);
|
|
4418
4483
|
}
|
|
4419
4484
|
}
|
|
4485
|
+
.\[\&\>\*\]\:w-full {
|
|
4486
|
+
&>* {
|
|
4487
|
+
width: 100%;
|
|
4488
|
+
}
|
|
4489
|
+
}
|
|
4420
4490
|
.\[\&\>\*\]\:border-b {
|
|
4421
4491
|
&>* {
|
|
4422
4492
|
border-bottom-style: var(--tw-border-style);
|
|
@@ -4996,6 +5066,20 @@
|
|
|
4996
5066
|
--cmp-datepicker-calendar-time-gap: 12px;
|
|
4997
5067
|
--cmp-datepicker-calendar-time-section-gap: 12px;
|
|
4998
5068
|
--cmp-datepicker-calendar-time-unit-gap: 2px;
|
|
5069
|
+
--cmp-datepicker-mode-bg: #FFFFFF;
|
|
5070
|
+
--cmp-datepicker-mode-radius: 4px;
|
|
5071
|
+
--cmp-datepicker-mode-year-width: 120px;
|
|
5072
|
+
--cmp-datepicker-mode-yearMonth-column-width: 64px;
|
|
5073
|
+
--cmp-datepicker-mode-yearMonth-gap: 4px;
|
|
5074
|
+
--cmp-datepicker-mode-item-paddingY: 4px;
|
|
5075
|
+
--cmp-datepicker-mode-item-paddingX: 12px;
|
|
5076
|
+
--cmp-datepicker-mode-item-gap: 8px;
|
|
5077
|
+
--cmp-datepicker-mode-item-bg-default: #FFFFFF;
|
|
5078
|
+
--cmp-datepicker-mode-item-bg-hover: #0075FF;
|
|
5079
|
+
--cmp-datepicker-mode-item-content-default: #222222;
|
|
5080
|
+
--cmp-datepicker-mode-item-content-hover: #FFFFFF;
|
|
5081
|
+
--cmp-datepicker-mode-item-content-disabled: #888888;
|
|
5082
|
+
--cmp-datepicker-mode-item-content-selected: #0075FF;
|
|
4999
5083
|
--cmp-chip-height: 24px;
|
|
5000
5084
|
--cmp-chip-paddingX: 8px;
|
|
5001
5085
|
--cmp-chip-gap: 4px;
|
package/dist/theme.css
CHANGED
|
@@ -893,6 +893,20 @@
|
|
|
893
893
|
--cmp-datepicker-calendar-time-gap: 12px;
|
|
894
894
|
--cmp-datepicker-calendar-time-section-gap: 12px;
|
|
895
895
|
--cmp-datepicker-calendar-time-unit-gap: 2px;
|
|
896
|
+
--cmp-datepicker-mode-bg: #FFFFFF;
|
|
897
|
+
--cmp-datepicker-mode-radius: 4px;
|
|
898
|
+
--cmp-datepicker-mode-year-width: 120px;
|
|
899
|
+
--cmp-datepicker-mode-yearMonth-column-width: 64px;
|
|
900
|
+
--cmp-datepicker-mode-yearMonth-gap: 4px;
|
|
901
|
+
--cmp-datepicker-mode-item-paddingY: 4px;
|
|
902
|
+
--cmp-datepicker-mode-item-paddingX: 12px;
|
|
903
|
+
--cmp-datepicker-mode-item-gap: 8px;
|
|
904
|
+
--cmp-datepicker-mode-item-bg-default: #FFFFFF;
|
|
905
|
+
--cmp-datepicker-mode-item-bg-hover: #0075FF;
|
|
906
|
+
--cmp-datepicker-mode-item-content-default: #222222;
|
|
907
|
+
--cmp-datepicker-mode-item-content-hover: #FFFFFF;
|
|
908
|
+
--cmp-datepicker-mode-item-content-disabled: #888888;
|
|
909
|
+
--cmp-datepicker-mode-item-content-selected: #0075FF;
|
|
896
910
|
--cmp-chip-height: 24px;
|
|
897
911
|
--cmp-chip-paddingX: 8px;
|
|
898
912
|
--cmp-chip-gap: 4px;
|