@opencode-ai/ui 0.0.0-dev-202609071625 → 0.0.0-dev-19270
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 +14 -4
- package/dist/context/i18n.d.ts +10 -7
- package/dist/context/marked-base.d.ts +3 -0
- package/dist/context/marked-parser.d.ts +1 -2
- 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} +5 -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/hooks/use-filtered-list.d.ts +9 -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 +244 -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 +60 -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 +15 -0
- package/dist/{components → typography/text-shimmer}/text-shimmer.d.ts +1 -0
- package/dist/typography/wordmark/wordmark.d.ts +5 -0
- package/package.json +141 -35
- package/src/{v2/components/button-v2.css → actions/button/button.css} +30 -0
- package/src/{components → actions/button}/button.tsx +19 -11
- package/src/{v2/components/icon-button-v2.css → actions/icon-button/icon-button.css} +27 -9
- package/src/actions/icon-button/icon-button.tsx +32 -0
- package/src/{v2/components/split-button-v2.css → actions/split-button/split-button.css} +2 -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 +2 -2
- package/src/components/dock-surface.css +2 -9
- 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/scroll-view.css +36 -4
- package/src/components/scroll-view.tsx +153 -88
- package/src/components/sticky-accordion-header.tsx +1 -1
- package/src/components/text-field.tsx +12 -4
- package/src/context/dialog.tsx +1 -0
- package/src/context/i18n.tsx +17 -14
- package/src/context/marked-base.tsx +27 -0
- package/src/context/marked-parser.tsx +3 -13
- package/src/{components → data-display/accordion}/accordion.css +7 -33
- 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.css → data-display/line-comment/line-comment.css} +4 -4
- package/src/{v2/components/line-comment-v2.tsx → data-display/line-comment/line-comment.tsx} +17 -15
- package/src/{v2/components/project-avatar-v2.css → data-display/project-avatar/project-avatar.css} +4 -4
- 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.css → forms/field/field.css} +1 -1
- 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} +42 -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.css → forms/text-input/text-input.css} +3 -3
- 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 +7 -9
- package/src/i18n/ar.ts +7 -9
- package/src/i18n/az.ts +7 -9
- package/src/i18n/bg.ts +7 -9
- package/src/i18n/bn.ts +7 -9
- package/src/i18n/br.ts +7 -9
- package/src/i18n/bs.ts +7 -9
- package/src/i18n/ca.ts +7 -9
- package/src/i18n/cs.ts +7 -9
- package/src/i18n/da.ts +7 -9
- package/src/i18n/de.ts +1 -3
- package/src/i18n/dv.ts +7 -9
- package/src/i18n/dz.ts +5 -7
- package/src/i18n/el.ts +7 -9
- package/src/i18n/en.ts +61 -12
- package/src/i18n/es.ts +6 -8
- package/src/i18n/et.ts +7 -9
- package/src/i18n/fa.ts +7 -9
- package/src/i18n/fi.ts +7 -9
- package/src/i18n/fo.ts +7 -9
- package/src/i18n/fr.ts +6 -8
- package/src/i18n/he.ts +199 -0
- package/src/i18n/hi.ts +7 -9
- package/src/i18n/hr.ts +7 -9
- package/src/i18n/hu.ts +7 -9
- package/src/i18n/hy.ts +7 -9
- package/src/i18n/id.ts +7 -9
- package/src/i18n/is.ts +7 -9
- package/src/i18n/it.ts +7 -9
- package/src/i18n/ja.ts +7 -9
- package/src/i18n/ka.ts +7 -9
- package/src/i18n/km.ts +7 -9
- package/src/i18n/ko.ts +7 -9
- package/src/i18n/lo.ts +7 -9
- package/src/i18n/lt.ts +7 -9
- package/src/i18n/lv.ts +7 -9
- package/src/i18n/mk.ts +7 -9
- package/src/i18n/mn.ts +7 -9
- package/src/i18n/ms.ts +7 -9
- package/src/i18n/my.ts +7 -9
- package/src/i18n/ne.ts +7 -9
- package/src/i18n/nl.ts +7 -9
- package/src/i18n/no.ts +7 -9
- package/src/i18n/pa.ts +7 -9
- package/src/i18n/pl.ts +7 -9
- package/src/i18n/ro.ts +7 -9
- package/src/i18n/ru.ts +7 -9
- package/src/i18n/si.ts +7 -9
- package/src/i18n/sk.ts +7 -9
- package/src/i18n/sl.ts +7 -9
- package/src/i18n/sq.ts +7 -9
- package/src/i18n/sr.ts +7 -9
- package/src/i18n/sv.ts +7 -9
- package/src/i18n/tg.ts +7 -9
- package/src/i18n/th.ts +7 -9
- package/src/i18n/tk.ts +7 -9
- package/src/i18n/tr.ts +7 -9
- package/src/i18n/uk.ts +7 -9
- package/src/i18n/ur.ts +7 -9
- package/src/i18n/uz.ts +7 -9
- package/src/i18n/vi.ts +7 -9
- package/src/i18n/zh.ts +7 -9
- package/src/i18n/zht.ts +7 -9
- package/src/{components/icon.tsx → icons/icon/additional-icons.ts} +9 -75
- package/src/icons/icon/icon.css +3 -0
- package/src/{v2/components → icons/icon}/icon.tsx +96 -12
- package/src/{v2/components/divider-v2.tsx → layout/divider/divider.tsx} +3 -3
- package/src/{v2/components/menu-v2.css → navigation/menu/menu.css} +124 -2
- package/src/{v2/components/menu-v2.tsx → navigation/menu/menu.tsx} +96 -32
- package/src/{v2/components/segmented-control-v2.css → navigation/segmented-control/segmented-control.css} +1 -1
- 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} +25 -10
- package/src/{components → navigation/tabs}/tabs.css +53 -232
- 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} +33 -0
- package/src/{v2/components/tooltip-v2.tsx → overlays/tooltip/tooltip.tsx} +24 -17
- package/src/styles/base.css +5 -0
- package/src/{v2/components/file-tree-v2.css → styles/file-tree.css} +64 -3
- package/src/styles/index.css +4 -20
- package/src/styles/tailwind/colors.css +2 -0
- package/src/styles/tailwind/index.css +18 -1
- package/src/styles/theme.css +2 -2
- package/src/{v2/styles → styles/tokens}/colors.css +8 -8
- package/src/{v2/styles → styles/tokens}/theme.css +23 -16
- package/src/theme/context.tsx +19 -11
- package/src/theme/themes/oc-2.json +50 -19
- package/src/theme/v2/default-primitives.ts +8 -8
- package/src/theme/v2/foreground.ts +1 -0
- package/src/theme/v2/mapping.ts +7 -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/typography/wordmark/wordmark.tsx +39 -0
- 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/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/button-v2.tsx +0 -35
- 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/src/v2/components/wordmark-v2.tsx +0 -71
- /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/avatar-v2.css → data-display/avatar/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/{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/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 → navigation}/tab-state-indicator.tsx +0 -0
- /package/src/{v2/styles/tailwind.css → styles/tokens/index.css} +0 -0
|
@@ -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"
|
|
@@ -18,7 +8,7 @@ export type ScrollViewThumbVisibility = "hover" | "scroll"
|
|
|
18
8
|
|
|
19
9
|
export interface ScrollViewProps extends ComponentProps<"div"> {
|
|
20
10
|
viewportRef?: (el: HTMLDivElement) => void
|
|
21
|
-
orientation?: "vertical" | "horizontal"
|
|
11
|
+
orientation?: "vertical" | "horizontal" | "both"
|
|
22
12
|
/**
|
|
23
13
|
* `hover`: show while hovered or scrolling. `scroll`: show only while scrolling.
|
|
24
14
|
*
|
|
@@ -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">) => {
|
|
@@ -88,12 +78,37 @@ export function scrollTopFromThumbPointer(input: {
|
|
|
88
78
|
thumbHeight: number
|
|
89
79
|
/** Viewport height used for max scroll. Defaults to `clientHeight` (track == viewport). */
|
|
90
80
|
scrollClientHeight?: number
|
|
81
|
+
}) {
|
|
82
|
+
return scrollOffsetFromThumbPointer({
|
|
83
|
+
pointer: input.pointer,
|
|
84
|
+
viewportStart: input.viewportTop,
|
|
85
|
+
grabOffset: input.grabOffset,
|
|
86
|
+
clientSize: input.clientHeight,
|
|
87
|
+
scrollSize: input.scrollHeight,
|
|
88
|
+
thumbSize: input.thumbHeight,
|
|
89
|
+
scrollClientSize: input.scrollClientHeight,
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function scrollOffsetFromThumbPointer(input: {
|
|
94
|
+
pointer: number
|
|
95
|
+
viewportStart: number
|
|
96
|
+
grabOffset: number
|
|
97
|
+
clientSize: number
|
|
98
|
+
scrollSize: number
|
|
99
|
+
thumbSize: number
|
|
100
|
+
scrollClientSize?: number
|
|
101
|
+
reverse?: boolean
|
|
91
102
|
}) {
|
|
92
103
|
const padding = 8
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
const
|
|
96
|
-
|
|
104
|
+
const maxThumbStart = input.clientSize - padding * 2 - input.thumbSize
|
|
105
|
+
if (maxThumbStart <= 0) return 0
|
|
106
|
+
const thumbStart = Math.max(
|
|
107
|
+
0,
|
|
108
|
+
Math.min(input.pointer - input.viewportStart - padding - input.grabOffset, maxThumbStart),
|
|
109
|
+
)
|
|
110
|
+
const progress = input.reverse ? 1 - thumbStart / maxThumbStart : thumbStart / maxThumbStart
|
|
111
|
+
return progress * Math.max(0, input.scrollSize - (input.scrollClientSize ?? input.clientSize))
|
|
97
112
|
}
|
|
98
113
|
|
|
99
114
|
export function ScrollView(props: ScrollViewProps) {
|
|
@@ -126,31 +141,29 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
126
141
|
|
|
127
142
|
let rootRef!: HTMLDivElement
|
|
128
143
|
let viewportRef!: HTMLDivElement
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
const resolveEl = (value: HTMLElement | Accessor<HTMLElement | undefined> | undefined) => {
|
|
132
|
-
if (typeof value === "function") return value()
|
|
133
|
-
return value
|
|
134
|
-
}
|
|
144
|
+
let verticalThumbRef!: HTMLDivElement
|
|
145
|
+
let horizontalThumbRef!: HTMLDivElement
|
|
135
146
|
|
|
136
|
-
const thumbMount =
|
|
137
|
-
const thumbHover =
|
|
147
|
+
const thumbMount = () => local.thumbContainer
|
|
148
|
+
const thumbHover = () => local.thumbHoverTarget
|
|
138
149
|
const hoverRoot = () => !local.thumbHoverTarget && !local.thumbContainer
|
|
139
150
|
|
|
140
151
|
const [state, setState] = createStore({
|
|
141
152
|
isHovered: false,
|
|
142
|
-
|
|
153
|
+
dragging: undefined as "vertical" | "horizontal" | undefined,
|
|
143
154
|
isScrolling: false,
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
155
|
+
verticalThumbSize: 0,
|
|
156
|
+
verticalThumbStart: 0,
|
|
157
|
+
showVerticalThumb: false,
|
|
158
|
+
horizontalThumbSize: 0,
|
|
159
|
+
horizontalThumbStart: 0,
|
|
160
|
+
showHorizontalThumb: false,
|
|
147
161
|
})
|
|
148
162
|
const isHovered = () => state.isHovered
|
|
149
|
-
const isDragging = () => state.
|
|
163
|
+
const isDragging = () => state.dragging !== undefined
|
|
150
164
|
const isScrolling = () => state.isScrolling
|
|
151
|
-
const
|
|
152
|
-
const
|
|
153
|
-
const showThumb = () => state.showThumb
|
|
165
|
+
const vertical = () => local.orientation === "vertical" || local.orientation === "both"
|
|
166
|
+
const horizontal = () => local.orientation === "horizontal" || local.orientation === "both"
|
|
154
167
|
|
|
155
168
|
let scrollIdleTimer: ReturnType<typeof setTimeout> | undefined
|
|
156
169
|
|
|
@@ -172,33 +185,42 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
172
185
|
|
|
173
186
|
const updateThumb = () => {
|
|
174
187
|
if (!viewportRef) return
|
|
175
|
-
const { scrollTop, scrollHeight, clientHeight } = viewportRef
|
|
176
|
-
|
|
177
|
-
if (scrollHeight <= clientHeight || scrollHeight === 0) {
|
|
178
|
-
setState("showThumb", false)
|
|
179
|
-
return
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
setState("showThumb", true)
|
|
183
188
|
const trackPadding = 8
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
189
|
+
const minThumbSize = 32
|
|
190
|
+
|
|
191
|
+
if (vertical()) {
|
|
192
|
+
const trackSize = Math.max(0, (thumbMount()?.clientHeight || viewportRef.clientHeight) - trackPadding * 2)
|
|
193
|
+
const size = trackSize
|
|
194
|
+
? Math.min(trackSize, Math.max((viewportRef.clientHeight / viewportRef.scrollHeight) * trackSize, minThumbSize))
|
|
195
|
+
: 0
|
|
196
|
+
const maxScroll = viewportRef.scrollHeight - viewportRef.clientHeight
|
|
197
|
+
const maxStart = trackSize - size
|
|
198
|
+
setState("showVerticalThumb", maxScroll > 0)
|
|
199
|
+
setState("verticalThumbSize", size)
|
|
200
|
+
setState(
|
|
201
|
+
"verticalThumbStart",
|
|
202
|
+
trackPadding + (maxScroll > 0 ? (viewportRef.scrollTop / maxScroll) * maxStart : 0),
|
|
203
|
+
)
|
|
204
|
+
} else {
|
|
205
|
+
setState("showVerticalThumb", false)
|
|
206
|
+
}
|
|
199
207
|
|
|
200
|
-
|
|
201
|
-
|
|
208
|
+
if (horizontal()) {
|
|
209
|
+
const trackSize = Math.max(0, (thumbMount()?.clientWidth || viewportRef.clientWidth) - trackPadding * 2)
|
|
210
|
+
const size = trackSize
|
|
211
|
+
? Math.min(trackSize, Math.max((viewportRef.clientWidth / viewportRef.scrollWidth) * trackSize, minThumbSize))
|
|
212
|
+
: 0
|
|
213
|
+
const maxScroll = viewportRef.scrollWidth - viewportRef.clientWidth
|
|
214
|
+
const maxStart = trackSize - size
|
|
215
|
+
const rtl = getComputedStyle(viewportRef).direction === "rtl"
|
|
216
|
+
const offset = Math.max(0, Math.min(rtl ? -viewportRef.scrollLeft : viewportRef.scrollLeft, maxScroll))
|
|
217
|
+
const start = maxScroll > 0 ? (offset / maxScroll) * maxStart : 0
|
|
218
|
+
setState("showHorizontalThumb", maxScroll > 0)
|
|
219
|
+
setState("horizontalThumbSize", size)
|
|
220
|
+
setState("horizontalThumbStart", trackPadding + (rtl ? maxStart - start : start))
|
|
221
|
+
} else {
|
|
222
|
+
setState("showHorizontalThumb", false)
|
|
223
|
+
}
|
|
202
224
|
}
|
|
203
225
|
|
|
204
226
|
onMount(() => {
|
|
@@ -219,6 +241,13 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
219
241
|
updateThumb()
|
|
220
242
|
})
|
|
221
243
|
|
|
244
|
+
createEffect(() => {
|
|
245
|
+
if (!horizontal() || !viewportRef) return
|
|
246
|
+
const observer = new MutationObserver(updateThumb)
|
|
247
|
+
observer.observe(viewportRef, { childList: true, subtree: true, characterData: true })
|
|
248
|
+
onCleanup(() => observer.disconnect())
|
|
249
|
+
})
|
|
250
|
+
|
|
222
251
|
createEffect(() => {
|
|
223
252
|
const target = thumbHover()
|
|
224
253
|
if (!target) return
|
|
@@ -234,58 +263,88 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
234
263
|
})
|
|
235
264
|
})
|
|
236
265
|
|
|
237
|
-
const onThumbPointerDown = (e: PointerEvent) => {
|
|
266
|
+
const onThumbPointerDown = (axis: "vertical" | "horizontal", e: PointerEvent) => {
|
|
238
267
|
e.preventDefault()
|
|
239
268
|
e.stopPropagation()
|
|
240
|
-
setState("
|
|
241
|
-
const
|
|
269
|
+
setState("dragging", axis)
|
|
270
|
+
const thumb = axis === "vertical" ? verticalThumbRef : horizontalThumbRef
|
|
271
|
+
const grabOffset =
|
|
272
|
+
axis === "vertical"
|
|
273
|
+
? e.clientY - thumb.getBoundingClientRect().top
|
|
274
|
+
: e.clientX - thumb.getBoundingClientRect().left
|
|
242
275
|
const track = thumbMount() ?? viewportRef
|
|
243
276
|
|
|
244
|
-
|
|
277
|
+
thumb.setPointerCapture(e.pointerId)
|
|
245
278
|
|
|
246
279
|
const onPointerMove = (e: PointerEvent) => {
|
|
247
|
-
const
|
|
248
|
-
viewportRef.
|
|
249
|
-
|
|
250
|
-
|
|
280
|
+
const vertical = axis === "vertical"
|
|
281
|
+
const rtl = !vertical && getComputedStyle(viewportRef).direction === "rtl"
|
|
282
|
+
const offset = scrollOffsetFromThumbPointer({
|
|
283
|
+
pointer: vertical ? e.clientY : e.clientX,
|
|
284
|
+
viewportStart: vertical ? track.getBoundingClientRect().top : track.getBoundingClientRect().left,
|
|
251
285
|
grabOffset,
|
|
252
|
-
clientHeight: track.
|
|
253
|
-
|
|
254
|
-
scrollHeight,
|
|
255
|
-
|
|
286
|
+
clientSize: vertical ? track.clientHeight : track.clientWidth,
|
|
287
|
+
scrollClientSize: vertical ? viewportRef.clientHeight : viewportRef.clientWidth,
|
|
288
|
+
scrollSize: vertical ? viewportRef.scrollHeight : viewportRef.scrollWidth,
|
|
289
|
+
thumbSize: vertical ? state.verticalThumbSize : state.horizontalThumbSize,
|
|
290
|
+
reverse: rtl,
|
|
256
291
|
})
|
|
292
|
+
if (vertical) {
|
|
293
|
+
viewportRef.scrollTop = offset
|
|
294
|
+
return
|
|
295
|
+
}
|
|
296
|
+
viewportRef.scrollLeft = rtl ? -offset : offset
|
|
257
297
|
}
|
|
258
298
|
|
|
259
299
|
const done = (e: PointerEvent) => {
|
|
260
|
-
setState("
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
300
|
+
setState("dragging", undefined)
|
|
301
|
+
thumb.releasePointerCapture(e.pointerId)
|
|
302
|
+
thumb.removeEventListener("pointermove", onPointerMove)
|
|
303
|
+
thumb.removeEventListener("pointerup", done)
|
|
304
|
+
thumb.removeEventListener("pointercancel", done)
|
|
265
305
|
}
|
|
266
306
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
307
|
+
thumb.addEventListener("pointermove", onPointerMove)
|
|
308
|
+
thumb.addEventListener("pointerup", done)
|
|
309
|
+
thumb.addEventListener("pointercancel", done)
|
|
270
310
|
}
|
|
271
311
|
|
|
272
|
-
const
|
|
312
|
+
const renderVerticalThumb = () => (
|
|
273
313
|
<div
|
|
274
314
|
ref={(el) => {
|
|
275
|
-
|
|
315
|
+
verticalThumbRef = el
|
|
276
316
|
}}
|
|
277
|
-
onPointerDown={onThumbPointerDown}
|
|
317
|
+
onPointerDown={(event) => onThumbPointerDown("vertical", event)}
|
|
278
318
|
class="scroll-view__thumb"
|
|
319
|
+
data-orientation="vertical"
|
|
279
320
|
data-visible={thumbVisible()}
|
|
280
|
-
data-dragging={
|
|
321
|
+
data-dragging={state.dragging === "vertical"}
|
|
281
322
|
style={{
|
|
282
|
-
height: `${
|
|
283
|
-
transform: `translateY(${
|
|
323
|
+
height: `${state.verticalThumbSize}px`,
|
|
324
|
+
transform: `translateY(${state.verticalThumbStart}px)`,
|
|
284
325
|
"z-index": 100, // ensure it displays over content
|
|
285
326
|
}}
|
|
286
327
|
/>
|
|
287
328
|
)
|
|
288
329
|
|
|
330
|
+
const renderHorizontalThumb = () => (
|
|
331
|
+
<div
|
|
332
|
+
ref={(el) => {
|
|
333
|
+
horizontalThumbRef = el
|
|
334
|
+
}}
|
|
335
|
+
onPointerDown={(event) => onThumbPointerDown("horizontal", event)}
|
|
336
|
+
class="scroll-view__thumb"
|
|
337
|
+
data-orientation="horizontal"
|
|
338
|
+
data-visible={thumbVisible()}
|
|
339
|
+
data-dragging={state.dragging === "horizontal"}
|
|
340
|
+
style={{
|
|
341
|
+
width: `${state.horizontalThumbSize}px`,
|
|
342
|
+
transform: `translateX(${state.horizontalThumbStart}px)`,
|
|
343
|
+
"z-index": 100,
|
|
344
|
+
}}
|
|
345
|
+
/>
|
|
346
|
+
)
|
|
347
|
+
|
|
289
348
|
// Keybinds implementation
|
|
290
349
|
// We ensure the viewport has a tabindex so it can receive focus
|
|
291
350
|
// We can also explicitly catch PageUp/Down if we want smooth scroll or specific behavior,
|
|
@@ -335,6 +394,7 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
335
394
|
<div
|
|
336
395
|
ref={rootRef}
|
|
337
396
|
class={`scroll-view ${local.class || ""}`}
|
|
397
|
+
data-orientation={local.orientation}
|
|
338
398
|
style={local.style}
|
|
339
399
|
onPointerEnter={() => {
|
|
340
400
|
if (hoverRoot()) setState("isHovered", true)
|
|
@@ -378,9 +438,14 @@ export function ScrollView(props: ScrollViewProps) {
|
|
|
378
438
|
</div>
|
|
379
439
|
|
|
380
440
|
{/* Thumb Overlay — optionally portaled into an external track */}
|
|
381
|
-
<Show when={
|
|
382
|
-
<Show when={thumbMount()} fallback={
|
|
383
|
-
{(mount) => <Portal mount={mount()}>{
|
|
441
|
+
<Show when={state.showVerticalThumb}>
|
|
442
|
+
<Show when={thumbMount()} fallback={renderVerticalThumb()}>
|
|
443
|
+
{(mount) => <Portal mount={mount()}>{renderVerticalThumb()}</Portal>}
|
|
444
|
+
</Show>
|
|
445
|
+
</Show>
|
|
446
|
+
<Show when={state.showHorizontalThumb}>
|
|
447
|
+
<Show when={thumbMount()} fallback={renderHorizontalThumb()}>
|
|
448
|
+
{(mount) => <Portal mount={mount()}>{renderHorizontalThumb()}</Portal>}
|
|
384
449
|
</Show>
|
|
385
450
|
</Show>
|
|
386
451
|
</div>
|
|
@@ -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/dialog.tsx
CHANGED
|
@@ -81,6 +81,7 @@ function init() {
|
|
|
81
81
|
let dispose: (() => void) | undefined
|
|
82
82
|
let setClosing: ((closing: boolean) => void) | undefined
|
|
83
83
|
|
|
84
|
+
// Stacked dialogs render as sibling portals, so only the top layer may own the focus trap.
|
|
84
85
|
const node = runWithOwner(owner, () =>
|
|
85
86
|
createRoot((d: () => void) => {
|
|
86
87
|
dispose = d
|
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)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Marked } from "marked"
|
|
2
|
+
|
|
3
|
+
export function createMarkdownBase() {
|
|
4
|
+
return new Marked({
|
|
5
|
+
renderer: {
|
|
6
|
+
link({ href, title, text }) {
|
|
7
|
+
const titleAttr = title ? ` title="${title}"` : ""
|
|
8
|
+
return `<a href="${href}"${titleAttr} class="external-link" target="_blank" rel="noopener noreferrer">${text}</a>`
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
})
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let smallParser: Marked | undefined
|
|
15
|
+
|
|
16
|
+
export function parseSmallMarkdown(text: string) {
|
|
17
|
+
// Any possible KaTeX delimiter stays on the worker, including escaped ones.
|
|
18
|
+
if (text.length > 1024 || text.includes("\\(") || text.includes("$$")) return
|
|
19
|
+
const parser = (smallParser ??= createMarkdownBase())
|
|
20
|
+
const tokens = parser.lexer(text)
|
|
21
|
+
let code = false
|
|
22
|
+
parser.walkTokens(tokens, (token) => {
|
|
23
|
+
if (token.type === "code") code = true
|
|
24
|
+
})
|
|
25
|
+
if (code) return
|
|
26
|
+
return parser.parser(tokens)
|
|
27
|
+
}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
import katex from "katex"
|
|
2
|
-
import {
|
|
2
|
+
import type { MarkedExtension, Tokens } from "marked"
|
|
3
3
|
import markedShiki from "marked-shiki"
|
|
4
|
+
import { createMarkdownBase } from "./marked-base"
|
|
4
5
|
|
|
5
6
|
export function createMarkdownParser(highlight: (code: string, language: string) => string | Promise<string>) {
|
|
6
|
-
return
|
|
7
|
-
{
|
|
8
|
-
renderer: {
|
|
9
|
-
link({ href, title, text }) {
|
|
10
|
-
const titleAttr = title ? ` title="${title}"` : ""
|
|
11
|
-
return `<a href="${href}"${titleAttr} class="external-link" target="_blank" rel="noopener noreferrer">${text}</a>`
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
katexExtension,
|
|
16
|
-
markedShiki({ highlight }),
|
|
17
|
-
)
|
|
7
|
+
return createMarkdownBase().use(katexExtension, markedShiki({ highlight }))
|
|
18
8
|
}
|
|
19
9
|
|
|
20
10
|
const inlineMathRegex = /^\\\(((?:\\.|[^\\\n])*?)\\\)/
|
|
@@ -36,26 +36,24 @@
|
|
|
36
36
|
user-select: none;
|
|
37
37
|
|
|
38
38
|
background-color: var(--v2-background-bg-base);
|
|
39
|
-
border:
|
|
39
|
+
border: 1px solid var(--v2-border-border-base);
|
|
40
40
|
border-radius: 0;
|
|
41
41
|
box-shadow: none;
|
|
42
42
|
overflow: clip;
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
background-color: var(--v2-overlay-simple-overlay-pressed);
|
|
53
|
+
@media (hover: hover) {
|
|
54
|
+
&:hover:not([data-disabled]) {
|
|
55
|
+
background-color: var(--v2-overlay-simple-overlay-hover);
|
|
56
|
+
}
|
|
59
57
|
}
|
|
60
58
|
&:focus-visible {
|
|
61
59
|
outline: none;
|
|
@@ -82,7 +80,7 @@
|
|
|
82
80
|
|
|
83
81
|
&[data-expanded] {
|
|
84
82
|
[data-slot="accordion-content"] {
|
|
85
|
-
border:
|
|
83
|
+
border: 1px solid var(--v2-border-border-base);
|
|
86
84
|
border-top: 0;
|
|
87
85
|
background-color: var(--v2-background-bg-layer-01);
|
|
88
86
|
}
|
|
@@ -104,30 +102,6 @@
|
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
104
|
|
|
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
105
|
@keyframes slideDown {
|
|
132
106
|
from {
|
|
133
107
|
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
|
|