@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.
Files changed (289) hide show
  1. package/README.md +128 -2
  2. package/assets/components/AppFrame/AppFrame.module.css +177 -0
  3. package/assets/components/AppFrame/AppFrame.tsx +93 -0
  4. package/assets/components/AppFrame/index.ts +6 -0
  5. package/assets/components/AttachmentChip/AttachmentChip.module.css +71 -0
  6. package/assets/components/AttachmentChip/AttachmentChip.tsx +74 -0
  7. package/assets/components/AttachmentChip/index.ts +2 -0
  8. package/assets/components/AttachmentThumb/AttachmentThumb.module.css +107 -0
  9. package/assets/components/AttachmentThumb/AttachmentThumb.tsx +91 -0
  10. package/assets/components/AttachmentThumb/index.ts +2 -0
  11. package/assets/components/Avatar/Avatar.module.css +167 -0
  12. package/assets/components/Avatar/Avatar.tsx +228 -0
  13. package/assets/components/Avatar/index.ts +2 -0
  14. package/assets/components/AvatarUpload/AvatarUpload.module.css +130 -0
  15. package/assets/components/AvatarUpload/AvatarUpload.tsx +139 -0
  16. package/assets/components/AvatarUpload/index.ts +2 -0
  17. package/assets/components/Badge/Badge.module.css +76 -0
  18. package/assets/components/Badge/Badge.tsx +68 -0
  19. package/assets/components/Badge/index.ts +2 -0
  20. package/assets/components/Breadcrumb/Breadcrumb.module.css +213 -0
  21. package/assets/components/Breadcrumb/Breadcrumb.tsx +279 -0
  22. package/assets/components/Breadcrumb/index.ts +8 -0
  23. package/assets/components/Button/Button.module.css +216 -0
  24. package/assets/components/Button/Button.tsx +149 -0
  25. package/assets/components/Button/index.ts +2 -0
  26. package/assets/components/Callout/Callout.module.css +146 -0
  27. package/assets/components/Callout/Callout.tsx +138 -0
  28. package/assets/components/Callout/index.ts +2 -0
  29. package/assets/components/ChatInput/ChatInput.module.css +241 -0
  30. package/assets/components/ChatInput/ChatInput.tsx +322 -0
  31. package/assets/components/ChatInput/ModelSelector.tsx +40 -0
  32. package/assets/components/ChatInput/SendButton.tsx +41 -0
  33. package/assets/components/ChatInput/index.ts +10 -0
  34. package/assets/components/Checkbox/Checkbox.module.css +66 -0
  35. package/assets/components/Checkbox/Checkbox.tsx +36 -0
  36. package/assets/components/Checkbox/index.ts +2 -0
  37. package/assets/components/Chip/Chip.module.css +128 -0
  38. package/assets/components/Chip/Chip.tsx +103 -0
  39. package/assets/components/Chip/index.ts +2 -0
  40. package/assets/components/ChoiceCard/ChoiceCard.module.css +142 -0
  41. package/assets/components/ChoiceCard/ChoiceCard.tsx +132 -0
  42. package/assets/components/ChoiceCard/index.ts +2 -0
  43. package/assets/components/ContextMenu/ContextMenu.module.css +102 -0
  44. package/assets/components/ContextMenu/ContextMenu.tsx +392 -0
  45. package/assets/components/ContextMenu/index.ts +9 -0
  46. package/assets/components/DatePicker/Calendar.tsx +234 -0
  47. package/assets/components/DatePicker/DESIGN_NOTES.md +106 -0
  48. package/assets/components/DatePicker/DESIGN_NOTES_TIME.md +125 -0
  49. package/assets/components/DatePicker/DatePicker.module.css +295 -0
  50. package/assets/components/DatePicker/DatePicker.tsx +387 -0
  51. package/assets/components/DatePicker/TimeSelector.tsx +69 -0
  52. package/assets/components/DatePicker/index.ts +8 -0
  53. package/assets/components/DatePicker/presets.ts +80 -0
  54. package/assets/components/DatePicker/utils.ts +148 -0
  55. package/assets/components/Disclosure/Disclosure.module.css +73 -0
  56. package/assets/components/Disclosure/Disclosure.tsx +129 -0
  57. package/assets/components/Disclosure/index.ts +6 -0
  58. package/assets/components/Drawer/Drawer.module.css +257 -0
  59. package/assets/components/Drawer/Drawer.tsx +126 -0
  60. package/assets/components/Drawer/index.ts +7 -0
  61. package/assets/components/EmptyState/EmptyState.module.css +102 -0
  62. package/assets/components/EmptyState/EmptyState.tsx +80 -0
  63. package/assets/components/EmptyState/index.ts +2 -0
  64. package/assets/components/FileIcon/FileIcon.module.css +66 -0
  65. package/assets/components/FileIcon/FileIcon.tsx +84 -0
  66. package/assets/components/FileIcon/fileExtMap.ts +112 -0
  67. package/assets/components/FileIcon/index.ts +9 -0
  68. package/assets/components/FilterButton/FilterButton.module.css +130 -0
  69. package/assets/components/FilterButton/FilterButton.tsx +94 -0
  70. package/assets/components/FilterButton/index.ts +2 -0
  71. package/assets/components/GalleryItem/GalleryItem.module.css +220 -0
  72. package/assets/components/GalleryItem/GalleryItem.tsx +163 -0
  73. package/assets/components/GalleryItem/index.ts +7 -0
  74. package/assets/components/Icon/Icon.tsx +616 -0
  75. package/assets/components/Icon/context.tsx +39 -0
  76. package/assets/components/Icon/index.ts +4 -0
  77. package/assets/components/IconButton/IconButton.module.css +109 -0
  78. package/assets/components/IconButton/IconButton.tsx +110 -0
  79. package/assets/components/IconButton/index.ts +2 -0
  80. package/assets/components/Input/Input.module.css +338 -0
  81. package/assets/components/Input/Input.tsx +371 -0
  82. package/assets/components/Input/index.ts +2 -0
  83. package/assets/components/ListItem/ListItem.module.css +318 -0
  84. package/assets/components/ListItem/ListItem.tsx +262 -0
  85. package/assets/components/ListItem/index.ts +9 -0
  86. package/assets/components/MenuItem/MenuItem.module.css +437 -0
  87. package/assets/components/MenuItem/MenuItem.tsx +529 -0
  88. package/assets/components/MenuItem/index.ts +8 -0
  89. package/assets/components/MetricCard/MetricCard.module.css +153 -0
  90. package/assets/components/MetricCard/MetricCard.tsx +140 -0
  91. package/assets/components/MetricCard/index.ts +2 -0
  92. package/assets/components/Modal/Modal.module.css +175 -0
  93. package/assets/components/Modal/Modal.tsx +98 -0
  94. package/assets/components/Modal/index.ts +2 -0
  95. package/assets/components/Onboarding/DocsIndex.tsx +82 -0
  96. package/assets/components/Onboarding/LayoutBuilder.tsx +160 -0
  97. package/assets/components/Onboarding/Onboarding.module.css +1394 -0
  98. package/assets/components/Onboarding/OnboardingAxisPanel.tsx +515 -0
  99. package/assets/components/Onboarding/OnboardingPage.tsx +1193 -0
  100. package/assets/components/Onboarding/PresetsGallery.tsx +65 -0
  101. package/assets/components/Onboarding/actions.ts +250 -0
  102. package/assets/components/Onboarding/index.ts +8 -0
  103. package/assets/components/Onboarding/palette.css +40 -0
  104. package/assets/components/Onboarding/wizardData.ts +265 -0
  105. package/assets/components/Pagination/Pagination.module.css +82 -0
  106. package/assets/components/Pagination/Pagination.tsx +248 -0
  107. package/assets/components/Pagination/index.ts +6 -0
  108. package/assets/components/ProgressBar/ProgressBar.module.css +64 -0
  109. package/assets/components/ProgressBar/ProgressBar.tsx +54 -0
  110. package/assets/components/ProgressBar/index.ts +2 -0
  111. package/assets/components/QuotationBar/QuotationBar.module.css +61 -0
  112. package/assets/components/QuotationBar/QuotationBar.tsx +48 -0
  113. package/assets/components/QuotationBar/index.ts +2 -0
  114. package/assets/components/Radio/Radio.module.css +63 -0
  115. package/assets/components/Radio/Radio.tsx +33 -0
  116. package/assets/components/Radio/index.ts +2 -0
  117. package/assets/components/Select/Select.module.css +151 -0
  118. package/assets/components/Select/Select.tsx +425 -0
  119. package/assets/components/Select/index.ts +10 -0
  120. package/assets/components/SelectableCard/SelectableCard.module.css +177 -0
  121. package/assets/components/SelectableCard/SelectableCard.tsx +83 -0
  122. package/assets/components/SelectableCard/index.ts +2 -0
  123. package/assets/components/Shortcut/Shortcut.module.css +56 -0
  124. package/assets/components/Shortcut/Shortcut.tsx +156 -0
  125. package/assets/components/Shortcut/index.ts +2 -0
  126. package/assets/components/Sidebar/Sidebar.module.css +242 -0
  127. package/assets/components/Sidebar/Sidebar.tsx +264 -0
  128. package/assets/components/Sidebar/index.ts +7 -0
  129. package/assets/components/SidebarSplit/SidebarSplit.module.css +126 -0
  130. package/assets/components/SidebarSplit/SidebarSplit.tsx +222 -0
  131. package/assets/components/SidebarSplit/index.ts +6 -0
  132. package/assets/components/Slider/Slider.module.css +120 -0
  133. package/assets/components/Slider/Slider.tsx +88 -0
  134. package/assets/components/Slider/index.ts +2 -0
  135. package/assets/components/SplitButton/SplitButton.module.css +190 -0
  136. package/assets/components/SplitButton/SplitButton.tsx +145 -0
  137. package/assets/components/SplitButton/index.ts +6 -0
  138. package/assets/components/Stepper/Stepper.module.css +182 -0
  139. package/assets/components/Stepper/Stepper.tsx +185 -0
  140. package/assets/components/Stepper/index.ts +2 -0
  141. package/assets/components/Switch/Switch.module.css +116 -0
  142. package/assets/components/Switch/Switch.tsx +58 -0
  143. package/assets/components/Switch/index.ts +2 -0
  144. package/assets/components/TableCell/TableCell.module.css +137 -0
  145. package/assets/components/TableCell/TableCellAvatar.tsx +42 -0
  146. package/assets/components/TableCell/TableCellBadge.tsx +23 -0
  147. package/assets/components/TableCell/TableCellIcon.tsx +39 -0
  148. package/assets/components/TableCell/TableCellImage.tsx +49 -0
  149. package/assets/components/TableCell/TableCellLink.tsx +33 -0
  150. package/assets/components/TableCell/TableCellMeter.tsx +55 -0
  151. package/assets/components/TableCell/TableCellNumber.tsx +43 -0
  152. package/assets/components/TableCell/TableCellText.tsx +30 -0
  153. package/assets/components/TableCell/index.ts +23 -0
  154. package/assets/components/TableHeader/TableHeader.module.css +287 -0
  155. package/assets/components/TableHeader/TableHeader.tsx +590 -0
  156. package/assets/components/TableHeader/index.ts +9 -0
  157. package/assets/components/TableRow/TableRow.module.css +290 -0
  158. package/assets/components/TableRow/TableRow.tsx +253 -0
  159. package/assets/components/TableRow/index.ts +8 -0
  160. package/assets/components/TableRowEdit/TableRowEdit.module.css +126 -0
  161. package/assets/components/TableRowEdit/TableRowEdit.tsx +247 -0
  162. package/assets/components/TableRowEdit/index.ts +2 -0
  163. package/assets/components/TableRowSelect/TableRowSelect.module.css +23 -0
  164. package/assets/components/TableRowSelect/TableRowSelect.tsx +175 -0
  165. package/assets/components/TableRowSelect/index.ts +2 -0
  166. package/assets/components/Tabs/Tabs.module.css +234 -0
  167. package/assets/components/Tabs/Tabs.tsx +426 -0
  168. package/assets/components/Tabs/index.ts +9 -0
  169. package/assets/components/Textarea/Textarea.module.css +318 -0
  170. package/assets/components/Textarea/Textarea.tsx +426 -0
  171. package/assets/components/Textarea/index.ts +7 -0
  172. package/assets/components/ThemeController.tsx +271 -0
  173. package/assets/components/TimePicker/TimePicker.module.css +317 -0
  174. package/assets/components/TimePicker/TimePicker.tsx +821 -0
  175. package/assets/components/TimePicker/index.ts +8 -0
  176. package/assets/components/TimePicker/utils.ts +115 -0
  177. package/assets/components/Toast/Toast.module.css +264 -0
  178. package/assets/components/Toast/Toast.tsx +243 -0
  179. package/assets/components/Toast/index.ts +15 -0
  180. package/assets/components/Toolbar/Toolbar.module.css +72 -0
  181. package/assets/components/Toolbar/Toolbar.tsx +75 -0
  182. package/assets/components/Toolbar/index.ts +2 -0
  183. package/assets/components/Tooltip/Tooltip.module.css +42 -0
  184. package/assets/components/Tooltip/Tooltip.tsx +332 -0
  185. package/assets/components/Tooltip/index.ts +2 -0
  186. package/assets/components/Topbar/Topbar.module.css +26 -0
  187. package/assets/components/Topbar/Topbar.tsx +47 -0
  188. package/assets/components/Topbar/index.ts +2 -0
  189. package/assets/components/_cn.ts +3 -0
  190. package/assets/components/_color.ts +48 -0
  191. package/assets/components/_data.ts +659 -0
  192. package/assets/components/_utils.css +19 -0
  193. package/assets/components/axisOptions.ts +24 -0
  194. package/assets/components/tokens.css +742 -0
  195. package/assets/prompts/GUIDE.md +251 -0
  196. package/assets/prompts/OVERRIDE.md +170 -0
  197. package/assets/prompts/PRINCIPLES.md +130 -0
  198. package/assets/prompts/axes/density.md +38 -0
  199. package/assets/prompts/axes/font.md +36 -0
  200. package/assets/prompts/axes/hue.md +36 -0
  201. package/assets/prompts/axes/icon.md +48 -0
  202. package/assets/prompts/axes/mode.md +50 -0
  203. package/assets/prompts/axes/motion.md +77 -0
  204. package/assets/prompts/axes/palette.md +35 -0
  205. package/assets/prompts/axes/shape.md +33 -0
  206. package/assets/prompts/axes/voice.md +54 -0
  207. package/assets/prompts/components/README.md +84 -0
  208. package/assets/prompts/components/app-frame.md +94 -0
  209. package/assets/prompts/components/attachment-chip.md +46 -0
  210. package/assets/prompts/components/attachment-thumb.md +49 -0
  211. package/assets/prompts/components/avatar.md +86 -0
  212. package/assets/prompts/components/badge.md +104 -0
  213. package/assets/prompts/components/breadcrumb.md +77 -0
  214. package/assets/prompts/components/button.md +99 -0
  215. package/assets/prompts/components/callout.md +81 -0
  216. package/assets/prompts/components/chat-input.md +84 -0
  217. package/assets/prompts/components/checkbox.md +46 -0
  218. package/assets/prompts/components/chip.md +84 -0
  219. package/assets/prompts/components/choice-card.md +127 -0
  220. package/assets/prompts/components/context-menu.md +145 -0
  221. package/assets/prompts/components/date-picker.md +104 -0
  222. package/assets/prompts/components/drawer.md +152 -0
  223. package/assets/prompts/components/empty-state.md +69 -0
  224. package/assets/prompts/components/file-icon.md +73 -0
  225. package/assets/prompts/components/filter-button.md +42 -0
  226. package/assets/prompts/components/form-field.md +74 -0
  227. package/assets/prompts/components/gallery-item.md +158 -0
  228. package/assets/prompts/components/icon-button.md +82 -0
  229. package/assets/prompts/components/icon.md +68 -0
  230. package/assets/prompts/components/input.md +95 -0
  231. package/assets/prompts/components/list-item.md +235 -0
  232. package/assets/prompts/components/menu-item.md +234 -0
  233. package/assets/prompts/components/metric-card.md +132 -0
  234. package/assets/prompts/components/modal.md +131 -0
  235. package/assets/prompts/components/pagination.md +92 -0
  236. package/assets/prompts/components/progress-bar.md +61 -0
  237. package/assets/prompts/components/quotation-bar.md +39 -0
  238. package/assets/prompts/components/radio.md +41 -0
  239. package/assets/prompts/components/select.md +104 -0
  240. package/assets/prompts/components/selectable-card.md +67 -0
  241. package/assets/prompts/components/shortcut.md +76 -0
  242. package/assets/prompts/components/sidebar.md +107 -0
  243. package/assets/prompts/components/slider.md +89 -0
  244. package/assets/prompts/components/split-button.md +71 -0
  245. package/assets/prompts/components/stepper.md +93 -0
  246. package/assets/prompts/components/switch.md +86 -0
  247. package/assets/prompts/components/table-cell.md +87 -0
  248. package/assets/prompts/components/table-header.md +157 -0
  249. package/assets/prompts/components/table-row-edit.md +129 -0
  250. package/assets/prompts/components/table-row-select.md +82 -0
  251. package/assets/prompts/components/table-row.md +156 -0
  252. package/assets/prompts/components/tabs.md +122 -0
  253. package/assets/prompts/components/textarea.md +105 -0
  254. package/assets/prompts/components/toast.md +149 -0
  255. package/assets/prompts/components/tooltip.md +71 -0
  256. package/assets/prompts/components/topbar.md +148 -0
  257. package/assets/prompts/primitives/emerge.md +43 -0
  258. package/assets/prompts/primitives/fade.md +31 -0
  259. package/assets/prompts/primitives/scale.md +32 -0
  260. package/assets/prompts/primitives/scroll.md +75 -0
  261. package/assets/prompts/primitives/slide.md +31 -0
  262. package/assets/prompts/themes/_SCHEMA.md +135 -0
  263. package/assets/prompts/themes/_TEMPLATE.md +73 -0
  264. package/assets/prompts/themes/expressive.md +118 -0
  265. package/assets/prompts/themes/pure.md +87 -0
  266. package/assets/prompts/themes/spare.md +73 -0
  267. package/assets/prompts/tokens/breakpoint.md +29 -0
  268. package/assets/prompts/tokens/color.md +78 -0
  269. package/assets/prompts/tokens/radius.md +33 -0
  270. package/assets/prompts/tokens/shadow.md +35 -0
  271. package/assets/prompts/tokens/spacing.md +86 -0
  272. package/assets/prompts/tokens/typography.md +76 -0
  273. package/assets/prompts/tokens/z-index.md +35 -0
  274. package/assets/public/expressive.png +0 -0
  275. package/assets/public/pure.png +0 -0
  276. package/assets/public/spare.png +0 -0
  277. package/assets/skill/SKILL.md +36 -0
  278. package/bin/ctds.js +76 -0
  279. package/package.json +35 -4
  280. package/src/commands/init.js +215 -0
  281. package/src/commands/update.js +275 -0
  282. package/src/utils/assets.js +78 -0
  283. package/src/utils/deps.js +51 -0
  284. package/src/utils/detect.js +47 -0
  285. package/src/utils/diff.js +52 -0
  286. package/src/utils/hash.js +16 -0
  287. package/src/utils/log.js +41 -0
  288. package/src/utils/meta.js +73 -0
  289. package/src/utils/prompt.js +28 -0
