@opencode-ai/ui 0.0.0-dev-202608201855 → 0.0.0-dev-17751
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/button/button.d.ts +10 -0
- package/dist/actions/icon-button/icon-button.d.ts +11 -0
- package/dist/actions/split-button/split-button.d.ts +5 -0
- package/dist/components/card.d.ts +1 -1
- package/dist/components/list.d.ts +1 -1
- package/dist/components/scroll-view.d.ts +3 -3
- package/dist/context/i18n.d.ts +10 -7
- package/dist/{components → data-display/accordion}/accordion.d.ts +6 -6
- package/dist/{v2/components/avatar-v2.d.ts → data-display/avatar/avatar.d.ts} +1 -1
- package/dist/data-display/badge/badge.d.ts +7 -0
- package/dist/{components → data-display/diff-changes}/diff-changes.d.ts +2 -1
- package/dist/data-display/keybind/keybind.d.ts +7 -0
- package/dist/{v2/components/line-comment-v2.d.ts → data-display/line-comment/line-comment.d.ts} +9 -9
- package/dist/{v2/components/project-avatar-v2.d.ts → data-display/project-avatar/project-avatar.d.ts} +1 -1
- package/dist/feedback/loader/loader.d.ts +3 -0
- package/dist/{components → feedback/progress-circle}/progress-circle.d.ts +2 -0
- package/dist/feedback/toast/toast.d.ts +57 -0
- package/dist/{components → forms/checkbox}/checkbox.d.ts +2 -2
- package/dist/{v2/components/field-v2.d.ts → forms/field/field.d.ts} +4 -10
- package/dist/forms/radio/radio.d.ts +16 -0
- package/dist/{v2/components/select-v2.d.ts → forms/select/select.d.ts} +4 -6
- package/dist/{components → forms/switch}/switch.d.ts +4 -2
- package/dist/{v2/components/text-input-v2.d.ts → forms/text-input/text-input.d.ts} +3 -3
- package/dist/forms/textarea/textarea.d.ts +7 -0
- package/dist/i18n/ar.d.ts +0 -2
- package/dist/i18n/bg.d.ts +0 -2
- package/dist/i18n/br.d.ts +0 -2
- package/dist/i18n/bs.d.ts +0 -2
- package/dist/i18n/da.d.ts +0 -2
- package/dist/i18n/de.d.ts +0 -2
- package/dist/i18n/en.d.ts +209 -1
- package/dist/i18n/es.d.ts +0 -2
- package/dist/i18n/fr.d.ts +0 -2
- package/dist/i18n/he.d.ts +197 -0
- package/dist/i18n/ja.d.ts +0 -2
- package/dist/i18n/km.d.ts +0 -2
- package/dist/i18n/ko.d.ts +0 -2
- package/dist/i18n/lo.d.ts +0 -2
- package/dist/i18n/mk.d.ts +0 -2
- package/dist/i18n/mn.d.ts +0 -2
- package/dist/i18n/my.d.ts +0 -2
- package/dist/i18n/pl.d.ts +0 -2
- package/dist/i18n/ru.d.ts +0 -2
- package/dist/i18n/sr.d.ts +0 -2
- package/dist/i18n/tg.d.ts +0 -2
- package/dist/i18n/th.d.ts +0 -2
- package/dist/i18n/tr.d.ts +0 -2
- package/dist/i18n/zh.d.ts +0 -2
- package/dist/i18n/zht.d.ts +0 -2
- package/dist/{components/icon.d.ts → icons/icon/additional-icons.d.ts} +8 -8
- package/dist/{v2/components → icons/icon}/icon.d.ts +16 -1
- package/dist/layout/divider/divider.d.ts +5 -0
- package/dist/navigation/menu/menu.d.ts +59 -0
- package/dist/{v2/components/segmented-control-v2.d.ts → navigation/segmented-control/segmented-control.d.ts} +5 -5
- package/dist/{components → navigation/tabs}/tabs.d.ts +15 -8
- package/dist/{v2/components/dialog-v2.d.ts → overlays/dialog/dialog.d.ts} +1 -2
- package/dist/overlays/tooltip/tooltip.d.ts +14 -0
- package/dist/{components → typography/text-shimmer}/text-shimmer.d.ts +1 -0
- package/dist/typography/wordmark/wordmark.d.ts +2 -0
- package/package.json +131 -13
- package/src/{v2/components/button-v2.tsx → actions/button/button.tsx} +8 -8
- package/src/actions/icon-button/icon-button.tsx +32 -0
- package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +1 -6
- package/src/{v2/components/split-button-v2.tsx → actions/split-button/split-button.tsx} +4 -4
- package/src/components/animated-number.css +29 -11
- package/src/components/animated-number.tsx +2 -2
- package/src/components/card.css +2 -23
- package/src/components/card.tsx +4 -4
- package/src/components/collapsible.tsx +1 -1
- package/src/components/image-preview.tsx +3 -2
- package/src/components/list.css +5 -5
- package/src/components/list.tsx +7 -5
- package/src/components/popover.tsx +3 -2
- package/src/components/provider-icon.tsx +1 -1
- package/src/components/scroll-view.tsx +5 -20
- package/src/components/sticky-accordion-header.tsx +1 -1
- package/src/components/text-field.tsx +12 -4
- package/src/context/i18n.tsx +17 -14
- package/src/{components → data-display/accordion}/accordion.css +1 -26
- package/src/{components → data-display/accordion}/accordion.tsx +14 -14
- package/src/{v2/components/avatar-v2.tsx → data-display/avatar/avatar.tsx} +1 -1
- package/src/{v2/components/badge-v2.css → data-display/badge/badge.css} +19 -0
- package/src/{v2/components/badge-v2.tsx → data-display/badge/badge.tsx} +6 -4
- package/src/{components → data-display/diff-changes}/diff-changes.css +22 -19
- package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx} +7 -2
- package/src/{v2/components/keybind-v2.css → data-display/keybind/keybind.css} +1 -1
- package/src/{v2/components/keybind-v2.tsx → data-display/keybind/keybind.tsx} +3 -3
- package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
- package/src/{v2/components/project-avatar-v2.tsx → data-display/project-avatar/project-avatar.tsx} +1 -1
- package/src/{v2/components/loader-v2.tsx → feedback/loader/loader.tsx} +2 -2
- package/src/feedback/progress-circle/progress-circle.css +28 -0
- package/src/feedback/progress-circle/progress-circle.tsx +64 -0
- package/src/{v2/components/toast-v2.tsx → feedback/toast/toast.tsx} +60 -58
- package/src/{components → forms/checkbox}/checkbox.css +1 -7
- package/src/{components → forms/checkbox}/checkbox.tsx +13 -13
- package/src/{v2/components/field-v2.tsx → forms/field/field.tsx} +9 -11
- package/src/{v2/components/radio-v2.tsx → forms/radio/radio.tsx} +30 -20
- package/src/{v2/components/select-v2.css → forms/select/select.css} +2 -8
- package/src/{v2/components/select-v2.tsx → forms/select/select.tsx} +38 -32
- package/src/{v2/components/switch-v2.css → forms/switch/switch.css} +110 -0
- package/src/forms/switch/switch.tsx +34 -0
- package/src/{v2/components/text-input-v2.tsx → forms/text-input/text-input.tsx} +4 -4
- package/src/{v2/components/textarea-v2.tsx → forms/textarea/textarea.tsx} +3 -3
- package/src/hooks/create-auto-scroll.tsx +20 -0
- package/src/i18n/am.ts +0 -2
- package/src/i18n/ar.ts +0 -2
- package/src/i18n/az.ts +0 -2
- package/src/i18n/bg.ts +0 -2
- package/src/i18n/bn.ts +0 -2
- package/src/i18n/br.ts +0 -2
- package/src/i18n/bs.ts +0 -2
- package/src/i18n/ca.ts +0 -2
- package/src/i18n/cs.ts +0 -2
- package/src/i18n/da.ts +0 -2
- package/src/i18n/de.ts +0 -2
- package/src/i18n/dv.ts +0 -2
- package/src/i18n/dz.ts +0 -2
- package/src/i18n/el.ts +0 -2
- package/src/i18n/en.ts +18 -4
- package/src/i18n/es.ts +0 -2
- package/src/i18n/et.ts +0 -2
- package/src/i18n/fa.ts +0 -2
- package/src/i18n/fi.ts +0 -2
- package/src/i18n/fo.ts +0 -2
- package/src/i18n/fr.ts +0 -2
- package/src/i18n/he.ts +199 -0
- package/src/i18n/hi.ts +0 -2
- package/src/i18n/hr.ts +0 -2
- package/src/i18n/hu.ts +0 -2
- package/src/i18n/hy.ts +0 -2
- package/src/i18n/id.ts +0 -2
- package/src/i18n/is.ts +0 -2
- package/src/i18n/it.ts +0 -2
- package/src/i18n/ja.ts +0 -2
- package/src/i18n/ka.ts +0 -2
- package/src/i18n/km.ts +0 -2
- package/src/i18n/ko.ts +0 -2
- package/src/i18n/lo.ts +0 -2
- package/src/i18n/lt.ts +0 -2
- package/src/i18n/lv.ts +0 -2
- package/src/i18n/mk.ts +0 -2
- package/src/i18n/mn.ts +0 -2
- package/src/i18n/ms.ts +0 -2
- package/src/i18n/my.ts +0 -2
- package/src/i18n/ne.ts +0 -2
- package/src/i18n/nl.ts +0 -2
- package/src/i18n/no.ts +0 -2
- package/src/i18n/pa.ts +0 -2
- package/src/i18n/pl.ts +0 -2
- package/src/i18n/ro.ts +0 -2
- package/src/i18n/ru.ts +0 -2
- package/src/i18n/si.ts +0 -2
- package/src/i18n/sk.ts +0 -2
- package/src/i18n/sl.ts +0 -2
- package/src/i18n/sq.ts +0 -2
- package/src/i18n/sr.ts +0 -2
- package/src/i18n/sv.ts +0 -2
- package/src/i18n/tg.ts +0 -2
- package/src/i18n/th.ts +0 -2
- package/src/i18n/tk.ts +0 -2
- package/src/i18n/tr.ts +0 -2
- package/src/i18n/uk.ts +0 -2
- package/src/i18n/ur.ts +0 -2
- package/src/i18n/uz.ts +0 -2
- package/src/i18n/vi.ts +0 -2
- package/src/i18n/zh.ts +0 -2
- package/src/i18n/zht.ts +0 -2
- package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +8 -74
- package/src/icons/icon/icon.css +3 -0
- package/src/{v2/components → icons/icon}/icon.tsx +42 -9
- package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
- package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +121 -0
- package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
- package/src/{v2/components/segmented-control-v2.tsx → navigation/segmented-control/segmented-control.tsx} +9 -8
- package/src/{v2/components/tabs-v2.css → navigation/tabs/tabs-current.css} +24 -9
- package/src/{components → navigation/tabs}/tabs.css +39 -229
- package/src/navigation/tabs/tabs.tsx +194 -0
- package/src/{v2/components/dialog-v2.css → overlays/dialog/dialog.css} +3 -0
- package/src/{v2/components/dialog-v2.tsx → overlays/dialog/dialog.tsx} +11 -13
- package/src/{v2/components/tooltip-v2.css → overlays/tooltip/tooltip.css} +26 -0
- package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +18 -14
- package/src/styles/index.css +4 -20
- package/src/styles/tailwind/index.css +15 -1
- package/src/{v2/styles → styles/tokens}/theme.css +0 -12
- package/src/theme/context.tsx +19 -11
- package/src/theme/themes/oc-2.json +1 -1
- package/src/{components → typography/text-shimmer}/text-shimmer.css +2 -1
- package/src/{components → typography/text-shimmer}/text-shimmer.tsx +1 -0
- package/src/{v2/components/wordmark-v2.tsx → typography/wordmark/wordmark.tsx} +1 -1
- package/dist/components/avatar.d.ts +0 -9
- package/dist/components/button.d.ts +0 -9
- package/dist/components/dialog.d.ts +0 -12
- package/dist/components/dropdown-menu.d.ts +0 -80
- package/dist/components/icon-button.d.ts +0 -10
- package/dist/components/keybind.d.ts +0 -6
- package/dist/components/radio-group.d.ts +0 -16
- package/dist/components/select.d.ts +0 -21
- package/dist/components/tag.d.ts +0 -5
- package/dist/components/toast.d.ts +0 -56
- package/dist/components/tooltip.d.ts +0 -17
- package/dist/v2/components/accordion-v2.d.ts +0 -26
- package/dist/v2/components/badge-v2.d.ts +0 -6
- package/dist/v2/components/button-v2.d.ts +0 -10
- package/dist/v2/components/checkbox-v2.d.ts +0 -10
- package/dist/v2/components/diff-changes-v2.d.ts +0 -11
- package/dist/v2/components/divider-v2.d.ts +0 -5
- package/dist/v2/components/icon-button-v2.d.ts +0 -11
- package/dist/v2/components/inline-input-v2.d.ts +0 -21
- package/dist/v2/components/keybind-v2.d.ts +0 -7
- package/dist/v2/components/loader-v2.d.ts +0 -3
- package/dist/v2/components/menu-v2.d.ts +0 -52
- package/dist/v2/components/progress-circle-v2.d.ts +0 -8
- package/dist/v2/components/radio-v2.d.ts +0 -16
- package/dist/v2/components/split-button-v2.d.ts +0 -5
- package/dist/v2/components/switch-v2.d.ts +0 -7
- package/dist/v2/components/tabs-v2.d.ts +0 -34
- package/dist/v2/components/text-shimmer-v2.d.ts +0 -9
- package/dist/v2/components/textarea-v2.d.ts +0 -7
- package/dist/v2/components/toast-v2.d.ts +0 -57
- package/dist/v2/components/tooltip-v2.d.ts +0 -13
- package/dist/v2/components/wordmark-v2.d.ts +0 -2
- package/src/components/avatar.css +0 -49
- package/src/components/avatar.tsx +0 -55
- package/src/components/button.css +0 -194
- package/src/components/button.tsx +0 -33
- package/src/components/dialog.css +0 -181
- package/src/components/dialog.tsx +0 -72
- package/src/components/diff-changes.tsx +0 -115
- package/src/components/dropdown-menu.css +0 -135
- package/src/components/dropdown-menu.tsx +0 -308
- package/src/components/icon-button.css +0 -181
- package/src/components/icon-button.tsx +0 -29
- package/src/components/icon.css +0 -39
- package/src/components/keybind.css +0 -18
- package/src/components/keybind.tsx +0 -20
- package/src/components/progress-circle.css +0 -16
- package/src/components/progress-circle.tsx +0 -64
- package/src/components/radio-group.css +0 -187
- package/src/components/radio-group.tsx +0 -83
- package/src/components/select.css +0 -201
- package/src/components/select.tsx +0 -174
- package/src/components/switch.css +0 -136
- package/src/components/switch.tsx +0 -29
- package/src/components/tabs.tsx +0 -126
- package/src/components/tag.css +0 -37
- package/src/components/tag.tsx +0 -22
- package/src/components/toast.css +0 -236
- package/src/components/toast.tsx +0 -185
- package/src/components/tooltip.css +0 -74
- package/src/components/tooltip.tsx +0 -163
- package/src/v2/components/accordion-v2.css +0 -139
- package/src/v2/components/accordion-v2.tsx +0 -86
- package/src/v2/components/checkbox-v2.css +0 -184
- package/src/v2/components/checkbox-v2.tsx +0 -65
- package/src/v2/components/diff-changes-v2.css +0 -26
- package/src/v2/components/icon-button-v2.tsx +0 -37
- package/src/v2/components/inline-input-v2.css +0 -225
- package/src/v2/components/inline-input-v2.tsx +0 -107
- package/src/v2/components/progress-circle-v2.css +0 -13
- package/src/v2/components/progress-circle-v2.tsx +0 -52
- package/src/v2/components/switch-v2.tsx +0 -28
- package/src/v2/components/tabs-v2.tsx +0 -149
- package/src/v2/components/text-shimmer-v2.css +0 -125
- package/src/v2/components/text-shimmer-v2.tsx +0 -63
- /package/dist/{components → forms/inline-input}/inline-input.d.ts +0 -0
- /package/dist/{v2/components → navigation}/tab-state-indicator.d.ts +0 -0
- /package/src/{v2/components/button-v2.css → actions/button/button.css} +0 -0
- /package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +0 -0
- /package/src/{v2/components/avatar-v2.css → data-display/avatar/avatar.css} +0 -0
- /package/src/{v2/components/line-comment-v2.css → data-display/line-comment/line-comment.css} +0 -0
- /package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +0 -0
- /package/src/{v2/components/loader-v2.css → feedback/loader/loader.css} +0 -0
- /package/src/{v2/components/toast-v2.css → feedback/toast/toast.css} +0 -0
- /package/src/{v2/components/field-v2.css → forms/field/field.css} +0 -0
- /package/src/{components → forms/inline-input}/inline-input.css +0 -0
- /package/src/{components → forms/inline-input}/inline-input.tsx +0 -0
- /package/src/{v2/components/radio-v2.css → forms/radio/radio.css} +0 -0
- /package/src/{v2/components/text-input-v2.css → forms/text-input/text-input.css} +0 -0
- /package/src/{v2/components/textarea-v2.css → forms/textarea/textarea.css} +0 -0
- /package/src/{v2/components/divider-v2.css → layout/divider/divider.css} +0 -0
- /package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +0 -0
- /package/src/{v2/components → navigation}/tab-state-indicator.tsx +0 -0
- /package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +0 -0
- /package/src/{v2/styles → styles/tokens}/colors.css +0 -0
- /package/src/{v2/styles/tailwind.css → styles/tokens/index.css} +0 -0
package/src/components/list.css
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
align-self: stretch;
|
|
32
32
|
margin-bottom: 4px;
|
|
33
33
|
|
|
34
|
-
> [data-component="icon-button"] {
|
|
34
|
+
> [data-component="icon-button-v2"] {
|
|
35
35
|
width: 24px;
|
|
36
36
|
height: 24px;
|
|
37
37
|
flex-shrink: 0;
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
> [data-component="icon-button"] {
|
|
86
|
+
> [data-component="icon-button-v2"] {
|
|
87
87
|
width: 20px;
|
|
88
88
|
height: 20px;
|
|
89
89
|
background-color: transparent;
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
> [data-component="icon-button"] {
|
|
109
|
+
> [data-component="icon-button-v2"] {
|
|
110
110
|
background-color: transparent;
|
|
111
111
|
|
|
112
112
|
&:hover:not(:disabled),
|
|
@@ -252,7 +252,7 @@
|
|
|
252
252
|
justify-content: center;
|
|
253
253
|
flex-shrink: 0;
|
|
254
254
|
aspect-ratio: 1/1;
|
|
255
|
-
[data-
|
|
255
|
+
[data-slot="icon-svg"] {
|
|
256
256
|
color: var(--icon-strong-base);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
@@ -262,7 +262,7 @@
|
|
|
262
262
|
justify-content: center;
|
|
263
263
|
flex-shrink: 0;
|
|
264
264
|
aspect-ratio: 1/1;
|
|
265
|
-
[data-
|
|
265
|
+
[data-slot="icon-svg"] {
|
|
266
266
|
color: var(--icon-strong-base);
|
|
267
267
|
}
|
|
268
268
|
}
|
package/src/components/list.tsx
CHANGED
|
@@ -3,8 +3,8 @@ import { createEffect, For, type JSX, on, Show } from "solid-js"
|
|
|
3
3
|
import { createStore } from "solid-js/store"
|
|
4
4
|
import { makeEventListener } from "@solid-primitives/event-listener"
|
|
5
5
|
import { useI18n } from "../context/i18n"
|
|
6
|
-
import { Icon, type IconProps } from "
|
|
7
|
-
import { IconButton } from "
|
|
6
|
+
import { Icon, type IconProps } from "@opencode-ai/ui/icon"
|
|
7
|
+
import { IconButton } from "@opencode-ai/ui/icon-button"
|
|
8
8
|
import { TextField } from "./text-field"
|
|
9
9
|
|
|
10
10
|
function findByKey(container: HTMLElement, key: string) {
|
|
@@ -302,7 +302,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
|
|
|
302
302
|
</div>
|
|
303
303
|
<Show when={internalFilter()}>
|
|
304
304
|
<IconButton
|
|
305
|
-
icon="circle-x"
|
|
305
|
+
icon={<Icon name="circle-x" />}
|
|
306
306
|
variant="ghost"
|
|
307
307
|
onClick={() => {
|
|
308
308
|
setInternalFilter("")
|
|
@@ -367,9 +367,11 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
|
|
|
367
367
|
</span>
|
|
368
368
|
)}
|
|
369
369
|
</Show>
|
|
370
|
-
|
|
370
|
+
<Show
|
|
371
|
+
when={props.divider && (i() !== group.items.length - 1 || (showAdd() && isLastGroup()))}
|
|
372
|
+
>
|
|
371
373
|
<span data-slot="list-item-divider" />
|
|
372
|
-
|
|
374
|
+
</Show>
|
|
373
375
|
</button>
|
|
374
376
|
)
|
|
375
377
|
if (props.itemWrapper) return props.itemWrapper(item, node)
|
|
@@ -3,7 +3,8 @@ import { ComponentProps, JSXElement, ParentProps, Show, createEffect, splitProps
|
|
|
3
3
|
import { createStore } from "solid-js/store"
|
|
4
4
|
import { makeEventListener } from "@solid-primitives/event-listener"
|
|
5
5
|
import { useI18n } from "../context/i18n"
|
|
6
|
-
import {
|
|
6
|
+
import { Icon } from "@opencode-ai/ui/icon"
|
|
7
|
+
import { IconButton } from "@opencode-ai/ui/icon-button"
|
|
7
8
|
|
|
8
9
|
export interface PopoverProps<T extends ValidComponent = "div">
|
|
9
10
|
extends ParentProps,
|
|
@@ -122,7 +123,7 @@ export function Popover<T extends ValidComponent = "div">(props: PopoverProps<T>
|
|
|
122
123
|
<Kobalte.CloseButton
|
|
123
124
|
data-slot="popover-close-button"
|
|
124
125
|
as={IconButton}
|
|
125
|
-
icon="close"
|
|
126
|
+
icon={<Icon name="close" />}
|
|
126
127
|
variant="ghost"
|
|
127
128
|
aria-label={i18n.t("ui.common.close")}
|
|
128
129
|
/>
|
|
@@ -9,7 +9,7 @@ export type ProviderIconProps = JSX.SVGElementTags["svg"] & {
|
|
|
9
9
|
|
|
10
10
|
export const ProviderIcon: Component<ProviderIconProps> = (props) => {
|
|
11
11
|
const [local, rest] = splitProps(props, ["id", "class", "classList"])
|
|
12
|
-
const resolved = createMemo(() => (iconNames.includes(local.id as IconName) ? local.id : "synthetic"))
|
|
12
|
+
const resolved = createMemo(() => (iconNames.includes(local.id as IconName) ? local.id : "session.synthetic"))
|
|
13
13
|
return (
|
|
14
14
|
<svg
|
|
15
15
|
data-component="provider-icon"
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createEffect,
|
|
3
|
-
createMemo,
|
|
4
|
-
mergeProps,
|
|
5
|
-
onCleanup,
|
|
6
|
-
onMount,
|
|
7
|
-
Show,
|
|
8
|
-
splitProps,
|
|
9
|
-
type Accessor,
|
|
10
|
-
type ComponentProps,
|
|
11
|
-
} from "solid-js"
|
|
1
|
+
import { createEffect, mergeProps, onCleanup, onMount, Show, splitProps, type ComponentProps } from "solid-js"
|
|
12
2
|
import { Portal } from "solid-js/web"
|
|
13
3
|
import { createResizeObserver } from "@solid-primitives/resize-observer"
|
|
14
4
|
import { createStore } from "solid-js/store"
|
|
@@ -27,9 +17,9 @@ export interface ScrollViewProps extends ComponentProps<"div"> {
|
|
|
27
17
|
* */
|
|
28
18
|
thumbVisibility?: ScrollViewThumbVisibility
|
|
29
19
|
/** Mount the thumb into an external track. Scroll metrics still come from this ScrollView. */
|
|
30
|
-
thumbContainer?: HTMLElement
|
|
20
|
+
thumbContainer?: HTMLElement
|
|
31
21
|
/** Element whose hover reveals the thumb. Defaults to the ScrollView root when unset. */
|
|
32
|
-
thumbHoverTarget?: HTMLElement
|
|
22
|
+
thumbHoverTarget?: HTMLElement
|
|
33
23
|
}
|
|
34
24
|
|
|
35
25
|
export const scrollKey = (event: Pick<KeyboardEvent, "key" | "altKey" | "ctrlKey" | "metaKey" | "shiftKey">) => {
|
|
@@ -128,13 +118,8 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
128
118
|
let viewportRef!: HTMLDivElement
|
|
129
119
|
let thumbRef!: HTMLDivElement
|
|
130
120
|
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
return value
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const thumbMount = createMemo(() => resolveEl(local.thumbContainer))
|
|
137
|
-
const thumbHover = createMemo(() => resolveEl(local.thumbHoverTarget))
|
|
121
|
+
const thumbMount = () => local.thumbContainer
|
|
122
|
+
const thumbHover = () => local.thumbHoverTarget
|
|
138
123
|
const hoverRoot = () => !local.thumbHoverTarget && !local.thumbContainer
|
|
139
124
|
|
|
140
125
|
const [state, setState] = createStore({
|
|
@@ -2,8 +2,9 @@ import { TextField as Kobalte } from "@kobalte/core/text-field"
|
|
|
2
2
|
import { createSignal, Show, splitProps } from "solid-js"
|
|
3
3
|
import type { ComponentProps } from "solid-js"
|
|
4
4
|
import { useI18n } from "../context/i18n"
|
|
5
|
-
import { IconButton } from "
|
|
6
|
-
import {
|
|
5
|
+
import { IconButton } from "@opencode-ai/ui/icon-button"
|
|
6
|
+
import { Icon } from "@opencode-ai/ui/icon"
|
|
7
|
+
import { Tooltip } from "@opencode-ai/ui/tooltip"
|
|
7
8
|
|
|
8
9
|
export interface TextFieldProps
|
|
9
10
|
extends ComponentProps<typeof Kobalte.Input>,
|
|
@@ -106,10 +107,17 @@ export function TextField(props: TextFieldProps) {
|
|
|
106
107
|
<Kobalte.TextArea {...others} autoResize data-slot="input-input" class={local.class} />
|
|
107
108
|
</Show>
|
|
108
109
|
<Show when={local.copyable}>
|
|
109
|
-
<Tooltip
|
|
110
|
+
<Tooltip
|
|
111
|
+
appearance="standard"
|
|
112
|
+
value={label()}
|
|
113
|
+
placement="top"
|
|
114
|
+
gutter={4}
|
|
115
|
+
forceOpen={copied() ? true : undefined}
|
|
116
|
+
skipDelayDuration={0}
|
|
117
|
+
>
|
|
110
118
|
<IconButton
|
|
111
119
|
type="button"
|
|
112
|
-
icon={icon()}
|
|
120
|
+
icon={<Icon name={icon()} />}
|
|
113
121
|
variant="ghost"
|
|
114
122
|
onClick={handleCopy}
|
|
115
123
|
tabIndex={-1}
|
package/src/context/i18n.tsx
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
import { createContext, useContext, type Accessor, type ParentProps } from "solid-js"
|
|
2
2
|
import { I18nProvider } from "@kobalte/core/i18n"
|
|
3
3
|
import { dict as en } from "../i18n/en"
|
|
4
|
+
import type { Key, LocaleKey, PluralCategory, PluralKey, PluralLookupKey } from "../i18n/en"
|
|
4
5
|
|
|
5
|
-
export type UiI18nKey =
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"ui.messagePart.context.list",
|
|
12
|
-
] as const
|
|
13
|
-
export type UiI18nPluralKey = (typeof UI_PLURAL_KEYS)[number]
|
|
14
|
-
export type UiPluralCategory = "zero" | "one" | "two" | "few" | "many" | "other"
|
|
15
|
-
export type UiI18nPluralLookupKey = `${UiI18nPluralKey}.${UiPluralCategory}`
|
|
6
|
+
export type UiI18nKey = Key
|
|
7
|
+
export type UiI18nPluralKey = PluralKey
|
|
8
|
+
export type UiPluralCategory = PluralCategory
|
|
9
|
+
export type UiI18nPluralLookupKey = PluralLookupKey
|
|
10
|
+
export type UiI18nLocaleKey = LocaleKey
|
|
11
|
+
type UiTranslationKey<Value extends string> = Value extends UiI18nPluralLookupKey ? never : Value
|
|
16
12
|
|
|
17
13
|
export type UiI18nParams = Record<string, string | number | boolean>
|
|
14
|
+
export type UiTranslate = <Value extends string>(key: UiTranslationKey<Value>, params?: UiI18nParams) => string
|
|
18
15
|
|
|
19
16
|
export type UiI18n = {
|
|
20
17
|
locale: Accessor<string>
|
|
21
18
|
layoutLocale?: Accessor<string>
|
|
22
|
-
t:
|
|
19
|
+
t: UiTranslate
|
|
23
20
|
plural: (key: UiI18nPluralKey, count: number, params?: UiI18nParams) => string
|
|
21
|
+
pluralForm?: (key: UiI18nPluralKey, category: UiPluralCategory, params?: UiI18nParams) => string
|
|
24
22
|
}
|
|
25
23
|
|
|
26
24
|
const rules = new Map<string, Intl.PluralRules>()
|
|
@@ -50,11 +48,16 @@ function resolveTemplate(text: string, params?: UiI18nParams) {
|
|
|
50
48
|
const fallback: UiI18n = {
|
|
51
49
|
locale: () => "en",
|
|
52
50
|
t: (key, params) => {
|
|
53
|
-
const value = en[key] ?? String(key)
|
|
51
|
+
const value = en[key as UiI18nKey] ?? String(key)
|
|
54
52
|
return resolveTemplate(value, params)
|
|
55
53
|
},
|
|
56
54
|
plural: (key, count, params) =>
|
|
57
|
-
fallback.
|
|
55
|
+
fallback.pluralForm!(key, pluralCategory(fallback.locale(), count), { ...params, count }),
|
|
56
|
+
pluralForm: (key, category, params) => {
|
|
57
|
+
const values = en as Partial<Record<UiI18nLocaleKey, string>>
|
|
58
|
+
const value = values[pluralKey(key, category)] ?? values[`${key}.other`] ?? `${key}.other`
|
|
59
|
+
return resolveTemplate(value, params)
|
|
60
|
+
},
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
const Context = createContext<UiI18n>(fallback)
|
|
@@ -43,12 +43,11 @@
|
|
|
43
43
|
color: var(--v2-text-text-base);
|
|
44
44
|
transition: background-color 0.15s ease;
|
|
45
45
|
|
|
46
|
-
/* text-12-regular */
|
|
47
46
|
font-family: var(--font-family-sans);
|
|
48
47
|
font-size: var(--font-size-small);
|
|
49
48
|
font-style: normal;
|
|
50
49
|
font-weight: var(--font-weight-regular);
|
|
51
|
-
line-height: var(--line-height-large);
|
|
50
|
+
line-height: var(--line-height-large);
|
|
52
51
|
letter-spacing: var(--letter-spacing-normal);
|
|
53
52
|
|
|
54
53
|
&:hover:not([data-disabled]) {
|
|
@@ -104,30 +103,6 @@
|
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
|
|
107
|
-
body:not([data-new-layout]) [data-component="accordion"] {
|
|
108
|
-
[data-slot="accordion-item"] [data-slot="accordion-header"] [data-slot="accordion-trigger"] {
|
|
109
|
-
background-color: var(--background-stronger);
|
|
110
|
-
border-width: 1px;
|
|
111
|
-
border-color: var(--border-weak-base);
|
|
112
|
-
color: var(--text-strong);
|
|
113
|
-
|
|
114
|
-
&:hover:not([data-disabled]) {
|
|
115
|
-
background-color: var(--surface-base-hover);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
&:active:not([data-disabled]) {
|
|
119
|
-
background-color: var(--surface-base-active);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
[data-slot="accordion-item"][data-expanded] [data-slot="accordion-content"] {
|
|
124
|
-
border-width: 1px;
|
|
125
|
-
border-color: var(--border-weak-base);
|
|
126
|
-
border-top: 0;
|
|
127
|
-
background-color: var(--background-stronger);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
106
|
@keyframes slideDown {
|
|
132
107
|
from {
|
|
133
108
|
height: 0;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Content, Header, Item, Root, Trigger } from "@kobalte/core/accordion"
|
|
2
2
|
import { splitProps } from "solid-js"
|
|
3
3
|
import type { ComponentProps, ParentProps } from "solid-js"
|
|
4
4
|
|
|
5
|
-
export interface AccordionProps extends ComponentProps<typeof
|
|
6
|
-
export interface AccordionItemProps extends ComponentProps<typeof
|
|
7
|
-
export interface AccordionHeaderProps extends ComponentProps<typeof
|
|
8
|
-
export interface AccordionTriggerProps extends ComponentProps<typeof
|
|
9
|
-
export interface AccordionContentProps extends ComponentProps<typeof
|
|
5
|
+
export interface AccordionProps extends ComponentProps<typeof Root> {}
|
|
6
|
+
export interface AccordionItemProps extends ComponentProps<typeof Item> {}
|
|
7
|
+
export interface AccordionHeaderProps extends ComponentProps<typeof Header> {}
|
|
8
|
+
export interface AccordionTriggerProps extends ComponentProps<typeof Trigger> {}
|
|
9
|
+
export interface AccordionContentProps extends ComponentProps<typeof Content> {}
|
|
10
10
|
|
|
11
11
|
function AccordionRoot(props: AccordionProps) {
|
|
12
12
|
const [split, rest] = splitProps(props, ["class", "classList"])
|
|
13
13
|
return (
|
|
14
|
-
<
|
|
14
|
+
<Root
|
|
15
15
|
{...rest}
|
|
16
16
|
data-component="accordion"
|
|
17
17
|
classList={{
|
|
@@ -25,7 +25,7 @@ function AccordionRoot(props: AccordionProps) {
|
|
|
25
25
|
function AccordionItem(props: AccordionItemProps) {
|
|
26
26
|
const [split, rest] = splitProps(props, ["class", "classList"])
|
|
27
27
|
return (
|
|
28
|
-
<
|
|
28
|
+
<Item
|
|
29
29
|
{...rest}
|
|
30
30
|
data-slot="accordion-item"
|
|
31
31
|
classList={{
|
|
@@ -39,7 +39,7 @@ function AccordionItem(props: AccordionItemProps) {
|
|
|
39
39
|
function AccordionHeader(props: ParentProps<AccordionHeaderProps>) {
|
|
40
40
|
const [split, rest] = splitProps(props, ["class", "classList", "children"])
|
|
41
41
|
return (
|
|
42
|
-
<
|
|
42
|
+
<Header
|
|
43
43
|
{...rest}
|
|
44
44
|
data-slot="accordion-header"
|
|
45
45
|
classList={{
|
|
@@ -48,14 +48,14 @@ function AccordionHeader(props: ParentProps<AccordionHeaderProps>) {
|
|
|
48
48
|
}}
|
|
49
49
|
>
|
|
50
50
|
{split.children}
|
|
51
|
-
</
|
|
51
|
+
</Header>
|
|
52
52
|
)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
function AccordionTrigger(props: ParentProps<AccordionTriggerProps>) {
|
|
56
56
|
const [split, rest] = splitProps(props, ["class", "classList", "children"])
|
|
57
57
|
return (
|
|
58
|
-
<
|
|
58
|
+
<Trigger
|
|
59
59
|
{...rest}
|
|
60
60
|
data-slot="accordion-trigger"
|
|
61
61
|
classList={{
|
|
@@ -64,14 +64,14 @@ function AccordionTrigger(props: ParentProps<AccordionTriggerProps>) {
|
|
|
64
64
|
}}
|
|
65
65
|
>
|
|
66
66
|
{split.children}
|
|
67
|
-
</
|
|
67
|
+
</Trigger>
|
|
68
68
|
)
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
function AccordionContent(props: ParentProps<AccordionContentProps>) {
|
|
72
72
|
const [split, rest] = splitProps(props, ["class", "classList", "children"])
|
|
73
73
|
return (
|
|
74
|
-
<
|
|
74
|
+
<Content
|
|
75
75
|
{...rest}
|
|
76
76
|
data-slot="accordion-content"
|
|
77
77
|
classList={{
|
|
@@ -80,7 +80,7 @@ function AccordionContent(props: ParentProps<AccordionContentProps>) {
|
|
|
80
80
|
}}
|
|
81
81
|
>
|
|
82
82
|
{split.children}
|
|
83
|
-
</
|
|
83
|
+
</Content>
|
|
84
84
|
)
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -31,3 +31,22 @@
|
|
|
31
31
|
background: var(--v2-background-bg-accent);
|
|
32
32
|
color: var(--v2-text-text-contrast);
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
[data-component="tag"][data-appearance="standard"] {
|
|
36
|
+
height: 18px;
|
|
37
|
+
padding: 0 6px;
|
|
38
|
+
border-radius: var(--radius-xs);
|
|
39
|
+
font-family: var(--font-family-sans);
|
|
40
|
+
font-size: var(--font-size-small);
|
|
41
|
+
font-style: normal;
|
|
42
|
+
font-weight: var(--font-weight-medium);
|
|
43
|
+
line-height: var(--line-height-large);
|
|
44
|
+
letter-spacing: var(--letter-spacing-normal);
|
|
45
|
+
font-variant-numeric: normal;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
[data-component="tag"][data-appearance="standard"][data-variant="neutral"] {
|
|
49
|
+
border: 0.5px solid var(--border-weak-base);
|
|
50
|
+
background: var(--surface-raised-base);
|
|
51
|
+
color: var(--text-base);
|
|
52
|
+
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { type ComponentProps, splitProps } from "solid-js"
|
|
2
|
-
import "./badge
|
|
2
|
+
import "./badge.css"
|
|
3
3
|
|
|
4
|
-
export interface
|
|
4
|
+
export interface BadgeProps extends ComponentProps<"span"> {
|
|
5
|
+
appearance?: "standard" | "compact"
|
|
5
6
|
variant?: "neutral" | "accent"
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
export function
|
|
9
|
-
const [split, rest] = splitProps(props, ["class", "classList", "children", "variant"])
|
|
9
|
+
export function Badge(props: BadgeProps) {
|
|
10
|
+
const [split, rest] = splitProps(props, ["class", "classList", "children", "appearance", "variant"])
|
|
10
11
|
return (
|
|
11
12
|
<span
|
|
12
13
|
{...rest}
|
|
13
14
|
data-component="tag"
|
|
15
|
+
data-appearance={split.appearance ?? "compact"}
|
|
14
16
|
data-variant={split.variant ?? "neutral"}
|
|
15
17
|
classList={{
|
|
16
18
|
...split.classList,
|
|
@@ -6,18 +6,27 @@
|
|
|
6
6
|
justify-content: flex-end;
|
|
7
7
|
align-items: center;
|
|
8
8
|
|
|
9
|
-
[data-slot="diff-changes-additions"]
|
|
10
|
-
|
|
11
|
-
font-
|
|
12
|
-
font-size: 14px;
|
|
9
|
+
[data-slot="diff-changes-additions"],
|
|
10
|
+
[data-slot="diff-changes-deletions"] {
|
|
11
|
+
font-size: 11px;
|
|
13
12
|
font-style: normal;
|
|
14
|
-
font-weight:
|
|
15
|
-
line-height:
|
|
16
|
-
letter-spacing:
|
|
13
|
+
font-weight: 440;
|
|
14
|
+
line-height: 1;
|
|
15
|
+
letter-spacing: 0.05px;
|
|
17
16
|
text-align: right;
|
|
18
|
-
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
[data-slot="diff-changes-additions"] {
|
|
20
|
+
color: var(--v2-state-fg-success);
|
|
19
21
|
}
|
|
20
22
|
|
|
23
|
+
[data-slot="diff-changes-deletions"] {
|
|
24
|
+
color: var(--v2-state-fg-danger);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
[data-component="diff-changes"][data-appearance="standard"] {
|
|
29
|
+
[data-slot="diff-changes-additions"],
|
|
21
30
|
[data-slot="diff-changes-deletions"] {
|
|
22
31
|
font-family: var(--font-family-mono);
|
|
23
32
|
font-feature-settings: var(--font-family-mono--font-feature-settings);
|
|
@@ -26,19 +35,13 @@
|
|
|
26
35
|
font-weight: var(--font-weight-regular);
|
|
27
36
|
line-height: var(--line-height-large);
|
|
28
37
|
letter-spacing: var(--letter-spacing-normal);
|
|
29
|
-
text-align: right;
|
|
30
|
-
color: var(--text-diff-delete-base);
|
|
31
38
|
}
|
|
32
|
-
}
|
|
33
39
|
|
|
34
|
-
[data-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
flex-shrink: 0;
|
|
40
|
+
[data-slot="diff-changes-additions"] {
|
|
41
|
+
color: var(--text-diff-add-base);
|
|
42
|
+
}
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
width: 100%;
|
|
42
|
-
height: 100%;
|
|
44
|
+
[data-slot="diff-changes-deletions"] {
|
|
45
|
+
color: var(--text-diff-delete-base);
|
|
43
46
|
}
|
|
44
47
|
}
|
package/src/{v2/components/diff-changes-v2.tsx → data-display/diff-changes/diff-changes.tsx}
RENAMED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createMemo, Show } from "solid-js"
|
|
2
|
-
import "./diff-changes
|
|
2
|
+
import "./diff-changes.css"
|
|
3
3
|
|
|
4
4
|
export function DiffChanges(props: {
|
|
5
5
|
class?: string
|
|
6
|
+
appearance?: "standard" | "compact"
|
|
6
7
|
changes: { additions: number; deletions: number } | { additions: number; deletions: number }[]
|
|
7
8
|
}) {
|
|
8
9
|
const additions = createMemo(() =>
|
|
@@ -19,7 +20,11 @@ export function DiffChanges(props: {
|
|
|
19
20
|
|
|
20
21
|
return (
|
|
21
22
|
<Show when={total() > 0}>
|
|
22
|
-
<div
|
|
23
|
+
<div
|
|
24
|
+
data-component="diff-changes"
|
|
25
|
+
data-appearance={props.appearance ?? "compact"}
|
|
26
|
+
classList={{ [props.class ?? ""]: true }}
|
|
27
|
+
>
|
|
23
28
|
<span data-slot="diff-changes-additions">{`+${additions()}`}</span>
|
|
24
29
|
<span data-slot="diff-changes-deletions">{`-${deletions()}`}</span>
|
|
25
30
|
</div>
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
justify-content: center;
|
|
28
28
|
align-items: center;
|
|
29
29
|
padding: 0;
|
|
30
|
+
padding-inline: 4px;
|
|
30
31
|
gap: 4px;
|
|
31
32
|
min-width: 14px;
|
|
32
33
|
height: 14px;
|
|
@@ -48,7 +49,6 @@
|
|
|
48
49
|
flex-direction: row;
|
|
49
50
|
justify-content: center;
|
|
50
51
|
align-items: center;
|
|
51
|
-
min-width: 14px;
|
|
52
52
|
height: 11px;
|
|
53
53
|
padding: 0;
|
|
54
54
|
flex: none;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type ComponentProps, For, splitProps } from "solid-js"
|
|
2
|
-
import "./keybind
|
|
2
|
+
import "./keybind.css"
|
|
3
3
|
|
|
4
|
-
export interface
|
|
4
|
+
export interface KeybindProps extends ComponentProps<"div"> {
|
|
5
5
|
keys: string[]
|
|
6
6
|
variant?: "neutral" | "ghost"
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export function
|
|
9
|
+
export function Keybind(props: KeybindProps) {
|
|
10
10
|
const [local, rest] = splitProps(props, ["keys", "variant", "class", "classList"])
|
|
11
11
|
return (
|
|
12
12
|
<div
|
package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { For, Show, createSignal, onMount, splitProps, type ComponentProps, type JSX } from "solid-js"
|
|
2
|
-
import { FileIcon } from "
|
|
2
|
+
import { FileIcon } from "@opencode-ai/ui/file-icon"
|
|
3
3
|
import { useI18n } from "../../context/i18n"
|
|
4
4
|
import { useFilteredList } from "../../hooks"
|
|
5
|
-
import {
|
|
6
|
-
import "./line-comment
|
|
5
|
+
import { Button } from "@opencode-ai/ui/button"
|
|
6
|
+
import "./line-comment.css"
|
|
7
7
|
|
|
8
8
|
/** Horizontal “more” glyph for the display-card overflow control (Figma outline-dots). */
|
|
9
|
-
export function
|
|
9
|
+
export function LineCommentOverflowIcon(props: ComponentProps<"svg">) {
|
|
10
10
|
return (
|
|
11
11
|
<svg
|
|
12
12
|
{...props}
|
|
@@ -24,16 +24,16 @@ export function LineCommentV2OverflowIcon(props: ComponentProps<"svg">) {
|
|
|
24
24
|
)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export interface
|
|
27
|
+
export interface LineCommentProps 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 `
|
|
32
|
+
/** Typically an overflow menu trigger; use `LineCommentOverflowIcon` inside `line-comment-v2-overflow`. */
|
|
33
33
|
actions?: JSX.Element
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export function
|
|
36
|
+
export function LineComment(props: LineCommentProps) {
|
|
37
37
|
const [local, rest] = splitProps(props, ["comment", "selection", "actions", "class", "classList"])
|
|
38
38
|
return (
|
|
39
39
|
<div
|
|
@@ -56,11 +56,11 @@ export function LineCommentV2(props: LineCommentV2Props) {
|
|
|
56
56
|
)
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
export type
|
|
59
|
+
export type LineCommentEditorMention = {
|
|
60
60
|
items: (query: string) => string[] | Promise<string[]>
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
export interface
|
|
63
|
+
export interface LineCommentEditorProps 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 LineCommentEditorV2Props extends Omit<ComponentProps<"div">, "c
|
|
|
73
73
|
cancelLabel?: string
|
|
74
74
|
submitLabel?: string
|
|
75
75
|
autofocus?: boolean
|
|
76
|
-
mention?:
|
|
76
|
+
mention?: LineCommentEditorMention
|
|
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
|
|
89
|
+
export function LineCommentEditor(props: LineCommentEditorProps) {
|
|
90
90
|
const i18n = useI18n()
|
|
91
91
|
let textareaRef: HTMLTextAreaElement | undefined
|
|
92
92
|
const [mentionOpen, setMentionOpen] = createSignal(false)
|
|
@@ -212,9 +212,11 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
|
|
|
212
212
|
textareaRef = el
|
|
213
213
|
}}
|
|
214
214
|
data-slot="line-comment-v2-textarea"
|
|
215
|
+
dir="auto"
|
|
215
216
|
rows={local.rows ?? 3}
|
|
216
217
|
placeholder={local.placeholder ?? i18n.t("ui.lineComment.contextPlaceholder")}
|
|
217
218
|
value={local.value}
|
|
219
|
+
style={{ "unicode-bidi": "plaintext", "text-align": "start" }}
|
|
218
220
|
onInput={(e) => {
|
|
219
221
|
local.onInput(e.currentTarget.value)
|
|
220
222
|
syncMention()
|
|
@@ -292,12 +294,12 @@ export function LineCommentEditorV2(props: LineCommentEditorV2Props) {
|
|
|
292
294
|
<div data-slot="line-comment-v2-footer">
|
|
293
295
|
<div data-slot="line-comment-v2-footer-meta">{local.selection}</div>
|
|
294
296
|
<div data-slot="line-comment-v2-footer-actions">
|
|
295
|
-
<
|
|
297
|
+
<Button type="button" size="normal" variant="neutral" onClick={() => local.onCancel()}>
|
|
296
298
|
{local.cancelLabel ?? i18n.t("ui.lineComment.cancel")}
|
|
297
|
-
</
|
|
298
|
-
<
|
|
299
|
+
</Button>
|
|
300
|
+
<Button type="button" size="normal" variant="contrast" disabled={!canSubmit()} onClick={submit}>
|
|
299
301
|
{local.submitLabel ?? i18n.t("ui.lineComment.submit")}
|
|
300
|
-
</
|
|
302
|
+
</Button>
|
|
301
303
|
</div>
|
|
302
304
|
</div>
|
|
303
305
|
</div>
|