@kupola/kupola 1.2.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 (354) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/INTEGRATION.md +440 -0
  3. package/PROJECT_SUMMARY.md +312 -0
  4. package/README.md +286 -0
  5. package/SKILL.md +572 -0
  6. package/css/accessibility.css +119 -0
  7. package/css/animations.css +224 -0
  8. package/css/brand-themes.css +300 -0
  9. package/css/colors_and_type.css +441 -0
  10. package/css/components-ext.css +4165 -0
  11. package/css/components.css +1483 -0
  12. package/css/kupola.css +12 -0
  13. package/css/responsive.css +697 -0
  14. package/css/scaffold.css +145 -0
  15. package/css/states.css +316 -0
  16. package/css/theme-dark.css +296 -0
  17. package/css/theme-light.css +296 -0
  18. package/css/utilities.css +171 -0
  19. package/dist/css/kupola.css +12 -0
  20. package/dist/icons/icons/activity.svg +3 -0
  21. package/dist/icons/icons/alert-circle.svg +1 -0
  22. package/dist/icons/icons/alert-triangle.svg +1 -0
  23. package/dist/icons/icons/alert.d27e24.svg +1 -0
  24. package/dist/icons/icons/alert.svg +1 -0
  25. package/dist/icons/icons/apple.svg +1 -0
  26. package/dist/icons/icons/arrow-down.svg +1 -0
  27. package/dist/icons/icons/arrow-expand.svg +1 -0
  28. package/dist/icons/icons/arrow-left.svg +1 -0
  29. package/dist/icons/icons/arrow-minimize.svg +1 -0
  30. package/dist/icons/icons/arrow-right-to-line.svg +1 -0
  31. package/dist/icons/icons/arrow-right.svg +1 -0
  32. package/dist/icons/icons/arrow-up-right.svg +1 -0
  33. package/dist/icons/icons/arrow-up.0c0c0d.svg +1 -0
  34. package/dist/icons/icons/arrow-up.svg +1 -0
  35. package/dist/icons/icons/at.svg +1 -0
  36. package/dist/icons/icons/atom.0c0c0d.svg +1 -0
  37. package/dist/icons/icons/atom.svg +1 -0
  38. package/dist/icons/icons/bar-chart-2.svg +1 -0
  39. package/dist/icons/icons/bar.svg +1 -0
  40. package/dist/icons/icons/bell.svg +1 -0
  41. package/dist/icons/icons/box.svg +1 -0
  42. package/dist/icons/icons/bug.svg +1 -0
  43. package/dist/icons/icons/button.svg +1 -0
  44. package/dist/icons/icons/calendar.svg +1 -0
  45. package/dist/icons/icons/check-circle.33c192.svg +1 -0
  46. package/dist/icons/icons/check-circle.svg +1 -0
  47. package/dist/icons/icons/check-square.svg +4 -0
  48. package/dist/icons/icons/check.d1d3db.svg +1 -0
  49. package/dist/icons/icons/check.svg +1 -0
  50. package/dist/icons/icons/chevron-down.svg +1 -0
  51. package/dist/icons/icons/chevron-left.svg +1 -0
  52. package/dist/icons/icons/chevron-right.svg +1 -0
  53. package/dist/icons/icons/chevron-up.svg +1 -0
  54. package/dist/icons/icons/circle.svg +1 -0
  55. package/dist/icons/icons/clock.svg +1 -0
  56. package/dist/icons/icons/cmd.svg +1 -0
  57. package/dist/icons/icons/code.svg +1 -0
  58. package/dist/icons/icons/columns.svg +1 -0
  59. package/dist/icons/icons/copy.svg +1 -0
  60. package/dist/icons/icons/cpu.svg +1 -0
  61. package/dist/icons/icons/dashboard.0c0c0d.svg +1 -0
  62. package/dist/icons/icons/dashboard.svg +1 -0
  63. package/dist/icons/icons/dollar.svg +1 -0
  64. package/dist/icons/icons/download.svg +1 -0
  65. package/dist/icons/icons/edit.svg +1 -0
  66. package/dist/icons/icons/extensions.svg +1 -0
  67. package/dist/icons/icons/external.svg +1 -0
  68. package/dist/icons/icons/eye.svg +1 -0
  69. package/dist/icons/icons/file-text.svg +1 -0
  70. package/dist/icons/icons/file.svg +1 -0
  71. package/dist/icons/icons/files.svg +1 -0
  72. package/dist/icons/icons/filter.svg +1 -0
  73. package/dist/icons/icons/folder-open.svg +4 -0
  74. package/dist/icons/icons/folder.svg +1 -0
  75. package/dist/icons/icons/gear.svg +1 -0
  76. package/dist/icons/icons/git.svg +1 -0
  77. package/dist/icons/icons/github.svg +1 -0
  78. package/dist/icons/icons/globe.svg +1 -0
  79. package/dist/icons/icons/grid-2x2.svg +1 -0
  80. package/dist/icons/icons/hash.svg +1 -0
  81. package/dist/icons/icons/heart.svg +1 -0
  82. package/dist/icons/icons/help-circle.svg +5 -0
  83. package/dist/icons/icons/help.svg +1 -0
  84. package/dist/icons/icons/home.svg +1 -0
  85. package/dist/icons/icons/icons.svg +153 -0
  86. package/dist/icons/icons/image.svg +1 -0
  87. package/dist/icons/icons/info-circle.svg +1 -0
  88. package/dist/icons/icons/info-square.svg +1 -0
  89. package/dist/icons/icons/info.387bff.svg +1 -0
  90. package/dist/icons/icons/info.svg +1 -0
  91. package/dist/icons/icons/input.svg +1 -0
  92. package/dist/icons/icons/key.svg +1 -0
  93. package/dist/icons/icons/layers.svg +1 -0
  94. package/dist/icons/icons/layout-grid.svg +6 -0
  95. package/dist/icons/icons/layout.svg +1 -0
  96. package/dist/icons/icons/link.svg +1 -0
  97. package/dist/icons/icons/list.svg +1 -0
  98. package/dist/icons/icons/lock.svg +1 -0
  99. package/dist/icons/icons/log-out.svg +1 -0
  100. package/dist/icons/icons/logo.svg +1 -0
  101. package/dist/icons/icons/mail.svg +1 -0
  102. package/dist/icons/icons/menu.svg +1 -0
  103. package/dist/icons/icons/message-circle.svg +1 -0
  104. package/dist/icons/icons/message-plus.svg +1 -0
  105. package/dist/icons/icons/message-square.svg +1 -0
  106. package/dist/icons/icons/mic.svg +1 -0
  107. package/dist/icons/icons/minus.svg +1 -0
  108. package/dist/icons/icons/moon.svg +1 -0
  109. package/dist/icons/icons/more-h.svg +1 -0
  110. package/dist/icons/icons/mouse.svg +1 -0
  111. package/dist/icons/icons/palette.svg +1 -0
  112. package/dist/icons/icons/panel-bottom.svg +1 -0
  113. package/dist/icons/icons/pause.svg +1 -0
  114. package/dist/icons/icons/play.svg +1 -0
  115. package/dist/icons/icons/plug.svg +1 -0
  116. package/dist/icons/icons/plus.0c0c0d.svg +1 -0
  117. package/dist/icons/icons/plus.svg +1 -0
  118. package/dist/icons/icons/refresh.svg +1 -0
  119. package/dist/icons/icons/ruler.svg +1 -0
  120. package/dist/icons/icons/scroll-text.svg +1 -0
  121. package/dist/icons/icons/search-menu.svg +1 -0
  122. package/dist/icons/icons/search.svg +1 -0
  123. package/dist/icons/icons/send.0c0c0d.svg +1 -0
  124. package/dist/icons/icons/send.svg +1 -0
  125. package/dist/icons/icons/settings.0c0c0d.svg +1 -0
  126. package/dist/icons/icons/settings.svg +1 -0
  127. package/dist/icons/icons/shield.svg +1 -0
  128. package/dist/icons/icons/sidebar-left.svg +1 -0
  129. package/dist/icons/icons/sidebar-right.svg +1 -0
  130. package/dist/icons/icons/sliders.svg +1 -0
  131. package/dist/icons/icons/sparkles.32f08c.svg +1 -0
  132. package/dist/icons/icons/sparkles.svg +1 -0
  133. package/dist/icons/icons/square.svg +1 -0
  134. package/dist/icons/icons/star.svg +1 -0
  135. package/dist/icons/icons/sun.svg +1 -0
  136. package/dist/icons/icons/table.svg +1 -0
  137. package/dist/icons/icons/terminal.svg +1 -0
  138. package/dist/icons/icons/trash.svg +1 -0
  139. package/dist/icons/icons/trending-down.svg +1 -0
  140. package/dist/icons/icons/trending-up.svg +1 -0
  141. package/dist/icons/icons/type.svg +1 -0
  142. package/dist/icons/icons/upload.svg +1 -0
  143. package/dist/icons/icons/user-circle.svg +1 -0
  144. package/dist/icons/icons/user-plus.svg +6 -0
  145. package/dist/icons/icons/user.svg +1 -0
  146. package/dist/icons/icons/users.svg +1 -0
  147. package/dist/icons/icons/warning.svg +1 -0
  148. package/dist/icons/icons/wrench.svg +1 -0
  149. package/dist/icons/icons/x-circle.svg +1 -0
  150. package/dist/icons/icons/x.svg +1 -0
  151. package/dist/icons/icons/zap.0c0c0d.svg +1 -0
  152. package/dist/icons/icons/zap.svg +1 -0
  153. package/dist/kupola.cjs.js +258 -0
  154. package/dist/kupola.cjs.js.map +1 -0
  155. package/dist/kupola.esm.js +7640 -0
  156. package/dist/kupola.esm.js.map +1 -0
  157. package/dist/kupola.umd.js +258 -0
  158. package/dist/kupola.umd.js.map +1 -0
  159. package/dist/types/kupola.d.ts +1359 -0
  160. package/dist/utils/utils/Kupola.cs +77 -0
  161. package/dist/utils/utils/Kupola.java +104 -0
  162. package/dist/utils/utils/kupola.go +120 -0
  163. package/dist/utils/utils/kupola.js +63 -0
  164. package/dist/utils/utils/kupola.py +1392 -0
  165. package/dist/utils/utils/kupola.rb +69 -0
  166. package/icons/activity.svg +3 -0
  167. package/icons/alert-circle.svg +1 -0
  168. package/icons/alert-triangle.svg +1 -0
  169. package/icons/alert.d27e24.svg +1 -0
  170. package/icons/alert.svg +1 -0
  171. package/icons/apple.svg +1 -0
  172. package/icons/arrow-down.svg +1 -0
  173. package/icons/arrow-expand.svg +1 -0
  174. package/icons/arrow-left.svg +1 -0
  175. package/icons/arrow-minimize.svg +1 -0
  176. package/icons/arrow-right-to-line.svg +1 -0
  177. package/icons/arrow-right.svg +1 -0
  178. package/icons/arrow-up-right.svg +1 -0
  179. package/icons/arrow-up.0c0c0d.svg +1 -0
  180. package/icons/arrow-up.svg +1 -0
  181. package/icons/at.svg +1 -0
  182. package/icons/atom.0c0c0d.svg +1 -0
  183. package/icons/atom.svg +1 -0
  184. package/icons/bar-chart-2.svg +1 -0
  185. package/icons/bar.svg +1 -0
  186. package/icons/bell.svg +1 -0
  187. package/icons/box.svg +1 -0
  188. package/icons/bug.svg +1 -0
  189. package/icons/button.svg +1 -0
  190. package/icons/calendar.svg +1 -0
  191. package/icons/check-circle.33c192.svg +1 -0
  192. package/icons/check-circle.svg +1 -0
  193. package/icons/check-square.svg +4 -0
  194. package/icons/check.d1d3db.svg +1 -0
  195. package/icons/check.svg +1 -0
  196. package/icons/chevron-down.svg +1 -0
  197. package/icons/chevron-left.svg +1 -0
  198. package/icons/chevron-right.svg +1 -0
  199. package/icons/chevron-up.svg +1 -0
  200. package/icons/circle.svg +1 -0
  201. package/icons/clock.svg +1 -0
  202. package/icons/cmd.svg +1 -0
  203. package/icons/code.svg +1 -0
  204. package/icons/columns.svg +1 -0
  205. package/icons/copy.svg +1 -0
  206. package/icons/cpu.svg +1 -0
  207. package/icons/dashboard.0c0c0d.svg +1 -0
  208. package/icons/dashboard.svg +1 -0
  209. package/icons/dollar.svg +1 -0
  210. package/icons/download.svg +1 -0
  211. package/icons/edit.svg +1 -0
  212. package/icons/extensions.svg +1 -0
  213. package/icons/external.svg +1 -0
  214. package/icons/eye.svg +1 -0
  215. package/icons/file-text.svg +1 -0
  216. package/icons/file.svg +1 -0
  217. package/icons/files.svg +1 -0
  218. package/icons/filter.svg +1 -0
  219. package/icons/folder-open.svg +4 -0
  220. package/icons/folder.svg +1 -0
  221. package/icons/gear.svg +1 -0
  222. package/icons/git.svg +1 -0
  223. package/icons/github.svg +1 -0
  224. package/icons/globe.svg +1 -0
  225. package/icons/grid-2x2.svg +1 -0
  226. package/icons/hash.svg +1 -0
  227. package/icons/heart.svg +1 -0
  228. package/icons/help-circle.svg +5 -0
  229. package/icons/help.svg +1 -0
  230. package/icons/home.svg +1 -0
  231. package/icons/icons.svg +153 -0
  232. package/icons/image.svg +1 -0
  233. package/icons/info-circle.svg +1 -0
  234. package/icons/info-square.svg +1 -0
  235. package/icons/info.387bff.svg +1 -0
  236. package/icons/info.svg +1 -0
  237. package/icons/input.svg +1 -0
  238. package/icons/key.svg +1 -0
  239. package/icons/layers.svg +1 -0
  240. package/icons/layout-grid.svg +6 -0
  241. package/icons/layout.svg +1 -0
  242. package/icons/link.svg +1 -0
  243. package/icons/list.svg +1 -0
  244. package/icons/lock.svg +1 -0
  245. package/icons/log-out.svg +1 -0
  246. package/icons/logo.svg +1 -0
  247. package/icons/mail.svg +1 -0
  248. package/icons/menu.svg +1 -0
  249. package/icons/message-circle.svg +1 -0
  250. package/icons/message-plus.svg +1 -0
  251. package/icons/message-square.svg +1 -0
  252. package/icons/mic.svg +1 -0
  253. package/icons/minus.svg +1 -0
  254. package/icons/moon.svg +1 -0
  255. package/icons/more-h.svg +1 -0
  256. package/icons/mouse.svg +1 -0
  257. package/icons/palette.svg +1 -0
  258. package/icons/panel-bottom.svg +1 -0
  259. package/icons/pause.svg +1 -0
  260. package/icons/play.svg +1 -0
  261. package/icons/plug.svg +1 -0
  262. package/icons/plus.0c0c0d.svg +1 -0
  263. package/icons/plus.svg +1 -0
  264. package/icons/refresh.svg +1 -0
  265. package/icons/ruler.svg +1 -0
  266. package/icons/scroll-text.svg +1 -0
  267. package/icons/search-menu.svg +1 -0
  268. package/icons/search.svg +1 -0
  269. package/icons/send.0c0c0d.svg +1 -0
  270. package/icons/send.svg +1 -0
  271. package/icons/settings.0c0c0d.svg +1 -0
  272. package/icons/settings.svg +1 -0
  273. package/icons/shield.svg +1 -0
  274. package/icons/sidebar-left.svg +1 -0
  275. package/icons/sidebar-right.svg +1 -0
  276. package/icons/sliders.svg +1 -0
  277. package/icons/sparkles.32f08c.svg +1 -0
  278. package/icons/sparkles.svg +1 -0
  279. package/icons/square.svg +1 -0
  280. package/icons/star.svg +1 -0
  281. package/icons/sun.svg +1 -0
  282. package/icons/table.svg +1 -0
  283. package/icons/terminal.svg +1 -0
  284. package/icons/trash.svg +1 -0
  285. package/icons/trending-down.svg +1 -0
  286. package/icons/trending-up.svg +1 -0
  287. package/icons/type.svg +1 -0
  288. package/icons/upload.svg +1 -0
  289. package/icons/user-circle.svg +1 -0
  290. package/icons/user-plus.svg +6 -0
  291. package/icons/user.svg +1 -0
  292. package/icons/users.svg +1 -0
  293. package/icons/warning.svg +1 -0
  294. package/icons/wrench.svg +1 -0
  295. package/icons/x-circle.svg +1 -0
  296. package/icons/x.svg +1 -0
  297. package/icons/zap.0c0c0d.svg +1 -0
  298. package/icons/zap.svg +1 -0
  299. package/js/calendar.js +184 -0
  300. package/js/carousel.js +173 -0
  301. package/js/collapse.js +127 -0
  302. package/js/color-picker.js +144 -0
  303. package/js/component.js +276 -0
  304. package/js/composition-api.js +458 -0
  305. package/js/countdown.js +144 -0
  306. package/js/data-bind.js +1286 -0
  307. package/js/datepicker.js +270 -0
  308. package/js/dialog.js +131 -0
  309. package/js/drawer.js +118 -0
  310. package/js/dropdown.js +122 -0
  311. package/js/dynamic-tags.js +156 -0
  312. package/js/error-handler.js +181 -0
  313. package/js/fileupload.js +392 -0
  314. package/js/form.js +291 -0
  315. package/js/global-events.js +203 -0
  316. package/js/heatmap.js +405 -0
  317. package/js/http.js +419 -0
  318. package/js/i18n.js +228 -0
  319. package/js/icons.js +165 -0
  320. package/js/image-preview.js +218 -0
  321. package/js/initializer.js +162 -0
  322. package/js/kupola-core.js +66 -0
  323. package/js/kupola-devtools.js +598 -0
  324. package/js/kupola-lifecycle.js +510 -0
  325. package/js/message.js +60 -0
  326. package/js/modal.js +191 -0
  327. package/js/notification.js +73 -0
  328. package/js/numberinput.js +146 -0
  329. package/js/performance.js +250 -0
  330. package/js/registry.js +205 -0
  331. package/js/router.js +396 -0
  332. package/js/security.js +189 -0
  333. package/js/select.js +143 -0
  334. package/js/slide-captcha.js +504 -0
  335. package/js/slider.js +94 -0
  336. package/js/statcard.js +219 -0
  337. package/js/tag.js +83 -0
  338. package/js/test-utils.js +251 -0
  339. package/js/theme.js +363 -0
  340. package/js/timepicker.js +238 -0
  341. package/js/tooltip.js +122 -0
  342. package/js/utils.js +1458 -0
  343. package/js/validation.js +553 -0
  344. package/js/virtual-list.js +593 -0
  345. package/package.json +105 -0
  346. package/templates/base.html +30 -0
  347. package/templates/base_dashboard.html +99 -0
  348. package/types/kupola.d.ts +1359 -0
  349. package/utils/Kupola.cs +77 -0
  350. package/utils/Kupola.java +104 -0
  351. package/utils/kupola.go +120 -0
  352. package/utils/kupola.js +63 -0
  353. package/utils/kupola.py +1392 -0
  354. package/utils/kupola.rb +69 -0
