@opencode-ai/ui 0.0.0-dev-19174 → 0.0.0-dev-202609060432

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 (298) 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/context/marked-parser.d.ts +2 -1
  25. package/dist/hooks/use-filtered-list.d.ts +0 -9
  26. package/dist/i18n/ar.d.ts +2 -0
  27. package/dist/i18n/bg.d.ts +2 -0
  28. package/dist/i18n/br.d.ts +2 -0
  29. package/dist/i18n/bs.d.ts +2 -0
  30. package/dist/i18n/da.d.ts +2 -0
  31. package/dist/i18n/de.d.ts +2 -0
  32. package/dist/i18n/en.d.ts +1 -242
  33. package/dist/i18n/es.d.ts +2 -0
  34. package/dist/i18n/fr.d.ts +2 -0
  35. package/dist/i18n/ja.d.ts +2 -0
  36. package/dist/i18n/km.d.ts +2 -0
  37. package/dist/i18n/ko.d.ts +2 -0
  38. package/dist/i18n/lo.d.ts +2 -0
  39. package/dist/i18n/mk.d.ts +2 -0
  40. package/dist/i18n/mn.d.ts +2 -0
  41. package/dist/i18n/my.d.ts +2 -0
  42. package/dist/i18n/pl.d.ts +2 -0
  43. package/dist/i18n/ru.d.ts +2 -0
  44. package/dist/i18n/sr.d.ts +2 -0
  45. package/dist/i18n/tg.d.ts +2 -0
  46. package/dist/i18n/th.d.ts +2 -0
  47. package/dist/i18n/tr.d.ts +2 -0
  48. package/dist/i18n/zh.d.ts +2 -0
  49. package/dist/i18n/zht.d.ts +2 -0
  50. package/dist/v2/components/accordion-v2.d.ts +26 -0
  51. package/dist/{data-display/avatar/avatar.d.ts → v2/components/avatar-v2.d.ts} +1 -1
  52. package/dist/v2/components/badge-v2.d.ts +6 -0
  53. package/dist/v2/components/button-v2.d.ts +10 -0
  54. package/dist/v2/components/checkbox-v2.d.ts +10 -0
  55. package/dist/{overlays/dialog/dialog.d.ts → v2/components/dialog-v2.d.ts} +2 -1
  56. package/dist/v2/components/diff-changes-v2.d.ts +11 -0
  57. package/dist/v2/components/divider-v2.d.ts +5 -0
  58. package/dist/{forms/field/field.d.ts → v2/components/field-v2.d.ts} +10 -4
  59. package/dist/v2/components/icon-button-v2.d.ts +11 -0
  60. package/dist/{icons/icon → v2/components}/icon.d.ts +1 -44
  61. package/dist/v2/components/inline-input-v2.d.ts +21 -0
  62. package/dist/v2/components/keybind-v2.d.ts +7 -0
  63. package/dist/{data-display/line-comment/line-comment.d.ts → v2/components/line-comment-v2.d.ts} +9 -9
  64. package/dist/v2/components/loader-v2.d.ts +3 -0
  65. package/dist/v2/components/menu-v2.d.ts +52 -0
  66. package/dist/v2/components/progress-circle-v2.d.ts +8 -0
  67. package/dist/{data-display/project-avatar/project-avatar.d.ts → v2/components/project-avatar-v2.d.ts} +1 -1
  68. package/dist/v2/components/radio-v2.d.ts +16 -0
  69. package/dist/{navigation/segmented-control/segmented-control.d.ts → v2/components/segmented-control-v2.d.ts} +5 -5
  70. package/dist/{forms/select/select.d.ts → v2/components/select-v2.d.ts} +6 -4
  71. package/dist/v2/components/split-button-v2.d.ts +5 -0
  72. package/dist/v2/components/switch-v2.d.ts +7 -0
  73. package/dist/v2/components/tabs-v2.d.ts +34 -0
  74. package/dist/{forms/text-input/text-input.d.ts → v2/components/text-input-v2.d.ts} +3 -3
  75. package/dist/v2/components/text-shimmer-v2.d.ts +9 -0
  76. package/dist/v2/components/textarea-v2.d.ts +7 -0
  77. package/dist/v2/components/toast-v2.d.ts +57 -0
  78. package/dist/v2/components/tooltip-v2.d.ts +13 -0
  79. package/dist/v2/components/wordmark-v2.d.ts +2 -0
  80. package/package.json +35 -141
  81. package/src/{data-display/accordion → components}/accordion.css +33 -7
  82. package/src/{data-display/accordion → components}/accordion.tsx +14 -14
  83. package/src/components/animated-number.css +11 -29
  84. package/src/components/animated-number.tsx +2 -2
  85. package/src/components/avatar.css +49 -0
  86. package/src/components/avatar.tsx +55 -0
  87. package/src/components/button.css +194 -0
  88. package/src/{actions/button → components}/button.tsx +11 -19
  89. package/src/components/card.css +23 -2
  90. package/src/components/card.tsx +4 -4
  91. package/src/{forms/checkbox → components}/checkbox.css +7 -1
  92. package/src/{forms/checkbox → components}/checkbox.tsx +13 -13
  93. package/src/components/collapsible.tsx +2 -2
  94. package/src/components/dialog.css +181 -0
  95. package/src/components/dialog.tsx +72 -0
  96. package/src/{data-display/diff-changes → components}/diff-changes.css +19 -22
  97. package/src/components/diff-changes.tsx +115 -0
  98. package/src/components/dock-surface.css +9 -2
  99. package/src/components/dropdown-menu.css +135 -0
  100. package/src/components/dropdown-menu.tsx +308 -0
  101. package/src/components/icon-button.css +181 -0
  102. package/src/components/icon-button.tsx +29 -0
  103. package/src/components/icon.css +39 -0
  104. package/src/{icons/icon/additional-icons.ts → components/icon.tsx} +74 -8
  105. package/src/components/image-preview.tsx +2 -3
  106. package/src/components/keybind.css +18 -0
  107. package/src/components/keybind.tsx +20 -0
  108. package/src/components/list.css +5 -5
  109. package/src/components/list.tsx +5 -7
  110. package/src/components/popover.tsx +2 -3
  111. package/src/components/progress-circle.css +16 -0
  112. package/src/components/progress-circle.tsx +64 -0
  113. package/src/components/radio-group.css +187 -0
  114. package/src/components/radio-group.tsx +83 -0
  115. package/src/components/scroll-view.tsx +20 -5
  116. package/src/components/select.css +201 -0
  117. package/src/components/select.tsx +174 -0
  118. package/src/components/sticky-accordion-header.tsx +1 -1
  119. package/src/components/switch.css +136 -0
  120. package/src/components/switch.tsx +29 -0
  121. package/src/{navigation/tabs → components}/tabs.css +232 -53
  122. package/src/components/tabs.tsx +126 -0
  123. package/src/components/tag.css +37 -0
  124. package/src/components/tag.tsx +22 -0
  125. package/src/components/text-field.tsx +4 -12
  126. package/src/{typography/text-shimmer → components}/text-shimmer.css +1 -2
  127. package/src/{typography/text-shimmer → components}/text-shimmer.tsx +0 -1
  128. package/src/components/toast.css +236 -0
  129. package/src/components/toast.tsx +185 -0
  130. package/src/components/tooltip.css +74 -0
  131. package/src/components/tooltip.tsx +163 -0
  132. package/src/context/dialog.tsx +0 -1
  133. package/src/context/i18n.tsx +14 -17
  134. package/src/context/marked-parser.tsx +13 -3
  135. package/src/hooks/create-auto-scroll.tsx +0 -20
  136. package/src/i18n/am.ts +9 -7
  137. package/src/i18n/ar.ts +9 -7
  138. package/src/i18n/az.ts +9 -7
  139. package/src/i18n/bg.ts +9 -7
  140. package/src/i18n/bn.ts +9 -7
  141. package/src/i18n/br.ts +9 -7
  142. package/src/i18n/bs.ts +9 -7
  143. package/src/i18n/ca.ts +9 -7
  144. package/src/i18n/cs.ts +9 -7
  145. package/src/i18n/da.ts +9 -7
  146. package/src/i18n/de.ts +3 -1
  147. package/src/i18n/dv.ts +9 -7
  148. package/src/i18n/dz.ts +7 -5
  149. package/src/i18n/el.ts +9 -7
  150. package/src/i18n/en.ts +12 -59
  151. package/src/i18n/es.ts +8 -6
  152. package/src/i18n/et.ts +9 -7
  153. package/src/i18n/fa.ts +9 -7
  154. package/src/i18n/fi.ts +9 -7
  155. package/src/i18n/fo.ts +9 -7
  156. package/src/i18n/fr.ts +8 -6
  157. package/src/i18n/hi.ts +9 -7
  158. package/src/i18n/hr.ts +9 -7
  159. package/src/i18n/hu.ts +9 -7
  160. package/src/i18n/hy.ts +9 -7
  161. package/src/i18n/id.ts +9 -7
  162. package/src/i18n/is.ts +9 -7
  163. package/src/i18n/it.ts +9 -7
  164. package/src/i18n/ja.ts +9 -7
  165. package/src/i18n/ka.ts +9 -7
  166. package/src/i18n/km.ts +9 -7
  167. package/src/i18n/ko.ts +9 -7
  168. package/src/i18n/lo.ts +9 -7
  169. package/src/i18n/lt.ts +9 -7
  170. package/src/i18n/lv.ts +9 -7
  171. package/src/i18n/mk.ts +9 -7
  172. package/src/i18n/mn.ts +9 -7
  173. package/src/i18n/ms.ts +9 -7
  174. package/src/i18n/my.ts +9 -7
  175. package/src/i18n/ne.ts +9 -7
  176. package/src/i18n/nl.ts +9 -7
  177. package/src/i18n/no.ts +9 -7
  178. package/src/i18n/pa.ts +9 -7
  179. package/src/i18n/pl.ts +9 -7
  180. package/src/i18n/ro.ts +9 -7
  181. package/src/i18n/ru.ts +9 -7
  182. package/src/i18n/si.ts +9 -7
  183. package/src/i18n/sk.ts +9 -7
  184. package/src/i18n/sl.ts +9 -7
  185. package/src/i18n/sq.ts +9 -7
  186. package/src/i18n/sr.ts +9 -7
  187. package/src/i18n/sv.ts +9 -7
  188. package/src/i18n/tg.ts +9 -7
  189. package/src/i18n/th.ts +9 -7
  190. package/src/i18n/tk.ts +9 -7
  191. package/src/i18n/tr.ts +9 -7
  192. package/src/i18n/uk.ts +9 -7
  193. package/src/i18n/ur.ts +9 -7
  194. package/src/i18n/uz.ts +9 -7
  195. package/src/i18n/vi.ts +9 -7
  196. package/src/i18n/zh.ts +9 -7
  197. package/src/i18n/zht.ts +9 -7
  198. package/src/styles/base.css +0 -5
  199. package/src/styles/index.css +20 -4
  200. package/src/styles/tailwind/colors.css +0 -2
  201. package/src/styles/tailwind/index.css +1 -18
  202. package/src/styles/theme.css +2 -2
  203. package/src/theme/context.tsx +11 -19
  204. package/src/theme/themes/oc-2.json +19 -50
  205. package/src/theme/v2/default-primitives.ts +8 -8
  206. package/src/theme/v2/foreground.ts +0 -1
  207. package/src/theme/v2/mapping.ts +1 -7
  208. package/src/v2/components/accordion-v2.css +139 -0
  209. package/src/v2/components/accordion-v2.tsx +86 -0
  210. package/src/{data-display/avatar/avatar.tsx → v2/components/avatar-v2.tsx} +1 -1
  211. package/src/{data-display/badge/badge.css → v2/components/badge-v2.css} +0 -19
  212. package/src/{data-display/badge/badge.tsx → v2/components/badge-v2.tsx} +4 -6
  213. package/src/{actions/button/button.css → v2/components/button-v2.css} +0 -29
  214. package/src/v2/components/button-v2.tsx +35 -0
  215. package/src/v2/components/checkbox-v2.css +184 -0
  216. package/src/v2/components/checkbox-v2.tsx +65 -0
  217. package/src/{overlays/dialog/dialog.css → v2/components/dialog-v2.css} +0 -3
  218. package/src/{overlays/dialog/dialog.tsx → v2/components/dialog-v2.tsx} +13 -11
  219. package/src/v2/components/diff-changes-v2.css +26 -0
  220. package/src/{data-display/diff-changes/diff-changes.tsx → v2/components/diff-changes-v2.tsx} +2 -7
  221. package/src/{layout/divider/divider.tsx → v2/components/divider-v2.tsx} +3 -3
  222. package/src/{forms/field/field.css → v2/components/field-v2.css} +1 -1
  223. package/src/{forms/field/field.tsx → v2/components/field-v2.tsx} +11 -9
  224. package/src/{actions/icon-button/icon-button.css → v2/components/icon-button-v2.css} +9 -27
  225. package/src/v2/components/icon-button-v2.tsx +37 -0
  226. package/src/{icons/icon → v2/components}/icon.tsx +12 -80
  227. package/src/v2/components/inline-input-v2.css +225 -0
  228. package/src/v2/components/inline-input-v2.tsx +107 -0
  229. package/src/{data-display/keybind/keybind.css → v2/components/keybind-v2.css} +1 -1
  230. package/src/{data-display/keybind/keybind.tsx → v2/components/keybind-v2.tsx} +3 -3
  231. package/src/{data-display/line-comment/line-comment.css → v2/components/line-comment-v2.css} +4 -4
  232. package/src/{data-display/line-comment/line-comment.tsx → v2/components/line-comment-v2.tsx} +15 -17
  233. package/src/{feedback/loader/loader.tsx → v2/components/loader-v2.tsx} +2 -2
  234. package/src/{navigation/menu/menu.css → v2/components/menu-v2.css} +2 -124
  235. package/src/{navigation/menu/menu.tsx → v2/components/menu-v2.tsx} +32 -96
  236. package/src/v2/components/progress-circle-v2.css +13 -0
  237. package/src/v2/components/progress-circle-v2.tsx +52 -0
  238. package/src/{data-display/project-avatar/project-avatar.tsx → v2/components/project-avatar-v2.tsx} +1 -1
  239. package/src/{forms/radio/radio.tsx → v2/components/radio-v2.tsx} +20 -30
  240. package/src/{navigation/segmented-control/segmented-control.css → v2/components/segmented-control-v2.css} +1 -1
  241. package/src/{navigation/segmented-control/segmented-control.tsx → v2/components/segmented-control-v2.tsx} +8 -9
  242. package/src/{forms/select/select.css → v2/components/select-v2.css} +8 -2
  243. package/src/{forms/select/select.tsx → v2/components/select-v2.tsx} +32 -40
  244. package/src/{actions/split-button/split-button.css → v2/components/split-button-v2.css} +6 -2
  245. package/src/{actions/split-button/split-button.tsx → v2/components/split-button-v2.tsx} +4 -4
  246. package/src/{forms/switch/switch.css → v2/components/switch-v2.css} +0 -110
  247. package/src/v2/components/switch-v2.tsx +28 -0
  248. package/src/{navigation/tabs/tabs-current.css → v2/components/tabs-v2.css} +10 -25
  249. package/src/v2/components/tabs-v2.tsx +149 -0
  250. package/src/{forms/text-input/text-input.css → v2/components/text-input-v2.css} +3 -3
  251. package/src/{forms/text-input/text-input.tsx → v2/components/text-input-v2.tsx} +4 -4
  252. package/src/v2/components/text-shimmer-v2.css +125 -0
  253. package/src/v2/components/text-shimmer-v2.tsx +63 -0
  254. package/src/{forms/textarea/textarea.tsx → v2/components/textarea-v2.tsx} +3 -3
  255. package/src/{feedback/toast/toast.tsx → v2/components/toast-v2.tsx} +58 -60
  256. package/src/{overlays/tooltip/tooltip.css → v2/components/tooltip-v2.css} +0 -26
  257. package/src/{overlays/tooltip/tooltip.tsx → v2/components/tooltip-v2.tsx} +17 -24
  258. package/src/v2/components/wordmark-v2.tsx +71 -0
  259. package/src/{styles/tokens → v2/styles}/colors.css +8 -8
  260. package/src/{styles/tokens → v2/styles}/theme.css +16 -23
  261. package/dist/actions/button/button.d.ts +0 -10
  262. package/dist/actions/icon-button/icon-button.d.ts +0 -11
  263. package/dist/actions/split-button/split-button.d.ts +0 -5
  264. package/dist/context/marked-base.d.ts +0 -3
  265. package/dist/data-display/badge/badge.d.ts +0 -7
  266. package/dist/data-display/keybind/keybind.d.ts +0 -7
  267. package/dist/feedback/loader/loader.d.ts +0 -3
  268. package/dist/feedback/toast/toast.d.ts +0 -57
  269. package/dist/forms/radio/radio.d.ts +0 -16
  270. package/dist/forms/textarea/textarea.d.ts +0 -7
  271. package/dist/i18n/he.d.ts +0 -197
  272. package/dist/layout/divider/divider.d.ts +0 -5
  273. package/dist/navigation/menu/menu.d.ts +0 -59
  274. package/dist/overlays/tooltip/tooltip.d.ts +0 -15
  275. package/dist/typography/wordmark/wordmark.d.ts +0 -5
  276. package/src/actions/icon-button/icon-button.tsx +0 -32
  277. package/src/context/marked-base.tsx +0 -27
  278. package/src/feedback/progress-circle/progress-circle.css +0 -28
  279. package/src/feedback/progress-circle/progress-circle.tsx +0 -64
  280. package/src/forms/switch/switch.tsx +0 -34
  281. package/src/i18n/he.ts +0 -199
  282. package/src/icons/icon/icon.css +0 -3
  283. package/src/navigation/tabs/tabs.tsx +0 -194
  284. package/src/typography/wordmark/wordmark.tsx +0 -39
  285. /package/dist/{forms/inline-input → components}/inline-input.d.ts +0 -0
  286. /package/dist/{navigation → v2/components}/tab-state-indicator.d.ts +0 -0
  287. /package/src/{forms/inline-input → components}/inline-input.css +0 -0
  288. /package/src/{forms/inline-input → components}/inline-input.tsx +0 -0
  289. /package/src/{data-display/avatar/avatar.css → v2/components/avatar-v2.css} +0 -0
  290. /package/src/{layout/divider/divider.css → v2/components/divider-v2.css} +0 -0
  291. /package/src/{styles/file-tree.css → v2/components/file-tree-v2.css} +0 -0
  292. /package/src/{feedback/loader/loader.css → v2/components/loader-v2.css} +0 -0
  293. /package/src/{data-display/project-avatar/project-avatar.css → v2/components/project-avatar-v2.css} +0 -0
  294. /package/src/{forms/radio/radio.css → v2/components/radio-v2.css} +0 -0
  295. /package/src/{navigation → v2/components}/tab-state-indicator.tsx +0 -0
  296. /package/src/{forms/textarea/textarea.css → v2/components/textarea-v2.css} +0 -0
  297. /package/src/{feedback/toast/toast.css → v2/components/toast-v2.css} +0 -0
  298. /package/src/{styles/tokens/index.css → v2/styles/tailwind.css} +0 -0
