@adea-ai/ui 0.61.0 → 0.62.0
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/README.md +44 -6
- package/dist/LICENSE +201 -0
- package/dist/NOTICE +50 -0
- package/dist/components/composites/account-menu/index.js +2 -0
- package/dist/components/composites/list-row/index.js +2 -0
- package/dist/components/composites/settings/index.js +2 -0
- package/dist/components/composites/stat/index.js +2 -0
- package/dist/components/composites/update-dialog/index.js +2 -0
- package/dist/components/composites/workspace-mark/index.js +2 -0
- package/dist/components/conversation/index.js +6 -0
- package/dist/components/layout/app-shell/index.js +2 -0
- package/dist/components/layout/page/index.js +2 -0
- package/dist/components/layout/panel/index.js +2 -0
- package/dist/components/layout/side-rail/index.js +3 -0
- package/dist/components/layout/sidebar-nav/index.js +2 -0
- package/dist/components/layout/status-bar/index.js +2 -0
- package/dist/components/layout/top-bar/index.js +2 -0
- package/dist/components/motion/index.js +2 -2
- package/dist/components/theme/index.js +5 -0
- package/dist/components/ui/accordion/index.js +2 -0
- package/dist/components/ui/alert/index.js +2 -0
- package/dist/components/ui/alert-dialog/index.js +2 -0
- package/dist/components/ui/aspect-ratio/index.js +2 -0
- package/dist/components/ui/avatar/index.js +2 -0
- package/dist/components/ui/badge/index.js +2 -0
- package/dist/components/ui/board/index.js +2 -0
- package/dist/components/ui/breadcrumb/index.js +2 -0
- package/dist/components/ui/button/index.js +2 -0
- package/dist/components/ui/button-group/index.js +2 -0
- package/dist/components/ui/calendar/index.js +2 -0
- package/dist/components/ui/card/index.js +2 -0
- package/dist/components/ui/carousel/index.js +2 -0
- package/dist/components/ui/chart/index.js +2 -0
- package/dist/components/ui/checkbox/index.js +2 -0
- package/dist/components/ui/code-block/index.js +2 -0
- package/dist/components/ui/collapsible/index.js +2 -0
- package/dist/components/ui/combobox/index.js +2 -0
- package/dist/components/ui/command/index.js +2 -0
- package/dist/components/ui/context-menu/index.js +2 -0
- package/dist/components/ui/detail-panel/index.js +2 -0
- package/dist/components/ui/dialog/index.js +2 -0
- package/dist/components/ui/diff-block/index.js +2 -0
- package/dist/components/ui/drawer/index.js +2 -0
- package/dist/components/ui/dropdown-menu/index.js +2 -0
- package/dist/components/ui/empty/index.js +2 -0
- package/dist/components/ui/entity-icon/index.js +2 -0
- package/dist/components/ui/field/index.js +2 -0
- package/dist/components/ui/hover-card/index.js +2 -0
- package/dist/components/ui/input/index.js +2 -0
- package/dist/components/ui/input-group/index.js +2 -0
- package/dist/components/ui/input-otp/index.js +2 -0
- package/dist/components/ui/item/index.js +2 -0
- package/dist/components/ui/kbd/index.js +2 -0
- package/dist/components/ui/label/index.js +2 -0
- package/dist/components/ui/menubar/index.js +2 -0
- package/dist/components/ui/modal-dialog/index.js +2 -0
- package/dist/components/ui/navigation-menu/index.js +2 -0
- package/dist/components/ui/pagination/index.js +2 -0
- package/dist/components/ui/popover/index.js +2 -0
- package/dist/components/ui/progress/index.js +2 -0
- package/dist/components/ui/radio-group/index.js +2 -0
- package/dist/components/ui/resizable/index.js +2 -0
- package/dist/components/ui/scroll-area/index.js +2 -0
- package/dist/components/ui/select/index.js +2 -0
- package/dist/components/ui/separator/index.js +2 -0
- package/dist/components/ui/sheet/index.js +2 -0
- package/dist/components/ui/skeleton/index.js +2 -0
- package/dist/components/ui/slider/index.js +2 -0
- package/dist/components/ui/spinner/index.js +2 -0
- package/dist/components/ui/status-chip/index.js +2 -0
- package/dist/components/ui/switch/index.js +2 -0
- package/dist/components/ui/table/index.js +2 -0
- package/dist/components/ui/tabs/index.js +2 -0
- package/dist/components/ui/textarea/index.js +2 -0
- package/dist/components/ui/toast/index.js +2 -0
- package/dist/components/ui/toggle/index.js +2 -0
- package/dist/components/ui/toggle-group/index.js +2 -0
- package/dist/components/ui/tooltip/index.js +2 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/r/accordion.json +3 -1
- package/dist/r/account-menu.json +2 -1
- package/dist/r/alert-dialog.json +3 -1
- package/dist/r/alert.json +3 -1
- package/dist/r/app-shell.json +3 -1
- package/dist/r/aspect-ratio.json +3 -1
- package/dist/r/avatar.json +3 -1
- package/dist/r/badge.json +3 -1
- package/dist/r/board.json +3 -1
- package/dist/r/breadcrumb.json +3 -1
- package/dist/r/button-group.json +2 -1
- package/dist/r/button.json +3 -1
- package/dist/r/calendar.json +2 -1
- package/dist/r/card.json +3 -1
- package/dist/r/carousel.json +2 -1
- package/dist/r/chart.json +3 -1
- package/dist/r/checkbox.json +3 -1
- package/dist/r/code-block.json +2 -1
- package/dist/r/collapsible.json +3 -1
- package/dist/r/combobox.json +3 -1
- package/dist/r/command.json +3 -1
- package/dist/r/context-menu.json +3 -1
- package/dist/r/conversation.json +2 -1
- package/dist/r/detail-panel.json +2 -1
- package/dist/r/dialog.json +3 -1
- package/dist/r/diff-block.json +3 -1
- package/dist/r/drawer.json +3 -1
- package/dist/r/dropdown-menu.json +3 -1
- package/dist/r/empty.json +3 -1
- package/dist/r/entity-icon.json +3 -1
- package/dist/r/field.json +3 -1
- package/dist/r/hover-card.json +3 -1
- package/dist/r/input-group.json +3 -1
- package/dist/r/input-otp.json +3 -1
- package/dist/r/input.json +3 -1
- package/dist/r/item.json +3 -1
- package/dist/r/kbd.json +3 -1
- package/dist/r/label.json +3 -1
- package/dist/r/lib.json +50 -0
- package/dist/r/list-row.json +3 -1
- package/dist/r/menubar.json +3 -1
- package/dist/r/modal-dialog.json +2 -1
- package/dist/r/motion.json +22 -0
- package/dist/r/navigation-menu.json +3 -1
- package/dist/r/page.json +3 -1
- package/dist/r/pagination.json +3 -1
- package/dist/r/panel.json +3 -1
- package/dist/r/popover.json +3 -1
- package/dist/r/progress.json +3 -1
- package/dist/r/radio-group.json +3 -1
- package/dist/r/registry.json +320 -73
- package/dist/r/resizable.json +3 -1
- package/dist/r/scroll-area.json +3 -1
- package/dist/r/select.json +3 -1
- package/dist/r/separator.json +3 -1
- package/dist/r/settings.json +3 -1
- package/dist/r/sheet.json +2 -1
- package/dist/r/side-rail.json +3 -1
- package/dist/r/sidebar-nav.json +3 -1
- package/dist/r/skeleton.json +3 -1
- package/dist/r/slider.json +3 -1
- package/dist/r/spinner.json +3 -1
- package/dist/r/src/components/composites/account-menu/account-menu.tsx +150 -0
- package/dist/r/src/components/composites/account-menu/index.ts +1 -0
- package/dist/r/src/components/composites/list-row/index.ts +1 -0
- package/dist/r/src/components/composites/list-row/list-row.tsx +116 -0
- package/dist/r/src/components/composites/settings/index.ts +1 -0
- package/dist/r/src/components/composites/settings/settings.tsx +142 -0
- package/dist/r/src/components/composites/stat/index.ts +9 -0
- package/dist/r/src/components/composites/stat/stat.tsx +155 -0
- package/dist/r/src/components/composites/update-dialog/index.ts +7 -0
- package/dist/r/src/components/composites/update-dialog/update-dialog.tsx +529 -0
- package/dist/r/src/components/composites/workspace-mark/index.ts +1 -0
- package/dist/r/src/components/composites/workspace-mark/workspace-mark.tsx +72 -0
- package/dist/r/src/components/conversation/conversation-avatar.tsx +60 -0
- package/dist/r/src/components/conversation/conversation-surface.tsx +107 -0
- package/dist/r/src/components/conversation/index.ts +25 -0
- package/dist/r/src/components/conversation/message-composer.tsx +239 -0
- package/dist/r/src/components/conversation/message-row.tsx +387 -0
- package/dist/r/src/components/conversation/thread-panel.tsx +141 -0
- package/dist/r/src/components/layout/app-shell/app-shell.tsx +92 -0
- package/dist/r/src/components/layout/app-shell/index.ts +1 -0
- package/dist/r/src/components/layout/page/index.ts +9 -0
- package/dist/r/src/components/layout/page/page.tsx +122 -0
- package/dist/r/src/components/layout/panel/index.ts +12 -0
- package/dist/r/src/components/layout/panel/panel.tsx +166 -0
- package/dist/r/src/components/layout/side-rail/index.ts +12 -0
- package/dist/r/src/components/layout/side-rail/side-rail-context.ts +42 -0
- package/dist/r/src/components/layout/side-rail/side-rail.tsx +405 -0
- package/dist/r/src/components/layout/sidebar-nav/index.ts +14 -0
- package/dist/r/src/components/layout/sidebar-nav/sidebar-nav.tsx +244 -0
- package/dist/r/src/components/layout/status-bar/index.ts +1 -0
- package/dist/r/src/components/layout/status-bar/status-bar.tsx +73 -0
- package/dist/r/src/components/layout/top-bar/index.ts +10 -0
- package/dist/r/src/components/layout/top-bar/top-bar.tsx +166 -0
- package/dist/r/src/components/motion/index.ts +2 -0
- package/dist/r/src/components/motion/presence.tsx +32 -0
- package/dist/r/src/components/theme/appearance-panel.tsx +179 -0
- package/dist/r/src/components/theme/index.ts +22 -0
- package/dist/r/src/components/theme/theme-picker.tsx +174 -0
- package/dist/r/src/components/theme/theme-provider.tsx +309 -0
- package/dist/r/src/components/theme/theme-toggle.tsx +64 -0
- package/dist/r/src/components/ui/accordion/accordion.tsx +66 -0
- package/dist/r/src/components/ui/accordion/index.ts +1 -0
- package/dist/r/src/components/ui/alert/alert.tsx +95 -0
- package/dist/r/src/components/ui/alert/index.ts +1 -0
- package/dist/r/src/components/ui/alert-dialog/alert-dialog.tsx +176 -0
- package/dist/r/src/components/ui/alert-dialog/index.ts +13 -0
- package/dist/r/src/components/ui/aspect-ratio/aspect-ratio.tsx +38 -0
- package/dist/r/src/components/ui/aspect-ratio/index.ts +1 -0
- package/dist/r/src/components/ui/avatar/avatar.tsx +114 -0
- package/dist/r/src/components/ui/avatar/index.ts +9 -0
- package/dist/r/src/components/ui/badge/badge.tsx +59 -0
- package/dist/r/src/components/ui/badge/index.ts +1 -0
- package/dist/r/src/components/ui/board/board.tsx +254 -0
- package/dist/r/src/components/ui/board/index.ts +10 -0
- package/dist/r/src/components/ui/breadcrumb/breadcrumb.tsx +117 -0
- package/dist/r/src/components/ui/breadcrumb/index.ts +9 -0
- package/dist/r/src/components/ui/button/button.tsx +89 -0
- package/dist/r/src/components/ui/button/index.ts +1 -0
- package/dist/r/src/components/ui/button-group/button-group.tsx +92 -0
- package/dist/r/src/components/ui/button-group/index.ts +6 -0
- package/dist/r/src/components/ui/calendar/calendar.tsx +277 -0
- package/dist/r/src/components/ui/calendar/index.ts +1 -0
- package/dist/r/src/components/ui/card/card.tsx +82 -0
- package/dist/r/src/components/ui/card/index.ts +10 -0
- package/dist/r/src/components/ui/carousel/carousel.tsx +209 -0
- package/dist/r/src/components/ui/carousel/index.ts +1 -0
- package/dist/r/src/components/ui/chart/chart.tsx +413 -0
- package/dist/r/src/components/ui/chart/index.ts +17 -0
- package/dist/r/src/components/ui/checkbox/checkbox.tsx +99 -0
- package/dist/r/src/components/ui/checkbox/index.ts +1 -0
- package/dist/r/src/components/ui/code-block/code-block.tsx +238 -0
- package/dist/r/src/components/ui/code-block/index.ts +1 -0
- package/dist/r/src/components/ui/collapsible/collapsible.tsx +54 -0
- package/dist/r/src/components/ui/collapsible/index.ts +1 -0
- package/dist/r/src/components/ui/combobox/combobox.tsx +142 -0
- package/dist/r/src/components/ui/combobox/index.ts +10 -0
- package/dist/r/src/components/ui/command/command.tsx +214 -0
- package/dist/r/src/components/ui/command/index.ts +12 -0
- package/dist/r/src/components/ui/context-menu/context-menu.tsx +163 -0
- package/dist/r/src/components/ui/context-menu/index.ts +15 -0
- package/dist/r/src/components/ui/detail-panel/detail-panel.tsx +161 -0
- package/dist/r/src/components/ui/detail-panel/index.ts +9 -0
- package/dist/r/src/components/ui/dialog/dialog.tsx +138 -0
- package/dist/r/src/components/ui/dialog/index.ts +14 -0
- package/dist/r/src/components/ui/diff-block/diff-block.tsx +286 -0
- package/dist/r/src/components/ui/diff-block/index.ts +11 -0
- package/dist/r/src/components/ui/drawer/drawer.tsx +144 -0
- package/dist/r/src/components/ui/drawer/index.ts +13 -0
- package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +203 -0
- package/dist/r/src/components/ui/dropdown-menu/index.ts +18 -0
- package/dist/r/src/components/ui/empty/empty.tsx +104 -0
- package/dist/r/src/components/ui/empty/index.ts +10 -0
- package/dist/r/src/components/ui/entity-icon/entity-icon.tsx +154 -0
- package/dist/r/src/components/ui/entity-icon/index.ts +1 -0
- package/dist/r/src/components/ui/field/field.tsx +131 -0
- package/dist/r/src/components/ui/field/index.ts +11 -0
- package/dist/r/src/components/ui/hover-card/hover-card.tsx +48 -0
- package/dist/r/src/components/ui/hover-card/index.ts +1 -0
- package/dist/r/src/components/ui/input/index.ts +1 -0
- package/dist/r/src/components/ui/input/input.tsx +41 -0
- package/dist/r/src/components/ui/input-group/index.ts +8 -0
- package/dist/r/src/components/ui/input-group/input-group.tsx +111 -0
- package/dist/r/src/components/ui/input-otp/index.ts +1 -0
- package/dist/r/src/components/ui/input-otp/input-otp.tsx +108 -0
- package/dist/r/src/components/ui/item/index.ts +10 -0
- package/dist/r/src/components/ui/item/item.tsx +146 -0
- package/dist/r/src/components/ui/kbd/index.ts +1 -0
- package/dist/r/src/components/ui/kbd/kbd.tsx +42 -0
- package/dist/r/src/components/ui/label/index.ts +1 -0
- package/dist/r/src/components/ui/label/label.tsx +36 -0
- package/dist/r/src/components/ui/menubar/index.ts +16 -0
- package/dist/r/src/components/ui/menubar/menubar.tsx +190 -0
- package/dist/r/src/components/ui/modal-dialog/index.ts +1 -0
- package/dist/r/src/components/ui/modal-dialog/modal-dialog.tsx +95 -0
- package/dist/r/src/components/ui/navigation-menu/index.ts +13 -0
- package/dist/r/src/components/ui/navigation-menu/navigation-menu.tsx +229 -0
- package/dist/r/src/components/ui/pagination/index.ts +8 -0
- package/dist/r/src/components/ui/pagination/pagination.tsx +144 -0
- package/dist/r/src/components/ui/popover/index.ts +10 -0
- package/dist/r/src/components/ui/popover/popover.tsx +81 -0
- package/dist/r/src/components/ui/progress/index.ts +1 -0
- package/dist/r/src/components/ui/progress/progress.tsx +67 -0
- package/dist/r/src/components/ui/radio-group/index.ts +1 -0
- package/dist/r/src/components/ui/radio-group/radio-group.tsx +78 -0
- package/dist/r/src/components/ui/resizable/index.ts +6 -0
- package/dist/r/src/components/ui/resizable/resizable.tsx +74 -0
- package/dist/r/src/components/ui/scroll-area/index.ts +1 -0
- package/dist/r/src/components/ui/scroll-area/scroll-area.tsx +66 -0
- package/dist/r/src/components/ui/select/index.ts +11 -0
- package/dist/r/src/components/ui/select/select.tsx +188 -0
- package/dist/r/src/components/ui/separator/index.ts +1 -0
- package/dist/r/src/components/ui/separator/separator.tsx +40 -0
- package/dist/r/src/components/ui/sheet/index.ts +13 -0
- package/dist/r/src/components/ui/sheet/sheet.tsx +132 -0
- package/dist/r/src/components/ui/skeleton/index.ts +1 -0
- package/dist/r/src/components/ui/skeleton/skeleton.tsx +28 -0
- package/dist/r/src/components/ui/slider/index.ts +1 -0
- package/dist/r/src/components/ui/slider/slider.tsx +81 -0
- package/dist/r/src/components/ui/spinner/index.ts +1 -0
- package/dist/r/src/components/ui/spinner/spinner.tsx +58 -0
- package/dist/r/src/components/ui/status-chip/index.ts +8 -0
- package/dist/r/src/components/ui/status-chip/status-chip.tsx +142 -0
- package/dist/r/src/components/ui/switch/index.ts +1 -0
- package/dist/r/src/components/ui/switch/switch.tsx +100 -0
- package/dist/r/src/components/ui/table/index.ts +11 -0
- package/dist/r/src/components/ui/table/table.tsx +125 -0
- package/dist/r/src/components/ui/tabs/index.ts +8 -0
- package/dist/r/src/components/ui/tabs/tabs.tsx +77 -0
- package/dist/r/src/components/ui/textarea/index.ts +1 -0
- package/dist/r/src/components/ui/textarea/textarea.tsx +36 -0
- package/dist/r/src/components/ui/toast/index.ts +1 -0
- package/dist/r/src/components/ui/toast/toast.tsx +220 -0
- package/dist/r/src/components/ui/toggle/index.ts +1 -0
- package/dist/r/src/components/ui/toggle/toggle.tsx +60 -0
- package/dist/r/src/components/ui/toggle-group/index.ts +6 -0
- package/dist/r/src/components/ui/toggle-group/toggle-group.tsx +66 -0
- package/dist/r/src/components/ui/tooltip/index.ts +9 -0
- package/dist/r/src/components/ui/tooltip/tooltip.tsx +102 -0
- package/dist/r/src/lib/keyed-rows.ts +68 -0
- package/dist/r/src/lib/overlay.ts +70 -0
- package/dist/r/src/lib/themes.ts +490 -0
- package/dist/r/src/lib/tokens.ts +688 -0
- package/dist/r/src/lib/utils.ts +76 -0
- package/dist/r/src/lib/variants.ts +62 -0
- package/dist/r/src/lib/version-notes.ts +65 -0
- package/dist/r/src/styles/base.css +644 -0
- package/dist/r/src/styles/fonts.css +26 -0
- package/dist/r/src/styles/globals.css +18 -0
- package/dist/r/src/styles/theme.css +864 -0
- package/dist/r/stat.json +3 -1
- package/dist/r/status-bar.json +3 -1
- package/dist/r/status-chip.json +2 -1
- package/dist/r/switch.json +3 -1
- package/dist/r/table.json +3 -1
- package/dist/r/tabs.json +3 -1
- package/dist/r/textarea.json +3 -1
- package/dist/r/theming.json +42 -0
- package/dist/r/toast.json +3 -1
- package/dist/r/toggle-group.json +2 -1
- package/dist/r/toggle.json +3 -1
- package/dist/r/tooltip.json +3 -1
- package/dist/r/top-bar.json +3 -1
- package/dist/r/update-dialog.json +2 -1
- package/dist/r/workspace-mark.json +2 -1
- package/package.json +10 -9
- package/registry.json +320 -73
- package/src/index.ts +2 -4
- package/dist/components/ui/diff-block/diff-block.test.d.ts +0 -2
- package/dist/components/ui/diff-block/diff-block.test.d.ts.map +0 -1
- package/dist/lib/keyed-rows.test.d.ts +0 -2
- package/dist/lib/keyed-rows.test.d.ts.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Dialog as KobalteDialog } from '@kobalte/core/dialog'
|
|
2
|
+
import { X } from 'lucide-solid'
|
|
3
|
+
import type { ComponentProps, JSX } from 'solid-js'
|
|
4
|
+
import { Show, splitProps } from 'solid-js'
|
|
5
|
+
import { overlayMotion, overlayPositioner, overlayScrim, overlaySurface } from '../../../lib/overlay'
|
|
6
|
+
import { cn } from '../../../lib/utils'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Dialog.
|
|
10
|
+
*
|
|
11
|
+
* A modal surface for a decision or a short task. `Dialog.Portal` keeps the
|
|
12
|
+
* panel out of the app's stacking and overflow contexts, `Dialog.Overlay`
|
|
13
|
+
* dims what is behind it, and Kobalte handles the focus trap, the escape key,
|
|
14
|
+
* scroll locking and returning focus to the trigger on close.
|
|
15
|
+
*
|
|
16
|
+
* The close button is part of the content rather than optional, because every
|
|
17
|
+
* modal needs a way out that is not the keyboard. A dialog whose only exit is
|
|
18
|
+
* Escape is a trap for anyone using a pointer.
|
|
19
|
+
*/
|
|
20
|
+
export function Dialog(props: ComponentProps<typeof KobalteDialog>) {
|
|
21
|
+
return <KobalteDialog {...props} />
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function DialogTrigger(props: ComponentProps<typeof KobalteDialog.Trigger>) {
|
|
25
|
+
return <KobalteDialog.Trigger {...props} />
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function DialogPortal(props: ComponentProps<typeof KobalteDialog.Portal>) {
|
|
29
|
+
return <KobalteDialog.Portal {...props} />
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function DialogOverlay(props: ComponentProps<typeof KobalteDialog.Overlay>) {
|
|
33
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
34
|
+
return (
|
|
35
|
+
<KobalteDialog.Overlay
|
|
36
|
+
class={cn(
|
|
37
|
+
overlayScrim,
|
|
38
|
+
'data-expanded:animate-in data-expanded:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
|
|
39
|
+
local.class
|
|
40
|
+
)}
|
|
41
|
+
{...rest}
|
|
42
|
+
/>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type DialogContentProps = ComponentProps<typeof KobalteDialog.Content> & {
|
|
47
|
+
/**
|
|
48
|
+
* Replaces the default close button. Pass `false` to remove it — only for a
|
|
49
|
+
* dialog that cannot be dismissed (an update that must finish); anything the
|
|
50
|
+
* user can escape from needs the button.
|
|
51
|
+
*/
|
|
52
|
+
closeButton?: JSX.Element | false
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function DialogContent(props: DialogContentProps) {
|
|
56
|
+
const [local, rest] = splitProps(props, ['class', 'children', 'closeButton'])
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<KobalteDialog.Portal>
|
|
60
|
+
<DialogOverlay />
|
|
61
|
+
<div class={overlayPositioner}>
|
|
62
|
+
<KobalteDialog.Content
|
|
63
|
+
class={cn(overlaySurface, overlayMotion, 'grid w-full max-w-lg gap-4 p-5', local.class)}
|
|
64
|
+
{...rest}
|
|
65
|
+
>
|
|
66
|
+
{local.children}
|
|
67
|
+
<Show when={local.closeButton !== false}>
|
|
68
|
+
<KobalteDialog.CloseButton
|
|
69
|
+
aria-label="Close"
|
|
70
|
+
class={cn(
|
|
71
|
+
'absolute top-3.5 end-3.5 rounded-md p-1 text-muted-foreground',
|
|
72
|
+
'transition-colors ease-out hover:bg-surface-hover hover:text-foreground',
|
|
73
|
+
'focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-primary-subtle outline-none'
|
|
74
|
+
)}
|
|
75
|
+
>
|
|
76
|
+
{local.closeButton ?? <X class="size-4" />}
|
|
77
|
+
</KobalteDialog.CloseButton>
|
|
78
|
+
</Show>
|
|
79
|
+
</KobalteDialog.Content>
|
|
80
|
+
</div>
|
|
81
|
+
</KobalteDialog.Portal>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function DialogHeader(props: ComponentProps<'div'>) {
|
|
86
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
87
|
+
return (
|
|
88
|
+
<div
|
|
89
|
+
data-slot="dialog-header"
|
|
90
|
+
class={cn('flex flex-col gap-1.5 pe-6 text-start', local.class)}
|
|
91
|
+
{...rest}
|
|
92
|
+
/>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function DialogFooter(props: ComponentProps<'div'>) {
|
|
97
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
98
|
+
return (
|
|
99
|
+
<div
|
|
100
|
+
data-slot="dialog-footer"
|
|
101
|
+
class={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', local.class)}
|
|
102
|
+
{...rest}
|
|
103
|
+
/>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function DialogTitle(props: ComponentProps<typeof KobalteDialog.Title>) {
|
|
108
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
109
|
+
return (
|
|
110
|
+
<KobalteDialog.Title
|
|
111
|
+
class={cn('text-base leading-none font-semibold tracking-tight', local.class)}
|
|
112
|
+
{...rest}
|
|
113
|
+
/>
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function DialogDescription(props: ComponentProps<typeof KobalteDialog.Description>) {
|
|
118
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
119
|
+
return (
|
|
120
|
+
<KobalteDialog.Description class={cn('text-muted-foreground text-sm', local.class)} {...rest} />
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function DialogCloseButton(props: ComponentProps<typeof KobalteDialog.CloseButton>) {
|
|
125
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
126
|
+
return <KobalteDialog.CloseButton class={cn('focus-ring', local.class)} {...rest} />
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The close control, unstyled and polymorphic — for a footer's text "Cancel" or
|
|
131
|
+
* "Close", which is a different control from the corner icon `DialogCloseButton`
|
|
132
|
+
* draws. Take it as `as={Button}` so it carries the button's variants rather than
|
|
133
|
+
* a copied class string.
|
|
134
|
+
*/
|
|
135
|
+
export function DialogClose(props: ComponentProps<typeof KobalteDialog.CloseButton>) {
|
|
136
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
137
|
+
return <KobalteDialog.CloseButton class={cn('focus-ring', local.class)} {...rest} />
|
|
138
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { createMemo, For, Show, splitProps, type ComponentProps, type JSX } from 'solid-js'
|
|
2
|
+
import { cva, type VariantProps } from '../../../lib/variants'
|
|
3
|
+
import { cn } from '../../../lib/utils'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* DiffBlock.
|
|
7
|
+
*
|
|
8
|
+
* A unified diff, classified and toned. Parsing lives here because the
|
|
9
|
+
* classification is the part that is easy to get subtly wrong and impossible to
|
|
10
|
+
* fix from a caller: whether a line is an addition, a deletion, a hunk header,
|
|
11
|
+
* a file header, or context depends on state — a line beginning with `+++` is a
|
|
12
|
+
* file header *before* the first hunk and an added line beginning with `++`
|
|
13
|
+
* *inside* one — and a renderer that tested prefixes without that state would
|
|
14
|
+
* mis-colour real patches.
|
|
15
|
+
*
|
|
16
|
+
* The line grammar:
|
|
17
|
+
*
|
|
18
|
+
* | Prefix | Meaning |
|
|
19
|
+
* | --- | --- |
|
|
20
|
+
* | `diff --git`, `index`, `---`, `+++` (before a hunk) | file header |
|
|
21
|
+
* | `@@` | hunk header |
|
|
22
|
+
* | `+` | addition |
|
|
23
|
+
* | `-` | deletion |
|
|
24
|
+
* | `\` | the "no newline at end of file" marker |
|
|
25
|
+
* | anything else, including a leading space | context |
|
|
26
|
+
*
|
|
27
|
+
* Tones are pairs of surface and text, so an addition is readable in both
|
|
28
|
+
* polarities and with any accent — the greens and reds are the theme's own
|
|
29
|
+
* `success` and `destructive` at low alpha, not fixed hexes. Colour is never the
|
|
30
|
+
* only signal: the gutter carries `+` or `-` as well, which is what makes the
|
|
31
|
+
* block usable in greyscale and by anyone who cannot separate the two hues.
|
|
32
|
+
*
|
|
33
|
+
* Split (side-by-side) view is deliberately not implemented. It is a different
|
|
34
|
+
* layout algorithm — pairing deletions with additions across hunks — and a
|
|
35
|
+
* half-correct one is worse than none. `view="unified"` is the only value, and
|
|
36
|
+
* the prop exists so that adding the second is not a breaking change.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
export type DiffLineKind = 'add' | 'delete' | 'context' | 'hunk' | 'header' | 'meta'
|
|
40
|
+
|
|
41
|
+
export type DiffLine = Readonly<{
|
|
42
|
+
kind: DiffLineKind
|
|
43
|
+
/** The line without its diff prefix. */
|
|
44
|
+
text: string
|
|
45
|
+
/** The prefix as written: `+`, `-`, a space, or nothing for a header. */
|
|
46
|
+
marker: string
|
|
47
|
+
/** The old-side line number, when the line exists on the old side. */
|
|
48
|
+
oldLine?: number
|
|
49
|
+
/** The new-side line number, when the line exists on the new side. */
|
|
50
|
+
newLine?: number
|
|
51
|
+
}>
|
|
52
|
+
|
|
53
|
+
const HUNK_HEADER = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Classify a unified diff.
|
|
57
|
+
*
|
|
58
|
+
* `headerState` is what makes `---` and `+++` unambiguous: git writes them as
|
|
59
|
+
* file headers before the first `@@` and as content after it, and the two need
|
|
60
|
+
* different tones. `oldLine`/`newLine` are tracked so the gutter can number both
|
|
61
|
+
* sides — the numbers a reader uses to find the change in their editor.
|
|
62
|
+
*/
|
|
63
|
+
export function parseDiff(patch: string): readonly DiffLine[] {
|
|
64
|
+
const lines: DiffLine[] = []
|
|
65
|
+
let inHunk = false
|
|
66
|
+
let oldLine = 0
|
|
67
|
+
let newLine = 0
|
|
68
|
+
|
|
69
|
+
for (const raw of patch.replace(/\n$/, '').split('\n')) {
|
|
70
|
+
if (HUNK_HEADER.test(raw)) {
|
|
71
|
+
const match = HUNK_HEADER.exec(raw)!
|
|
72
|
+
oldLine = Number(match[1])
|
|
73
|
+
newLine = Number(match[2])
|
|
74
|
+
inHunk = true
|
|
75
|
+
lines.push({ kind: 'hunk', text: raw, marker: '' })
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!inHunk) {
|
|
80
|
+
const isFileHeader =
|
|
81
|
+
raw.startsWith('diff --git') ||
|
|
82
|
+
raw.startsWith('index ') ||
|
|
83
|
+
raw.startsWith('new file') ||
|
|
84
|
+
raw.startsWith('deleted file') ||
|
|
85
|
+
raw.startsWith('similarity index') ||
|
|
86
|
+
raw.startsWith('rename ') ||
|
|
87
|
+
raw.startsWith('--- ') ||
|
|
88
|
+
raw.startsWith('+++ ')
|
|
89
|
+
lines.push({ kind: isFileHeader ? 'header' : 'meta', text: raw, marker: '' })
|
|
90
|
+
continue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (raw.startsWith('\\')) {
|
|
94
|
+
lines.push({ kind: 'meta', text: raw, marker: '' })
|
|
95
|
+
continue
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const marker = raw[0] ?? ' '
|
|
99
|
+
if (marker === '+') {
|
|
100
|
+
lines.push({ kind: 'add', text: raw.slice(1), marker, newLine })
|
|
101
|
+
newLine += 1
|
|
102
|
+
} else if (marker === '-') {
|
|
103
|
+
lines.push({ kind: 'delete', text: raw.slice(1), marker, oldLine })
|
|
104
|
+
oldLine += 1
|
|
105
|
+
} else {
|
|
106
|
+
lines.push({ kind: 'context', text: raw.slice(1), marker: ' ', oldLine, newLine })
|
|
107
|
+
oldLine += 1
|
|
108
|
+
newLine += 1
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return lines
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Whether a line gets gutter numbers. A hunk header and a file header are
|
|
117
|
+
* structural, so numbering them would put a number on a line that has none.
|
|
118
|
+
*/
|
|
119
|
+
function numbered(line: DiffLine, show: boolean | undefined): boolean {
|
|
120
|
+
return Boolean(show) && line.kind !== 'hunk' && line.kind !== 'header' && line.kind !== 'meta'
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The counts a diff summary reports: how much was added and removed. */
|
|
124
|
+
export function diffStats(
|
|
125
|
+
lines: readonly DiffLine[]
|
|
126
|
+
): Readonly<{ added: number; removed: number }> {
|
|
127
|
+
let added = 0
|
|
128
|
+
let removed = 0
|
|
129
|
+
for (const line of lines) {
|
|
130
|
+
if (line.kind === 'add') added += 1
|
|
131
|
+
else if (line.kind === 'delete') removed += 1
|
|
132
|
+
}
|
|
133
|
+
return { added, removed }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The target path from a unified diff's file header. Prefers `+++ b/<path>` —
|
|
138
|
+
* git's explicit new-side marker — and skips `/dev/null`, which marks an added
|
|
139
|
+
* or deleted side rather than naming a file. Only lines outside a hunk are
|
|
140
|
+
* considered, for the same reason the parser tracks state.
|
|
141
|
+
*/
|
|
142
|
+
export function diffTargetPath(patch: string): string | null {
|
|
143
|
+
for (const line of patch.split('\n')) {
|
|
144
|
+
if (line.startsWith('@@')) break
|
|
145
|
+
const git = /^\+\+\+ b\/(.+?)(?:\t|$)/.exec(line)
|
|
146
|
+
if (git) return git[1]!
|
|
147
|
+
const plain = /^\+\+\+ ([^\s/][^\t]*?)(?:\t|$)/.exec(line)
|
|
148
|
+
if (plain && plain[1] !== '/dev/null') return plain[1]!
|
|
149
|
+
const fromHeader = /^diff --git a\/.+ b\/(.+)/.exec(line)
|
|
150
|
+
if (fromHeader) return fromHeader[1]!
|
|
151
|
+
}
|
|
152
|
+
return null
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export const diffLineVariants = cva('flex items-baseline font-mono text-xs', {
|
|
156
|
+
variants: {
|
|
157
|
+
kind: {
|
|
158
|
+
add: 'bg-success-subtle text-foreground',
|
|
159
|
+
delete: 'bg-destructive-subtle text-foreground',
|
|
160
|
+
context: 'text-foreground',
|
|
161
|
+
hunk: 'bg-muted text-muted-foreground',
|
|
162
|
+
header: 'bg-muted font-semibold text-foreground',
|
|
163
|
+
meta: 'text-muted-foreground italic',
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
defaultVariants: { kind: 'context' },
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
export type DiffBlockProps = Omit<ComponentProps<'div'>, 'children'> &
|
|
170
|
+
VariantProps<typeof diffLineVariants> & {
|
|
171
|
+
/** The unified diff. */
|
|
172
|
+
patch: string
|
|
173
|
+
/** A filename. Defaults to the path in the patch's header, or "diff". */
|
|
174
|
+
title?: string
|
|
175
|
+
/** False while the patch is still streaming. */
|
|
176
|
+
complete?: boolean
|
|
177
|
+
/** Show the two line-number gutters. Off for a fragment with no line numbers. */
|
|
178
|
+
showLineNumbers?: boolean
|
|
179
|
+
/** Extra header controls. */
|
|
180
|
+
actions?: JSX.Element
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function DiffBlock(props: DiffBlockProps) {
|
|
184
|
+
const [local, rest] = splitProps(props, [
|
|
185
|
+
'patch',
|
|
186
|
+
'title',
|
|
187
|
+
'complete',
|
|
188
|
+
'showLineNumbers',
|
|
189
|
+
'actions',
|
|
190
|
+
'class',
|
|
191
|
+
])
|
|
192
|
+
|
|
193
|
+
const lines = createMemo(() => parseDiff(local.patch))
|
|
194
|
+
const stats = createMemo(() => diffStats(lines()))
|
|
195
|
+
const name = () => local.title ?? diffTargetPath(local.patch)?.split('/').pop() ?? 'diff'
|
|
196
|
+
|
|
197
|
+
return (
|
|
198
|
+
<div
|
|
199
|
+
class={cn('overflow-hidden rounded-xl border border-border bg-card', local.class)}
|
|
200
|
+
{...rest}
|
|
201
|
+
>
|
|
202
|
+
<div class="flex items-center justify-between gap-2 border-b border-border px-3 py-1">
|
|
203
|
+
<span class="flex min-w-0 items-baseline gap-2">
|
|
204
|
+
<span class="truncate font-mono text-xs text-foreground">{name()}</span>
|
|
205
|
+
{/* The counts are text, so the summary survives greyscale and a reader
|
|
206
|
+
who cannot separate the two line tones still gets the shape of it. */}
|
|
207
|
+
<span class="shrink-0 font-mono text-2xs text-muted-foreground">
|
|
208
|
+
<span class="text-success">+{stats().added}</span>{' '}
|
|
209
|
+
<span class="text-destructive">−{stats().removed}</span>
|
|
210
|
+
</span>
|
|
211
|
+
</span>
|
|
212
|
+
{local.actions}
|
|
213
|
+
</div>
|
|
214
|
+
<div
|
|
215
|
+
class="scroll-fade overflow-x-auto"
|
|
216
|
+
tabindex="0"
|
|
217
|
+
role="region"
|
|
218
|
+
aria-label={`Diff for ${name()}`}
|
|
219
|
+
>
|
|
220
|
+
<div class="min-w-fit">
|
|
221
|
+
<For each={lines()}>
|
|
222
|
+
{(line) => (
|
|
223
|
+
<div class={diffLineVariants({ kind: line.kind })}>
|
|
224
|
+
<Show when={numbered(line, local.showLineNumbers)}>
|
|
225
|
+
<span
|
|
226
|
+
class="w-10 shrink-0 pr-2 text-right text-2xs text-muted-foreground tabular-nums select-none"
|
|
227
|
+
aria-hidden="true"
|
|
228
|
+
>
|
|
229
|
+
{line.oldLine ?? ''}
|
|
230
|
+
</span>
|
|
231
|
+
<span
|
|
232
|
+
class="w-10 shrink-0 pr-2 text-right text-2xs text-muted-foreground tabular-nums select-none"
|
|
233
|
+
aria-hidden="true"
|
|
234
|
+
>
|
|
235
|
+
{line.newLine ?? ''}
|
|
236
|
+
</span>
|
|
237
|
+
</Show>
|
|
238
|
+
{/* The marker is the signal that is not a colour. */}
|
|
239
|
+
<span class="w-4 shrink-0 text-center select-none" aria-hidden="true">
|
|
240
|
+
{line.kind === 'add' ? '+' : line.kind === 'delete' ? '−' : ''}
|
|
241
|
+
</span>
|
|
242
|
+
<span class="min-w-0 whitespace-pre pr-4">
|
|
243
|
+
{/* A screen reader gets the kind as a word, not a glyph. */}
|
|
244
|
+
<span class="visually-hidden">
|
|
245
|
+
{line.kind === 'add' ? 'Added: ' : line.kind === 'delete' ? 'Removed: ' : ''}
|
|
246
|
+
</span>
|
|
247
|
+
{line.text || ' '}
|
|
248
|
+
</span>
|
|
249
|
+
</div>
|
|
250
|
+
)}
|
|
251
|
+
</For>
|
|
252
|
+
</div>
|
|
253
|
+
<Show when={!local.complete}>
|
|
254
|
+
<p class="px-3 py-1 text-xs text-muted-foreground italic">Generating diff…</p>
|
|
255
|
+
</Show>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* A diff summary line, for a list of changes rather than one patch: the file and
|
|
263
|
+
* its counts. Uses `CodeBlock`'s height rules and nothing else, because a summary
|
|
264
|
+
* is a row and not a surface.
|
|
265
|
+
*/
|
|
266
|
+
export function DiffSummary(props: { patch: string; class?: string; onSelect?: () => void }) {
|
|
267
|
+
const stats = createMemo(() => diffStats(parseDiff(props.patch)))
|
|
268
|
+
const name = () => diffTargetPath(props.patch) ?? 'diff'
|
|
269
|
+
|
|
270
|
+
return (
|
|
271
|
+
<button
|
|
272
|
+
type="button"
|
|
273
|
+
class={cn(
|
|
274
|
+
'flex w-full items-baseline justify-between gap-3 rounded-md px-2 py-1 text-left font-mono text-xs hover:bg-muted',
|
|
275
|
+
props.class
|
|
276
|
+
)}
|
|
277
|
+
onClick={() => props.onSelect?.()}
|
|
278
|
+
>
|
|
279
|
+
<span class="truncate text-foreground">{name()}</span>
|
|
280
|
+
<span class="shrink-0 text-2xs">
|
|
281
|
+
<span class="text-success">+{stats().added}</span>{' '}
|
|
282
|
+
<span class="text-destructive">−{stats().removed}</span>
|
|
283
|
+
</span>
|
|
284
|
+
</button>
|
|
285
|
+
)
|
|
286
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import DrawerPrimitive from '@corvu/drawer'
|
|
2
|
+
import type { ComponentProps } from 'solid-js'
|
|
3
|
+
import { splitProps } from 'solid-js'
|
|
4
|
+
import { cn } from '../../../lib/utils'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Drawer.
|
|
8
|
+
*
|
|
9
|
+
* A sheet the user can drag away: it opens from an edge, carries a handle, and
|
|
10
|
+
* closes by swipe as well as by button. That drag affordance is the reason to
|
|
11
|
+
* choose it over Sheet — the gesture is for content the user is *finishing*
|
|
12
|
+
* with (a summary, a queue, a confirmation), not for browsing.
|
|
13
|
+
*
|
|
14
|
+
* On a large window a Drawer is usually the wrong control: dragging is a touch
|
|
15
|
+
* idiom, and on a desktop the same content is better as a Sheet or a Dialog.
|
|
16
|
+
* The exceptions are the surfaces a pointer also drags naturally — a bottom
|
|
17
|
+
* console, a media panel.
|
|
18
|
+
*
|
|
19
|
+
* corvu supplies the drag physics, the snap points and the pointer capture.
|
|
20
|
+
*/
|
|
21
|
+
export function Drawer(props: ComponentProps<typeof DrawerPrimitive>) {
|
|
22
|
+
return <DrawerPrimitive {...props} />
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function DrawerTrigger(props: ComponentProps<typeof DrawerPrimitive.Trigger>) {
|
|
26
|
+
return <DrawerPrimitive.Trigger {...props} />
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function DrawerOverlay(props: ComponentProps<typeof DrawerPrimitive.Overlay>) {
|
|
30
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<DrawerPrimitive.Overlay
|
|
34
|
+
class={cn(
|
|
35
|
+
'fixed inset-0 z-(--z-drawer) bg-scrim/50',
|
|
36
|
+
'data-[open]:animate-in data-[open]:fade-in-0 data-[closed]:animate-out data-[closed]:fade-out-0',
|
|
37
|
+
local.class
|
|
38
|
+
)}
|
|
39
|
+
{...rest}
|
|
40
|
+
/>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type DrawerContentProps = ComponentProps<typeof DrawerPrimitive.Content> & {
|
|
45
|
+
/**
|
|
46
|
+
* Draw the grabber at the leading edge of the sheet.
|
|
47
|
+
*
|
|
48
|
+
* It is an affordance, not the drag target: corvu makes the whole sheet
|
|
49
|
+
* draggable, exactly as the platform's own sheets behave. So this is
|
|
50
|
+
* `aria-hidden` decoration that tells the user the sheet can be pulled — it
|
|
51
|
+
* carries no behaviour and must not be the only thing that moves.
|
|
52
|
+
*/
|
|
53
|
+
withHandle?: boolean
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function DrawerContent(props: DrawerContentProps) {
|
|
57
|
+
const [local, rest] = splitProps(props, ['class', 'withHandle', 'children'])
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<DrawerPrimitive.Portal>
|
|
61
|
+
<DrawerOverlay />
|
|
62
|
+
<DrawerPrimitive.Content
|
|
63
|
+
class={cn(
|
|
64
|
+
'group/drawer bg-popover text-popover-foreground fixed z-(--z-drawer) flex flex-col border-border shadow-lg',
|
|
65
|
+
'data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:max-h-[85vh] data-[side=bottom]:rounded-t-xl data-[side=bottom]:border-t',
|
|
66
|
+
'data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:max-h-[85vh] data-[side=top]:rounded-b-xl data-[side=top]:border-b',
|
|
67
|
+
'data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:w-80 data-[side=left]:rounded-e-xl data-[side=left]:border-e',
|
|
68
|
+
'data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:w-80 data-[side=right]:rounded-s-xl data-[side=right]:border-s',
|
|
69
|
+
local.class
|
|
70
|
+
)}
|
|
71
|
+
{...rest}
|
|
72
|
+
>
|
|
73
|
+
{local.withHandle ? (
|
|
74
|
+
<span
|
|
75
|
+
aria-hidden="true"
|
|
76
|
+
class={cn(
|
|
77
|
+
'bg-muted shrink-0 self-center',
|
|
78
|
+
'group-data-[side=bottom]/drawer:mt-2 group-data-[side=bottom]/drawer:h-1.5 group-data-[side=bottom]/drawer:w-10 group-data-[side=bottom]/drawer:rounded-full'
|
|
79
|
+
)}
|
|
80
|
+
/>
|
|
81
|
+
) : null}
|
|
82
|
+
{local.children}
|
|
83
|
+
</DrawerPrimitive.Content>
|
|
84
|
+
</DrawerPrimitive.Portal>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function DrawerTitle(props: ComponentProps<typeof DrawerPrimitive.Label>) {
|
|
89
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
90
|
+
return (
|
|
91
|
+
<DrawerPrimitive.Label
|
|
92
|
+
class={cn('text-base leading-none font-semibold tracking-tight', local.class)}
|
|
93
|
+
{...rest}
|
|
94
|
+
/>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function DrawerDescription(props: ComponentProps<typeof DrawerPrimitive.Description>) {
|
|
99
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
100
|
+
return (
|
|
101
|
+
<DrawerPrimitive.Description
|
|
102
|
+
class={cn('text-muted-foreground text-sm', local.class)}
|
|
103
|
+
{...rest}
|
|
104
|
+
/>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function DrawerCloseButton(props: ComponentProps<typeof DrawerPrimitive.Close>) {
|
|
109
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
110
|
+
return <DrawerPrimitive.Close class={cn('focus-ring', local.class)} {...rest} />
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function DrawerHeader(props: ComponentProps<'div'>) {
|
|
114
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
115
|
+
return (
|
|
116
|
+
<div
|
|
117
|
+
data-slot="drawer-header"
|
|
118
|
+
class={cn('flex flex-col gap-1.5 p-5 pb-3 text-start', local.class)}
|
|
119
|
+
{...rest}
|
|
120
|
+
/>
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function DrawerBody(props: ComponentProps<'div'>) {
|
|
125
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
126
|
+
return (
|
|
127
|
+
<div
|
|
128
|
+
data-slot="drawer-body"
|
|
129
|
+
class={cn('min-h-0 flex-1 overflow-y-auto px-5 pb-4', local.class)}
|
|
130
|
+
{...rest}
|
|
131
|
+
/>
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function DrawerFooter(props: ComponentProps<'div'>) {
|
|
136
|
+
const [local, rest] = splitProps(props, ['class'])
|
|
137
|
+
return (
|
|
138
|
+
<div
|
|
139
|
+
data-slot="drawer-footer"
|
|
140
|
+
class={cn('flex flex-col-reverse gap-2 p-5 pt-3 sm:flex-row sm:justify-end', local.class)}
|
|
141
|
+
{...rest}
|
|
142
|
+
/>
|
|
143
|
+
)
|
|
144
|
+
}
|