@@ -0,0 +1,4165 @@
1
+ /* Activity Rail */
2
+ .ds-activityrail {
3
+ display: flex;
4
+ flex-direction: column;
5
+ justify-content: space-between;
6
+ width: 48px;
7
+ height: 100%;
8
+ background-color: var(--bg-base-secondary);
9
+ border-right: 1px solid var(--border-neutral-l1);
10
+ padding: 4px 0;
11
+ }
12
+
13
+ .ds-activityrail__nav {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 2px;
17
+ }
18
+
19
+ .ds-activityrail__item {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ width: 48px;
24
+ height: 48px;
25
+ background: none;
26
+ border: none;
27
+ cursor: pointer;
28
+ color: var(--icon-secondary);
29
+ transition: color 0.15s ease, background-color 0.15s ease;
30
+ }
31
+
32
+ .ds-activityrail__item:hover {
33
+ color: var(--icon-default);
34
+ background-color: var(--bg-overlay-l1);
35
+ }
36
+
37
+ .ds-activityrail__item.is-active {
38
+ color: var(--icon-default);
39
+ }
40
+
41
+ .ds-activityrail__item.is-active::before {
42
+ content: '';
43
+ position: absolute;
44
+ left: 0;
45
+ width: 2px;
46
+ height: 24px;
47
+ background-color: var(--bg-brand);
48
+ }
49
+
50
+ .ds-activityrail__divider {
51
+ height: 1px;
52
+ background-color: var(--border-neutral-l1);
53
+ margin: 8px 4px;
54
+ }
55
+
56
+ .ds-activityrail__bottom {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 2px;
60
+ }
61
+
62
+ /* Chat Composer */
63
+ .ds-chatcomposer {
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 8px;
67
+ padding: 12px;
68
+ background-color: var(--bg-base-secondary);
69
+ border-top: 1px solid var(--border-neutral-l1);
70
+ }
71
+
72
+ .ds-chatcomposer__toolbar {
73
+ display: flex;
74
+ gap: 4px;
75
+ }
76
+
77
+ .ds-chatcomposer__input-area {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 8px;
81
+ padding: 6px 12px;
82
+ background-color: var(--bg-base-default);
83
+ border: 1px solid var(--border-neutral-l1);
84
+ border-radius: 6px;
85
+ }
86
+
87
+ .ds-chatcomposer__model {
88
+ padding: 4px 8px;
89
+ background-color: var(--bg-brand-popup);
90
+ color: var(--text-brand);
91
+ font-size: 11px;
92
+ font-weight: 500;
93
+ border-radius: 4px;
94
+ }
95
+
96
+ .ds-chatcomposer__input {
97
+ flex: 1;
98
+ background: none;
99
+ border: none;
100
+ color: var(--text-default);
101
+ font-size: 13px;
102
+ outline: none;
103
+ }
104
+
105
+ .ds-chatcomposer__input::placeholder {
106
+ color: var(--text-tertiary);
107
+ }
108
+
109
+ /* Editor Tabs */
110
+ .ds-editortabs {
111
+ display: flex;
112
+ align-items: stretch;
113
+ gap: 2px;
114
+ padding: 0 12px;
115
+ background-color: var(--bg-base-secondary);
116
+ border-bottom: 1px solid var(--border-neutral-l1);
117
+ overflow-x: auto;
118
+ }
119
+
120
+ .ds-editortabs__tab {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 6px;
124
+ padding: 8px 12px;
125
+ background-color: transparent;
126
+ border: none;
127
+ border-radius: 4px 4px 0 0;
128
+ cursor: pointer;
129
+ color: var(--text-secondary);
130
+ font-size: 12px;
131
+ transition: background-color 0.15s ease, color 0.15s ease;
132
+ }
133
+
134
+ .ds-editortabs__tab:hover {
135
+ background-color: var(--bg-overlay-l1);
136
+ color: var(--text-default);
137
+ }
138
+
139
+ .ds-editortabs__tab.is-active {
140
+ background-color: var(--bg-base-default);
141
+ color: var(--text-default);
142
+ }
143
+
144
+ .ds-editortabs__close {
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ width: 16px;
149
+ height: 16px;
150
+ background: none;
151
+ border: none;
152
+ cursor: pointer;
153
+ opacity: 0.6;
154
+ transition: opacity 0.15s ease;
155
+ }
156
+
157
+ .ds-editortabs__tab:hover .ds-editortabs__close {
158
+ opacity: 1;
159
+ }
160
+
161
+ .ds-editortabs__new {
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ width: 32px;
166
+ background: none;
167
+ border: none;
168
+ cursor: pointer;
169
+ color: var(--icon-secondary);
170
+ transition: color 0.15s ease;
171
+ }
172
+
173
+ .ds-editortabs__new:hover {
174
+ color: var(--icon-default);
175
+ }
176
+
177
+ /* KBD */
178
+ .ds-kbd {
179
+ display: inline-flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ padding: 2px 6px;
183
+ background-color: var(--bg-overlay-l2);
184
+ border: 1px solid var(--border-neutral-l2);
185
+ border-radius: 3px;
186
+ color: var(--text-secondary);
187
+ font-family: var(--code-editor-font-family);
188
+ font-size: 11px;
189
+ line-height: 1;
190
+ }
191
+
192
+ .ds-kbd--sm {
193
+ padding: 1px 4px;
194
+ font-size: 10px;
195
+ }
196
+
197
+ /* Page Header */
198
+ .ds-pageheader {
199
+ display: flex;
200
+ justify-content: space-between;
201
+ align-items: center;
202
+ padding: 16px 24px;
203
+ background-color: var(--bg-base-secondary);
204
+ border-bottom: 1px solid var(--border-neutral-l1);
205
+ }
206
+
207
+ .ds-pageheader__title {
208
+ display: flex;
209
+ flex-direction: column;
210
+ gap: 4px;
211
+ }
212
+
213
+ .ds-pageheader__title h1 {
214
+ margin: 0;
215
+ font-size: 18px;
216
+ font-weight: 600;
217
+ color: var(--text-default);
218
+ }
219
+
220
+ .ds-pageheader__subtitle {
221
+ margin: 0;
222
+ font-size: 12px;
223
+ color: var(--text-secondary);
224
+ }
225
+
226
+ .ds-pageheader__actions {
227
+ display: flex;
228
+ gap: 8px;
229
+ }
230
+
231
+ /* Setting Row */
232
+ .ds-settingrow__group {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 8px;
236
+ padding: 16px;
237
+ background-color: var(--bg-base-secondary);
238
+ border-radius: 6px;
239
+ }
240
+
241
+ .ds-settingrow__grouplabel {
242
+ font-size: 11px;
243
+ font-weight: 600;
244
+ color: var(--text-tertiary);
245
+ text-transform: uppercase;
246
+ letter-spacing: 0.5px;
247
+ }
248
+
249
+ .ds-settingrow {
250
+ display: flex;
251
+ justify-content: space-between;
252
+ align-items: center;
253
+ padding: 12px 0;
254
+ border-top: 1px solid var(--border-neutral-l1);
255
+ }
256
+
257
+ .ds-settingrow:first-child {
258
+ border-top: none;
259
+ }
260
+
261
+ .ds-settingrow__info {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: 4px;
265
+ }
266
+
267
+ .ds-settingrow__title {
268
+ font-size: 13px;
269
+ color: var(--text-default);
270
+ }
271
+
272
+ .ds-settingrow__description {
273
+ font-size: 12px;
274
+ color: var(--text-secondary);
275
+ }
276
+
277
+ /* Status Bar */
278
+ .ds-statusbar {
279
+ display: flex;
280
+ justify-content: space-between;
281
+ align-items: center;
282
+ height: 24px;
283
+ padding: 0 12px;
284
+ background-color: var(--bg-base-secondary);
285
+ border-top: 1px solid var(--border-neutral-l1);
286
+ font-size: 12px;
287
+ }
288
+
289
+ .ds-statusbar__left,
290
+ .ds-statusbar__right {
291
+ display: flex;
292
+ align-items: center;
293
+ gap: 12px;
294
+ }
295
+
296
+ .ds-statusbar__item {
297
+ display: flex;
298
+ align-items: center;
299
+ gap: 4px;
300
+ background: none;
301
+ border: none;
302
+ cursor: pointer;
303
+ color: var(--text-secondary);
304
+ font-size: 12px;
305
+ transition: color 0.15s ease;
306
+ }
307
+
308
+ .ds-statusbar__item:hover {
309
+ color: var(--text-default);
310
+ }
311
+
312
+ /* Table Panel */
313
+ .ds-tablepanel {
314
+ display: flex;
315
+ flex-direction: column;
316
+ background-color: var(--bg-base-secondary);
317
+ border-radius: 6px;
318
+ overflow: hidden;
319
+ }
320
+
321
+ .ds-tablepanel__toolbar {
322
+ display: flex;
323
+ justify-content: space-between;
324
+ align-items: center;
325
+ padding: 12px;
326
+ border-bottom: 1px solid var(--border-neutral-l1);
327
+ }
328
+
329
+ .ds-tablepanel__filters,
330
+ .ds-tablepanel__actions {
331
+ display: flex;
332
+ gap: 8px;
333
+ }
334
+
335
+ .ds-tablepanel__table {
336
+ flex: 1;
337
+ border: none;
338
+ border-radius: 0;
339
+ overflow: hidden;
340
+ display: flex;
341
+ flex-direction: column;
342
+ }
343
+
344
+ .ds-tablepanel__scroll {
345
+ flex: 1;
346
+ overflow-y: auto;
347
+ }
348
+
349
+ .ds-tablepanel__scroll::-webkit-scrollbar {
350
+ width: 6px;
351
+ }
352
+
353
+ .ds-tablepanel__scroll::-webkit-scrollbar-track {
354
+ background: transparent;
355
+ }
356
+
357
+ .ds-tablepanel__scroll::-webkit-scrollbar-thumb {
358
+ background: var(--border-neutral-l2);
359
+ border-radius: 3px;
360
+ }
361
+
362
+ .ds-tablepanel__scroll::-webkit-scrollbar-thumb:hover {
363
+ background: var(--border-neutral-l1);
364
+ }
365
+
366
+ .ds-tablepanel table {
367
+ width: 100%;
368
+ border-collapse: collapse;
369
+ }
370
+
371
+ .ds-tablepanel th,
372
+ .ds-tablepanel td {
373
+ text-align: left;
374
+ padding: var(--spacer-12) var(--spacer-8);
375
+ border-bottom: 1px solid var(--border-neutral-l1);
376
+ font-size: var(--body-sm-font-size);
377
+ }
378
+
379
+ .ds-tablepanel th {
380
+ color: var(--text-tertiary);
381
+ font-weight: var(--font-weight-default, 400);
382
+ font-size: var(--body-xs-font-size);
383
+ text-transform: uppercase;
384
+ letter-spacing: 0.04em;
385
+ background-color: var(--bg-base-secondary);
386
+ position: sticky;
387
+ top: 0;
388
+ z-index: 1;
389
+ }
390
+
391
+ .ds-tablepanel td {
392
+ color: var(--text-default);
393
+ }
394
+
395
+ .ds-tablepanel tr:last-child td {
396
+ border-bottom: none;
397
+ }
398
+
399
+ .ds-tablepanel td.num,
400
+ .ds-tablepanel th.num {
401
+ text-align: right;
402
+ font-variant-numeric: tabular-nums;
403
+ }
404
+
405
+ .ds-tablepanel__footer {
406
+ display: flex;
407
+ justify-content: space-between;
408
+ align-items: center;
409
+ padding: 8px 12px;
410
+ border-top: 1px solid var(--border-neutral-l1);
411
+ font-size: 12px;
412
+ color: var(--text-secondary);
413
+ background-color: var(--bg-base-secondary);
414
+ }
415
+
416
+ /* Workbench Titlebar */
417
+ .ds-titlebar {
418
+ display: flex;
419
+ justify-content: space-between;
420
+ align-items: center;
421
+ height: 32px;
422
+ padding: 0 12px;
423
+ background-color: var(--bg-base-secondary);
424
+ border-bottom: 1px solid var(--border-neutral-l1);
425
+ user-select: none;
426
+ }
427
+
428
+ .ds-titlebar__left {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 12px;
432
+ }
433
+
434
+ .ds-titlebar__traffic {
435
+ display: flex;
436
+ gap: 8px;
437
+ }
438
+
439
+ .ds-titlebar__traffic-btn {
440
+ width: 12px;
441
+ height: 12px;
442
+ border: none;
443
+ border-radius: 50%;
444
+ cursor: pointer;
445
+ transition: opacity 0.15s ease;
446
+ }
447
+
448
+ .ds-titlebar__traffic-btn:hover {
449
+ opacity: 0.8;
450
+ }
451
+
452
+ .ds-titlebar__traffic-btn--close {
453
+ background-color: #FF5F57;
454
+ }
455
+
456
+ .ds-titlebar__traffic-btn--minimize {
457
+ background-color: #FEBC2E;
458
+ }
459
+
460
+ .ds-titlebar__traffic-btn--maximize {
461
+ background-color: #28C840;
462
+ }
463
+
464
+ .ds-titlebar__project {
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 4px;
468
+ background: none;
469
+ border: none;
470
+ cursor: pointer;
471
+ color: var(--text-default);
472
+ font-size: 12px;
473
+ }
474
+
475
+ .ds-titlebar__right {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 4px;
479
+ }
480
+
481
+ .ds-titlebar__divider {
482
+ width: 1px;
483
+ height: 16px;
484
+ background-color: var(--border-neutral-l1);
485
+ margin: 0 4px;
486
+ }
487
+
488
+ /* Progress Circle */
489
+ .ds-progress-circle {
490
+ display: flex;
491
+ flex-direction: column;
492
+ align-items: center;
493
+ justify-content: center;
494
+ width: 80px;
495
+ height: 80px;
496
+ position: relative;
497
+ }
498
+
499
+ .ds-progress-circle__svg {
500
+ width: 100%;
501
+ height: 100%;
502
+ transform: rotate(-90deg);
503
+ }
504
+
505
+ .ds-progress-circle__track {
506
+ stroke: var(--border-neutral-l2);
507
+ }
508
+
509
+ .ds-progress-circle__bar {
510
+ stroke: var(--bg-brand);
511
+ transition: stroke-dashoffset 0.5s ease;
512
+ }
513
+
514
+ .ds-progress-circle__label {
515
+ position: absolute;
516
+ bottom: 16px;
517
+ font-size: 10px;
518
+ color: var(--text-secondary);
519
+ }
520
+
521
+ .ds-progress-circle__value {
522
+ position: absolute;
523
+ font-size: 14px;
524
+ font-weight: 600;
525
+ color: var(--text-default);
526
+ }
527
+
528
+ /* Slider */
529
+ .ds-slider {
530
+ display: flex;
531
+ flex-direction: column;
532
+ gap: 8px;
533
+ padding: 8px 0;
534
+ }
535
+
536
+ .ds-slider__header {
537
+ display: flex;
538
+ justify-content: space-between;
539
+ align-items: center;
540
+ }
541
+
542
+ .ds-slider__label {
543
+ font-size: 12px;
544
+ color: var(--text-secondary);
545
+ }
546
+
547
+ .ds-slider__track {
548
+ position: relative;
549
+ height: 16px;
550
+ background-color: var(--bg-overlay-l2);
551
+ border-radius: 8px;
552
+ cursor: pointer;
553
+ }
554
+
555
+ .ds-slider__fill {
556
+ position: absolute;
557
+ left: 0;
558
+ top: 50%;
559
+ transform: translateY(-50%);
560
+ height: 6px;
561
+ background-color: var(--bg-brand);
562
+ border-radius: 3px;
563
+ transition: width 0.15s ease;
564
+ }
565
+
566
+ .ds-slider__input {
567
+ position: absolute;
568
+ left: 0;
569
+ top: 0;
570
+ width: 100%;
571
+ height: 100%;
572
+ opacity: 0;
573
+ cursor: pointer;
574
+ z-index: 2;
575
+ }
576
+
577
+ .ds-slider__thumb {
578
+ position: absolute;
579
+ top: 50%;
580
+ transform: translate(-50%, -50%);
581
+ width: 16px;
582
+ height: 16px;
583
+ background-color: var(--bg-brand);
584
+ border: 2px solid var(--bg-base-default);
585
+ border-radius: 50%;
586
+ cursor: pointer;
587
+ z-index: 1;
588
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
589
+ }
590
+
591
+ .ds-slider__thumb:hover {
592
+ transform: translate(-50%, -50%) scale(1.1);
593
+ }
594
+
595
+ .ds-slider__thumb:focus,
596
+ .ds-slider:focus-within .ds-slider__thumb {
597
+ box-shadow: 0 0 0 3px rgba(177, 166, 204, 0.3);
598
+ }
599
+
600
+ .ds-slider__value {
601
+ font-size: 12px;
602
+ color: var(--text-default);
603
+ text-align: right;
604
+ }
605
+
606
+ /* Date Picker */
607
+ .ds-datepicker {
608
+ position: relative;
609
+ width: 240px;
610
+ }
611
+
612
+ .ds-datepicker__input-wrap {
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 8px;
616
+ padding: 8px 12px;
617
+ background-color: var(--bg-base-default);
618
+ border: 1px solid var(--border-neutral-l2);
619
+ border-radius: 6px;
620
+ cursor: pointer;
621
+ transition: border-color 0.2s ease;
622
+ }
623
+
624
+ .ds-datepicker__input-wrap:hover {
625
+ border-color: var(--border-neutral-l3);
626
+ }
627
+
628
+ .ds-datepicker__input-wrap:focus-within {
629
+ border-color: var(--bg-brand);
630
+ }
631
+
632
+ .ds-datepicker__input {
633
+ flex: 1;
634
+ min-width: 0;
635
+ overflow: hidden;
636
+ background: none;
637
+ border: none;
638
+ color: var(--text-default);
639
+ font-size: 13px;
640
+ outline: none;
641
+ cursor: pointer;
642
+ -webkit-appearance: none;
643
+ appearance: none;
644
+ box-shadow: none;
645
+ }
646
+
647
+ .ds-datepicker__input::placeholder {
648
+ color: var(--text-tertiary);
649
+ }
650
+
651
+ .ds-datepicker__icon {
652
+ display: flex;
653
+ align-items: center;
654
+ justify-content: center;
655
+ background: none;
656
+ border: none;
657
+ cursor: pointer;
658
+ color: var(--icon-secondary);
659
+ }
660
+
661
+ .ds-datepicker__calendar {
662
+ position: absolute;
663
+ top: calc(100% + 4px);
664
+ left: 0;
665
+ width: 280px;
666
+ background-color: var(--bg-base-secondary);
667
+ border: 1px solid var(--border-neutral-l2);
668
+ border-radius: 6px;
669
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
670
+ z-index: 100;
671
+ }
672
+
673
+ .ds-datepicker__header {
674
+ display: flex;
675
+ justify-content: space-between;
676
+ align-items: center;
677
+ padding: 12px;
678
+ border-bottom: 1px solid var(--border-neutral-l1);
679
+ }
680
+
681
+ .ds-datepicker__nav {
682
+ display: flex;
683
+ align-items: center;
684
+ justify-content: center;
685
+ width: 28px;
686
+ height: 28px;
687
+ background: none;
688
+ border: none;
689
+ cursor: pointer;
690
+ border-radius: 4px;
691
+ color: var(--icon-secondary);
692
+ transition: background-color 0.15s ease, color 0.15s ease;
693
+ }
694
+
695
+ .ds-datepicker__nav:hover {
696
+ background-color: var(--bg-overlay-l1);
697
+ color: var(--icon-default);
698
+ }
699
+
700
+ .ds-datepicker__title {
701
+ font-size: 13px;
702
+ font-weight: 500;
703
+ color: var(--text-default);
704
+ }
705
+
706
+ .ds-datepicker__weekdays {
707
+ display: grid;
708
+ grid-template-columns: repeat(7, 1fr);
709
+ padding: 8px 12px;
710
+ border-bottom: 1px solid var(--border-neutral-l1);
711
+ }
712
+
713
+ .ds-datepicker__weekdays span {
714
+ text-align: center;
715
+ font-size: 11px;
716
+ color: var(--text-tertiary);
717
+ }
718
+
719
+ .ds-datepicker__days {
720
+ display: grid;
721
+ grid-template-columns: repeat(7, 1fr);
722
+ gap: 2px;
723
+ padding: 8px 12px;
724
+ }
725
+
726
+ .ds-datepicker__days button {
727
+ display: flex;
728
+ align-items: center;
729
+ justify-content: center;
730
+ height: 32px;
731
+ background: none;
732
+ border: none;
733
+ cursor: pointer;
734
+ font-size: 12px;
735
+ color: var(--text-default);
736
+ border-radius: 4px;
737
+ transition: background-color 0.15s ease;
738
+ }
739
+
740
+ .ds-datepicker__days button:hover {
741
+ background-color: var(--bg-overlay-l1);
742
+ }
743
+
744
+ .ds-datepicker__days button.is-today {
745
+ color: var(--bg-brand);
746
+ font-weight: 500;
747
+ }
748
+
749
+ .ds-datepicker__days button.is-selected {
750
+ background-color: var(--bg-brand);
751
+ color: var(--text-onbrand);
752
+ }
753
+
754
+ .ds-datepicker__days button.is-outside {
755
+ color: var(--text-tertiary);
756
+ }
757
+
758
+ /* Time Picker */
759
+ .ds-timepicker {
760
+ position: relative;
761
+ width: 160px;
762
+ }
763
+
764
+ .ds-timepicker__input-wrap {
765
+ display: flex;
766
+ align-items: center;
767
+ gap: 8px;
768
+ padding: 8px 12px;
769
+ background-color: var(--bg-base-default);
770
+ border: 1px solid var(--border-neutral-l2);
771
+ border-radius: 6px;
772
+ cursor: pointer;
773
+ transition: border-color 0.2s ease;
774
+ }
775
+
776
+ .ds-timepicker__input-wrap:hover {
777
+ border-color: var(--border-neutral-l3);
778
+ }
779
+
780
+ .ds-timepicker__input-wrap:focus-within {
781
+ border-color: var(--bg-brand);
782
+ }
783
+
784
+ .ds-timepicker__input {
785
+ flex: 1;
786
+ min-width: 0;
787
+ overflow: hidden;
788
+ background: none;
789
+ border: none;
790
+ color: var(--text-default);
791
+ font-size: 13px;
792
+ outline: none;
793
+ cursor: pointer;
794
+ -webkit-appearance: none;
795
+ appearance: none;
796
+ box-shadow: none;
797
+ }
798
+
799
+ .ds-timepicker__input::placeholder {
800
+ color: var(--text-tertiary);
801
+ }
802
+
803
+ .ds-timepicker__icon {
804
+ display: flex;
805
+ align-items: center;
806
+ justify-content: center;
807
+ background: none;
808
+ border: none;
809
+ cursor: pointer;
810
+ color: var(--icon-secondary);
811
+ }
812
+
813
+ .ds-timepicker__panel {
814
+ position: absolute;
815
+ top: calc(100% + 4px);
816
+ left: 0;
817
+ width: 240px;
818
+ background-color: var(--bg-base-secondary);
819
+ border: 1px solid var(--border-neutral-l2);
820
+ border-radius: 6px;
821
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
822
+ z-index: 100;
823
+ display: none;
824
+ }
825
+
826
+ .ds-timepicker__header {
827
+ display: flex;
828
+ justify-content: space-between;
829
+ align-items: center;
830
+ padding: 12px;
831
+ border-bottom: 1px solid var(--border-neutral-l1);
832
+ }
833
+
834
+ .ds-timepicker__nav {
835
+ display: flex;
836
+ align-items: center;
837
+ justify-content: center;
838
+ width: 28px;
839
+ height: 28px;
840
+ background: none;
841
+ border: none;
842
+ cursor: pointer;
843
+ border-radius: 4px;
844
+ color: var(--icon-secondary);
845
+ transition: background-color 0.15s ease, color 0.15s ease;
846
+ }
847
+
848
+ .ds-timepicker__nav:hover {
849
+ background-color: var(--bg-overlay-l1);
850
+ color: var(--icon-default);
851
+ }
852
+
853
+ .ds-timepicker__display {
854
+ display: flex;
855
+ align-items: center;
856
+ gap: 4px;
857
+ font-size: 18px;
858
+ font-weight: 600;
859
+ color: var(--text-default);
860
+ font-family: var(--code-editor-font-family);
861
+ }
862
+
863
+ .ds-timepicker__actions {
864
+ display: flex;
865
+ gap: 8px;
866
+ }
867
+
868
+ .ds-timepicker__separator {
869
+ color: var(--text-tertiary);
870
+ }
871
+
872
+ .ds-timepicker__body {
873
+ display: flex;
874
+ gap: 16px;
875
+ padding: 12px;
876
+ }
877
+
878
+ .ds-timepicker__section {
879
+ flex: 1;
880
+ display: flex;
881
+ flex-direction: column;
882
+ gap: 8px;
883
+ }
884
+
885
+ .ds-timepicker__section-label {
886
+ font-size: 11px;
887
+ font-weight: 500;
888
+ color: var(--text-tertiary);
889
+ text-transform: uppercase;
890
+ letter-spacing: 0.5px;
891
+ }
892
+
893
+ .ds-timepicker__grid {
894
+ display: grid;
895
+ grid-template-columns: repeat(6, 1fr);
896
+ gap: 4px;
897
+ }
898
+
899
+ .ds-timepicker__grid--hour {
900
+ grid-template-columns: repeat(4, 1fr);
901
+ }
902
+
903
+ .ds-timepicker__grid--minute {
904
+ grid-template-columns: repeat(2, 1fr);
905
+ }
906
+
907
+ .ds-timepicker__column {
908
+ flex: 1;
909
+ display: flex;
910
+ flex-direction: column;
911
+ gap: 4px;
912
+ }
913
+
914
+ .ds-timepicker__scroll {
915
+ flex: 1;
916
+ max-height: 120px;
917
+ overflow-y: auto;
918
+ display: flex;
919
+ flex-direction: column;
920
+ gap: 2px;
921
+ }
922
+
923
+ .ds-timepicker__item {
924
+ padding: 6px;
925
+ background: none;
926
+ border: none;
927
+ cursor: pointer;
928
+ font-size: 13px;
929
+ color: var(--text-default);
930
+ font-family: var(--code-editor-font-family);
931
+ text-align: center;
932
+ border-radius: 4px;
933
+ transition: background-color 0.15s ease;
934
+ }
935
+
936
+ .ds-timepicker__item:hover {
937
+ background-color: var(--bg-overlay-l1);
938
+ }
939
+
940
+ .ds-timepicker__item.is-selected {
941
+ background-color: var(--bg-brand);
942
+ color: var(--text-onbrand);
943
+ }
944
+
945
+ .ds-timepicker__arrow {
946
+ padding: 4px;
947
+ background: none;
948
+ border: none;
949
+ cursor: pointer;
950
+ color: var(--icon-secondary);
951
+ font-size: 12px;
952
+ border-radius: 4px;
953
+ transition: background-color 0.15s ease, color 0.15s ease;
954
+ }
955
+
956
+ .ds-timepicker__arrow:hover {
957
+ background-color: var(--bg-overlay-l1);
958
+ color: var(--icon-default);
959
+ }
960
+
961
+ .ds-timepicker__footer {
962
+ display: flex;
963
+ justify-content: flex-end;
964
+ gap: 8px;
965
+ padding: 12px;
966
+ border-top: 1px solid var(--border-neutral-l1);
967
+ }
968
+
969
+ .ds-timepicker__btn {
970
+ padding: 6px 12px;
971
+ background: none;
972
+ border: none;
973
+ cursor: pointer;
974
+ font-size: 12px;
975
+ border-radius: 4px;
976
+ transition: background-color 0.15s ease;
977
+ }
978
+
979
+ .ds-timepicker__btn--cancel {
980
+ color: var(--text-secondary);
981
+ }
982
+
983
+ .ds-timepicker__btn--cancel:hover {
984
+ background-color: var(--bg-overlay-l1);
985
+ }
986
+
987
+ .ds-timepicker__btn--confirm {
988
+ background-color: var(--bg-brand);
989
+ color: var(--text-onbrand);
990
+ font-weight: 500;
991
+ }
992
+
993
+ .ds-timepicker__btn--confirm:hover {
994
+ opacity: 0.9;
995
+ }
996
+
997
+ /* Number Input */
998
+ .ds-number-input {
999
+ display: flex;
1000
+ align-items: center;
1001
+ background-color: var(--bg-base-default);
1002
+ border: 1px solid var(--border-neutral-l2);
1003
+ border-radius: 6px;
1004
+ overflow: hidden;
1005
+ }
1006
+
1007
+ .ds-number-input__btn {
1008
+ display: flex;
1009
+ align-items: center;
1010
+ justify-content: center;
1011
+ width: 32px;
1012
+ height: 28px;
1013
+ background: var(--bg-overlay-l1);
1014
+ border: none;
1015
+ cursor: pointer;
1016
+ color: var(--text-secondary);
1017
+ font-size: 16px;
1018
+ transition: background 0.2s ease;
1019
+ }
1020
+
1021
+ .ds-number-input__btn:hover {
1022
+ background: var(--bg-overlay-l2);
1023
+ color: var(--text-default);
1024
+ }
1025
+
1026
+ .ds-number-input__input {
1027
+ flex: 1;
1028
+ width: 60px;
1029
+ height: 28px;
1030
+ padding: 0 8px;
1031
+ background: transparent;
1032
+ border: none;
1033
+ text-align: center;
1034
+ color: var(--text-default);
1035
+ font-size: 13px;
1036
+ outline: none;
1037
+ -webkit-appearance: none;
1038
+ appearance: none;
1039
+ box-shadow: none;
1040
+ }
1041
+
1042
+ .ds-number-input__input::-webkit-outer-spin-button,
1043
+ .ds-number-input__input::-webkit-inner-spin-button {
1044
+ -webkit-appearance: none;
1045
+ margin: 0;
1046
+ }
1047
+
1048
+ .ds-number-input__input[type=number] {
1049
+ -moz-appearance: textfield;
1050
+ -webkit-appearance: textfield;
1051
+ appearance: textfield;
1052
+ }
1053
+
1054
+ /* Countdown */
1055
+ .ds-countdown {
1056
+ display: flex;
1057
+ align-items: center;
1058
+ gap: 4px;
1059
+ }
1060
+
1061
+ .ds-countdown__item {
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ align-items: center;
1065
+ gap: 4px;
1066
+ padding: 8px 12px;
1067
+ background: var(--bg-overlay-l1);
1068
+ border: 1px solid var(--border-neutral-l2);
1069
+ border-radius: 6px;
1070
+ min-width: 56px;
1071
+ }
1072
+
1073
+ .ds-countdown__value {
1074
+ font-size: 20px;
1075
+ font-weight: 600;
1076
+ color: var(--text-default);
1077
+ font-family: var(--code-editor-font-family);
1078
+ }
1079
+
1080
+ .ds-countdown__label {
1081
+ font-size: 10px;
1082
+ color: var(--text-tertiary);
1083
+ text-transform: uppercase;
1084
+ }
1085
+
1086
+ .ds-countdown__separator {
1087
+ font-size: 16px;
1088
+ font-weight: 300;
1089
+ color: var(--text-tertiary);
1090
+ padding-top: 8px;
1091
+ }
1092
+
1093
+ /* File Upload */
1094
+ .ds-fileupload {
1095
+ display: flex;
1096
+ flex-direction: column;
1097
+ gap: 12px;
1098
+ }
1099
+
1100
+ .ds-fileupload__dropzone {
1101
+ position: relative;
1102
+ display: flex;
1103
+ flex-direction: column;
1104
+ align-items: center;
1105
+ justify-content: center;
1106
+ gap: 12px;
1107
+ padding: 32px;
1108
+ background-color: var(--bg-base-default);
1109
+ border: 2px dashed var(--border-neutral-l2);
1110
+ border-radius: 8px;
1111
+ cursor: pointer;
1112
+ transition: border-color 0.2s ease, background-color 0.2s ease;
1113
+ }
1114
+
1115
+ .ds-fileupload__dropzone:hover {
1116
+ border-color: var(--bg-brand);
1117
+ background-color: var(--bg-overlay-l1);
1118
+ }
1119
+
1120
+ .ds-fileupload__dropzone.is-dragging {
1121
+ border-color: var(--bg-brand);
1122
+ background-color: var(--bg-brand-popup);
1123
+ }
1124
+
1125
+ .ds-fileupload__icon {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ justify-content: center;
1129
+ width: 48px;
1130
+ height: 48px;
1131
+ background-color: var(--bg-overlay-l2);
1132
+ border-radius: 12px;
1133
+ color: var(--icon-secondary);
1134
+ }
1135
+
1136
+ .ds-fileupload__text {
1137
+ display: flex;
1138
+ flex-direction: column;
1139
+ align-items: center;
1140
+ gap: 4px;
1141
+ }
1142
+
1143
+ .ds-fileupload__title {
1144
+ font-size: 14px;
1145
+ font-weight: 500;
1146
+ color: var(--text-default);
1147
+ }
1148
+
1149
+ .ds-fileupload__subtitle {
1150
+ font-size: 12px;
1151
+ color: var(--text-secondary);
1152
+ }
1153
+
1154
+ .ds-fileupload__input {
1155
+ position: absolute;
1156
+ left: 0;
1157
+ top: 0;
1158
+ width: 100%;
1159
+ height: 100%;
1160
+ opacity: 0;
1161
+ cursor: pointer;
1162
+ }
1163
+
1164
+ .ds-fileupload--disabled .ds-fileupload__dropzone {
1165
+ opacity: 0.6;
1166
+ cursor: not-allowed;
1167
+ border-style: solid;
1168
+ border-color: var(--border-neutral-l3);
1169
+ background-color: var(--bg-overlay-l3);
1170
+ }
1171
+
1172
+ .ds-fileupload--disabled .ds-fileupload__dropzone:hover {
1173
+ border-color: var(--border-neutral-l3);
1174
+ background-color: var(--bg-overlay-l3);
1175
+ }
1176
+
1177
+ .ds-fileupload--disabled .ds-fileupload__icon {
1178
+ background-color: var(--bg-overlay-l4);
1179
+ color: var(--text-tertiary);
1180
+ }
1181
+
1182
+ .ds-fileupload--disabled .ds-fileupload__title {
1183
+ color: var(--text-tertiary);
1184
+ }
1185
+
1186
+ .ds-fileupload--disabled .ds-fileupload__subtitle {
1187
+ color: var(--text-disabled);
1188
+ }
1189
+
1190
+ .ds-fileupload--disabled .ds-fileupload__input {
1191
+ pointer-events: none;
1192
+ }
1193
+
1194
+ .ds-fileupload__list {
1195
+ display: flex;
1196
+ flex-direction: column;
1197
+ gap: 8px;
1198
+ }
1199
+
1200
+ .ds-fileupload__item {
1201
+ display: flex;
1202
+ align-items: center;
1203
+ gap: 8px;
1204
+ padding: 8px 12px;
1205
+ background-color: var(--bg-base-default);
1206
+ border: 1px solid var(--border-neutral-l1);
1207
+ border-radius: 6px;
1208
+ }
1209
+
1210
+ .ds-fileupload__filename {
1211
+ flex: 1;
1212
+ font-size: 12px;
1213
+ color: var(--text-default);
1214
+ }
1215
+
1216
+ .ds-fileupload__size {
1217
+ font-size: 11px;
1218
+ color: var(--text-tertiary);
1219
+ }
1220
+
1221
+ .ds-fileupload__remove {
1222
+ display: flex;
1223
+ align-items: center;
1224
+ justify-content: center;
1225
+ width: 24px;
1226
+ height: 24px;
1227
+ background: none;
1228
+ border: none;
1229
+ cursor: pointer;
1230
+ color: var(--icon-secondary);
1231
+ border-radius: 4px;
1232
+ transition: background-color 0.15s ease, color 0.15s ease;
1233
+ }
1234
+
1235
+ .ds-fileupload__remove:hover {
1236
+ background-color: var(--bg-overlay-l1);
1237
+ color: var(--icon-default);
1238
+ }
1239
+
1240
+ .ds-fileupload__error {
1241
+ margin-top: 8px;
1242
+ padding: 8px 12px;
1243
+ background-color: var(--bg-error-l2);
1244
+ border: 1px solid var(--border-error);
1245
+ border-radius: 4px;
1246
+ font-size: 12px;
1247
+ color: var(--text-error);
1248
+ }
1249
+
1250
+ .ds-fileupload__preview {
1251
+ display: flex;
1252
+ flex-wrap: wrap;
1253
+ gap: 8px;
1254
+ }
1255
+
1256
+ .ds-fileupload__preview-item {
1257
+ position: relative;
1258
+ width: 80px;
1259
+ height: 80px;
1260
+ border-radius: 6px;
1261
+ overflow: hidden;
1262
+ border: 1px solid var(--border-neutral-l1);
1263
+ }
1264
+
1265
+ .ds-fileupload__preview-item img {
1266
+ width: 100%;
1267
+ height: 100%;
1268
+ object-fit: cover;
1269
+ }
1270
+
1271
+ .ds-fileupload__preview-remove {
1272
+ position: absolute;
1273
+ top: 4px;
1274
+ right: 4px;
1275
+ display: flex;
1276
+ align-items: center;
1277
+ justify-content: center;
1278
+ width: 20px;
1279
+ height: 20px;
1280
+ background-color: rgba(0, 0, 0, 0.6);
1281
+ border: none;
1282
+ border-radius: 50%;
1283
+ cursor: pointer;
1284
+ color: var(--text-white);
1285
+ opacity: 0;
1286
+ transition: opacity 0.2s ease;
1287
+ }
1288
+
1289
+ .ds-fileupload__preview-item:hover .ds-fileupload__preview-remove {
1290
+ opacity: 1;
1291
+ }
1292
+
1293
+ .ds-fileupload__progress {
1294
+ position: relative;
1295
+ height: 6px;
1296
+ background-color: var(--bg-overlay-l2);
1297
+ border-radius: 3px;
1298
+ overflow: hidden;
1299
+ margin-bottom: 8px;
1300
+ transition: opacity 0.2s ease;
1301
+ }
1302
+
1303
+ .ds-fileupload__progress-bar {
1304
+ height: 100%;
1305
+ background-color: var(--bg-brand);
1306
+ border-radius: 3px;
1307
+ transition: width 0.1s ease;
1308
+ box-shadow: 0 0 8px rgba(50, 240, 140, 0.4);
1309
+ }
1310
+
1311
+ /* Timeline */
1312
+ .ds-timeline {
1313
+ display: flex;
1314
+ flex-direction: column;
1315
+ gap: 0;
1316
+ padding: 8px 0;
1317
+ }
1318
+
1319
+ .ds-timeline__item {
1320
+ display: flex;
1321
+ gap: 12px;
1322
+ padding: 12px 0;
1323
+ border-left: 2px solid var(--border-neutral-l2);
1324
+ margin-left: 8px;
1325
+ }
1326
+
1327
+ .ds-timeline__item:first-child {
1328
+ padding-top: 0;
1329
+ }
1330
+
1331
+ .ds-timeline__item:last-child {
1332
+ padding-bottom: 0;
1333
+ }
1334
+
1335
+ .ds-timeline__marker {
1336
+ flex-shrink: 0;
1337
+ width: 12px;
1338
+ height: 12px;
1339
+ background-color: var(--bg-brand);
1340
+ border: 3px solid var(--bg-base-secondary);
1341
+ border-radius: 50%;
1342
+ margin-left: -7px;
1343
+ margin-top: 4px;
1344
+ }
1345
+
1346
+ .ds-timeline__content {
1347
+ display: flex;
1348
+ flex-direction: column;
1349
+ gap: 4px;
1350
+ }
1351
+
1352
+ .ds-timeline__time {
1353
+ font-size: 11px;
1354
+ color: var(--text-tertiary);
1355
+ }
1356
+
1357
+ .ds-timeline__title {
1358
+ font-size: 13px;
1359
+ font-weight: 500;
1360
+ color: var(--text-default);
1361
+ }
1362
+
1363
+ .ds-timeline__description {
1364
+ font-size: 12px;
1365
+ color: var(--text-secondary);
1366
+ }
1367
+
1368
+ /* Ellipsis */
1369
+ .ds-ellipsis {
1370
+ overflow: hidden;
1371
+ text-overflow: ellipsis;
1372
+ white-space: nowrap;
1373
+ }
1374
+
1375
+ .ds-ellipsis--line-clamp {
1376
+ display: -webkit-box;
1377
+ display: box;
1378
+ -webkit-line-clamp: 2;
1379
+ line-clamp: 2;
1380
+ -webkit-box-orient: vertical;
1381
+ box-orient: vertical;
1382
+ white-space: normal;
1383
+ }
1384
+
1385
+ .ds-ellipsis--line-clamp-3 {
1386
+ -webkit-line-clamp: 3;
1387
+ line-clamp: 3;
1388
+ }
1389
+
1390
+ @keyframes ds-spin-rotate {
1391
+ from { transform: rotate(0deg); }
1392
+ to { transform: rotate(360deg); }
1393
+ }
1394
+
1395
+ /* Skeleton */
1396
+ .ds-skeleton {
1397
+ background-color: var(--bg-overlay-l2);
1398
+ border-radius: 4px;
1399
+ animation: ds-skeleton-pulse 1.5s ease-in-out infinite;
1400
+ }
1401
+
1402
+ .ds-skeleton--circle {
1403
+ border-radius: 50%;
1404
+ }
1405
+
1406
+ @keyframes ds-skeleton-pulse {
1407
+ 0%, 100% { opacity: 1; }
1408
+ 50% { opacity: 0.5; }
1409
+ }
1410
+
1411
+ /* Breadcrumb */
1412
+ .ds-breadcrumb {
1413
+ display: flex;
1414
+ align-items: center;
1415
+ gap: 4px;
1416
+ }
1417
+
1418
+ .ds-breadcrumb__item {
1419
+ display: flex;
1420
+ align-items: center;
1421
+ font-size: 12px;
1422
+ color: var(--text-secondary);
1423
+ }
1424
+
1425
+ .ds-breadcrumb__item:last-child {
1426
+ color: var(--text-default);
1427
+ }
1428
+
1429
+ .ds-breadcrumb__item:last-child .ds-breadcrumb__icon {
1430
+ display: none;
1431
+ }
1432
+
1433
+ .ds-breadcrumb__icon {
1434
+ margin-left: 4px;
1435
+ color: var(--icon-secondary);
1436
+ }
1437
+
1438
+ .ds-breadcrumb__item a {
1439
+ color: inherit;
1440
+ text-decoration: none;
1441
+ }
1442
+
1443
+ .ds-breadcrumb__item a:hover {
1444
+ color: var(--text-brand);
1445
+ }
1446
+
1447
+ /* Float Button */
1448
+ .ds-float-btn {
1449
+ position: fixed;
1450
+ right: 24px;
1451
+ bottom: 24px;
1452
+ width: 48px;
1453
+ height: 48px;
1454
+ border-radius: 50%;
1455
+ background-color: var(--bg-brand);
1456
+ color: var(--text-onbrand);
1457
+ border: none;
1458
+ display: flex;
1459
+ align-items: center;
1460
+ justify-content: center;
1461
+ cursor: pointer;
1462
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
1463
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
1464
+ z-index: 100;
1465
+ }
1466
+
1467
+ .ds-float-btn:hover {
1468
+ transform: scale(1.1);
1469
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25);
1470
+ }
1471
+
1472
+ .ds-float-btn:active {
1473
+ transform: scale(0.95);
1474
+ }
1475
+
1476
+ .ds-float-btn--left {
1477
+ right: auto;
1478
+ left: 24px;
1479
+ }
1480
+
1481
+ .ds-float-btn--top {
1482
+ bottom: auto;
1483
+ top: 24px;
1484
+ }
1485
+
1486
+ /* Collapse */
1487
+ .ds-collapse {
1488
+ border-radius: 6px;
1489
+ border: 1px solid var(--border-neutral-l1);
1490
+ overflow: hidden;
1491
+ }
1492
+
1493
+ .ds-collapse__item {
1494
+ border-bottom: 1px solid var(--border-neutral-l1);
1495
+ }
1496
+
1497
+ .ds-collapse__item:last-child {
1498
+ border-bottom: none;
1499
+ }
1500
+
1501
+ .ds-collapse__header {
1502
+ display: flex;
1503
+ align-items: center;
1504
+ justify-content: space-between;
1505
+ padding: 12px 16px;
1506
+ background-color: var(--bg-base-secondary);
1507
+ cursor: pointer;
1508
+ user-select: none;
1509
+ }
1510
+
1511
+ .ds-collapse__header:hover {
1512
+ background-color: var(--bg-overlay-l1);
1513
+ }
1514
+
1515
+ .ds-collapse__title {
1516
+ font-size: 13px;
1517
+ font-weight: 500;
1518
+ color: var(--text-default);
1519
+ }
1520
+
1521
+ .ds-collapse__icon {
1522
+ color: var(--icon-secondary);
1523
+ transition: transform 0.2s ease;
1524
+ }
1525
+
1526
+ .ds-collapse__item.is-active .ds-collapse__icon {
1527
+ transform: rotate(180deg);
1528
+ }
1529
+
1530
+ .ds-collapse__content {
1531
+ padding: 0 16px;
1532
+ height: 0;
1533
+ overflow: hidden;
1534
+ transition: height 0.3s ease, padding 0.3s ease;
1535
+ background-color: var(--bg-base-default);
1536
+ }
1537
+
1538
+ .ds-collapse__item.is-active .ds-collapse__content {
1539
+ padding: 12px 16px;
1540
+ }
1541
+
1542
+ /* Carousel */
1543
+ .ds-carousel {
1544
+ position: relative;
1545
+ overflow: hidden;
1546
+ border-radius: 6px;
1547
+ }
1548
+
1549
+ .ds-carousel__track {
1550
+ display: flex;
1551
+ transition: transform 0.4s ease;
1552
+ }
1553
+
1554
+ .ds-carousel__item {
1555
+ flex: 0 0 100%;
1556
+ width: 100%;
1557
+ height: 200px;
1558
+ display: flex;
1559
+ align-items: center;
1560
+ justify-content: center;
1561
+ background-color: var(--bg-overlay-l2);
1562
+ color: var(--text-secondary);
1563
+ font-size: 16px;
1564
+ }
1565
+
1566
+ .ds-carousel__prev,
1567
+ .ds-carousel__next {
1568
+ position: absolute;
1569
+ top: 50%;
1570
+ transform: translateY(-50%);
1571
+ width: 32px;
1572
+ height: 32px;
1573
+ border-radius: 50%;
1574
+ background-color: rgba(0, 0, 0, 0.5);
1575
+ color: white;
1576
+ border: none;
1577
+ cursor: pointer;
1578
+ display: flex;
1579
+ align-items: center;
1580
+ justify-content: center;
1581
+ transition: background-color 0.2s ease;
1582
+ }
1583
+
1584
+ .ds-carousel__prev:hover,
1585
+ .ds-carousel__next:hover {
1586
+ background-color: rgba(0, 0, 0, 0.7);
1587
+ }
1588
+
1589
+ .ds-carousel__prev {
1590
+ left: 12px;
1591
+ }
1592
+
1593
+ .ds-carousel__next {
1594
+ right: 12px;
1595
+ }
1596
+
1597
+ .ds-carousel__indicators {
1598
+ position: absolute;
1599
+ bottom: 12px;
1600
+ left: 50%;
1601
+ transform: translateX(-50%);
1602
+ display: flex;
1603
+ align-items: center;
1604
+ gap: 8px;
1605
+ }
1606
+
1607
+ .ds-carousel__auto {
1608
+ font-size: 11px;
1609
+ color: rgba(255, 255, 255, 0.7);
1610
+ cursor: pointer;
1611
+ padding: 2px 6px;
1612
+ border-radius: 3px;
1613
+ transition: color 0.2s ease, background-color 0.2s ease;
1614
+ display: flex;
1615
+ align-items: center;
1616
+ }
1617
+
1618
+ .ds-carousel__auto:hover {
1619
+ color: white;
1620
+ background-color: rgba(255, 255, 255, 0.2);
1621
+ }
1622
+
1623
+ .ds-carousel__auto.is-active {
1624
+ color: white;
1625
+ background-color: rgba(255, 255, 255, 0.3);
1626
+ }
1627
+
1628
+ .ds-carousel__indicator {
1629
+ width: 8px;
1630
+ height: 8px;
1631
+ border-radius: 50%;
1632
+ background-color: rgba(255, 255, 255, 0.5);
1633
+ cursor: pointer;
1634
+ transition: background-color 0.2s ease;
1635
+ }
1636
+
1637
+ .ds-carousel__indicator.is-active {
1638
+ background-color: white;
1639
+ }
1640
+
1641
+ /* Drawer */
1642
+ .ds-drawer-mask {
1643
+ position: fixed;
1644
+ top: 0;
1645
+ left: 0;
1646
+ right: 0;
1647
+ bottom: 0;
1648
+ background-color: rgba(0, 0, 0, 0.5);
1649
+ z-index: 1000;
1650
+ opacity: 0;
1651
+ visibility: hidden;
1652
+ transition: opacity 0.3s ease, visibility 0.3s ease;
1653
+ }
1654
+
1655
+ .ds-drawer-mask.is-visible {
1656
+ opacity: 1;
1657
+ visibility: visible;
1658
+ }
1659
+
1660
+ .ds-drawer {
1661
+ position: fixed;
1662
+ top: 0;
1663
+ bottom: 0;
1664
+ width: 320px;
1665
+ background-color: var(--bg-base-secondary);
1666
+ z-index: 1001;
1667
+ transform: translateX(-100%);
1668
+ transition: transform 0.3s ease;
1669
+ display: flex;
1670
+ flex-direction: column;
1671
+ }
1672
+
1673
+ .ds-drawer--right {
1674
+ right: 0;
1675
+ left: auto;
1676
+ transform: translateX(100%);
1677
+ }
1678
+
1679
+ .ds-drawer.is-visible {
1680
+ transform: translateX(0);
1681
+ }
1682
+
1683
+ .ds-drawer__header {
1684
+ display: flex;
1685
+ align-items: center;
1686
+ justify-content: space-between;
1687
+ padding: 16px;
1688
+ border-bottom: 1px solid var(--border-neutral-l1);
1689
+ }
1690
+
1691
+ .ds-drawer__title {
1692
+ font-size: 16px;
1693
+ font-weight: 600;
1694
+ color: var(--text-default);
1695
+ }
1696
+
1697
+ .ds-drawer__close {
1698
+ width: 28px;
1699
+ height: 28px;
1700
+ border-radius: 6px;
1701
+ background-color: var(--bg-overlay-l1);
1702
+ border: none;
1703
+ cursor: pointer;
1704
+ display: flex;
1705
+ align-items: center;
1706
+ justify-content: center;
1707
+ color: var(--icon-default);
1708
+ }
1709
+
1710
+ .ds-drawer__close:hover {
1711
+ background-color: var(--bg-overlay-l2);
1712
+ }
1713
+
1714
+ .ds-drawer__body {
1715
+ flex: 1;
1716
+ padding: 16px;
1717
+ overflow-y: auto;
1718
+ }
1719
+
1720
+ .ds-drawer__footer {
1721
+ padding: 12px 16px;
1722
+ border-top: 1px solid var(--border-neutral-l1);
1723
+ display: flex;
1724
+ gap: 8px;
1725
+ justify-content: flex-end;
1726
+ }
1727
+
1728
+ /* Modal */
1729
+ .ds-modal-mask {
1730
+ position: fixed;
1731
+ top: 0;
1732
+ left: 0;
1733
+ right: 0;
1734
+ bottom: 0;
1735
+ background-color: rgba(0, 0, 0, 0.5);
1736
+ z-index: 1000;
1737
+ display: flex;
1738
+ align-items: center;
1739
+ justify-content: center;
1740
+ opacity: 0;
1741
+ visibility: hidden;
1742
+ transition: opacity 0.3s ease, visibility 0.3s ease;
1743
+ }
1744
+
1745
+ .ds-modal-mask.is-visible {
1746
+ opacity: 1;
1747
+ visibility: visible;
1748
+ }
1749
+
1750
+ .ds-modal {
1751
+ background-color: var(--bg-base-secondary);
1752
+ border-radius: 8px;
1753
+ width: 90%;
1754
+ max-width: 480px;
1755
+ max-height: 80vh;
1756
+ overflow: hidden;
1757
+ transform: scale(0.9);
1758
+ transition: transform 0.3s ease;
1759
+ }
1760
+
1761
+ .ds-modal-mask.is-visible .ds-modal {
1762
+ transform: scale(1);
1763
+ }
1764
+
1765
+ .ds-modal__header {
1766
+ display: flex;
1767
+ align-items: center;
1768
+ justify-content: space-between;
1769
+ padding: 16px;
1770
+ border-bottom: 1px solid var(--border-neutral-l1);
1771
+ }
1772
+
1773
+ .ds-modal__title {
1774
+ font-size: 16px;
1775
+ font-weight: 600;
1776
+ color: var(--text-default);
1777
+ }
1778
+
1779
+ .ds-modal__close {
1780
+ width: 28px;
1781
+ height: 28px;
1782
+ border-radius: 6px;
1783
+ background-color: var(--bg-overlay-l1);
1784
+ border: none;
1785
+ cursor: pointer;
1786
+ display: flex;
1787
+ align-items: center;
1788
+ justify-content: center;
1789
+ color: var(--icon-default);
1790
+ }
1791
+
1792
+ .ds-modal__close:hover {
1793
+ background-color: var(--bg-overlay-l2);
1794
+ }
1795
+
1796
+ .ds-modal__body {
1797
+ padding: 16px;
1798
+ max-height: 60vh;
1799
+ overflow-y: auto;
1800
+ }
1801
+
1802
+ .ds-modal__footer {
1803
+ padding: 12px 16px;
1804
+ border-top: 1px solid var(--border-neutral-l1);
1805
+ display: flex;
1806
+ gap: 8px;
1807
+ justify-content: flex-end;
1808
+ }
1809
+
1810
+ /* Dialog */
1811
+ .ds-dialog {
1812
+ background-color: var(--bg-base-secondary);
1813
+ border-radius: 8px;
1814
+ padding: 20px;
1815
+ min-width: 320px;
1816
+ text-align: center;
1817
+ }
1818
+
1819
+ .ds-dialog__icon {
1820
+ width: 48px;
1821
+ height: 48px;
1822
+ border-radius: 50%;
1823
+ display: flex;
1824
+ align-items: center;
1825
+ justify-content: center;
1826
+ margin: 0 auto 12px;
1827
+ }
1828
+
1829
+ .ds-dialog__icon--normal {
1830
+ background-color: var(--bg-overlay-l2);
1831
+ color: var(--text-tertiary);
1832
+ }
1833
+
1834
+ .ds-dialog__icon--success {
1835
+ background-color: var(--status-success-surface-l1);
1836
+ color: var(--status-success-default);
1837
+ }
1838
+
1839
+ .ds-dialog__icon--warning {
1840
+ background-color: var(--status-warning-surface-l1);
1841
+ color: var(--status-warning-default);
1842
+ }
1843
+
1844
+ .ds-dialog__icon--error {
1845
+ background-color: var(--status-error-surface-l1);
1846
+ color: var(--status-error-default);
1847
+ }
1848
+
1849
+ .ds-dialog__icon--info {
1850
+ background-color: var(--status-info-surface-l1);
1851
+ color: var(--status-info-default);
1852
+ }
1853
+
1854
+ .ds-dialog__title {
1855
+ font-size: 16px;
1856
+ font-weight: 600;
1857
+ color: var(--text-default);
1858
+ margin-bottom: 8px;
1859
+ }
1860
+
1861
+ .ds-dialog__content {
1862
+ font-size: 13px;
1863
+ color: var(--text-secondary);
1864
+ margin-bottom: 16px;
1865
+ line-height: 1.5;
1866
+ }
1867
+
1868
+ .ds-dialog__actions {
1869
+ display: flex;
1870
+ gap: 8px;
1871
+ justify-content: center;
1872
+ }
1873
+
1874
+ /* Notification */
1875
+ .ds-notification {
1876
+ position: fixed;
1877
+ top: 24px;
1878
+ right: 24px;
1879
+ z-index: 2000;
1880
+ display: flex;
1881
+ flex-direction: column;
1882
+ gap: 12px;
1883
+ }
1884
+
1885
+ .ds-notification__item {
1886
+ display: flex;
1887
+ align-items: flex-start;
1888
+ gap: 12px;
1889
+ padding: 12px 16px;
1890
+ background-color: var(--bg-base-secondary);
1891
+ border-radius: 6px;
1892
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1893
+ min-width: 300px;
1894
+ max-width: 400px;
1895
+ animation: ds-notification-in 0.3s ease;
1896
+ }
1897
+
1898
+ @keyframes ds-notification-in {
1899
+ from {
1900
+ opacity: 0;
1901
+ transform: translateX(100%);
1902
+ }
1903
+ to {
1904
+ opacity: 1;
1905
+ transform: translateX(0);
1906
+ }
1907
+ }
1908
+
1909
+ .ds-notification__item.is-exiting {
1910
+ animation: ds-notification-out 0.3s ease;
1911
+ }
1912
+
1913
+ @keyframes ds-notification-out {
1914
+ from {
1915
+ opacity: 1;
1916
+ transform: translateX(0);
1917
+ }
1918
+ to {
1919
+ opacity: 0;
1920
+ transform: translateX(100%);
1921
+ }
1922
+ }
1923
+
1924
+ .ds-notification__icon {
1925
+ flex-shrink: 0;
1926
+ width: 20px;
1927
+ height: 20px;
1928
+ display: flex;
1929
+ align-items: center;
1930
+ justify-content: center;
1931
+ }
1932
+
1933
+ .ds-notification__item--normal { background: var(--bg-overlay-l1); border-left: 3px solid var(--border-neutral-l1); }
1934
+ .ds-notification__item--normal .ds-notification__icon { color: var(--text-tertiary); }
1935
+ .ds-notification__item--success { background: var(--status-success-surface-l1); border-left: 3px solid var(--status-success-default); }
1936
+ .ds-notification__item--success .ds-notification__icon { color: var(--status-success-default); }
1937
+ .ds-notification__item--warning { background: var(--status-warning-surface-l1); border-left: 3px solid var(--status-warning-default); }
1938
+ .ds-notification__item--warning .ds-notification__icon { color: var(--status-warning-default); }
1939
+ .ds-notification__item--error { background: var(--status-error-surface-l1); border-left: 3px solid var(--status-error-default); }
1940
+ .ds-notification__item--error .ds-notification__icon { color: var(--status-error-default); }
1941
+ .ds-notification__item--info { background: var(--status-info-surface-l1); border-left: 3px solid var(--status-info-default); }
1942
+ .ds-notification__item--info .ds-notification__icon { color: var(--status-info-default); }
1943
+
1944
+ .ds-notification__content {
1945
+ flex: 1;
1946
+ min-width: 0;
1947
+ }
1948
+
1949
+ .ds-notification__title {
1950
+ font-size: 13px;
1951
+ font-weight: 600;
1952
+ color: var(--text-default);
1953
+ margin-bottom: 4px;
1954
+ }
1955
+
1956
+ .ds-notification__message {
1957
+ font-size: 12px;
1958
+ color: var(--text-secondary);
1959
+ }
1960
+
1961
+ .ds-notification__close {
1962
+ flex-shrink: 0;
1963
+ width: 24px;
1964
+ height: 24px;
1965
+ border-radius: 4px;
1966
+ background-color: transparent;
1967
+ border: none;
1968
+ cursor: pointer;
1969
+ display: flex;
1970
+ align-items: center;
1971
+ justify-content: center;
1972
+ color: var(--icon-secondary);
1973
+ }
1974
+
1975
+ .ds-notification__close:hover {
1976
+ background-color: var(--bg-overlay-l1);
1977
+ }
1978
+
1979
+ /* Message */
1980
+ .ds-message {
1981
+ position: fixed;
1982
+ top: 0;
1983
+ left: 0;
1984
+ right: 0;
1985
+ z-index: 2000;
1986
+ display: flex;
1987
+ flex-direction: column;
1988
+ align-items: center;
1989
+ padding-top: 16px;
1990
+ gap: 8px;
1991
+ pointer-events: none;
1992
+ }
1993
+
1994
+ .ds-message__item {
1995
+ display: flex;
1996
+ align-items: center;
1997
+ gap: 8px;
1998
+ padding: 12px 20px;
1999
+ background-color: var(--bg-base-secondary);
2000
+ border-radius: 6px;
2001
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
2002
+ animation: ds-message-in 0.3s ease;
2003
+ }
2004
+
2005
+ @keyframes ds-message-in {
2006
+ from {
2007
+ opacity: 0;
2008
+ transform: translateY(-20px);
2009
+ }
2010
+ to {
2011
+ opacity: 1;
2012
+ transform: translateY(0);
2013
+ }
2014
+ }
2015
+
2016
+ .ds-message__item.is-exiting {
2017
+ animation: ds-message-out 0.3s ease;
2018
+ }
2019
+
2020
+ @keyframes ds-message-out {
2021
+ from {
2022
+ opacity: 1;
2023
+ transform: translateY(0);
2024
+ }
2025
+ to {
2026
+ opacity: 0;
2027
+ transform: translateY(-20px);
2028
+ }
2029
+ }
2030
+
2031
+ .ds-message__icon {
2032
+ flex-shrink: 0;
2033
+ }
2034
+
2035
+ .ds-message__item--normal { background: var(--bg-overlay-l1); border-left: 3px solid var(--border-neutral-l1); }
2036
+ .ds-message__item--normal .ds-message__icon { color: var(--text-tertiary); }
2037
+ .ds-message__item--success { background: var(--status-success-surface-l1); border-left: 3px solid var(--status-success-default); }
2038
+ .ds-message__item--success .ds-message__icon { color: var(--status-success-default); }
2039
+ .ds-message__item--warning { background: var(--status-warning-surface-l1); border-left: 3px solid var(--status-warning-default); }
2040
+ .ds-message__item--warning .ds-message__icon { color: var(--status-warning-default); }
2041
+ .ds-message__item--error { background: var(--status-error-surface-l1); border-left: 3px solid var(--status-error-default); }
2042
+ .ds-message__item--error .ds-message__icon { color: var(--status-error-default); }
2043
+ .ds-message__item--info { background: var(--status-info-surface-l1); border-left: 3px solid var(--status-info-default); }
2044
+ .ds-message__item--info .ds-message__icon { color: var(--status-info-default); }
2045
+
2046
+ .ds-message__text {
2047
+ font-size: 13px;
2048
+ color: var(--text-default);
2049
+ }
2050
+
2051
+ /* Calendar */
2052
+ .ds-calendar {
2053
+ background-color: var(--bg-base-secondary);
2054
+ border-radius: 8px;
2055
+ padding: 24px;
2056
+ width: 100%;
2057
+ max-width: 100%;
2058
+ }
2059
+
2060
+ .ds-calendar__header {
2061
+ display: flex;
2062
+ align-items: center;
2063
+ justify-content: space-between;
2064
+ margin-bottom: 24px;
2065
+ }
2066
+
2067
+ .ds-calendar__title {
2068
+ font-size: 18px;
2069
+ font-weight: 600;
2070
+ color: var(--text-default);
2071
+ }
2072
+
2073
+ .ds-calendar__nav-group {
2074
+ display: flex;
2075
+ align-items: center;
2076
+ gap: 8px;
2077
+ }
2078
+
2079
+ .ds-calendar__nav {
2080
+ width: 32px;
2081
+ height: 32px;
2082
+ border-radius: 6px;
2083
+ background-color: var(--bg-overlay-l1);
2084
+ border: none;
2085
+ cursor: pointer;
2086
+ display: flex;
2087
+ align-items: center;
2088
+ justify-content: center;
2089
+ color: var(--icon-default);
2090
+ font-size: 12px;
2091
+ }
2092
+
2093
+ .ds-calendar__nav:hover {
2094
+ background-color: var(--bg-overlay-l2);
2095
+ }
2096
+
2097
+ .ds-calendar__nav--today {
2098
+ width: auto;
2099
+ padding: 0 12px;
2100
+ }
2101
+
2102
+ .ds-calendar__weekdays {
2103
+ display: grid;
2104
+ grid-template-columns: repeat(7, 1fr);
2105
+ margin-bottom: 8px;
2106
+ padding-bottom: 12px;
2107
+ border-bottom: 1px solid var(--border-default);
2108
+ }
2109
+
2110
+ .ds-calendar__weekday {
2111
+ text-align: center;
2112
+ font-size: 12px;
2113
+ color: var(--text-tertiary);
2114
+ padding: 8px 0;
2115
+ }
2116
+
2117
+ .ds-calendar__days {
2118
+ display: grid;
2119
+ grid-template-columns: repeat(7, 1fr);
2120
+ gap: 1px;
2121
+ background-color: var(--border-default);
2122
+ }
2123
+
2124
+ .ds-calendar__day {
2125
+ aspect-ratio: 1;
2126
+ border-radius: 0;
2127
+ border: none;
2128
+ background-color: var(--bg-base-secondary);
2129
+ cursor: pointer;
2130
+ font-size: 14px;
2131
+ color: var(--text-default);
2132
+ display: flex;
2133
+ flex-direction: column;
2134
+ align-items: center;
2135
+ justify-content: center;
2136
+ gap: 4px;
2137
+ padding: 8px 4px;
2138
+ position: relative;
2139
+ transition: background-color 0.15s ease;
2140
+ }
2141
+
2142
+ .ds-calendar__day:hover {
2143
+ background-color: var(--bg-overlay-l1);
2144
+ }
2145
+
2146
+ .ds-calendar__day-number {
2147
+ font-size: 16px;
2148
+ font-weight: 500;
2149
+ }
2150
+
2151
+ .ds-calendar__day-full {
2152
+ font-size: 10px;
2153
+ color: var(--text-tertiary);
2154
+ display: none;
2155
+ }
2156
+
2157
+ .ds-calendar__day:hover .ds-calendar__day-full {
2158
+ display: block;
2159
+ }
2160
+
2161
+ .ds-calendar__day.is-today {
2162
+ color: var(--text-brand);
2163
+ background-color: rgba(51, 185, 193, 0.1);
2164
+ }
2165
+
2166
+ .ds-calendar__day.is-today:hover {
2167
+ background-color: rgba(51, 185, 193, 0.2);
2168
+ }
2169
+
2170
+ .ds-calendar__day.is-today::after {
2171
+ content: '';
2172
+ position: absolute;
2173
+ bottom: 8px;
2174
+ width: 6px;
2175
+ height: 6px;
2176
+ border-radius: 50%;
2177
+ background-color: #33b9c1;
2178
+ }
2179
+
2180
+ .ds-calendar__day.is-selected {
2181
+ color: var(--text-brand);
2182
+ }
2183
+
2184
+ .ds-calendar__day.is-selected::before {
2185
+ content: '';
2186
+ position: absolute;
2187
+ bottom: 0;
2188
+ width: 60%;
2189
+ height: 2px;
2190
+ background-color: var(--bg-brand);
2191
+ }
2192
+
2193
+ .ds-calendar__day.is-disabled {
2194
+ color: var(--text-tertiary);
2195
+ opacity: 0.5;
2196
+ cursor: not-allowed;
2197
+ }
2198
+
2199
+ .ds-calendar__day.is-outside {
2200
+ color: var(--text-tertiary);
2201
+ opacity: 0.3;
2202
+ }
2203
+
2204
+ /* Dynamic Tags */
2205
+ .ds-dynamic-tags {
2206
+ display: flex;
2207
+ flex-wrap: wrap;
2208
+ gap: 8px;
2209
+ padding: 8px;
2210
+ border: 1px solid var(--border-neutral-l1);
2211
+ border-radius: 6px;
2212
+ background-color: var(--bg-base-default);
2213
+ min-height: 36px;
2214
+ }
2215
+
2216
+ .ds-dynamic-tags__tag {
2217
+ display: inline-flex;
2218
+ align-items: center;
2219
+ gap: 4px;
2220
+ padding: 4px 8px;
2221
+ background-color: var(--bg-overlay-l2);
2222
+ border-radius: 4px;
2223
+ font-size: 12px;
2224
+ color: var(--text-secondary);
2225
+ }
2226
+
2227
+ .ds-dynamic-tags__remove {
2228
+ width: 16px;
2229
+ height: 16px;
2230
+ border-radius: 4px;
2231
+ background-color: transparent;
2232
+ border: none;
2233
+ cursor: pointer;
2234
+ display: flex;
2235
+ align-items: center;
2236
+ justify-content: center;
2237
+ color: var(--icon-secondary);
2238
+ }
2239
+
2240
+ .ds-dynamic-tags__remove:hover {
2241
+ background-color: var(--bg-overlay-l3);
2242
+ }
2243
+
2244
+ .ds-dynamic-tags__input {
2245
+ border: none;
2246
+ background: transparent;
2247
+ outline: none;
2248
+ font-size: 12px;
2249
+ color: var(--text-default);
2250
+ min-width: 100px;
2251
+ padding: 4px 0;
2252
+ }
2253
+
2254
+ .ds-dynamic-tags__add {
2255
+ width: 24px;
2256
+ height: 24px;
2257
+ border-radius: 4px;
2258
+ background-color: transparent;
2259
+ border: none;
2260
+ cursor: pointer;
2261
+ display: flex;
2262
+ align-items: center;
2263
+ justify-content: center;
2264
+ color: var(--icon-secondary);
2265
+ flex-shrink: 0;
2266
+ }
2267
+
2268
+ .ds-dynamic-tags__add:hover {
2269
+ background-color: var(--bg-overlay-l2);
2270
+ color: var(--icon-primary);
2271
+ }
2272
+
2273
+ /* Color Picker */
2274
+ .ds-color-picker {
2275
+ position: relative;
2276
+ }
2277
+
2278
+ .ds-color-picker__trigger {
2279
+ width: 32px;
2280
+ height: 32px;
2281
+ border-radius: 6px;
2282
+ border: 2px solid var(--border-neutral-l1);
2283
+ cursor: pointer;
2284
+ display: inline-flex;
2285
+ align-items: center;
2286
+ justify-content: center;
2287
+ }
2288
+
2289
+ .ds-color-picker__trigger:hover {
2290
+ border-color: var(--border-neutral-l0);
2291
+ }
2292
+
2293
+ .ds-color-picker__panel {
2294
+ position: absolute;
2295
+ top: calc(100% + 8px);
2296
+ left: 0;
2297
+ background-color: var(--bg-base-secondary);
2298
+ border-radius: 6px;
2299
+ padding: 12px;
2300
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
2301
+ z-index: 100;
2302
+ display: none;
2303
+ }
2304
+
2305
+ .ds-color-picker__panel.is-visible {
2306
+ display: block;
2307
+ }
2308
+
2309
+ .ds-color-picker__grid {
2310
+ display: grid;
2311
+ grid-template-columns: repeat(5, 1fr);
2312
+ gap: 6px;
2313
+ margin-bottom: 12px;
2314
+ }
2315
+
2316
+ .ds-color-picker__color {
2317
+ width: 28px;
2318
+ height: 28px;
2319
+ border-radius: 4px;
2320
+ border: 2px solid transparent;
2321
+ cursor: pointer;
2322
+ transition: transform 0.15s ease;
2323
+ }
2324
+
2325
+ .ds-color-picker__color:hover {
2326
+ transform: scale(1.1);
2327
+ }
2328
+
2329
+ .ds-color-picker__color.is-selected {
2330
+ border-color: var(--bg-brand);
2331
+ }
2332
+
2333
+ .ds-color-picker__custom {
2334
+ display: flex;
2335
+ align-items: center;
2336
+ gap: 8px;
2337
+ }
2338
+
2339
+ .ds-color-picker__input {
2340
+ width: 50px;
2341
+ height: 28px;
2342
+ border-radius: 4px;
2343
+ border: 1px solid var(--border-neutral-l1);
2344
+ background-color: var(--bg-base-default);
2345
+ cursor: pointer;
2346
+ }
2347
+
2348
+ .ds-color-picker__value {
2349
+ font-size: 12px;
2350
+ color: var(--text-secondary);
2351
+ font-family: monospace;
2352
+ }
2353
+
2354
+ /* ── Checkbox ─────────────────────────────────────────────── */
2355
+ .ds-checkbox {
2356
+ display: inline-flex;
2357
+ align-items: center;
2358
+ gap: var(--spacer-8);
2359
+ cursor: pointer;
2360
+ user-select: none;
2361
+ font-size: var(--body-sm-font-size);
2362
+ color: var(--text-default);
2363
+ transition: color 0.12s ease;
2364
+ }
2365
+
2366
+ .ds-checkbox input {
2367
+ display: none;
2368
+ }
2369
+
2370
+ .ds-checkbox__box {
2371
+ width: 16px;
2372
+ height: 16px;
2373
+ border: 1px solid var(--border-neutral-l2);
2374
+ background: var(--bg-overlay-l1);
2375
+ border-radius: var(--radius-2);
2376
+ display: inline-flex;
2377
+ align-items: center;
2378
+ justify-content: center;
2379
+ transition: background 0.12s ease, border-color 0.12s ease;
2380
+ flex-shrink: 0;
2381
+ }
2382
+
2383
+ .ds-checkbox:hover .ds-checkbox__box {
2384
+ border-color: var(--border-neutral-l3);
2385
+ }
2386
+
2387
+ .ds-checkbox input:checked + .ds-checkbox__box {
2388
+ background: var(--bg-brand);
2389
+ border-color: var(--bg-brand);
2390
+ }
2391
+
2392
+ .ds-checkbox input:checked + .ds-checkbox__box::after {
2393
+ content: '';
2394
+ width: 8px;
2395
+ height: 4px;
2396
+ border-left: 2px solid var(--text-onbrand);
2397
+ border-bottom: 2px solid var(--text-onbrand);
2398
+ transform: rotate(-45deg) translate(1px, -1px);
2399
+ }
2400
+
2401
+ .ds-checkbox input:disabled + .ds-checkbox__box {
2402
+ opacity: 0.5;
2403
+ cursor: not-allowed;
2404
+ }
2405
+
2406
+ .ds-checkbox input:disabled {
2407
+ cursor: not-allowed;
2408
+ }
2409
+
2410
+ .ds-checkbox input:disabled ~ .ds-checkbox__label {
2411
+ color: var(--text-disabled);
2412
+ }
2413
+
2414
+ /* ── Radio ────────────────────────────────────────────────── */
2415
+ .ds-radio {
2416
+ display: inline-flex;
2417
+ align-items: center;
2418
+ gap: var(--spacer-8);
2419
+ cursor: pointer;
2420
+ user-select: none;
2421
+ font-size: var(--body-sm-font-size);
2422
+ color: var(--text-default);
2423
+ transition: color 0.12s ease;
2424
+ }
2425
+
2426
+ .ds-radio input {
2427
+ display: none;
2428
+ }
2429
+
2430
+ .ds-radio__dot {
2431
+ width: 16px;
2432
+ height: 16px;
2433
+ border: 1px solid var(--border-neutral-l2);
2434
+ background: var(--bg-overlay-l1);
2435
+ border-radius: 50%;
2436
+ display: inline-flex;
2437
+ align-items: center;
2438
+ justify-content: center;
2439
+ transition: border-color 0.12s ease;
2440
+ flex-shrink: 0;
2441
+ }
2442
+
2443
+ .ds-radio:hover .ds-radio__dot {
2444
+ border-color: var(--border-neutral-l3);
2445
+ }
2446
+
2447
+ .ds-radio input:checked + .ds-radio__dot {
2448
+ border-color: var(--bg-brand);
2449
+ }
2450
+
2451
+ .ds-radio input:checked + .ds-radio__dot::after {
2452
+ content: '';
2453
+ width: 8px;
2454
+ height: 8px;
2455
+ border-radius: 50%;
2456
+ background: var(--bg-brand);
2457
+ }
2458
+
2459
+ .ds-radio input:disabled + .ds-radio__dot {
2460
+ opacity: 0.5;
2461
+ cursor: not-allowed;
2462
+ }
2463
+
2464
+ .ds-radio input:disabled {
2465
+ cursor: not-allowed;
2466
+ }
2467
+
2468
+ .ds-radio input:disabled ~ .ds-radio__label {
2469
+ color: var(--text-disabled);
2470
+ }
2471
+
2472
+ /* ── Switch ───────────────────────────────────────────────── */
2473
+ .ds-switch {
2474
+ position: relative;
2475
+ display: inline-flex;
2476
+ width: 36px;
2477
+ height: 20px;
2478
+ background: var(--bg-overlay-l3);
2479
+ border: 1px solid var(--border-neutral-l1);
2480
+ border-radius: var(--radius-full);
2481
+ cursor: pointer;
2482
+ transition: background 0.15s ease, border-color 0.15s ease;
2483
+ }
2484
+
2485
+ .ds-switch input {
2486
+ display: none;
2487
+ }
2488
+
2489
+ .ds-switch__thumb {
2490
+ position: absolute;
2491
+ top: 2px;
2492
+ left: 2px;
2493
+ width: 14px;
2494
+ height: 14px;
2495
+ background: var(--text-default);
2496
+ border-radius: 50%;
2497
+ transition: left 0.15s ease, background 0.15s ease;
2498
+ }
2499
+
2500
+ .ds-switch:hover {
2501
+ background: var(--bg-overlay-l4);
2502
+ }
2503
+
2504
+ .ds-switch input:checked ~ .ds-switch__thumb {
2505
+ left: 18px;
2506
+ background: var(--text-onbrand);
2507
+ }
2508
+
2509
+ .ds-switch:has(input:checked) {
2510
+ background: var(--bg-brand);
2511
+ border-color: var(--bg-brand);
2512
+ }
2513
+
2514
+ .ds-switch:has(input:disabled) {
2515
+ opacity: 0.5;
2516
+ cursor: not-allowed;
2517
+ }
2518
+
2519
+ /* ── Select ───────────────────────────────────────────────── */
2520
+ .ds-select {
2521
+ position: relative;
2522
+ display: inline-flex;
2523
+ flex-direction: column;
2524
+ width: 200px;
2525
+ }
2526
+
2527
+ .ds-select__trigger {
2528
+ display: inline-flex;
2529
+ align-items: center;
2530
+ justify-content: space-between;
2531
+ width: 100%;
2532
+ height: 28px;
2533
+ padding: 0 var(--spacer-12);
2534
+ background: var(--bg-overlay-l1);
2535
+ border: 1px solid var(--border-neutral-l1);
2536
+ border-radius: var(--radius-4);
2537
+ color: var(--text-default);
2538
+ font-size: var(--body-sm-font-size);
2539
+ cursor: pointer;
2540
+ transition: background 0.12s ease, border-color 0.12s ease;
2541
+ gap: var(--spacer-8);
2542
+ }
2543
+
2544
+ .ds-select__trigger:hover {
2545
+ background: var(--bg-overlay-l2);
2546
+ border-color: var(--border-neutral-l2);
2547
+ }
2548
+
2549
+ .ds-select__trigger:focus {
2550
+ outline: none;
2551
+ border-color: var(--border-brand);
2552
+ }
2553
+
2554
+ .ds-select__trigger svg {
2555
+ width: 12px;
2556
+ height: 12px;
2557
+ color: var(--icon-secondary);
2558
+ flex-shrink: 0;
2559
+ transition: transform 0.15s ease;
2560
+ }
2561
+
2562
+ .ds-select.is-open .ds-select__trigger svg {
2563
+ transform: rotate(180deg);
2564
+ }
2565
+
2566
+ .ds-select__menu {
2567
+ position: absolute;
2568
+ top: 100%;
2569
+ left: 0;
2570
+ right: 0;
2571
+ margin-top: 4px;
2572
+ background: var(--bg-menu);
2573
+ border: 1px solid var(--border-neutral-l1);
2574
+ border-radius: var(--radius-4);
2575
+ padding: var(--spacer-4);
2576
+ display: none;
2577
+ z-index: 100;
2578
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
2579
+ }
2580
+
2581
+ .ds-select.is-open .ds-select__menu {
2582
+ display: flex;
2583
+ flex-direction: column;
2584
+ }
2585
+
2586
+ .ds-select__item {
2587
+ display: flex;
2588
+ align-items: center;
2589
+ gap: var(--spacer-8);
2590
+ padding: var(--spacer-6) var(--spacer-8);
2591
+ border-radius: var(--radius-2);
2592
+ color: var(--text-default);
2593
+ font-size: var(--body-sm-font-size);
2594
+ cursor: pointer;
2595
+ border: none;
2596
+ background: none;
2597
+ text-align: left;
2598
+ transition: background 0.12s ease;
2599
+ width: 100%;
2600
+ box-sizing: border-box;
2601
+ }
2602
+
2603
+ .ds-select__item:hover {
2604
+ background: var(--bg-overlay-l2);
2605
+ }
2606
+
2607
+ .ds-select__item.is-active {
2608
+ background: var(--bg-brand-popup);
2609
+ color: var(--text-brand);
2610
+ }
2611
+
2612
+ .ds-select__divider {
2613
+ height: 1px;
2614
+ background: var(--border-neutral-l1);
2615
+ margin: var(--spacer-4) 0;
2616
+ }
2617
+
2618
+ /* ── Badge ────────────────────────────────────────────────── */
2619
+ .ds-badge {
2620
+ display: inline-flex;
2621
+ align-items: center;
2622
+ justify-content: center;
2623
+ min-width: 18px;
2624
+ height: 18px;
2625
+ padding: 0 var(--spacer-6);
2626
+ font-size: var(--body-xs-font-size);
2627
+ font-weight: var(--font-weight-medium);
2628
+ color: var(--text-default);
2629
+ background: var(--bg-overlay-l2);
2630
+ border-radius: var(--radius-full);
2631
+ white-space: nowrap;
2632
+ }
2633
+
2634
+ .ds-badge--brand {
2635
+ background: var(--bg-brand-popup);
2636
+ color: var(--text-brand);
2637
+ }
2638
+
2639
+ .ds-badge--success {
2640
+ background: var(--status-success-surface-l1);
2641
+ color: var(--status-success-default);
2642
+ }
2643
+
2644
+ .ds-badge--warning {
2645
+ background: var(--status-warning-surface-l1);
2646
+ color: var(--status-warning-default);
2647
+ }
2648
+
2649
+ .ds-badge--error {
2650
+ background: var(--status-error-surface-l1);
2651
+ color: var(--status-error-default);
2652
+ }
2653
+
2654
+ .ds-badge--dot {
2655
+ min-width: 8px;
2656
+ width: 8px;
2657
+ height: 8px;
2658
+ padding: 0;
2659
+ position: absolute;
2660
+ top: 2px;
2661
+ right: 2px;
2662
+ }
2663
+
2664
+ /* ── Tooltip ──────────────────────────────────────────────── */
2665
+ [data-tooltip] {
2666
+ position: relative;
2667
+ }
2668
+
2669
+ .ds-tooltip {
2670
+ position: absolute;
2671
+ max-width: 200px;
2672
+ padding: var(--spacer-8) var(--spacer-12);
2673
+ background: var(--bg-tooltip);
2674
+ border: 1px solid var(--border-neutral-l2);
2675
+ border-radius: var(--radius-4);
2676
+ color: var(--text-default);
2677
+ font-size: var(--body-xs-font-size);
2678
+ line-height: var(--body-sm-line-height);
2679
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
2680
+ z-index: 9999;
2681
+ pointer-events: none;
2682
+ opacity: 0;
2683
+ transition: opacity 0.12s ease, transform 0.12s ease;
2684
+ }
2685
+
2686
+ .ds-tooltip.is-visible {
2687
+ opacity: 1;
2688
+ }
2689
+
2690
+ .ds-tooltip::after {
2691
+ content: '';
2692
+ position: absolute;
2693
+ width: 0;
2694
+ height: 0;
2695
+ border: 6px solid transparent;
2696
+ }
2697
+
2698
+ .ds-tooltip--top {
2699
+ bottom: calc(100% + var(--spacer-4));
2700
+ left: 50%;
2701
+ transform: translateX(-50%);
2702
+ }
2703
+
2704
+ .ds-tooltip--top::after {
2705
+ top: 100%;
2706
+ left: 50%;
2707
+ transform: translateX(-50%);
2708
+ border-top-color: var(--border-neutral-l2);
2709
+ }
2710
+
2711
+ .ds-tooltip--bottom {
2712
+ top: calc(100% + var(--spacer-4));
2713
+ left: 50%;
2714
+ transform: translateX(-50%);
2715
+ }
2716
+
2717
+ .ds-tooltip--bottom::after {
2718
+ bottom: 100%;
2719
+ left: 50%;
2720
+ transform: translateX(-50%);
2721
+ border-bottom-color: var(--border-neutral-l2);
2722
+ }
2723
+
2724
+ .ds-tooltip--left {
2725
+ right: calc(100% + var(--spacer-4));
2726
+ top: 50%;
2727
+ transform: translateY(-50%);
2728
+ }
2729
+
2730
+ .ds-tooltip--left::after {
2731
+ left: 100%;
2732
+ top: 50%;
2733
+ transform: translateY(-50%);
2734
+ border-left-color: var(--border-neutral-l2);
2735
+ }
2736
+
2737
+ .ds-tooltip--right {
2738
+ left: calc(100% + var(--spacer-4));
2739
+ top: 50%;
2740
+ transform: translateY(-50%);
2741
+ }
2742
+
2743
+ .ds-tooltip--right::after {
2744
+ right: 100%;
2745
+ top: 50%;
2746
+ transform: translateY(-50%);
2747
+ border-right-color: var(--border-neutral-l2);
2748
+ }
2749
+
2750
+ /* ── Spin ─────────────────────────────────────────────────── */
2751
+ .ds-spin {
2752
+ display: inline-flex;
2753
+ align-items: center;
2754
+ justify-content: center;
2755
+ gap: var(--spacer-8);
2756
+ }
2757
+
2758
+ .ds-spin__loader {
2759
+ width: 16px;
2760
+ height: 16px;
2761
+ border: 2px solid var(--border-neutral-l2);
2762
+ border-top-color: var(--bg-brand);
2763
+ border-radius: 50%;
2764
+ animation: ds-spin 0.8s linear infinite;
2765
+ }
2766
+
2767
+ .ds-spin--sm .ds-spin__loader {
2768
+ width: 12px;
2769
+ height: 12px;
2770
+ border-width: 1.5px;
2771
+ }
2772
+
2773
+ .ds-spin--lg .ds-spin__loader {
2774
+ width: 24px;
2775
+ height: 24px;
2776
+ border-width: 2.5px;
2777
+ }
2778
+
2779
+ .ds-spin__text {
2780
+ font-size: var(--body-sm-font-size);
2781
+ color: var(--text-secondary);
2782
+ }
2783
+
2784
+ @keyframes ds-spin {
2785
+ to {
2786
+ transform: rotate(360deg);
2787
+ }
2788
+ }
2789
+
2790
+ /* ── Progress ─────────────────────────────────────────────── */
2791
+ .ds-progress {
2792
+ width: 100%;
2793
+ height: 6px;
2794
+ background: var(--bg-overlay-l3);
2795
+ border-radius: var(--radius-full);
2796
+ overflow: hidden;
2797
+ }
2798
+
2799
+ .ds-progress--sm {
2800
+ height: 4px;
2801
+ }
2802
+
2803
+ .ds-progress__bar {
2804
+ height: 100%;
2805
+ background: var(--bg-brand);
2806
+ border-radius: var(--radius-full);
2807
+ transition: width 0.3s ease;
2808
+ }
2809
+
2810
+ .ds-progress__bar.is-error {
2811
+ background: var(--status-error-default);
2812
+ }
2813
+
2814
+ .ds-progress__bar.is-warning {
2815
+ background: var(--status-warning-default);
2816
+ }
2817
+
2818
+ .ds-progress--indeterminate .ds-progress__bar {
2819
+ width: 30%;
2820
+ animation: ds-progress-indeterminate 1.5s ease-in-out infinite;
2821
+ }
2822
+
2823
+ @keyframes ds-progress-indeterminate {
2824
+ 0% {
2825
+ margin-left: -30%;
2826
+ }
2827
+ 100% {
2828
+ margin-left: 100%;
2829
+ }
2830
+ }
2831
+
2832
+ /* ── Empty ───────────────────────────────────────────────── */
2833
+ .ds-empty {
2834
+ display: flex;
2835
+ flex-direction: column;
2836
+ align-items: center;
2837
+ justify-content: center;
2838
+ padding: var(--spacer-40) var(--spacer-32);
2839
+ gap: var(--spacer-12);
2840
+ }
2841
+
2842
+ .ds-empty__icon {
2843
+ width: 48px;
2844
+ height: 48px;
2845
+ display: flex;
2846
+ align-items: center;
2847
+ justify-content: center;
2848
+ opacity: 0.5;
2849
+ }
2850
+
2851
+ .ds-empty__icon .icon {
2852
+ width: 100%;
2853
+ height: 100%;
2854
+ color: var(--icon-secondary);
2855
+ }
2856
+
2857
+ .ds-empty__title {
2858
+ font-size: var(--heading-xs-font-size);
2859
+ font-weight: var(--font-weight-medium);
2860
+ color: var(--text-default);
2861
+ }
2862
+
2863
+ .ds-empty__description {
2864
+ font-size: var(--body-sm-font-size);
2865
+ color: var(--text-tertiary);
2866
+ text-align: center;
2867
+ }
2868
+
2869
+ /* ── Divider ──────────────────────────────────────────────── */
2870
+ .ds-divider {
2871
+ height: 1px;
2872
+ background: var(--border-neutral-l1);
2873
+ width: 100%;
2874
+ }
2875
+
2876
+ .ds-divider--vertical {
2877
+ width: 1px;
2878
+ height: 100%;
2879
+ }
2880
+
2881
+ .ds-divider__text {
2882
+ display: inline-block;
2883
+ padding: 0 var(--spacer-12);
2884
+ background: var(--bg-base-default);
2885
+ font-size: var(--body-xs-font-size);
2886
+ color: var(--text-tertiary);
2887
+ transform: translateY(-50%);
2888
+ }
2889
+
2890
+ .ds-divider:has(.ds-divider__text) {
2891
+ display: flex;
2892
+ align-items: center;
2893
+ }
2894
+
2895
+ /* ── Slide Captcha ─────────────────────────────────────────── */
2896
+ .ds-slider-captcha {
2897
+ position: relative;
2898
+ width: 100%;
2899
+ max-width: 360px;
2900
+ user-select: none;
2901
+ }
2902
+
2903
+ .ds-slider-captcha__track {
2904
+ position: relative;
2905
+ width: 100%;
2906
+ height: 40px;
2907
+ background-color: var(--bg-overlay-l1);
2908
+ border: 1px solid var(--border-neutral-l2);
2909
+ border-radius: 20px;
2910
+ overflow: hidden;
2911
+ transition: border-color 0.2s ease;
2912
+ }
2913
+
2914
+ .ds-slider-captcha.is-active .ds-slider-captcha__track {
2915
+ border-color: var(--border-neutral-l2);
2916
+ }
2917
+
2918
+ .ds-slider-captcha__progress {
2919
+ position: absolute;
2920
+ top: 0;
2921
+ left: 0;
2922
+ height: 100%;
2923
+ width: 0%;
2924
+ background: var(--status-info-surface-l1);
2925
+ border-radius: 24px;
2926
+ transition: width 0.05s linear;
2927
+ }
2928
+
2929
+ .ds-slider-captcha__target {
2930
+ position: absolute;
2931
+ top: 50%;
2932
+ width: 28px;
2933
+ height: 28px;
2934
+ background-color: var(--status-info-default);
2935
+ border: 2px solid var(--border-neutral-l2);
2936
+ transform: translate(-50%, -50%);
2937
+ border-radius: 50%;
2938
+ opacity: 0.8;
2939
+ }
2940
+
2941
+ [data-shape="square"] .ds-slider-captcha__target {
2942
+ border-radius: 4px;
2943
+ }
2944
+
2945
+ [data-shape="triangle"] .ds-slider-captcha__target {
2946
+ border-radius: 0;
2947
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
2948
+ background-color: var(--status-info-default);
2949
+ border: none;
2950
+ }
2951
+
2952
+ [data-shape="triangle"] .ds-slider-captcha__target::before {
2953
+ content: '';
2954
+ position: absolute;
2955
+ inset: 2px;
2956
+ background-color: var(--status-info-default);
2957
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
2958
+ }
2959
+
2960
+ [data-shape="star"] .ds-slider-captcha__target {
2961
+ border-radius: 0;
2962
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
2963
+ background-color: var(--status-info-default);
2964
+ border: none;
2965
+ }
2966
+
2967
+ [data-shape="star"] .ds-slider-captcha__target::before {
2968
+ content: '';
2969
+ position: absolute;
2970
+ inset: 2px;
2971
+ background-color: var(--status-info-default);
2972
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
2973
+ }
2974
+
2975
+ .ds-slider-captcha__target--distractor {
2976
+ position: absolute;
2977
+ top: 50%;
2978
+ width: 28px;
2979
+ height: 28px;
2980
+ background-color: var(--status-info-default);
2981
+ border: 2px solid var(--border-neutral-l2);
2982
+ transform: translate(-50%, -50%);
2983
+ border-radius: 50%;
2984
+ opacity: 0.8;
2985
+ }
2986
+
2987
+ [data-shape="square"] .ds-slider-captcha__target--distractor {
2988
+ border-radius: 4px;
2989
+ }
2990
+
2991
+ [data-shape="triangle"] .ds-slider-captcha__target--distractor {
2992
+ border-radius: 0;
2993
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
2994
+ background-color: var(--status-info-default);
2995
+ border: none;
2996
+ }
2997
+
2998
+ [data-shape="triangle"] .ds-slider-captcha__target--distractor::before {
2999
+ content: '';
3000
+ position: absolute;
3001
+ inset: 2px;
3002
+ background-color: var(--status-info-default);
3003
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
3004
+ }
3005
+
3006
+ [data-shape="star"] .ds-slider-captcha__target--distractor {
3007
+ border-radius: 0;
3008
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
3009
+ background-color: var(--status-info-default);
3010
+ border: none;
3011
+ }
3012
+
3013
+ [data-shape="star"] .ds-slider-captcha__target--distractor::before {
3014
+ content: '';
3015
+ position: absolute;
3016
+ inset: 2px;
3017
+ background-color: var(--status-info-default);
3018
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
3019
+ }
3020
+
3021
+ .ds-slider-captcha__btn {
3022
+ position: absolute;
3023
+ top: 6px;
3024
+ left: 14px;
3025
+ width: 28px;
3026
+ height: 28px;
3027
+ border-radius: 50%;
3028
+ background-color: var(--status-info-default);
3029
+ border: 2px solid var(--border-neutral-l2);
3030
+ cursor: grab;
3031
+ z-index: 2;
3032
+ display: flex;
3033
+ align-items: center;
3034
+ justify-content: center;
3035
+ box-shadow: 0 2px 8px var(--status-info-surface-l2);
3036
+ transition: box-shadow 0.2s ease, background-color 0.2s ease;
3037
+ }
3038
+
3039
+ [data-shape="square"] .ds-slider-captcha__btn {
3040
+ border-radius: 4px;
3041
+ clip-path: none;
3042
+ }
3043
+
3044
+ [data-shape="triangle"] .ds-slider-captcha__btn {
3045
+ border-radius: 0;
3046
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
3047
+ background-color: var(--status-info-default);
3048
+ border: none;
3049
+ }
3050
+
3051
+ [data-shape="triangle"] .ds-slider-captcha__btn::before {
3052
+ content: '';
3053
+ position: absolute;
3054
+ inset: 2px;
3055
+ background-color: var(--status-info-default);
3056
+ clip-path: polygon(0% 0%, 0% 100%, 80% 50%);
3057
+ }
3058
+
3059
+ [data-shape="star"] .ds-slider-captcha__btn {
3060
+ border-radius: 0;
3061
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
3062
+ background-color: var(--status-info-default);
3063
+ border: none;
3064
+ }
3065
+
3066
+ [data-shape="star"] .ds-slider-captcha__btn::before {
3067
+ content: '';
3068
+ position: absolute;
3069
+ inset: 2px;
3070
+ background-color: var(--status-info-default);
3071
+ clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
3072
+ }
3073
+
3074
+ .ds-slider-captcha__btn:active {
3075
+ cursor: grabbing;
3076
+ box-shadow: 0 4px 16px var(--status-info-surface-l3);
3077
+ }
3078
+
3079
+ .ds-slider-captcha__btn.is-success {
3080
+ background-color: var(--status-success-default);
3081
+ border-color: var(--border-neutral-l2);
3082
+ color: var(--text-onbrand);
3083
+ box-shadow: 0 2px 8px var(--status-success-surface-l2);
3084
+ }
3085
+
3086
+ [data-shape="triangle"] .ds-slider-captcha__btn.is-success,
3087
+ [data-shape="star"] .ds-slider-captcha__btn.is-success {
3088
+ background-color: var(--status-success-default);
3089
+ border: none;
3090
+ }
3091
+
3092
+ [data-shape="triangle"] .ds-slider-captcha__btn.is-success::before,
3093
+ [data-shape="star"] .ds-slider-captcha__btn.is-success::before {
3094
+ background-color: var(--status-success-default);
3095
+ }
3096
+
3097
+ .ds-slider-captcha__btn.is-error {
3098
+ background-color: var(--status-error-default);
3099
+ border-color: var(--border-neutral-l2);
3100
+ color: var(--text-onbrand);
3101
+ box-shadow: 0 2px 8px var(--status-error-surface-l2);
3102
+ animation: ds-slider-captcha-shake 0.4s ease;
3103
+ }
3104
+
3105
+ [data-shape="triangle"] .ds-slider-captcha__btn.is-error,
3106
+ [data-shape="star"] .ds-slider-captcha__btn.is-error {
3107
+ background-color: var(--status-error-default);
3108
+ border: none;
3109
+ }
3110
+
3111
+ [data-shape="triangle"] .ds-slider-captcha__btn.is-error::before,
3112
+ [data-shape="star"] .ds-slider-captcha__btn.is-error::before {
3113
+ background-color: var(--status-error-default);
3114
+ }
3115
+
3116
+ @keyframes ds-slider-captcha-shake {
3117
+ 0%, 100% { transform: translateX(0); }
3118
+ 20% { transform: translateX(-6px); }
3119
+ 40% { transform: translateX(6px); }
3120
+ 60% { transform: translateX(-4px); }
3121
+ 80% { transform: translateX(4px); }
3122
+ }
3123
+
3124
+ .ds-slider-captcha__text {
3125
+ position: absolute;
3126
+ top: 50%;
3127
+ left: 50%;
3128
+ transform: translate(-50%, -50%);
3129
+ font-size: var(--body-xs-font-size);
3130
+ color: var(--text-tertiary);
3131
+ pointer-events: none;
3132
+ z-index: 1;
3133
+ white-space: nowrap;
3134
+ transition: color 0.2s ease;
3135
+ }
3136
+
3137
+ .ds-slider-captcha__status {
3138
+ margin-top: 8px;
3139
+ font-size: var(--body-xs-font-size);
3140
+ color: var(--text-tertiary);
3141
+ min-height: 18px;
3142
+ transition: color 0.2s ease;
3143
+ }
3144
+
3145
+ .ds-slider-captcha__status.is-loading {
3146
+ color: var(--status-info-default);
3147
+ }
3148
+
3149
+ .ds-slider-captcha__status.is-success {
3150
+ color: var(--status-success-default);
3151
+ }
3152
+
3153
+ .ds-slider-captcha__status.is-error {
3154
+ color: var(--status-error-default);
3155
+ }
3156
+
3157
+ .ds-slider-captcha__footer {
3158
+ display: flex;
3159
+ justify-content: space-between;
3160
+ align-items: center;
3161
+ margin-top: 8px;
3162
+ }
3163
+
3164
+ .ds-slider-captcha__point-count {
3165
+ font-size: var(--body-xs-font-size);
3166
+ color: var(--text-tertiary);
3167
+ }
3168
+
3169
+ .ds-slider-captcha__refresh {
3170
+ position: absolute;
3171
+ right: 8px;
3172
+ top: 50%;
3173
+ transform: translateY(-50%);
3174
+ background: transparent;
3175
+ border: none;
3176
+ color: var(--text-tertiary);
3177
+ cursor: pointer;
3178
+ padding: 4px;
3179
+ border-radius: 4px;
3180
+ display: none;
3181
+ align-items: center;
3182
+ justify-content: center;
3183
+ transition: color 0.2s ease, background-color 0.2s ease;
3184
+ }
3185
+
3186
+ .ds-slider-captcha__refresh:hover {
3187
+ color: var(--status-info-default);
3188
+ background-color: var(--status-info-surface-l1);
3189
+ }
3190
+
3191
+ .ds-slider-captcha__footer-refresh {
3192
+ background: transparent;
3193
+ border: none;
3194
+ color: var(--text-tertiary);
3195
+ cursor: pointer;
3196
+ padding: 4px 8px;
3197
+ font-size: var(--body-xs-font-size);
3198
+ border-radius: 4px;
3199
+ display: flex;
3200
+ align-items: center;
3201
+ gap: 4px;
3202
+ transition: color 0.2s ease, background-color 0.2s ease;
3203
+ }
3204
+
3205
+ .ds-slider-captcha__footer-refresh:hover {
3206
+ color: var(--status-info-default);
3207
+ background-color: var(--status-info-surface-l1);
3208
+ }
3209
+
3210
+ /* Image */
3211
+ .ds-image {
3212
+ display: inline-flex;
3213
+ position: relative;
3214
+ overflow: hidden;
3215
+ background-color: var(--bg-overlay-l2);
3216
+ border-radius: var(--radius-md);
3217
+ }
3218
+
3219
+ .ds-image img {
3220
+ display: block;
3221
+ width: 100%;
3222
+ height: 100%;
3223
+ object-fit: cover;
3224
+ }
3225
+
3226
+ .ds-image__placeholder {
3227
+ display: flex;
3228
+ flex-direction: column;
3229
+ align-items: center;
3230
+ justify-content: center;
3231
+ gap: 8px;
3232
+ color: var(--text-tertiary);
3233
+ width: 100%;
3234
+ height: 100%;
3235
+ }
3236
+
3237
+ .ds-image__placeholder svg {
3238
+ width: 32px;
3239
+ height: 32px;
3240
+ }
3241
+
3242
+ .ds-image__placeholder-text {
3243
+ font-size: 12px;
3244
+ }
3245
+
3246
+ .ds-image--round {
3247
+ border-radius: 50%;
3248
+ }
3249
+
3250
+ .ds-image--square {
3251
+ aspect-ratio: 1;
3252
+ }
3253
+
3254
+ .ds-image--cover img {
3255
+ object-fit: cover;
3256
+ }
3257
+
3258
+ .ds-image--contain img {
3259
+ object-fit: contain;
3260
+ }
3261
+
3262
+ .ds-image--fill img {
3263
+ object-fit: fill;
3264
+ }
3265
+
3266
+ .ds-image--none img {
3267
+ object-fit: none;
3268
+ }
3269
+
3270
+ .ds-image__error {
3271
+ position: absolute;
3272
+ inset: 0;
3273
+ display: flex;
3274
+ flex-direction: column;
3275
+ align-items: center;
3276
+ justify-content: center;
3277
+ background-color: var(--bg-overlay-l3);
3278
+ color: var(--text-tertiary);
3279
+ gap: 8px;
3280
+ }
3281
+
3282
+ .ds-image__error svg {
3283
+ width: 24px;
3284
+ height: 24px;
3285
+ }
3286
+
3287
+ .ds-image__error-text {
3288
+ font-size: 12px;
3289
+ }
3290
+
3291
+ .ds-image__loading {
3292
+ position: absolute;
3293
+ inset: 0;
3294
+ display: flex;
3295
+ align-items: center;
3296
+ justify-content: center;
3297
+ background-color: var(--bg-overlay-l2);
3298
+ }
3299
+
3300
+ .ds-image__fallback {
3301
+ position: absolute;
3302
+ inset: 0;
3303
+ display: flex;
3304
+ align-items: center;
3305
+ justify-content: center;
3306
+ background-color: var(--bg-overlay-l3);
3307
+ color: var(--text-tertiary);
3308
+ font-size: 24px;
3309
+ font-weight: 600;
3310
+ }
3311
+
3312
+ /* Image List */
3313
+ .ds-image-list {
3314
+ display: flex;
3315
+ flex-wrap: wrap;
3316
+ gap: 8px;
3317
+ }
3318
+
3319
+ .ds-image-list--vertical {
3320
+ flex-direction: column;
3321
+ }
3322
+
3323
+ .ds-image-list__item {
3324
+ position: relative;
3325
+ cursor: pointer;
3326
+ border-radius: var(--radius-md);
3327
+ overflow: hidden;
3328
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
3329
+ }
3330
+
3331
+ .ds-image-list__item:hover {
3332
+ transform: scale(1.02);
3333
+ box-shadow: var(--shadow-md);
3334
+ }
3335
+
3336
+ .ds-image-list__item img {
3337
+ display: block;
3338
+ width: 100%;
3339
+ height: 100%;
3340
+ object-fit: cover;
3341
+ }
3342
+
3343
+ .ds-image-list__item.is-selected {
3344
+ outline: 2px solid var(--bg-brand);
3345
+ outline-offset: 2px;
3346
+ }
3347
+
3348
+ .ds-image-list__item.is-selected::after {
3349
+ content: '';
3350
+ position: absolute;
3351
+ top: 4px;
3352
+ right: 4px;
3353
+ width: 16px;
3354
+ height: 16px;
3355
+ background-color: var(--bg-brand);
3356
+ border-radius: 50%;
3357
+ display: flex;
3358
+ align-items: center;
3359
+ justify-content: center;
3360
+ }
3361
+
3362
+ .ds-image-list__item.is-selected::after::before {
3363
+ content: '';
3364
+ width: 6px;
3365
+ height: 3px;
3366
+ border-left: 2px solid white;
3367
+ border-bottom: 2px solid white;
3368
+ transform: rotate(-45deg);
3369
+ margin-top: -2px;
3370
+ }
3371
+
3372
+ .ds-image-list__item.is-disabled {
3373
+ opacity: 0.5;
3374
+ cursor: not-allowed;
3375
+ }
3376
+
3377
+ .ds-image-list__item.is-disabled:hover {
3378
+ transform: none;
3379
+ box-shadow: none;
3380
+ }
3381
+
3382
+ .ds-image-list__placeholder {
3383
+ display: flex;
3384
+ flex-direction: column;
3385
+ align-items: center;
3386
+ justify-content: center;
3387
+ padding: 32px;
3388
+ background-color: var(--bg-overlay-l2);
3389
+ border-radius: var(--radius-md);
3390
+ color: var(--text-tertiary);
3391
+ }
3392
+
3393
+ .ds-image-list__placeholder svg {
3394
+ width: 48px;
3395
+ height: 48px;
3396
+ margin-bottom: 12px;
3397
+ }
3398
+
3399
+ .ds-image-list__placeholder-text {
3400
+ font-size: 13px;
3401
+ }
3402
+
3403
+ .ds-image-list--grid {
3404
+ display: grid;
3405
+ }
3406
+
3407
+ .ds-image-list--grid-2 {
3408
+ grid-template-columns: repeat(2, 1fr);
3409
+ }
3410
+
3411
+ .ds-image-list--grid-3 {
3412
+ grid-template-columns: repeat(3, 1fr);
3413
+ }
3414
+
3415
+ .ds-image-list--grid-4 {
3416
+ grid-template-columns: repeat(4, 1fr);
3417
+ }
3418
+
3419
+ .ds-image-list--grid-5 {
3420
+ grid-template-columns: repeat(5, 1fr);
3421
+ }
3422
+
3423
+ /* Image Preview */
3424
+ .ds-image-preview-overlay {
3425
+ position: fixed;
3426
+ inset: 0;
3427
+ background-color: rgba(0, 0, 0, 0.85);
3428
+ z-index: 9999;
3429
+ display: flex;
3430
+ flex-direction: column;
3431
+ align-items: center;
3432
+ justify-content: center;
3433
+ opacity: 0;
3434
+ visibility: hidden;
3435
+ transition: opacity 0.3s ease, visibility 0.3s ease;
3436
+ }
3437
+
3438
+ .ds-image-preview-overlay.is-visible {
3439
+ opacity: 1;
3440
+ visibility: visible;
3441
+ }
3442
+
3443
+ .ds-image-preview-overlay.is-visible .ds-image-preview__content {
3444
+ transform: scale(1);
3445
+ }
3446
+
3447
+ .ds-image-preview__close {
3448
+ position: absolute;
3449
+ top: 24px;
3450
+ right: 24px;
3451
+ width: 40px;
3452
+ height: 40px;
3453
+ display: flex;
3454
+ align-items: center;
3455
+ justify-content: center;
3456
+ background-color: rgba(255, 255, 255, 0.1);
3457
+ border: none;
3458
+ border-radius: 50%;
3459
+ color: white;
3460
+ cursor: pointer;
3461
+ font-size: 20px;
3462
+ transition: background-color 0.2s ease;
3463
+ }
3464
+
3465
+ .ds-image-preview__close:hover {
3466
+ background-color: rgba(255, 255, 255, 0.2);
3467
+ }
3468
+
3469
+ .ds-image-preview__content {
3470
+ max-width: 90vw;
3471
+ max-height: 90vh;
3472
+ transform: scale(0.9);
3473
+ transition: transform 0.3s ease;
3474
+ }
3475
+
3476
+ .ds-image-preview__content img {
3477
+ display: block;
3478
+ max-width: 100%;
3479
+ max-height: 80vh;
3480
+ border-radius: 8px;
3481
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
3482
+ }
3483
+
3484
+ .ds-image-preview__info {
3485
+ margin-top: 16px;
3486
+ text-align: center;
3487
+ color: white;
3488
+ }
3489
+
3490
+ .ds-image-preview__title {
3491
+ font-size: 14px;
3492
+ font-weight: 500;
3493
+ margin-bottom: 4px;
3494
+ }
3495
+
3496
+ .ds-image-preview__meta {
3497
+ font-size: 12px;
3498
+ opacity: 0.7;
3499
+ }
3500
+
3501
+ .ds-image-preview__nav {
3502
+ position: absolute;
3503
+ top: 50%;
3504
+ transform: translateY(-50%);
3505
+ display: flex;
3506
+ justify-content: space-between;
3507
+ width: 100%;
3508
+ padding: 0 24px;
3509
+ pointer-events: none;
3510
+ }
3511
+
3512
+ .ds-image-preview__nav-btn {
3513
+ pointer-events: auto;
3514
+ width: 48px;
3515
+ height: 48px;
3516
+ display: flex;
3517
+ align-items: center;
3518
+ justify-content: center;
3519
+ background-color: rgba(255, 255, 255, 0.1);
3520
+ border: none;
3521
+ border-radius: 50%;
3522
+ color: white;
3523
+ cursor: pointer;
3524
+ font-size: 24px;
3525
+ transition: background-color 0.2s ease;
3526
+ }
3527
+
3528
+ .ds-image-preview__nav-btn:hover {
3529
+ background-color: rgba(255, 255, 255, 0.2);
3530
+ }
3531
+
3532
+ .ds-image-preview__nav-btn:disabled {
3533
+ opacity: 0.3;
3534
+ cursor: not-allowed;
3535
+ }
3536
+
3537
+ .ds-image-preview__indicators {
3538
+ display: flex;
3539
+ gap: 8px;
3540
+ margin-top: 16px;
3541
+ }
3542
+
3543
+ .ds-image-preview__indicator {
3544
+ width: 8px;
3545
+ height: 8px;
3546
+ border-radius: 50%;
3547
+ background-color: rgba(255, 255, 255, 0.3);
3548
+ cursor: pointer;
3549
+ transition: background-color 0.2s ease, transform 0.2s ease;
3550
+ }
3551
+
3552
+ .ds-image-preview__indicator:hover {
3553
+ background-color: rgba(255, 255, 255, 0.5);
3554
+ transform: scale(1.2);
3555
+ }
3556
+
3557
+ .ds-image-preview__indicator.is-active {
3558
+ background-color: white;
3559
+ transform: scale(1.2);
3560
+ }
3561
+
3562
+ .ds-slider-captcha.is-disabled {
3563
+ opacity: 0.7;
3564
+ pointer-events: none;
3565
+ }
3566
+
3567
+ .ds-slider-captcha.is-disabled .ds-slider-captcha__refresh {
3568
+ pointer-events: auto;
3569
+ }
3570
+
3571
+ .ds-slider-captcha.is-verified {
3572
+ pointer-events: none;
3573
+ }
3574
+
3575
+ .ds-slider-captcha.is-verified .ds-slider-captcha__refresh {
3576
+ pointer-events: auto;
3577
+ }
3578
+
3579
+ /* Statistic Card */
3580
+ .ds-statcard {
3581
+ display: flex;
3582
+ flex-direction: column;
3583
+ padding: 20px 24px;
3584
+ background-color: var(--bg-base-secondary);
3585
+ border: 1px solid var(--border-neutral-l1);
3586
+ border-radius: var(--radius-lg);
3587
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
3588
+ }
3589
+
3590
+ .ds-statcard:hover {
3591
+ box-shadow: var(--shadow-md);
3592
+ }
3593
+
3594
+ .ds-statcard--hover-lift:hover {
3595
+ transform: translateY(-2px);
3596
+ }
3597
+
3598
+ .ds-statcard__header {
3599
+ display: flex;
3600
+ align-items: center;
3601
+ justify-content: space-between;
3602
+ margin-bottom: 16px;
3603
+ }
3604
+
3605
+ .ds-statcard__title {
3606
+ font-size: 13px;
3607
+ font-weight: 500;
3608
+ color: var(--text-secondary);
3609
+ }
3610
+
3611
+ .ds-statcard__icon {
3612
+ display: flex;
3613
+ align-items: center;
3614
+ justify-content: center;
3615
+ width: 36px;
3616
+ height: 36px;
3617
+ border-radius: var(--radius-md);
3618
+ font-size: 18px;
3619
+ }
3620
+
3621
+ .ds-statcard__icon--brand {
3622
+ background-color: var(--bg-brand-popup);
3623
+ color: var(--text-brand);
3624
+ }
3625
+
3626
+ .ds-statcard__icon--success {
3627
+ background-color: var(--status-success-surface-l1);
3628
+ color: var(--status-success-default);
3629
+ }
3630
+
3631
+ .ds-statcard__icon--warning {
3632
+ background-color: var(--status-warning-surface-l1);
3633
+ color: var(--status-warning-default);
3634
+ }
3635
+
3636
+ .ds-statcard__icon--error {
3637
+ background-color: var(--status-error-surface-l1);
3638
+ color: var(--status-error-default);
3639
+ }
3640
+
3641
+ .ds-statcard__icon--info {
3642
+ background-color: var(--status-info-surface-l1);
3643
+ color: var(--status-info-default);
3644
+ }
3645
+
3646
+ .ds-statcard__value {
3647
+ font-size: 32px;
3648
+ font-weight: 600;
3649
+ color: var(--text-default);
3650
+ line-height: 1.2;
3651
+ margin-bottom: 8px;
3652
+ }
3653
+
3654
+ .ds-statcard__value--small {
3655
+ font-size: 24px;
3656
+ }
3657
+
3658
+ .ds-statcard__value--large {
3659
+ font-size: 40px;
3660
+ }
3661
+
3662
+ .ds-statcard__unit {
3663
+ font-size: 14px;
3664
+ color: var(--text-secondary);
3665
+ margin-left: 4px;
3666
+ }
3667
+
3668
+ .ds-statcard__footer {
3669
+ display: flex;
3670
+ align-items: center;
3671
+ gap: 8px;
3672
+ }
3673
+
3674
+ .ds-statcard__trend {
3675
+ display: inline-flex;
3676
+ align-items: center;
3677
+ gap: 4px;
3678
+ font-size: 12px;
3679
+ font-weight: 500;
3680
+ padding: 2px 8px;
3681
+ border-radius: var(--radius-sm);
3682
+ }
3683
+
3684
+ .ds-statcard__trend--up {
3685
+ color: var(--status-success-default);
3686
+ background-color: var(--status-success-surface-l1);
3687
+ }
3688
+
3689
+ .ds-statcard__trend--down {
3690
+ color: var(--status-error-default);
3691
+ background-color: var(--status-error-surface-l1);
3692
+ }
3693
+
3694
+ .ds-statcard__trend--neutral {
3695
+ color: var(--text-secondary);
3696
+ background-color: var(--bg-overlay-l2);
3697
+ }
3698
+
3699
+ .ds-statcard__trend svg {
3700
+ width: 12px;
3701
+ height: 12px;
3702
+ }
3703
+
3704
+ .ds-statcard__time {
3705
+ font-size: 12px;
3706
+ color: var(--text-tertiary);
3707
+ margin-left: auto;
3708
+ }
3709
+
3710
+ .ds-statcard--gradient {
3711
+ background: linear-gradient(135deg, var(--bg-brand-popup) 0%, var(--bg-base-secondary) 100%);
3712
+ }
3713
+
3714
+ .ds-statcard--gradient .ds-statcard__value {
3715
+ color: var(--text-brand);
3716
+ }
3717
+
3718
+ .ds-statcard--gradient .ds-statcard__title {
3719
+ color: var(--text-secondary);
3720
+ }
3721
+
3722
+ .ds-statcard--compact {
3723
+ padding: 16px;
3724
+ }
3725
+
3726
+ .ds-statcard--compact .ds-statcard__value {
3727
+ font-size: 24px;
3728
+ }
3729
+
3730
+ .ds-statcard--compact .ds-statcard__header {
3731
+ margin-bottom: 12px;
3732
+ }
3733
+
3734
+ .ds-statcard__progress {
3735
+ margin-top: 12px;
3736
+ }
3737
+
3738
+ .ds-statcard__progress-label {
3739
+ display: flex;
3740
+ justify-content: space-between;
3741
+ font-size: 12px;
3742
+ color: var(--text-tertiary);
3743
+ margin-bottom: 4px;
3744
+ }
3745
+
3746
+ .ds-statcard__progress-bar {
3747
+ height: 6px;
3748
+ background-color: var(--bg-overlay-l2);
3749
+ border-radius: 3px;
3750
+ overflow: hidden;
3751
+ }
3752
+
3753
+ .ds-statcard__progress-fill {
3754
+ height: 100%;
3755
+ background-color: var(--bg-brand);
3756
+ border-radius: 3px;
3757
+ transition: width 0.6s ease;
3758
+ }
3759
+
3760
+ .ds-statcard__progress-fill--success {
3761
+ background-color: var(--status-success-default);
3762
+ }
3763
+
3764
+ .ds-statcard__progress-fill--warning {
3765
+ background-color: var(--status-warning-default);
3766
+ }
3767
+
3768
+ .ds-statcard__progress-fill--error {
3769
+ background-color: var(--status-error-default);
3770
+ }
3771
+
3772
+ .ds-statcard__sub-info {
3773
+ margin-top: 12px;
3774
+ padding-top: 12px;
3775
+ border-top: 1px solid var(--border-neutral-l1);
3776
+ display: flex;
3777
+ gap: 16px;
3778
+ }
3779
+
3780
+ .ds-statcard__sub-item {
3781
+ display: flex;
3782
+ flex-direction: column;
3783
+ gap: 2px;
3784
+ }
3785
+
3786
+ .ds-statcard__sub-label {
3787
+ font-size: 11px;
3788
+ color: var(--text-tertiary);
3789
+ }
3790
+
3791
+ .ds-statcard__sub-value {
3792
+ font-size: 14px;
3793
+ font-weight: 500;
3794
+ color: var(--text-default);
3795
+ }
3796
+
3797
+ /* Heatmap */
3798
+ .ds-heatmap {
3799
+ display: flex;
3800
+ flex-direction: column;
3801
+ background-color: var(--bg-base-secondary);
3802
+ border: 1px solid var(--border-neutral-l1);
3803
+ border-radius: var(--radius-lg);
3804
+ overflow: hidden;
3805
+ }
3806
+
3807
+ .ds-heatmap__header {
3808
+ display: flex;
3809
+ align-items: center;
3810
+ justify-content: space-between;
3811
+ padding: 16px 20px;
3812
+ border-bottom: 1px solid var(--border-neutral-l1);
3813
+ }
3814
+
3815
+ .ds-heatmap__title {
3816
+ font-size: 14px;
3817
+ font-weight: 500;
3818
+ color: var(--text-default);
3819
+ }
3820
+
3821
+ .ds-heatmap__subtitle {
3822
+ font-size: 12px;
3823
+ color: var(--text-tertiary);
3824
+ margin-top: 2px;
3825
+ }
3826
+
3827
+ .ds-heatmap__toolbar {
3828
+ display: flex;
3829
+ gap: 8px;
3830
+ }
3831
+
3832
+ .ds-heatmap__body {
3833
+ padding: 16px 20px;
3834
+ overflow-x: auto;
3835
+ overflow-y: hidden;
3836
+ }
3837
+
3838
+ .ds-heatmap__container {
3839
+ display: flex;
3840
+ flex-direction: column;
3841
+ flex-shrink: 0;
3842
+ }
3843
+
3844
+ .ds-heatmap__grid-container {
3845
+ display: flex;
3846
+ flex-direction: column;
3847
+ }
3848
+
3849
+ .ds-heatmap__grid {
3850
+ display: flex;
3851
+ flex-shrink: 0;
3852
+ }
3853
+
3854
+ .ds-heatmap__week-column {
3855
+ display: flex;
3856
+ flex-direction: column;
3857
+ flex-shrink: 0;
3858
+ }
3859
+
3860
+ .ds-heatmap__cell {
3861
+ width: 14px;
3862
+ height: 14px;
3863
+ margin: 1px;
3864
+ border-radius: 2px;
3865
+ cursor: pointer;
3866
+ transition: transform 0.1s ease, box-shadow 0.1s ease;
3867
+ }
3868
+
3869
+ .ds-heatmap__cell:hover {
3870
+ transform: scale(1.3);
3871
+ box-shadow: var(--shadow-sm);
3872
+ z-index: 1;
3873
+ }
3874
+
3875
+ .ds-heatmap__cell--level-0 {
3876
+ background-color: rgba(0, 0, 0, 0.1);
3877
+ }
3878
+
3879
+ .ds-heatmap__cell--level-1 {
3880
+ background-color: rgba(34, 197, 94, 0.2);
3881
+ }
3882
+
3883
+ .ds-heatmap__cell--level-2 {
3884
+ background-color: rgba(34, 197, 94, 0.4);
3885
+ }
3886
+
3887
+ .ds-heatmap__cell--level-3 {
3888
+ background-color: rgba(34, 197, 94, 0.6);
3889
+ }
3890
+
3891
+ .ds-heatmap__cell--level-4 {
3892
+ background-color: rgba(34, 197, 94, 0.8);
3893
+ }
3894
+
3895
+ .ds-heatmap__cell--level-5 {
3896
+ background-color: #22c55e;
3897
+ }
3898
+
3899
+ .ds-heatmap__labels {
3900
+ display: flex;
3901
+ margin-top: 12px;
3902
+ }
3903
+
3904
+ .ds-heatmap__labels-and-grid {
3905
+ display: flex;
3906
+ }
3907
+
3908
+ .ds-heatmap__weekday-labels {
3909
+ display: flex;
3910
+ flex-direction: column;
3911
+ gap: 2px;
3912
+ margin-right: 8px;
3913
+ flex-shrink: 0;
3914
+ }
3915
+
3916
+ .ds-heatmap__weekday-label {
3917
+ height: 16px;
3918
+ line-height: 16px;
3919
+ font-size: 11px;
3920
+ color: var(--text-tertiary);
3921
+ text-align: right;
3922
+ width: 24px;
3923
+ }
3924
+
3925
+ .ds-heatmap__month-labels {
3926
+ display: flex;
3927
+ flex-wrap: nowrap;
3928
+ }
3929
+
3930
+ .ds-heatmap__month-label {
3931
+ font-size: 11px;
3932
+ color: var(--text-tertiary);
3933
+ white-space: nowrap;
3934
+ text-align: center;
3935
+ }
3936
+
3937
+ .ds-heatmap__legend {
3938
+ display: flex;
3939
+ align-items: center;
3940
+ gap: 8px;
3941
+ margin-top: 16px;
3942
+ }
3943
+
3944
+ .ds-heatmap__legend-label {
3945
+ font-size: 11px;
3946
+ color: var(--text-tertiary);
3947
+ }
3948
+
3949
+ .ds-heatmap__legend-cells {
3950
+ display: flex;
3951
+ gap: 2px;
3952
+ }
3953
+
3954
+ .ds-heatmap__legend-cell {
3955
+ width: 14px;
3956
+ height: 14px;
3957
+ border-radius: 2px;
3958
+ }
3959
+
3960
+ .ds-heatmap__tooltip {
3961
+ position: absolute;
3962
+ padding: 8px 12px;
3963
+ background-color: var(--bg-base-secondary);
3964
+ border: 1px solid var(--border-neutral-l1);
3965
+ border-radius: var(--radius-md);
3966
+ box-shadow: var(--shadow-lg);
3967
+ font-size: 12px;
3968
+ color: var(--text-default);
3969
+ pointer-events: none;
3970
+ z-index: 1000;
3971
+ display: none;
3972
+ }
3973
+
3974
+ .ds-heatmap__tooltip.is-visible {
3975
+ display: block;
3976
+ }
3977
+
3978
+ .ds-heatmap__tooltip-date {
3979
+ font-weight: 500;
3980
+ margin-bottom: 4px;
3981
+ }
3982
+
3983
+ .ds-heatmap__tooltip-value {
3984
+ color: var(--text-secondary);
3985
+ }
3986
+
3987
+ .ds-heatmap--compact .ds-heatmap__cell {
3988
+ width: 10px;
3989
+ height: 10px;
3990
+ }
3991
+
3992
+ .ds-heatmap--large .ds-heatmap__cell {
3993
+ width: 18px;
3994
+ height: 18px;
3995
+ }
3996
+
3997
+ /* Virtual List */
3998
+ .ds-virtual-list {
3999
+ position: relative;
4000
+ overflow-y: auto;
4001
+ overflow-x: hidden;
4002
+ background-color: var(--bg-base-secondary);
4003
+ border: 1px solid var(--border-neutral-l1);
4004
+ border-radius: var(--radius-lg);
4005
+ }
4006
+
4007
+ .ds-virtual-list__container {
4008
+ position: absolute;
4009
+ top: 0;
4010
+ left: 0;
4011
+ width: 100%;
4012
+ }
4013
+
4014
+ .ds-virtual-list__scrollbar {
4015
+ position: absolute;
4016
+ right: 2px;
4017
+ top: 2px;
4018
+ bottom: 2px;
4019
+ width: 6px;
4020
+ background-color: transparent;
4021
+ border-radius: 3px;
4022
+ opacity: 0;
4023
+ transition: opacity 0.2s ease;
4024
+ }
4025
+
4026
+ .ds-virtual-list:hover .ds-virtual-list__scrollbar,
4027
+ .ds-virtual-list--scrolling .ds-virtual-list__scrollbar {
4028
+ opacity: 1;
4029
+ }
4030
+
4031
+ .ds-virtual-list__scrollbar-track {
4032
+ position: absolute;
4033
+ inset: 0;
4034
+ background-color: var(--bg-overlay-l2);
4035
+ border-radius: 3px;
4036
+ }
4037
+
4038
+ .ds-virtual-list__scrollbar-thumb {
4039
+ position: absolute;
4040
+ width: 100%;
4041
+ background-color: var(--bg-overlay-l4);
4042
+ border-radius: 3px;
4043
+ cursor: pointer;
4044
+ transition: background-color 0.2s ease;
4045
+ }
4046
+
4047
+ .ds-virtual-list__scrollbar-thumb:hover {
4048
+ background-color: var(--border-neutral-l2);
4049
+ }
4050
+
4051
+ .ds-virtual-list__item {
4052
+ height: 48px;
4053
+ padding: 0 16px;
4054
+ border-bottom: 1px solid var(--border-neutral-l1);
4055
+ cursor: pointer;
4056
+ transition: background-color 0.15s ease;
4057
+ display: flex;
4058
+ align-items: center;
4059
+ box-sizing: border-box;
4060
+ }
4061
+
4062
+ .ds-virtual-list__item:hover {
4063
+ background-color: var(--bg-overlay-l1);
4064
+ }
4065
+
4066
+ .ds-virtual-list__item:last-child {
4067
+ border-bottom: none;
4068
+ }
4069
+
4070
+ .ds-virtual-list__item.is-active {
4071
+ background-color: var(--bg-brand-popup);
4072
+ }
4073
+
4074
+ .ds-virtual-list__item.is-selected {
4075
+ background-color: var(--bg-overlay-l2);
4076
+ }
4077
+
4078
+ .ds-virtual-list__item.is-selected::before {
4079
+ content: '';
4080
+ position: absolute;
4081
+ left: 0;
4082
+ width: 2px;
4083
+ height: 100%;
4084
+ background-color: var(--bg-brand);
4085
+ }
4086
+
4087
+ .ds-virtual-list__item-content {
4088
+ display: flex;
4089
+ align-items: center;
4090
+ gap: 12px;
4091
+ width: 100%;
4092
+ }
4093
+
4094
+ .ds-virtual-list__item-icon {
4095
+ width: 32px;
4096
+ height: 32px;
4097
+ display: flex;
4098
+ align-items: center;
4099
+ justify-content: center;
4100
+ border-radius: var(--radius-md);
4101
+ background-color: var(--bg-overlay-l2);
4102
+ color: var(--text-secondary);
4103
+ }
4104
+
4105
+ .ds-virtual-list__item-title {
4106
+ font-size: 13px;
4107
+ font-weight: 500;
4108
+ color: var(--text-default);
4109
+ }
4110
+
4111
+ .ds-virtual-list__item-subtitle {
4112
+ font-size: 12px;
4113
+ color: var(--text-tertiary);
4114
+ margin-top: 2px;
4115
+ }
4116
+
4117
+ .ds-virtual-list__header {
4118
+ display: flex;
4119
+ align-items: center;
4120
+ justify-content: space-between;
4121
+ padding: 12px 16px;
4122
+ border-bottom: 1px solid var(--border-neutral-l1);
4123
+ background-color: var(--bg-overlay-l1);
4124
+ }
4125
+
4126
+ .ds-virtual-list__header-title {
4127
+ font-size: 13px;
4128
+ font-weight: 500;
4129
+ color: var(--text-default);
4130
+ }
4131
+
4132
+ .ds-virtual-list__header-count {
4133
+ font-size: 12px;
4134
+ color: var(--text-tertiary);
4135
+ }
4136
+
4137
+ .ds-virtual-list__footer {
4138
+ padding: 8px 16px;
4139
+ border-top: 1px solid var(--border-neutral-l1);
4140
+ background-color: var(--bg-overlay-l1);
4141
+ text-align: center;
4142
+ font-size: 12px;
4143
+ color: var(--text-tertiary);
4144
+ }
4145
+
4146
+ .ds-virtual-list--horizontal {
4147
+ overflow-x: auto;
4148
+ overflow-y: hidden;
4149
+ }
4150
+
4151
+ .ds-virtual-list--horizontal .ds-virtual-list__container {
4152
+ display: flex;
4153
+ }
4154
+
4155
+ .ds-virtual-list--horizontal .ds-virtual-list__item {
4156
+ flex-shrink: 0;
4157
+ width: 200px;
4158
+ height: 100%;
4159
+ border-bottom: none;
4160
+ border-right: 1px solid var(--border-neutral-l1);
4161
+ }
4162
+
4163
+ .ds-virtual-list--horizontal .ds-virtual-list__item:last-child {
4164
+ border-right: none;
4165
+ }