@opencode-ai/ui 0.0.0-dev-18424 → 0.0.0-dev-202608272004

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/{data-display/accordion → components}/accordion.d.ts +6 -6
  2. package/dist/components/avatar.d.ts +9 -0
  3. package/dist/components/button.d.ts +9 -0
  4. package/dist/components/card.d.ts +1 -1
  5. package/dist/{forms/checkbox → components}/checkbox.d.ts +2 -2
  6. package/dist/components/dialog.d.ts +12 -0
  7. package/dist/{data-display/diff-changes → components}/diff-changes.d.ts +1 -2
  8. package/dist/components/dropdown-menu.d.ts +80 -0
  9. package/dist/components/icon-button.d.ts +10 -0
  10. package/dist/{icons/icon/additional-icons.d.ts → components/icon.d.ts} +8 -8
  11. package/dist/components/keybind.d.ts +6 -0
  12. package/dist/components/list.d.ts +1 -1
  13. package/dist/{feedback/progress-circle → components}/progress-circle.d.ts +0 -2
  14. package/dist/components/radio-group.d.ts +16 -0
  15. package/dist/components/scroll-view.d.ts +3 -3
  16. package/dist/components/select.d.ts +21 -0
  17. package/dist/{forms/switch → components}/switch.d.ts +2 -4
  18. package/dist/{navigation/tabs → components}/tabs.d.ts +8 -15
  19. package/dist/components/tag.d.ts +5 -0
  20. package/dist/{typography/text-shimmer → components}/text-shimmer.d.ts +0 -1
  21. package/dist/components/toast.d.ts +56 -0
  22. package/dist/components/tooltip.d.ts +17 -0
  23. package/dist/context/i18n.d.ts +7 -10
  24. package/dist/i18n/ar.d.ts +2 -0
  25. package/dist/i18n/bg.d.ts +2 -0
  26. package/dist/i18n/br.d.ts +2 -0
  27. package/dist/i18n/bs.d.ts +2 -0
  28. package/dist/i18n/da.d.ts +2 -0
  29. package/dist/i18n/de.d.ts +2 -0
  30. package/dist/i18n/en.d.ts +1 -227
  31. package/dist/i18n/es.d.ts +2 -0
  32. package/dist/i18n/fr.d.ts +2 -0
  33. package/dist/i18n/ja.d.ts +2 -0
  34. package/dist/i18n/km.d.ts +2 -0
  35. package/dist/i18n/ko.d.ts +2 -0
  36. package/dist/i18n/lo.d.ts +2 -0
  37. package/dist/i18n/mk.d.ts +2 -0
  38. package/dist/i18n/mn.d.ts +2 -0
  39. package/dist/i18n/my.d.ts +2 -0
  40. package/dist/i18n/pl.d.ts +2 -0
  41. package/dist/i18n/ru.d.ts +2 -0
  42. package/dist/i18n/sr.d.ts +2 -0
  43. package/dist/i18n/tg.d.ts +2 -0
  44. package/dist/i18n/th.d.ts +2 -0
  45. package/dist/i18n/tr.d.ts +2 -0
  46. package/dist/i18n/zh.d.ts +2 -0
  47. package/dist/i18n/zht.d.ts +2 -0
  48. package/dist/v2/components/accordion-v2.d.ts +26 -0
  49. package/dist/{data-display/avatar/avatar.d.ts → v2/components/avatar-v2.d.ts} +1 -1
  50. package/dist/v2/components/badge-v2.d.ts +6 -0
  51. package/dist/v2/components/button-v2.d.ts +10 -0
  52. package/dist/v2/components/checkbox-v2.d.ts +10 -0
  53. package/dist/{overlays/dialog/dialog.d.ts → v2/components/dialog-v2.d.ts} +2 -1
  54. package/dist/v2/components/diff-changes-v2.d.ts +11 -0
  55. package/dist/v2/components/divider-v2.d.ts +5 -0
  56. package/dist/{forms/field/field.d.ts → v2/components/field-v2.d.ts} +10 -4
  57. package/dist/v2/components/icon-button-v2.d.ts +11 -0
  58. package/dist/{icons/icon → v2/components}/icon.d.ts +1 -24
  59. package/dist/v2/components/inline-input-v2.d.ts +21 -0
  60. package/dist/v2/components/keybind-v2.d.ts +7 -0
  61. package/dist/{data-display/line-comment/line-comment.d.ts → v2/components/line-comment-v2.d.ts} +9 -9
  62. package/dist/v2/components/loader-v2.d.ts +3 -0
  63. package/dist/v2/components/menu-v2.d.ts +52 -0
  64. package/dist/v2/components/progress-circle-v2.d.ts +8 -0
  65. package/dist/{data-display/project-avatar/project-avatar.d.ts → v2/components/project-avatar-v2.d.ts} +1 -1
  66. package/dist/v2/components/radio-v2.d.ts +16 -0
  67. package/dist/{navigation/segmented-control/segmented-control.d.ts → v2/components/segmented-control-v2.d.ts} +5 -5
  68. package/dist/{forms/select/select.d.ts → v2/components/select-v2.d.ts} +6 -4
  69. package/dist/v2/components/split-button-v2.d.ts +5 -0
  70. package/dist/v2/components/switch-v2.d.ts +7 -0
  71. package/dist/v2/components/tabs-v2.d.ts +34 -0
  72. package/dist/{forms/text-input/text-input.d.ts → v2/components/text-input-v2.d.ts} +3 -3
  73. package/dist/v2/components/text-shimmer-v2.d.ts +9 -0
  74. package/dist/v2/components/textarea-v2.d.ts +7 -0
  75. package/dist/v2/components/toast-v2.d.ts +57 -0
  76. package/dist/v2/components/tooltip-v2.d.ts +13 -0
  77. package/dist/v2/components/wordmark-v2.d.ts +2 -0
  78. package/package.json +13 -131
  79. package/src/{data-display/accordion → components}/accordion.css +26 -1
  80. package/src/{data-display/accordion → components}/accordion.tsx +14 -14
  81. package/src/components/animated-number.css +11 -29
  82. package/src/components/animated-number.tsx +2 -2
  83. package/src/components/avatar.css +49 -0
  84. package/src/components/avatar.tsx +55 -0
  85. package/src/components/button.css +194 -0
  86. package/src/{actions/button → components}/button.tsx +11 -10
  87. package/src/components/card.css +23 -2
  88. package/src/components/card.tsx +4 -4
  89. package/src/{forms/checkbox → components}/checkbox.css +7 -1
  90. package/src/{forms/checkbox → components}/checkbox.tsx +13 -13
  91. package/src/components/collapsible.tsx +2 -2
  92. package/src/components/dialog.css +181 -0
  93. package/src/components/dialog.tsx +72 -0
  94. package/src/{data-display/diff-changes → components}/diff-changes.css +19 -22
  95. package/src/components/diff-changes.tsx +115 -0
  96. package/src/components/dock-surface.css +9 -2
  97. package/src/components/dropdown-menu.css +135 -0
  98. package/src/components/dropdown-menu.tsx +308 -0
  99. package/src/components/icon-button.css +181 -0
  100. package/src/components/icon-button.tsx +29 -0
  101. package/src/components/icon.css +39 -0
  102. package/src/{icons/icon/additional-icons.ts → components/icon.tsx} +74 -8
  103. package/src/components/image-preview.tsx +2 -3
  104. package/src/components/keybind.css +18 -0
  105. package/src/components/keybind.tsx +20 -0
  106. package/src/components/list.css +5 -5
  107. package/src/components/list.tsx +5 -7
  108. package/src/components/popover.tsx +2 -3
  109. package/src/components/progress-circle.css +16 -0
  110. package/src/components/progress-circle.tsx +64 -0
  111. package/src/components/radio-group.css +187 -0
  112. package/src/components/radio-group.tsx +83 -0
  113. package/src/components/scroll-view.tsx +20 -5
  114. package/src/components/select.css +201 -0
  115. package/src/components/select.tsx +174 -0
  116. package/src/components/sticky-accordion-header.tsx +1 -1
  117. package/src/components/switch.css +136 -0
  118. package/src/components/switch.tsx +29 -0
  119. package/src/{navigation/tabs → components}/tabs.css +229 -39
  120. package/src/components/tabs.tsx +126 -0
  121. package/src/components/tag.css +37 -0
  122. package/src/components/tag.tsx +22 -0
  123. package/src/components/text-field.tsx +4 -12
  124. package/src/{typography/text-shimmer → components}/text-shimmer.css +1 -2
  125. package/src/{typography/text-shimmer → components}/text-shimmer.tsx +0 -1
  126. package/src/components/toast.css +236 -0
  127. package/src/components/toast.tsx +185 -0
  128. package/src/components/tooltip.css +74 -0
  129. package/src/components/tooltip.tsx +163 -0
  130. package/src/context/dialog.tsx +0 -1
  131. package/src/context/i18n.tsx +14 -17
  132. package/src/hooks/create-auto-scroll.tsx +0 -20
  133. package/src/i18n/am.ts +3 -1
  134. package/src/i18n/ar.ts +3 -1
  135. package/src/i18n/az.ts +3 -1
  136. package/src/i18n/bg.ts +3 -1
  137. package/src/i18n/bn.ts +3 -1
  138. package/src/i18n/br.ts +3 -1
  139. package/src/i18n/bs.ts +3 -1
  140. package/src/i18n/ca.ts +3 -1
  141. package/src/i18n/cs.ts +3 -1
  142. package/src/i18n/da.ts +3 -1
  143. package/src/i18n/de.ts +3 -1
  144. package/src/i18n/dv.ts +3 -1
  145. package/src/i18n/dz.ts +3 -1
  146. package/src/i18n/el.ts +3 -1
  147. package/src/i18n/en.ts +5 -37
  148. package/src/i18n/es.ts +3 -1
  149. package/src/i18n/et.ts +3 -1
  150. package/src/i18n/fa.ts +3 -1
  151. package/src/i18n/fi.ts +3 -1
  152. package/src/i18n/fo.ts +3 -1
  153. package/src/i18n/fr.ts +3 -1
  154. package/src/i18n/hi.ts +3 -1
  155. package/src/i18n/hr.ts +3 -1
  156. package/src/i18n/hu.ts +3 -1
  157. package/src/i18n/hy.ts +3 -1
  158. package/src/i18n/id.ts +3 -1
  159. package/src/i18n/is.ts +3 -1
  160. package/src/i18n/it.ts +3 -1
  161. package/src/i18n/ja.ts +3 -1
  162. package/src/i18n/ka.ts +3 -1
  163. package/src/i18n/km.ts +3 -1
  164. package/src/i18n/ko.ts +3 -1
  165. package/src/i18n/lo.ts +3 -1
  166. package/src/i18n/lt.ts +3 -1
  167. package/src/i18n/lv.ts +3 -1
  168. package/src/i18n/mk.ts +3 -1
  169. package/src/i18n/mn.ts +3 -1
  170. package/src/i18n/ms.ts +3 -1
  171. package/src/i18n/my.ts +3 -1
  172. package/src/i18n/ne.ts +3 -1
  173. package/src/i18n/nl.ts +3 -1
  174. package/src/i18n/no.ts +3 -1
  175. package/src/i18n/pa.ts +3 -1
  176. package/src/i18n/pl.ts +3 -1
  177. package/src/i18n/ro.ts +3 -1
  178. package/src/i18n/ru.ts +3 -1
  179. package/src/i18n/si.ts +3 -1
  180. package/src/i18n/sk.ts +3 -1
  181. package/src/i18n/sl.ts +3 -1
  182. package/src/i18n/sq.ts +3 -1
  183. package/src/i18n/sr.ts +3 -1
  184. package/src/i18n/sv.ts +3 -1
  185. package/src/i18n/tg.ts +3 -1
  186. package/src/i18n/th.ts +3 -1
  187. package/src/i18n/tk.ts +3 -1
  188. package/src/i18n/tr.ts +3 -1
  189. package/src/i18n/uk.ts +3 -1
  190. package/src/i18n/ur.ts +3 -1
  191. package/src/i18n/uz.ts +3 -1
  192. package/src/i18n/vi.ts +3 -1
  193. package/src/i18n/zh.ts +3 -1
  194. package/src/i18n/zht.ts +3 -1
  195. package/src/styles/index.css +20 -4
  196. package/src/styles/tailwind/colors.css +0 -1
  197. package/src/styles/tailwind/index.css +1 -18
  198. package/src/styles/theme.css +2 -2
  199. package/src/theme/context.tsx +11 -19
  200. package/src/theme/themes/oc-2.json +1 -3
  201. package/src/theme/v2/foreground.ts +0 -1
  202. package/src/v2/components/accordion-v2.css +139 -0
  203. package/src/v2/components/accordion-v2.tsx +86 -0
  204. package/src/{data-display/avatar/avatar.tsx → v2/components/avatar-v2.tsx} +1 -1
  205. package/src/{data-display/badge/badge.css → v2/components/badge-v2.css} +0 -19
  206. package/src/{data-display/badge/badge.tsx → v2/components/badge-v2.tsx} +4 -6
  207. package/src/v2/components/button-v2.tsx +35 -0
  208. package/src/v2/components/checkbox-v2.css +184 -0
  209. package/src/v2/components/checkbox-v2.tsx +65 -0
  210. package/src/{overlays/dialog/dialog.css → v2/components/dialog-v2.css} +0 -3
  211. package/src/{overlays/dialog/dialog.tsx → v2/components/dialog-v2.tsx} +13 -11
  212. package/src/v2/components/diff-changes-v2.css +26 -0
  213. package/src/{data-display/diff-changes/diff-changes.tsx → v2/components/diff-changes-v2.tsx} +2 -7
  214. package/src/{layout/divider/divider.tsx → v2/components/divider-v2.tsx} +3 -3
  215. package/src/{forms/field/field.css → v2/components/field-v2.css} +1 -1
  216. package/src/{forms/field/field.tsx → v2/components/field-v2.tsx} +11 -9
  217. package/src/v2/components/icon-button-v2.tsx +37 -0
  218. package/src/{icons/icon → v2/components}/icon.tsx +9 -50
  219. package/src/v2/components/inline-input-v2.css +225 -0
  220. package/src/v2/components/inline-input-v2.tsx +107 -0
  221. package/src/{data-display/keybind/keybind.css → v2/components/keybind-v2.css} +1 -1
  222. package/src/{data-display/keybind/keybind.tsx → v2/components/keybind-v2.tsx} +3 -3
  223. package/src/{data-display/line-comment/line-comment.css → v2/components/line-comment-v2.css} +3 -3
  224. package/src/{data-display/line-comment/line-comment.tsx → v2/components/line-comment-v2.tsx} +15 -17
  225. package/src/{feedback/loader/loader.tsx → v2/components/loader-v2.tsx} +2 -2
  226. package/src/{navigation/menu/menu.css → v2/components/menu-v2.css} +2 -122
  227. package/src/{navigation/menu/menu.tsx → v2/components/menu-v2.tsx} +32 -96
  228. package/src/v2/components/progress-circle-v2.css +13 -0
  229. package/src/v2/components/progress-circle-v2.tsx +52 -0
  230. package/src/{data-display/project-avatar/project-avatar.tsx → v2/components/project-avatar-v2.tsx} +1 -1
  231. package/src/{forms/radio/radio.tsx → v2/components/radio-v2.tsx} +20 -30
  232. package/src/{navigation/segmented-control/segmented-control.css → v2/components/segmented-control-v2.css} +1 -1
  233. package/src/{navigation/segmented-control/segmented-control.tsx → v2/components/segmented-control-v2.tsx} +8 -9
  234. package/src/{forms/select/select.css → v2/components/select-v2.css} +8 -2
  235. package/src/{forms/select/select.tsx → v2/components/select-v2.tsx} +32 -38
  236. package/src/{actions/split-button/split-button.css → v2/components/split-button-v2.css} +6 -1
  237. package/src/{actions/split-button/split-button.tsx → v2/components/split-button-v2.tsx} +4 -4
  238. package/src/{forms/switch/switch.css → v2/components/switch-v2.css} +0 -110
  239. package/src/v2/components/switch-v2.tsx +28 -0
  240. package/src/{navigation/tabs/tabs-current.css → v2/components/tabs-v2.css} +10 -25
  241. package/src/v2/components/tabs-v2.tsx +149 -0
  242. package/src/{forms/text-input/text-input.css → v2/components/text-input-v2.css} +1 -1
  243. package/src/{forms/text-input/text-input.tsx → v2/components/text-input-v2.tsx} +4 -4
  244. package/src/v2/components/text-shimmer-v2.css +125 -0
  245. package/src/v2/components/text-shimmer-v2.tsx +63 -0
  246. package/src/{forms/textarea/textarea.tsx → v2/components/textarea-v2.tsx} +3 -3
  247. package/src/{feedback/toast/toast.tsx → v2/components/toast-v2.tsx} +58 -60
  248. package/src/{overlays/tooltip/tooltip.css → v2/components/tooltip-v2.css} +0 -26
  249. package/src/{overlays/tooltip/tooltip.tsx → v2/components/tooltip-v2.tsx} +14 -21
  250. package/src/{typography/wordmark/wordmark.tsx → v2/components/wordmark-v2.tsx} +1 -1
  251. package/src/{styles/tokens → v2/styles}/theme.css +14 -10
  252. package/dist/actions/button/button.d.ts +0 -10
  253. package/dist/actions/icon-button/icon-button.d.ts +0 -11
  254. package/dist/actions/split-button/split-button.d.ts +0 -5
  255. package/dist/data-display/badge/badge.d.ts +0 -7
  256. package/dist/data-display/keybind/keybind.d.ts +0 -7
  257. package/dist/feedback/loader/loader.d.ts +0 -3
  258. package/dist/feedback/toast/toast.d.ts +0 -57
  259. package/dist/forms/radio/radio.d.ts +0 -16
  260. package/dist/forms/textarea/textarea.d.ts +0 -7
  261. package/dist/i18n/he.d.ts +0 -197
  262. package/dist/layout/divider/divider.d.ts +0 -5
  263. package/dist/navigation/menu/menu.d.ts +0 -59
  264. package/dist/overlays/tooltip/tooltip.d.ts +0 -15
  265. package/dist/typography/wordmark/wordmark.d.ts +0 -2
  266. package/src/actions/icon-button/icon-button.tsx +0 -32
  267. package/src/feedback/progress-circle/progress-circle.css +0 -28
  268. package/src/feedback/progress-circle/progress-circle.tsx +0 -64
  269. package/src/forms/switch/switch.tsx +0 -34
  270. package/src/i18n/he.ts +0 -199
  271. package/src/icons/icon/icon.css +0 -3
  272. package/src/navigation/tabs/tabs.tsx +0 -194
  273. /package/dist/{forms/inline-input → components}/inline-input.d.ts +0 -0
  274. /package/dist/{navigation → v2/components}/tab-state-indicator.d.ts +0 -0
  275. /package/src/{forms/inline-input → components}/inline-input.css +0 -0
  276. /package/src/{forms/inline-input → components}/inline-input.tsx +0 -0
  277. /package/src/{data-display/avatar/avatar.css → v2/components/avatar-v2.css} +0 -0
  278. /package/src/{actions/button/button.css → v2/components/button-v2.css} +0 -0
  279. /package/src/{layout/divider/divider.css → v2/components/divider-v2.css} +0 -0
  280. /package/src/{styles/file-tree.css → v2/components/file-tree-v2.css} +0 -0
  281. /package/src/{actions/icon-button/icon-button.css → v2/components/icon-button-v2.css} +0 -0
  282. /package/src/{feedback/loader/loader.css → v2/components/loader-v2.css} +0 -0
  283. /package/src/{data-display/project-avatar/project-avatar.css → v2/components/project-avatar-v2.css} +0 -0
  284. /package/src/{forms/radio/radio.css → v2/components/radio-v2.css} +0 -0
  285. /package/src/{navigation → v2/components}/tab-state-indicator.tsx +0 -0
  286. /package/src/{forms/textarea/textarea.css → v2/components/textarea-v2.css} +0 -0
  287. /package/src/{feedback/toast/toast.css → v2/components/toast-v2.css} +0 -0
  288. /package/src/{styles/tokens → v2/styles}/colors.css +0 -0
  289. /package/src/{styles/tokens/index.css → v2/styles/tailwind.css} +0 -0