@@ -0,0 +1,318 @@
1
+ /* Root container ────────────────────────────────────────── */
2
+ .root {
3
+ display: inline-flex;
4
+ align-items: stretch;
5
+ gap: var(--space-2);
6
+ font-family: var(--font-normal);
7
+ color: var(--fg);
8
+ border: 1px solid var(--border);
9
+ border-radius: var(--radius-sm);
10
+ cursor: text;
11
+ transition:
12
+ background var(--duration-fast) var(--ease-out),
13
+ border-color var(--duration-fast) var(--ease-out),
14
+ box-shadow var(--duration-fast) var(--ease-out);
15
+ min-width: 0;
16
+ position: relative;
17
+ }
18
+
19
+ .root:hover:not([data-disabled]):not([data-readonly]),
20
+ .root:focus-visible,
21
+ .root:has(:focus-visible) {
22
+ border-color: var(--border-strong);
23
+ }
24
+
25
+ .root:focus-visible,
26
+ .root:has(:focus-visible) {
27
+ outline: none;
28
+ }
29
+
30
+ /* Variants ──────────────────────────────────────────────── */
31
+ .outline {
32
+ background: transparent;
33
+ }
34
+
35
+ .filled {
36
+ background: var(--bg-subtle);
37
+ border-color: transparent;
38
+ }
39
+
40
+ .filled:hover:not([data-disabled]):not([data-readonly]),
41
+ .filled:focus-visible,
42
+ .filled:has(:focus-visible) {
43
+ background: var(--bg-muted);
44
+ border-color: transparent;
45
+ }
46
+
47
+ /* line — 아래 선만. */
48
+ .root.line {
49
+ background: transparent;
50
+ border-color: transparent;
51
+ border-bottom-color: var(--border);
52
+ border-radius: 0;
53
+ padding-inline: 0;
54
+ }
55
+
56
+ .root.line:hover:not([data-disabled]):not([data-readonly]),
57
+ .root.line:focus-visible,
58
+ .root.line:has(:focus-visible) {
59
+ border-color: transparent;
60
+ border-bottom-color: var(--border-strong);
61
+ }
62
+
63
+ .root.line[data-invalid],
64
+ .root.line[data-invalid]:hover:not([data-disabled]):not([data-readonly]),
65
+ .root.line[data-invalid]:focus-visible,
66
+ .root.line[data-invalid]:has(:focus-visible) {
67
+ border-color: transparent;
68
+ border-bottom-color: var(--destructive);
69
+ }
70
+
71
+ /* States ────────────────────────────────────────────────── */
72
+ .root[data-invalid] {
73
+ border-color: var(--destructive);
74
+ }
75
+
76
+ .root[data-invalid]:hover:not([data-disabled]):not([data-readonly]),
77
+ .root[data-invalid]:focus-visible,
78
+ .root[data-invalid]:has(:focus-visible) {
79
+ border-color: var(--destructive);
80
+ }
81
+
82
+ .root[data-disabled] {
83
+ cursor: not-allowed;
84
+ opacity: 0.5;
85
+ }
86
+
87
+ .root[data-readonly] {
88
+ background: var(--bg-subtle);
89
+ cursor: default;
90
+ }
91
+
92
+ .root[data-readonly].filled {
93
+ background: var(--bg-muted);
94
+ }
95
+
96
+ /* Width fill */
97
+ .fill {
98
+ width: 100%;
99
+ }
100
+
101
+ /* Sizes ─────────────────────────────────────────────────────
102
+ Scroll 규칙: root(padding 있는 컨테이너)엔 overflow를 걸지 않는다.
103
+ 실제 스크롤은 안쪽 .textarea에 걸리므로, root는 padding-inline-end를 0으로 두고
104
+ textarea 자체가 우측 padding을 갖는다 → 스크롤바가 root 우측 경계선에 딱 붙음. */
105
+ .sizeSm {
106
+ padding: var(--space-1_5) 0 var(--space-1_5) var(--space-2);
107
+ font-size: var(--text-sm);
108
+ border-radius: var(--radius-xs);
109
+ gap: var(--space-1);
110
+ }
111
+ .sizeSm .textarea { padding-inline-end: var(--space-2); }
112
+
113
+ .sizeMd {
114
+ padding: var(--space-2) 0 var(--space-2) var(--space-3);
115
+ font-size: var(--text-sm);
116
+ border-radius: var(--radius-sm);
117
+ }
118
+ .sizeMd .textarea { padding-inline-end: var(--space-3); }
119
+
120
+ .sizeLg {
121
+ padding: var(--space-2_5) 0 var(--space-2_5) var(--space-3);
122
+ font-size: var(--text-base);
123
+ border-radius: var(--radius-md);
124
+ }
125
+ .sizeLg .textarea { padding-inline-end: var(--space-3); }
126
+
127
+ /* line variant는 좌우 padding이 없음 — textarea 자체도 우측 여백 없이. */
128
+ .root.line .textarea { padding-inline-end: 0; }
129
+
130
+ /* Inner textarea ────────────────────────────────────────── */
131
+ .textarea {
132
+ flex: 1 1 auto;
133
+ min-width: 0;
134
+ width: 100%;
135
+ padding: 0;
136
+ border: 0;
137
+ background: transparent;
138
+ color: inherit;
139
+ font-family: inherit;
140
+ font-size: inherit;
141
+ line-height: var(--lh-base);
142
+ outline: none;
143
+ /* 브라우저 기본 그립 대신 커스텀 핸들 사용. */
144
+ resize: none;
145
+ display: block;
146
+ }
147
+
148
+ .textarea::placeholder {
149
+ color: var(--fg-subtle);
150
+ }
151
+
152
+ .textarea:disabled {
153
+ cursor: not-allowed;
154
+ }
155
+
156
+ /* autoResize 모드 — 사용자 조작 없이 컨텐츠 높이 따라감. */
157
+ .autoResize .textarea {
158
+ overflow: hidden;
159
+ }
160
+
161
+ /* Custom resize handle ─────────────────────────────────────
162
+ Minimalist grabber — bottom-center에 걸치는 얇은 캡슐 하나.
163
+ - hit-area는 넉넉하게(--space-6 × --space-3), 시각 요소는 매우 얇게
164
+ - 평소엔 안 보이고 root:hover / focus-within일 때만 살짝 나타남
165
+ - 드래그(active) 중엔 진해지고 폭이 살짝 커짐 (요즘 Linear/Vercel 톤) */
166
+ .handle {
167
+ position: absolute;
168
+ left: 50%;
169
+ bottom: 0;
170
+ transform: translateX(-50%);
171
+ width: var(--space-6);
172
+ height: var(--space-3);
173
+ display: grid;
174
+ place-items: center;
175
+ cursor: ns-resize;
176
+ background: transparent;
177
+ border: 0;
178
+ padding: 0;
179
+ touch-action: none;
180
+ }
181
+
182
+ .handle::before {
183
+ content: "";
184
+ display: block;
185
+ width: var(--space-3);
186
+ height: var(--hairline);
187
+ border-radius: var(--radius-full);
188
+ background: var(--fg-subtle);
189
+ opacity: 0;
190
+ transition:
191
+ opacity var(--duration-fast) var(--ease-out),
192
+ background var(--duration-fast) var(--ease-out),
193
+ width var(--duration-fast) var(--ease-out),
194
+ height var(--duration-fast) var(--ease-out);
195
+ }
196
+
197
+ .root:hover:not([data-disabled]):not([data-readonly]) .handle::before,
198
+ .root:focus-within .handle::before {
199
+ opacity: 0.5;
200
+ }
201
+
202
+ .handle:hover::before,
203
+ .handle[data-active="true"]::before {
204
+ opacity: 1;
205
+ background: var(--fg-muted);
206
+ width: var(--space-4);
207
+ height: calc(var(--hairline) * 2);
208
+ }
209
+
210
+ .handle:focus-visible {
211
+ outline: none;
212
+ border-radius: var(--radius-full);
213
+ box-shadow: var(--ring-shadow);
214
+ }
215
+ .handle:focus-visible::before {
216
+ opacity: 1;
217
+ }
218
+
219
+ .autoResize .handle,
220
+ .root[data-disabled] .handle,
221
+ .root[data-readonly] .handle {
222
+ display: none;
223
+ }
224
+
225
+ /* body.textarea-resizing 전역 커서 강제는 globals.css로 이전. */
226
+
227
+ /* WebKit autofill */
228
+ .textarea:-webkit-autofill,
229
+ .textarea:-webkit-autofill:hover,
230
+ .textarea:-webkit-autofill:focus {
231
+ -webkit-text-fill-color: var(--fg);
232
+ -webkit-box-shadow: 0 0 0 1000px var(--bg) inset;
233
+ caret-color: var(--fg);
234
+ }
235
+
236
+ .filled .textarea:-webkit-autofill,
237
+ .filled .textarea:-webkit-autofill:hover,
238
+ .filled .textarea:-webkit-autofill:focus {
239
+ -webkit-box-shadow: 0 0 0 1000px var(--bg-subtle) inset;
240
+ }
241
+
242
+ /* Footer — count 표시 */
243
+ .footer {
244
+ display: flex;
245
+ justify-content: flex-end;
246
+ align-items: center;
247
+ margin-top: var(--space-1);
248
+ font-family: var(--font-normal);
249
+ font-size: var(--text-xs);
250
+ line-height: var(--lh-xs);
251
+ color: var(--fg-subtle);
252
+ user-select: none;
253
+ }
254
+
255
+ .countOver {
256
+ color: var(--destructive);
257
+ }
258
+
259
+ /* FormField wrapper ─────────────────────────────────────── */
260
+ .field {
261
+ display: flex;
262
+ flex-direction: column;
263
+ gap: var(--space-1_5);
264
+ min-width: 0;
265
+ }
266
+
267
+ .field:has(> .root.line) {
268
+ gap: 0;
269
+ }
270
+
271
+ .label {
272
+ display: inline-flex;
273
+ align-items: center;
274
+ gap: var(--space-1);
275
+ font-family: var(--font-normal);
276
+ font-weight: var(--font-weight-medium);
277
+ color: var(--fg-muted);
278
+ transition: color var(--duration-fast) var(--ease-out);
279
+ }
280
+
281
+ .labelSm { font-size: var(--text-xs); }
282
+ .labelMd,
283
+ .labelLg { font-size: var(--text-sm); }
284
+
285
+ .field:focus-within .label {
286
+ color: var(--fg);
287
+ }
288
+
289
+ .requiredMark {
290
+ color: var(--destructive);
291
+ font-weight: var(--font-weight-medium);
292
+ }
293
+
294
+ .description,
295
+ .errorText {
296
+ margin: 0;
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: var(--space-1);
300
+ font-family: var(--font-normal);
301
+ font-size: var(--text-xs);
302
+ line-height: var(--lh-xs);
303
+ }
304
+
305
+ .description {
306
+ color: var(--fg-subtle);
307
+ }
308
+
309
+ .errorText {
310
+ color: var(--destructive);
311
+ }
312
+
313
+ .messageIcon {
314
+ flex: 0 0 auto;
315
+ display: inline-flex;
316
+ align-items: center;
317
+ justify-content: center;
318
+ }