Openstatus www.openstatus.dev
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: upgrade cmdk and improve region preset (#918)

* chore: upgrade cmdk and improve region preset

* fix: missing type

authored by

Maximilian Kaske and committed by
GitHub
726db2f7 11695397

+372 -506
+1 -1
apps/web/package.json
··· 56 56 "@vercel/blob": "0.23.3", 57 57 "class-variance-authority": "0.7.0", 58 58 "clsx": "2.0.0", 59 - "cmdk": "0.2.0", 59 + "cmdk": "1.0.0", 60 60 "cobe": "0.6.3", 61 61 "contentlayer": "0.3.4", 62 62 "date-fns": "2.30.0",
+80 -80
apps/web/src/app/_components/input-search.tsx
··· 11 11 CommandEmpty, 12 12 CommandGroup, 13 13 CommandItem, 14 + CommandList, 14 15 } from "@openstatus/ui"; 15 16 16 17 // TODO: once stable, use the shallow route to store the search params inside of the search params ··· 32 33 const searchparams = inputValue 33 34 .trim() 34 35 .split(" ") 35 - .reduce( 36 - (prev, curr) => { 37 - const [name, value] = curr.split(":"); 38 - if (value && name && curr !== currentWord) { 39 - // TODO: support multiple value with value.split(",") 40 - prev[name] = value; 41 - } 42 - return prev; 43 - }, 44 - {} as Record<string, string>, 45 - ); 36 + .reduce((prev, curr) => { 37 + const [name, value] = curr.split(":"); 38 + if (value && name && curr !== currentWord) { 39 + // TODO: support multiple value with value.split(",") 40 + prev[name] = value; 41 + } 42 + return prev; 43 + }, {} as Record<string, string>); 46 44 onSearch(searchparams); 47 45 }, [onSearch, inputValue, currentWord]); 48 46 ··· 63 61 status: (number | null)[]; 64 62 limit: number[]; 65 63 region: string[]; 66 - }, 64 + } 67 65 ), 68 - [events], 66 + [events] 69 67 ); 70 68 71 69 type SearchKey = keyof typeof search; ··· 110 108 <div className="relative mt-2"> 111 109 {open ? ( 112 110 <div className="absolute top-0 z-10 w-full animate-in rounded-md border bg-popover text-popover-foreground shadow-md outline-none"> 113 - <CommandGroup className="max-h-64 overflow-auto"> 114 - {Object.keys(search).map((key) => { 115 - if ( 116 - inputValue.includes(`${key}:`) && 117 - !currentWord.includes(`${key}:`) 118 - ) 119 - return null; 120 - return ( 121 - <React.Fragment key={key}> 122 - <CommandItem 123 - value={key} 124 - onMouseDown={(e) => { 125 - e.preventDefault(); 126 - e.stopPropagation(); 127 - }} 128 - onSelect={(value) => { 129 - setInputValue((prev) => { 130 - if (currentWord.trim() === "") { 131 - const input = `${prev}${value}`; 111 + <CommandList> 112 + <CommandGroup className="max-h-64 overflow-auto"> 113 + {Object.keys(search).map((key) => { 114 + if ( 115 + inputValue.includes(`${key}:`) && 116 + !currentWord.includes(`${key}:`) 117 + ) 118 + return null; 119 + return ( 120 + <React.Fragment key={key}> 121 + <CommandItem 122 + value={key} 123 + onMouseDown={(e) => { 124 + e.preventDefault(); 125 + e.stopPropagation(); 126 + }} 127 + onSelect={(value) => { 128 + setInputValue((prev) => { 129 + if (currentWord.trim() === "") { 130 + const input = `${prev}${value}`; 131 + return `${input}:`; 132 + } 133 + // lots of cheat 134 + const isStarting = currentWord === prev; 135 + const prefix = isStarting ? "" : " "; 136 + const input = prev.replace( 137 + `${prefix}${currentWord}`, 138 + `${prefix}${value}` 139 + ); 132 140 return `${input}:`; 133 - } 134 - // lots of cheat 135 - const isStarting = currentWord === prev; 136 - const prefix = isStarting ? "" : " "; 137 - const input = prev.replace( 138 - `${prefix}${currentWord}`, 139 - `${prefix}${value}`, 140 - ); 141 - return `${input}:`; 142 - }); 143 - setCurrentWord(`${value}:`); 144 - }} 145 - className="group" 146 - > 147 - {key} 148 - <span className="ml-1 hidden truncate text-muted-foreground/90 group-aria-[selected=true]:block"> 149 - {search[key as SearchKey] 150 - .map((str) => `[${str}]`) 151 - .join(" ")} 152 - </span> 153 - </CommandItem> 154 - {search[key as SearchKey].map((option) => { 155 - return ( 156 - <SubItem 157 - key={option} 158 - value={`${key}:${option}`} 159 - onMouseDown={(e) => { 160 - e.preventDefault(); 161 - e.stopPropagation(); 162 - }} 163 - onSelect={(value) => { 164 - setInputValue((prev) => { 165 - const input = prev.replace(currentWord, value); 166 - return `${input.trim()} `; 167 - }); 168 - setCurrentWord(""); 169 - }} 170 - {...{ currentWord }} 171 - > 172 - {option} 173 - </SubItem> 174 - ); 175 - })} 176 - </React.Fragment> 177 - ); 178 - })} 179 - </CommandGroup> 180 - <CommandEmpty>No results found.</CommandEmpty> 141 + }); 142 + setCurrentWord(`${value}:`); 143 + }} 144 + className="group" 145 + > 146 + {key} 147 + <span className="ml-1 hidden truncate text-muted-foreground/90 group-aria-[selected=true]:block"> 148 + {search[key as SearchKey] 149 + .map((str) => `[${str}]`) 150 + .join(" ")} 151 + </span> 152 + </CommandItem> 153 + {search[key as SearchKey].map((option) => { 154 + return ( 155 + <SubItem 156 + key={option} 157 + value={`${key}:${option}`} 158 + onMouseDown={(e) => { 159 + e.preventDefault(); 160 + e.stopPropagation(); 161 + }} 162 + onSelect={(value) => { 163 + setInputValue((prev) => { 164 + const input = prev.replace(currentWord, value); 165 + return `${input.trim()} `; 166 + }); 167 + setCurrentWord(""); 168 + }} 169 + {...{ currentWord }} 170 + > 171 + {option} 172 + </SubItem> 173 + ); 174 + })} 175 + </React.Fragment> 176 + ); 177 + })} 178 + </CommandGroup> 179 + <CommandEmpty>No results found.</CommandEmpty> 180 + </CommandList> 181 181 </div> 182 182 ) : null} 183 183 </div>
+35 -32
apps/web/src/app/play/status/_components/timezone-combobox.tsx
··· 11 11 CommandGroup, 12 12 CommandInput, 13 13 CommandItem, 14 + CommandList, 14 15 Popover, 15 16 PopoverContent, 16 17 PopoverTrigger, ··· 60 61 <PopoverContent className="w-[300px] p-0"> 61 62 <Command> 62 63 <CommandInput placeholder="Search timezone..." /> 63 - <CommandEmpty>No timezone found.</CommandEmpty> 64 - <CommandGroup className="max-h-[300px] overflow-y-auto"> 65 - {timezones.map((timezone) => ( 66 - <CommandItem 67 - key={timezone.value} 68 - value={timezone.value} 69 - onSelect={(currentValue) => { 70 - setOpen(false); 64 + <CommandList> 65 + <CommandEmpty>No timezone found.</CommandEmpty> 66 + <CommandGroup className="max-h-[300px] overflow-y-auto"> 67 + {timezones.map((timezone) => ( 68 + <CommandItem 69 + key={timezone.value} 70 + value={timezone.value} 71 + onSelect={(currentValue) => { 72 + setOpen(false); 71 73 72 - // update search params 73 - const searchParams = updateSearchParams({ 74 - timezone: 75 - currentValue === value 76 - ? null // remove search param and use default timezone 77 - : timezones.find( 78 - (timezone) => timezone.value === currentValue, 79 - )?.label || null, 80 - }); 74 + // update search params 75 + const searchParams = updateSearchParams({ 76 + timezone: 77 + currentValue === value 78 + ? null // remove search param and use default timezone 79 + : timezones.find( 80 + (timezone) => timezone.value === currentValue 81 + )?.label || null, 82 + }); 81 83 82 - // refresh page with new search params 83 - router.replace(`${pathname}?${searchParams}`); 84 - router.refresh(); 85 - }} 86 - > 87 - <Check 88 - className={cn( 89 - "mr-2 h-4 w-4", 90 - value === timezone.value ? "opacity-100" : "opacity-0", 91 - )} 92 - /> 93 - {timezone.label} 94 - </CommandItem> 95 - ))} 96 - </CommandGroup> 84 + // refresh page with new search params 85 + router.replace(`${pathname}?${searchParams}`); 86 + router.refresh(); 87 + }} 88 + > 89 + <Check 90 + className={cn( 91 + "mr-2 h-4 w-4", 92 + value === timezone.value ? "opacity-100" : "opacity-0" 93 + )} 94 + /> 95 + {timezone.label} 96 + </CommandItem> 97 + ))} 98 + </CommandGroup> 99 + </CommandList> 97 100 </Command> 98 101 </PopoverContent> 99 102 </Popover>
+47 -41
apps/web/src/components/forms/monitor-form.tsx
··· 32 32 CommandGroup, 33 33 CommandInput, 34 34 CommandItem, 35 + CommandList, 35 36 Dialog, 36 37 DialogContent, 37 38 DialogDescription, ··· 505 506 <PopoverContent className="w-full p-0"> 506 507 <Command> 507 508 <CommandInput placeholder="Select a region..." /> 508 - <CommandEmpty>No regions found.</CommandEmpty> 509 - <CommandGroup className="max-h-[150px] overflow-y-scroll"> 510 - {Object.keys(flyRegionsDict).map( 511 - (region) => { 512 - const { code, location } = 513 - flyRegionsDict[ 514 - region as keyof typeof flyRegionsDict 515 - ]; 516 - const isSelected = 517 - field.value?.includes(code); 518 - return ( 519 - <CommandItem 520 - value={code} 521 - key={code} 522 - onSelect={() => { 523 - const currentRegions = 524 - form.getValues("regions") || []; 525 - form.setValue( 526 - "regions", 527 - currentRegions.includes(code) 528 - ? currentRegions.filter( 529 - (r) => r !== code 530 - ) 531 - : [...currentRegions, code] 532 - ); 533 - }} 534 - > 535 - <Check 536 - className={cn( 537 - "mr-2 h-4 w-4", 538 - isSelected 539 - ? "opacity-100" 540 - : "opacity-0" 541 - )} 542 - /> 543 - {location} 544 - </CommandItem> 545 - ); 546 - } 547 - )} 548 - </CommandGroup> 509 + <CommandList> 510 + <CommandEmpty> 511 + No regions found. 512 + </CommandEmpty> 513 + <CommandGroup className="max-h-[150px] overflow-y-scroll"> 514 + {Object.keys(flyRegionsDict).map( 515 + (region) => { 516 + const { code, location } = 517 + flyRegionsDict[ 518 + region as keyof typeof flyRegionsDict 519 + ]; 520 + const isSelected = 521 + field.value?.includes(code); 522 + return ( 523 + <CommandItem 524 + value={code} 525 + key={code} 526 + onSelect={() => { 527 + const currentRegions = 528 + form.getValues("regions") || 529 + []; 530 + form.setValue( 531 + "regions", 532 + currentRegions.includes(code) 533 + ? currentRegions.filter( 534 + (r) => r !== code 535 + ) 536 + : [...currentRegions, code] 537 + ); 538 + }} 539 + > 540 + <Check 541 + className={cn( 542 + "mr-2 h-4 w-4", 543 + isSelected 544 + ? "opacity-100" 545 + : "opacity-0" 546 + )} 547 + /> 548 + {location} 549 + </CommandItem> 550 + ); 551 + } 552 + )} 553 + </CommandGroup> 554 + </CommandList> 549 555 </Command> 550 556 </PopoverContent> 551 557 </Popover>
+42 -36
apps/web/src/components/forms/status-page/section-monitor.tsx
··· 13 13 CommandGroup, 14 14 CommandInput, 15 15 CommandItem, 16 + CommandList, 16 17 Popover, 17 18 PopoverContent, 18 19 PopoverTrigger, ··· 64 65 <PopoverContent side="bottom" className="w-[240px] p-0"> 65 66 <Command> 66 67 <CommandInput placeholder="Select monitors..." className="h-9" /> 67 - <CommandEmpty>No monitors found.</CommandEmpty> 68 - <CommandGroup> 69 - {monitors?.map((monitor) => ( 70 - <CommandItem 71 - key={monitor.id} 72 - value={String(monitor.id)} 73 - onSelect={(currentValue) => { 74 - const monitorIndex = watchMonitors.findIndex( 75 - (m) => m.monitorId === Number.parseInt(currentValue), 76 - ); 77 - if (monitorIndex !== -1) { 78 - remove(monitorIndex); 79 - } else { 80 - append({ 81 - monitorId: monitor.id, 82 - order: fields.length + 1, 83 - }); 84 - } 85 - }} 86 - > 87 - <div className="truncate"> 88 - <p>{monitor.name}</p> 89 - {/* <p className="text-muted-foreground truncate text-xs"> 68 + <CommandList> 69 + <CommandEmpty>No monitors found.</CommandEmpty> 70 + <CommandGroup> 71 + {monitors?.map((monitor) => ( 72 + <CommandItem 73 + key={monitor.id} 74 + value={`${monitor.name}-${String(monitor.id)}`} 75 + keywords={[monitor.name]} 76 + onSelect={(currentValue) => { 77 + const splitValue = currentValue.split("-"); 78 + const id = splitValue?.[splitValue.length - 1]; 79 + const monitorIndex = watchMonitors.findIndex( 80 + (m) => m.monitorId === Number.parseInt(id) 81 + ); 82 + if (monitorIndex !== -1) { 83 + remove(monitorIndex); 84 + } else { 85 + append({ 86 + monitorId: monitor.id, 87 + order: fields.length + 1, 88 + }); 89 + } 90 + }} 91 + > 92 + <div className="truncate"> 93 + <p>{monitor.name}</p> 94 + {/* <p className="text-muted-foreground truncate text-xs"> 90 95 {monitor.url} 91 96 </p> */} 92 - </div> 93 - <CheckIcon 94 - className={cn( 95 - "ml-auto h-4 w-4 shrink-0", 96 - watchMonitors.some((m) => m.monitorId === monitor.id) 97 - ? "opacity-100" 98 - : "opacity-0", 99 - )} 100 - /> 101 - </CommandItem> 102 - ))} 103 - </CommandGroup> 97 + </div> 98 + <CheckIcon 99 + className={cn( 100 + "ml-auto h-4 w-4 shrink-0", 101 + watchMonitors.some((m) => m.monitorId === monitor.id) 102 + ? "opacity-100" 103 + : "opacity-0" 104 + )} 105 + /> 106 + </CommandItem> 107 + ))} 108 + </CommandGroup> 109 + </CommandList> 104 110 </Command> 105 111 </PopoverContent> 106 112 </Popover> ··· 120 126 <div className="w-full space-y-2"> 121 127 {fields.map((field) => { 122 128 const monitor = monitors?.find( 123 - ({ id }) => field.monitorId === id, 129 + ({ id }) => field.monitorId === id 124 130 ); 125 131 if (!monitor) return null; 126 132 return (
+108 -45
apps/web/src/components/monitor-dashboard/region-preset.tsx
··· 1 1 "use client"; 2 2 3 - import { Globe2 } from "lucide-react"; 3 + import { Check, ChevronsUpDown, Globe2 } from "lucide-react"; 4 4 import { usePathname, useRouter } from "next/navigation"; 5 5 import * as React from "react"; 6 6 7 7 import type { Region } from "@openstatus/tinybird"; 8 8 import { 9 9 Button, 10 - DropdownMenu, 11 - DropdownMenuCheckboxItem, 12 - DropdownMenuContent, 13 - DropdownMenuSeparator, 14 - DropdownMenuTrigger, 10 + Command, 11 + CommandEmpty, 12 + CommandGroup, 13 + CommandInput, 14 + CommandItem, 15 + CommandList, 16 + CommandSeparator, 17 + Popover, 18 + PopoverContent, 19 + PopoverTrigger, 15 20 } from "@openstatus/ui"; 16 - import { flyRegionsDict } from "@openstatus/utils"; 21 + import { 22 + type Continent, 23 + type RegionInfo, 24 + flyRegionsDict, 25 + } from "@openstatus/utils"; 17 26 18 27 import useUpdateSearchParams from "@/hooks/use-update-search-params"; 19 28 import { cn } from "@/lib/utils"; ··· 32 41 const pathname = usePathname(); 33 42 const updateSearchParams = useUpdateSearchParams(); 34 43 35 - function onOpenChange(open: boolean) { 36 - if (!open) { 44 + const allSelected = regions.every((r) => selected.includes(r)); 45 + 46 + React.useEffect(() => { 47 + if (!allSelected) { 37 48 const searchParams = updateSearchParams({ regions: selected.join(",") }); 38 49 router.replace(`${pathname}?${searchParams}`, { scroll: false }); 50 + } else if (allSelected) { 51 + const searchParams = updateSearchParams({ regions: null }); 52 + router.replace(`${pathname}?${searchParams}`, { scroll: false }); 39 53 } 40 - } 54 + }, [allSelected, router, pathname, updateSearchParams, selected]); 55 + 56 + const regionsByContinent = regions.reduce((prev, curr) => { 57 + const region = flyRegionsDict[curr]; 58 + 59 + if (prev[region.continent]) { 60 + prev[region.continent].push(region); 61 + } else { 62 + prev[region.continent] = [region]; 63 + } 41 64 42 - const allSelected = regions.every((r) => selected.includes(r)); 65 + return prev; 66 + }, {} as Record<Continent, RegionInfo[]>); 43 67 44 68 return ( 45 - <DropdownMenu onOpenChange={onOpenChange}> 46 - <DropdownMenuTrigger asChild> 69 + <Popover> 70 + <PopoverTrigger asChild> 47 71 <Button 48 72 size="lg" 49 73 variant="outline" 50 74 className={cn("px-3 shadow-none", className)} 51 75 > 52 - <span className="flex items-center gap-2"> 53 - <Globe2 className="h-4 w-4" /> 76 + <Globe2 className="mr-2 h-4 w-4" /> 77 + <span> 54 78 <code>{selected.length}</code> Regions 55 79 </span> 80 + <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" /> 56 81 </Button> 57 - </DropdownMenuTrigger> 58 - <DropdownMenuContent> 59 - <DropdownMenuCheckboxItem 60 - checked={allSelected} 61 - onCheckedChange={(checked) => setSelected(checked ? regions : [])} 82 + </PopoverTrigger> 83 + <PopoverContent className="p-0" align="start"> 84 + <Command 85 + // FIXME: keywords not taken - it would be great to search for "Europe" 86 + // filter={(value, search, keywords) => { 87 + // const extendValue = `${value} ${keywords?.join(" ") || ""}`; 88 + // if (extendValue.includes(search)) return 1; 89 + // return 0; 90 + // }} 62 91 > 63 - All regions 64 - </DropdownMenuCheckboxItem> 65 - <DropdownMenuSeparator /> 66 - {regions.map((region) => { 67 - const { code, flag } = flyRegionsDict[region]; 68 - return ( 69 - <DropdownMenuCheckboxItem 70 - key={region} 71 - onSelect={(e) => e.preventDefault()} 72 - checked={selected.includes(region)} 73 - onCheckedChange={(checked) => { 74 - setSelected((prev) => 75 - checked 76 - ? [...prev, region] 77 - : prev.filter((r) => r !== region), 78 - ); 79 - }} 80 - className="font-mono" 81 - > 82 - {flag} {code} 83 - </DropdownMenuCheckboxItem> 84 - ); 85 - })} 86 - </DropdownMenuContent> 87 - </DropdownMenu> 92 + <CommandInput placeholder="Search regions..." /> 93 + <CommandList className="max-h-64"> 94 + <CommandEmpty>No results found.</CommandEmpty> 95 + <CommandGroup> 96 + <CommandItem 97 + onSelect={() => setSelected(allSelected ? [] : regions)} 98 + > 99 + {allSelected ? "Clear all" : "Select all"} 100 + </CommandItem> 101 + </CommandGroup> 102 + <CommandSeparator /> 103 + {Object.entries(regionsByContinent).map(([key, regions]) => { 104 + return ( 105 + <CommandGroup key={key} heading={key}> 106 + {regions.map((region) => { 107 + const { code, flag, location, continent } = region; 108 + const isSelected = selected.includes(code); 109 + return ( 110 + <CommandItem 111 + key={code} 112 + value={code} 113 + keywords={[code, location, continent]} 114 + onSelect={(checked) => { 115 + setSelected((prev) => 116 + !prev.includes(checked as Region) 117 + ? [...prev, code] 118 + : prev.filter((r) => r !== code) 119 + ); 120 + }} 121 + > 122 + <div 123 + className={cn( 124 + "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary", 125 + isSelected 126 + ? "bg-primary text-primary-foreground" 127 + : "opacity-50 [&_svg]:invisible" 128 + )} 129 + > 130 + <Check className={cn("h-4 w-4")} /> 131 + </div> 132 + <div className="flex w-full justify-between"> 133 + <span> 134 + {code}{" "} 135 + <span className="truncate text-muted-foreground"> 136 + {location} 137 + </span> 138 + </span> 139 + <span>{flag}</span> 140 + </div> 141 + </CommandItem> 142 + ); 143 + })} 144 + </CommandGroup> 145 + ); 146 + })} 147 + </CommandList> 148 + </Command> 149 + </PopoverContent> 150 + </Popover> 88 151 ); 89 152 }
+1 -1
packages/ui/package.json
··· 44 44 "@radix-ui/react-tooltip": "1.0.7", 45 45 "class-variance-authority": "0.7.0", 46 46 "clsx": "2.0.0", 47 - "cmdk": "0.2.0", 47 + "cmdk": "1.0.0", 48 48 "date-fns": "2.30.0", 49 49 "lucide-react": "0.279.0", 50 50 "luxon": "3.3.0",
+6 -6
packages/ui/src/components/command.tsx
··· 16 16 ref={ref} 17 17 className={cn( 18 18 "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", 19 - className, 19 + className 20 20 )} 21 21 {...props} 22 22 /> ··· 47 47 ref={ref} 48 48 className={cn( 49 49 "placeholder:text-foreground-muted flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50", 50 - className, 50 + className 51 51 )} 52 52 {...props} 53 53 /> ··· 90 90 ref={ref} 91 91 className={cn( 92 92 "text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", 93 - className, 93 + className 94 94 )} 95 95 {...props} 96 96 /> ··· 117 117 <CommandPrimitive.Item 118 118 ref={ref} 119 119 className={cn( 120 - "aria-selected:bg-accent aria-selected:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50", 121 - className, 120 + "aria-selected:bg-accent aria-selected:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50", 121 + className 122 122 )} 123 123 {...props} 124 124 /> ··· 134 134 <span 135 135 className={cn( 136 136 "text-muted-foreground ml-auto text-xs tracking-widest", 137 - className, 137 + className 138 138 )} 139 139 {...props} 140 140 />
+25 -22
packages/ui/src/components/multi-select.tsx
··· 5 5 import * as React from "react"; 6 6 7 7 import { Badge } from "./badge"; 8 - import { Command, CommandGroup, CommandItem } from "./command"; 8 + import { Command, CommandGroup, CommandItem, CommandList } from "./command"; 9 9 10 10 type Option = Record<"value" | "label", string | number>; 11 11 ··· 48 48 } 49 49 } 50 50 }, 51 - [], 51 + [] 52 52 ); 53 53 54 54 const selectables = options.filter((option) => !selected.includes(option)); ··· 102 102 <div className="relative mt-2"> 103 103 {open && selectables.length > 0 ? ( 104 104 <div className="bg-popover text-popover-foreground animate-in absolute top-0 z-10 w-full rounded-md border shadow-md outline-none"> 105 - <CommandGroup className="h-full overflow-auto"> 106 - {selectables.map((option) => { 107 - return ( 108 - <CommandItem 109 - key={option.value} 110 - onMouseDown={(e) => { 111 - e.preventDefault(); 112 - e.stopPropagation(); 113 - }} 114 - onSelect={(_value) => { 115 - setInputValue(""); 116 - setSelected((prev) => [...prev, option]); 117 - }} 118 - className={"cursor-pointer"} 119 - > 120 - {option.label} 121 - </CommandItem> 122 - ); 123 - })} 124 - </CommandGroup> 105 + <CommandList> 106 + <CommandGroup className="h-full overflow-auto"> 107 + {selectables.map((option) => { 108 + return ( 109 + <CommandItem 110 + key={option.value} 111 + onMouseDown={(e) => { 112 + e.preventDefault(); 113 + e.stopPropagation(); 114 + }} 115 + onSelect={(_value) => { 116 + setInputValue(""); 117 + setSelected((prev) => [...prev, option]); 118 + }} 119 + value={String(option.label)} 120 + className={"cursor-pointer"} 121 + > 122 + {option.label} 123 + </CommandItem> 124 + ); 125 + })} 126 + </CommandGroup> 127 + </CommandList> 125 128 </div> 126 129 ) : null} 127 130 </div>
+17 -16
packages/utils/index.ts
··· 125 125 // }, 126 126 // } as const; 127 127 128 - export const flyRegionsDict: Record< 129 - MonitorFlyRegion, 130 - { 131 - code: MonitorFlyRegion; 132 - location: string; 133 - flag: string; 134 - continent: 135 - | "Europe" 136 - | "North America" 137 - | "South America" 138 - | "Asia" 139 - | "Africa" 140 - | "Oceania"; 141 - } 142 - > = { 128 + export type Continent = 129 + | "Europe" 130 + | "North America" 131 + | "South America" 132 + | "Asia" 133 + | "Africa" 134 + | "Oceania"; 135 + 136 + export type RegionInfo = { 137 + code: MonitorFlyRegion; 138 + location: string; 139 + flag: string; 140 + continent: Continent; 141 + }; 142 + 143 + export const flyRegionsDict: Record<MonitorFlyRegion, RegionInfo> = { 143 144 ams: { 144 145 code: "ams", 145 146 location: "Amsterdam, Netherlands", ··· 391 392 Oceania: [], 392 393 Asia: [], 393 394 Africa: [], 394 - } 395 + }, 395 396 ); 396 397 397 398 export const vercelRegions = [
+10 -226
pnpm-lock.yaml
··· 372 372 specifier: 2.0.0 373 373 version: 2.0.0 374 374 cmdk: 375 - specifier: 0.2.0 376 - version: 0.2.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 375 + specifier: 1.0.0 376 + version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 377 377 cobe: 378 378 specifier: 0.6.3 379 379 version: 0.6.3 ··· 1086 1086 specifier: 2.0.0 1087 1087 version: 2.0.0 1088 1088 cmdk: 1089 - specifier: 0.2.0 1090 - version: 0.2.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1089 + specifier: 1.0.0 1090 + version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1091 1091 date-fns: 1092 1092 specifier: 2.30.0 1093 1093 version: 2.30.0 ··· 2864 2864 '@radix-ui/number@1.0.1': 2865 2865 resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} 2866 2866 2867 - '@radix-ui/primitive@1.0.0': 2868 - resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} 2869 - 2870 2867 '@radix-ui/primitive@1.0.1': 2871 2868 resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} 2872 2869 ··· 2988 2985 '@types/react-dom': 2989 2986 optional: true 2990 2987 2991 - '@radix-ui/react-context@1.0.0': 2992 - resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} 2993 - peerDependencies: 2994 - react: ^16.8 || ^17.0 || ^18.0 2995 - 2996 2988 '@radix-ui/react-context@1.0.1': 2997 2989 resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 2998 2990 peerDependencies: ··· 3001 2993 peerDependenciesMeta: 3002 2994 '@types/react': 3003 2995 optional: true 3004 - 3005 - '@radix-ui/react-dialog@1.0.0': 3006 - resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} 3007 - peerDependencies: 3008 - react: ^16.8 || ^17.0 || ^18.0 3009 - react-dom: ^16.8 || ^17.0 || ^18.0 3010 2996 3011 2997 '@radix-ui/react-dialog@1.0.4': 3012 2998 resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} ··· 3043 3029 '@types/react': 3044 3030 optional: true 3045 3031 3046 - '@radix-ui/react-dismissable-layer@1.0.0': 3047 - resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} 3048 - peerDependencies: 3049 - react: ^16.8 || ^17.0 || ^18.0 3050 - react-dom: ^16.8 || ^17.0 || ^18.0 3051 - 3052 3032 '@radix-ui/react-dismissable-layer@1.0.4': 3053 3033 resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} 3054 3034 peerDependencies: ··· 3088 3068 '@types/react-dom': 3089 3069 optional: true 3090 3070 3091 - '@radix-ui/react-focus-guards@1.0.0': 3092 - resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} 3093 - peerDependencies: 3094 - react: ^16.8 || ^17.0 || ^18.0 3095 - 3096 3071 '@radix-ui/react-focus-guards@1.0.1': 3097 3072 resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} 3098 3073 peerDependencies: ··· 3102 3077 '@types/react': 3103 3078 optional: true 3104 3079 3105 - '@radix-ui/react-focus-scope@1.0.0': 3106 - resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} 3107 - peerDependencies: 3108 - react: ^16.8 || ^17.0 || ^18.0 3109 - react-dom: ^16.8 || ^17.0 || ^18.0 3110 - 3111 3080 '@radix-ui/react-focus-scope@1.0.3': 3112 3081 resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} 3113 3082 peerDependencies: ··· 3146 3115 optional: true 3147 3116 '@types/react-dom': 3148 3117 optional: true 3149 - 3150 - '@radix-ui/react-id@1.0.0': 3151 - resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} 3152 - peerDependencies: 3153 - react: ^16.8 || ^17.0 || ^18.0 3154 3118 3155 3119 '@radix-ui/react-id@1.0.1': 3156 3120 resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} ··· 3213 3177 '@types/react-dom': 3214 3178 optional: true 3215 3179 3216 - '@radix-ui/react-portal@1.0.0': 3217 - resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} 3218 - peerDependencies: 3219 - react: ^16.8 || ^17.0 || ^18.0 3220 - react-dom: ^16.8 || ^17.0 || ^18.0 3221 - 3222 3180 '@radix-ui/react-portal@1.0.3': 3223 3181 resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} 3224 3182 peerDependencies: ··· 3245 3203 '@types/react-dom': 3246 3204 optional: true 3247 3205 3248 - '@radix-ui/react-presence@1.0.0': 3249 - resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} 3250 - peerDependencies: 3251 - react: ^16.8 || ^17.0 || ^18.0 3252 - react-dom: ^16.8 || ^17.0 || ^18.0 3253 - 3254 3206 '@radix-ui/react-presence@1.0.1': 3255 3207 resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} 3256 3208 peerDependencies: ··· 3264 3216 '@types/react-dom': 3265 3217 optional: true 3266 3218 3267 - '@radix-ui/react-primitive@1.0.0': 3268 - resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} 3269 - peerDependencies: 3270 - react: ^16.8 || ^17.0 || ^18.0 3271 - react-dom: ^16.8 || ^17.0 || ^18.0 3272 - 3273 3219 '@radix-ui/react-primitive@1.0.3': 3274 3220 resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 3275 3221 peerDependencies: ··· 3414 3360 '@types/react-dom': 3415 3361 optional: true 3416 3362 3417 - '@radix-ui/react-use-callback-ref@1.0.0': 3418 - resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} 3419 - peerDependencies: 3420 - react: ^16.8 || ^17.0 || ^18.0 3421 - 3422 3363 '@radix-ui/react-use-callback-ref@1.0.1': 3423 3364 resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 3424 3365 peerDependencies: ··· 3427 3368 peerDependenciesMeta: 3428 3369 '@types/react': 3429 3370 optional: true 3430 - 3431 - '@radix-ui/react-use-controllable-state@1.0.0': 3432 - resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} 3433 - peerDependencies: 3434 - react: ^16.8 || ^17.0 || ^18.0 3435 3371 3436 3372 '@radix-ui/react-use-controllable-state@1.0.1': 3437 3373 resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} ··· 3442 3378 '@types/react': 3443 3379 optional: true 3444 3380 3445 - '@radix-ui/react-use-escape-keydown@1.0.0': 3446 - resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} 3447 - peerDependencies: 3448 - react: ^16.8 || ^17.0 || ^18.0 3449 - 3450 3381 '@radix-ui/react-use-escape-keydown@1.0.3': 3451 3382 resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} 3452 3383 peerDependencies: ··· 3455 3386 peerDependenciesMeta: 3456 3387 '@types/react': 3457 3388 optional: true 3458 - 3459 - '@radix-ui/react-use-layout-effect@1.0.0': 3460 - resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} 3461 - peerDependencies: 3462 - react: ^16.8 || ^17.0 || ^18.0 3463 3389 3464 3390 '@radix-ui/react-use-layout-effect@1.0.1': 3465 3391 resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} ··· 4637 4563 resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 4638 4564 engines: {node: '>=6'} 4639 4565 4640 - cmdk@0.2.0: 4641 - resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==} 4566 + cmdk@1.0.0: 4567 + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} 4642 4568 peerDependencies: 4643 4569 react: ^18.0.0 4644 4570 react-dom: ^18.0.0 ··· 4665 4591 4666 4592 comma-separated-tokens@2.0.3: 4667 4593 resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 4668 - 4669 - command-score@0.1.2: 4670 - resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} 4671 4594 4672 4595 commander@10.0.1: 4673 4596 resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} ··· 7067 6990 '@types/react': 7068 6991 optional: true 7069 6992 7070 - react-remove-scroll@2.5.4: 7071 - resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} 7072 - engines: {node: '>=10'} 7073 - peerDependencies: 7074 - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 7075 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 7076 - peerDependenciesMeta: 7077 - '@types/react': 7078 - optional: true 7079 - 7080 6993 react-remove-scroll@2.5.5: 7081 6994 resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} 7082 6995 engines: {node: '>=10'} ··· 10026 9939 dependencies: 10027 9940 '@babel/runtime': 7.23.2 10028 9941 10029 - '@radix-ui/primitive@1.0.0': 10030 - dependencies: 10031 - '@babel/runtime': 7.23.2 10032 - 10033 9942 '@radix-ui/primitive@1.0.1': 10034 9943 dependencies: 10035 9944 '@babel/runtime': 7.23.2 ··· 10142 10051 '@babel/runtime': 7.23.2 10143 10052 react: 18.2.0 10144 10053 10145 - '@radix-ui/react-compose-refs@1.0.0(react@18.3.1)': 10146 - dependencies: 10147 - '@babel/runtime': 7.23.2 10148 - react: 18.3.1 10149 - 10150 10054 '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10151 10055 dependencies: 10152 10056 '@babel/runtime': 7.23.2 ··· 10169 10073 '@types/react': 18.3.3 10170 10074 '@types/react-dom': 18.3.0 10171 10075 10172 - '@radix-ui/react-context@1.0.0(react@18.3.1)': 10173 - dependencies: 10174 - '@babel/runtime': 7.23.2 10175 - react: 18.3.1 10176 - 10177 10076 '@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10178 10077 dependencies: 10179 10078 '@babel/runtime': 7.23.2 ··· 10181 10080 optionalDependencies: 10182 10081 '@types/react': 18.3.3 10183 10082 10184 - '@radix-ui/react-dialog@1.0.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10185 - dependencies: 10186 - '@babel/runtime': 7.23.2 10187 - '@radix-ui/primitive': 1.0.0 10188 - '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) 10189 - '@radix-ui/react-context': 1.0.0(react@18.3.1) 10190 - '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10191 - '@radix-ui/react-focus-guards': 1.0.0(react@18.3.1) 10192 - '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10193 - '@radix-ui/react-id': 1.0.0(react@18.3.1) 10194 - '@radix-ui/react-portal': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10195 - '@radix-ui/react-presence': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10196 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10197 - '@radix-ui/react-slot': 1.0.0(react@18.3.1) 10198 - '@radix-ui/react-use-controllable-state': 1.0.0(react@18.3.1) 10199 - aria-hidden: 1.2.3 10200 - react: 18.3.1 10201 - react-dom: 18.3.1(react@18.3.1) 10202 - react-remove-scroll: 2.5.4(@types/react@18.3.3)(react@18.3.1) 10203 - transitivePeerDependencies: 10204 - - '@types/react' 10205 - 10206 10083 '@radix-ui/react-dialog@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10207 10084 dependencies: 10208 10085 '@babel/runtime': 7.23.2 ··· 10256 10133 optionalDependencies: 10257 10134 '@types/react': 18.3.3 10258 10135 10259 - '@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10260 - dependencies: 10261 - '@babel/runtime': 7.23.2 10262 - '@radix-ui/primitive': 1.0.0 10263 - '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) 10264 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10265 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) 10266 - '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.3.1) 10267 - react: 18.3.1 10268 - react-dom: 18.3.1(react@18.3.1) 10269 - 10270 10136 '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10271 10137 dependencies: 10272 10138 '@babel/runtime': 7.23.2 ··· 10311 10177 '@types/react': 18.3.3 10312 10178 '@types/react-dom': 18.3.0 10313 10179 10314 - '@radix-ui/react-focus-guards@1.0.0(react@18.3.1)': 10315 - dependencies: 10316 - '@babel/runtime': 7.23.2 10317 - react: 18.3.1 10318 - 10319 10180 '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10320 10181 dependencies: 10321 10182 '@babel/runtime': 7.23.2 ··· 10323 10184 optionalDependencies: 10324 10185 '@types/react': 18.3.3 10325 10186 10326 - '@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10327 - dependencies: 10328 - '@babel/runtime': 7.23.2 10329 - '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) 10330 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10331 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) 10332 - react: 18.3.1 10333 - react-dom: 18.3.1(react@18.3.1) 10334 - 10335 10187 '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10336 10188 dependencies: 10337 10189 '@babel/runtime': 7.23.2 ··· 10373 10225 optionalDependencies: 10374 10226 '@types/react': 18.3.3 10375 10227 '@types/react-dom': 18.3.0 10376 - 10377 - '@radix-ui/react-id@1.0.0(react@18.3.1)': 10378 - dependencies: 10379 - '@babel/runtime': 7.23.2 10380 - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) 10381 - react: 18.3.1 10382 10228 10383 10229 '@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10384 10230 dependencies: ··· 10468 10314 '@types/react': 18.3.3 10469 10315 '@types/react-dom': 18.3.0 10470 10316 10471 - '@radix-ui/react-portal@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10472 - dependencies: 10473 - '@babel/runtime': 7.23.2 10474 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 10475 - react: 18.3.1 10476 - react-dom: 18.3.1(react@18.3.1) 10477 - 10478 10317 '@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10479 10318 dependencies: 10480 10319 '@babel/runtime': 7.23.2 ··· 10495 10334 '@types/react': 18.3.3 10496 10335 '@types/react-dom': 18.3.0 10497 10336 10498 - '@radix-ui/react-presence@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10499 - dependencies: 10500 - '@babel/runtime': 7.23.2 10501 - '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) 10502 - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) 10503 - react: 18.3.1 10504 - react-dom: 18.3.1(react@18.3.1) 10505 - 10506 10337 '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10507 10338 dependencies: 10508 10339 '@babel/runtime': 7.23.2 ··· 10513 10344 optionalDependencies: 10514 10345 '@types/react': 18.3.3 10515 10346 '@types/react-dom': 18.3.0 10516 - 10517 - '@radix-ui/react-primitive@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10518 - dependencies: 10519 - '@babel/runtime': 7.23.2 10520 - '@radix-ui/react-slot': 1.0.0(react@18.3.1) 10521 - react: 18.3.1 10522 - react-dom: 18.3.1(react@18.3.1) 10523 10347 10524 10348 '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 10525 10349 dependencies: ··· 10625 10449 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 10626 10450 react: 18.2.0 10627 10451 10628 - '@radix-ui/react-slot@1.0.0(react@18.3.1)': 10629 - dependencies: 10630 - '@babel/runtime': 7.23.2 10631 - '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) 10632 - react: 18.3.1 10633 - 10634 10452 '@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1)': 10635 10453 dependencies: 10636 10454 '@babel/runtime': 7.23.2 ··· 10705 10523 '@types/react': 18.3.3 10706 10524 '@types/react-dom': 18.3.0 10707 10525 10708 - '@radix-ui/react-use-callback-ref@1.0.0(react@18.3.1)': 10709 - dependencies: 10710 - '@babel/runtime': 7.23.2 10711 - react: 18.3.1 10712 - 10713 10526 '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10714 10527 dependencies: 10715 10528 '@babel/runtime': 7.23.2 10716 10529 react: 18.3.1 10717 10530 optionalDependencies: 10718 10531 '@types/react': 18.3.3 10719 - 10720 - '@radix-ui/react-use-controllable-state@1.0.0(react@18.3.1)': 10721 - dependencies: 10722 - '@babel/runtime': 7.23.2 10723 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) 10724 - react: 18.3.1 10725 10532 10726 10533 '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10727 10534 dependencies: ··· 10731 10538 optionalDependencies: 10732 10539 '@types/react': 18.3.3 10733 10540 10734 - '@radix-ui/react-use-escape-keydown@1.0.0(react@18.3.1)': 10735 - dependencies: 10736 - '@babel/runtime': 7.23.2 10737 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) 10738 - react: 18.3.1 10739 - 10740 10541 '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)': 10741 10542 dependencies: 10742 10543 '@babel/runtime': 7.23.2 ··· 10744 10545 react: 18.3.1 10745 10546 optionalDependencies: 10746 10547 '@types/react': 18.3.3 10747 - 10748 - '@radix-ui/react-use-layout-effect@1.0.0(react@18.3.1)': 10749 - dependencies: 10750 - '@babel/runtime': 7.23.2 10751 - react: 18.3.1 10752 10548 10753 10549 '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)': 10754 10550 dependencies: ··· 12195 11991 12196 11992 clsx@2.0.0: {} 12197 11993 12198 - cmdk@0.2.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 11994 + cmdk@1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 12199 11995 dependencies: 12200 - '@radix-ui/react-dialog': 1.0.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 12201 - command-score: 0.1.2 11996 + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 11997 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 12202 11998 react: 18.3.1 12203 11999 react-dom: 18.3.1(react@18.3.1) 12204 12000 transitivePeerDependencies: 12205 12001 - '@types/react' 12002 + - '@types/react-dom' 12206 12003 12207 12004 cobe@0.6.3: 12208 12005 dependencies: ··· 12225 12022 delayed-stream: 1.0.0 12226 12023 12227 12024 comma-separated-tokens@2.0.3: {} 12228 - 12229 - command-score@0.1.2: {} 12230 12025 12231 12026 commander@10.0.1: {} 12232 12027 ··· 15148 14943 react: 18.3.1 15149 14944 react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) 15150 14945 tslib: 2.6.2 15151 - optionalDependencies: 15152 - '@types/react': 18.3.3 15153 - 15154 - react-remove-scroll@2.5.4(@types/react@18.3.3)(react@18.3.1): 15155 - dependencies: 15156 - react: 18.3.1 15157 - react-remove-scroll-bar: 2.3.4(@types/react@18.3.3)(react@18.3.1) 15158 - react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) 15159 - tslib: 2.6.2 15160 - use-callback-ref: 1.3.0(@types/react@18.3.3)(react@18.3.1) 15161 - use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) 15162 14946 optionalDependencies: 15163 14947 '@types/react': 18.3.3 15164 14948