@@ -31,10 +31,6 @@
31
31
  }
32
32
  }
33
33
 
34
- :dir(rtl) [data-slot="menu-v2-item-chevron"] {
35
- transform: scaleX(-1);
36
- }
37
-
38
34
  [data-component="menu-v2-item"] {
39
35
  --menu-v2-fg: var(--v2-text-text-base);
40
36
  --menu-v2-fg-muted: var(--v2-text-text-faint);
@@ -76,7 +72,7 @@
76
72
 
77
73
  font-size: 13px;
78
74
  font-weight: 440;
79
- line-height: var(--line-height-compact);
75
+ line-height: 100%;
80
76
  letter-spacing: -0.04px;
81
77
  color: var(--menu-v2-fg);
82
78
  }
@@ -175,129 +171,13 @@
175
171
 
176
172
  font-size: 11px;
177
173
  font-weight: 530;
174
+ line-height: 100%;
178
175
  letter-spacing: 0.05px;
179
176
  color: var(--v2-text-text-faint);
180
177
  user-select: none;
181
178
  font-variant-numeric: tabular-nums;
182
179
  }
183
180
 
184
- [data-component="menu-v2-content"][data-appearance="standard"] {
185
- min-width: 8rem;
186
- padding: 4px;
187
- overflow: hidden;
188
- border: 1px solid color-mix(in oklch, var(--border-base) 50%, transparent);
189
- border-radius: var(--radius-md);
190
- background: var(--surface-raised-stronger-non-alpha);
191
- background-clip: padding-box;
192
- box-shadow: var(--shadow-md);
193
- z-index: 60;
194
- animation: dropdown-menu-open 150ms ease-out;
195
-
196
- &[data-closed] {
197
- animation: dropdown-menu-close 150ms ease-out;
198
- }
199
-
200
- [data-component="menu-v2-item"] {
201
- position: relative;
202
- height: auto;
203
- min-height: 0;
204
- padding: 4px 8px;
205
- border-radius: var(--radius-sm);
206
- color: var(--text-strong);
207
- font-family: var(--font-family-sans);
208
- font-size: var(--font-size-small);
209
- font-weight: var(--font-weight-medium);
210
- line-height: var(--line-height-large);
211
- letter-spacing: var(--letter-spacing-normal);
212
- font-variant-numeric: normal;
213
- -webkit-font-smoothing: auto;
214
- text-rendering: auto;
215
-
216
- [data-slot="menu-v2-item-content"] {
217
- font-family: inherit;
218
- font-size: inherit;
219
- font-weight: inherit;
220
- line-height: inherit;
221
- letter-spacing: inherit;
222
- color: inherit;
223
- }
224
-
225
- &[data-highlighted] {
226
- background: var(--surface-raised-base-hover);
227
- }
228
-
229
- &[data-disabled] {
230
- color: var(--text-weak);
231
- opacity: 1;
232
- }
233
-
234
- &[data-checked] {
235
- padding-inline-end: 28px;
236
- }
237
-
238
- &[data-checked] [data-slot="menu-v2-item-content"] {
239
- font-weight: inherit;
240
- color: inherit;
241
- }
242
-
243
- [data-slot="menu-v2-item-indicator"] {
244
- position: absolute;
245
- inset-inline-end: 8px;
246
- top: 50%;
247
- width: 16px;
248
- height: 16px;
249
- transform: translateY(-50%);
250
- color: var(--icon-base);
251
- }
252
-
253
- [data-slot="menu-v2-item-chevron"] {
254
- margin-inline-start: auto;
255
- color: var(--icon-base);
256
- }
257
- }
258
-
259
- [data-slot="menu-v2-separator"] {
260
- width: calc(100% + 8px);
261
- height: 1px;
262
- margin: 4px -4px;
263
- background: var(--border-weak-base);
264
- }
265
-
266
- [data-slot="menu-v2-group-label"] {
267
- height: auto;
268
- padding: 4px 8px;
269
- color: var(--text-weak);
270
- font-family: var(--font-family-sans);
271
- font-size: var(--font-size-x-small);
272
- font-weight: var(--font-weight-medium);
273
- line-height: var(--line-height-large);
274
- letter-spacing: var(--letter-spacing-normal);
275
- font-variant-numeric: normal;
276
- }
277
- }
278
-
279
- @keyframes dropdown-menu-open {
280
- from {
281
- opacity: 0;
282
- transform: scale(0.96);
283
- }
284
- to {
285
- opacity: 1;
286
- transform: scale(1);
287
- }
288
- }
289
-
290
- @keyframes dropdown-menu-close {
291
- from {
292
- opacity: 1;
293
- transform: scale(1);
294
- }
295
- to {
296
- opacity: 0;
297
- transform: scale(0.96);
298
- }
299
- }
300
-
301
181
  @keyframes menu-v2-in {
302
182
  from {
303
183
  opacity: 0;
@@ -1,17 +1,7 @@
1
1
  import { DropdownMenu } from "@kobalte/core/dropdown-menu"
2
2
  import { ContextMenu } from "@kobalte/core/context-menu"
3
- import {
4
- createContext,
5
- Show,
6
- splitProps,
7
- useContext,
8
- type Accessor,
9
- type Component,
10
- type ComponentProps,
11
- type JSX,
12
- type ParentProps,
13
- } from "solid-js"
14
- import "./menu.css"
3
+ import { Show, splitProps, type Component, type ComponentProps, type JSX, type ParentProps } from "solid-js"
4
+ import "./menu-v2.css"
15
5
 
16
6
  const ChevronRight: Component = () => (
17
7
  <svg
@@ -39,18 +29,6 @@ const CheckMark: Component = () => (
39
29
  </svg>
40
30
  )
41
31
 
42
- export type MenuAppearance = "standard" | "compact"
43
-
44
- const MenuAppearanceContext = createContext<{ appearance: Accessor<MenuAppearance> }>({
45
- appearance: (): MenuAppearance => "compact",
46
- })
47
-
48
- function useMenuContext() {
49
- const ctx = useContext(MenuAppearanceContext)
50
- if (!ctx) throw new Error("Menu components must be used inside Menu or Menu.Context")
51
- return ctx
52
- }
53
-
54
32
  function ItemBody(
55
33
  props: ParentProps<{
56
34
  shortcut?: JSX.Element | string
@@ -68,21 +46,15 @@ function ItemBody(
68
46
  )
69
47
  }
70
48
 
71
- export interface MenuItemProps extends ComponentProps<typeof DropdownMenu.Item> {
49
+ export interface MenuV2ItemProps extends ComponentProps<typeof DropdownMenu.Item> {
72
50
  shortcut?: JSX.Element | string
73
51
  badge?: JSX.Element | string
74
52
  }
75
53
 
76
- function MenuItem(props: ParentProps<MenuItemProps>) {
77
- const ctx = useMenuContext()
54
+ function MenuV2Item(props: ParentProps<MenuV2ItemProps>) {
78
55
  const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
79
56
  return (
80
- <DropdownMenu.Item
81
- {...r}
82
- data-component="menu-v2-item"
83
- data-appearance={ctx.appearance()}
84
- classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
85
- >
57
+ <DropdownMenu.Item {...r} data-component="menu-v2-item" classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}>
86
58
  <ItemBody shortcut={s.shortcut} badge={s.badge}>
87
59
  {s.children}
88
60
  </ItemBody>
@@ -90,19 +62,17 @@ function MenuItem(props: ParentProps<MenuItemProps>) {
90
62
  )
91
63
  }
92
64
 
93
- export interface MenuCheckboxItemProps extends ComponentProps<typeof DropdownMenu.CheckboxItem> {
65
+ export interface MenuV2CheckboxItemProps extends ComponentProps<typeof DropdownMenu.CheckboxItem> {
94
66
  shortcut?: JSX.Element | string
95
67
  badge?: JSX.Element | string
96
68
  }
97
69
 
98
- function MenuCheckboxItem(props: ParentProps<MenuCheckboxItemProps>) {
99
- const ctx = useMenuContext()
70
+ function MenuV2CheckboxItem(props: ParentProps<MenuV2CheckboxItemProps>) {
100
71
  const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
101
72
  return (
102
73
  <DropdownMenu.CheckboxItem
103
74
  {...r}
104
75
  data-component="menu-v2-item"
105
- data-appearance={ctx.appearance()}
106
76
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
107
77
  >
108
78
  <ItemBody
@@ -120,19 +90,17 @@ function MenuCheckboxItem(props: ParentProps<MenuCheckboxItemProps>) {
120
90
  )
121
91
  }
122
92
 
123
- export interface MenuRadioItemProps extends ComponentProps<typeof DropdownMenu.RadioItem> {
93
+ export interface MenuV2RadioItemProps extends ComponentProps<typeof DropdownMenu.RadioItem> {
124
94
  shortcut?: JSX.Element | string
125
95
  badge?: JSX.Element | string
126
96
  }
127
97
 
128
- function MenuRadioItem(props: ParentProps<MenuRadioItemProps>) {
129
- const ctx = useMenuContext()
98
+ function MenuV2RadioItem(props: ParentProps<MenuV2RadioItemProps>) {
130
99
  const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
131
100
  return (
132
101
  <DropdownMenu.RadioItem
133
102
  {...r}
134
103
  data-component="menu-v2-item"
135
- data-appearance={ctx.appearance()}
136
104
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
137
105
  >
138
106
  <ItemBody
@@ -150,19 +118,17 @@ function MenuRadioItem(props: ParentProps<MenuRadioItemProps>) {
150
118
  )
151
119
  }
152
120
 
153
- export interface MenuSubTriggerProps extends ComponentProps<typeof DropdownMenu.SubTrigger> {
121
+ export interface MenuV2SubTriggerProps extends ComponentProps<typeof DropdownMenu.SubTrigger> {
154
122
  shortcut?: JSX.Element | string
155
123
  badge?: JSX.Element | string
156
124
  }
157
125
 
158
- function MenuSubTrigger(props: ParentProps<MenuSubTriggerProps>) {
159
- const ctx = useMenuContext()
126
+ function MenuV2SubTrigger(props: ParentProps<MenuV2SubTriggerProps>) {
160
127
  const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
161
128
  return (
162
129
  <DropdownMenu.SubTrigger
163
130
  {...r}
164
131
  data-component="menu-v2-item"
165
- data-appearance={ctx.appearance()}
166
132
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
167
133
  >
168
134
  <ItemBody shortcut={s.shortcut} badge={s.badge} trailing={<ChevronRight />}>
@@ -172,118 +138,88 @@ function MenuSubTrigger(props: ParentProps<MenuSubTriggerProps>) {
172
138
  )
173
139
  }
174
140
 
175
- function MenuSubContent(props: ComponentProps<typeof DropdownMenu.SubContent>) {
176
- const ctx = useMenuContext()
141
+ function MenuV2SubContent(props: ComponentProps<typeof DropdownMenu.SubContent>) {
177
142
  const [s, r] = splitProps(props, ["class", "classList"])
178
143
  return (
179
144
  <DropdownMenu.SubContent
180
145
  {...r}
181
146
  data-component="menu-v2-content"
182
- data-appearance={ctx.appearance()}
183
147
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
184
148
  />
185
149
  )
186
150
  }
187
151
 
188
- function MenuGroupLabel(props: ComponentProps<typeof DropdownMenu.GroupLabel>) {
189
- const ctx = useMenuContext()
152
+ function MenuV2GroupLabel(props: ComponentProps<typeof DropdownMenu.GroupLabel>) {
190
153
  const [s, r] = splitProps(props, ["class", "classList"])
191
154
  return (
192
155
  <DropdownMenu.GroupLabel
193
156
  {...r}
194
157
  data-slot="menu-v2-group-label"
195
- data-appearance={ctx.appearance()}
196
158
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
197
159
  />
198
160
  )
199
161
  }
200
162
 
201
- function MenuSeparator(props: ComponentProps<typeof DropdownMenu.Separator>) {
202
- const ctx = useMenuContext()
163
+ function MenuV2Separator(props: ComponentProps<typeof DropdownMenu.Separator>) {
203
164
  const [s, r] = splitProps(props, ["class", "classList"])
204
165
  return (
205
166
  <DropdownMenu.Separator
206
167
  {...r}
207
168
  data-slot="menu-v2-separator"
208
- data-appearance={ctx.appearance()}
209
169
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
210
170
  />
211
171
  )
212
172
  }
213
173
 
214
- function MenuContent(props: ComponentProps<typeof DropdownMenu.Content>) {
215
- const ctx = useMenuContext()
174
+ function MenuV2Content(props: ComponentProps<typeof DropdownMenu.Content>) {
216
175
  const [s, r] = splitProps(props, ["class", "classList"])
217
176
  return (
218
177
  <DropdownMenu.Content
219
178
  {...r}
220
179
  data-component="menu-v2-content"
221
- data-appearance={ctx.appearance()}
222
180
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
223
181
  />
224
182
  )
225
183
  }
226
184
 
227
- export interface MenuProps extends ComponentProps<typeof DropdownMenu> {
228
- appearance?: MenuAppearance
185
+ function MenuV2Root(props: ComponentProps<typeof DropdownMenu>) {
186
+ return <DropdownMenu {...props} />
229
187
  }
230
188
 
231
- function MenuRoot(props: MenuProps) {
232
- const [local, rest] = splitProps(props, ["appearance", "children"])
233
- const appearance = () => local.appearance ?? "compact"
234
- return (
235
- <MenuAppearanceContext.Provider value={{ appearance }}>
236
- <DropdownMenu {...rest}>{local.children}</DropdownMenu>
237
- </MenuAppearanceContext.Provider>
238
- )
239
- }
240
-
241
- export interface MenuContextProps extends ComponentProps<typeof ContextMenu> {
242
- appearance?: MenuAppearance
243
- }
244
-
245
- function MenuContextRoot(props: MenuContextProps) {
246
- const [local, rest] = splitProps(props, ["appearance", "children"])
247
- const appearance = () => local.appearance ?? "compact"
248
- return (
249
- <MenuAppearanceContext.Provider value={{ appearance }}>
250
- <ContextMenu {...rest}>{local.children}</ContextMenu>
251
- </MenuAppearanceContext.Provider>
252
- )
189
+ function MenuV2ContextRoot(props: ComponentProps<typeof ContextMenu>) {
190
+ return <ContextMenu {...props} />
253
191
  }
254
192
 
255
- function MenuContextContent(props: ComponentProps<typeof ContextMenu.Content>) {
256
- const ctx = useMenuContext()
193
+ function MenuV2ContextContent(props: ComponentProps<typeof ContextMenu.Content>) {
257
194
  const [s, r] = splitProps(props, ["class", "classList"])
258
195
  return (
259
196
  <ContextMenu.Content
260
197
  {...r}
261
198
  data-component="menu-v2-content"
262
- data-appearance={ctx.appearance()}
263
199
  classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
264
200
  />
265
201
  )
266
202
  }
267
203
 
268
- const MenuContext = Object.assign(MenuContextRoot, {
204
+ const MenuV2Context = Object.assign(MenuV2ContextRoot, {
269
205
  Trigger: ContextMenu.Trigger,
270
206
  Portal: ContextMenu.Portal,
271
- Content: MenuContextContent,
207
+ Content: MenuV2ContextContent,
272
208
  })
273
209
 
274
- export const Menu = Object.assign(MenuRoot, {
210
+ export const MenuV2 = Object.assign(MenuV2Root, {
275
211
  Trigger: DropdownMenu.Trigger,
276
212
  Portal: DropdownMenu.Portal,
277
- Content: MenuContent,
278
- Item: MenuItem,
279
- CheckboxItem: MenuCheckboxItem,
213
+ Content: MenuV2Content,
214
+ Item: MenuV2Item,
215
+ CheckboxItem: MenuV2CheckboxItem,
280
216
  RadioGroup: DropdownMenu.RadioGroup,
281
- RadioItem: MenuRadioItem,
217
+ RadioItem: MenuV2RadioItem,
282
218
  Group: DropdownMenu.Group,
283
- GroupLabel: MenuGroupLabel,
284
- Separator: MenuSeparator,
219
+ GroupLabel: MenuV2GroupLabel,
220
+ Separator: MenuV2Separator,
285
221
  Sub: DropdownMenu.Sub,
286
- SubTrigger: MenuSubTrigger,
287
- SubContent: MenuSubContent,
288
- Context: MenuContext,
222
+ SubTrigger: MenuV2SubTrigger,
223
+ SubContent: MenuV2SubContent,
224
+ Context: MenuV2Context,
289
225
  })
@@ -0,0 +1,13 @@
1
+ [data-component="progress-circle-v2"] {
2
+ display: block;
3
+ transform: rotate(-90deg);
4
+ }
5
+
6
+ [data-component="progress-circle-v2"] [data-slot="progress-circle-v2-background"] {
7
+ stroke: var(--v2-background-bg-layer-04);
8
+ }
9
+
10
+ [data-component="progress-circle-v2"] [data-slot="progress-circle-v2-progress"] {
11
+ stroke: var(--v2-icon-icon-base);
12
+ transition: stroke-dashoffset 0.35s cubic-bezier(0.65, 0, 0.35, 1);
13
+ }
@@ -0,0 +1,52 @@
1
+ import { type ComponentProps, createMemo, splitProps } from "solid-js"
2
+ import "./progress-circle-v2.css"
3
+
4
+ export interface ProgressCircleV2Props extends Pick<ComponentProps<"svg">, "class" | "classList"> {
5
+ percentage: number
6
+ size?: number
7
+ strokeWidth?: number
8
+ }
9
+
10
+ export function ProgressCircleV2(props: ProgressCircleV2Props) {
11
+ const [split, rest] = splitProps(props, ["percentage", "size", "strokeWidth", "class", "classList"])
12
+
13
+ const size = () => split.size ?? 14
14
+ const strokeWidth = () => split.strokeWidth ?? 1.5
15
+ const viewBoxSize = 14
16
+ const center = viewBoxSize / 2
17
+ const radius = () => center - strokeWidth() / 2
18
+ const circumference = createMemo(() => 2 * Math.PI * radius())
19
+ const offset = createMemo(() => circumference() * (1 - Math.max(0, Math.min(100, split.percentage || 0)) / 100))
20
+
21
+ return (
22
+ <svg
23
+ {...rest}
24
+ width={size()}
25
+ height={size()}
26
+ viewBox={`0 0 ${viewBoxSize} ${viewBoxSize}`}
27
+ fill="none"
28
+ data-component="progress-circle-v2"
29
+ classList={{
30
+ ...split.classList,
31
+ [split.class ?? ""]: !!split.class,
32
+ }}
33
+ >
34
+ <circle
35
+ cx={center}
36
+ cy={center}
37
+ r={radius()}
38
+ data-slot="progress-circle-v2-background"
39
+ stroke-width={strokeWidth()}
40
+ />
41
+ <circle
42
+ cx={center}
43
+ cy={center}
44
+ r={radius()}
45
+ data-slot="progress-circle-v2-progress"
46
+ stroke-width={strokeWidth()}
47
+ stroke-dasharray={circumference().toString()}
48
+ stroke-dashoffset={offset()}
49
+ />
50
+ </svg>
51
+ )
52
+ }
@@ -1,5 +1,5 @@
1
1
  import { type ComponentProps, splitProps, Show } from "solid-js"
2
- import "./project-avatar.css"
2
+ import "./project-avatar-v2.css"
3
3
 
4
4
  const segmenter =
5
5
  typeof Intl !== "undefined" && "Segmenter" in Intl
@@ -1,28 +1,18 @@
1
- import {
2
- Description,
3
- ErrorMessage,
4
- Item,
5
- ItemControl,
6
- ItemIndicator,
7
- ItemInput,
8
- ItemLabel,
9
- Label,
10
- Root,
11
- } from "@kobalte/core/radio-group"
1
+ import { RadioGroup as Kobalte } from "@kobalte/core/radio-group"
12
2
  import { Show, splitProps, type JSX } from "solid-js"
13
3
  import type { ComponentProps, ParentProps } from "solid-js"
14
- import "./radio.css"
4
+ import "./radio-v2.css"
15
5
 
16
- export interface RadioGroupProps extends ParentProps<ComponentProps<typeof Root>> {
6
+ export interface RadioGroupV2Props extends ParentProps<ComponentProps<typeof Kobalte>> {
17
7
  label?: JSX.Element
18
8
  description?: JSX.Element
19
9
  hideLabel?: boolean
20
10
  }
21
11
 
22
- export function RadioGroup(props: RadioGroupProps) {
12
+ export function RadioGroupV2(props: RadioGroupV2Props) {
23
13
  const [local, others] = splitProps(props, ["class", "classList", "children", "label", "description", "hideLabel"])
24
14
  return (
25
- <Root
15
+ <Kobalte
26
16
  {...others}
27
17
  data-component="radio-v2"
28
18
  classList={{
@@ -32,30 +22,30 @@ export function RadioGroup(props: RadioGroupProps) {
32
22
  >
33
23
  <Show when={local.label}>
34
24
  {(label) => (
35
- <Label data-slot="radio-v2-label" classList={{ "sr-only": local.hideLabel }}>
25
+ <Kobalte.Label data-slot="radio-v2-label" classList={{ "sr-only": local.hideLabel }}>
36
26
  {label()}
37
- </Label>
27
+ </Kobalte.Label>
38
28
  )}
39
29
  </Show>
40
30
  <Show when={local.description}>
41
- {(description) => <Description data-slot="radio-v2-description">{description()}</Description>}
31
+ {(description) => <Kobalte.Description data-slot="radio-v2-description">{description()}</Kobalte.Description>}
42
32
  </Show>
43
33
  <div data-slot="radio-v2-items">{local.children}</div>
44
- <ErrorMessage data-slot="radio-v2-error" />
45
- </Root>
34
+ <Kobalte.ErrorMessage data-slot="radio-v2-error" />
35
+ </Kobalte>
46
36
  )
47
37
  }
48
38
 
49
- export interface RadioItemProps extends ComponentProps<typeof Item> {
39
+ export interface RadioItemV2Props extends ComponentProps<typeof Kobalte.Item> {
50
40
  label: JSX.Element
51
41
  description?: JSX.Element
52
42
  hideLabel?: boolean
53
43
  }
54
44
 
55
- export function RadioItem(props: RadioItemProps) {
45
+ export function RadioItemV2(props: RadioItemV2Props) {
56
46
  const [local, others] = splitProps(props, ["class", "classList", "label", "description", "hideLabel"])
57
47
  return (
58
- <Item
48
+ <Kobalte.Item
59
49
  {...others}
60
50
  data-slot="radio-v2-item"
61
51
  classList={{
@@ -63,20 +53,20 @@ export function RadioItem(props: RadioItemProps) {
63
53
  [local.class ?? ""]: !!local.class,
64
54
  }}
65
55
  >
66
- <ItemInput data-slot="radio-v2-item-input" />
56
+ <Kobalte.ItemInput data-slot="radio-v2-item-input" />
67
57
  <div data-slot="radio-v2-item-control-stack">
68
- <ItemControl data-slot="radio-v2-item-control">
69
- <ItemIndicator data-slot="radio-v2-item-indicator" />
70
- </ItemControl>
58
+ <Kobalte.ItemControl data-slot="radio-v2-item-control">
59
+ <Kobalte.ItemIndicator data-slot="radio-v2-item-indicator" />
60
+ </Kobalte.ItemControl>
71
61
  </div>
72
- <ItemLabel data-slot="radio-v2-item-label" classList={{ "sr-only": local.hideLabel }}>
62
+ <Kobalte.ItemLabel data-slot="radio-v2-item-label" classList={{ "sr-only": local.hideLabel }}>
73
63
  <div data-slot="radio-v2-item-text">
74
64
  <span data-slot="radio-v2-item-label-text">{local.label}</span>
75
65
  <Show when={local.description}>
76
66
  {(description) => <span data-slot="radio-v2-item-description">{description()}</span>}
77
67
  </Show>
78
68
  </div>
79
- </ItemLabel>
80
- </Item>
69
+ </Kobalte.ItemLabel>
70
+ </Kobalte.Item>
81
71
  )
82
72
  }
@@ -37,7 +37,7 @@
37
37
  font-style: normal;
38
38
  font-weight: 440;
39
39
  font-size: 13px;
40
- line-height: var(--line-height-compact);
40
+ line-height: 100%;
41
41
  letter-spacing: -0.04px;
42
42
  font-variant-numeric: tabular-nums;
43
43
  font-variation-settings: "slnt" 0;
@@ -10,7 +10,7 @@ import {
10
10
  type ParentProps,
11
11
  } from "solid-js"
12
12
  import type { ComponentProps } from "solid-js"
13
- import "./segmented-control.css"
13
+ import "./segmented-control-v2.css"
14
14
 
15
15
  type OnChange = (value: string | null) => void
16
16
 
@@ -26,11 +26,11 @@ const SegmentedControlContext = createContext<SegmentedControlContextValue>()
26
26
 
27
27
  function useSegmentedControlContext() {
28
28
  const ctx = useContext(SegmentedControlContext)
29
- if (!ctx) throw new Error("SegmentedControlItem must be used inside SegmentedControl")
29
+ if (!ctx) throw new Error("SegmentedControlItemV2 must be used inside SegmentedControlV2")
30
30
  return ctx
31
31
  }
32
32
 
33
- export type SegmentedControlProps = Omit<ComponentProps<"div">, "onChange"> &
33
+ export type SegmentedControlV2Props = Omit<ComponentProps<"div">, "onChange"> &
34
34
  ParentProps<{
35
35
  /** Selected value when controlled (including `null` when empty). Omit key for uncontrolled. */
36
36
  value?: string | null
@@ -42,7 +42,7 @@ export type SegmentedControlProps = Omit<ComponentProps<"div">, "onChange"> &
42
42
  disabled?: boolean
43
43
  }>
44
44
 
45
- export function SegmentedControl(props: SegmentedControlProps) {
45
+ export function SegmentedControlV2(props: SegmentedControlV2Props) {
46
46
  const isControlled = createMemo(() => Object.hasOwn(props as object, "value"))
47
47
  const merged = mergeProps({ allowDeselect: false, disabled: false }, props)
48
48
  const [local, rest] = splitProps(merged, [
@@ -119,7 +119,7 @@ export function SegmentedControl(props: SegmentedControlProps) {
119
119
  )
120
120
  }
121
121
 
122
- export type SegmentedControlItemProps = Omit<ComponentProps<"button">, "type" | "children"> &
122
+ export type SegmentedControlItemV2Props = Omit<ComponentProps<"button">, "type" | "children"> &
123
123
  ParentProps<{
124
124
  value: string
125
125
  children: JSX.Element
@@ -132,7 +132,7 @@ function invokeButtonHandler<E extends Event>(
132
132
  if (typeof handler === "function") (handler as (ev: typeof e) => void)(e)
133
133
  }
134
134
 
135
- export function SegmentedControlItem(props: SegmentedControlItemProps) {
135
+ export function SegmentedControlItemV2(props: SegmentedControlItemV2Props) {
136
136
  const merged = mergeProps({ disabled: false }, props)
137
137
  const [local, rest] = splitProps(merged, [
138
138
  "class",
@@ -159,14 +159,13 @@ export function SegmentedControlItem(props: SegmentedControlItemProps) {
159
159
  invokeButtonHandler(local.onKeyDown, e)
160
160
  if (e.defaultPrevented || disabled()) return
161
161
  const t = e.currentTarget
162
- const horizontal = t.closest(`[data-slot="segmented-control-v2"]`)?.matches(":dir(rtl)") ? -1 : 1
163
162
 
164
163
  if (e.key === "ArrowRight") {
165
164
  e.preventDefault()
166
- ctx.focusNext(t, horizontal)
165
+ ctx.focusNext(t, 1)
167
166
  } else if (e.key === "ArrowLeft") {
168
167
  e.preventDefault()
169
- ctx.focusNext(t, -horizontal as 1 | -1)
168
+ ctx.focusNext(t, -1)
170
169
  }
171
170
 
172
171
  // accessibility stuff