chore: tighten .vscode IDE and typescript configuration (#24537)

This branch tightens import hygiene and editor guidance to reduce
accidental use of legacy or discouraged patterns.
It also updates consumers too, by propagating the new `lucide-react`
import convention across the existing UI surfaces that reference those
icons.

- Updated `.vscode/settings.json` to prefer non-relative imports and
improve TypeScript auto-import behavior.
- Re-enabled and expanded Biome restricted-import enforcement in
`biome.jsonc` for migration guardrails.
- Added/used `lucide-react` `-Icon` naming conventions for clarity and
consistency.
- Updated consumers too across components, modules, and pages so the new
import rules are applied end-to-end.
This commit is contained in:
Jake Howell
2026-04-21 13:45:08 +10:00
committed by GitHub
parent e186dc3222
commit 67c57abb63
63 changed files with 218 additions and 183 deletions
+17 -1
View File
@@ -62,5 +62,21 @@
"[markdown]": {
"editor.defaultFormatter": "DavidAnson.vscode-markdownlint"
},
"biome.lsp.bin": "site/node_modules/.bin/biome"
"biome.lsp.bin": "site/node_modules/.bin/biome",
// Prefer type only imports.
"typescript.preferences.preferTypeOnlyAutoImports": true,
// Prefer aliased/non-relative imports (e.g. "#/...") over "../../...".
"typescript.preferences.importModuleSpecifier": "non-relative",
"javascript.preferences.importModuleSpecifier": "non-relative",
// We discourage people from various older libraries that
// are no longer recommended/being migrated from.
"typescript.preferences.autoImportSpecifierExcludeRegexes": [
// discourage people from using MUI components
"^@mui(?:/.*)?$",
// discourage people from using Emotion CSS
"^@emotion(?:/.*)?$",
// we prefer people use `lodash/foo` over `lodash`
"^lodash$"
]
}
+16 -16
View File
@@ -51,8 +51,8 @@
"message": "React 19 no longer requires forwardRef. Use ref as a prop instead.",
"importNames": ["forwardRef"]
},
// "@mui/material/Alert": "Use components/Alert/Alert instead.",
// "@mui/material/AlertTitle": "Use components/Alert/Alert instead.",
"@mui/material/Alert": "Use components/Alert/Alert instead.",
"@mui/material/AlertTitle": "Use components/Alert/Alert instead.",
// "@mui/material/Autocomplete": "Use shadcn/ui Combobox instead.",
"@mui/material/Avatar": "Use components/Avatar/Avatar instead.",
"@mui/material/Box": "Use a <div> with Tailwind classes instead.",
@@ -61,7 +61,7 @@
// "@mui/material/CardActionArea": "Use shadcn/ui Card component instead.",
// "@mui/material/CardContent": "Use shadcn/ui Card component instead.",
// "@mui/material/Checkbox": "Use shadcn/ui Checkbox component instead.",
// "@mui/material/Chip": "Use components/Badge or Tailwind styles instead.",
"@mui/material/Chip": "Use components/Badge or Tailwind styles instead.",
// "@mui/material/CircularProgress": "Use components/Spinner/Spinner instead.",
// "@mui/material/Collapse": "Use shadcn/ui Collapsible instead.",
// "@mui/material/CssBaseline": "Use Tailwind CSS base styles instead.",
@@ -74,48 +74,48 @@
// "@mui/material/Drawer": "Use shadcn/ui Sheet component instead.",
// "@mui/material/FormControl": "Use native form elements with Tailwind instead.",
// "@mui/material/FormControlLabel": "Use shadcn/ui Label with form components instead.",
// "@mui/material/FormGroup": "Use a <div> with Tailwind classes instead.",
"@mui/material/FormGroup": "Use a <div> with Tailwind classes instead.",
// "@mui/material/FormHelperText": "Use a <p> with Tailwind classes instead.",
// "@mui/material/FormLabel": "Use shadcn/ui Label component instead.",
// "@mui/material/Grid": "Use Tailwind grid utilities instead.",
// "@mui/material/IconButton": "Use components/Button/Button with variant='icon' instead.",
"@mui/material/FormLabel": "Use shadcn/ui Label component instead.",
"@mui/material/Grid": "Use Tailwind grid utilities instead.",
"@mui/material/IconButton": "Use components/Button/Button with variant='icon' instead.",
// "@mui/material/InputAdornment": "Use Tailwind positioning in input wrapper instead.",
// "@mui/material/InputBase": "Use shadcn/ui Input component instead.",
// "@mui/material/LinearProgress": "Use a progress bar with Tailwind instead.",
"@mui/material/LinearProgress": "Use a progress bar with Tailwind instead.",
// "@mui/material/Link": "Use React Router Link or native <a> tags instead.",
// "@mui/material/List": "Use native <ul> with Tailwind instead.",
// "@mui/material/ListItem": "Use native <li> with Tailwind instead.",
// "@mui/material/ListItemIcon": "Use lucide-react icons in list items instead.",
"@mui/material/ListItemIcon": "Use lucide-react icons in list items instead.",
// "@mui/material/ListItemText": "Use native elements with Tailwind instead.",
// "@mui/material/Menu": "Use shadcn/ui DropdownMenu instead.",
// "@mui/material/MenuItem": "Use shadcn/ui DropdownMenu components instead.",
// "@mui/material/MenuList": "Use shadcn/ui DropdownMenu components instead.",
// "@mui/material/Paper": "Use a <div> with Tailwind shadow/border classes instead.",
"@mui/material/Paper": "Use a <div> with Tailwind shadow/border classes instead.",
"@mui/material/Popover": "Use components/Popover/Popover instead.",
// "@mui/material/Radio": "Use shadcn/ui RadioGroup instead.",
// "@mui/material/RadioGroup": "Use shadcn/ui RadioGroup instead.",
// "@mui/material/Select": "Use shadcn/ui Select component instead.",
// "@mui/material/Skeleton": "Use shadcn/ui Skeleton component instead.",
"@mui/material/Skeleton": "Use shadcn/ui Skeleton component instead.",
// "@mui/material/Snackbar": "Use components/GlobalSnackbar instead.",
// "@mui/material/Stack": "Use Tailwind flex utilities instead (e.g., <div className='flex flex-col gap-4'>).",
// "@mui/material/styles": "Use Tailwind CSS instead.",
// "@mui/material/SvgIcon": "Use lucide-react icons instead.",
// "@mui/material/Switch": "Use shadcn/ui Switch component instead.",
"@mui/material/Switch": "Use shadcn/ui Switch component instead.",
"@mui/material/Table": "Import from components/Table/Table instead.",
// "@mui/material/TableRow": "Import from components/Table/Table instead.",
"@mui/material/TableRow": "Import from components/Table/Table instead.",
// "@mui/material/TextField": "Use shadcn/ui Input component instead.",
// "@mui/material/ToggleButton": "Use shadcn/ui Toggle or custom component instead.",
// "@mui/material/ToggleButtonGroup": "Use shadcn/ui Toggle or custom component instead.",
"@mui/material/Tooltip": "Use components/Tooltip/Tooltip instead.",
"@mui/material/Typography": "Use native HTML elements instead. Eg: <span>, <p>, <h1>, etc.",
// "@mui/material/useMediaQuery": "Use Tailwind responsive classes or custom hook instead.",
"@mui/material/useMediaQuery": "Use Tailwind responsive classes or custom hook instead.",
// "@mui/system": "Use Tailwind CSS instead.",
// "@mui/utils": "Use native alternatives or utility libraries instead.",
"@mui/utils": "Use native alternatives or utility libraries instead.",
// "@emotion/css": "Use Tailwind CSS instead.",
// "@emotion/react": "Use Tailwind CSS instead.",
"@emotion/styled": "Use Tailwind CSS instead.",
// "@emotion/cache": "Use Tailwind CSS instead.",
// "components/Stack/Stack": "Use Tailwind flex utilities instead (e.g., <div className='flex flex-col gap-4'>).",
// "#/components/Stack/Stack": "Use Tailwind flex utilities instead (e.g., <div className='flex flex-col gap-4'>).",
"lodash": "Use lodash/<name> instead."
}
}
+3
View File
@@ -0,0 +1,3 @@
declare module "lucide-react" {
export * from "lucide-react/dist/lucide-react.suffixed";
}
@@ -1,4 +1,4 @@
import { ChevronDown as LucideChevronDown } from "lucide-react";
import { ChevronDownIcon as LucideChevronDown } from "lucide-react";
import { cn } from "#/utils/cn";
interface ChevronDownIconProps
@@ -1,5 +1,5 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { useState } from "react";
import { expect, fn, screen, userEvent, waitFor, within } from "storybook/test";
import { Avatar } from "#/components/Avatar/Avatar";
@@ -319,7 +319,7 @@ export const WithCustomRenderOption: Story = {
subtitle={user.email}
src={user.avatar_url}
/>
{isSelected && <Check className="size-4 shrink-0" />}
{isSelected && <CheckIcon className="size-4 shrink-0" />}
</div>
)}
/>
@@ -363,7 +363,7 @@ export const WithStartAdornment: Story = {
subtitle={user.email}
src={user.avatar_url}
/>
{isSelected && <Check className="size-4 shrink-0" />}
{isSelected && <CheckIcon className="size-4 shrink-0" />}
</div>
)}
/>
@@ -1,4 +1,4 @@
import { Check, X } from "lucide-react";
import { CheckIcon, XIcon } from "lucide-react";
import {
type KeyboardEvent,
type ReactNode,
@@ -184,7 +184,7 @@ export function Autocomplete<TOption>({
className="flex items-center justify-center size-5 rounded hover:bg-surface-secondary transition-colors cursor-pointer"
aria-label="Clear selection"
>
<X className="size-4 text-content-secondary hover:text-content-primary" />
<XIcon className="size-4 text-content-secondary hover:text-content-primary" />
</span>
)}
<span className="flex items-center justify-center size-5">
@@ -234,7 +234,9 @@ export function Autocomplete<TOption>({
) : (
<>
<span className="flex-1">{optionLabel}</span>
{selected && <Check className="size-4 shrink-0" />}
{selected && (
<CheckIcon className="size-4 shrink-0" />
)}
</>
)}
</CommandItem>
+12 -12
View File
@@ -1,5 +1,5 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { Database, Settings, TriangleAlert } from "lucide-react";
import { DatabaseIcon, SettingsIcon, TriangleAlertIcon } from "lucide-react";
import { Badges } from "#/components/Badges/Badges";
import { Badge } from "./Badge";
@@ -14,15 +14,15 @@ export const Default: Story = {
render: () => (
<Badges>
<Badge size="xs">
<Database />
<DatabaseIcon />
Text
</Badge>
<Badge size="sm">
<Database />
<DatabaseIcon />
Text
</Badge>
<Badge size="md">
<Database />
<DatabaseIcon />
Text
</Badge>
</Badges>
@@ -34,14 +34,14 @@ export const Warning: Story = {
<Badges>
<Badge variant="warning" size="xs">
Warning
<TriangleAlert />
<TriangleAlertIcon />
</Badge>
<Badge variant="warning" size="sm">
<TriangleAlert />
<TriangleAlertIcon />
Warning
</Badge>
<Badge variant="warning" size="md">
<TriangleAlert />
<TriangleAlertIcon />
Warning
</Badge>
</Badges>
@@ -53,14 +53,14 @@ export const Destructive: Story = {
<Badges>
<Badge variant="destructive" size="xs">
Destructive
<TriangleAlert />
<TriangleAlertIcon />
</Badge>
<Badge variant="destructive" size="sm">
<TriangleAlert />
<TriangleAlertIcon />
Destructive
</Badge>
<Badge variant="destructive" size="md">
<TriangleAlert />
<TriangleAlertIcon />
Destructive
</Badge>
</Badges>
@@ -134,7 +134,7 @@ export const Magenta: Story = {
export const SmallWithIcon: Story = {
render: () => (
<Badge variant="default" size="sm">
<Settings />
<SettingsIcon />
Preset
</Badge>
),
@@ -143,7 +143,7 @@ export const SmallWithIcon: Story = {
export const MediumWithIcon: Story = {
render: () => (
<Badge variant="warning" size="md">
<TriangleAlert />
<TriangleAlertIcon />
Immutable
</Badge>
),
@@ -2,7 +2,7 @@
* Copied from shadc/ui on 12/13/2024
* @see {@link https://ui.shadcn.com/docs/components/breadcrumb}
*/
import { MoreHorizontal } from "lucide-react";
import { MoreHorizontalIcon } from "lucide-react";
import { Slot } from "radix-ui";
import { cn } from "#/utils/cn";
@@ -110,7 +110,7 @@ export const BreadcrumbEllipsis: React.FC<
className={cn("flex h-9 w-9 items-center justify-center", className)}
{...props}
>
<MoreHorizontal className="h-4 w-4" />
<MoreHorizontalIcon className="h-4 w-4" />
<span className="sr-only">More</span>
</span>
);
+3 -3
View File
@@ -2,7 +2,7 @@
* Copied from shadc/ui on 04/03/2025
* @see {@link https://ui.shadcn.com/docs/components/checkbox}
*/
import { Check, Minus } from "lucide-react";
import { CheckIcon, MinusIcon } from "lucide-react";
import { Checkbox as CheckboxPrimitive } from "radix-ui";
import { cn } from "#/utils/cn";
@@ -44,10 +44,10 @@ export const Checkbox: React.FC<
)}
>
{(props.checked === true || props.defaultChecked === true) && (
<Check className="size-4" strokeWidth={2.5} />
<CheckIcon className="size-4" strokeWidth={2.5} />
)}
{props.checked === "indeterminate" && (
<Minus className="size-4" strokeWidth={2.5} />
<MinusIcon className="size-4" strokeWidth={2.5} />
)}
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
@@ -1,5 +1,5 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { ChevronsUpDown } from "lucide-react";
import { ChevronsUpDownIcon } from "lucide-react";
import { Button } from "#/components/Button/Button";
import {
Collapsible,
@@ -20,7 +20,7 @@ const meta: Meta<typeof Collapsible> = {
</h4>
<CollapsibleTrigger asChild>
<Button size="sm">
<ChevronsUpDown />
<ChevronsUpDownIcon />
<span className="sr-only">Toggle</span>
</Button>
</CollapsibleTrigger>
+2 -2
View File
@@ -1,5 +1,5 @@
import { Command as CommandPrimitive } from "cmdk";
import { Search } from "lucide-react";
import { SearchIcon } from "lucide-react";
import { cn } from "#/utils/cn";
export const Command: React.FC<
@@ -21,7 +21,7 @@ export const CommandInput: React.FC<
> = ({ className, ...props }) => {
return (
<div className="flex items-center border-b px-3" cmdk-input-wrapper="">
<Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
<SearchIcon className="mr-2 h-4 w-4 shrink-0 opacity-50" />
<CommandPrimitive.Input
className={cn(
`flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none border-none
@@ -5,7 +5,7 @@
* This component was updated to match the styles from the Figma design:
* @see {@link https://www.figma.com/design/WfqIgsTFXN2BscBSSyXWF8/Coder-kit?node-id=656-2354&t=CiGt5le3yJEwMH4M-0}
*/
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
import { cn } from "#/utils/cn";
import {
@@ -72,7 +72,7 @@ export const DropdownMenuRadioItem: React.FC<
{children}
<span className="absolute top-3.5 right-2 flex h-3.5 w-3.5 items-center justify-center">
<DropdownMenuPrimitive.ItemIndicator>
<Check className="h-4 w-4" />
<CheckIcon className="h-4 w-4" />
</DropdownMenuPrimitive.ItemIndicator>
</span>
</DropdownMenuPrimitive.RadioItem>
+2 -2
View File
@@ -1,4 +1,4 @@
import { ExternalLinkIcon, SlidersHorizontal } from "lucide-react";
import { ExternalLinkIcon, SlidersHorizontalIcon } from "lucide-react";
import {
type ComponentProps,
type FC,
@@ -274,7 +274,7 @@ const PresetMenu: FC<PresetMenuProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline">
<SlidersHorizontal />
<SlidersHorizontalIcon />
Filters
</Button>
</DropdownMenuTrigger>
@@ -3,7 +3,7 @@
* @see {@link https://shadcnui-expansions.typeart.cc/docs/multiple-selector}
*/
import { Command as CommandPrimitive, useCommandState } from "cmdk";
import { Info, X } from "lucide-react";
import { InfoIcon, XIcon } from "lucide-react";
import {
type ComponentPropsWithoutRef,
type KeyboardEvent,
@@ -526,7 +526,7 @@ export const MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({
}}
onClick={() => handleUnselect(option)}
>
<X className="h-4 w-4 text-content-secondary hover:text-content-primary align-text-bottom" />
<XIcon className="h-4 w-4 text-content-secondary hover:text-content-primary align-text-bottom" />
</button>
</Badge>
);
@@ -593,7 +593,7 @@ export const MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({
"hidden",
)}
>
<X className="h-5 w-5" />
<XIcon className="h-5 w-5" />
</button>
<ChevronDownIcon
open={open}
@@ -677,7 +677,7 @@ export const MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({
<Tooltip>
<TooltipTrigger asChild>
<span className="flex items-center pointer-events-auto">
<Info className="!w-3.5 !h-3.5 text-content-secondary" />
<InfoIcon className="!w-3.5 !h-3.5 text-content-secondary" />
</span>
</TooltipTrigger>
<TooltipContent side="right" sideOffset={10}>
@@ -1,4 +1,4 @@
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { type FC, useState } from "react";
import type { Organization } from "#/api/typesGenerated";
import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown";
@@ -90,7 +90,7 @@ export const OrganizationAutocomplete: FC<OrganizationAutocompleteProps> = ({
{org.display_name || org.name}
</span>
{value?.id === org.id && (
<Check className="ml-auto size-icon-sm shrink-0" />
<CheckIcon className="ml-auto size-icon-sm shrink-0" />
)}
</CommandItem>
))}
@@ -2,7 +2,7 @@
* Copied from shadc/ui on 04/04/2025
* @see {@link https://ui.shadcn.com/docs/components/radio-group}
*/
import { Circle } from "lucide-react";
import { CircleIcon } from "lucide-react";
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
import { cn } from "#/utils/cn";
@@ -33,7 +33,7 @@ export const RadioGroupItem: React.FC<
{...props}
>
<RadioGroupPrimitive.Indicator className="flex items-center justify-center">
<Circle className="absolute h-2.5 w-2.5 fill-surface-invert-primary" />
<CircleIcon className="absolute h-2.5 w-2.5 fill-surface-invert-primary" />
</RadioGroupPrimitive.Indicator>
</RadioGroupPrimitive.Item>
);
+5 -5
View File
@@ -3,9 +3,9 @@
* @see {@link https://ui.shadcn.com/docs/components/select}
*/
import {
Check,
ChevronUp,
ChevronDown as LucideChevronDown,
CheckIcon,
ChevronUpIcon,
ChevronDownIcon as LucideChevronDown,
} from "lucide-react";
import { Select as SelectPrimitive } from "radix-ui";
import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown";
@@ -54,7 +54,7 @@ const SelectScrollUpButton: React.FC<
)}
{...props}
>
<ChevronUp className="size-icon-sm" />
<ChevronUpIcon className="size-icon-sm" />
</SelectPrimitive.ScrollUpButton>
);
@@ -134,7 +134,7 @@ export const SelectItem: React.FC<
>
<span className="absolute right-2 top-1/2 -translate-y-1/2 flex items-center justify-center">
<SelectPrimitive.ItemIndicator className="size-icon-sm">
<Check className="size-icon-sm" />
<CheckIcon className="size-icon-sm" />
</SelectPrimitive.ItemIndicator>
</span>
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
+2 -2
View File
@@ -1,4 +1,4 @@
import { X } from "lucide-react";
import { XIcon } from "lucide-react";
import { type FC, useId, useMemo } from "react";
import { Badge } from "#/components/Badge/Badge";
import { Button } from "#/components/Button/Button";
@@ -43,7 +43,7 @@ export const TagInput: FC<TagInputProps> = ({
}}
aria-label={`Remove ${value}`}
>
<X className="size-3" />
<XIcon className="size-3" />
</Button>
</Badge>
))}
@@ -1,4 +1,4 @@
import { ArrowUpRight } from "lucide-react";
import { ArrowUpRightIcon } from "lucide-react";
import type { FC } from "react";
import type { BuildInfoResponse, Experiment } from "#/api/typesGenerated";
import {
@@ -87,7 +87,7 @@ export const DeploymentSidebarView: FC<DeploymentSidebarViewProps> = ({
{permissions.viewAnyGroup && (
<SidebarNavItem href="/deployment/groups">
<Stack direction="row" alignItems="center" spacing={0.5}>
Groups {showOrganizations && <ArrowUpRight size={16} />}
Groups {showOrganizations && <ArrowUpRightIcon size={16} />}
</Stack>
</SidebarNavItem>
)}
@@ -1,4 +1,4 @@
import { Check, Plus } from "lucide-react";
import { CheckIcon, PlusIcon } from "lucide-react";
import { type FC, useState } from "react";
import { useNavigate } from "react-router";
import type { Organization } from "#/api/typesGenerated";
@@ -110,7 +110,7 @@ export const OrganizationSidebarView: FC<
{organization?.display_name || organization?.name}
</span>
{activeOrganization?.name === organization.name && (
<Check className="ml-auto" />
<CheckIcon className="ml-auto" />
)}
</CommandItem>
))}
@@ -129,7 +129,7 @@ export const OrganizationSidebarView: FC<
}, 200);
}}
>
<Plus /> Create Organization
<PlusIcon /> Create Organization
</CommandItem>
</CommandGroup>
</>
@@ -1,4 +1,4 @@
import { SquareCheckBig } from "lucide-react";
import { SquareCheckBigIcon } from "lucide-react";
import type { FC } from "react";
import Markdown from "react-markdown";
import { Link as RouterLink } from "react-router";
@@ -69,7 +69,7 @@ export const InboxItem: FC<InboxItemProps> = ({
variant="outline"
size="sm"
>
<SquareCheckBig />
<SquareCheckBigIcon />
mark as read
</Button>
</>
@@ -1,4 +1,4 @@
import { Folder } from "lucide-react";
import { FolderIcon } from "lucide-react";
import type { FC } from "react";
import type {
Workspace,
@@ -29,7 +29,7 @@ export const AgentApps: FC<AgentAppsProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<AgentButton>
<Folder />
<FolderIcon />
{section.group}
</AgentButton>
</DropdownMenuTrigger>
@@ -1,4 +1,4 @@
import { Container, ExternalLinkIcon } from "lucide-react";
import { ContainerIcon, ExternalLinkIcon } from "lucide-react";
import type { FC } from "react";
import { useMutation, useQueryClient } from "react-query";
import { toast } from "sonner";
@@ -184,7 +184,7 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
bg-surface-primary px-2
text-xs text-content-secondary"
>
<Container size={12} className="mr-1.5" />
<ContainerIcon size={12} className="mr-1.5" />
{devcontainer.subagent_id ? (
<Tooltip>
<TooltipTrigger asChild>
@@ -1,4 +1,4 @@
import { EllipsisVertical } from "lucide-react";
import { EllipsisVerticalIcon } from "lucide-react";
import { type FC, useId, useState } from "react";
import { Button } from "#/components/Button/Button";
import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog";
@@ -24,7 +24,7 @@ export const AgentDevcontainerMoreActions: FC<
<DropdownMenu open={open} onOpenChange={setOpen}>
<DropdownMenuTrigger asChild>
<Button size="icon-lg" variant="subtle" aria-controls={menuContentId}>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Dev Container actions</span>
</Button>
</DropdownMenuTrigger>
@@ -13,7 +13,7 @@ import {
LockOpenIcon,
RadioIcon,
ShareIcon,
X as XIcon,
XIcon,
} from "lucide-react";
import { type FC, useState } from "react";
import { useMutation, useQuery } from "react-query";
+3 -3
View File
@@ -1,4 +1,4 @@
import { CircleCheck, X } from "lucide-react";
import { CircleCheckIcon, XIcon } from "lucide-react";
import type { FC } from "react";
import { TableCell } from "#/components/Table/Table";
@@ -10,12 +10,12 @@ export const AISeatCell: FC<AISeatCellProps> = ({ hasAISeat }) => {
return (
<TableCell>
{hasAISeat ? (
<CircleCheck
<CircleCheckIcon
className="size-5 text-content-success"
aria-label="Consuming AI seat"
/>
) : (
<X
<XIcon
className="size-5 text-content-disabled"
aria-label="Not consuming AI seat"
/>
@@ -1,12 +1,12 @@
import {
CircleAlert,
Eye,
EyeOff,
Hourglass,
Info,
CircleAlertIcon,
EyeIcon,
EyeOffIcon,
HourglassIcon,
InfoIcon,
LinkIcon,
Settings,
TriangleAlert,
SettingsIcon,
TriangleAlertIcon,
} from "lucide-react";
import { type FC, useId, useRef, useState } from "react";
import * as Yup from "yup";
@@ -142,7 +142,7 @@ const ParameterLabel: FC<ParameterLabelProps> = ({
<TooltipTrigger asChild>
<span className="flex items-center">
<Badge size="sm" variant="warning">
<TriangleAlert />
<TriangleAlertIcon />
Immutable
</Badge>
</span>
@@ -160,7 +160,7 @@ const ParameterLabel: FC<ParameterLabelProps> = ({
<TooltipTrigger asChild>
<span className="flex items-center">
<Badge size="sm" variant="green">
<Hourglass />
<HourglassIcon />
Ephemeral
</Badge>
</span>
@@ -178,7 +178,7 @@ const ParameterLabel: FC<ParameterLabelProps> = ({
<TooltipTrigger asChild>
<span className="flex items-center">
<Badge size="sm">
<Settings />
<SettingsIcon />
Preset
</Badge>
</span>
@@ -529,9 +529,9 @@ const MaskableInput: FC<MaskableInputProps> = ({
disabled={disabled}
>
{showMaskedInput ? (
<EyeOff className="h-4 w-4" />
<EyeOffIcon className="h-4 w-4" />
) : (
<Eye className="h-4 w-4" />
<EyeIcon className="h-4 w-4" />
)}
</Button>
)}
@@ -583,9 +583,9 @@ const MaskableTextArea: FC<MaskableInputProps> = ({
disabled={disabled}
>
{showMaskedInput ? (
<EyeOff className="h-4 w-4" />
<EyeOffIcon className="h-4 w-4" />
) : (
<Eye className="h-4 w-4" />
<EyeIcon className="h-4 w-4" />
)}
</Button>
)}
@@ -637,7 +637,7 @@ const OptionDisplay: FC<OptionDisplayProps> = ({ option }) => {
<TooltipProvider delayDuration={100}>
<Tooltip>
<TooltipTrigger asChild>
<Info className="w-3.5 h-3.5 text-content-secondary" />
<InfoIcon className="w-3.5 h-3.5 text-content-secondary" />
</TooltipTrigger>
<TooltipContent side="right" sideOffset={10}>
{option.description}
@@ -934,13 +934,13 @@ export const Diagnostics: FC<DiagnosticsProps> = ({ diagnostics }) => {
>
<div className="flex flex-row items-start">
{diagnostic.severity === "error" && (
<CircleAlert
<CircleAlertIcon
className="me-2 inline-flex shrink-0 text-content-destructive size-icon-sm"
aria-hidden="true"
/>
)}
{diagnostic.severity === "warning" && (
<TriangleAlert
<TriangleAlertIcon
className="me-2 inline-flex shrink-0 text-content-warning size-icon-sm"
aria-hidden="true"
/>
@@ -1,7 +1,7 @@
import {
CopyIcon,
DownloadIcon,
EllipsisVertical,
EllipsisVerticalIcon,
HistoryIcon,
SettingsIcon,
SquareIcon,
@@ -134,7 +134,7 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
aria-controls="workspace-options"
disabled={disabled}
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Workspace actions</span>
</Button>
</DropdownMenuTrigger>
@@ -1,4 +1,4 @@
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { type FC, useState } from "react";
import { keepPreviousData, useQuery } from "react-query";
import { groupsByOrganization } from "#/api/queries/groups";
@@ -122,7 +122,7 @@ export const UserOrGroupAutocomplete: FC<UserOrGroupAutocompleteProps> = ({
subtitle={isGroup(option) ? getGroupSubtitle(option) : option.email}
src={option.avatar_url}
/>
{isSelected && <Check className="size-4 shrink-0" />}
{isSelected && <CheckIcon className="size-4 shrink-0" />}
</div>
)}
open={open}
@@ -1,4 +1,4 @@
import { EllipsisVertical, UserPlusIcon } from "lucide-react";
import { EllipsisVerticalIcon, UserPlusIcon } from "lucide-react";
import type { FC, ReactNode } from "react";
import { useQuery } from "react-query";
import { workspaceSharingSettings } from "#/api/queries/organizations";
@@ -279,7 +279,7 @@ export const WorkspaceSharingForm: FC<WorkspaceSharingFormProps> = ({
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -327,7 +327,7 @@ export const WorkspaceSharingForm: FC<WorkspaceSharingFormProps> = ({
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,6 +1,5 @@
import {
ArrowUpIcon,
Check,
CheckIcon,
ChevronRightIcon,
ImageIcon,
@@ -9,7 +8,7 @@ import {
PencilIcon,
PlusIcon,
ServerIcon,
Square,
SquareIcon,
XIcon,
} from "lucide-react";
import type React from "react";
@@ -820,7 +819,7 @@ export const AgentChatInput: FC<AgentChatInputProps> = ({
<PencilIcon className="size-3.5 shrink-0" />
<span>Plan first</span>
{planModeEnabled && (
<Check className="ml-auto size-icon-sm shrink-0" />
<CheckIcon className="ml-auto size-icon-sm shrink-0" />
)}
</button>
)}
@@ -874,7 +873,7 @@ export const AgentChatInput: FC<AgentChatInputProps> = ({
>
{workspace.name}
{selectedWorkspaceId === workspace.id && (
<Check className="ml-auto size-icon-sm shrink-0" />
<CheckIcon className="ml-auto size-icon-sm shrink-0" />
)}
</CommandItem>
))}
@@ -1079,7 +1078,7 @@ export const AgentChatInput: FC<AgentChatInputProps> = ({
onClick={onInterrupt}
disabled={isInterruptPending}
>
<Square className="fill-current" />
<SquareIcon className="fill-current" />
<span className="sr-only">Stop</span>
</Button>
)}
@@ -1,4 +1,4 @@
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { type FC, useState } from "react";
import type { Organization } from "#/api/typesGenerated";
import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown";
@@ -113,7 +113,7 @@ export const CompactOrgSelector: FC<CompactOrgSelectorProps> = ({
{org.display_name || org.name}
</span>
{value?.id === org.id && (
<Check className="ml-auto size-icon-sm shrink-0" />
<CheckIcon className="ml-auto size-icon-sm shrink-0" />
)}
</CommandItem>
))}
@@ -1,4 +1,4 @@
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { type FC, useId, useState } from "react";
import { Link } from "react-router";
import { getErrorMessage } from "#/api/errors";
@@ -238,7 +238,9 @@ export const GroupLimitsSection: FC<GroupLimitsSectionProps> = ({
src={option.avatar_url}
imgFallbackText={option.name}
/>
{isSelected && <Check className="size-4 shrink-0" />}
{isSelected && (
<CheckIcon className="size-4 shrink-0" />
)}
</div>
)}
placeholder="Search groups..."
@@ -1,5 +1,5 @@
import { useFormik } from "formik";
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { Select as SelectPrimitive } from "radix-ui";
import { type FC, useState } from "react";
import { useQuery } from "react-query";
@@ -269,7 +269,7 @@ export const CreateUserForm: FC<CreateUserFormProps> = ({
>
<span className="absolute right-2 top-2 flex items-center justify-center">
<SelectPrimitive.ItemIndicator>
<Check className="size-icon-sm" />
<CheckIcon className="size-icon-sm" />
</SelectPrimitive.ItemIndicator>
</span>
<div className="flex flex-col py-0.5">
@@ -1,5 +1,5 @@
import { type FormikContextType, useFormik } from "formik";
import { ArrowLeft, ExternalLinkIcon } from "lucide-react";
import { ArrowLeftIcon, ExternalLinkIcon } from "lucide-react";
import {
type FC,
useCallback,
@@ -381,7 +381,7 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
type="button"
className="flex items-center gap-2 bg-transparent border-none text-content-secondary hover:text-content-primary translate-y-12"
>
<ArrowLeft size={20} />
<ArrowLeftIcon size={20} />
Go back
</button>
</div>
@@ -1,4 +1,4 @@
import { Check, Redo } from "lucide-react";
import { CheckIcon, RedoIcon } from "lucide-react";
import type { FC } from "react";
import type { TemplateVersionExternalAuth } from "#/api/typesGenerated";
import { Badge } from "#/components/Badge/Badge";
@@ -47,7 +47,7 @@ export const ExternalAuthButton: FC<ExternalAuthButtonProps> = ({
<span className="flex flex-row items-center gap-2">
{auth.authenticated ? (
<>
<Check className="w-4 h-4 text-content-success" />
<CheckIcon className="w-4 h-4 text-content-success" />
<p className="text-xs font-semibold text-content-secondary m-0">
Authenticated
</p>
@@ -75,7 +75,7 @@ export const ExternalAuthButton: FC<ExternalAuthButtonProps> = ({
<Tooltip>
<TooltipTrigger asChild>
<Button variant="outline" size="icon" onClick={onStartPolling}>
<Redo />
<RedoIcon />
<span className="sr-only">Refresh external auth</span>
</Button>
</TooltipTrigger>
@@ -1,6 +1,6 @@
import type { Interpolation, Theme } from "@emotion/react";
import Checkbox from "@mui/material/Checkbox";
import { EllipsisVertical } from "lucide-react";
import { EllipsisVerticalIcon } from "lucide-react";
import type { FC } from "react";
import type { BannerConfig } from "#/api/typesGenerated";
import { Button } from "#/components/Button/Button";
@@ -51,7 +51,7 @@ export const AnnouncementBannerItem: FC<AnnouncementBannerItemProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="icon-lg" variant="subtle" aria-label="Open menu">
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,5 +1,5 @@
import { saveAs } from "file-saver";
import { Download } from "lucide-react";
import { DownloadIcon } from "lucide-react";
import { type FC, useState } from "react";
import { toast } from "sonner";
import { getErrorDetail } from "#/api/errors";
@@ -43,7 +43,7 @@ export const ExportPolicyButton: FC<ExportPolicyButtonProps> = ({
}
}}
>
<Download />
<DownloadIcon />
Export Policy
</Button>
);
@@ -1,5 +1,5 @@
import { useFormik } from "formik";
import { Plus, Trash, TriangleAlert } from "lucide-react";
import { PlusIcon, TrashIcon, TriangleAlertIcon } from "lucide-react";
import { type FC, type KeyboardEventHandler, useId, useState } from "react";
import * as Yup from "yup";
import type {
@@ -327,7 +327,7 @@ export const IdpOrgSyncPageView: FC<IdpSyncPageViewProps> = ({
}}
>
<Spinner loading={form.isSubmitting}>
<Plus />
<PlusIcon />
</Spinner>
Add IdP organization
</Button>
@@ -455,7 +455,7 @@ const OrganizationRow: FC<OrganizationRowProps> = ({
{!exists && (
<Tooltip>
<TooltipTrigger asChild>
<TriangleAlert className="size-icon-xs cursor-pointer text-content-warning" />
<TriangleAlertIcon className="size-icon-xs cursor-pointer text-content-warning" />
</TooltipTrigger>
<TooltipContent
align="start"
@@ -482,7 +482,7 @@ const OrganizationRow: FC<OrganizationRowProps> = ({
aria-label="delete"
onClick={() => onDelete(idpOrg)}
>
<Trash />
<TrashIcon />
<span className="sr-only">Delete IdP mapping</span>
</Button>
</TableCell>
@@ -4,6 +4,7 @@ import type {
Experiment,
SerpentOption,
} from "#/api/typesGenerated";
import { Alert, AlertTitle } from "#/components/Alert/Alert";
import { Link } from "#/components/Link/Link";
import {
SettingsHeader,
@@ -14,7 +15,6 @@ import {
import { Stack } from "#/components/Stack/Stack";
import { useDeploymentOptions } from "#/utils/deployOptions";
import { docs } from "#/utils/docs";
import { Alert, AlertTitle } from "../../../components/Alert/Alert";
import OptionsTable from "../OptionsTable";
import { UserEngagementChart } from "./UserEngagementChart";
@@ -1,4 +1,9 @@
import { Activity, Coins, Expand, SquareArrowOutUpRight } from "lucide-react";
import {
ActivityIcon,
CoinsIcon,
ExpandIcon,
SquareArrowOutUpRightIcon,
} from "lucide-react";
import type { FC } from "react";
import { Button } from "#/components/Button/Button";
import { Link } from "#/components/Link/Link";
@@ -24,7 +29,7 @@ const EnterpriseVersion: FC = () => {
</div>
<Button asChild>
<a href="https://coder.com/contact/sales" className="no-underline">
<SquareArrowOutUpRight />
<SquareArrowOutUpRightIcon />
Contact sales
</a>
</Button>
@@ -93,7 +98,7 @@ const OSSVersion: FC = () => {
</div>
<Button asChild>
<a href="https://coder.com/contact/sales" className="no-underline">
<SquareArrowOutUpRight />
<SquareArrowOutUpRightIcon />
Contact sales
</a>
</Button>
@@ -102,7 +107,7 @@ const OSSVersion: FC = () => {
<section className="pb-10 max-w-xl text-sm text-content-secondary">
<h2 className="text-xl text-content-primary m-0">
<span className="flex flex-row items-center">
<Expand className="size-icon-sm text-content-secondary" />
<ExpandIcon className="size-icon-sm text-content-secondary" />
&nbsp; Deploy coder at scale
</span>
</h2>
@@ -147,7 +152,7 @@ const OSSVersion: FC = () => {
<section className="pb-10 max-w-xl text-sm text-content-secondary">
<h2 className="text-xl text-content-primary m-0">
<span className="flex flex-row items-center">
<Coins className="size-icon-sm text-content-secondary" />
<CoinsIcon className="size-icon-sm text-content-secondary" />
&nbsp; Control infrastructure costs
</span>
</h2>
@@ -192,7 +197,7 @@ const OSSVersion: FC = () => {
<section className="pb-5 max-w-xl text-sm text-content-secondary">
<h2 className="text-xl text-content-primary m-0">
<span className="flex flex-row items-center">
<Activity className="size-icon-sm text-content-secondary" />
<ActivityIcon className="size-icon-sm text-content-secondary" />
&nbsp; Govern workspace activity
</span>
</h2>
@@ -1,5 +1,5 @@
import type { Interpolation, Theme } from "@emotion/react";
import { EllipsisVertical, UserPlusIcon } from "lucide-react";
import { EllipsisVerticalIcon, UserPlusIcon } from "lucide-react";
import { type FC, useState } from "react";
import { useMutation, useQueryClient } from "react-query";
import { useOutletContext } from "react-router";
@@ -259,7 +259,7 @@ const GroupMemberRow: FC<GroupMemberRowProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="icon-lg" variant="subtle" aria-label="Open menu">
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,6 +1,6 @@
import TextField from "@mui/material/TextField";
import { useFormik } from "formik";
import { ArrowLeft } from "lucide-react";
import { ArrowLeftIcon } from "lucide-react";
import type { FC } from "react";
import { Link, useNavigate } from "react-router";
import * as Yup from "yup";
@@ -68,7 +68,7 @@ export const CreateOrganizationPageView: FC<
to="/organizations"
className="flex flex-row items-center gap-2 no-underline text-content-secondary hover:text-content-primary"
>
<ArrowLeft size={20} />
<ArrowLeftIcon size={20} />
Go Back
</Link>
</div>
@@ -1,4 +1,4 @@
import { EllipsisVertical, PlusIcon } from "lucide-react";
import { EllipsisVerticalIcon, PlusIcon } from "lucide-react";
import type { FC } from "react";
import { Link as RouterLink, useNavigate } from "react-router";
import type { AssignableRoles, Role } from "#/api/typesGenerated";
@@ -218,7 +218,7 @@ const RoleRow: FC<RoleRowProps> = ({
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</ShadcnButton>
</DropdownMenuTrigger>
@@ -1,5 +1,5 @@
import { useFormik } from "formik";
import { Plus, Trash, TriangleAlert } from "lucide-react";
import { PlusIcon, TrashIcon, TriangleAlertIcon } from "lucide-react";
import { type FC, type KeyboardEventHandler, useId, useState } from "react";
import * as Yup from "yup";
import type {
@@ -332,7 +332,7 @@ export const IdpGroupSyncForm: FC<IdpGroupSyncFormProps> = ({
}}
>
<Spinner loading={form.isSubmitting}>
<Plus />
<PlusIcon />
</Spinner>
Add IdP group
</Button>
@@ -408,7 +408,7 @@ const GroupRow: FC<GroupRowProps> = ({
{!exists && (
<Tooltip>
<TooltipTrigger asChild>
<TriangleAlert className="size-icon-xs cursor-pointer text-content-warning" />
<TriangleAlertIcon className="size-icon-xs cursor-pointer text-content-warning" />
</TooltipTrigger>
<TooltipContent
align="start"
@@ -437,7 +437,7 @@ const GroupRow: FC<GroupRowProps> = ({
aria-label="delete"
onClick={() => onDelete(idpGroup)}
>
<Trash />
<TrashIcon />
<span className="sr-only">Delete IdP mapping</span>
</Button>
</TableCell>
@@ -1,5 +1,5 @@
import { useFormik } from "formik";
import { Plus, Trash, TriangleAlert } from "lucide-react";
import { PlusIcon, TrashIcon, TriangleAlertIcon } from "lucide-react";
import { type FC, type KeyboardEventHandler, useId, useState } from "react";
import * as Yup from "yup";
import type {
@@ -276,7 +276,7 @@ export const IdpRoleSyncForm: FC<IdpRoleSyncFormProps> = ({
}}
>
<Spinner loading={form.isSubmitting}>
<Plus />
<PlusIcon />
</Spinner>
Add IdP role
</Button>
@@ -329,7 +329,7 @@ const RoleRow: FC<RoleRowProps> = ({
{!exists && (
<Tooltip>
<TooltipTrigger asChild>
<TriangleAlert className="size-icon-xs cursor-pointer text-content-warning" />
<TriangleAlertIcon className="size-icon-xs cursor-pointer text-content-warning" />
</TooltipTrigger>
<TooltipContent
align="start"
@@ -358,7 +358,7 @@ const RoleRow: FC<RoleRowProps> = ({
aria-label="delete"
onClick={() => onDelete(idpRole)}
>
<Trash />
<TrashIcon />
<span className="sr-only">Delete IdP mapping</span>
</Button>
</TableCell>
@@ -1,4 +1,8 @@
import { EllipsisVertical, TriangleAlert, UserPlusIcon } from "lucide-react";
import {
EllipsisVerticalIcon,
TriangleAlertIcon,
UserPlusIcon,
} from "lucide-react";
import { type FC, useState } from "react";
import { toast } from "sonner";
import { getErrorDetail, getErrorMessage } from "#/api/errors";
@@ -106,7 +110,7 @@ export const OrganizationMembersPageView: FC<
</div>
{!canViewMembers && (
<div className="flex flex-row text-content-warning gap-2 items-center text-sm font-medium">
<TriangleAlert className="size-icon-sm" />
<TriangleAlertIcon className="size-icon-sm" />
<p>
You do not have permission to view members other than yourself.
</p>
@@ -189,7 +193,7 @@ export const OrganizationMembersPageView: FC<
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
+6 -2
View File
@@ -1,4 +1,8 @@
import { EllipsisVertical, ExternalLinkIcon, HouseIcon } from "lucide-react";
import {
EllipsisVerticalIcon,
ExternalLinkIcon,
HouseIcon,
} from "lucide-react";
import { type FC, type HTMLProps, useRef } from "react";
import { Link as RouterLink } from "react-router";
import type { Workspace } from "#/api/typesGenerated";
@@ -69,7 +73,7 @@ export const TaskAppIFrame: FC<TaskAppIFrameProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="icon" variant="subtle" aria-label="More options">
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">More options</span>
</Button>
</DropdownMenuTrigger>
+2 -2
View File
@@ -1,4 +1,4 @@
import { EllipsisVertical, RotateCcwIcon, TrashIcon } from "lucide-react";
import { EllipsisVerticalIcon, RotateCcwIcon, TrashIcon } from "lucide-react";
import { type FC, type ReactNode, useState } from "react";
import { useMutation, useQueryClient } from "react-query";
import { useNavigate } from "react-router";
@@ -294,7 +294,7 @@ const TaskRow: FC<TaskRowProps> = ({ task, checked, onCheckChange }) => {
variant="subtle"
onClick={(e) => e.stopPropagation()}
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Show task actions</span>
</Button>
</DropdownMenuTrigger>
@@ -1,6 +1,6 @@
import chroma from "chroma-js";
import {
CircleCheck as CircleCheckIcon,
CircleCheckIcon,
CircleXIcon,
SquareArrowOutUpRightIcon,
} from "lucide-react";
@@ -2,7 +2,7 @@ import {
CopyIcon,
DownloadIcon,
EditIcon,
EllipsisVertical,
EllipsisVerticalIcon,
PlusIcon,
SettingsIcon,
TrashIcon,
@@ -102,7 +102,7 @@ const TemplateMenu: FC<TemplateMenuProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<ShadcnButton size="icon-lg" variant="subtle" aria-label="Open menu">
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</ShadcnButton>
</DropdownMenuTrigger>
@@ -1,4 +1,4 @@
import { RefreshCw } from "lucide-react";
import { RefreshCwIcon } from "lucide-react";
import type { FC } from "react";
import { useMutation } from "react-query";
import { toast } from "sonner";
@@ -68,7 +68,7 @@ export const TemplatePrebuildsPageView: FC<TemplatePrebuildsPageViewProps> = ({
disabled={invalidateMutation.isPending}
className="gap-2"
>
<RefreshCw className="size-4" />
<RefreshCwIcon className="size-4" />
Invalidate now
</Button>
</div>
@@ -1,4 +1,4 @@
import { EllipsisVertical, UserPlusIcon } from "lucide-react";
import { EllipsisVerticalIcon, UserPlusIcon } from "lucide-react";
import { type FC, useState } from "react";
import type {
Group,
@@ -315,7 +315,7 @@ export const TemplatePermissionsPageView: FC<
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -368,7 +368,7 @@ export const TemplatePermissionsPageView: FC<
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,4 +1,4 @@
import { Check } from "lucide-react";
import { CheckIcon } from "lucide-react";
import { type FC, useState } from "react";
import { keepPreviousData, useQuery } from "react-query";
import { templaceACLAvailable } from "#/api/queries/templates";
@@ -78,7 +78,7 @@ export const UserOrGroupAutocomplete: FC<UserOrGroupAutocompleteProps> = ({
subtitle={isGroup(option) ? getGroupSubtitle(option) : option.email}
src={option.avatar_url}
/>
{isSelected && <Check className="size-4 shrink-0" />}
{isSelected && <CheckIcon className="size-4 shrink-0" />}
</div>
)}
open={open}
@@ -12,12 +12,12 @@ import {
SelectFilter,
type SelectFilterOption,
} from "#/components/Filter/SelectFilter";
import { useDashboard } from "#/modules/dashboard/useDashboard";
import {
DEFAULT_USER_FILTER_WIDTH,
type UserFilterMenu,
UserMenu,
} from "../../components/Filter/UserFilter";
} from "#/components/Filter/UserFilter";
import { useDashboard } from "#/modules/dashboard/useDashboard";
interface TemplatesFilterProps {
filter: UseFilterResult;
@@ -1,5 +1,5 @@
import { useTheme } from "@emotion/react";
import { EllipsisVertical, RefreshCcwIcon } from "lucide-react";
import { EllipsisVerticalIcon, RefreshCcwIcon } from "lucide-react";
import { type FC, useCallback, useEffect, useState } from "react";
import { useQuery } from "react-query";
import { externalAuthProvider } from "#/api/queries/externalAuth";
@@ -178,7 +178,7 @@ const ExternalAuthRow: FC<ExternalAuthRowProps> = ({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="icon-lg" variant="subtle" aria-label="Open menu">
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,6 +1,6 @@
import Link from "@mui/material/Link";
import TextField from "@mui/material/TextField";
import { CircleCheck as CircleCheckIcon, KeyIcon } from "lucide-react";
import { CircleCheckIcon, KeyIcon } from "lucide-react";
import { type FC, useState } from "react";
import { useMutation } from "react-query";
import { API } from "#/api/api";
@@ -2,7 +2,7 @@ import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
import {
BanIcon,
EllipsisVertical,
EllipsisVerticalIcon,
KeyIcon,
ShieldIcon,
TrashIcon,
@@ -207,7 +207,7 @@ export const UsersTableBody: FC<UsersTableBodyProps> = ({
variant="subtle"
aria-label="Open menu"
>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
<span className="sr-only">Open menu</span>
</Button>
</DropdownMenuTrigger>
@@ -1,6 +1,6 @@
import type { Interpolation, Theme } from "@emotion/react";
import Link from "@mui/material/Link";
import { ChevronLeftIcon, CircleDollarSign, TrashIcon } from "lucide-react";
import { ChevronLeftIcon, CircleDollarSignIcon, TrashIcon } from "lucide-react";
import type { FC } from "react";
import { useQuery } from "react-query";
import { Link as RouterLink } from "react-router";
@@ -174,7 +174,7 @@ export const WorkspaceTopbar: FC<WorkspaceProps> = ({
>
<TopbarData>
<TopbarIcon>
<CircleDollarSign
<CircleDollarSignIcon
className="size-icon-sm"
aria-label="Daily usage"
/>
@@ -2,7 +2,7 @@ import {
SettingsIcon as GeneralIcon,
CodeIcon as ParameterIcon,
TimerIcon as ScheduleIcon,
Users as SharingIcon,
UsersIcon as SharingIcon,
} from "lucide-react";
import { Avatar } from "#/components/Avatar/Avatar";
import {
@@ -1,4 +1,4 @@
import { CircleHelp } from "lucide-react";
import { CircleHelpIcon } from "lucide-react";
import type { FC } from "react";
import { useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
import { useMutation, useQuery } from "react-query";
@@ -254,7 +254,7 @@ const WorkspaceParametersPageExperimental: FC = () => {
<TooltipProvider delayDuration={100}>
<Tooltip>
<TooltipTrigger asChild>
<CircleHelp className="size-icon-xs text-content-secondary" />
<CircleHelpIcon className="size-icon-xs text-content-secondary" />
</TooltipTrigger>
<TooltipContent className="max-w-xs text-sm">
Dynamic Parameters enhances Coder's existing parameter system
@@ -1,4 +1,4 @@
import { TriangleAlert } from "lucide-react";
import { TriangleAlertIcon } from "lucide-react";
import { Label, Slot } from "radix-ui";
import {
type FC,
@@ -184,7 +184,7 @@ const RunningWorkspacesWarning: FC<RunningWorkspacesWarningProps> = ({
className="rounded-md border-border-warning border border-solid p-4"
>
<h4 className="m-0 font-semibold flex flex-row items-center gap-2 text-content-primary">
<TriangleAlert className="text-content-warning" size={16} />
<TriangleAlertIcon className="text-content-warning" size={16} />
Running workspaces detected
</h4>
@@ -1,7 +1,7 @@
import {
BanIcon,
CloudIcon,
EllipsisVertical,
EllipsisVerticalIcon,
ExternalLinkIcon,
FileIcon,
PlayIcon,
@@ -370,7 +370,7 @@ const TableLoader: FC = () => {
<div className="flex gap-1 justify-end">
<Skeleton className="h-10 w-10" />
<Button size="icon-lg" variant="subtle" disabled>
<EllipsisVertical aria-hidden="true" />
<EllipsisVerticalIcon aria-hidden="true" />
</Button>
</div>
</TableCell>