@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
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const icons = {
|
|
1
|
+
export const additionalIcons = {
|
|
4
2
|
"align-right": `<path d="M12.292 6.04167L16.2503 9.99998L12.292 13.9583M2.91699 9.99998H15.6253M17.0837 3.75V16.25" stroke="currentColor" stroke-linecap="square"/>`,
|
|
5
3
|
"arrow-up": `<path fill-rule="evenodd" clip-rule="evenodd" d="M9.99991 2.24121L16.0921 8.33343L15.2083 9.21731L10.6249 4.63397V17.5001H9.37492V4.63398L4.7916 9.21731L3.90771 8.33343L9.99991 2.24121Z" fill="currentColor"/>`,
|
|
6
4
|
"arrow-left": `<path d="M8.33464 4.58398L2.91797 10.0007L8.33464 15.4173M3.33464 10.0007H17.0846" stroke="currentColor" stroke-linecap="square"/>`,
|
|
@@ -10,6 +8,7 @@ const icons = {
|
|
|
10
8
|
prompt: `<path d="M14.5841 12.0807H17.9193V2.91406H5.6276V6.2474M14.5859 6.2474H2.08594V15.4141H5.0026V17.4974L8.7526 15.4141H14.5859V6.2474Z" stroke="currentColor" stroke-linecap="square"/>`,
|
|
11
9
|
brain: `<path d="M13.332 8.7487C11.4911 8.7487 9.9987 7.25631 9.9987 5.41536M6.66536 11.2487C8.50631 11.2487 9.9987 12.7411 9.9987 14.582M9.9987 2.78209L9.9987 17.0658M16.004 15.0475C17.1255 14.5876 17.9154 13.4849 17.9154 12.1978C17.9154 11.3363 17.5615 10.5575 16.9913 9.9987C17.5615 9.43991 17.9154 8.66108 17.9154 7.79962C17.9154 6.21199 16.7136 4.90504 15.1702 4.73878C14.7858 3.21216 13.4039 2.08203 11.758 2.08203C11.1171 2.08203 10.5162 2.25337 9.9987 2.55275C9.48117 2.25337 8.88032 2.08203 8.23944 2.08203C6.59353 2.08203 5.21157 3.21216 4.82722 4.73878C3.28377 4.90504 2.08203 6.21199 2.08203 7.79962C2.08203 8.66108 2.43585 9.43991 3.00609 9.9987C2.43585 10.5575 2.08203 11.3363 2.08203 12.1978C2.08203 13.4849 2.87191 14.5876 3.99339 15.0475C4.46688 16.7033 5.9917 17.9154 7.79962 17.9154C8.61335 17.9154 9.36972 17.6698 9.9987 17.2488C10.6277 17.6698 11.384 17.9154 12.1978 17.9154C14.0057 17.9154 15.5305 16.7033 16.004 15.0475Z" stroke="currentColor"/>`,
|
|
12
10
|
fork: `<path d="M2.91602 7.91406L2.91602 2.91406H7.91602M12.0827 2.91406H17.0827L17.0827 7.91406M9.99935 9.9974L9.99935 17.0807M9.99935 9.9974L3.33268 3.33073M9.99935 9.9974L16.666 3.33073" stroke="currentColor" stroke-linecap="square"/>`,
|
|
11
|
+
"workspace-isolated": `<g transform="translate(2 2)"><path d="M10.5 10.5V5.5H5.5V10.5H10.5Z" fill="currentColor"/><rect x="2.5" y="2.5" width="11" height="11" stroke="currentColor"/></g>`,
|
|
13
12
|
"bullet-list": `<path d="M9.58329 13.7497H17.0833M9.58329 6.24967H17.0833M6.24996 6.24967C6.24996 7.17015 5.50377 7.91634 4.58329 7.91634C3.66282 7.91634 2.91663 7.17015 2.91663 6.24967C2.91663 5.3292 3.66282 4.58301 4.58329 4.58301C5.50377 4.58301 6.24996 5.3292 6.24996 6.24967ZM6.24996 13.7497C6.24996 14.6701 5.50377 15.4163 4.58329 15.4163C3.66282 15.4163 2.91663 14.6701 2.91663 13.7497C2.91663 12.8292 3.66282 12.083 4.58329 12.083C5.50377 12.083 6.24996 12.8292 6.24996 13.7497Z" stroke="currentColor" stroke-linecap="square"/>`,
|
|
14
13
|
"check-small": `<path d="M6.5 11.4412L8.97059 13.5L13.5 6.5" stroke="currentColor" stroke-linecap="square"/>`,
|
|
15
14
|
"chevron-down": `<path d="M6.6665 8.33325L9.99984 11.6666L13.3332 8.33325" stroke="currentColor" stroke-linecap="square"/>`,
|
|
@@ -103,79 +102,14 @@ const icons = {
|
|
|
103
102
|
link: `<path d="M2.08334 12.0833L1.72979 11.7298L1.37624 12.0833L1.72979 12.4369L2.08334 12.0833ZM7.91668 17.9167L7.56312 18.2702L7.91668 18.6238L8.27023 18.2702L7.91668 17.9167ZM17.9167 7.91666L18.2702 8.27022L18.6238 7.91666L18.2702 7.56311L17.9167 7.91666ZM12.0833 2.08333L12.4369 1.72977L12.0833 1.37622L11.7298 1.72977L12.0833 2.08333ZM8.39646 5.06311L8.0429 5.41666L8.75001 6.12377L9.10356 5.77021L8.75001 5.41666L8.39646 5.06311ZM5.77023 9.10355L6.12378 8.74999L5.41668 8.04289L5.06312 8.39644L5.41668 8.74999L5.77023 9.10355ZM14.2298 10.8964L13.8762 11.25L14.5833 11.9571L14.9369 11.6035L14.5833 11.25L14.2298 10.8964ZM11.6036 14.9369L11.9571 14.5833L11.25 13.8762L10.8965 14.2298L11.25 14.5833L11.6036 14.9369ZM7.14646 12.1464L6.7929 12.5L7.50001 13.2071L7.85356 12.8535L7.50001 12.5L7.14646 12.1464ZM12.8536 7.85355L13.2071 7.49999L12.5 6.79289L12.1465 7.14644L12.5 7.49999L12.8536 7.85355ZM2.08334 12.0833L1.72979 12.4369L7.56312 18.2702L7.91668 17.9167L8.27023 17.5631L2.4369 11.7298L2.08334 12.0833ZM17.9167 7.91666L18.2702 7.56311L12.4369 1.72977L12.0833 2.08333L11.7298 2.43688L17.5631 8.27022L17.9167 7.91666ZM12.0833 2.08333L11.7298 1.72977L8.39646 5.06311L8.75001 5.41666L9.10356 5.77021L12.4369 2.43688L12.0833 2.08333ZM5.41668 8.74999L5.06312 8.39644L1.72979 11.7298L2.08334 12.0833L2.4369 12.4369L5.77023 9.10355L5.41668 8.74999ZM14.5833 11.25L14.9369 11.6035L18.2702 8.27022L17.9167 7.91666L17.5631 7.56311L14.2298 10.8964L14.5833 11.25ZM7.91668 17.9167L8.27023 18.2702L11.6036 14.9369L11.25 14.5833L10.8965 14.2298L7.56312 17.5631L7.91668 17.9167ZM7.50001 12.5L7.85356 12.8535L12.8536 7.85355L12.5 7.49999L12.1465 7.14644L7.14646 12.1464L7.50001 12.5Z" fill="currentColor"/>`,
|
|
104
103
|
providers: `<path d="M10.0001 4.37562V2.875M13 4.37793V2.87793M7.00014 4.37793V2.875M10 17.1279V15.6279M13 17.1279V15.6279M7 17.1279V15.6279M15.625 13.0029H17.125M15.625 7.00293H17.125M15.625 10.0029H17.125M2.875 10.0029H4.375M2.875 13.0029H4.375M2.875 7.00293H4.375M4.375 4.37793H15.625V15.6279H4.375V4.37793ZM12.6241 10.0022C12.6241 11.4519 11.4488 12.6272 9.99908 12.6272C8.54934 12.6272 7.37408 11.4519 7.37408 10.0022C7.37408 8.55245 8.54934 7.3772 9.99908 7.3772C11.4488 7.3772 12.6241 8.55245 12.6241 10.0022Z" stroke="currentColor" stroke-linecap="square"/>`,
|
|
105
104
|
models: `<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5 10C12.2917 10 10 12.2917 10 17.5C10 12.2917 7.70833 10 2.5 10C7.70833 10 10 7.70833 10 2.5C10 7.70833 12.2917 10 17.5 10Z" stroke="currentColor"/>`,
|
|
105
|
+
appearance: `<path d="M2.707 14.707L14.707 2.707M2.707 9.06L9.06 2.707M2.707 3.413L3.413 2.707M8.354 14.707L14.707 8.354M14.000 14.706L14.706 14.000" stroke="currentColor" stroke-linecap="square"/>`,
|
|
106
|
+
notifications: `<path d="M15.389 7.278V9.611C15.389 10.593 15.389 11.389 15.389 11.389H11.833M6.056 11.389H2.5C2.5 11.389 2.5 10.593 2.5 9.611V4.278C2.5 3.296 2.5 2.5 2.5 2.5H9.945M6.056 11.389V13.611H8.944H11.833V11.389M6.056 11.389H11.833" stroke="currentColor"/><circle cx="14.5" cy="4.5" r="2" stroke="currentColor" fill="currentColor"/>`,
|
|
107
|
+
extensions: `<path d="M9.166 6.805V9.305M11.834 6.805V9.305M6.5 6.805V9.305M2.5 2.5V13.61H15.833V2.5H2.5Z" stroke="currentColor" stroke-linecap="square"/>`,
|
|
108
|
+
cube: `<path d="M10 2.5L16.5 6.25V13.75L10 17.5L3.5 13.75V6.25L10 2.5Z" stroke="currentColor"/><path d="M10 10L16.5 6.25M10 10V17.5M10 10L3.5 6.25" stroke="currentColor"/>`,
|
|
109
|
+
"post-skill": `<rect x="2.5" y="3.5" width="15" height="13" rx="1.5" stroke="currentColor"/><path d="M5.5 7.5H10.5M5.5 10.5H14.5" stroke="currentColor"/>`,
|
|
106
110
|
"arrow-undo-down": `<path d="M4.08333 11.0859L1.75 8.7526L4.08333 6.41927M2.33333 8.7526L12.5417 8.7526L12.5417 3.21094L7 3.21094" stroke="currentColor" stroke-width="1" stroke-linecap="square"/>`,
|
|
107
111
|
}
|
|
108
112
|
|
|
109
|
-
|
|
110
|
-
const symbol = (name: keyof typeof icons) => `opencode-icon-${name}`
|
|
111
|
-
let spriteInserted = false
|
|
112
|
-
|
|
113
|
-
function viewBox(name: keyof typeof icons) {
|
|
113
|
+
export function additionalIconViewBox(name: keyof typeof additionalIcons) {
|
|
114
114
|
return name === "magnifying-glass" || name === "arrow-undo-down" || name === "subagent" ? "0 0 16 16" : "0 0 20 20"
|
|
115
115
|
}
|
|
116
|
-
|
|
117
|
-
function ensureSprite() {
|
|
118
|
-
if (spriteInserted) return
|
|
119
|
-
if (typeof document === "undefined") return
|
|
120
|
-
if (document.getElementById(spriteID)) {
|
|
121
|
-
spriteInserted = true
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
const body = document.body as HTMLElement | null
|
|
125
|
-
if (!body) return
|
|
126
|
-
|
|
127
|
-
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg")
|
|
128
|
-
svg.id = spriteID
|
|
129
|
-
svg.setAttribute("aria-hidden", "true")
|
|
130
|
-
svg.setAttribute("width", "0")
|
|
131
|
-
svg.setAttribute("height", "0")
|
|
132
|
-
svg.style.position = "absolute"
|
|
133
|
-
svg.style.overflow = "hidden"
|
|
134
|
-
svg.innerHTML = Object.entries(icons)
|
|
135
|
-
.map(([name, path]) => {
|
|
136
|
-
const key = name as keyof typeof icons
|
|
137
|
-
return `<symbol id="${symbol(key)}" viewBox="${viewBox(key)}">${path}</symbol>`
|
|
138
|
-
})
|
|
139
|
-
.join("")
|
|
140
|
-
body.insertBefore(svg, body.firstChild)
|
|
141
|
-
spriteInserted = true
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export interface IconProps extends ComponentProps<"svg"> {
|
|
145
|
-
name: keyof typeof icons
|
|
146
|
-
size?: "small" | "normal" | "medium" | "large"
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function Icon(props: IconProps) {
|
|
150
|
-
const [local, others] = splitProps(props, ["name", "size", "class", "classList"])
|
|
151
|
-
onMount(ensureSprite)
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<div
|
|
155
|
-
data-component="icon"
|
|
156
|
-
data-size={local.size || "normal"}
|
|
157
|
-
data-directional={
|
|
158
|
-
local.name === "arrow-left" ||
|
|
159
|
-
local.name === "arrow-right" ||
|
|
160
|
-
local.name === "chevron-left" ||
|
|
161
|
-
local.name === "chevron-right"
|
|
162
|
-
? true
|
|
163
|
-
: undefined
|
|
164
|
-
}
|
|
165
|
-
>
|
|
166
|
-
<svg
|
|
167
|
-
data-slot="icon-svg"
|
|
168
|
-
classList={{
|
|
169
|
-
...local.classList,
|
|
170
|
-
[local.class ?? ""]: !!local.class,
|
|
171
|
-
}}
|
|
172
|
-
fill="none"
|
|
173
|
-
viewBox={viewBox(local.name)}
|
|
174
|
-
aria-hidden="true"
|
|
175
|
-
{...others}
|
|
176
|
-
>
|
|
177
|
-
<use href={`#${symbol(local.name)}`} />
|
|
178
|
-
</svg>
|
|
179
|
-
</div>
|
|
180
|
-
)
|
|
181
|
-
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { onMount, type ComponentProps, splitProps } from "solid-js"
|
|
2
|
+
import { additionalIcons, additionalIconViewBox } from "./additional-icons"
|
|
3
|
+
import "./icon.css"
|
|
2
4
|
|
|
5
|
+
// Consumers center the SVG viewport, so each icon must center its artwork within its viewBox.
|
|
3
6
|
const icons = {
|
|
4
7
|
edit: {
|
|
5
8
|
viewBox: "0 0 16 16",
|
|
@@ -17,6 +20,10 @@ const icons = {
|
|
|
17
20
|
viewBox: "0 0 16 16",
|
|
18
21
|
body: `<path d="M5.118 5.686V10.314M5.118 5.686C5.97 5.686 6.661 4.995 6.661 4.143C6.661 3.291 5.97 2.6 5.118 2.6C4.266 2.6 3.575 3.291 3.575 4.143C3.575 4.995 4.266 5.686 5.118 5.686ZM5.118 10.314C4.266 10.314 3.575 11.005 3.575 11.857C3.575 12.709 4.266 13.4 5.118 13.4C5.97 13.4 6.661 12.709 6.661 11.857M5.118 10.314C5.97 10.314 6.661 11.005 6.661 11.857M10.882 5.686C11.734 5.686 12.425 4.995 12.425 4.143C12.425 3.291 11.734 2.6 10.882 2.6C10.03 2.6 9.339 3.291 9.339 4.143C9.339 4.995 10.03 5.686 10.882 5.686ZM10.882 5.686V9.457C10.882 10.783 9.807 11.857 8.482 11.857H6.661" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>`,
|
|
19
22
|
},
|
|
23
|
+
"branch-out": {
|
|
24
|
+
viewBox: "0 0 16 16",
|
|
25
|
+
body: `<path d="M10.4225 3.35355L12.9024 5.83344L10.4225 8.31333" stroke="currentColor"/><path d="M1 12.2852H4.23042C4.89912 12.2852 5.52359 11.951 5.89452 11.3946L9.00783 6.72462C8.37877 6.16823 10.0032 5.83402 10.6719 5.83402H12.9024" stroke="currentColor"/><path d="M8.5 12.2852H14" stroke="currentColor" stroke-linejoin="round"/>`,
|
|
26
|
+
},
|
|
20
27
|
"grid-plus": {
|
|
21
28
|
viewBox: "0 0 16 16",
|
|
22
29
|
body: `<path d="M13.9948 11.668H9.32812M11.6641 9.33203V13.9987M6.66667 9.33203V13.9987H2V9.33203H6.66667ZM6.66667 2V6.66667H2V2H6.66667ZM13.9948 2V6.66667H9.32812V2H13.9948Z" stroke="currentColor" stroke-miterlimit="10" stroke-linecap="square"/>`,
|
|
@@ -121,6 +128,14 @@ const icons = {
|
|
|
121
128
|
viewBox: "0 0 20 20",
|
|
122
129
|
body: `<path d="M7 14.5H13M7 7.99512H10.0049M10.0049 7.99512H13M10.0049 7.99512V5M10.0049 7.99512V11M18 18V2L2 2L2 18H18Z" stroke="currentColor"/>`,
|
|
123
130
|
},
|
|
131
|
+
"window-analytics": {
|
|
132
|
+
viewBox: "0 0 16 16",
|
|
133
|
+
body: `<g transform="translate(1 2)"><path d="M7 4H11M7 8H11M0.5 0.5V11.5H13.5V0.5H0.5ZM3.5 3.5H4.5V4.5H3.5V3.5ZM3.5 7.5H4.5V8.5H3.5V7.5Z" stroke="currentColor" stroke-miterlimit="10" stroke-linecap="square"/></g>`,
|
|
134
|
+
},
|
|
135
|
+
trash: {
|
|
136
|
+
viewBox: "0 0 20 20",
|
|
137
|
+
body: `<path d="M4.58342 17.9134L4.58369 17.4134L4.22787 17.5384L4.22766 18.0384H4.58342V17.9134ZM15.4167 17.9134V18.0384H15.7725L15.7723 17.5384L15.4167 17.9134ZM2.08342 3.95508V3.45508H1.58342V3.95508H2.08342V4.45508V3.95508ZM17.9167 4.45508V4.95508H18.4167V4.45508H17.9167V3.95508V4.45508ZM4.16677 4.58008L3.66701 4.5996L4.22816 17.5379L4.72792 17.4934L5.22767 17.4489L4.66652 4.54055L4.16677 4.58008ZM4.58342 18.0384V17.9134H15.4167V18.0384V18.5384H4.58342V18.0384ZM15.4167 17.9134L15.8332 17.5379L16.2498 4.5996L15.7501 4.58008L15.2503 4.56055L14.8337 17.4989L15.4167 17.9134ZM15.8334 4.58008V4.08008H4.16677V4.58008V5.08008H15.8334V4.58008ZM2.08342 4.45508V4.95508H4.16677V4.58008V4.08008H2.08342V4.45508ZM15.8334 4.58008V5.08008H17.9167V4.45508V3.95508H15.8334V4.58008ZM6.83951 4.35149L7.432 4.55047C7.79251 3.47701 8.80699 2.70508 10.0001 2.70508V2.20508V1.70508C8.25392 1.70508 6.77335 2.83539 6.24702 4.15251L6.83951 4.35149ZM10.0001 2.20508V2.70508C11.1932 2.70508 12.2077 3.47701 12.5682 4.55047L13.1607 4.35149L13.7532 4.15251C13.2269 2.83539 11.7463 1.70508 10.0001 1.70508V2.20508Z" fill="currentColor"/>`,
|
|
138
|
+
},
|
|
124
139
|
"outline-sliders": {
|
|
125
140
|
viewBox: "0 0 16 16",
|
|
126
141
|
body: `<path d="M11.7779 4.66675H14.4446M11.7779 4.66675C11.7779 5.77132 10.8825 6.66675 9.77789 6.66675C8.67332 6.66675 7.77789 5.77132 7.77789 4.66675M11.7779 4.66675C11.7779 3.56218 10.8825 2.66675 9.77789 2.66675C8.67332 2.66675 7.77789 3.56218 7.77789 4.66675M1.55566 4.66675H7.77789M4.22233 11.3334H1.55566M4.22233 11.3334C4.22233 12.438 5.11776 13.3334 6.22233 13.3334C7.3269 13.3334 8.22233 12.438 8.22233 11.3334M4.22233 11.3334C4.22233 10.2288 5.11776 9.33341 6.22233 9.33341C7.3269 9.33341 8.22233 10.2288 8.22233 11.3334M14.4446 11.3334H8.22233" stroke="currentColor"/>`,
|
|
@@ -151,10 +166,19 @@ const icons = {
|
|
|
151
166
|
},
|
|
152
167
|
}
|
|
153
168
|
|
|
169
|
+
type IconName = keyof typeof icons | keyof typeof additionalIcons
|
|
170
|
+
|
|
154
171
|
const spriteID = "opencode-v2-icon-sprite"
|
|
155
|
-
const symbol = (name:
|
|
172
|
+
const symbol = (name: IconName) => `opencode-v2-icon-${name}`
|
|
156
173
|
let spriteInserted = false
|
|
157
174
|
|
|
175
|
+
function getIcon(name: IconName) {
|
|
176
|
+
const icon = icons[name as keyof typeof icons]
|
|
177
|
+
if (icon) return icon
|
|
178
|
+
const body = additionalIcons[name as keyof typeof additionalIcons]
|
|
179
|
+
return { body, viewBox: additionalIconViewBox(name as keyof typeof additionalIcons) }
|
|
180
|
+
}
|
|
181
|
+
|
|
158
182
|
function ensureSprite() {
|
|
159
183
|
if (spriteInserted) return
|
|
160
184
|
if (typeof document === "undefined") return
|
|
@@ -170,25 +194,26 @@ function ensureSprite() {
|
|
|
170
194
|
svg.setAttribute("height", "0")
|
|
171
195
|
svg.style.position = "absolute"
|
|
172
196
|
svg.style.overflow = "hidden"
|
|
173
|
-
svg.innerHTML = Object.
|
|
174
|
-
.map(
|
|
175
|
-
([name, icon]) =>
|
|
176
|
-
`<symbol id="${symbol(name as keyof typeof icons)}" viewBox="${icon.viewBox}">${icon.body}</symbol>`,
|
|
177
|
-
)
|
|
197
|
+
svg.innerHTML = Array.from(new Set<IconName>([...Object.keys(additionalIcons), ...Object.keys(icons)] as IconName[]))
|
|
198
|
+
.map((name) => `<symbol id="${symbol(name)}" viewBox="${getIcon(name).viewBox}">${getIcon(name).body}</symbol>`)
|
|
178
199
|
.join("")
|
|
179
200
|
document.body.insertBefore(svg, document.body.firstChild)
|
|
180
201
|
spriteInserted = true
|
|
181
202
|
}
|
|
182
203
|
|
|
183
204
|
export interface IconProps extends ComponentProps<"svg"> {
|
|
184
|
-
name:
|
|
205
|
+
name: IconName | (string & {})
|
|
185
206
|
size?: "small" | "normal" | "large"
|
|
186
207
|
}
|
|
187
208
|
|
|
188
209
|
export function Icon(props: IconProps) {
|
|
189
210
|
const [split, rest] = splitProps(props, ["name", "size"])
|
|
190
|
-
const iconName = () =>
|
|
191
|
-
|
|
211
|
+
const iconName = (): IconName => {
|
|
212
|
+
if (icons[split.name as keyof typeof icons]) return split.name as keyof typeof icons
|
|
213
|
+
if (additionalIcons[split.name as keyof typeof additionalIcons]) return split.name as keyof typeof additionalIcons
|
|
214
|
+
return "plus"
|
|
215
|
+
}
|
|
216
|
+
const icon = () => getIcon(iconName())
|
|
192
217
|
const pixelSize = split.size === "small" ? 14 : split.size === "large" ? 20 : 16
|
|
193
218
|
onMount(ensureSprite)
|
|
194
219
|
|
|
@@ -196,6 +221,14 @@ export function Icon(props: IconProps) {
|
|
|
196
221
|
<svg
|
|
197
222
|
{...rest}
|
|
198
223
|
data-slot="icon-svg"
|
|
224
|
+
data-directional={
|
|
225
|
+
iconName() === "arrow-left" ||
|
|
226
|
+
iconName() === "arrow-right" ||
|
|
227
|
+
iconName() === "chevron-left" ||
|
|
228
|
+
iconName() === "chevron-right"
|
|
229
|
+
? ""
|
|
230
|
+
: undefined
|
|
231
|
+
}
|
|
199
232
|
width={pixelSize}
|
|
200
233
|
height={pixelSize}
|
|
201
234
|
viewBox={icon().viewBox}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type ComponentProps, splitProps } from "solid-js"
|
|
2
|
-
import "./divider
|
|
2
|
+
import "./divider.css"
|
|
3
3
|
|
|
4
|
-
export interface
|
|
4
|
+
export interface DividerProps extends ComponentProps<"div"> {}
|
|
5
5
|
|
|
6
|
-
export function
|
|
6
|
+
export function Divider(props: DividerProps) {
|
|
7
7
|
const [local, rest] = splitProps(props, ["class", "classList"])
|
|
8
8
|
return (
|
|
9
9
|
<div
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
:dir(rtl) [data-slot="menu-v2-item-chevron"] {
|
|
35
|
+
transform: scaleX(-1);
|
|
36
|
+
}
|
|
37
|
+
|
|
34
38
|
[data-component="menu-v2-item"] {
|
|
35
39
|
--menu-v2-fg: var(--v2-text-text-base);
|
|
36
40
|
--menu-v2-fg-muted: var(--v2-text-text-faint);
|
|
@@ -178,6 +182,123 @@
|
|
|
178
182
|
font-variant-numeric: tabular-nums;
|
|
179
183
|
}
|
|
180
184
|
|
|
185
|
+
[data-component="menu-v2-content"][data-appearance="standard"] {
|
|
186
|
+
min-width: 8rem;
|
|
187
|
+
padding: 4px;
|
|
188
|
+
overflow: hidden;
|
|
189
|
+
border: 1px solid color-mix(in oklch, var(--border-base) 50%, transparent);
|
|
190
|
+
border-radius: var(--radius-md);
|
|
191
|
+
background: var(--surface-raised-stronger-non-alpha);
|
|
192
|
+
background-clip: padding-box;
|
|
193
|
+
box-shadow: var(--shadow-md);
|
|
194
|
+
z-index: 60;
|
|
195
|
+
animation: dropdown-menu-open 150ms ease-out;
|
|
196
|
+
|
|
197
|
+
&[data-closed] {
|
|
198
|
+
animation: dropdown-menu-close 150ms ease-out;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
[data-component="menu-v2-item"] {
|
|
202
|
+
position: relative;
|
|
203
|
+
height: auto;
|
|
204
|
+
min-height: 0;
|
|
205
|
+
padding: 4px 8px;
|
|
206
|
+
border-radius: var(--radius-sm);
|
|
207
|
+
color: var(--text-strong);
|
|
208
|
+
font-family: var(--font-family-sans);
|
|
209
|
+
font-size: var(--font-size-small);
|
|
210
|
+
font-weight: var(--font-weight-medium);
|
|
211
|
+
line-height: var(--line-height-large);
|
|
212
|
+
letter-spacing: var(--letter-spacing-normal);
|
|
213
|
+
font-variant-numeric: normal;
|
|
214
|
+
-webkit-font-smoothing: auto;
|
|
215
|
+
text-rendering: auto;
|
|
216
|
+
|
|
217
|
+
[data-slot="menu-v2-item-content"] {
|
|
218
|
+
font-family: inherit;
|
|
219
|
+
font-size: inherit;
|
|
220
|
+
font-weight: inherit;
|
|
221
|
+
line-height: inherit;
|
|
222
|
+
letter-spacing: inherit;
|
|
223
|
+
color: inherit;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
&[data-highlighted] {
|
|
227
|
+
background: var(--surface-raised-base-hover);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
&[data-disabled] {
|
|
231
|
+
color: var(--text-weak);
|
|
232
|
+
opacity: 1;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
&[data-checked] {
|
|
236
|
+
padding-inline-end: 28px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
&[data-checked] [data-slot="menu-v2-item-content"] {
|
|
240
|
+
font-weight: inherit;
|
|
241
|
+
color: inherit;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
[data-slot="menu-v2-item-indicator"] {
|
|
245
|
+
position: absolute;
|
|
246
|
+
inset-inline-end: 8px;
|
|
247
|
+
top: 50%;
|
|
248
|
+
width: 16px;
|
|
249
|
+
height: 16px;
|
|
250
|
+
transform: translateY(-50%);
|
|
251
|
+
color: var(--icon-base);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
[data-slot="menu-v2-item-chevron"] {
|
|
255
|
+
margin-inline-start: auto;
|
|
256
|
+
color: var(--icon-base);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
[data-slot="menu-v2-separator"] {
|
|
261
|
+
width: calc(100% + 8px);
|
|
262
|
+
height: 1px;
|
|
263
|
+
margin: 4px -4px;
|
|
264
|
+
background: var(--border-weak-base);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
[data-slot="menu-v2-group-label"] {
|
|
268
|
+
height: auto;
|
|
269
|
+
padding: 4px 8px;
|
|
270
|
+
color: var(--text-weak);
|
|
271
|
+
font-family: var(--font-family-sans);
|
|
272
|
+
font-size: var(--font-size-x-small);
|
|
273
|
+
font-weight: var(--font-weight-medium);
|
|
274
|
+
line-height: var(--line-height-large);
|
|
275
|
+
letter-spacing: var(--letter-spacing-normal);
|
|
276
|
+
font-variant-numeric: normal;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
@keyframes dropdown-menu-open {
|
|
281
|
+
from {
|
|
282
|
+
opacity: 0;
|
|
283
|
+
transform: scale(0.96);
|
|
284
|
+
}
|
|
285
|
+
to {
|
|
286
|
+
opacity: 1;
|
|
287
|
+
transform: scale(1);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
@keyframes dropdown-menu-close {
|
|
292
|
+
from {
|
|
293
|
+
opacity: 1;
|
|
294
|
+
transform: scale(1);
|
|
295
|
+
}
|
|
296
|
+
to {
|
|
297
|
+
opacity: 0;
|
|
298
|
+
transform: scale(0.96);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
181
302
|
@keyframes menu-v2-in {
|
|
182
303
|
from {
|
|
183
304
|
opacity: 0;
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { DropdownMenu } from "@kobalte/core/dropdown-menu"
|
|
2
2
|
import { ContextMenu } from "@kobalte/core/context-menu"
|
|
3
|
-
import {
|
|
4
|
-
|
|
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"
|
|
5
15
|
|
|
6
16
|
const ChevronRight: Component = () => (
|
|
7
17
|
<svg
|
|
@@ -29,6 +39,18 @@ const CheckMark: Component = () => (
|
|
|
29
39
|
</svg>
|
|
30
40
|
)
|
|
31
41
|
|
|
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
|
+
|
|
32
54
|
function ItemBody(
|
|
33
55
|
props: ParentProps<{
|
|
34
56
|
shortcut?: JSX.Element | string
|
|
@@ -46,15 +68,21 @@ function ItemBody(
|
|
|
46
68
|
)
|
|
47
69
|
}
|
|
48
70
|
|
|
49
|
-
export interface
|
|
71
|
+
export interface MenuItemProps extends ComponentProps<typeof DropdownMenu.Item> {
|
|
50
72
|
shortcut?: JSX.Element | string
|
|
51
73
|
badge?: JSX.Element | string
|
|
52
74
|
}
|
|
53
75
|
|
|
54
|
-
function
|
|
76
|
+
function MenuItem(props: ParentProps<MenuItemProps>) {
|
|
77
|
+
const ctx = useMenuContext()
|
|
55
78
|
const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
|
|
56
79
|
return (
|
|
57
|
-
<DropdownMenu.Item
|
|
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
|
+
>
|
|
58
86
|
<ItemBody shortcut={s.shortcut} badge={s.badge}>
|
|
59
87
|
{s.children}
|
|
60
88
|
</ItemBody>
|
|
@@ -62,17 +90,19 @@ function MenuV2Item(props: ParentProps<MenuV2ItemProps>) {
|
|
|
62
90
|
)
|
|
63
91
|
}
|
|
64
92
|
|
|
65
|
-
export interface
|
|
93
|
+
export interface MenuCheckboxItemProps extends ComponentProps<typeof DropdownMenu.CheckboxItem> {
|
|
66
94
|
shortcut?: JSX.Element | string
|
|
67
95
|
badge?: JSX.Element | string
|
|
68
96
|
}
|
|
69
97
|
|
|
70
|
-
function
|
|
98
|
+
function MenuCheckboxItem(props: ParentProps<MenuCheckboxItemProps>) {
|
|
99
|
+
const ctx = useMenuContext()
|
|
71
100
|
const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
|
|
72
101
|
return (
|
|
73
102
|
<DropdownMenu.CheckboxItem
|
|
74
103
|
{...r}
|
|
75
104
|
data-component="menu-v2-item"
|
|
105
|
+
data-appearance={ctx.appearance()}
|
|
76
106
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
77
107
|
>
|
|
78
108
|
<ItemBody
|
|
@@ -90,17 +120,19 @@ function MenuV2CheckboxItem(props: ParentProps<MenuV2CheckboxItemProps>) {
|
|
|
90
120
|
)
|
|
91
121
|
}
|
|
92
122
|
|
|
93
|
-
export interface
|
|
123
|
+
export interface MenuRadioItemProps extends ComponentProps<typeof DropdownMenu.RadioItem> {
|
|
94
124
|
shortcut?: JSX.Element | string
|
|
95
125
|
badge?: JSX.Element | string
|
|
96
126
|
}
|
|
97
127
|
|
|
98
|
-
function
|
|
128
|
+
function MenuRadioItem(props: ParentProps<MenuRadioItemProps>) {
|
|
129
|
+
const ctx = useMenuContext()
|
|
99
130
|
const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
|
|
100
131
|
return (
|
|
101
132
|
<DropdownMenu.RadioItem
|
|
102
133
|
{...r}
|
|
103
134
|
data-component="menu-v2-item"
|
|
135
|
+
data-appearance={ctx.appearance()}
|
|
104
136
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
105
137
|
>
|
|
106
138
|
<ItemBody
|
|
@@ -118,17 +150,19 @@ function MenuV2RadioItem(props: ParentProps<MenuV2RadioItemProps>) {
|
|
|
118
150
|
)
|
|
119
151
|
}
|
|
120
152
|
|
|
121
|
-
export interface
|
|
153
|
+
export interface MenuSubTriggerProps extends ComponentProps<typeof DropdownMenu.SubTrigger> {
|
|
122
154
|
shortcut?: JSX.Element | string
|
|
123
155
|
badge?: JSX.Element | string
|
|
124
156
|
}
|
|
125
157
|
|
|
126
|
-
function
|
|
158
|
+
function MenuSubTrigger(props: ParentProps<MenuSubTriggerProps>) {
|
|
159
|
+
const ctx = useMenuContext()
|
|
127
160
|
const [s, r] = splitProps(props, ["class", "classList", "children", "shortcut", "badge"])
|
|
128
161
|
return (
|
|
129
162
|
<DropdownMenu.SubTrigger
|
|
130
163
|
{...r}
|
|
131
164
|
data-component="menu-v2-item"
|
|
165
|
+
data-appearance={ctx.appearance()}
|
|
132
166
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
133
167
|
>
|
|
134
168
|
<ItemBody shortcut={s.shortcut} badge={s.badge} trailing={<ChevronRight />}>
|
|
@@ -138,88 +172,118 @@ function MenuV2SubTrigger(props: ParentProps<MenuV2SubTriggerProps>) {
|
|
|
138
172
|
)
|
|
139
173
|
}
|
|
140
174
|
|
|
141
|
-
function
|
|
175
|
+
function MenuSubContent(props: ComponentProps<typeof DropdownMenu.SubContent>) {
|
|
176
|
+
const ctx = useMenuContext()
|
|
142
177
|
const [s, r] = splitProps(props, ["class", "classList"])
|
|
143
178
|
return (
|
|
144
179
|
<DropdownMenu.SubContent
|
|
145
180
|
{...r}
|
|
146
181
|
data-component="menu-v2-content"
|
|
182
|
+
data-appearance={ctx.appearance()}
|
|
147
183
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
148
184
|
/>
|
|
149
185
|
)
|
|
150
186
|
}
|
|
151
187
|
|
|
152
|
-
function
|
|
188
|
+
function MenuGroupLabel(props: ComponentProps<typeof DropdownMenu.GroupLabel>) {
|
|
189
|
+
const ctx = useMenuContext()
|
|
153
190
|
const [s, r] = splitProps(props, ["class", "classList"])
|
|
154
191
|
return (
|
|
155
192
|
<DropdownMenu.GroupLabel
|
|
156
193
|
{...r}
|
|
157
194
|
data-slot="menu-v2-group-label"
|
|
195
|
+
data-appearance={ctx.appearance()}
|
|
158
196
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
159
197
|
/>
|
|
160
198
|
)
|
|
161
199
|
}
|
|
162
200
|
|
|
163
|
-
function
|
|
201
|
+
function MenuSeparator(props: ComponentProps<typeof DropdownMenu.Separator>) {
|
|
202
|
+
const ctx = useMenuContext()
|
|
164
203
|
const [s, r] = splitProps(props, ["class", "classList"])
|
|
165
204
|
return (
|
|
166
205
|
<DropdownMenu.Separator
|
|
167
206
|
{...r}
|
|
168
207
|
data-slot="menu-v2-separator"
|
|
208
|
+
data-appearance={ctx.appearance()}
|
|
169
209
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
170
210
|
/>
|
|
171
211
|
)
|
|
172
212
|
}
|
|
173
213
|
|
|
174
|
-
function
|
|
214
|
+
function MenuContent(props: ComponentProps<typeof DropdownMenu.Content>) {
|
|
215
|
+
const ctx = useMenuContext()
|
|
175
216
|
const [s, r] = splitProps(props, ["class", "classList"])
|
|
176
217
|
return (
|
|
177
218
|
<DropdownMenu.Content
|
|
178
219
|
{...r}
|
|
179
220
|
data-component="menu-v2-content"
|
|
221
|
+
data-appearance={ctx.appearance()}
|
|
180
222
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
181
223
|
/>
|
|
182
224
|
)
|
|
183
225
|
}
|
|
184
226
|
|
|
185
|
-
|
|
186
|
-
|
|
227
|
+
export interface MenuProps extends ComponentProps<typeof DropdownMenu> {
|
|
228
|
+
appearance?: MenuAppearance
|
|
187
229
|
}
|
|
188
230
|
|
|
189
|
-
function
|
|
190
|
-
|
|
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
|
+
)
|
|
191
253
|
}
|
|
192
254
|
|
|
193
|
-
function
|
|
255
|
+
function MenuContextContent(props: ComponentProps<typeof ContextMenu.Content>) {
|
|
256
|
+
const ctx = useMenuContext()
|
|
194
257
|
const [s, r] = splitProps(props, ["class", "classList"])
|
|
195
258
|
return (
|
|
196
259
|
<ContextMenu.Content
|
|
197
260
|
{...r}
|
|
198
261
|
data-component="menu-v2-content"
|
|
262
|
+
data-appearance={ctx.appearance()}
|
|
199
263
|
classList={{ ...s.classList, [s.class ?? ""]: !!s.class }}
|
|
200
264
|
/>
|
|
201
265
|
)
|
|
202
266
|
}
|
|
203
267
|
|
|
204
|
-
const
|
|
268
|
+
const MenuContext = Object.assign(MenuContextRoot, {
|
|
205
269
|
Trigger: ContextMenu.Trigger,
|
|
206
270
|
Portal: ContextMenu.Portal,
|
|
207
|
-
Content:
|
|
271
|
+
Content: MenuContextContent,
|
|
208
272
|
})
|
|
209
273
|
|
|
210
|
-
export const
|
|
274
|
+
export const Menu = Object.assign(MenuRoot, {
|
|
211
275
|
Trigger: DropdownMenu.Trigger,
|
|
212
276
|
Portal: DropdownMenu.Portal,
|
|
213
|
-
Content:
|
|
214
|
-
Item:
|
|
215
|
-
CheckboxItem:
|
|
277
|
+
Content: MenuContent,
|
|
278
|
+
Item: MenuItem,
|
|
279
|
+
CheckboxItem: MenuCheckboxItem,
|
|
216
280
|
RadioGroup: DropdownMenu.RadioGroup,
|
|
217
|
-
RadioItem:
|
|
281
|
+
RadioItem: MenuRadioItem,
|
|
218
282
|
Group: DropdownMenu.Group,
|
|
219
|
-
GroupLabel:
|
|
220
|
-
Separator:
|
|
283
|
+
GroupLabel: MenuGroupLabel,
|
|
284
|
+
Separator: MenuSeparator,
|
|
221
285
|
Sub: DropdownMenu.Sub,
|
|
222
|
-
SubTrigger:
|
|
223
|
-
SubContent:
|
|
224
|
-
Context:
|
|
286
|
+
SubTrigger: MenuSubTrigger,
|
|
287
|
+
SubContent: MenuSubContent,
|
|
288
|
+
Context: MenuContext,
|
|
225
289
|
})
|