@conscience-technology/ctds 0.0.0-stage → 0.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.
- package/README.md +128 -2
- package/assets/components/AppFrame/AppFrame.module.css +177 -0
- package/assets/components/AppFrame/AppFrame.tsx +93 -0
- package/assets/components/AppFrame/index.ts +6 -0
- package/assets/components/AttachmentChip/AttachmentChip.module.css +71 -0
- package/assets/components/AttachmentChip/AttachmentChip.tsx +74 -0
- package/assets/components/AttachmentChip/index.ts +2 -0
- package/assets/components/AttachmentThumb/AttachmentThumb.module.css +107 -0
- package/assets/components/AttachmentThumb/AttachmentThumb.tsx +91 -0
- package/assets/components/AttachmentThumb/index.ts +2 -0
- package/assets/components/Avatar/Avatar.module.css +167 -0
- package/assets/components/Avatar/Avatar.tsx +228 -0
- package/assets/components/Avatar/index.ts +2 -0
- package/assets/components/AvatarUpload/AvatarUpload.module.css +130 -0
- package/assets/components/AvatarUpload/AvatarUpload.tsx +139 -0
- package/assets/components/AvatarUpload/index.ts +2 -0
- package/assets/components/Badge/Badge.module.css +76 -0
- package/assets/components/Badge/Badge.tsx +68 -0
- package/assets/components/Badge/index.ts +2 -0
- package/assets/components/Breadcrumb/Breadcrumb.module.css +213 -0
- package/assets/components/Breadcrumb/Breadcrumb.tsx +279 -0
- package/assets/components/Breadcrumb/index.ts +8 -0
- package/assets/components/Button/Button.module.css +216 -0
- package/assets/components/Button/Button.tsx +149 -0
- package/assets/components/Button/index.ts +2 -0
- package/assets/components/Callout/Callout.module.css +146 -0
- package/assets/components/Callout/Callout.tsx +138 -0
- package/assets/components/Callout/index.ts +2 -0
- package/assets/components/ChatInput/ChatInput.module.css +241 -0
- package/assets/components/ChatInput/ChatInput.tsx +322 -0
- package/assets/components/ChatInput/ModelSelector.tsx +40 -0
- package/assets/components/ChatInput/SendButton.tsx +41 -0
- package/assets/components/ChatInput/index.ts +10 -0
- package/assets/components/Checkbox/Checkbox.module.css +66 -0
- package/assets/components/Checkbox/Checkbox.tsx +36 -0
- package/assets/components/Checkbox/index.ts +2 -0
- package/assets/components/Chip/Chip.module.css +128 -0
- package/assets/components/Chip/Chip.tsx +103 -0
- package/assets/components/Chip/index.ts +2 -0
- package/assets/components/ChoiceCard/ChoiceCard.module.css +142 -0
- package/assets/components/ChoiceCard/ChoiceCard.tsx +132 -0
- package/assets/components/ChoiceCard/index.ts +2 -0
- package/assets/components/ContextMenu/ContextMenu.module.css +102 -0
- package/assets/components/ContextMenu/ContextMenu.tsx +392 -0
- package/assets/components/ContextMenu/index.ts +9 -0
- package/assets/components/DatePicker/Calendar.tsx +234 -0
- package/assets/components/DatePicker/DESIGN_NOTES.md +106 -0
- package/assets/components/DatePicker/DESIGN_NOTES_TIME.md +125 -0
- package/assets/components/DatePicker/DatePicker.module.css +295 -0
- package/assets/components/DatePicker/DatePicker.tsx +387 -0
- package/assets/components/DatePicker/TimeSelector.tsx +69 -0
- package/assets/components/DatePicker/index.ts +8 -0
- package/assets/components/DatePicker/presets.ts +80 -0
- package/assets/components/DatePicker/utils.ts +148 -0
- package/assets/components/Disclosure/Disclosure.module.css +73 -0
- package/assets/components/Disclosure/Disclosure.tsx +129 -0
- package/assets/components/Disclosure/index.ts +6 -0
- package/assets/components/Drawer/Drawer.module.css +257 -0
- package/assets/components/Drawer/Drawer.tsx +126 -0
- package/assets/components/Drawer/index.ts +7 -0
- package/assets/components/EmptyState/EmptyState.module.css +102 -0
- package/assets/components/EmptyState/EmptyState.tsx +80 -0
- package/assets/components/EmptyState/index.ts +2 -0
- package/assets/components/FileIcon/FileIcon.module.css +66 -0
- package/assets/components/FileIcon/FileIcon.tsx +84 -0
- package/assets/components/FileIcon/fileExtMap.ts +112 -0
- package/assets/components/FileIcon/index.ts +9 -0
- package/assets/components/FilterButton/FilterButton.module.css +130 -0
- package/assets/components/FilterButton/FilterButton.tsx +94 -0
- package/assets/components/FilterButton/index.ts +2 -0
- package/assets/components/GalleryItem/GalleryItem.module.css +220 -0
- package/assets/components/GalleryItem/GalleryItem.tsx +163 -0
- package/assets/components/GalleryItem/index.ts +7 -0
- package/assets/components/Icon/Icon.tsx +616 -0
- package/assets/components/Icon/context.tsx +39 -0
- package/assets/components/Icon/index.ts +4 -0
- package/assets/components/IconButton/IconButton.module.css +109 -0
- package/assets/components/IconButton/IconButton.tsx +110 -0
- package/assets/components/IconButton/index.ts +2 -0
- package/assets/components/Input/Input.module.css +338 -0
- package/assets/components/Input/Input.tsx +371 -0
- package/assets/components/Input/index.ts +2 -0
- package/assets/components/ListItem/ListItem.module.css +318 -0
- package/assets/components/ListItem/ListItem.tsx +262 -0
- package/assets/components/ListItem/index.ts +9 -0
- package/assets/components/MenuItem/MenuItem.module.css +437 -0
- package/assets/components/MenuItem/MenuItem.tsx +529 -0
- package/assets/components/MenuItem/index.ts +8 -0
- package/assets/components/MetricCard/MetricCard.module.css +153 -0
- package/assets/components/MetricCard/MetricCard.tsx +140 -0
- package/assets/components/MetricCard/index.ts +2 -0
- package/assets/components/Modal/Modal.module.css +175 -0
- package/assets/components/Modal/Modal.tsx +98 -0
- package/assets/components/Modal/index.ts +2 -0
- package/assets/components/Onboarding/DocsIndex.tsx +82 -0
- package/assets/components/Onboarding/LayoutBuilder.tsx +160 -0
- package/assets/components/Onboarding/Onboarding.module.css +1394 -0
- package/assets/components/Onboarding/OnboardingAxisPanel.tsx +515 -0
- package/assets/components/Onboarding/OnboardingPage.tsx +1193 -0
- package/assets/components/Onboarding/PresetsGallery.tsx +65 -0
- package/assets/components/Onboarding/actions.ts +250 -0
- package/assets/components/Onboarding/index.ts +8 -0
- package/assets/components/Onboarding/palette.css +40 -0
- package/assets/components/Onboarding/wizardData.ts +265 -0
- package/assets/components/Pagination/Pagination.module.css +82 -0
- package/assets/components/Pagination/Pagination.tsx +248 -0
- package/assets/components/Pagination/index.ts +6 -0
- package/assets/components/ProgressBar/ProgressBar.module.css +64 -0
- package/assets/components/ProgressBar/ProgressBar.tsx +54 -0
- package/assets/components/ProgressBar/index.ts +2 -0
- package/assets/components/QuotationBar/QuotationBar.module.css +61 -0
- package/assets/components/QuotationBar/QuotationBar.tsx +48 -0
- package/assets/components/QuotationBar/index.ts +2 -0
- package/assets/components/Radio/Radio.module.css +63 -0
- package/assets/components/Radio/Radio.tsx +33 -0
- package/assets/components/Radio/index.ts +2 -0
- package/assets/components/Select/Select.module.css +151 -0
- package/assets/components/Select/Select.tsx +425 -0
- package/assets/components/Select/index.ts +10 -0
- package/assets/components/SelectableCard/SelectableCard.module.css +177 -0
- package/assets/components/SelectableCard/SelectableCard.tsx +83 -0
- package/assets/components/SelectableCard/index.ts +2 -0
- package/assets/components/Shortcut/Shortcut.module.css +56 -0
- package/assets/components/Shortcut/Shortcut.tsx +156 -0
- package/assets/components/Shortcut/index.ts +2 -0
- package/assets/components/Sidebar/Sidebar.module.css +242 -0
- package/assets/components/Sidebar/Sidebar.tsx +264 -0
- package/assets/components/Sidebar/index.ts +7 -0
- package/assets/components/SidebarSplit/SidebarSplit.module.css +126 -0
- package/assets/components/SidebarSplit/SidebarSplit.tsx +222 -0
- package/assets/components/SidebarSplit/index.ts +6 -0
- package/assets/components/Slider/Slider.module.css +120 -0
- package/assets/components/Slider/Slider.tsx +88 -0
- package/assets/components/Slider/index.ts +2 -0
- package/assets/components/SplitButton/SplitButton.module.css +190 -0
- package/assets/components/SplitButton/SplitButton.tsx +145 -0
- package/assets/components/SplitButton/index.ts +6 -0
- package/assets/components/Stepper/Stepper.module.css +182 -0
- package/assets/components/Stepper/Stepper.tsx +185 -0
- package/assets/components/Stepper/index.ts +2 -0
- package/assets/components/Switch/Switch.module.css +116 -0
- package/assets/components/Switch/Switch.tsx +58 -0
- package/assets/components/Switch/index.ts +2 -0
- package/assets/components/TableCell/TableCell.module.css +137 -0
- package/assets/components/TableCell/TableCellAvatar.tsx +42 -0
- package/assets/components/TableCell/TableCellBadge.tsx +23 -0
- package/assets/components/TableCell/TableCellIcon.tsx +39 -0
- package/assets/components/TableCell/TableCellImage.tsx +49 -0
- package/assets/components/TableCell/TableCellLink.tsx +33 -0
- package/assets/components/TableCell/TableCellMeter.tsx +55 -0
- package/assets/components/TableCell/TableCellNumber.tsx +43 -0
- package/assets/components/TableCell/TableCellText.tsx +30 -0
- package/assets/components/TableCell/index.ts +23 -0
- package/assets/components/TableHeader/TableHeader.module.css +287 -0
- package/assets/components/TableHeader/TableHeader.tsx +590 -0
- package/assets/components/TableHeader/index.ts +9 -0
- package/assets/components/TableRow/TableRow.module.css +290 -0
- package/assets/components/TableRow/TableRow.tsx +253 -0
- package/assets/components/TableRow/index.ts +8 -0
- package/assets/components/TableRowEdit/TableRowEdit.module.css +126 -0
- package/assets/components/TableRowEdit/TableRowEdit.tsx +247 -0
- package/assets/components/TableRowEdit/index.ts +2 -0
- package/assets/components/TableRowSelect/TableRowSelect.module.css +23 -0
- package/assets/components/TableRowSelect/TableRowSelect.tsx +175 -0
- package/assets/components/TableRowSelect/index.ts +2 -0
- package/assets/components/Tabs/Tabs.module.css +234 -0
- package/assets/components/Tabs/Tabs.tsx +426 -0
- package/assets/components/Tabs/index.ts +9 -0
- package/assets/components/Textarea/Textarea.module.css +318 -0
- package/assets/components/Textarea/Textarea.tsx +426 -0
- package/assets/components/Textarea/index.ts +7 -0
- package/assets/components/ThemeController.tsx +271 -0
- package/assets/components/TimePicker/TimePicker.module.css +317 -0
- package/assets/components/TimePicker/TimePicker.tsx +821 -0
- package/assets/components/TimePicker/index.ts +8 -0
- package/assets/components/TimePicker/utils.ts +115 -0
- package/assets/components/Toast/Toast.module.css +264 -0
- package/assets/components/Toast/Toast.tsx +243 -0
- package/assets/components/Toast/index.ts +15 -0
- package/assets/components/Toolbar/Toolbar.module.css +72 -0
- package/assets/components/Toolbar/Toolbar.tsx +75 -0
- package/assets/components/Toolbar/index.ts +2 -0
- package/assets/components/Tooltip/Tooltip.module.css +42 -0
- package/assets/components/Tooltip/Tooltip.tsx +332 -0
- package/assets/components/Tooltip/index.ts +2 -0
- package/assets/components/Topbar/Topbar.module.css +26 -0
- package/assets/components/Topbar/Topbar.tsx +47 -0
- package/assets/components/Topbar/index.ts +2 -0
- package/assets/components/_cn.ts +3 -0
- package/assets/components/_color.ts +48 -0
- package/assets/components/_data.ts +659 -0
- package/assets/components/_utils.css +19 -0
- package/assets/components/axisOptions.ts +24 -0
- package/assets/components/tokens.css +742 -0
- package/assets/prompts/GUIDE.md +251 -0
- package/assets/prompts/OVERRIDE.md +170 -0
- package/assets/prompts/PRINCIPLES.md +130 -0
- package/assets/prompts/axes/density.md +38 -0
- package/assets/prompts/axes/font.md +36 -0
- package/assets/prompts/axes/hue.md +36 -0
- package/assets/prompts/axes/icon.md +48 -0
- package/assets/prompts/axes/mode.md +50 -0
- package/assets/prompts/axes/motion.md +77 -0
- package/assets/prompts/axes/palette.md +35 -0
- package/assets/prompts/axes/shape.md +33 -0
- package/assets/prompts/axes/voice.md +54 -0
- package/assets/prompts/components/README.md +84 -0
- package/assets/prompts/components/app-frame.md +94 -0
- package/assets/prompts/components/attachment-chip.md +46 -0
- package/assets/prompts/components/attachment-thumb.md +49 -0
- package/assets/prompts/components/avatar.md +86 -0
- package/assets/prompts/components/badge.md +104 -0
- package/assets/prompts/components/breadcrumb.md +77 -0
- package/assets/prompts/components/button.md +99 -0
- package/assets/prompts/components/callout.md +81 -0
- package/assets/prompts/components/chat-input.md +84 -0
- package/assets/prompts/components/checkbox.md +46 -0
- package/assets/prompts/components/chip.md +84 -0
- package/assets/prompts/components/choice-card.md +127 -0
- package/assets/prompts/components/context-menu.md +145 -0
- package/assets/prompts/components/date-picker.md +104 -0
- package/assets/prompts/components/drawer.md +152 -0
- package/assets/prompts/components/empty-state.md +69 -0
- package/assets/prompts/components/file-icon.md +73 -0
- package/assets/prompts/components/filter-button.md +42 -0
- package/assets/prompts/components/form-field.md +74 -0
- package/assets/prompts/components/gallery-item.md +158 -0
- package/assets/prompts/components/icon-button.md +82 -0
- package/assets/prompts/components/icon.md +68 -0
- package/assets/prompts/components/input.md +95 -0
- package/assets/prompts/components/list-item.md +235 -0
- package/assets/prompts/components/menu-item.md +234 -0
- package/assets/prompts/components/metric-card.md +132 -0
- package/assets/prompts/components/modal.md +131 -0
- package/assets/prompts/components/pagination.md +92 -0
- package/assets/prompts/components/progress-bar.md +61 -0
- package/assets/prompts/components/quotation-bar.md +39 -0
- package/assets/prompts/components/radio.md +41 -0
- package/assets/prompts/components/select.md +104 -0
- package/assets/prompts/components/selectable-card.md +67 -0
- package/assets/prompts/components/shortcut.md +76 -0
- package/assets/prompts/components/sidebar.md +107 -0
- package/assets/prompts/components/slider.md +89 -0
- package/assets/prompts/components/split-button.md +71 -0
- package/assets/prompts/components/stepper.md +93 -0
- package/assets/prompts/components/switch.md +86 -0
- package/assets/prompts/components/table-cell.md +87 -0
- package/assets/prompts/components/table-header.md +157 -0
- package/assets/prompts/components/table-row-edit.md +129 -0
- package/assets/prompts/components/table-row-select.md +82 -0
- package/assets/prompts/components/table-row.md +156 -0
- package/assets/prompts/components/tabs.md +122 -0
- package/assets/prompts/components/textarea.md +105 -0
- package/assets/prompts/components/toast.md +149 -0
- package/assets/prompts/components/tooltip.md +71 -0
- package/assets/prompts/components/topbar.md +148 -0
- package/assets/prompts/primitives/emerge.md +43 -0
- package/assets/prompts/primitives/fade.md +31 -0
- package/assets/prompts/primitives/scale.md +32 -0
- package/assets/prompts/primitives/scroll.md +75 -0
- package/assets/prompts/primitives/slide.md +31 -0
- package/assets/prompts/themes/_SCHEMA.md +135 -0
- package/assets/prompts/themes/_TEMPLATE.md +73 -0
- package/assets/prompts/themes/expressive.md +118 -0
- package/assets/prompts/themes/pure.md +87 -0
- package/assets/prompts/themes/spare.md +73 -0
- package/assets/prompts/tokens/breakpoint.md +29 -0
- package/assets/prompts/tokens/color.md +78 -0
- package/assets/prompts/tokens/radius.md +33 -0
- package/assets/prompts/tokens/shadow.md +35 -0
- package/assets/prompts/tokens/spacing.md +86 -0
- package/assets/prompts/tokens/typography.md +76 -0
- package/assets/prompts/tokens/z-index.md +35 -0
- package/assets/public/expressive.png +0 -0
- package/assets/public/pure.png +0 -0
- package/assets/public/spare.png +0 -0
- package/assets/skill/SKILL.md +36 -0
- package/bin/ctds.js +76 -0
- package/package.json +35 -4
- package/src/commands/init.js +215 -0
- package/src/commands/update.js +275 -0
- package/src/utils/assets.js +78 -0
- package/src/utils/deps.js +51 -0
- package/src/utils/detect.js +47 -0
- package/src/utils/diff.js +52 -0
- package/src/utils/hash.js +16 -0
- package/src/utils/log.js +41 -0
- package/src/utils/meta.js +73 -0
- package/src/utils/prompt.js +28 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# DatePicker — Reference Design Analysis
|
|
2
|
+
|
|
3
|
+
참고 이미지(모바일 팝오버 형태의 리마인더 데이트픽커)를 8축 관점으로 분해한 문서.
|
|
4
|
+
|
|
5
|
+
## 1. Container
|
|
6
|
+
|
|
7
|
+
- 흰 카드, `--radius-lg` 정도의 라운드
|
|
8
|
+
- `box-shadow` 약함, 배경은 회색 페이지 위에 떠있음
|
|
9
|
+
- 카드 안쪽 여백: 상하좌우 균일하게 약 `--space-4`
|
|
10
|
+
- 카드 내부 요소들은 세로 flow 하나: `[presets] → [monthHeader] → [weekdays] → [grid] → [footerActions]`
|
|
11
|
+
- 이들 사이 gap은 각기 다르지만 **같은 좌우 padding 라인**을 공유. 즉 preset chip의 좌측 모서리와 nav 버튼의 좌측 모서리와 그리드 첫 컬럼의 좌측 모서리가 **동일 수직선상에 정렬됨**.
|
|
12
|
+
|
|
13
|
+
## 2. Preset chips (상단)
|
|
14
|
+
|
|
15
|
+
- 3개(Today / Tomorrow / In 2 days). 왼쪽 정렬, `wrap` 허용.
|
|
16
|
+
- 각 chip:
|
|
17
|
+
- 높이는 `--control-h-sm`에 가까움 (32px)
|
|
18
|
+
- 배경 `--bg-subtle`, 텍스트 `--fg`
|
|
19
|
+
- 모서리 완전 라운드(필박스): `border-radius: 999px` (Shape 축에 종속되지 않는 100% 원형)
|
|
20
|
+
- 폰트 사이즈 `--text-sm`, weight `medium`
|
|
21
|
+
- chip 간격 `--space-2`
|
|
22
|
+
|
|
23
|
+
**우리 현재 상태와의 gap**: `Button size="sm" variant="secondary"` 사용 중. secondary 배경/색은 맞지만 border-radius가 `--radius-xs`. → **필박스 라운드로 override 필요**.
|
|
24
|
+
|
|
25
|
+
## 3. Month header
|
|
26
|
+
|
|
27
|
+
- 좌측 `<` IconButton, 우측 `>` IconButton, 가운데 월/년 텍스트
|
|
28
|
+
- IconButton은 **원형 흰 배경 + 얇은 회색 보더** (하지만 실제로 자세히 보면 그림자 없는 outline 형태, `--radius-full`)
|
|
29
|
+
- hover 시 살짝 배경 진해짐 정도
|
|
30
|
+
- 중요 포인트: `<` 버튼의 **left edge**가 그리드 첫 컬럼(Mo)의 left edge와 정확히 일치, `>` 버튼의 **right edge**가 마지막 컬럼(Su)의 right edge와 정확히 일치
|
|
31
|
+
- 즉 `monthHeader`는 `padding-inline: 0`이어야 하고 IconButton 사이즈는 셀 폭(=`--control-h-sm`)과 같아야 함
|
|
32
|
+
- 가운데 텍스트: `--text-sm`, weight `medium`, 색 `--fg`
|
|
33
|
+
|
|
34
|
+
**우리 현재 상태와의 gap**:
|
|
35
|
+
- monthHeader에 `padding-inline: var(--space-1)`가 걸려서 nav 버튼이 그리드 컬럼과 어긋남 → **제거**
|
|
36
|
+
- IconButton variant는 ghost인데 참고 이미지는 **outline + 원형** → 새 스타일 필요. IconButton의 variant 확장보다는, DatePicker 내부에서 className overlay로 처리하는 게 스코프 작음
|
|
37
|
+
- IconButton size=sm이면 width=`--control-h-sm`으로 셀 폭과 자동 일치 (이건 이미 맞음)
|
|
38
|
+
|
|
39
|
+
## 4. Weekday row
|
|
40
|
+
|
|
41
|
+
- 7컬럼 균등, gap 0
|
|
42
|
+
- 각 라벨은 셀 폭과 같은 **정사각 박스**, 텍스트 중앙정렬
|
|
43
|
+
- 색 `--fg-muted`, 폰트 `--text-xs`
|
|
44
|
+
- 요일 코드는 두 글자(Mo, Tu, ...). 우리는 한국어(일/월/화). 유지.
|
|
45
|
+
|
|
46
|
+
**우리 현재 상태와의 gap**: weekday 이미 aspect-ratio 1, gap 0 처리 완료. OK.
|
|
47
|
+
|
|
48
|
+
## 5. Day grid
|
|
49
|
+
|
|
50
|
+
- 7×N 격자, gap 0 (셀들이 서로 붙어있음)
|
|
51
|
+
- 각 셀은 정사각 `--control-h-sm` × `--control-h-sm`
|
|
52
|
+
- 셀 폰트: 숫자만, `--text-sm`, weight `regular`, 색 `--fg`
|
|
53
|
+
- outside month 색: 훨씬 옅음 (`--fg-subtle` 또는 더 옅게)
|
|
54
|
+
- **오늘**: primary 컬러 텍스트 + primary 얇은 1px 링(inset border) — 이미 반영
|
|
55
|
+
- 링의 모서리 radius는 셀 radius와 동일 (`--radius-sm`)
|
|
56
|
+
- **선택된 날짜**: primary 채움 원, 텍스트는 `--bg`
|
|
57
|
+
- 선택 셀의 모서리도 `--radius-sm` (참고 이미지 자세히 보면 완전 원은 아니고 약간 라운드된 사각)
|
|
58
|
+
- range 표시(우리 케이스): in-range 셀은 배경 `--hover`, 첫/끝은 primary 채움
|
|
59
|
+
|
|
60
|
+
**우리 현재 상태와의 gap**:
|
|
61
|
+
- dayCell aspect-ratio 1 완료, gap 0 완료
|
|
62
|
+
- 그러나 **셀 폭이 `--control-h-sm`으로 강제되지 않고, monthCol width가 이를 정확히 제공하는 경우에만 성립.** 지금 monthCol width가 `--control-h-sm * 7`인데 grid-template-columns가 `repeat(7, 1fr)`이라 컬럼 폭 = `--control-h-sm`. 성립.
|
|
63
|
+
- outside 색은 `--fg-subtle` 사용 중. 이미지랑 대체로 부합.
|
|
64
|
+
- 선택 셀 hover 색 살짝 조정 여지 있으나 현재 유지 가능.
|
|
65
|
+
|
|
66
|
+
## 6. Footer / actions (참고 이미지)
|
|
67
|
+
|
|
68
|
+
- 상단: `+ Add reminder` 텍스트 링크 (ghost 버튼)
|
|
69
|
+
- 하단: `Remove` (outline) 좌, `Done` (primary) 우 — 하단 padding 안에서 좌우 정렬
|
|
70
|
+
- **우리 DatePicker는 footer 슬롯이 없음.** 지금은 값 선택하면 자동 닫힘.
|
|
71
|
+
- 이 부분은 확장 스코프. 이번 이터레이션에서는 **스킵**.
|
|
72
|
+
|
|
73
|
+
## 7. Density / spacing 요약
|
|
74
|
+
|
|
75
|
+
| 요소 | 값 |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| 카드 padding | `--space-4` |
|
|
78
|
+
| presets → header gap | `--space-3` |
|
|
79
|
+
| header → weekdays gap | `--space-2` |
|
|
80
|
+
| weekdays → grid gap | 0 (weekday가 grid 첫 행처럼 붙음) |
|
|
81
|
+
| chip 간격 | `--space-2` |
|
|
82
|
+
| cell 크기 | `--control-h-sm` |
|
|
83
|
+
| grid gap | 0 |
|
|
84
|
+
|
|
85
|
+
## 8. 색·라운드 요약
|
|
86
|
+
|
|
87
|
+
| 요소 | 배경 | 텍스트 | radius |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| Container | `--bg` | — | `--radius-lg` |
|
|
90
|
+
| Preset chip | `--bg-subtle` | `--fg` | 999px (pill) |
|
|
91
|
+
| Nav IconButton | `--bg` | `--fg` | 999px (원형) + 1px `--border` |
|
|
92
|
+
| Weekday cell | transparent | `--fg-muted` | — |
|
|
93
|
+
| Day cell (default) | transparent | `--fg` | `--radius-sm` (hover 시) |
|
|
94
|
+
| Day cell (today) | transparent | `--primary` | `--radius-sm` + primary 1px inset ring |
|
|
95
|
+
| Day cell (selected) | `--primary` | `--bg` | `--radius-sm` |
|
|
96
|
+
| Day cell (outside) | transparent | `--fg-subtle` | — |
|
|
97
|
+
|
|
98
|
+
## 9. 이번 이터레이션에서 반영할 변경
|
|
99
|
+
|
|
100
|
+
1. Preset chip → **pill radius (999px)** 로 override
|
|
101
|
+
2. Nav IconButton → **원형 + 1px `--border`** outline 스타일
|
|
102
|
+
3. `monthHeader` → **`padding-inline: 0`** (nav 버튼과 그리드 컬럼 좌우 정렬)
|
|
103
|
+
4. `panelMain` 내부 gap 재조정: header→weekdays 사이 `--space-2`, weekdays→grid는 최소로 (거의 0)
|
|
104
|
+
5. presets 상단 padding은 `--space-3 var(--space-4)` 유지, 카드 padding과 조화
|
|
105
|
+
|
|
106
|
+
Footer 액션 슬롯(Add reminder / Remove / Done) 은 별도 이터레이션.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# DatePicker with Time — Reference Design Analysis
|
|
2
|
+
|
|
3
|
+
참고 이미지: 좌측 캘린더, 우측 세로 스크롤 타임 리스트, 하단 액션바가 카드 안에 통합된 형태.
|
|
4
|
+
|
|
5
|
+
## 1. Overall layout
|
|
6
|
+
|
|
7
|
+
- 카드는 세로로 두 영역: **body(가로 2열)** + **footer(가로 3영역)**
|
|
8
|
+
- body:
|
|
9
|
+
- 좌: 캘린더 (약 60% 폭)
|
|
10
|
+
- 우: 시간 리스트 (약 40% 폭), 세로 스크롤 가능
|
|
11
|
+
- 좌우 사이에 수직 `1px --border` divider (실제로 이미지에는 얇은 선이 보임)
|
|
12
|
+
- footer:
|
|
13
|
+
- 좌: Cancel (ghost/링크 스타일)
|
|
14
|
+
- 중: 선택 결과 값 표시 (outline input처럼 생긴 pill/button)
|
|
15
|
+
- 우: Schedule (primary 액션)
|
|
16
|
+
- body와 footer 사이 수평 `1px --border` divider
|
|
17
|
+
|
|
18
|
+
## 2. Calendar panel (좌)
|
|
19
|
+
|
|
20
|
+
- monthHeader와 grid는 이전 이터레이션과 동일. `<`, `>`는 얇은 원형 outline.
|
|
21
|
+
- 셀 크기는 `--control-h-md` 정사각.
|
|
22
|
+
- 오늘/점(dot) 표시:
|
|
23
|
+
- **선택되지 않은 오늘 대신 "이벤트 있음"을 나타내는 작은 점**이 셀 하단에 표시됨 (이미지에서 4일, 14일, 8일 아래에 점이 보임)
|
|
24
|
+
- 이건 today 표시가 아니라 **"이벤트 있는 날"** 마커. 우리 컨텍스트에선 today 마커로 재활용.
|
|
25
|
+
- 색: primary(파란색) — 오늘/일반 이벤트, 8일은 회색 점 → 지난 이벤트?
|
|
26
|
+
- 지금 우리는 today = primary inset ring. 참고 이미지 스타일로 가려면 **ring → dot** 방식으로 재변경 필요.
|
|
27
|
+
- **선택된 날짜 (21일)**:
|
|
28
|
+
- `--fg`(거의 검정) 배경의 정사각 라운드(약 `--radius-md`)
|
|
29
|
+
- 텍스트 `--bg`(흰색)
|
|
30
|
+
- **커서 위치 표시**를 위해 우측 하단에 커서 아이콘. 이건 UX 디테일이고 우리는 스킵.
|
|
31
|
+
- outside month: 훨씬 옅은 `--fg-subtle`.
|
|
32
|
+
|
|
33
|
+
**우리와 gap**:
|
|
34
|
+
- today를 dot으로 다시 변경할지? — 이 참고에선 dot. 근데 range 모드에서 dot이 in-range 배경 위로 올라가면 잘 보임(색만 대비). ring보다 유연.
|
|
35
|
+
- 선택 셀 배경이 `--primary` 아닌 `--fg` (mono inverse 톤)임. 참고 스타일에 맞추려면 `--fg` 사용. 하지만 CTDS 프리셋 컨텍스트에선 `--primary` 유지가 자연스러움. 이미지 그대로 재현할지 우리 톤 유지할지 판단 필요.
|
|
36
|
+
|
|
37
|
+
## 3. Time list (우)
|
|
38
|
+
|
|
39
|
+
- 세로 리스트, 각 항목은 `HH:MM AM/PM` 텍스트
|
|
40
|
+
- 항목 높이는 대략 `--control-h-md` (36px 정도)
|
|
41
|
+
- 좌우 padding: `--space-3` 정도, 텍스트 좌측정렬
|
|
42
|
+
- 상태:
|
|
43
|
+
- 기본: `--fg`, 배경 transparent
|
|
44
|
+
- hover: `--hover` 배경
|
|
45
|
+
- **선택**: `--bg-subtle` (연한 회색) 배경, 텍스트 `--fg` (bold 아님, 그냥 진한 색).
|
|
46
|
+
- 즉 selected가 primary/accent 색이 아님! **회색 배경 + 텍스트 진하게**로 표현.
|
|
47
|
+
- 이건 캘린더 선택(진한 검정)과 시각 계층을 다르게 준 것. 캘린더 선택 = 강함, 시간 선택 = 약함(secondary confirmation).
|
|
48
|
+
- past/불가능: 옅은 `--fg-subtle` (12:00 PM, 1:00 PM 이하가 흐림)
|
|
49
|
+
- 리스트 오버플로우: `overflow-y: auto`. 우측에 얇은 스크롤바.
|
|
50
|
+
- 리스트 상단/하단에 페이드 마스크 없음 (그냥 잘려 보임)
|
|
51
|
+
- 리스트 좌측 경계: 수직 `1px --border` divider
|
|
52
|
+
|
|
53
|
+
**우리와 gap**:
|
|
54
|
+
- 현재 우리 `timeMode="grid30"`은 6-col grid + 각 slot이 border 있는 네모. 참고와 완전히 다름.
|
|
55
|
+
- 참고는 세로 리스트 방식 → 새 timeMode `list` 추가하거나 grid30을 리팩터.
|
|
56
|
+
- 리스트 max-height는 body 높이에 맞춰 스크롤. 우리 timeGrid의 `max-height: calc(--control-h-sm * 6 + ...)` 로직 참고.
|
|
57
|
+
|
|
58
|
+
## 4. Footer
|
|
59
|
+
|
|
60
|
+
- 카드 하단 별도 영역, 위쪽에 `1px --border` 수평선
|
|
61
|
+
- 3파트:
|
|
62
|
+
- **좌 Cancel**: ghost 텍스트, `--fg` 색, hover 시 `--hover` 배경 없이 그냥 텍스트만.
|
|
63
|
+
- **중 결과 값**: outline pill-ish button.
|
|
64
|
+
- 배경 `--bg`, 얇은 `1px --border`, 라운드 `--radius-sm`
|
|
65
|
+
- 텍스트 `--fg`. "Sep 21, 2027 10:00 AM" 형식.
|
|
66
|
+
- `--text-sm`.
|
|
67
|
+
- 클릭 가능해 보이지만 실제 액션은 없음(선택 결과 표시용). 아마 클릭 시 focus 이동 정도.
|
|
68
|
+
- **우 Schedule**: outline button (Cancel과 비슷하지만 border 있음)
|
|
69
|
+
- 검정 텍스트, 흰 배경, 얇은 outline. **primary가 아님**.
|
|
70
|
+
- 이 이미지에선 primary CTA도 outline. 참 조용한 디자인.
|
|
71
|
+
- footer padding: 상하 `--space-3`, 좌우 `--space-4` 정도
|
|
72
|
+
- 3영역 사이 gap: `--space-3` 정도, 중앙 결과 영역이 `flex: 1`로 가운데 늘어남.
|
|
73
|
+
|
|
74
|
+
## 5. Sizes / spacing 요약
|
|
75
|
+
|
|
76
|
+
| 요소 | 값 |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| body height | 캘린더 6주 기준 + header + weekdays = 약 8 × `--control-h-md` |
|
|
79
|
+
| body padding | 좌우 `--space-4`, 위 `--space-3` |
|
|
80
|
+
| body 좌우 divider | vertical `1px --border` |
|
|
81
|
+
| body ↔ footer divider | horizontal `1px --border` |
|
|
82
|
+
| time list item height | `--control-h-md` |
|
|
83
|
+
| time list padding-inline | `--space-3` |
|
|
84
|
+
| footer padding | `--space-3` 상하, `--space-4` 좌우 |
|
|
85
|
+
| footer gap | `--space-3` |
|
|
86
|
+
|
|
87
|
+
## 6. 이번 이터레이션에서 반영할 변경
|
|
88
|
+
|
|
89
|
+
우리 컴포넌트 API는 `withTime` + `timeMode` 유지. 참고 이미지 스타일에 맞춰:
|
|
90
|
+
|
|
91
|
+
1. **timeMode 리스트 스타일 신설**: `timeMode="list"` (기본으로 승격 고려)
|
|
92
|
+
- 세로 스크롤 리스트, 30분 간격.
|
|
93
|
+
- 항목: 배경 transparent → `--hover`, 선택 시 `--bg-subtle` 배경.
|
|
94
|
+
- 리스트 좌측에 vertical divider.
|
|
95
|
+
2. **panel 레이아웃 변경 (withTime일 때만)**:
|
|
96
|
+
- 지금은 캘린더 아래에 timeArea가 붙음 (`.timeArea`).
|
|
97
|
+
- 참고처럼 **캘린더 우측에 timeArea 배치**로. `panelMain`을 flex row로.
|
|
98
|
+
- divider 삽입.
|
|
99
|
+
3. **today dot 표시** (선택사항):
|
|
100
|
+
- 지금 inset ring → 셀 하단 primary dot으로 되돌리기.
|
|
101
|
+
- 이유: 참고 이미지가 dot 스타일이고, in-range와의 시각 충돌도 적음.
|
|
102
|
+
4. **Footer 슬롯** (선택사항, 시간 있음 = 자동 닫기 불가 케이스에서 유용):
|
|
103
|
+
- `withTime` 시 자동 닫기 안 되니 confirm 버튼이 필요.
|
|
104
|
+
- `withFooter` prop 추가 or `withTime` 자동으로 footer 노출.
|
|
105
|
+
- 좌: 취소(값 초기화 + 닫기), 우: 확정(닫기만).
|
|
106
|
+
|
|
107
|
+
이번 스코프:
|
|
108
|
+
- (a) timeMode "list" 신설 + 기본화
|
|
109
|
+
- (b) withTime 시 panel 가로 배치 + divider
|
|
110
|
+
- (c) today 표시 = dot으로 전환
|
|
111
|
+
- (d) footer는 다음 이터레이션으로 미룸 (스코프 크고 API 결정 필요)
|
|
112
|
+
|
|
113
|
+
## 7. 이미지 그대로 재현 vs 우리 톤 유지
|
|
114
|
+
|
|
115
|
+
이미지의 특징:
|
|
116
|
+
- 선택 셀 배경 = `--fg` (검정)
|
|
117
|
+
- 시간 선택 = `--bg-subtle` (회색)
|
|
118
|
+
- 액션 = outline
|
|
119
|
+
|
|
120
|
+
우리 CTDS는 8축 스왑 시스템이라 `--primary`가 프리셋에 따라 다양. 이미지 그대로 흑백으로 갈 필요는 없음.
|
|
121
|
+
|
|
122
|
+
**결정**:
|
|
123
|
+
- 선택 셀 = `--primary` 유지 (지금 스타일)
|
|
124
|
+
- 시간 리스트 선택 = `--bg-subtle` (참고와 동일, 캘린더보다 약한 강조)
|
|
125
|
+
- footer는 이번 스코프 밖
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/* Trigger ─────────────────────────────────────────────────── */
|
|
2
|
+
.triggerInput {
|
|
3
|
+
min-width: calc(var(--space-2) * 22);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.triggerInput[data-with-time] {
|
|
7
|
+
min-width: calc(var(--space-2) * 30);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* Popover / inline panel ──────────────────────────────────── */
|
|
11
|
+
/* In · Out 애니메이션은 전역 유틸 `.m-float`가 담당 (globals.css). tsx에서 Content
|
|
12
|
+
className에 "m-float"을 concat. 여기서는 표면 시각(bg/border/shadow/radius)과
|
|
13
|
+
Radix가 준 transform-origin만 지정한다. */
|
|
14
|
+
.popoverContent {
|
|
15
|
+
z-index: var(--z-popover);
|
|
16
|
+
background: var(--bg);
|
|
17
|
+
border: var(--hairline) solid var(--border);
|
|
18
|
+
border-radius: var(--radius-lg);
|
|
19
|
+
box-shadow: var(--shadow-lg);
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
transform-origin: var(--radix-popover-content-transform-origin);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.inlineWrap {
|
|
25
|
+
display: inline-block;
|
|
26
|
+
background: var(--bg);
|
|
27
|
+
border: var(--hairline) solid var(--border);
|
|
28
|
+
border-radius: var(--radius-lg);
|
|
29
|
+
box-shadow: var(--shadow-sm);
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.panel {
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
align-items: stretch;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.panelMain {
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
gap: var(--space-2);
|
|
43
|
+
padding: var(--space-3);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.panelMain[data-with-time] {
|
|
47
|
+
flex-direction: row;
|
|
48
|
+
align-items: stretch;
|
|
49
|
+
gap: 0;
|
|
50
|
+
padding: 0;
|
|
51
|
+
/* 캘린더 실제 주 수(5~6)에 따라 높이 반응. TimeSelector가 이 높이를 stretch로 따라감. */
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.panelMain[data-with-time] > :first-child {
|
|
55
|
+
padding: var(--space-3);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.footer {
|
|
59
|
+
display: flex;
|
|
60
|
+
align-items: center;
|
|
61
|
+
justify-content: space-between;
|
|
62
|
+
gap: var(--space-2);
|
|
63
|
+
padding: var(--space-2) var(--space-3);
|
|
64
|
+
border-top: var(--hairline) solid var(--border);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Presets — 상단 chip 나열 ─────────────────────────────────── */
|
|
68
|
+
.presets {
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-wrap: wrap;
|
|
71
|
+
gap: var(--space-1);
|
|
72
|
+
padding: var(--space-3) var(--space-3) 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Calendar grid ───────────────────────────────────────────── */
|
|
76
|
+
.calendarWrap {
|
|
77
|
+
display: flex;
|
|
78
|
+
gap: var(--space-3);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.monthCol {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
gap: var(--space-1);
|
|
85
|
+
width: calc(var(--control-h-sm) * 7);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.monthHeader {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
justify-content: space-between;
|
|
92
|
+
gap: var(--space-2);
|
|
93
|
+
padding-inline: 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.monthHeader > button {
|
|
97
|
+
width: var(--control-h-sm);
|
|
98
|
+
height: var(--control-h-sm);
|
|
99
|
+
flex: 0 0 auto;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.monthTitle {
|
|
103
|
+
flex: 1;
|
|
104
|
+
text-align: center;
|
|
105
|
+
font-family: var(--font-normal);
|
|
106
|
+
font-size: var(--text-sm);
|
|
107
|
+
font-weight: var(--font-weight-medium);
|
|
108
|
+
color: var(--fg);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
.weekdays {
|
|
113
|
+
display: grid;
|
|
114
|
+
grid-template-columns: repeat(7, 1fr);
|
|
115
|
+
gap: 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.weekday {
|
|
119
|
+
display: inline-flex;
|
|
120
|
+
align-items: center;
|
|
121
|
+
justify-content: center;
|
|
122
|
+
aspect-ratio: 1 / 1;
|
|
123
|
+
font-family: var(--font-normal);
|
|
124
|
+
font-size: var(--text-xs);
|
|
125
|
+
color: var(--fg-muted);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.grid {
|
|
129
|
+
display: grid;
|
|
130
|
+
grid-template-columns: repeat(7, 1fr);
|
|
131
|
+
column-gap: 0;
|
|
132
|
+
row-gap: var(--hairline);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.dayCell {
|
|
136
|
+
display: inline-flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
justify-content: center;
|
|
139
|
+
aspect-ratio: 1 / 1;
|
|
140
|
+
padding: 0;
|
|
141
|
+
border: 0;
|
|
142
|
+
background: transparent;
|
|
143
|
+
color: var(--fg);
|
|
144
|
+
font-family: var(--font-normal);
|
|
145
|
+
font-size: var(--text-sm);
|
|
146
|
+
border-radius: var(--radius-sm);
|
|
147
|
+
cursor: pointer;
|
|
148
|
+
position: relative;
|
|
149
|
+
transition: box-shadow var(--duration-fast) var(--ease-out);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.dayCell:hover:not(:disabled):not([data-selected]) {
|
|
153
|
+
background: var(--hover);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.dayCell:focus-visible {
|
|
157
|
+
outline: var(--ring-width) solid var(--ring);
|
|
158
|
+
outline-offset: calc(-1 * var(--ring-width));
|
|
159
|
+
box-shadow: none;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.dayCell[data-outside] {
|
|
163
|
+
color: var(--fg-disabled);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.dayCell:disabled {
|
|
167
|
+
cursor: not-allowed;
|
|
168
|
+
opacity: 0.35;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.dayCell[data-in-range] {
|
|
172
|
+
background: var(--secondary-bg);
|
|
173
|
+
color: var(--secondary-fg);
|
|
174
|
+
border-radius: 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.dayCell[data-range-start] {
|
|
178
|
+
border-top-right-radius: 0;
|
|
179
|
+
border-bottom-right-radius: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.dayCell[data-range-end] {
|
|
183
|
+
border-top-left-radius: 0;
|
|
184
|
+
border-bottom-left-radius: 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* 주 단위 pill — 각 주의 첫/마지막 컬럼에서는 라운드를 살려서
|
|
188
|
+
in-range 밴드가 주마다 알약 모양으로 끊긴다. */
|
|
189
|
+
.grid > .dayCell[data-in-range]:nth-child(7n+1),
|
|
190
|
+
.grid > .dayCell[data-range-end]:nth-child(7n+1) {
|
|
191
|
+
border-top-left-radius: var(--radius-sm);
|
|
192
|
+
border-bottom-left-radius: var(--radius-sm);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.grid > .dayCell[data-in-range]:nth-child(7n),
|
|
196
|
+
.grid > .dayCell[data-range-start]:nth-child(7n) {
|
|
197
|
+
border-top-right-radius: var(--radius-sm);
|
|
198
|
+
border-bottom-right-radius: var(--radius-sm);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.dayCell[data-today]:not([data-selected]):not([data-in-range]) {
|
|
202
|
+
color: var(--primary);
|
|
203
|
+
font-weight: var(--font-weight-medium);
|
|
204
|
+
box-shadow: inset 0 0 0 var(--hairline) var(--primary);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.dayCell[data-today][data-in-range] {
|
|
208
|
+
color: var(--primary);
|
|
209
|
+
font-weight: var(--font-weight-medium);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.dayCell[data-selected] {
|
|
213
|
+
background: var(--primary);
|
|
214
|
+
color: var(--bg);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.dayCell[data-selected]:hover:not(:disabled) {
|
|
218
|
+
background: var(--primary-hover);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* range-start/end + selected 조합의 hover에서도 반쪽 알약 radius 유지. */
|
|
222
|
+
.dayCell[data-range-start][data-selected]:hover {
|
|
223
|
+
border-top-left-radius: var(--radius-sm);
|
|
224
|
+
border-bottom-left-radius: var(--radius-sm);
|
|
225
|
+
border-top-right-radius: 0;
|
|
226
|
+
border-bottom-right-radius: 0;
|
|
227
|
+
}
|
|
228
|
+
.dayCell[data-range-end][data-selected]:hover {
|
|
229
|
+
border-top-right-radius: var(--radius-sm);
|
|
230
|
+
border-bottom-right-radius: var(--radius-sm);
|
|
231
|
+
border-top-left-radius: 0;
|
|
232
|
+
border-bottom-left-radius: 0;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.dayLabel {
|
|
236
|
+
line-height: var(--lh-sm);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/* Time area ──────────────────────────────────────────────── */
|
|
240
|
+
/* 스크롤 규약: 이 wrapper엔 padding 없음. 안쪽 스크롤 컨테이너와 트랙이 담당.
|
|
241
|
+
왼쪽 구분선은 pseudo로 그려 상하 짧게(preset 영역과 맞물리지 않도록). */
|
|
242
|
+
.timeArea {
|
|
243
|
+
position: relative;
|
|
244
|
+
display: flex;
|
|
245
|
+
flex-direction: column;
|
|
246
|
+
min-width: 0;
|
|
247
|
+
min-height: 0;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.timeArea::before {
|
|
251
|
+
content: "";
|
|
252
|
+
position: absolute;
|
|
253
|
+
left: 0;
|
|
254
|
+
top: var(--space-3);
|
|
255
|
+
bottom: var(--space-3);
|
|
256
|
+
width: var(--hairline);
|
|
257
|
+
background: var(--border);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.timeArea[data-mode="range"] {
|
|
261
|
+
flex-direction: row;
|
|
262
|
+
gap: 0;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
.timeSection {
|
|
267
|
+
display: flex;
|
|
268
|
+
flex-direction: column;
|
|
269
|
+
gap: 0;
|
|
270
|
+
min-width: 0;
|
|
271
|
+
min-height: 0;
|
|
272
|
+
flex: 1 1 auto;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.timeLabel {
|
|
276
|
+
padding: var(--space-2) var(--space-4) 0;
|
|
277
|
+
font-family: var(--font-normal);
|
|
278
|
+
font-size: var(--text-xs);
|
|
279
|
+
color: var(--fg-muted);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.timeList {
|
|
283
|
+
min-width: calc(var(--control-h-md) * 3.5);
|
|
284
|
+
flex: 1 1 0;
|
|
285
|
+
min-height: 0;
|
|
286
|
+
overflow-y: auto;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.timeListTrack {
|
|
290
|
+
display: flex;
|
|
291
|
+
flex-direction: column;
|
|
292
|
+
gap: var(--space-0_5);
|
|
293
|
+
padding: var(--space-2);
|
|
294
|
+
}
|
|
295
|
+
|