@@ -1,12 +1,12 @@
1
1
  import { For, Show, createSignal, onMount, splitProps, type ComponentProps, type JSX } from "solid-js"
2
- import { FileIcon } from "@opencode-ai/ui/file-icon"
2
+ import { FileIcon } from "../../components/file-icon"
3
3
  import { useI18n } from "../../context/i18n"
4
4
  import { useFilteredList } from "../../hooks"
5
- import { Button } from "@opencode-ai/ui/button"
6
- import "./line-comment.css"
5
+ import { ButtonV2 } from "./button-v2"
6
+ import "./line-comment-v2.css"
7
7
 
8
8
  /** Horizontal “more” glyph for the display-card overflow control (Figma outline-dots). */
9
- export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
9
+ export function LineCommentV2OverflowIcon(props: ComponentProps<"svg">) {
10
10
  return (
11
11
  <svg
12
12
  {...props}
@@ -24,16 +24,16 @@ export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
24
24
  )
25
25
  }
26
26
 
27
- export interface LineCommentProps extends ComponentProps<"div"> {
27
+ export interface LineCommentV2Props extends ComponentProps<"div"> {
28
28
  /** Main comment body (text or rich content). */
29
29
  comment: JSX.Element
30
30
  /** Line / selection context (e.g. “Comment on line 40”). */
31
31
  selection: JSX.Element
32
- /** Typically an overflow menu trigger; use `LineCommentOverflowIcon` inside `line-comment-v2-overflow`. */
32
+ /** Typically an overflow menu trigger; use `LineCommentV2OverflowIcon` inside `line-comment-v2-overflow`. */
33
33
  actions?: JSX.Element
34
34
  }
35
35
 
36
- export function LineComment(props: LineCommentProps) {
36
+ export function LineCommentV2(props: LineCommentV2Props) {
37
37
  const [local, rest] = splitProps(props, ["comment", "selection", "actions", "class", "classList"])
38
38
  return (
39
39
  <div
@@ -56,11 +56,11 @@ export function LineComment(props: LineCommentProps) {
56
56
  )
57
57
  }
58
58
 
59
- export type LineCommentEditorMention = {
59
+ export type LineCommentEditorV2Mention = {
60
60
  items: (query: string) => string[] | Promise<string[]>
61
61
  }
62
62
 
63
- export interface LineCommentEditorProps extends Omit<ComponentProps<"div">, "children" | "onInput" | "onSubmit"> {
63
+ export interface LineCommentEditorV2Props extends Omit<ComponentProps<"div">, "children" | "onInput" | "onSubmit"> {
64
64
  /** Visible field label above the textarea (default: “Comment”). */
65
65
  heading?: JSX.Element | string
66
66
  value: string
@@ -73,7 +73,7 @@ export interface LineCommentEditorProps extends Omit<ComponentProps<"div">, "chi
73
73
  cancelLabel?: string
74
74
  submitLabel?: string
75
75
  autofocus?: boolean
76
- mention?: LineCommentEditorMention
76
+ mention?: LineCommentEditorV2Mention
77
77
  }
78
78
 
79
79
  function pathFilename(path: string) {
@@ -86,7 +86,7 @@ function pathDirectory(path: string) {
86
86
  return index === -1 ? "" : path.slice(0, index + 1)
87
87
  }
88
88
 
89
- export function LineCommentEditor(props: LineCommentEditorProps) {
89
+ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
90
90
  const i18n = useI18n()
91
91
  let textareaRef: HTMLTextAreaElement | undefined
92
92
  const [mentionOpen, setMentionOpen] = createSignal(false)
@@ -212,11 +212,9 @@ export function LineCommentEditor(props: LineCommentEditorProps) {
212
212
  textareaRef = el
213
213
  }}
214
214
  data-slot="line-comment-v2-textarea"
215
- dir="auto"
216
215
  rows={local.rows ?? 3}
217
216
  placeholder={local.placeholder ?? i18n.t("ui.lineComment.contextPlaceholder")}
218
217
  value={local.value}
219
- style={{ "unicode-bidi": "plaintext", "text-align": "start" }}
220
218
  onInput={(e) => {
221
219
  local.onInput(e.currentTarget.value)
222
220
  syncMention()
@@ -294,12 +292,12 @@ export function LineCommentEditor(props: LineCommentEditorProps) {
294
292
  <div data-slot="line-comment-v2-footer">
295
293
  <div data-slot="line-comment-v2-footer-meta">{local.selection}</div>
296
294
  <div data-slot="line-comment-v2-footer-actions">
297
- <Button type="button" size="normal" variant="ghost" onClick={() => local.onCancel()}>
295
+ <ButtonV2 type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
298
296
  {local.cancelLabel ?? i18n.t("ui.lineComment.cancel")}
299
- </Button>
300
- <Button type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
297
+ </ButtonV2>
298
+ <ButtonV2 type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
301
299
  {local.submitLabel ?? i18n.t("ui.lineComment.submit")}
302
- </Button>
300
+ </ButtonV2>
303
301
  </div>
304
302
  </div>
305
303
  </div>
@@ -1,7 +1,7 @@
1
1
  import { splitProps, type ComponentProps } from "solid-js"
2
- import "./loader.css"
2
+ import "./loader-v2.css"
3
3
 
4
- export function Loader(props: ComponentProps<"svg">) {
4
+ export function LoaderV2(props: ComponentProps<"svg">) {
5
5
  const [local, rest] = splitProps(props, ["class", "classList", "width", "height"])
6
6
  return (
7
7
  <svg
@@ -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);
@@ -51,13 +47,11 @@
51
47
 
52
48
  box-sizing: border-box;
53
49
  display: flex;
54
- flex-shrink: 0;
55
50
  flex-direction: row;
56
51
  align-items: center;
57
52
  gap: 8px;
58
53
  height: 28px;
59
54
  padding: 0 12px;
60
- padding-inline-end: 6px;
61
55
  background: transparent;
62
56
  border-radius: 4px;
63
57
  outline: none;
@@ -78,7 +72,7 @@
78
72
 
79
73
  font-size: 13px;
80
74
  font-weight: 440;
81
- line-height: var(--line-height-compact);
75
+ line-height: 100%;
82
76
  letter-spacing: -0.04px;
83
77
  color: var(--menu-v2-fg);
84
78
  }
@@ -177,129 +171,13 @@
177
171
 
178
172
  font-size: 11px;
179
173
  font-weight: 530;
174
+ line-height: 100%;
180
175
  letter-spacing: 0.05px;
181
176
  color: var(--v2-text-text-faint);
182
177
  user-select: none;
183
178
  font-variant-numeric: tabular-nums;
184
179
  }
185
180
 
186
- [data-component="menu-v2-content"][data-appearance="standard"] {
187
- min-width: 8rem;
188
- padding: 4px;
189
- overflow: hidden;
190
- border: 1px solid color-mix(in oklch, var(--border-base) 50%, transparent);
191
- border-radius: var(--radius-md);
192
- background: var(--surface-raised-stronger-non-alpha);
193
- background-clip: padding-box;
194
- box-shadow: var(--shadow-md);
195
- z-index: 60;
196
- animation: dropdown-menu-open 150ms ease-out;
197
-
198
- &[data-closed] {
199
- animation: dropdown-menu-close 150ms ease-out;
200
- }
201
-
202
- [data-component="menu-v2-item"] {
203
- position: relative;
204
- height: auto;
205
- min-height: 0;
206
- padding: 4px 8px;
207
- border-radius: var(--radius-sm);
208
- color: var(--text-strong);
209
- font-family: var(--font-family-sans);
210
- font-size: var(--font-size-small);
211
- font-weight: var(--font-weight-medium);
212
- line-height: var(--line-height-large);
213
- letter-spacing: var(--letter-spacing-normal);
214
- font-variant-numeric: normal;
215
- -webkit-font-smoothing: auto;
216
- text-rendering: auto;
217
-
218
- [data-slot="menu-v2-item-content"] {
219
- font-family: inherit;
220
- font-size: inherit;
221
- font-weight: inherit;
222
- line-height: inherit;
223
- letter-spacing: inherit;
224
- color: inherit;
225
- }
226
-
227
- &[data-highlighted] {
228
- background: var(--surface-raised-base-hover);
229
- }
230
-
231
- &[data-disabled] {
232
- color: var(--text-weak);
233
- opacity: 1;
234
- }
235
-
236
- &[data-checked] {
237
- padding-inline-end: 28px;
238
- }
239
-
240
- &[data-checked] [data-slot="menu-v2-item-content"] {
241
- font-weight: inherit;
242
- color: inherit;
243
- }
244
-
245
- [data-slot="menu-v2-item-indicator"] {
246
- position: absolute;
247
- inset-inline-end: 8px;
248
- top: 50%;
249
- width: 16px;
250
- height: 16px;
251
- transform: translateY(-50%);
252
- color: var(--icon-base);
253
- }
254
-
255
- [data-slot="menu-v2-item-chevron"] {
256
- margin-inline-start: auto;
257
- color: var(--icon-base);
258
- }
259
- }
260
-
261
- [data-slot="menu-v2-separator"] {
262
- width: calc(100% + 8px);
263
- height: 1px;
264
- margin: 4px -4px;
265
- background: var(--border-weak-base);
266
- }
267
-
268
- [data-slot="menu-v2-group-label"] {
269
- height: auto;
270
- padding: 4px 8px;
271
- color: var(--text-weak);
272
- font-family: var(--font-family-sans);
273
- font-size: var(--font-size-x-small);
274
- font-weight: var(--font-weight-medium);
275
- line-height: var(--line-height-large);
276
- letter-spacing: var(--letter-spacing-normal);
277
- font-variant-numeric: normal;
278
- }
279
- }
280
-
281
- @keyframes dropdown-menu-open {
282
- from {
283
- opacity: 0;
284
- transform: scale(0.96);
285
- }
286
- to {
287
- opacity: 1;
288
- transform: scale(1);
289
- }
290
- }
291
-
292
- @keyframes dropdown-menu-close {
293
- from {
294
- opacity: 1;
295
- transform: scale(1);
296
- }
297
- to {
298
- opacity: 0;
299
- transform: scale(0.96);
300
- }
301
- }
302
-
303
181
  @keyframes menu-v2-in {
304
182
  from {
305
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