diff --git a/apps/webapp/app/components/primitives/Input.tsx b/apps/webapp/app/components/primitives/Input.tsx index a78d11ed3c..7cb4b8a32d 100644 --- a/apps/webapp/app/components/primitives/Input.tsx +++ b/apps/webapp/app/components/primitives/Input.tsx @@ -4,7 +4,7 @@ import { cn } from "~/utils/cn"; import { Icon, RenderIcon } from "./Icon"; const containerBase = - "has-[:focus-visible]:outline-none has-[:focus-visible]:ring-1 has-[:focus-visible]:ring-text-link has-[:focus-visible]:ring-offset-0 has-[:focus]:border-ring has-[:focus]:outline-none has-[:focus]:ring-2 has-[:focus]:ring-ring has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50 ring-offset-background transition cursor-text"; + "has-[:focus-visible]:outline-none has-[:focus-visible]:ring-1 has-[:focus-visible]:ring-charcoal-650 has-[:focus-visible]:ring-offset-0 has-[:focus]:border-ring has-[:focus]:outline-none has-[:focus]:ring-1 has-[:focus]:ring-ring has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50 ring-offset-background transition cursor-text"; const inputBase = "h-full w-full text-text-bright bg-transparent file:border-0 file:bg-transparent file:text-base file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0 disabled:cursor-not-allowed outline-none ring-0 border-none"; @@ -17,27 +17,27 @@ const variants = { container: "px-1 w-full h-10 rounded-[3px] border border-charcoal-800 bg-charcoal-750 hover:border-charcoal-600 hover:bg-charcoal-650", input: "px-2 text-sm", - iconSize: "h-4 w-4 ml-1", + iconSize: "size-4 ml-1", shortcut: "mr-1 min-w-[22px] rounded-sm py-[3px] px-[5px] text-[0.6rem] select-none", }, medium: { container: "px-1 h-8 w-full rounded border border-charcoal-800 bg-charcoal-750 hover:border-charcoal-600 hover:bg-charcoal-650", input: "px-1.5 rounded text-sm", - iconSize: "h-4 w-4 ml-0.5", + iconSize: "size-4 ml-0.5", shortcut: "min-w-[22px] rounded-sm py-[3px] px-[5px] text-[0.6rem]", }, small: { container: "px-1 h-6 w-full rounded border border-charcoal-800 bg-charcoal-750 hover:border-charcoal-600 hover:bg-charcoal-650", input: "px-1 rounded text-xs", - iconSize: "h-3 w-3 ml-0.5", + iconSize: "size-3 ml-0.5", shortcut: "min-w-[22px] rounded-[2px] py-px px-[3px] text-[0.5rem]", }, tertiary: { container: "px-1 h-6 w-full rounded hover:bg-charcoal-750", input: "px-1 rounded text-xs", - iconSize: "h-3 w-3 ml-0.5", + iconSize: "size-3 ml-0.5", shortcut: "min-w-[22px] rounded-[2px] py-px px-[3px] text-[0.5rem]", }, }; diff --git a/apps/webapp/app/components/primitives/SimpleSelect.tsx b/apps/webapp/app/components/primitives/SimpleSelect.tsx index 61ea34133f..d7b9e4cccb 100644 --- a/apps/webapp/app/components/primitives/SimpleSelect.tsx +++ b/apps/webapp/app/components/primitives/SimpleSelect.tsx @@ -29,7 +29,7 @@ const SelectTrigger = React.forwardRef< ( - ({ className, containerClassName, children, fullWidth }, ref) => { +// Add TableContext +const TableContext = createContext<{ variant: TableVariant }>({ variant: "dimmed" }); + +export const Table = forwardRef( + ({ className, containerClassName, children, fullWidth, variant = "dimmed" }, ref) => { return ( -
- - {children} -
-
+ +
+ + {children} +
+
+
); } ); @@ -37,11 +65,13 @@ type TableHeaderProps = { export const TableHeader = forwardRef( ({ className, children }, ref) => { + const { variant } = useContext(TableContext); return ( @@ -75,13 +105,14 @@ type TableRowProps = { export const TableRow = forwardRef( ({ className, disabled, isSelected, children }, ref) => { + const { variant } = useContext(TableContext); return ( @@ -94,7 +125,7 @@ export const TableRow = forwardRef( type TableCellBasicProps = { className?: string; alignment?: "left" | "center" | "right"; - children: ReactNode; + children?: ReactNode; colSpan?: number; }; @@ -125,6 +156,7 @@ export const TableHeaderCell = forwardRef {hiddenLabel ? ( {children} @@ -147,24 +179,12 @@ type TableCellProps = TableCellBasicProps & { hasAction?: boolean; isSticky?: boolean; actionClassName?: string; - rowHoverStyle?: keyof typeof rowHoverStyles; + rowHoverStyle?: string; isSelected?: boolean; + isTabbableCell?: boolean; + children?: ReactNode; }; -const rowHoverStyles = { - default: - "group-hover/table-row:bg-charcoal-800 group-hover/table-row:before:absolute group-hover/table-row:before:bg-charcoal-750 group-hover/table-row:before:top-[-1px] group-hover/table-row:before:left-0 group-hover/table-row:before:h-px group-hover/table-row:before:w-3 group-hover/table-row:after:absolute group-hover/table-row:after:bg-charcoal-750 group-hover/table-row:after:bottom-0 group-hover/table-row:after:left-0 group-hover/table-row:after:h-px group-hover/table-row:after:w-3", - dimmed: - "group-hover/table-row:bg-charcoal-850 group-hover/table-row:before:absolute group-hover/table-row:before:bg-charcoal-800 group-hover/table-row:before:top-[-1px] group-hover/table-row:before:left-0 group-hover/table-row:before:h-px group-hover/table-row:before:w-3 group-hover/table-row:after:absolute group-hover/table-row:after:bg-charcoal-800 group-hover/table-row:after:bottom-0 group-hover/table-row:after:left-0 group-hover/table-row:after:h-px group-hover/table-row:after:w-3", - bright: - "group-hover/table-row:bg-charcoal-750 group-hover/table-row:before:absolute group-hover/table-row:before:bg-charcoal-700 group-hover/table-row:before:top-[-1px] group-hover/table-row:before:left-0 group-hover/table-row:before:h-px group-hover/table-row:before:w-3 group-hover/table-row:after:absolute group-hover/table-row:after:bg-charcoal-700 group-hover/table-row:after:bottom-0 group-hover/table-row:after:left-0 group-hover/table-row:after:h-px group-hover/table-row:after:w-3", -}; - -const stickyStyles = - "sticky right-0 bg-background-dimmed group-hover/table-row:bg-charcoal-750 w-[--sticky-width] [&:has(.group-hover\\/table-row\\:block)]:w-auto"; - -const isSelectedStyle = "bg-charcoal-750 group-hover:bg-charcoal-750"; - export const TableCell = forwardRef( ( { @@ -177,8 +197,8 @@ export const TableCell = forwardRef( onClick, hasAction = false, isSticky = false, - rowHoverStyle = "default", isSelected, + isTabbableCell = false, }, ref ) => { @@ -193,34 +213,47 @@ export const TableCell = forwardRef( } const flexClasses = cn( - "flex w-full whitespace-nowrap px-3 py-3 text-xs text-text-dimmed", + "flex w-full whitespace-nowrap px-3 py-3 items-center text-xs text-text-dimmed", alignment === "left" ? "justify-start text-left" : alignment === "center" ? "justify-center text-center" : "justify-end text-right" ); + const { variant } = useContext(TableContext); return ( {to ? ( - + {children} ) : onClick ? ( - ) : ( @@ -258,7 +291,7 @@ export const TableCellChevron = forwardRef< export const TableCellMenu = forwardRef< HTMLTableCellElement, - { + TableCellProps & { className?: string; isSticky?: boolean; onClick?: (event: React.MouseEvent) => void; @@ -283,6 +316,7 @@ export const TableCellMenu = forwardRef< ref ) => { const [isOpen, setIsOpen] = useState(false); + const { variant } = useContext(TableContext); return (
{/* Hidden buttons that show on hover */} {hiddenButtons && ( -
+
{hiddenButtons}
)} diff --git a/apps/webapp/app/components/primitives/TextLink.tsx b/apps/webapp/app/components/primitives/TextLink.tsx index 984edbf610..e5c8e7d487 100644 --- a/apps/webapp/app/components/primitives/TextLink.tsx +++ b/apps/webapp/app/components/primitives/TextLink.tsx @@ -4,9 +4,9 @@ import { cn } from "~/utils/cn"; const variations = { primary: - "text-indigo-500 transition hover:text-indigo-400 inline-flex gap-0.5 items-center group", + "text-indigo-500 transition hover:text-indigo-400 inline-flex gap-0.5 items-center group focus-visible:focus-custom", secondary: - "text-text-dimmed transition underline underline-offset-2 decoration-dimmed/50 hover:decoration-dimmed inline-flex gap-0.5 items-center group", + "text-text-dimmed transition underline underline-offset-2 decoration-dimmed/50 hover:decoration-dimmed inline-flex gap-0.5 items-center group focus-visible:focus-custom", } as const; type TextLinkProps = { @@ -34,14 +34,14 @@ export function TextLink({ {children}{" "} {trailingIcon && ( - + )} ) : href ? ( {children}{" "} {trailingIcon && ( - + )} ) : ( diff --git a/apps/webapp/app/components/runs/v3/RunTag.tsx b/apps/webapp/app/components/runs/v3/RunTag.tsx index 875457dc2e..014bb15fa2 100644 --- a/apps/webapp/app/components/runs/v3/RunTag.tsx +++ b/apps/webapp/app/components/runs/v3/RunTag.tsx @@ -22,7 +22,7 @@ export function RunTag({ tag }: { tag: string }) { {tagResult.key} - + {tagResult.value} diff --git a/apps/webapp/app/components/runs/v3/ScheduleFilters.tsx b/apps/webapp/app/components/runs/v3/ScheduleFilters.tsx index 66f6743938..7cbb182e76 100644 --- a/apps/webapp/app/components/runs/v3/ScheduleFilters.tsx +++ b/apps/webapp/app/components/runs/v3/ScheduleFilters.tsx @@ -93,7 +93,7 @@ export function ScheduleFilters({ possibleEnvironments, possibleTasks }: Schedul }, []); return ( -
+
handleSearchChange(e.target.value)} /> - + - +
} @@ -291,13 +291,13 @@ export default function Page() { {task.slug}
- + - + @@ -313,7 +313,7 @@ export default function Page() { - + }> {(data) => { @@ -323,7 +323,7 @@ export default function Page() { - + }> {(data) => { @@ -343,7 +343,7 @@ export default function Page() { - + }> {(data) => { diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.alerts/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.alerts/route.tsx index 29876d96dc..7e9d14fe35 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.alerts/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.alerts/route.tsx @@ -216,7 +216,7 @@ export default function Page() { /> ))} - + @@ -460,6 +460,7 @@ function AlertChannelDetails({ alertChannel }: { alertChannel: AlertChannelListP label={"Email"} description={alertChannel.properties.email} boxClassName="group-hover/table-row:bg-charcoal-800" + className="h-12" /> ); } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.batches/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.batches/route.tsx index ceb620624f..eaf7468798 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.batches/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.batches/route.tsx @@ -187,7 +187,9 @@ function BatchesTable({ batches, hasFilters, filters }: BatchList) { const path = v3BatchRunsPath(organization, project, batch); return ( - {batch.friendlyId} + + {batch.friendlyId} + - + Legacy batch } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments.$deploymentParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments.$deploymentParam/route.tsx index 7678f53633..8236715fdb 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments.$deploymentParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments.$deploymentParam/route.tsx @@ -4,7 +4,6 @@ import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { ExitIcon } from "~/assets/icons/ExitIcon"; import { UserAvatar } from "~/components/UserProfilePhoto"; import { AdminDebugTooltip } from "~/components/admin/debugTooltip"; -import { CodeBlock } from "~/components/code/CodeBlock"; import { EnvironmentLabel } from "~/components/environments/EnvironmentLabel"; import { Badge } from "~/components/primitives/Badge"; import { LinkButton } from "~/components/primitives/Buttons"; @@ -108,107 +107,118 @@ export default function Page() {
-
-
- - - Deploy - - {deployment.shortCode} - {deployment.label && {deployment.label}} - - - - Environment - - - - - - Version - {deployment.version} - - - Status - - - - - - Tasks - {deployment.tasks ? deployment.tasks.length : "–"} - - - SDK Version - {deployment.sdkVersion ? deployment.sdkVersion : "–"} - - - CLI Version - {deployment.cliVersion ? deployment.cliVersion : "–"} - - - Started at - - UTC - - - - Built at - - {deployment.builtAt ? ( - <> - UTC - - ) : ( - "–" - )} - - - - Deployed at - - {deployment.deployedAt ? ( - <> - UTC - - ) : ( - "–" - )} - - - - Deployed by - - {deployment.deployedBy ? ( -
- - - {deployment.deployedBy.name ?? deployment.deployedBy.displayName} - -
- ) : ( - "–" - )} -
-
-
+
+
+
+ + + Deploy + + {deployment.shortCode} + {deployment.label && {deployment.label}} + + + + Environment + + + + + + Version + {deployment.version} + + + Status + + + + + + Tasks + {deployment.tasks ? deployment.tasks.length : "–"} + + + SDK Version + + {deployment.sdkVersion ? deployment.sdkVersion : "–"} + + + + CLI Version + + {deployment.cliVersion ? deployment.cliVersion : "–"} + + + + Started at + + UTC + + + + Built at + + {deployment.builtAt ? ( + <> + UTC + + ) : ( + "–" + )} + + + + Deployed at + + {deployment.deployedAt ? ( + <> + UTC + + ) : ( + "–" + )} + + + + Deployed by + + {deployment.deployedBy ? ( +
+ + + {deployment.deployedBy.name ?? deployment.deployedBy.displayName} + +
+ ) : ( + "–" + )} +
+
+
+
{deployment.tasks ? (
- +
Task diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments/route.tsx index 411698cdb6..c1a2c5e8ea 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.deployments/route.tsx @@ -170,7 +170,7 @@ export default function Page() { const isSelected = deploymentParam === deployment.shortCode; return ( - +
{deployment.shortCode} {deployment.label && ( diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules.$scheduleParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules.$scheduleParam/route.tsx index a246a32ab3..281d3ad1fd 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules.$scheduleParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules.$scheduleParam/route.tsx @@ -220,11 +220,12 @@ export default function Page() { TrailingIcon={ExitIcon} shortcut={{ key: "esc" }} shortcutPosition="before-trailing-icon" + className="pl-1" />
-
-
+
+
Schedule ID @@ -282,61 +283,64 @@ export default function Page() { )} -
- Last 5 runs - -
-
- Next 5 runs -
- - - {!isUtc && {schedule.timezone}} - UTC - - - - {schedule.active ? ( - schedule.nextRuns.length ? ( - schedule.nextRuns.map((run, index) => ( - - {!isUtc && ( - - - - )} + +
+ Last 5 runs + +
+
+ Next 5 runs +
+ + + {!isUtc && {schedule.timezone}} + UTC + + + + {schedule.active ? ( + schedule.nextRuns.length ? ( + schedule.nextRuns.map((run, index) => ( + + {!isUtc && ( - + - - )) - ) : ( - - - - ) + )} + + + + + )) ) : ( - + - )} - -
-
- {!isImperative && ( + ) + ) : ( + + + + )} + + +
+ {!isImperative && ( +
- )} -
+
+ )}
{isImperative && ( diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules/route.tsx index 7a47613a8f..3bf17e0aff 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.schedules/route.tsx @@ -65,6 +65,7 @@ import { import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route"; import { ArrowUpCircleIcon } from "@heroicons/react/24/outline"; import { SimpleTooltip } from "~/components/primitives/Tooltip"; +import { cn } from "~/utils/cn"; export const loader = async ({ request, params }: LoaderFunctionArgs) => { const userId = await requireUserId(request); @@ -210,9 +211,19 @@ export default function Page() {
-
+
1 ? "grid-rows-[1fr_auto]" : "grid-rows-[1fr]" + )} + > -
+
1 && "justify-end border-t border-grid-dimmed px-2 py-3" + )} + >
@@ -443,7 +454,7 @@ function SchedulesTable({ const cellClass = schedule.active ? "" : "opacity-50"; return ( - + {schedule.friendlyId} diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route.tsx index 57c10df9ff..da746c2268 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.test/route.tsx @@ -266,6 +266,7 @@ function TaskRow({ task, environmentSlug }: { task: TaskListItem; environmentSlu diff --git a/apps/webapp/tailwind.config.js b/apps/webapp/tailwind.config.js index b7c505964f..e57368fb3c 100644 --- a/apps/webapp/tailwind.config.js +++ b/apps/webapp/tailwind.config.js @@ -212,10 +212,10 @@ module.exports = { prod: prodEnv, }, focusStyles: { - outline: "2px solid", + outline: "1px solid", outlineOffset: "0px", outlineColor: textLink, - borderRadius: "2px", + borderRadius: "3px", }, borderRadius: { lg: radius,