diff --git a/apps/webapp/app/components/BlankStatePanels.tsx b/apps/webapp/app/components/BlankStatePanels.tsx index 6c0dca843a..c730c797c1 100644 --- a/apps/webapp/app/components/BlankStatePanels.tsx +++ b/apps/webapp/app/components/BlankStatePanels.tsx @@ -10,7 +10,11 @@ import { ServerStackIcon, Squares2X2Icon, } from "@heroicons/react/20/solid"; +import { useLocation } from "react-use"; import { TaskIcon } from "~/assets/icons/TaskIcon"; +import { useEnvironment } from "~/hooks/useEnvironment"; +import { useOrganization } from "~/hooks/useOrganizations"; +import { useProject } from "~/hooks/useProject"; import { type MinimumEnvironment } from "~/presenters/SelectBestEnvironmentPresenter.server"; import { docsPath, @@ -22,20 +26,15 @@ import { import { InlineCode } from "./code/InlineCode"; import { environmentFullTitle } from "./environments/EnvironmentLabel"; import { Feedback } from "./Feedback"; +import { EnvironmentSelector } from "./navigation/EnvironmentSelector"; import { Button, LinkButton } from "./primitives/Buttons"; import { Header1 } from "./primitives/Headers"; import { InfoPanel } from "./primitives/InfoPanel"; import { Paragraph } from "./primitives/Paragraph"; import { StepNumber } from "./primitives/StepNumber"; +import { TextLink } from "./primitives/TextLink"; import { InitCommandV3, PackageManagerProvider, TriggerDevStepV3 } from "./SetupCommands"; import { StepContentContainer } from "./StepContentContainer"; -import { useLocation } from "react-use"; -import { useEnvironment } from "~/hooks/useEnvironment"; -import { useOrganization } from "~/hooks/useOrganizations"; -import { useProject } from "~/hooks/useProject"; -import { TextLink } from "./primitives/TextLink"; -import { EnvironmentSelector } from "./navigation/EnvironmentSelector"; -import { Pi } from "lucide-react"; export function HasNoTasksDev() { return ( @@ -79,20 +78,24 @@ export function HasNoTasksDev() { export function HasNoTasksDeployed({ environment }: { environment: MinimumEnvironment }) { return ( + How to deploy tasks + + } > - You don't have any deployed tasks in {environmentFullTitle(environment)}. + Run the CLI deploy command to + deploy your tasks to the {environmentFullTitle(environment)} environment. - - How to deploy tasks - ); } @@ -104,18 +107,20 @@ export function SchedulesNoPossibleTaskPanel() { icon={ClockIcon} iconClassName="text-sun-500" panelClassName="max-w-full" + accessory={ + + How to schedule tasks + + } > You have no scheduled tasks in your project. Before you can schedule a task you need to create a schedules.task. - - View the docs - ); } @@ -140,15 +145,16 @@ export function SchedulesNoneAttached() {
Use the dashboard @@ -166,14 +172,16 @@ export function BatchesNone() { icon={Squares2X2Icon} iconClassName="text-blue-500" panelClassName="max-w-full" + accessory={ + + How to trigger batches + + } > You have no batches in this environment. You can trigger batches from your backend or from inside other tasks. - - How to trigger batches - ); } @@ -182,23 +190,27 @@ export function TestHasNoTasks() { const organization = useOrganization(); const project = useProject(); const environment = useEnvironment(); - return ( + Create a task + + } > - You have no tasks in this environment. + Before testing a task, you must first create one. Follow the instructions on the{" "} + Tasks page{" "} + to create a task, then return here to test it. - - Add tasks - ); } @@ -346,7 +358,15 @@ export function AlertsNoneDeployed() { and webhooks. -
+
+ + Alerts docs + New alert - - Alert docs -
@@ -376,20 +388,26 @@ export function QueuesHasNoTasks() { return ( + Create a task + + } > - This means you haven't got any tasks yet in this environment. + Queues will appear here when you have created a task in this environment. Follow the + instructions on the{" "} + Tasks page{" "} + to create a task, then return here to see its queue. - - Add tasks - ); } diff --git a/apps/webapp/app/components/navigation/SideMenu.tsx b/apps/webapp/app/components/navigation/SideMenu.tsx index 0412b9a3ae..20c95b7e4e 100644 --- a/apps/webapp/app/components/navigation/SideMenu.tsx +++ b/apps/webapp/app/components/navigation/SideMenu.tsx @@ -3,7 +3,6 @@ import { ArrowRightOnRectangleIcon, BeakerIcon, BellAlertIcon, - BookOpenIcon, ChartBarIcon, ChevronRightIcon, ClockIcon, @@ -59,16 +58,11 @@ import { import connectedImage from "../../assets/images/cli-connected.png"; import disconnectedImage from "../../assets/images/cli-disconnected.png"; import { FreePlanUsage } from "../billing/FreePlanUsage"; +import { InlineCode } from "../code/InlineCode"; import { useDevPresence } from "../DevPresence"; import { ImpersonationBanner } from "../ImpersonationBanner"; import { Button, ButtonContent, LinkButton } from "../primitives/Buttons"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTrigger, -} from "../primitives/Dialog"; +import { Dialog, DialogContent, DialogHeader, DialogTrigger } from "../primitives/Dialog"; import { Paragraph } from "../primitives/Paragraph"; import { Popover, @@ -86,7 +80,6 @@ import { HelpAndFeedback } from "./HelpAndFeedbackPopover"; import { SideMenuHeader } from "./SideMenuHeader"; import { SideMenuItem } from "./SideMenuItem"; import { SideMenuSection } from "./SideMenuSection"; -import { InlineCode } from "../code/InlineCode"; type SideMenuUser = Pick & { isImpersonating: boolean }; export type SideMenuProject = Pick< @@ -280,7 +273,7 @@ function ProjectSelector({ let plan: string | undefined = undefined; if (currentPlan?.v3Subscription?.isPaying === false) { - plan = "Free plan"; + plan = "Free"; } else if (currentPlan?.v3Subscription?.isPaying === true) { plan = currentPlan.v3Subscription.plan?.title; } @@ -326,7 +319,7 @@ function ProjectSelector({ className="text-xs" to={v3BillingPath(organization)} > - {plan} + {plan} plan )} setMenuOpen(open)} open={isMenuOpen}>
- + -
+
{organizations.map((org) => ( +
{count}
); diff --git a/apps/webapp/app/components/navigation/SideMenuSection.tsx b/apps/webapp/app/components/navigation/SideMenuSection.tsx index 170451db43..274ebfc582 100644 --- a/apps/webapp/app/components/navigation/SideMenuSection.tsx +++ b/apps/webapp/app/components/navigation/SideMenuSection.tsx @@ -29,7 +29,7 @@ export function SideMenuSection({ return (

{title}

diff --git a/apps/webapp/app/components/primitives/InfoPanel.tsx b/apps/webapp/app/components/primitives/InfoPanel.tsx index 42b67254fe..53d2d5eeeb 100644 --- a/apps/webapp/app/components/primitives/InfoPanel.tsx +++ b/apps/webapp/app/components/primitives/InfoPanel.tsx @@ -1,7 +1,7 @@ import { cn } from "~/utils/cn"; -import { LinkButton } from "./Buttons"; import { Header2 } from "./Headers"; import { Paragraph } from "./Paragraph"; +import { type ReactNode } from "react"; const variants = { info: { @@ -20,8 +20,7 @@ type InfoPanelVariant = keyof typeof variants; type Props = { title?: string; children: React.ReactNode; - to?: string; - buttonLabel?: string; + accessory?: ReactNode; icon: React.ComponentType; iconClassName?: string; variant?: InfoPanelVariant; @@ -31,8 +30,7 @@ type Props = { export function InfoPanel({ title, children, - to, - buttonLabel, + accessory, icon, iconClassName, variant = "info", @@ -50,14 +48,10 @@ export function InfoPanel({ panelClassName )} > -
+
- {to && ( - - {buttonLabel} - - )} + {accessory}
{title && {title}} diff --git a/apps/webapp/app/presenters/v3/ScheduleListPresenter.server.ts b/apps/webapp/app/presenters/v3/ScheduleListPresenter.server.ts index 19b84121d0..517e611ac8 100644 --- a/apps/webapp/app/presenters/v3/ScheduleListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ScheduleListPresenter.server.ts @@ -1,11 +1,11 @@ -import { Prisma, RuntimeEnvironmentType, ScheduleType } from "@trigger.dev/database"; -import { ScheduleListFilters } from "~/components/runs/v3/ScheduleFilters"; +import { Prisma, type RuntimeEnvironmentType, type ScheduleType } from "@trigger.dev/database"; +import { type ScheduleListFilters } from "~/components/runs/v3/ScheduleFilters"; import { sqlDatabaseSchema } from "~/db.server"; import { displayableEnvironment } from "~/models/runtimeEnvironment.server"; -import { getCurrentPlan, getLimit, getLimits } from "~/services/platform.v3.server"; +import { getLimit } from "~/services/platform.v3.server"; +import { CheckScheduleService } from "~/v3/services/checkSchedule.server"; import { calculateNextScheduledTimestamp } from "~/v3/utils/calculateNextSchedule.server"; import { BasePresenter } from "./basePresenter.server"; -import { CheckScheduleService } from "~/v3/services/checkSchedule.server"; type ScheduleListOptions = { projectId: string; @@ -50,10 +50,7 @@ export class ScheduleListPresenter extends BasePresenter { pageSize = DEFAULT_PAGE_SIZE, }: ScheduleListOptions) { const hasFilters = - type !== undefined || - tasks !== undefined || - environments !== undefined || - (search !== undefined && search !== ""); + type !== undefined || tasks !== undefined || (search !== undefined && search !== ""); const filterType = type === "declarative" ? "DECLARATIVE" : type === "imperative" ? "IMPERATIVE" : undefined; diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.invite/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.invite/route.tsx index 2c91928129..54b07ae130 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.invite/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.invite/route.tsx @@ -153,8 +153,11 @@ export default function Page() { icon={LockOpenIcon} iconClassName="text-indigo-500" title="Unlock more team members" - to={v3BillingPath(organization)} - buttonLabel="Upgrade" + accessory={ + + Upgrade + + } panelClassName="mb-4" > diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx index 7d83711f46..b98f959bbd 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx @@ -1,10 +1,9 @@ -import { BookOpenIcon, InformationCircleIcon, LockOpenIcon } from "@heroicons/react/20/solid"; -import { ArrowUpCircleIcon } from "@heroicons/react/24/outline"; +import { ArrowUpCircleIcon, BookOpenIcon, InformationCircleIcon } from "@heroicons/react/20/solid"; import { type MetaFunction } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { AdminDebugTooltip } from "~/components/admin/debugTooltip"; -import { environmentTitle, EnvironmentCombo } from "~/components/environments/EnvironmentLabel"; +import { EnvironmentCombo, environmentTitle } from "~/components/environments/EnvironmentLabel"; import { RegenerateApiKeyModal } from "~/components/environments/RegenerateApiKeyModal"; import { PageBody, PageContainer } from "~/components/layout/AppLayout"; import { LinkButton } from "~/components/primitives/Buttons"; @@ -144,6 +143,7 @@ export default function Page() { )} variant="secondary/small" LeadingIcon={ArrowUpCircleIcon} + leadingIconClassName="text-indigo-500" > Upgrade to get staging environment diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx index faddc505ad..c3f64d8743 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx @@ -405,9 +405,9 @@ export default function Page() { )) ) : ( - +
- No queues found + No queues found
diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx index 29af7b0c2b..ce57978112 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx @@ -23,15 +23,16 @@ import { type RuntimeEnvironmentType } from "@trigger.dev/database"; import { motion } from "framer-motion"; import { useCallback, useEffect, useRef, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; +import { DisconnectedIcon } from "~/assets/icons/ConnectionIcons"; import { ShowParentIcon, ShowParentIconSelected } from "~/assets/icons/ShowParentIcon"; import tileBgPath from "~/assets/images/error-banner-tile@2x.png"; +import { useDevPresence } from "~/components/DevPresence"; import { AdminDebugTooltip } from "~/components/admin/debugTooltip"; -import { InlineCode } from "~/components/code/InlineCode"; -import { EnvironmentCombo } from "~/components/environments/EnvironmentLabel"; import { PageBody } from "~/components/layout/AppLayout"; import { Badge } from "~/components/primitives/Badge"; import { Button, LinkButton } from "~/components/primitives/Buttons"; import { Callout } from "~/components/primitives/Callout"; +import { ClipboardField } from "~/components/primitives/ClipboardField"; import { DateTimeShort } from "~/components/primitives/DateTime"; import { Dialog, DialogTrigger } from "~/components/primitives/Dialog"; import { Header3 } from "~/components/primitives/Headers"; @@ -93,9 +94,6 @@ import { } from "~/utils/pathBuilder"; import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route"; import { SpanView } from "../resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route"; -import { useDevPresence } from "~/components/DevPresence"; -import { DisconnectedIcon } from "~/assets/icons/ConnectionIcons"; -import { ClipboardField } from "~/components/primitives/ClipboardField"; const resizableSettings = { parent: { @@ -404,8 +402,11 @@ function NoLogsView({ run, resizable }: LoaderData) { icon={LockOpenIcon} iconClassName="text-indigo-500" title="Unlock longer log retention" - to={v3BillingPath(organization)} - buttonLabel="Upgrade" + accessory={ + + Upgrade + + } > The logs for this run have been deleted because the run completed{" "} diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/route.tsx index b651bc5866..20de5e8cb5 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/route.tsx @@ -33,9 +33,11 @@ import { TextLink } from "~/components/primitives/TextLink"; import { RunsFilters, TaskRunListSearchFilters } from "~/components/runs/v3/RunFilters"; import { TaskRunsTable } from "~/components/runs/v3/TaskRunsTable"; import { BULK_ACTION_RUN_LIMIT } from "~/consts"; +import { useEnvironment } from "~/hooks/useEnvironment"; import { useOrganization } from "~/hooks/useOrganizations"; import { useProject } from "~/hooks/useProject"; import { findProjectBySlug } from "~/models/project.server"; +import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server"; import { RunListPresenter } from "~/presenters/v3/RunListPresenter.server"; import { getRootOnlyFilterPreference, @@ -47,15 +49,11 @@ import { cn } from "~/utils/cn"; import { docsPath, EnvironmentParamSchema, - ProjectParamSchema, v3ProjectPath, v3RunsPath, v3TestPath, } from "~/utils/pathBuilder"; import { ListPagination } from "../../components/ListPagination"; -import { prisma } from "~/db.server"; -import { useEnvironment } from "~/hooks/useEnvironment"; -import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server"; export const meta: MetaFunction = () => { return [ @@ -438,8 +436,11 @@ function CreateFirstTaskInstructions() { iconClassName="text-blue-500" panelClassName="max-full" title="Create your first task" - to={v3ProjectPath(organization, project)} - buttonLabel="Create a task" + accessory={ + + Create a task + + } > Before running a task, you must first create one. Follow the instructions on the{" "} diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.$scheduleParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.$scheduleParam/route.tsx index 5d99c2f195..4f3dee64a5 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.$scheduleParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.$scheduleParam/route.tsx @@ -357,8 +357,11 @@ export default function Page() { icon={BookOpenIcon} iconClassName="text-indigo-500" variant="info" - buttonLabel="Docs" - to="https://trigger.dev/docs/v3/tasks-scheduled" + accessory={ + + Docs + + } panelClassName="max-w-full" > You can only edit a declarative schedule by updating your schedules.task and then diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules/route.tsx index 1c26d5d76d..dad5decc46 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules/route.tsx @@ -1,9 +1,9 @@ -import { ClockIcon, PlusIcon, RectangleGroupIcon } from "@heroicons/react/20/solid"; -import { ArrowUpCircleIcon } from "@heroicons/react/24/outline"; +import { ArrowUpCircleIcon, PlusIcon } from "@heroicons/react/20/solid"; import { BookOpenIcon } from "@heroicons/react/24/solid"; import { type MetaFunction, Outlet, useLocation, useParams } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; +import { SchedulesNoneAttached, SchedulesNoPossibleTaskPanel } from "~/components/BlankStatePanels"; import { Feedback } from "~/components/Feedback"; import { AdminDebugTooltip } from "~/components/admin/debugTooltip"; import { InlineCode } from "~/components/code/InlineCode"; @@ -20,7 +20,6 @@ import { DialogTrigger, } from "~/components/primitives/Dialog"; import { Header3 } from "~/components/primitives/Headers"; -import { InfoPanel } from "~/components/primitives/InfoPanel"; import { NavBar, PageAccessories, PageTitle } from "~/components/primitives/PageHeader"; import { PaginationControls } from "~/components/primitives/Pagination"; import { Paragraph } from "~/components/primitives/Paragraph"; @@ -47,11 +46,13 @@ import { ScheduleTypeIcon, scheduleTypeName, } from "~/components/runs/v3/ScheduleType"; +import { useEnvironment } from "~/hooks/useEnvironment"; import { useOrganization } from "~/hooks/useOrganizations"; import { usePathName } from "~/hooks/usePathName"; import { useProject } from "~/hooks/useProject"; import { redirectWithErrorMessage } from "~/models/message.server"; import { findProjectBySlug } from "~/models/project.server"; +import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server"; import { type ScheduleListItem, ScheduleListPresenter, @@ -59,16 +60,13 @@ import { import { requireUserId } from "~/services/session.server"; import { cn } from "~/utils/cn"; import { - EnvironmentParamSchema, docsPath, + EnvironmentParamSchema, v3BillingPath, v3NewSchedulePath, v3SchedulePath, } from "~/utils/pathBuilder"; import { useCurrentPlan } from "../_app.orgs.$organizationSlug/route"; -import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server"; -import { useEnvironment } from "~/hooks/useEnvironment"; -import { SchedulesNoneAttached, SchedulesNoPossibleTaskPanel } from "~/components/BlankStatePanels"; export const meta: MetaFunction = () => { return [ diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings/route.tsx index 2a57372dba..d078b8b3e4 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings/route.tsx @@ -16,6 +16,7 @@ import { ClipboardField } from "~/components/primitives/ClipboardField"; import { Fieldset } from "~/components/primitives/Fieldset"; import { FormButtons } from "~/components/primitives/FormButtons"; import { FormError } from "~/components/primitives/FormError"; +import { Header2 } from "~/components/primitives/Headers"; import { Hint } from "~/components/primitives/Hint"; import { Input } from "~/components/primitives/Input"; import { InputGroup } from "~/components/primitives/InputGroup"; @@ -149,48 +150,50 @@ export default function Page() { -
-
-
- - - - - This goes in your{" "} - trigger.config file. - - -
+
+ Project settings +
+
+
+ + + + + This goes in your{" "} + trigger.config file. + + +
-
- -
- - - - {projectName.error} - - - Rename project - - } + + +
+ + + -
- -
+ {projectName.error} + + + Rename project + + } + className="border-t-0" + /> + +
diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx index fa37fc6c68..c83e10ced0 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx @@ -226,8 +226,11 @@ export default function Page() { icon={LockOpenIcon} iconClassName="text-indigo-500" title="Unlock more team members" - to={v3BillingPath(organization)} - buttonLabel="Upgrade" + accessory={ + + Upgrade + + } panelClassName="mt-4" > diff --git a/apps/webapp/app/routes/storybook.info-panel/route.tsx b/apps/webapp/app/routes/storybook.info-panel/route.tsx index 0a5b4e3e77..1184a87622 100644 --- a/apps/webapp/app/routes/storybook.info-panel/route.tsx +++ b/apps/webapp/app/routes/storybook.info-panel/route.tsx @@ -11,6 +11,7 @@ import { } from "@heroicons/react/20/solid"; import { InfoPanel } from "~/components/primitives/InfoPanel"; import { TaskIcon } from "~/assets/icons/TaskIcon"; +import { LinkButton } from "~/components/primitives/Buttons"; export default function Story() { return ( @@ -30,8 +31,11 @@ export default function Story() { title="Info with Button" icon={InformationCircleIcon} iconClassName="text-blue-500" - to="#" - buttonLabel="Learn More" + accessory={ + + Learn More + + } > This panel includes a button in the top-right corner @@ -42,8 +46,11 @@ export default function Story() { icon={BellAlertIcon} iconClassName="text-red-500" variant="upgrade" - to="#" - buttonLabel="Upgrade Now" + accessory={ + + Upgrade Now + + } > This panel uses the upgrade variant with a call-to-action button @@ -58,8 +65,11 @@ export default function Story() { title="Task Status" icon={TaskIcon} iconClassName="text-blue-500" - to="#" - buttonLabel="View Tasks" + accessory={ + + View Tasks + + } > A panel showing task information with a view action @@ -69,8 +79,11 @@ export default function Story() { title="Getting Started" icon={RocketLaunchIcon} iconClassName="text-purple-500" - to="#" - buttonLabel="Start Tutorial" + accessory={ + + Start Tutorial + + } > Begin your journey with our quick start guide @@ -80,8 +93,11 @@ export default function Story() { title="Deployment Status" icon={ServerStackIcon} iconClassName="text-indigo-500" - to="#" - buttonLabel="Deploy Now" + accessory={ + + Deploy Now + + } > Ready to deploy your changes to production @@ -91,8 +107,11 @@ export default function Story() { title="Create New" icon={PlusIcon} iconClassName="text-green-500" - to="#" - buttonLabel="New Project" + accessory={ + + New Project + + } > Start a new project with our guided setup @@ -107,8 +126,11 @@ export default function Story() { title="Documentation" icon={BookOpenIcon} iconClassName="text-green-500" - to="#" - buttonLabel="View Docs" + accessory={ + + View Docs + + } > Access our comprehensive documentation