Files
logseq/packages/ui/@/components/ui/command.tsx
Charlie 8040168d1e Feat: New UI components (#10694)
* enhance(plugin): call apis with the sdk ns

* enhance(plugin): types

* enhance(api): get value from the computed style

* enhance(api): types

* enhance(plugin): types

* enhance(plugin): types

* fix: lint

* fix(apis): incorrect shortcut command registion for block editing mode #10392

* fix(api): types

* enhance(apis): support register shortcuts with multi binding vals

* fix(plugins): normalize command key to make the internal keyword legal

* chore(plugin): build libs core

* chore(plugin): bump version

* enhance(apis): normalize apis cljs data

* chore(plugin): update libs user sdk

* chore(plugin): CHANGELOG.md

* fix: typo

* feat(ui): add package

* Update .gitignore

* feat(ui): set up shui infrastructure

* feat(ui): add storybook macro

* enhance(ui): storybook themes

* feat(ui): adapt ui button to classic

* enhance(ui): shui story

* feat(ui): shui toaster

* enhance(ui): shui toaster

* feat(ui): imperative API for shui toaster

* enhance(shui): update API for shui toaster

* enhance(shui): update hooks for shui toaster

* enhance(shui): remove debug

* feat(ui): story for the shui toaster

* feat(ui): story

* feat(ui): story docs

* feat(ui): more variants for the shui toaster

* feat(ui): story

* fix(ux): support querying plugins with right space chars

* feat(ui): add shui `Alert` component

* enhance(ui): shui demo

* feat(ui): add logseq UI readme

* enhance(ui): default shui theme

* feat(ui): add shui `Badge` component & demo

* fix(ui): outline theme for shui button

* feat(ui): custom icon for the toaster item

* feat(ui): add shui dropdown & demo

* feat(ui): WIP shui form related components

* feat(ui): WIP shui form-related components

* feat(ui): WIP shui form

* feat(ui): WIP shui form state for validation

* fix(ui): missing rounded for ui button

* feat(ui): add yup for shui form as default validation resolver

* enhance(ui): simplify validation schema input for the shui form

* fix(ui): accent ring color for input

* feat(ui): add shui switch

* feat(ui): add shui checkbox & switch

* feat(ui): add shui radio group

* fix(ui): missing file

* feat(ui): add Textarea component

* feat(ui): add shui card & skeleton

* feat(ui): add shui context menu component & demo

* fix(ui): accent color for the context menu item

* feat(ui): add shui select component & demo

* enhance(ui): ui css priority

* feat(ui): add shui calendar & ui details

* feat(ui): add shui popover

* feat(ui): add date picker & demo

* feat(ui): add shui dialog

* feat(ui): WIP add shui dialog

* feat(ui): WIP shui dialog as modal

* feat(ui): WIP imperative APIs for the shui modal

* feat(ui): imperative APIs for the shui modal/alert

* feat(ui): support imperative API alert!/confirm! return promise

* feat(ui): simplify shui components resources

* feat(ui): response layout for the demo ui page

* feat(ui): simplify colors

* feat(ui): simplify colors

* feat(ui): simplify colors

* refactor(ui): WIP Adapt to the new button component

* refactor(ui): polish new button & colors

* fix(ui): the new theme color for the plugin settings nav item link

* fix(ui): blockquote colors

* enhance(ui): more custom colors for shui button

* feat(ui): WIP make logseq green as a theme color

* enhance(ui): polish logseq classical theme color

* fix(ui): theme details of all pages

* enhance(ui): polish logseq theme color for dark mode

* fix(ui): missing table style

* refactor(ui): simplify the all shui buttons & shortcuts for the cmdk component

* fix(ui): missing file

* refactor(ui): clear up stuff

* fix(ui): theme color related issues

* enhance(ui): polish button style

* enhance(ui): polish the keymap setting pane

* fix(ui): hint button from the cmdk pane footer

* fix(ui): logseq colors for the storybook

* enhance(ui): stories for the shui components

* fix(ui): active color for the old toggle component

* enhance(ui): keep the constant size of the settings pane

* fix(ui): polish search input for the plugins pane

* enhance(ui): polish number list bullet colors

* feat(ui): add shui tooltip component

* chore: build ui

* chore(ui): clean up resources

* fix: lint

* fix: lint

* fix: lint

* fix(ui): alignment of the keymap title from the settings pane

* fix: tests

* fix(ui): close button for the classic notification tip

* fix(ui): polish toaster viewport

* enhance(ui): polish the ghost button colors

* enhance(ui): demos for tips

* fix(ui): accent colors for the rc-datepicker

* fix(ui): accent color for the menu item

* refactor(ui): remove unless code for the accent colors

* enhance(ui): polish pdf viewer background color for the accent color mode

* fix: lint

* fix: lint

* fix: lint

* enhance(ui): support button with the custom href link

* enhance(ui): polish aside setting items

* enhance(ui): polish accent color for buttons

* enhance(ui): polish all pages

---------

Co-authored-by: Gabriel Horner <97210743+logseq-cldwalker@users.noreply.github.com>
2023-12-26 16:31:37 +08:00

154 lines
4.7 KiB
TypeScript

import * as React from "react"
import { type DialogProps } from "@radix-ui/react-dialog"
import { Command as CommandPrimitive } from "cmdk"
import { Search } from "lucide-react"
import { cn } from "@/lib/utils"
import { Dialog, DialogContent } from "@/components/ui/dialog"
const Command = React.forwardRef<
React.ElementRef<typeof CommandPrimitive>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
>(({ className, ...props }, ref) => (
<CommandPrimitive
ref={ref}
className={cn(
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
className
)}
{...props}
/>
))
Command.displayName = CommandPrimitive.displayName
interface CommandDialogProps extends DialogProps {}
const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
return (
<Dialog {...props}>
<DialogContent className="overflow-hidden p-0 shadow-lg">
<Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
{children}
</Command>
</DialogContent>
</Dialog>
)
}
const CommandInput = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Input>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
>(({ className, ...props }, ref) => (
<div className="flex items-center border-b px-3" cmdk-input-wrapper="">
<Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
<CommandPrimitive.Input
ref={ref}
className={cn(
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
className
)}
{...props}
/>
</div>
))
CommandInput.displayName = CommandPrimitive.Input.displayName
const CommandList = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.List>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
>(({ className, ...props }, ref) => (
<CommandPrimitive.List
ref={ref}
className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
{...props}
/>
))
CommandList.displayName = CommandPrimitive.List.displayName
const CommandEmpty = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Empty>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
>((props, ref) => (
<CommandPrimitive.Empty
ref={ref}
className="py-6 text-center text-sm"
{...props}
/>
))
CommandEmpty.displayName = CommandPrimitive.Empty.displayName
const CommandGroup = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Group>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Group
ref={ref}
className={cn(
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
className
)}
{...props}
/>
))
CommandGroup.displayName = CommandPrimitive.Group.displayName
const CommandSeparator = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Separator
ref={ref}
className={cn("-mx-1 h-px bg-border", className)}
{...props}
/>
))
CommandSeparator.displayName = CommandPrimitive.Separator.displayName
const CommandItem = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className
)}
{...props}
/>
))
CommandItem.displayName = CommandPrimitive.Item.displayName
const CommandShortcut = ({
className,
...props
}: React.HTMLAttributes<HTMLSpanElement>) => {
return (
<span
className={cn(
"ml-auto text-xs tracking-widest text-muted-foreground",
className
)}
{...props}
/>
)
}
CommandShortcut.displayName = "CommandShortcut"
export {
Command,
CommandDialog,
CommandInput,
CommandList,
CommandEmpty,
CommandGroup,
CommandItem,
CommandShortcut,
CommandSeparator,
}