Skip to content

Commit 8f9f55e

Browse files
atrakhConvex, Inc.
authored and
Convex, Inc.
committed
Refactor UI components to a new package (#36366)
Adds the UI package to make it easier to reuse UI that doesn't have any dependencies on convex GitOrigin-RevId: 23008a347cde234ad227073f3becd41fe3028890
1 parent eb60383 commit 8f9f55e

File tree

339 files changed

+1599
-2432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

339 files changed

+1599
-2432
lines changed

npm-packages/common/config/rush/pnpm-lock.yaml

Lines changed: 322 additions & 1311 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

npm-packages/dashboard-common/.eslintrc.cjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = {
1717
plugins: ["prettier", "tailwindcss"],
1818
settings: {
1919
tailwindcss: {
20-
config: path.join(__dirname, "./tailwind.config.ts"),
20+
config: path.join(__dirname, "../ui/tailwind.config.ts"),
2121
},
2222
},
2323
rules: {
@@ -132,7 +132,7 @@ module.exports = {
132132
{
133133
element: "button",
134134
message:
135-
"use elements/Button instead. If you really need a custom button, disable this rule and leave a comment explaining why.",
135+
"use @ui/Button instead. If you really need a custom button, disable this rule and leave a comment explaining why.",
136136
},
137137
{
138138
element: "details",

npm-packages/dashboard-common/package.json

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
"scripts": {
88
"build": "npm run build:generated && tsc --noEmit",
99
"build:generated": "python3 scripts/build-convexServerTypes.py",
10-
"storybook": "storybook dev -s ./public -p 6006 --no-open",
11-
"build-storybook": "storybook build",
1210
"lint": "eslint ./src --ext .js,.jsx,.ts,.tsx --ignore-pattern '**/*.stories.tsx'",
1311
"lint:fix": "eslint --fix ./src --ext .js,.jsx,.ts,.tsx --ignore-pattern '**/*.stories.tsx'"
1412
},
@@ -32,8 +30,8 @@
3230
"acorn": "~8.8.1",
3331
"base64-js": "^1.5.1",
3432
"classnames": "^2.3.2",
35-
"clsx": "2.1.1",
3633
"date-fns": "^2.29.3",
34+
"ui": "workspace:*",
3735
"formik": "^2.4.6",
3836
"fuzzy": "~0.1.3",
3937
"id-encoding": "workspace:*",
@@ -70,15 +68,7 @@
7068
},
7169
"devDependencies": {
7270
"@jest/types": "^29.6.0",
73-
"@storybook/addon-essentials": "^7.6.16",
74-
"@storybook/addon-interactions": "^7.6.16",
75-
"@storybook/addon-links": "^7.6.16",
76-
"@storybook/addon-styling": "^1.3.7",
77-
"@storybook/addon-themes": "^7.6.16",
78-
"@storybook/cli": "^7.6.16",
79-
"@storybook/nextjs": "^7.6.16",
8071
"@storybook/react": "^7.6.16",
81-
"@storybook/types": "^7.6.16",
8272
"@tailwindcss/forms": "^0.5.6",
8373
"@testing-library/dom": "~10.4.0",
8474
"@testing-library/jest-dom": "~6.6.0",
@@ -117,10 +107,8 @@
117107
"postcss": "^8.4.19",
118108
"prettier": "3.5.2",
119109
"prettier-plugin-tailwindcss": "~0.3.0",
120-
"storybook": "^7.6.16",
121110
"tailwindcss": "^3.2.4",
122111
"tailwind-scrollbar": "3.0.3",
123-
"typescript": "~5.0.3",
124-
"storybook-addon-next-router": "~4.0.2"
112+
"typescript": "~5.0.3"
125113
}
126114
}

npm-packages/dashboard-common/src/elements/BigChart.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import {
99
XAxis,
1010
YAxis,
1111
} from "recharts";
12-
import { LoadingTransition } from "@common/elements/Loading";
12+
import { LoadingTransition } from "@ui/Loading";
1313
import { ChartData, ChartDataSource } from "@common/lib/charts/types";
14-
import { Callout } from "@common/elements/Callout";
14+
import { Callout } from "@ui/Callout";
1515
import { ChartTooltip } from "@common/elements/ChartTooltip";
1616
import { DeploymentInfoContext } from "@common/lib/deploymentContext";
1717

npm-packages/dashboard-common/src/elements/BigMetric.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { cn } from "@common/lib/cn";
1+
import { cn } from "@ui/cn";
22
import { ReactNode } from "react";
33

44
export type MetricHealth = "healthy" | "warning" | "error";

npm-packages/dashboard-common/src/elements/Calendar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as React from "react";
44
import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons";
55
import { DayPicker } from "react-day-picker";
66

7-
import { cn } from "@common/lib/cn";
7+
import { cn } from "@ui/cn";
88

99
export type CalendarProps = React.ComponentProps<typeof DayPicker>;
1010

npm-packages/dashboard-common/src/elements/ChartModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from "react";
2-
import { Modal } from "@common/elements/Modal";
2+
import { Modal } from "@ui/Modal";
33
import { BigChart } from "@common/elements/BigChart";
44
import { ChartDataSource } from "@common/lib/charts/types";
55

npm-packages/dashboard-common/src/elements/CopyButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useState } from "react";
22
import { CopyIcon } from "@radix-ui/react-icons";
33
import { copyTextToClipboard } from "@common/lib/utils";
4-
import { Button } from "@common/elements/Button";
4+
import { Button } from "@ui/Button";
55

66
export function CopyButton({
77
text,

npm-packages/dashboard-common/src/elements/CopyTextButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { CopyIcon } from "@radix-ui/react-icons";
22
import classNames from "classnames";
33
import { useState } from "react";
44
import { copyTextToClipboard } from "@common/lib/utils";
5-
import { Button } from "@common/elements/Button";
5+
import { Button } from "@ui/Button";
66

77
export function CopyTextButton({
88
text,

npm-packages/dashboard-common/src/elements/DateRangePicker.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { endOfToday, parse, startOfDay, format } from "date-fns";
55
import { NextRouter } from "next/router";
66
import * as React from "react";
77
import { DateRange } from "react-day-picker";
8-
import { Popover } from "@common/elements/Popover";
9-
import { Button } from "@common/elements/Button";
8+
import { Popover } from "@ui/Popover";
9+
import { Button } from "@ui/Button";
1010
import { Calendar } from "@common/elements/Calendar";
1111

1212
export function DateRangePicker({

npm-packages/dashboard-common/src/elements/DeploymentEventContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { SchemaJson, displaySchema } from "@common/lib/format";
1818
import { DeploymentAuditLogEvent } from "@common/lib/useDeploymentAuditLog";
1919
import { DeploymentInfoContext } from "@common/lib/deploymentContext";
2020
import { TimestampDistance } from "@common/elements/TimestampDistance";
21-
import { Button } from "@common/elements/Button";
21+
import { Button } from "@ui/Button";
2222
import { ReadonlyCodeDiff } from "@common/elements/ReadonlyCode";
2323
import { NentNameOption } from "@common/elements/NentSwitcher";
2424
import { NENT_APP_PLACEHOLDER } from "@common/lib/useNents";

npm-packages/dashboard-common/src/elements/DetailPanel.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
/* This example requires Tailwind CSS v2.0+ */
22
import { Dialog, Transition } from "@headlessui/react";
33
import { Fragment, ReactNode, useState } from "react";
4-
import { Loading } from "@common/elements/Loading";
5-
import { Callout } from "@common/elements/Callout";
6-
import { ClosePanelButton } from "@common/elements/ClosePanelButton";
4+
import { Loading } from "@ui/Loading";
5+
import { Callout } from "@ui/Callout";
6+
import { ClosePanelButton } from "@ui/ClosePanelButton";
77

88
export function DetailPanel({
99
onClose,

npm-packages/dashboard-common/src/elements/EmptySection.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from "react";
2-
import { cn } from "@common/lib/cn";
2+
import { cn } from "@ui/cn";
33
import { ExternalLinkIcon } from "@radix-ui/react-icons";
4-
import { Button, ButtonProps } from "@common/elements/Button";
5-
import { Sheet } from "@common/elements/Sheet";
4+
import { Button, ButtonProps } from "@ui/Button";
5+
import { Sheet } from "@ui/Sheet";
66

77
export function EmptySection({
88
Icon,

npm-packages/dashboard-common/src/elements/FunctionNameOption.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { ROUTABLE_HTTP_METHODS } from "convex/server";
22
import { useHoverDirty } from "react-use";
33
import { useRef } from "react";
4-
import { cn } from "@common/lib/cn";
4+
import { cn } from "@ui/cn";
55
import {
66
displayName,
77
functionIdentifierFromValue,
88
} from "@common/lib/functions/generateFileTree";
9-
import { Tooltip } from "@common/elements/Tooltip";
9+
import { Tooltip } from "@ui/Tooltip";
1010
import { PuzzlePieceIcon } from "@common/elements/icons";
1111

1212
function splitFunctionName(functionName: string) {

npm-packages/dashboard-common/src/elements/HealthCard.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import {
33
ExclamationTriangleIcon,
44
InfoCircledIcon,
55
} from "@radix-ui/react-icons";
6-
import { cn } from "@common/lib/cn";
6+
import { cn } from "@ui/cn";
77
import React from "react";
8-
import { Sheet } from "@common/elements/Sheet";
9-
import { Tooltip } from "@common/elements/Tooltip";
10-
import { LoadingTransition } from "@common/elements/Loading";
8+
import { Sheet } from "@ui/Sheet";
9+
import { Tooltip } from "@ui/Tooltip";
10+
import { LoadingTransition } from "@ui/Loading";
1111

1212
export function HealthCard({
1313
title,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Snippet } from "@common/elements/Snippet";
2+
import { Callout } from "@ui/Callout";
3+
4+
export function LocalDevCallout({
5+
children,
6+
tipText,
7+
command,
8+
...props
9+
}: {
10+
tipText: string;
11+
command?: string;
12+
children?: React.ReactNode;
13+
} & React.HTMLAttributes<HTMLDivElement>) {
14+
const isDev = process.env.NEXT_PUBLIC_ENVIRONMENT === "development";
15+
if (!isDev) {
16+
return null;
17+
}
18+
return (
19+
<Callout variant="localDev" {...props}>
20+
<div className="grow flex-col text-xs">
21+
{tipText}
22+
{command && (
23+
<Snippet
24+
value={command}
25+
monospace
26+
copying="Command"
27+
className="grow"
28+
/>
29+
)}
30+
</div>
31+
{children}
32+
</Callout>
33+
);
34+
}

npm-packages/dashboard-common/src/elements/NentSwitcher.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { cn } from "@common/lib/cn";
2-
import { Combobox } from "@common/elements/Combobox";
1+
import { cn } from "@ui/cn";
2+
import { Combobox } from "@ui/Combobox";
33
import { PuzzlePieceIcon } from "@common/elements/icons";
4-
import { Tooltip } from "@common/elements/Tooltip";
4+
import { Tooltip } from "@ui/Tooltip";
55
import { NENT_APP_PLACEHOLDER, Nent, useNents } from "@common/lib/useNents";
66

77
export function NentSwitcher({

npm-packages/dashboard-common/src/elements/ObjectEditor/ObjectEditor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import isArray from "lodash/isArray";
1818
import isPlainObject from "lodash/isPlainObject";
1919
import { UNDEFINED_PLACEHOLDER } from "system-udfs/convex/_system/frontend/patchDocumentsFields";
2020
import { stringifyValue } from "@common/lib/stringifyValue";
21-
import { cn } from "@common/lib/cn";
21+
import { cn } from "@ui/cn";
2222
import { DeploymentInfoContext } from "@common/lib/deploymentContext";
2323
import {
2424
ConvexSchemaValidationError,

npm-packages/dashboard-common/src/elements/ObjectEditor/useIdDecorations.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useTheme } from "next-themes";
44
import { useState, useEffect } from "react";
55
import udfs from "@common/udfs";
66
import { useRouter } from "next/router";
7-
import { cn } from "@common/lib/cn";
7+
import { cn } from "@ui/cn";
88
import { GenericDocument } from "convex/server";
99
import { SourceLocation } from "acorn";
1010
import type { editor } from "monaco-editor/esm/vs/editor/editor.api";

npm-packages/dashboard-common/src/elements/ProductionEditsConfirmationDialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ConfirmationDialog } from "@common/elements/ConfirmationDialog";
1+
import { ConfirmationDialog } from "@ui/ConfirmationDialog";
22

33
export function ProductionEditsConfirmationDialog({
44
onClose,

npm-packages/dashboard-common/src/elements/SchedulerStatus.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { formatDistance } from "date-fns";
22
import { useContext, useState } from "react";
33
import { BarChartIcon, ResetIcon } from "@radix-ui/react-icons";
4-
import { cn } from "@common/lib/cn";
4+
import { cn } from "@ui/cn";
55
import { HealthCard } from "@common/elements/HealthCard";
66
import { useSchedulerLag } from "@common/lib/appMetrics";
77
import { ChartForFunctionRate } from "@common/features/health/components/ChartForFunctionRate";
88
import { BigMetric } from "@common/elements/BigMetric";
9-
import { Button } from "@common/elements/Button";
9+
import { Button } from "@ui/Button";
1010
import { DeploymentInfoContext } from "@common/lib/deploymentContext";
1111

1212
export function SchedulerStatus({ small = false }: { small?: boolean }) {

npm-packages/dashboard-common/src/elements/Sidebar.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
DoubleArrowLeftIcon,
88
DoubleArrowRightIcon,
99
} from "@radix-ui/react-icons";
10-
import { Tooltip } from "@common/elements/Tooltip";
11-
import { Button } from "@common/elements/Button";
10+
import { Tooltip } from "@ui/Tooltip";
11+
import { Button } from "@ui/Button";
1212

1313
export type SidebarItem = {
1414
key: string | null;
@@ -143,7 +143,6 @@ export function SidebarLink({
143143
: query,
144144
}
145145
}
146-
passHref
147146
aria-disabled={disabled}
148147
className={sidebarLinkClassNames({
149148
isActive,

npm-packages/dashboard-common/src/elements/Snippet.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CopyIcon } from "@radix-ui/react-icons";
22
import classNames from "classnames";
33
import { useCallback } from "react";
4-
import { Button } from "@common/elements/Button";
4+
import { Button } from "@ui/Button";
55
import { useCopy } from "@common/lib/useCopy";
66

77
type Props = {

npm-packages/dashboard-common/src/elements/TimestampDistance.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { formatDistanceToNow } from "date-fns";
22
import { useRefresh } from "@common/lib/useRefresh";
3-
import { cn } from "@common/lib/cn";
4-
import { Tooltip } from "@common/elements/Tooltip";
3+
import { cn } from "@ui/cn";
4+
import { Tooltip } from "@ui/Tooltip";
55

66
export function TimestampDistance({
77
prefix = "",

npm-packages/dashboard-common/src/elements/ToastContainer.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import type { Meta, StoryObj } from "@storybook/react";
22
import { useState } from "react";
33
import { ToastContainer } from "@common/elements/ToastContainer";
44
import { toast } from "@common/lib/utils";
5-
import { Sheet } from "@common/elements/Sheet";
6-
import { TextInput } from "@common/elements/TextInput";
7-
import { Button } from "@common/elements/Button";
5+
import { Sheet } from "@ui/Sheet";
6+
import { TextInput } from "@ui/TextInput";
7+
import { Button } from "@ui/Button";
88

99
export default {
1010
component: ToastContainer,

npm-packages/dashboard-common/src/elements/ToggleTheme.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { SunIcon, MoonIcon, LightningBoltIcon } from "@radix-ui/react-icons";
22
import startCase from "lodash/startCase";
33
import { useTheme } from "next-themes";
4-
import { cn } from "@common/lib/cn";
5-
import { Tooltip } from "./Tooltip";
4+
import { cn } from "@ui/cn";
5+
import { Tooltip } from "@ui/Tooltip";
66

77
export function ToggleTheme() {
88
const { theme: currentTheme, setTheme } = useTheme();

npm-packages/dashboard-common/src/features/data/components/ContextMenu.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ import {
3737
import classNames from "classnames";
3838
import { ChevronRightIcon } from "@radix-ui/react-icons";
3939
import { UrlObject } from "url";
40-
import { Button } from "@common/elements/Button";
41-
import { TooltipSide } from "@common/elements/Tooltip";
42-
import { Key, KeyboardShortcut } from "@common/elements/KeyboardShortcut";
40+
import { Button } from "@ui/Button";
41+
import { TooltipSide } from "@ui/Tooltip";
42+
import { Key, KeyboardShortcut } from "@ui/KeyboardShortcut";
4343

4444
const ContextMenuContext = React.createContext<{
4545
getItemProps: (

npm-packages/dashboard-common/src/features/data/components/ConvexSchemaFilePath.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { cn } from "@common/lib/cn";
1+
import { cn } from "@ui/cn";
22

33
export function ConvexSchemaFilePath({ className }: { className?: string }) {
44
return (

npm-packages/dashboard-common/src/features/data/components/DataContent.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import {
1919
SchemaJson,
2020
} from "system-udfs/convex/_system/frontend/lib/filters";
2121
import { Shape } from "shapes";
22-
import { LoadingLogo, LoadingTransition } from "@common/elements/Loading";
23-
import { Sheet } from "@common/elements/Sheet";
24-
import { Button } from "@common/elements/Button";
22+
import { LoadingLogo, LoadingTransition } from "@ui/Loading";
23+
import { Sheet } from "@ui/Sheet";
24+
import { Button } from "@ui/Button";
2525
import { DeploymentInfoContext } from "@common/lib/deploymentContext";
2626
import { useSelectionState } from "@common/features/data/lib/useSelectionState";
2727
import { useDataToolbarActions } from "@common/features/data/lib/useDataToolbarActions";
@@ -49,7 +49,7 @@ import {
4949
Panel,
5050
PanelGroup,
5151
} from "react-resizable-panels";
52-
import { cn } from "@common/lib/cn";
52+
import { cn } from "@ui/cn";
5353
import { useTableIndexes } from "@common/features/data/lib/api";
5454
import { getDefaultIndex } from "@common/features/data/components/DataFilters/IndexFilters";
5555

0 commit comments

Comments
 (0)