From 1d32fd78c0fc1e326805a09bbcc0de05f03db402 Mon Sep 17 00:00:00 2001 From: Colin Ozanne Date: Wed, 10 Jun 2026 14:22:02 +0000 Subject: [PATCH] chore: switch tooling from biome to oxc (#2250) --- .oxlintrc.json | 4 - .prettierignore | 1 - .vscode/extensions.json | 4 + .vscode/settings.json | 3 +- .zed/settings.json | 178 ++---- .../src/app/(dashboard)/agents/breadcrumb.tsx | 3 +- .../app/(dashboard)/agents/nav-actions.tsx | 5 +- .../src/app/(dashboard)/agents/page.tsx | 7 +- .../src/app/(dashboard)/cli/breadcrumb.tsx | 3 +- .../src/app/(dashboard)/cli/nav-actions.tsx | 5 +- .../src/app/(dashboard)/cli/page.tsx | 21 +- apps/dashboard/src/app/(dashboard)/error.tsx | 11 +- .../src/app/(dashboard)/invite/client.tsx | 14 +- .../src/app/(dashboard)/invite/layout.tsx | 1 + .../src/app/(dashboard)/invite/page.tsx | 4 +- apps/dashboard/src/app/(dashboard)/layout.tsx | 9 +- .../monitors/(list)/breadcrumb.tsx | 3 +- .../(dashboard)/monitors/(list)/client.tsx | 21 +- .../(dashboard)/monitors/(list)/layout.tsx | 1 + .../monitors/(list)/nav-actions.tsx | 7 +- .../app/(dashboard)/monitors/(list)/page.tsx | 4 +- .../(dashboard)/monitors/[id]/breadcrumb.tsx | 6 +- .../(dashboard)/monitors/[id]/edit/page.tsx | 5 +- .../monitors/[id]/incidents/layout.tsx | 4 +- .../monitors/[id]/incidents/page.tsx | 7 +- .../app/(dashboard)/monitors/[id]/layout.tsx | 1 + .../(dashboard)/monitors/[id]/logs/client.tsx | 15 +- .../(dashboard)/monitors/[id]/logs/page.tsx | 1 + .../monitors/[id]/logs/search-params.ts | 3 +- .../(dashboard)/monitors/[id]/nav-actions.tsx | 23 +- .../monitors/[id]/overview/client.tsx | 26 +- .../monitors/[id]/overview/layout.tsx | 4 +- .../monitors/[id]/overview/page.tsx | 1 + .../monitors/[id]/overview/search-params.ts | 3 +- .../app/(dashboard)/monitors/[id]/sidebar.tsx | 17 +- .../app/(dashboard)/monitors/[id]/tabs.tsx | 4 +- .../monitors/create/breadcrumb.tsx | 3 +- .../(dashboard)/monitors/create/layout.tsx | 1 + .../app/(dashboard)/monitors/create/page.tsx | 5 +- .../src/app/(dashboard)/not-found.tsx | 13 +- .../(dashboard)/notifications/breadcrumb.tsx | 3 +- .../app/(dashboard)/notifications/client.tsx | 12 +- .../app/(dashboard)/notifications/layout.tsx | 1 + .../app/(dashboard)/notifications/page.tsx | 1 + .../app/(dashboard)/overview/breadcrumb.tsx | 3 +- .../overview/data-table-status-reports.tsx | 3 +- .../src/app/(dashboard)/overview/layout.tsx | 6 +- .../src/app/(dashboard)/overview/page.tsx | 21 +- .../(dashboard)/settings/(list)/layout.tsx | 2 +- .../settings/account/breadcrumb.tsx | 3 +- .../(dashboard)/settings/account/layout.tsx | 2 +- .../app/(dashboard)/settings/account/page.tsx | 11 +- .../settings/audit-logs/breadcrumb.tsx | 3 +- .../settings/audit-logs/client.tsx | 9 +- .../settings/audit-logs/layout.tsx | 1 + .../settings/billing/breadcrumb.tsx | 3 +- .../(dashboard)/settings/billing/client.tsx | 18 +- .../app/(dashboard)/settings/billing/page.tsx | 1 + .../settings/general/breadcrumb.tsx | 3 +- .../(dashboard)/settings/general/layout.tsx | 2 +- .../app/(dashboard)/settings/general/page.tsx | 3 +- .../settings/integrations/breadcrumb.tsx | 3 +- .../settings/integrations/layout.tsx | 2 +- .../settings/integrations/page.tsx | 4 +- .../settings/integrations/slack-card.tsx | 11 +- .../settings/private-locations/breadcrumb.tsx | 3 +- .../settings/private-locations/client.tsx | 9 +- .../settings/private-locations/layout.tsx | 1 + .../private-locations/nav-actions.tsx | 7 +- .../src/app/(dashboard)/settings/tabs.tsx | 3 +- .../status-pages/(list)/breadcrumb.tsx | 3 +- .../status-pages/(list)/client.tsx | 7 +- .../status-pages/(list)/nav-actions.tsx | 7 +- .../(dashboard)/status-pages/(list)/page.tsx | 1 + .../status-pages/[id]/breadcrumb.tsx | 6 +- .../status-pages/[id]/components/layout.tsx | 4 +- .../status-pages/[id]/components/page.tsx | 5 +- .../status-pages/[id]/edit/page.tsx | 5 +- .../(dashboard)/status-pages/[id]/layout.tsx | 2 +- .../status-pages/[id]/maintenances/layout.tsx | 4 +- .../status-pages/[id]/maintenances/page.tsx | 9 +- .../status-pages/[id]/nav-actions.tsx | 11 +- .../(dashboard)/status-pages/[id]/sidebar.tsx | 11 +- .../[id]/status-reports/[reportId]/page.tsx | 9 +- .../[id]/status-reports/layout.tsx | 4 +- .../status-pages/[id]/status-reports/page.tsx | 9 +- .../status-pages/[id]/subscribers/page.tsx | 14 +- .../(dashboard)/status-pages/[id]/tabs.tsx | 4 +- .../status-pages/create/breadcrumb.tsx | 3 +- .../status-pages/create/client.tsx | 7 +- apps/dashboard/src/app/api/chat/route.ts | 5 +- .../src/app/api/onboarding/checks/route.ts | 3 +- .../src/app/api/trpc/edge/[trpc]/route.ts | 4 +- .../src/app/api/trpc/lambda/[trpc]/route.ts | 4 +- apps/dashboard/src/app/global-error.tsx | 2 +- apps/dashboard/src/app/layout.tsx | 19 +- .../app/login/_components/login-button.tsx | 4 +- .../app/login/_components/magic-link-form.tsx | 4 +- apps/dashboard/src/app/login/page.tsx | 17 +- apps/dashboard/src/app/not-found.tsx | 11 +- .../src/app/onboarding/_steps/step-1.tsx | 10 +- .../src/app/onboarding/_steps/step-2.tsx | 16 +- .../src/app/onboarding/_steps/step-3.tsx | 29 +- apps/dashboard/src/app/onboarding/client.tsx | 16 +- apps/dashboard/src/app/onboarding/page.tsx | 4 +- .../components/chart/chart-area-latency.tsx | 21 +- .../chart/chart-area-timing-phases.tsx | 21 +- .../chart/chart-bar-uptime-light.tsx | 12 +- .../src/components/chart/chart-bar-uptime.tsx | 18 +- .../components/chart/chart-line-region.tsx | 4 +- .../components/chart/chart-line-regions.tsx | 9 +- .../components/chart/chart-tooltip-number.tsx | 4 +- .../src/components/chat/chat-conversation.tsx | 1 - .../src/components/chat/chat-error-banner.tsx | 2 +- .../components/chat/chat-error-boundary.tsx | 2 +- .../src/components/chat/chat-history.tsx | 10 +- .../src/components/chat/chat-message.tsx | 8 +- .../src/components/chat/chat-prompt-input.tsx | 4 +- .../src/components/chat/chat-suggestions.tsx | 2 +- .../src/components/chat/chat-tool-part.tsx | 22 +- .../chat/tool-renderers/details-table.tsx | 8 +- .../chat/tool-renderers/get-response-log.tsx | 4 +- .../chat/tool-renderers/list-audit-logs.tsx | 4 +- .../chat/tool-renderers/list-monitors.tsx | 6 +- .../tool-renderers/list-notifications.tsx | 4 +- .../tool-renderers/list-page-components.tsx | 2 +- .../tool-renderers/list-response-logs.tsx | 4 +- .../chat/tool-renderers/list-status-pages.tsx | 2 +- .../chat/tool-renderers/result-table.tsx | 6 +- .../src/components/common/changes-table.tsx | 8 +- apps/dashboard/src/components/common/code.tsx | 2 +- .../src/components/common/copy-row.tsx | 3 +- .../common/hover-card-timestamp.tsx | 1 + .../components/common/hover-card-timing.tsx | 4 +- .../components/common/icon-cloud-provider.tsx | 2 +- .../components/common/input-with-addons.tsx | 10 +- apps/dashboard/src/components/common/kbd.tsx | 5 +- apps/dashboard/src/components/common/link.tsx | 5 +- apps/dashboard/src/components/common/note.tsx | 2 +- apps/dashboard/src/components/common/pill.tsx | 4 +- .../src/components/common/wheel-picker.tsx | 10 +- .../src/components/content/billing-addons.tsx | 22 +- .../components/content/billing-overlay.tsx | 4 +- .../components/content/billing-progress.tsx | 2 +- .../src/components/content/block-wrapper.tsx | 5 +- .../src/components/content/empty-state.tsx | 4 +- .../src/components/content/section.tsx | 4 +- .../controls-search/command-region.tsx | 21 +- .../controls-search/command-tags.tsx | 3 +- .../controls-search/dropdown-interval.tsx | 5 +- .../controls-search/dropdown-percentile.tsx | 5 +- .../controls-search/dropdown-period.tsx | 9 +- .../controls-search/dropdown-status.tsx | 5 +- .../controls-search/dropdown-trigger.tsx | 5 +- .../controls-search/popover-date.tsx | 7 +- .../audit-logs-workspace/columns.tsx | 26 +- .../data-table-row-details.tsx | 7 +- .../data-table-toolbar.tsx | 3 +- .../data-table/audit-logs/columns.tsx | 7 +- .../data-table/audit-logs/wrapper.tsx | 7 +- .../data-table/billing/data-table.tsx | 31 +- .../data-table/data-table-sheet.tsx | 4 +- .../data-table/incidents/columns.tsx | 8 +- .../incidents/data-table-row-actions.tsx | 10 +- .../data-table/maintenances/columns.tsx | 10 +- .../maintenances/data-table-row-actions.tsx | 11 +- .../data-table/monitors/columns.tsx | 21 +- .../monitors/data-table-action-bar.tsx | 45 +- .../monitors/data-table-row-actions.tsx | 9 +- .../monitors/data-table-toolbar.tsx | 7 +- .../data-table/notifications/columns.tsx | 6 +- .../notifications/data-table-row-actions.tsx | 9 +- .../data-table/page-components/columns.tsx | 6 +- .../data-table-row-actions.tsx | 7 +- .../data-table/private-locations/columns.tsx | 4 +- .../data-table-row-actions.tsx | 9 +- .../data-table/response-logs/columns.tsx | 23 +- .../response-logs/data-table-basics.tsx | 159 ++--- .../response-logs/data-table-sheet-test.tsx | 4 +- .../response-logs/data-table-sheet.tsx | 14 +- .../response-logs/data-table-toolbar.tsx | 7 +- .../response-logs/regions/columns.tsx | 13 +- .../settings/api-key/data-table.tsx | 9 +- .../settings/invitations/data-table.tsx | 17 +- .../settings/members/data-table.tsx | 7 +- .../data-table/status-pages/columns.tsx | 8 +- .../status-pages/data-table-row-actions.tsx | 7 +- .../data-table-row-actions.tsx | 9 +- .../status-report-updates/data-table.tsx | 20 +- .../data-table/status-reports/columns.tsx | 14 +- .../status-reports/data-table-row-actions.tsx | 9 +- .../data-table/subscribers/columns.tsx | 4 +- .../subscribers/data-table-row-actions.tsx | 9 +- .../subscribers/data-table-toolbar.tsx | 3 +- .../data-table/table-cell-badge.tsx | 4 +- .../components/data-table/table-cell-date.tsx | 3 +- .../components/data-table/table-cell-link.tsx | 5 +- .../data-table/table-cell-number.tsx | 6 +- apps/dashboard/src/components/date-picker.tsx | 14 +- .../src/components/development-indicator.tsx | 6 +- .../src/components/dialogs/export-code.tsx | 7 +- .../src/components/dialogs/upgrade.tsx | 11 +- .../domains/domain-configuration.tsx | 54 +- .../components/domains/domain-status-icon.tsx | 17 +- .../domains/domain-troubleshooting.tsx | 8 +- .../components/domains/use-domain-status.ts | 4 +- .../components/dropdowns/quick-actions.tsx | 24 +- .../forms/components/form-components.tsx | 99 ++-- .../forms/components/form-import.tsx | 45 +- .../components/telegram-connection-flow.tsx | 4 +- .../components/telegram-form-actions.tsx | 4 +- .../components/telegram-manual-input.tsx | 6 +- .../components/telegram-qr-connection.tsx | 3 +- .../forms/components/telegram-qrcode.tsx | 2 +- .../components/forms/components/update.tsx | 6 +- .../components/forms/form-alert-dialog.tsx | 2 +- .../src/components/forms/form-card.tsx | 7 +- .../src/components/forms/form-sheet.tsx | 4 +- .../src/components/forms/maintenance/form.tsx | 37 +- .../components/forms/maintenance/sheet.tsx | 5 +- .../forms/monitor-tag/form-monitor-tag.tsx | 5 +- .../components/forms/monitor-tag/sheet.tsx | 5 +- .../forms/monitor/form-follow-redirect.tsx | 21 +- .../components/forms/monitor/form-general.tsx | 43 +- .../forms/monitor/form-notifiers.tsx | 29 +- .../components/forms/monitor/form-otel.tsx | 23 +- .../forms/monitor/form-response-time.tsx | 16 +- .../components/forms/monitor/form-retry.tsx | 21 +- .../forms/monitor/form-scheduling-regions.tsx | 56 +- .../forms/monitor/form-status-pages.tsx | 29 +- .../components/forms/monitor/form-tags.tsx | 28 +- .../forms/monitor/form-visibility.tsx | 23 +- .../src/components/forms/monitor/update.tsx | 6 +- .../forms/notifications/form-discord.tsx | 22 +- .../forms/notifications/form-email.tsx | 16 +- .../forms/notifications/form-google-chat.tsx | 21 +- .../notifications/form-grafana-oncall.tsx | 19 +- .../forms/notifications/form-ms-teams.tsx | 19 +- .../forms/notifications/form-ntfy.tsx | 20 +- .../forms/notifications/form-opsgenie.tsx | 18 +- .../forms/notifications/form-pagerduty.tsx | 22 +- .../forms/notifications/form-slack.tsx | 22 +- .../forms/notifications/form-sms.tsx | 16 +- .../forms/notifications/form-telegram.tsx | 17 +- .../forms/notifications/form-webhook.tsx | 22 +- .../forms/notifications/form-whatsapp.tsx | 21 +- .../components/forms/notifications/form.tsx | 6 +- .../components/forms/notifications/sheet.tsx | 6 +- .../forms/onboarding/create-page.tsx | 9 +- .../components/forms/onboarding/question.tsx | 3 +- .../forms/private-location/form.tsx | 21 +- .../forms/private-location/sheet.tsx | 5 +- .../forms/settings/form-api-key.tsx | 43 +- .../forms/settings/form-members.tsx | 44 +- .../components/forms/settings/form-slug.tsx | 12 +- .../forms/settings/form-workspace.tsx | 17 +- .../forms/status-page/form-appearance.tsx | 28 +- .../forms/status-page/form-configuration.tsx | 34 +- .../forms/status-page/form-custom-domain.tsx | 44 +- .../forms/status-page/form-general.tsx | 32 +- .../forms/status-page/form-links.tsx | 28 +- .../forms/status-page/form-locale.tsx | 33 +- .../forms/status-page/form-monitors.tsx | 73 +-- .../forms/status-page/form-page-access.tsx | 31 +- .../forms/status-page/theme-picker.tsx | 7 +- .../components/forms/status-page/update.tsx | 12 +- .../form-status-report.tsx | 35 +- .../forms/status-report-update/form.tsx | 21 +- .../forms/status-report-update/sheet.tsx | 5 +- .../components/forms/status-report/form.tsx | 37 +- .../components/forms/status-report/sheet.tsx | 9 +- .../src/components/forms/step-card.tsx | 13 +- .../src/components/forms/subscriber/form.tsx | 27 +- .../src/components/forms/subscriber/sheet.tsx | 5 +- .../forms/support-contact/dialog.tsx | 6 +- .../components/forms/support-contact/form.tsx | 14 +- .../src/components/layout/auth-layout.tsx | 11 +- .../components/layout/onboarding-layout.tsx | 39 +- .../src/components/layout/wordmark.tsx | 5 +- .../metric/global-uptime/section.tsx | 8 +- .../src/components/metric/metric-card.tsx | 16 +- .../src/components/nav/app-header.tsx | 2 +- .../src/components/nav/app-sidebar.tsx | 35 +- .../components/nav/nav-banner-checklist.tsx | 11 +- .../src/components/nav/nav-banner-upgrade.tsx | 8 +- .../src/components/nav/nav-banner.tsx | 4 +- .../src/components/nav/nav-breadcrumb.tsx | 2 +- .../src/components/nav/nav-feedback.tsx | 19 +- .../dashboard/src/components/nav/nav-help.tsx | 3 +- .../dashboard/src/components/nav/nav-main.tsx | 3 +- .../src/components/nav/nav-monitors.tsx | 19 +- .../src/components/nav/nav-overview.tsx | 3 +- .../src/components/nav/nav-status-pages.tsx | 17 +- .../dashboard/src/components/nav/nav-tabs.tsx | 6 +- .../dashboard/src/components/nav/nav-user.tsx | 32 +- .../src/components/nav/sidebar-metadata.tsx | 25 +- .../src/components/nav/sidebar-right.tsx | 12 +- .../src/components/nav/workspace-switcher.tsx | 14 +- .../components/onboarding/checks-table.tsx | 23 +- .../components/onboarding/feature-badges.tsx | 17 +- .../onboarding/status-page-preview.tsx | 11 +- .../components/popovers/popover-quantile.tsx | 4 +- .../popovers/popover-resolution.tsx | 4 +- .../src/components/tailwind-indicator.tsx | 2 +- .../dashboard/src/components/theme-toggle.tsx | 5 +- .../ui/data-table/data-table-action-bar.tsx | 22 +- .../data-table/data-table-column-header.tsx | 12 +- .../data-table/data-table-faceted-filter.tsx | 11 +- .../ui/data-table/data-table-pagination.tsx | 23 +- .../ui/data-table/data-table-toobar.tsx | 7 +- .../ui/data-table/data-table-view-options.tsx | 7 +- .../components/ui/data-table/data-table.tsx | 20 +- apps/dashboard/src/components/ui/sortable.tsx | 11 +- apps/dashboard/src/data/audit-logs.client.ts | 3 +- apps/dashboard/src/data/metrics.client.ts | 6 +- .../src/data/notifications.client.ts | 27 +- apps/dashboard/src/hooks/use-feature.ts | 3 +- .../src/hooks/use-telegram-connection.ts | 7 +- apps/dashboard/src/lib/auth/adapter.ts | 3 +- apps/dashboard/src/lib/auth/helpers.ts | 5 +- apps/dashboard/src/lib/auth/index.ts | 7 +- apps/dashboard/src/lib/edge-context.ts | 7 +- apps/dashboard/src/lib/trpc/client.tsx | 4 +- apps/dashboard/src/lib/trpc/server.tsx | 11 +- apps/dashboard/src/lib/trpc/shared.ts | 5 +- apps/dashboard/src/proxy.ts | 7 +- apps/screenshot-service/src/index.ts | 7 +- apps/server/package.json | 22 +- apps/server/src/index.ts | 8 +- apps/server/src/libs/checker/utils.ts | 3 +- apps/server/src/libs/clients.ts | 3 +- .../libs/errors/openapi-error-responses.ts | 1 + apps/server/src/libs/errors/utils.ts | 12 +- apps/server/src/libs/middlewares/auth.ts | 14 +- apps/server/src/libs/middlewares/plan.ts | 4 +- .../libs/middlewares/require-scope.test.ts | 4 +- apps/server/src/libs/middlewares/track.ts | 3 +- apps/server/src/libs/test/preload.ts | 1 + apps/server/src/routes/mcp/handler.test.ts | 7 +- .../routes/mcp/tools/register-scoped.test.ts | 1 + .../src/routes/mcp/tools/register-scoped.ts | 6 +- .../server/src/routes/mcp/tools/tools.test.ts | 2 - apps/server/src/routes/public/status.test.ts | 4 +- apps/server/src/routes/public/status.ts | 5 +- apps/server/src/routes/public/unsubscribe.ts | 3 +- apps/server/src/routes/rpc/adapter.test.ts | 2 +- .../maintenance/__tests__/maintenance.test.ts | 1 + .../monitor/__tests__/monitor.test.ts | 1 + .../rpc/handlers/monitor/converters/enums.ts | 3 +- .../src/routes/rpc/handlers/monitor/index.ts | 5 +- .../rpc/handlers/monitor/response-logs.ts | 1 + .../routes/rpc/handlers/monitor/validators.ts | 4 +- .../__tests__/notification.test.ts | 1 + .../routes/rpc/handlers/notification/index.ts | 3 +- .../rpc/handlers/notification/limits.ts | 1 + .../handlers/notification/test-providers.ts | 1 + .../status-page/__tests__/status-page.test.ts | 1 + .../rpc/handlers/status-page/converters.ts | 4 +- .../__tests__/status-report.test.ts | 2 + .../rpc/handlers/status-report/converters.ts | 1 + .../interceptors/__tests__/tracking.test.ts | 1 + .../src/routes/rpc/interceptors/error.ts | 1 + .../src/routes/rpc/interceptors/logging.ts | 1 + apps/server/src/routes/slack/agent.test.ts | 3 +- apps/server/src/routes/slack/blocks.test.ts | 1 + .../routes/slack/confirmation-store.test.ts | 1 + .../src/routes/slack/confirmation-store.ts | 3 +- apps/server/src/routes/slack/handler.test.ts | 1 + apps/server/src/routes/slack/handler.ts | 1 + apps/server/src/routes/slack/index.test.ts | 1 + apps/server/src/routes/slack/index.ts | 4 +- .../src/routes/slack/interactions.test.ts | 1 + apps/server/src/routes/slack/interactions.ts | 2 +- apps/server/src/routes/slack/oauth.test.ts | 2 + apps/server/src/routes/slack/oauth.ts | 4 +- .../slack/presenters/presenters.test.ts | 1 + .../src/routes/slack/registry-runner.test.ts | 1 + apps/server/src/routes/slack/verify.test.ts | 2 + apps/server/src/routes/slack/verify.ts | 3 +- .../src/routes/v1/check/http/post.test.ts | 2 +- apps/server/src/routes/v1/check/http/post.ts | 8 +- .../server/src/routes/v1/check/http/schema.ts | 1 + apps/server/src/routes/v1/check/index.ts | 4 +- .../src/routes/v1/incidents/get.test.ts | 1 + apps/server/src/routes/v1/incidents/get.ts | 2 +- .../src/routes/v1/incidents/get_all.test.ts | 2 + .../server/src/routes/v1/incidents/get_all.ts | 2 +- apps/server/src/routes/v1/incidents/index.ts | 1 + .../src/routes/v1/incidents/put.test.ts | 1 + apps/server/src/routes/v1/incidents/put.ts | 4 +- apps/server/src/routes/v1/index.ts | 7 +- .../src/routes/v1/maintenances/get.test.ts | 2 + apps/server/src/routes/v1/maintenances/get.ts | 6 +- .../routes/v1/maintenances/get_all.test.ts | 2 + .../src/routes/v1/maintenances/get_all.ts | 6 +- .../src/routes/v1/maintenances/index.ts | 4 +- .../src/routes/v1/maintenances/post.test.ts | 6 +- .../server/src/routes/v1/maintenances/post.ts | 6 +- .../src/routes/v1/maintenances/put.test.ts | 41 +- apps/server/src/routes/v1/maintenances/put.ts | 6 +- .../src/routes/v1/monitors/delete.test.ts | 2 + apps/server/src/routes/v1/monitors/delete.ts | 4 +- .../server/src/routes/v1/monitors/get.test.ts | 1 + apps/server/src/routes/v1/monitors/get.ts | 3 +- .../src/routes/v1/monitors/get_all.test.ts | 1 + apps/server/src/routes/v1/monitors/get_all.ts | 3 +- apps/server/src/routes/v1/monitors/index.ts | 1 + .../src/routes/v1/monitors/post.test.ts | 1 + apps/server/src/routes/v1/monitors/post.ts | 6 +- .../src/routes/v1/monitors/post_dns.test.ts | 1 + .../server/src/routes/v1/monitors/post_dns.ts | 4 +- .../src/routes/v1/monitors/post_http.test.ts | 1 + .../src/routes/v1/monitors/post_http.ts | 6 +- .../src/routes/v1/monitors/post_tcp.test.ts | 1 + .../server/src/routes/v1/monitors/post_tcp.ts | 3 +- .../server/src/routes/v1/monitors/put.test.ts | 1 + apps/server/src/routes/v1/monitors/put.ts | 7 +- apps/server/src/routes/v1/monitors/put_dns.ts | 5 +- .../src/routes/v1/monitors/put_http.test.ts | 1 + .../server/src/routes/v1/monitors/put_http.ts | 7 +- apps/server/src/routes/v1/monitors/put_tcp.ts | 5 +- .../routes/v1/monitors/results/get.test.ts | 32 +- .../src/routes/v1/monitors/results/get.ts | 2 +- .../src/routes/v1/monitors/run/post.test.ts | 86 ++- .../server/src/routes/v1/monitors/run/post.ts | 8 +- apps/server/src/routes/v1/monitors/schema.ts | 1 - .../routes/v1/monitors/summary/get.test.ts | 2 + .../src/routes/v1/monitors/summary/get.ts | 2 +- .../src/routes/v1/monitors/summary/schema.ts | 1 + .../routes/v1/monitors/trigger/post.test.ts | 3 +- .../src/routes/v1/monitors/trigger/post.ts | 8 +- .../src/routes/v1/monitors/trigger/schema.ts | 1 + apps/server/src/routes/v1/monitors/utils.ts | 1 + .../src/routes/v1/notifications/get.test.ts | 1 + .../server/src/routes/v1/notifications/get.ts | 5 +- .../routes/v1/notifications/get_all.test.ts | 2 + .../src/routes/v1/notifications/get_all.ts | 5 +- .../src/routes/v1/notifications/index.ts | 1 + .../src/routes/v1/notifications/post.test.ts | 4 +- .../src/routes/v1/notifications/post.ts | 7 +- .../src/routes/v1/notifications/schema.ts | 1 - .../src/routes/v1/pageSubscribers/index.ts | 1 + .../routes/v1/pageSubscribers/post.test.ts | 4 +- .../src/routes/v1/pageSubscribers/post.ts | 7 +- apps/server/src/routes/v1/pages/get.test.ts | 1 + apps/server/src/routes/v1/pages/get.ts | 7 +- .../src/routes/v1/pages/get_all.test.ts | 2 + apps/server/src/routes/v1/pages/get_all.ts | 5 +- apps/server/src/routes/v1/pages/index.ts | 1 + apps/server/src/routes/v1/pages/post.test.ts | 4 +- apps/server/src/routes/v1/pages/post.ts | 4 +- apps/server/src/routes/v1/pages/put.test.ts | 1 + apps/server/src/routes/v1/pages/put.ts | 9 +- apps/server/src/routes/v1/pages/schema.ts | 2 +- .../routes/v1/statusReportUpdates/get.test.ts | 1 + .../src/routes/v1/statusReportUpdates/get.ts | 2 +- .../routes/v1/statusReportUpdates/index.ts | 1 + .../v1/statusReportUpdates/post.test.ts | 2 +- .../src/routes/v1/statusReportUpdates/post.ts | 4 +- .../routes/v1/statusReportUpdates/schema.ts | 1 - .../routes/v1/statusReports/delete.test.ts | 1 + .../src/routes/v1/statusReports/delete.ts | 2 +- .../src/routes/v1/statusReports/get.test.ts | 1 + .../server/src/routes/v1/statusReports/get.ts | 2 +- .../routes/v1/statusReports/get_all.test.ts | 2 + .../src/routes/v1/statusReports/get_all.ts | 2 +- .../src/routes/v1/statusReports/index.ts | 1 + .../src/routes/v1/statusReports/post.test.ts | 5 +- .../src/routes/v1/statusReports/post.ts | 4 +- .../src/routes/v1/statusReports/schema.ts | 1 - .../subscriber-filtering.integration.test.ts | 1 + .../v1/statusReports/update/post.test.ts | 1 + .../routes/v1/statusReports/update/post.ts | 8 +- apps/server/src/routes/v1/whoami/get.test.ts | 1 + apps/server/src/routes/v1/whoami/get.ts | 4 +- apps/server/src/routes/v1/whoami/index.ts | 4 +- apps/server/src/routes/v1/whoami/schema.ts | 1 - apps/status-page/next.config.ts | 1 + apps/status-page/src/app/(public)/client.tsx | 50 +- apps/status-page/src/app/(public)/layout.tsx | 17 +- apps/status-page/src/app/(public)/page.tsx | 1 + .../[domain]/[locale]/(auth)/layout.tsx | 5 +- .../login/_components/section-magic-link.tsx | 16 +- .../login/_components/section-password.tsx | 13 +- .../[domain]/[locale]/(auth)/login/actions.ts | 5 +- .../[domain]/[locale]/(auth)/login/page.tsx | 4 +- .../[locale]/(auth)/restricted/page.tsx | 7 +- .../[locale]/(public)/badge/route.tsx | 5 +- .../[locale]/(public)/badge/v2/route.ts | 3 +- .../[domain]/[locale]/(public)/client.tsx | 53 +- .../[locale]/(public)/events/(list)/page.tsx | 24 +- .../events/(view)/maintenance/[id]/layout.tsx | 3 +- .../events/(view)/maintenance/[id]/page.tsx | 6 +- .../events/(view)/report/[id]/layout.tsx | 3 +- .../events/(view)/report/[id]/page.tsx | 7 +- .../[locale]/(public)/events/layout.tsx | 3 +- .../[locale]/(public)/feed/[type]/route.ts | 5 +- .../[locale]/(public)/feed/json/route.ts | 3 +- .../[domain]/[locale]/(public)/layout.tsx | 7 +- .../[locale]/(public)/manage/[token]/page.tsx | 35 +- .../[locale]/(public)/manage/layout.tsx | 3 +- .../[locale]/(public)/monitors/[id]/page.tsx | 30 +- .../[locale]/(public)/monitors/page.tsx | 15 +- .../[domain]/[locale]/(public)/page.tsx | 1 + .../[locale]/(public)/search-params.ts | 3 +- .../(public)/unsubscribe/[token]/layout.tsx | 3 +- .../(public)/unsubscribe/[token]/page.tsx | 9 +- .../(public)/verify/[token]/layout.tsx | 3 +- .../[locale]/(public)/verify/[token]/page.tsx | 12 +- .../[domain]/[locale]/layout.tsx | 7 +- .../src/app/(status-page)/[domain]/layout.tsx | 13 +- .../src/app/api/trpc/edge/[trpc]/route.ts | 4 +- .../src/app/api/trpc/lambda/[trpc]/route.ts | 4 +- apps/status-page/src/app/global-error.tsx | 9 +- apps/status-page/src/app/layout.tsx | 11 +- apps/status-page/src/app/not-found.tsx | 10 +- .../chart/chart-area-percentiles.tsx | 4 +- .../src/components/chart/chart-bar-uptime.tsx | 7 +- .../components/chart/chart-legend-badge.tsx | 7 +- .../components/chart/chart-line-region.tsx | 4 +- .../components/chart/chart-line-regions.tsx | 23 +- .../components/chart/chart-tooltip-number.tsx | 4 +- .../status-page/src/components/common/kbd.tsx | 2 +- .../src/components/common/link.tsx | 7 +- .../src/components/content/empty-state.tsx | 4 +- .../src/components/content/metric-card.tsx | 14 +- .../components/content/process-message.tsx | 6 +- .../src/components/content/section.tsx | 4 +- .../src/components/date-fns-provider.tsx | 3 +- .../src/components/date-picker.tsx | 14 +- .../src/components/forms/form-card.tsx | 7 +- .../forms/form-manage-subscription.tsx | 11 +- .../components/forms/form-subscribe-email.tsx | 13 +- .../i18n/status-blocks-provider.tsx | 13 +- .../src/components/layout/embed-shell.tsx | 3 +- .../src/components/locale-switcher.tsx | 11 +- .../status-page/src/components/nav/footer.tsx | 15 +- .../status-page/src/components/nav/header.tsx | 15 +- .../src/components/password-wrapper.tsx | 3 +- .../components/popover/popover-quantile.tsx | 4 +- .../status-page/floating-button.tsx | 8 +- .../components/status-page/floating-theme.tsx | 8 +- .../src/components/status-page/status-bar.tsx | 5 +- .../components/status-page/status-blank.tsx | 3 +- .../status-page/status-calendar.tsx | 24 +- .../components/status-page/status-charts.tsx | 2 +- .../status-page/status-component-group.tsx | 6 +- .../components/status-page/status-events.tsx | 3 +- .../components/status-page/status-feed.tsx | 8 +- .../status-page/status-monitor-tabs.tsx | 6 +- .../components/status-page/status-updates.tsx | 13 +- .../src/components/status-page/utils.ts | 1 + .../src/components/tailwind-indicator.tsx | 2 +- .../src/components/themes/theme-provider.tsx | 5 +- .../src/components/themes/theme-select.tsx | 7 +- .../src/components/themes/theme-sidebar.tsx | 24 +- .../ui/data-table/data-table-action-bar.tsx | 22 +- .../data-table/data-table-column-header.tsx | 12 +- .../data-table/data-table-faceted-filter.tsx | 11 +- .../ui/data-table/data-table-pagination.tsx | 23 +- .../ui/data-table/data-table-toolbar.tsx | 7 +- .../ui/data-table/data-table-view-options.tsx | 7 +- .../components/ui/data-table/data-table.tsx | 20 +- apps/status-page/src/data/metrics.client.ts | 6 +- apps/status-page/src/hooks/use-embed.ts | 3 +- .../src/hooks/use-pathname-prefix.ts | 7 +- apps/status-page/src/i18n/request.ts | 1 + apps/status-page/src/i18n/routing.ts | 1 + apps/status-page/src/lib/auth/adapter.ts | 3 +- apps/status-page/src/lib/auth/index.ts | 8 +- apps/status-page/src/lib/auth/providers.ts | 4 +- apps/status-page/src/lib/domain.ts | 1 - .../proxy/apply-page-locale-override.test.ts | 1 + .../lib/proxy/apply-page-locale-override.ts | 1 + .../src/lib/proxy/build-external-path.test.ts | 1 + .../src/lib/proxy/compose-page-action.test.ts | 2 + .../src/lib/proxy/is-ip-allowed.test.ts | 1 + .../resolve-custom-domain-rewrite.test.ts | 1 + .../proxy/resolve-custom-domain-rewrite.ts | 1 + .../lib/proxy/resolve-default-rewrite.test.ts | 1 + .../proxy/resolve-email-domain-action.test.ts | 1 + .../lib/proxy/resolve-email-domain-action.ts | 1 + .../resolve-ip-restriction-action.test.ts | 1 + .../proxy/resolve-ip-restriction-action.ts | 1 + .../lib/proxy/resolve-locale-action.test.ts | 1 + .../src/lib/proxy/resolve-locale-action.ts | 1 + .../lib/proxy/resolve-password-action.test.ts | 1 + .../src/lib/proxy/resolve-password-action.ts | 1 + .../lib/proxy/sanitize-redirect-param.test.ts | 1 + .../proxy/strip-prefix-for-external.test.ts | 1 + apps/status-page/src/lib/proxy/types.ts | 1 + .../src/lib/resolve-pathname-prefix.test.ts | 1 + .../status-page/src/lib/resolve-route.test.ts | 1 + apps/status-page/src/lib/resolve-route.ts | 1 + apps/status-page/src/lib/trpc/client.tsx | 4 +- apps/status-page/src/lib/trpc/server.tsx | 11 +- apps/status-page/src/lib/trpc/shared.ts | 5 +- apps/status-page/src/proxy.ts | 4 +- apps/web/next.config.ts | 1 + .../src/app/(docs)/docs/[[...slug]]/page.tsx | 9 +- apps/web/src/app/(landing)/[slug]/page.tsx | 5 +- .../src/app/(landing)/blog/[slug]/page.tsx | 10 +- .../(landing)/blog/category/[slug]/page.tsx | 3 +- .../src/app/(landing)/blog/category/page.tsx | 4 +- .../src/app/(landing)/blog/feed.xml/route.ts | 3 +- apps/web/src/app/(landing)/blog/page.tsx | 6 +- .../app/(landing)/changelog/[slug]/page.tsx | 10 +- .../changelog/category/[slug]/page.tsx | 3 +- .../app/(landing)/changelog/category/page.tsx | 4 +- .../app/(landing)/changelog/feed.xml/route.ts | 3 +- apps/web/src/app/(landing)/changelog/page.tsx | 6 +- .../src/app/(landing)/compare/[slug]/page.tsx | 5 +- apps/web/src/app/(landing)/compare/page.tsx | 4 +- .../src/app/(landing)/content-box-image.tsx | 5 +- apps/web/src/app/(landing)/content-box.tsx | 9 +- .../src/app/(landing)/content-category.tsx | 3 +- apps/web/src/app/(landing)/content-list.tsx | 9 +- .../src/app/(landing)/content-metadata.tsx | 2 +- .../src/app/(landing)/content-pagination.tsx | 17 +- .../app/(landing)/customers/[slug]/page.tsx | 5 +- apps/web/src/app/(landing)/customers/page.tsx | 4 +- .../src/app/(landing)/guides/[slug]/page.tsx | 10 +- .../(landing)/guides/category/[slug]/page.tsx | 3 +- .../app/(landing)/guides/category/page.tsx | 4 +- apps/web/src/app/(landing)/guides/page.tsx | 4 +- .../src/app/(landing)/oss-friends/page.tsx | 6 +- apps/web/src/app/(landing)/page.tsx | 3 +- .../(landing)/play/checker/[slug]/client.tsx | 28 +- .../(landing)/play/checker/[slug]/page.tsx | 6 +- .../app/(landing)/play/checker/api/route.ts | 9 +- .../src/app/(landing)/play/checker/client.tsx | 28 +- .../src/app/(landing)/play/checker/page.tsx | 4 +- .../src/app/(landing)/play/checker/utils.ts | 3 +- apps/web/src/app/(landing)/play/curl/page.tsx | 4 +- .../(landing)/play/mcp-health/[id]/client.tsx | 1 + .../(landing)/play/mcp-health/[id]/page.tsx | 6 +- .../(landing)/play/mcp-health/api/route.ts | 9 +- .../app/(landing)/play/mcp-health/client.tsx | 32 +- .../app/(landing)/play/mcp-health/page.tsx | 4 +- .../(landing)/play/mcp-health/utils.test.ts | 1 + apps/web/src/app/(landing)/play/page.tsx | 4 +- .../(landing)/play/severity-matrix/client.tsx | 25 +- .../(landing)/play/severity-matrix/page.tsx | 4 +- .../app/(landing)/play/uptime-sla/client.tsx | 5 +- .../app/(landing)/play/uptime-sla/page.tsx | 4 +- .../[id]/[component]/component-detail.tsx | 8 +- .../status/[id]/[component]/page.tsx | 2 +- .../(landing)/status/[id]/history-bars.tsx | 2 +- .../app/(landing)/status/[id]/incidents.tsx | 6 +- .../src/app/(landing)/status/[id]/page.tsx | 2 +- .../(landing)/status/[id]/service-detail.tsx | 2 +- .../status/external-service-components.tsx | 13 +- .../status/external-service-pill.tsx | 2 +- .../(landing)/status/external-status-grid.tsx | 7 +- apps/web/src/app/(landing)/status/page.tsx | 4 +- .../app/(landing)/status/service-search.tsx | 9 +- .../src/app/(landing)/tooling/[slug]/page.tsx | 5 +- apps/web/src/app/(landing)/tooling/page.tsx | 4 +- .../app/(landing)/use-case/[slug]/page.tsx | 10 +- apps/web/src/app/(landing)/use-case/page.tsx | 4 +- apps/web/src/app/api/checker/cron/_cron.ts | 13 +- .../src/app/api/checker/test/http/route.ts | 6 +- .../web/src/app/api/checker/test/tcp/route.ts | 5 +- .../src/app/api/checker/test/tcp/schema.ts | 3 +- .../app/api/internal/email/feedback/route.ts | 3 +- apps/web/src/app/api/internal/email/route.ts | 3 +- .../api/internal/email/team-invite/route.ts | 3 +- .../src/app/api/markdown/[[...path]]/route.ts | 3 +- .../src/app/api/og/_components/background.tsx | 2 +- .../app/api/og/_components/basic-layout.tsx | 3 +- .../app/api/og/_components/status-check.tsx | 2 +- .../src/app/api/og/_components/tracker.tsx | 2 +- apps/web/src/app/api/og/checker/route.tsx | 5 +- .../src/app/api/og/external-service/route.tsx | 6 +- apps/web/src/app/api/og/monitor/route.tsx | 4 +- apps/web/src/app/api/og/page/route.tsx | 4 +- apps/web/src/app/api/og/post/route.tsx | 1 + apps/web/src/app/api/og/route.tsx | 1 + apps/web/src/app/api/og/status/route.tsx | 7 +- apps/web/src/app/api/search/route.ts | 3 +- .../web/src/app/api/trpc/edge/[trpc]/route.ts | 4 +- .../src/app/api/trpc/lambda/[trpc]/route.ts | 4 +- apps/web/src/app/api/webhook/stripe/route.ts | 5 +- apps/web/src/app/global-error.tsx | 2 +- apps/web/src/app/layout.tsx | 8 +- apps/web/src/app/sitemap.ts | 3 +- .../web/src/components/dev-mode-container.tsx | 4 +- .../src/components/icon-cloud-provider.tsx | 3 +- apps/web/src/components/loading-animation.tsx | 5 +- .../web/src/components/tailwind-indicator.tsx | 2 +- apps/web/src/content/cmdk.tsx | 29 +- .../web/src/content/component-highlighter.tsx | 4 +- apps/web/src/content/copy-button.tsx | 2 +- apps/web/src/content/docs-footer.tsx | 5 +- apps/web/src/content/docs-header.tsx | 3 +- apps/web/src/content/docs-sidebar.tsx | 16 +- apps/web/src/content/docs-sub-nav.tsx | 6 +- apps/web/src/content/docs-toc.tsx | 8 +- apps/web/src/content/docs.ts | 1 + apps/web/src/content/footer-status.tsx | 5 +- apps/web/src/content/footer.tsx | 9 +- apps/web/src/content/header.tsx | 10 +- apps/web/src/content/image-zoom.tsx | 7 +- apps/web/src/content/latency-chart-table.tsx | 5 +- apps/web/src/content/link.tsx | 5 +- .../src/content/logo-with-context-menu.tsx | 4 +- apps/web/src/content/mdx-components/aside.tsx | 5 +- .../content/mdx-components/button-link.tsx | 3 +- apps/web/src/content/mdx-components/card.tsx | 13 +- apps/web/src/content/mdx-components/code.tsx | 2 +- .../content/mdx-components/custom-image.tsx | 5 +- apps/web/src/content/mdx-components/grid.tsx | 5 +- apps/web/src/content/mdx-components/index.tsx | 1 + apps/web/src/content/mdx-components/pre.tsx | 1 + .../web/src/content/mdx-components/subtle.tsx | 3 +- .../src/content/mdx-components/youtube.tsx | 2 +- apps/web/src/content/mdx.tsx | 1 + .../src/content/shadcn-registry-example.tsx | 2 +- apps/web/src/content/simple-chart.tsx | 7 +- apps/web/src/content/status-markdown.ts | 3 +- apps/web/src/content/sub-nav.tsx | 8 +- apps/web/src/content/theme-toggle.tsx | 7 +- apps/web/src/content/utils/index.ts | 1 + apps/web/src/content/utils/read.ts | 2 + apps/web/src/content/utils/search-index.ts | 1 + apps/web/src/data/content.ts | 13 +- apps/web/src/env.ts | 1 - apps/web/src/lib/checker/mock.ts | 3 +- apps/web/src/lib/checker/utils.ts | 3 +- apps/web/src/lib/mcp/health-check.test.ts | 1 + apps/web/src/lib/mcp/health-check.ts | 1 + apps/web/src/lib/metadata/json-ld.tsx | 2 +- apps/web/src/lib/metadata/shared-metadata.ts | 3 +- apps/web/src/lib/metadata/structured-data.ts | 4 +- apps/web/src/lib/monitor/utils.ts | 3 +- apps/web/src/trpc/client.ts | 3 +- apps/web/src/trpc/rq-client.tsx | 2 +- apps/web/src/trpc/rq-server.ts | 2 +- apps/web/src/trpc/server.ts | 3 +- apps/web/src/trpc/shared.ts | 5 +- apps/workflows/src/checker/alerting.test.ts | 1 + apps/workflows/src/checker/alerting.ts | 4 +- apps/workflows/src/checker/index.ts | 9 +- apps/workflows/src/cron/checker.ts | 13 +- apps/workflows/src/cron/emails.ts | 1 + .../src/cron/external-incidents-prune.ts | 2 +- apps/workflows/src/cron/external-status.ts | 2 +- apps/workflows/src/cron/index.ts | 1 + apps/workflows/src/cron/monitor.ts | 1 + apps/workflows/src/incident/index.ts | 1 + apps/workflows/src/index.ts | 10 +- apps/workflows/src/lib/db.ts | 4 +- apps/workflows/src/scripts/tinybird.ts | 5 +- biome.jsonc | 162 ----- oxfmt.config.ts | 28 + oxlint.config.ts | 115 ++++ package.json | 23 +- packages/analytics/src/server.ts | 1 + packages/api/package.json | 10 +- packages/api/src/router/apiKey.ts | 3 +- packages/api/src/router/blob.test.ts | 1 + packages/api/src/router/blob.ts | 2 +- packages/api/src/router/checker.ts | 4 +- packages/api/src/router/email/index.ts | 4 +- packages/api/src/router/externalService.ts | 5 +- packages/api/src/router/feedback.ts | 1 + packages/api/src/router/import.test.ts | 1 + packages/api/src/router/integration.ts | 3 +- packages/api/src/router/invitation.ts | 5 +- packages/api/src/router/maintenance.test.ts | 1 + packages/api/src/router/monitor.test.ts | 1 + packages/api/src/router/monitor.ts | 2 +- packages/api/src/router/notification.test.ts | 1 + packages/api/src/router/notification.ts | 24 +- packages/api/src/router/page.ts | 5 +- packages/api/src/router/pageComponent.test.ts | 1 + packages/api/src/router/pageComponent.ts | 3 +- .../api/src/router/privateLocation.test.ts | 1 + .../api/src/router/statusPage.e2e.test.ts | 1 + packages/api/src/router/statusPage.ts | 7 +- .../api/src/router/statusPage.utils.test.ts | 2 + packages/api/src/router/statusPage.utils.ts | 1 - packages/api/src/router/statusReport.test.ts | 1 + packages/api/src/router/stripe/index.ts | 7 +- packages/api/src/router/stripe/webhook.ts | 9 +- .../api/src/router/tinybird/index.test.ts | 1 + packages/api/src/router/tinybird/index.ts | 9 +- packages/api/src/router/workspace.ts | 3 +- packages/api/src/service-adapter.ts | 3 +- packages/api/src/trpc.ts | 9 +- packages/assertions/package.json | 8 +- packages/db/package.json | 4 +- packages/db/script/region-migration.test.ts | 2 + packages/db/script/region-migration.ts | 1 + .../db/src/schema/applications/application.ts | 1 + .../db/src/schema/applications/validation.ts | 1 + packages/db/src/schema/check/check.ts | 1 + .../db/src/schema/feedbacks/validation.ts | 1 + .../db/src/schema/maintenances/validation.ts | 1 + .../db/src/schema/monitor_run/monitor_run.ts | 1 + packages/db/src/schema/monitors/validation.ts | 5 +- .../src/schema/page_components/validation.ts | 1 + packages/db/src/schema/pages/page.ts | 2 +- packages/db/src/schema/plan/config.ts | 1 + packages/db/src/schema/plan/schema.ts | 1 + .../private_locations/private_locations.ts | 1 + packages/db/src/schema/viewers/viewer.ts | 1 - packages/db/src/seed/external-services.ts | 1 + packages/db/src/sync-db.ts | 2 +- packages/db/src/utils/api-key.test.ts | 1 + packages/db/src/utils/api-key.ts | 3 +- packages/emails/emails/_components/footer.tsx | 1 + packages/emails/emails/_components/layout.tsx | 1 + packages/emails/emails/monitor-alert.tsx | 1 + .../emails/emails/monitor-deactivation.tsx | 1 + packages/emails/emails/monitor-paused.tsx | 1 + packages/emails/emails/page-subscription.tsx | 1 + .../emails/emails/status-page-magic-link.tsx | 1 + packages/emails/emails/status-report.tsx | 1 + packages/emails/emails/team-invitation.tsx | 1 + packages/emails/package.json | 6 +- .../emails/src/client.integration.test.tsx | 2 + packages/emails/src/client.tsx | 1 + packages/emails/src/send.ts | 2 +- packages/error/package.json | 8 +- packages/header-analysis/package.json | 8 +- .../src/parser/cache-control.ts | 1 - packages/icons/package.json | 11 +- .../src/providers/betterstack/client.test.ts | 1 + .../src/providers/betterstack/client.ts | 1 + .../src/providers/betterstack/mapper.test.ts | 1 + .../providers/betterstack/provider.test.ts | 1 + .../src/providers/instatus/client.test.ts | 1 + .../src/providers/instatus/client.ts | 1 + .../src/providers/instatus/mapper.test.ts | 1 + .../src/providers/instatus/provider.test.ts | 1 + .../src/providers/statuspage/client.test.ts | 1 + .../src/providers/statuspage/client.ts | 1 + .../src/providers/statuspage/mapper.test.ts | 1 + .../src/providers/statuspage/provider.test.ts | 1 + packages/locales/package.json | 8 +- packages/notifications/base/package.json | 8 +- .../base/src/utils/duration.test.ts | 1 + .../base/src/utils/incident.test.ts | 2 + .../notifications/base/src/utils/incident.ts | 1 + .../notifications/base/src/utils/message.ts | 1 + .../bird-whatsapp/src/index.test.ts | 2 + .../notifications/bird-whatsapp/src/index.ts | 1 + .../notifications/discord/src/index.test.ts | 3 +- packages/notifications/discord/src/index.ts | 1 + packages/notifications/discord/src/mock.ts | 1 + packages/notifications/email/package.json | 2 +- .../notifications/email/src/index.test.ts | 2 + packages/notifications/email/src/index.ts | 1 + packages/notifications/email/src/mock.ts | 1 + .../google-chat/src/index.test.ts | 3 +- .../notifications/google-chat/src/mock.ts | 1 + .../grafana-oncall/src/index.test.ts | 3 +- .../notifications/grafana-oncall/src/index.ts | 1 + .../notifications/ms-teams/src/index.test.ts | 2 + packages/notifications/ms-teams/src/index.ts | 1 + packages/notifications/ms-teams/src/mock.ts | 1 + packages/notifications/ntfy/src/index.test.ts | 3 +- .../notifications/opsgenie/src/index.test.ts | 3 +- packages/notifications/opsgenie/src/index.ts | 1 + .../notifications/pagerduty/src/index.test.ts | 3 +- packages/notifications/pagerduty/src/index.ts | 1 + .../notifications/slack/src/index.test.ts | 3 +- packages/notifications/slack/src/index.ts | 1 + packages/notifications/slack/src/mock.ts | 1 + .../notifications/telegram/src/index.test.ts | 3 +- .../twillio-sms/src/index.test.ts | 3 +- .../notifications/twillio-sms/src/index.ts | 1 + .../notifications/webhook/src/index.test.ts | 2 +- packages/notifications/webhook/src/index.ts | 1 + packages/proto/scripts/clean-openapi.ts | 4 +- packages/react/package.json | 16 +- packages/react/src/widget.tsx | 2 +- packages/regions/package.json | 8 +- .../__tests__/with-test-transaction.test.ts | 1 + packages/services/src/agent-tools/index.ts | 5 +- packages/services/src/agent-tools/types.ts | 12 +- .../src/api-key/__tests__/api-key.test.ts | 2 +- .../src/audit/__tests__/audit.test.ts | 4 +- .../src/auth/__tests__/matches-scope.test.ts | 1 + packages/services/src/context.ts | 1 + .../external-service-component.test.ts | 1 + .../external-service-incident.test.ts | 1 + .../src/external-service-incident/index.ts | 5 +- .../__tests__/external-service.test.ts | 1 + .../src/import/__tests__/unit.test.ts | 2 + packages/services/src/import/phase-writers.ts | 2 +- .../src/incident/__tests__/incident.test.ts | 1 + packages/services/src/incident/list.ts | 5 +- packages/services/src/index.ts | 6 +- .../__tests__/install-slack-agent.test.ts | 1 + .../invitation/__tests__/invitation.test.ts | 1 + .../maintenance/__tests__/maintenance.test.ts | 1 + packages/services/src/maintenance/list.ts | 2 +- .../src/member/__tests__/member.test.ts | 1 + .../monitor-tag/__tests__/monitor-tag.test.ts | 1 + .../src/monitor/__tests__/monitor.test.ts | 1 + .../src/monitor/__tests__/reads.test.ts | 1 + packages/services/src/monitor/index.ts | 5 +- packages/services/src/monitor/list.ts | 2 +- .../__tests__/notification.test.ts | 1 + packages/services/src/notification/list.ts | 2 +- .../__tests__/page-component.test.ts | 1 + packages/services/src/page-component/index.ts | 5 +- packages/services/src/page-component/list.ts | 5 +- .../__tests__/page-subscriber.test.ts | 1 + .../services/src/page-subscriber/index.ts | 5 +- .../services/src/page/__tests__/page.test.ts | 1 + packages/services/src/page/list.ts | 2 +- .../__tests__/status-report.test.ts | 1 + packages/services/src/status-report/index.ts | 15 +- packages/services/src/status-report/list.ts | 4 +- .../src/workspace/__tests__/workspace.test.ts | 1 + packages/services/test/helpers.ts | 1 + .../status-fetcher/__tests__/fetch.test.ts | 2 + .../__tests__/fetchers/atlassian.test.ts | 1 + .../__tests__/fetchers/betterstack.test.ts | 1 + .../__tests__/fetchers/components.test.ts | 1 + .../__tests__/fetchers/custom.test.ts | 1 + .../__tests__/fetchers/edge-cases.test.ts | 2 + .../__tests__/fetchers/html.test.ts | 1 + .../__tests__/fetchers/incidentio.test.ts | 1 + .../__tests__/fetchers/instatus.test.ts | 1 + .../__tests__/fetchers/uptimerobot.test.ts | 1 + packages/status-fetcher/__tests__/helpers.ts | 2 + .../__tests__/integration.test.ts | 2 + .../status-fetcher/__tests__/utils.test.ts | 1 + packages/status-fetcher/package.json | 4 +- .../status-fetcher/scripts/test-fetchers.ts | 1 + packages/status-fetcher/src/components.ts | 1 + packages/status-fetcher/src/fetch.ts | 1 + .../status-fetcher/src/fetchers/atlassian.ts | 1 + .../src/fetchers/betterstack.ts | 1 + .../status-fetcher/src/fetchers/custom.ts | 1 + packages/status-fetcher/src/fetchers/html.ts | 1 + .../status-fetcher/src/fetchers/incidentio.ts | 1 + .../status-fetcher/src/fetchers/instatus.ts | 1 + .../src/fetchers/uptimerobot.ts | 1 + packages/status-fetcher/src/incidents.ts | 1 + packages/status-fetcher/src/types.ts | 1 + .../subscriptions/src/channels/email.test.ts | 2 + packages/subscriptions/src/channels/email.ts | 1 + .../subscriptions/src/channels/index.test.ts | 1 + .../src/channels/webhook.test.ts | 2 +- .../subscriptions/src/channels/webhook.ts | 1 + packages/subscriptions/src/dispatcher.test.ts | 2 + packages/subscriptions/src/dispatcher.ts | 1 + packages/theme-store/package.json | 8 +- packages/tinybird/package.json | 2 +- .../backfill_external_status_v0_to_v1.ts | 3 +- packages/tinybird/src/audit-log/examples.ts | 4 +- packages/tinybird/src/client.ts | 1 + packages/tracker/package.json | 8 +- packages/ui/package.json | 25 +- packages/ui/scripts/transform-imports.mjs | 1 + .../src/components/blocks/status-banner.tsx | 14 +- .../ui/src/components/blocks/status-bar.tsx | 16 +- .../ui/src/components/blocks/status-blank.tsx | 46 +- .../src/components/blocks/status-calendar.tsx | 59 +- .../blocks/status-component-group.tsx | 16 +- .../components/blocks/status-component.tsx | 20 +- .../src/components/blocks/status-events.tsx | 30 +- .../ui/src/components/blocks/status-feed.tsx | 7 +- .../ui/src/components/blocks/status-icon.tsx | 4 +- .../src/components/blocks/status-layout.tsx | 15 +- .../components/blocks/status-page-footer.tsx | 2 +- .../components/blocks/status-timestamp.tsx | 12 +- .../src/components/blocks/status-updates.tsx | 2 +- .../ui/src/components/custom/text-shimmer.tsx | 3 +- .../ui/src/components/ui/alert-dialog.tsx | 11 +- packages/ui/src/components/ui/alert.tsx | 9 +- packages/ui/src/components/ui/avatar.tsx | 5 +- packages/ui/src/components/ui/badge.tsx | 11 +- packages/ui/src/components/ui/breadcrumb.tsx | 9 +- .../ui/src/components/ui/button-group.tsx | 11 +- packages/ui/src/components/ui/button.tsx | 15 +- packages/ui/src/components/ui/calendar.tsx | 7 +- packages/ui/src/components/ui/card.tsx | 7 +- packages/ui/src/components/ui/chart.tsx | 15 +- packages/ui/src/components/ui/checkbox.tsx | 5 +- packages/ui/src/components/ui/command.tsx | 23 +- .../ui/src/components/ui/context-menu.tsx | 11 +- packages/ui/src/components/ui/dialog.tsx | 11 +- packages/ui/src/components/ui/drawer.tsx | 11 +- .../ui/src/components/ui/dropdown-menu.tsx | 21 +- packages/ui/src/components/ui/form.tsx | 5 +- packages/ui/src/components/ui/hover-card.tsx | 9 +- packages/ui/src/components/ui/input-group.tsx | 23 +- packages/ui/src/components/ui/input.tsx | 7 +- packages/ui/src/components/ui/kbd.tsx | 10 +- packages/ui/src/components/ui/label.tsx | 5 +- packages/ui/src/components/ui/popover.tsx | 5 +- packages/ui/src/components/ui/progress.tsx | 7 +- packages/ui/src/components/ui/qr-code.tsx | 6 +- packages/ui/src/components/ui/radio-group.tsx | 7 +- packages/ui/src/components/ui/scroll-area.tsx | 9 +- packages/ui/src/components/ui/select.tsx | 15 +- packages/ui/src/components/ui/separator.tsx | 5 +- packages/ui/src/components/ui/sheet.tsx | 11 +- packages/ui/src/components/ui/sidebar.tsx | 55 +- packages/ui/src/components/ui/skeleton.tsx | 2 +- packages/ui/src/components/ui/slider.tsx | 11 +- packages/ui/src/components/ui/spinner.tsx | 3 +- packages/ui/src/components/ui/switch.tsx | 7 +- packages/ui/src/components/ui/table.tsx | 13 +- packages/ui/src/components/ui/tabs.tsx | 7 +- packages/ui/src/components/ui/textarea.tsx | 5 +- packages/ui/src/components/ui/tooltip.tsx | 7 +- packages/ui/src/hooks/use-cookie-state.ts | 1 - packages/ui/src/lib/compose-refs.ts | 1 - packages/utils/package.json | 8 +- packages/utils/src/payloads.ts | 4 +- packages/utils/src/ssrf.test.ts | 1 + packages/utils/src/stream.ts | 2 +- pnpm-lock.yaml | 551 +++++++++--------- pnpm-workspace.yaml | 8 +- 1021 files changed, 4496 insertions(+), 3959 deletions(-) delete mode 100644 .oxlintrc.json delete mode 100644 .prettierignore create mode 100644 .vscode/extensions.json delete mode 100644 biome.jsonc create mode 100644 oxfmt.config.ts create mode 100644 oxlint.config.ts diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index d1ecb0f27..000000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "ignorePatterns": ["**/*.test.ts", "**/*_pb.ts"] -} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 8795b4d5f..000000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -**/.content-collections diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..523f820b2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["oxc.oxc-vscode"], + "unwantedRecommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 4d9b67c52..0abbd5912 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,7 @@ { "editor.codeActionsOnSave": { - "source.organizeImports.biome": "explicit" + "source.fixAll.oxc": "explicit" }, - "editor.defaultFormatter": "biomejs.biome", "editor.formatOnSave": true, "typescript.tsdk": "node_modules/typescript/lib", diff --git a/.zed/settings.json b/.zed/settings.json index a10b829ce..0ea1254c9 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -22,151 +22,89 @@ } }, "languages": { - "CSS": { + "TypeScript": { + "language_servers": [ + "vtsls", + "oxlint", + "oxfmt", + "tailwindcss-language-server" + ], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "code_actions_on_format": { "source.fixAll.oxc": true }, + "prettier": { "allowed": false } }, - "HTML": { + "TSX": { + "language_servers": [ + "vtsls", + "oxlint", + "oxfmt", + "tailwindcss-language-server" + ], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "code_actions_on_format": { "source.fixAll.oxc": true }, + "prettier": { "allowed": false } }, "JavaScript": { + "language_servers": [ + "vtsls", + "oxlint", + "oxfmt", + "tailwindcss-language-server" + ], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - }, - { - "code_action": "source.fixAll.oxc" - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "code_actions_on_format": { "source.fixAll.oxc": true }, + "prettier": { "allowed": false } }, "JSON": { + "language_servers": ["json-language-server", "oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, "JSONC": { + "language_servers": ["json-language-server", "oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, - "Markdown": { + "CSS": { + "language_servers": ["tailwindcss-language-server", "oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, - "MDX": { + "SCSS": { + "language_servers": ["tailwindcss-language-server", "oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, - "SCSS": { + "HTML": { + "language_servers": ["oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, - "TypeScript": { + "Markdown": { + "language_servers": ["oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, - "TSX": { + "MDX": { + "language_servers": ["oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } }, "YAML": { + "language_servers": ["yaml-language-server", "oxfmt"], "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] + "formatter": [{ "language_server": { "name": "oxfmt" } }], + "prettier": { "allowed": false } } } } diff --git a/apps/dashboard/src/app/(dashboard)/agents/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/agents/breadcrumb.tsx index 7242d4a13..f60bdeb77 100644 --- a/apps/dashboard/src/app/(dashboard)/agents/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/agents/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { Bot } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return ( @@ -21,7 +22,7 @@ export function NavActions() { target="_blank" rel="noreferrer" > - + diff --git a/apps/dashboard/src/app/(dashboard)/agents/page.tsx b/apps/dashboard/src/app/(dashboard)/agents/page.tsx index 98b92e5b4..add05eca2 100644 --- a/apps/dashboard/src/app/(dashboard)/agents/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/agents/page.tsx @@ -1,5 +1,9 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useQuery } from "@tanstack/react-query"; +import { Info } from "lucide-react"; + import { Code } from "@/components/common/code"; import { Link } from "@/components/common/link"; import { Note } from "@/components/common/note"; @@ -11,9 +15,6 @@ import { } from "@/components/content/section"; import { Section } from "@/components/content/section"; import { useTRPC } from "@/lib/trpc/client"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useQuery } from "@tanstack/react-query"; -import { Info } from "lucide-react"; const messages = [ { diff --git a/apps/dashboard/src/app/(dashboard)/cli/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/cli/breadcrumb.tsx index 954f94b6d..aa7c0fe1d 100644 --- a/apps/dashboard/src/app/(dashboard)/cli/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/cli/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { Terminal } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return ( diff --git a/apps/dashboard/src/app/(dashboard)/cli/nav-actions.tsx b/apps/dashboard/src/app/(dashboard)/cli/nav-actions.tsx index 9c9130c9f..4bb9b6669 100644 --- a/apps/dashboard/src/app/(dashboard)/cli/nav-actions.tsx +++ b/apps/dashboard/src/app/(dashboard)/cli/nav-actions.tsx @@ -1,4 +1,3 @@ -import { NavFeedback } from "@/components/nav/nav-feedback"; import { Button } from "@openstatus/ui/components/ui/button"; import { Tooltip, @@ -8,6 +7,8 @@ import { } from "@openstatus/ui/components/ui/tooltip"; import { Book } from "lucide-react"; +import { NavFeedback } from "@/components/nav/nav-feedback"; + export function NavActions() { return (
@@ -21,7 +22,7 @@ export function NavActions() { target="_blank" rel="noreferrer" > - + diff --git a/apps/dashboard/src/app/(dashboard)/cli/page.tsx b/apps/dashboard/src/app/(dashboard)/cli/page.tsx index a2a9a455f..52bea3881 100644 --- a/apps/dashboard/src/app/(dashboard)/cli/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/cli/page.tsx @@ -1,12 +1,3 @@ -import { Code } from "@/components/common/code"; -import { Link } from "@/components/common/link"; -import { - SectionDescription, - SectionGroup, - SectionHeader, - SectionTitle, -} from "@/components/content/section"; -import { Section } from "@/components/content/section"; import { Tabs, TabsContent, @@ -24,6 +15,16 @@ import { } from "lucide-react"; import React from "react"; +import { Code } from "@/components/common/code"; +import { Link } from "@/components/common/link"; +import { + SectionDescription, + SectionGroup, + SectionHeader, + SectionTitle, +} from "@/components/content/section"; +import { Section } from "@/components/content/section"; + const OS = ["macOs", "Windows", "Linux"] as const; const installs = [ @@ -209,7 +210,7 @@ export default function Page() { return (
-

+

{step.title}

diff --git a/apps/dashboard/src/app/(dashboard)/error.tsx b/apps/dashboard/src/app/(dashboard)/error.tsx index 4f56152f5..c138f904a 100644 --- a/apps/dashboard/src/app/(dashboard)/error.tsx +++ b/apps/dashboard/src/app/(dashboard)/error.tsx @@ -1,11 +1,12 @@ "use client"; -import { Code } from "@/components/common/code"; import { Button } from "@openstatus/ui/components/ui/button"; import * as Sentry from "@sentry/nextjs"; import Link from "next/link"; import { useEffect } from "react"; +import { Code } from "@/components/common/code"; + export default function ErrorPage({ error, reset, @@ -19,11 +20,11 @@ export default function ErrorPage({ return (
-
+
-

500 Error

-

+

500 Error

+

Something went wrong

@@ -38,7 +39,7 @@ export default function ErrorPage({

{process.env.NODE_ENV === "development" && ( - + {error.message} {error.stack && `\n\n${error.stack}`} diff --git a/apps/dashboard/src/app/(dashboard)/invite/client.tsx b/apps/dashboard/src/app/(dashboard)/invite/client.tsx index 55a597140..1b7c5f267 100644 --- a/apps/dashboard/src/app/(dashboard)/invite/client.tsx +++ b/apps/dashboard/src/app/(dashboard)/invite/client.tsx @@ -1,5 +1,12 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { isTRPCClientError } from "@trpc/client"; +import { useQueryStates } from "nuqs"; +import { useTransition } from "react"; +import { toast } from "sonner"; + import { Section, SectionDescription, @@ -8,12 +15,7 @@ import { SectionTitle, } from "@/components/content/section"; import { useTRPC } from "@/lib/trpc/client"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { isTRPCClientError } from "@trpc/client"; -import { useQueryStates } from "nuqs"; -import { useTransition } from "react"; -import { toast } from "sonner"; + import { searchParamsParsers } from "./search-params"; export function Client() { diff --git a/apps/dashboard/src/app/(dashboard)/invite/layout.tsx b/apps/dashboard/src/app/(dashboard)/invite/layout.tsx index 23734266d..b7cc3fdb5 100644 --- a/apps/dashboard/src/app/(dashboard)/invite/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/invite/layout.tsx @@ -5,6 +5,7 @@ import { } from "@/components/nav/app-header"; import { AppSidebarTrigger } from "@/components/nav/app-sidebar"; import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + import { NavActions } from "./nav-actions"; export default function Layout({ children }: { children: React.ReactNode }) { diff --git a/apps/dashboard/src/app/(dashboard)/invite/page.tsx b/apps/dashboard/src/app/(dashboard)/invite/page.tsx index d1e38078a..80673532f 100644 --- a/apps/dashboard/src/app/(dashboard)/invite/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/invite/page.tsx @@ -1,6 +1,8 @@ -import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; import { redirect } from "next/navigation"; import type { SearchParams } from "nuqs"; + +import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/app/(dashboard)/layout.tsx b/apps/dashboard/src/app/(dashboard)/layout.tsx index 4d04c2468..425081dcf 100644 --- a/apps/dashboard/src/app/(dashboard)/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/layout.tsx @@ -1,13 +1,14 @@ +import { + SidebarInset, + SidebarProvider, +} from "@openstatus/ui/components/ui/sidebar"; + import { AppSidebar } from "@/components/nav/app-sidebar"; import { LEFT_SIDEBAR_COOKIE, getSidebarDefaultOpen, } from "@/lib/sidebar-cookie"; import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; -import { - SidebarInset, - SidebarProvider, -} from "@openstatus/ui/components/ui/sidebar"; export default async function Layout({ children, diff --git a/apps/dashboard/src/app/(dashboard)/monitors/(list)/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/monitors/(list)/breadcrumb.tsx index fc0bf24f4..744e30462 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/(list)/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/(list)/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { Activity } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return ( useEffect(() => { if (searchParams.status) { setColumnFilters([{ id: "status", value: [searchParams.status] }]); @@ -170,12 +171,12 @@ export function Client() { isLoadingHttp || isLoadingTcp ? undefined : monitor.jobType === "http" - ? globalHttpMetrics?.data?.find( + ? (globalHttpMetrics?.data?.find( (m) => m.monitorId === monitor.id.toString(), - ) ?? false - : globalTcpMetrics?.data?.find( + ) ?? false) + : (globalTcpMetrics?.data?.find( (m) => m.monitorId === monitor.id.toString(), - ) ?? false, + ) ?? false), }))} actionBar={MonitorDataTableActionBar} toolbarComponent={(props) => ( diff --git a/apps/dashboard/src/app/(dashboard)/monitors/(list)/layout.tsx b/apps/dashboard/src/app/(dashboard)/monitors/(list)/layout.tsx index 29afe1b3d..affb067cb 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/(list)/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/(list)/layout.tsx @@ -4,6 +4,7 @@ import { AppHeaderContent, } from "@/components/nav/app-header"; import { AppSidebarTrigger } from "@/components/nav/app-sidebar"; + import { Breadcrumb } from "./breadcrumb"; import { NavActions } from "./nav-actions"; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx b/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx index 3a8461465..79aecaa74 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx @@ -1,13 +1,14 @@ "use client"; -import { UpgradeDialog } from "@/components/dialogs/upgrade"; -import { NavFeedback } from "@/components/nav/nav-feedback"; -import { useTRPC } from "@/lib/trpc/client"; import { Button } from "@openstatus/ui/components/ui/button"; import { useQuery } from "@tanstack/react-query"; import Link from "next/link"; import { useState } from "react"; +import { UpgradeDialog } from "@/components/dialogs/upgrade"; +import { NavFeedback } from "@/components/nav/nav-feedback"; +import { useTRPC } from "@/lib/trpc/client"; + export function NavActions() { const trpc = useTRPC(); const [openDialog, setOpenDialog] = useState(false); diff --git a/apps/dashboard/src/app/(dashboard)/monitors/(list)/page.tsx b/apps/dashboard/src/app/(dashboard)/monitors/(list)/page.tsx index a22b1904d..322476240 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/(list)/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/(list)/page.tsx @@ -1,5 +1,7 @@ -import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; import type { SearchParams } from "nuqs"; + +import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/breadcrumb.tsx index 21c8631da..9cc24df22 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/breadcrumb.tsx @@ -1,10 +1,12 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; -import { useTRPC } from "@/lib/trpc/client"; import { useQuery } from "@tanstack/react-query"; import { Activity } from "lucide-react"; import { useParams, usePathname } from "next/navigation"; + +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; +import { useTRPC } from "@/lib/trpc/client"; + import { MONITOR_TABS } from "./constants"; export function Breadcrumb() { diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/edit/page.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/edit/page.tsx index 98e2f66a9..d44b5e711 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/edit/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/edit/page.tsx @@ -1,5 +1,8 @@ "use client"; +import { useQuery } from "@tanstack/react-query"; +import { useParams } from "next/navigation"; + import { Section, SectionDescription, @@ -9,8 +12,6 @@ import { } from "@/components/content/section"; import { FormMonitorUpdate } from "@/components/forms/monitor/update"; import { useTRPC } from "@/lib/trpc/client"; -import { useQuery } from "@tanstack/react-query"; -import { useParams } from "next/navigation"; export default function Page() { const { id } = useParams<{ id: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/layout.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/layout.tsx index 800b53103..5c93f0259 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/layout.tsx @@ -1,9 +1,11 @@ +import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { RIGHT_SIDEBAR_COOKIE, getSidebarDefaultOpen, } from "@/lib/sidebar-cookie"; import { getQueryClient, trpc } from "@/lib/trpc/server"; -import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { Sidebar } from "../sidebar"; export default async function Layout({ diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/page.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/page.tsx index 83aed0edf..d218ffba5 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/incidents/page.tsx @@ -1,5 +1,9 @@ "use client"; +import { useQuery } from "@tanstack/react-query"; +import { Info } from "lucide-react"; +import { useParams } from "next/navigation"; + import { Link } from "@/components/common/link"; import { Note } from "@/components/common/note"; import { @@ -18,9 +22,6 @@ import { columns } from "@/components/data-table/incidents/columns"; import { DataTable } from "@/components/ui/data-table/data-table"; import { DataTablePaginationSimple } from "@/components/ui/data-table/data-table-pagination"; import { useTRPC } from "@/lib/trpc/client"; -import { useQuery } from "@tanstack/react-query"; -import { Info } from "lucide-react"; -import { useParams } from "next/navigation"; export default function Page() { const { id } = useParams<{ id: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/layout.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/layout.tsx index 4c01e7a6a..de6ed5951 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/layout.tsx @@ -10,6 +10,7 @@ import { getQueryClient, trpc, } from "@/lib/trpc/server"; + import { Breadcrumb } from "./breadcrumb"; import { NavActions } from "./nav-actions"; import { Tabs } from "./tabs"; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/client.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/client.tsx index c8dfb1c17..1ed107844 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/client.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/client.tsx @@ -1,5 +1,12 @@ "use client"; +import { useQuery } from "@tanstack/react-query"; +import type { PaginationState } from "@tanstack/react-table"; +import { Lock } from "lucide-react"; +import { useParams } from "next/navigation"; +import { useQueryStates } from "nuqs"; +import { useCallback, useMemo } from "react"; + import { Link } from "@/components/common/link"; import { BillingOverlay, @@ -13,7 +20,6 @@ import { SectionHeader, SectionTitle, } from "@/components/content/section"; - import { Section } from "@/components/content/section"; import { ButtonReset } from "@/components/controls-search/button-reset"; import { CommandRegion } from "@/components/controls-search/command-region"; @@ -27,12 +33,7 @@ import { DataTablePagination } from "@/components/ui/data-table/data-table-pagin import { DataTableSkeleton } from "@/components/ui/data-table/data-table-skeleton"; import { exampleLogs } from "@/data/response-logs"; import { useTRPC } from "@/lib/trpc/client"; -import { useQuery } from "@tanstack/react-query"; -import type { PaginationState } from "@tanstack/react-table"; -import { Lock } from "lucide-react"; -import { useParams } from "next/navigation"; -import { useQueryStates } from "nuqs"; -import { useCallback, useMemo } from "react"; + import { searchParamsParsers } from "./search-params"; export function Client() { diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/page.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/page.tsx index 478df3192..14d03f214 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/page.tsx @@ -1,4 +1,5 @@ import type { SearchParams } from "nuqs/server"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/search-params.ts b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/search-params.ts index f9558f9bc..ae09140d7 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/search-params.ts +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/logs/search-params.ts @@ -1,4 +1,3 @@ -import { PERIODS, STATUS, TRIGGER } from "@/data/metrics.client"; import { endOfDay } from "date-fns"; import { startOfDay } from "date-fns"; import { @@ -10,6 +9,8 @@ import { parseAsStringLiteral, } from "nuqs/server"; +import { PERIODS, STATUS, TRIGGER } from "@/data/metrics.client"; + export const searchParamsParsers = { period: parseAsStringLiteral(PERIODS).withDefault("1d"), regions: parseAsArrayOf(parseAsString), diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/nav-actions.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/nav-actions.tsx index 29ed6f4fb..d9db443ad 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/nav-actions.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/nav-actions.tsx @@ -1,10 +1,5 @@ "use client"; -import { DataTableSheetTest } from "@/components/data-table/response-logs/data-table-sheet-test"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { NavFeedback } from "@/components/nav/nav-feedback"; -import { getActions } from "@/data/monitors.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { deserialize } from "@openstatus/assertions"; import { Button } from "@openstatus/ui/components/ui/button"; @@ -21,6 +16,12 @@ import { useParams, usePathname, useRouter } from "next/navigation"; import { useState } from "react"; import { toast } from "sonner"; +import { DataTableSheetTest } from "@/components/data-table/response-logs/data-table-sheet-test"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { NavFeedback } from "@/components/nav/nav-feedback"; +import { getActions } from "@/data/monitors.client"; +import { useTRPC } from "@/lib/trpc/client"; + type TestTCP = RouterOutputs["checker"]["testTcp"]; type TestHTTP = RouterOutputs["checker"]["testHttp"]; type TestDNS = RouterOutputs["checker"]["testDns"]; @@ -156,23 +157,23 @@ export function NavActions() { return (
-
+
{!monitor.active ? ( - + ) : monitor.status === "active" ? ( - - + + ) : monitor.status === "error" ? ( - + ) : ( - + )}
diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/client.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/client.tsx index bb683288b..0b9f5167b 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/client.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/client.tsx @@ -1,5 +1,18 @@ "use client"; +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "@openstatus/ui/components/ui/tabs"; +import { useQuery } from "@tanstack/react-query"; +import { endOfDay } from "date-fns"; +import { useParams } from "next/navigation"; +import { useQueryStates } from "nuqs"; +import React, { useEffect, useMemo } from "react"; +import { toast } from "sonner"; + import { ChartAreaLatency } from "@/components/chart/chart-area-latency"; import { ChartAreaTimingPhases } from "@/components/chart/chart-area-timing-phases"; import { ChartBarUptime } from "@/components/chart/chart-bar-uptime"; @@ -31,18 +44,7 @@ import { import { periodToFromDate, periodToInterval } from "@/data/metrics.client"; import type { RegionMetric } from "@/data/region-metrics"; import { useTRPC } from "@/lib/trpc/client"; -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "@openstatus/ui/components/ui/tabs"; -import { useQuery } from "@tanstack/react-query"; -import { endOfDay } from "date-fns"; -import { useParams } from "next/navigation"; -import { useQueryStates } from "nuqs"; -import React, { useEffect, useMemo } from "react"; -import { toast } from "sonner"; + import { searchParamsParsers } from "./search-params"; const TIMELINE_INTERVAL = 30; // in days diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/layout.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/layout.tsx index bbeede521..404567611 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/layout.tsx @@ -1,8 +1,10 @@ +import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { RIGHT_SIDEBAR_COOKIE, getSidebarDefaultOpen, } from "@/lib/sidebar-cookie"; -import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { Sidebar } from "../sidebar"; export default async function Layout({ diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/page.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/page.tsx index 478df3192..14d03f214 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/page.tsx @@ -1,4 +1,5 @@ import type { SearchParams } from "nuqs/server"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/search-params.ts b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/search-params.ts index 1db48b0fd..9c4f1e0f9 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/search-params.ts +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/overview/search-params.ts @@ -1,4 +1,3 @@ -import { INTERVALS } from "@/data/metrics.client"; import { createSearchParamsCache, parseAsArrayOf, @@ -7,6 +6,8 @@ import { parseAsStringLiteral, } from "nuqs/server"; +import { INTERVALS } from "@/data/metrics.client"; + const PERIOD = ["1d", "7d", "14d", "30d", "90d"] as const; const PERCENTILE = ["p50", "p75", "p90", "p95", "p99"] as const; diff --git a/apps/dashboard/src/app/(dashboard)/monitors/[id]/sidebar.tsx b/apps/dashboard/src/app/(dashboard)/monitors/[id]/sidebar.tsx index c4f0238d5..adfa85202 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/[id]/sidebar.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/[id]/sidebar.tsx @@ -1,16 +1,17 @@ "use client"; -import { TableCellLink } from "@/components/data-table/table-cell-link"; -import { SidebarRight } from "@/components/nav/sidebar-right"; -import { monitorTypes } from "@/data/monitors.client"; -import { formatMilliseconds } from "@/lib/formatter"; -import { useTRPC } from "@/lib/trpc/client"; import { deserialize } from "@openstatus/assertions"; import { Badge } from "@openstatus/ui/components/ui/badge"; import { useQuery } from "@tanstack/react-query"; import { Logs } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; +import { TableCellLink } from "@/components/data-table/table-cell-link"; +import { SidebarRight } from "@/components/nav/sidebar-right"; +import { monitorTypes } from "@/data/monitors.client"; +import { formatMilliseconds } from "@/lib/formatter"; +import { useTRPC } from "@/lib/trpc/client"; + export function Sidebar() { const router = useRouter(); const { id } = useParams<{ id: string }>(); @@ -45,7 +46,7 @@ export function Sidebar() { value: type ? ( {type.label} - + ) : ( {monitor.jobType} @@ -65,12 +66,12 @@ export function Sidebar() { { label: "Tags", value: ( -
+
{monitor.tags.map((tag) => (
-
+
-

404 Not found

-

+

404 Not found

+

Page not found

@@ -25,7 +26,7 @@ export default function NotFound() {

@@ -33,7 +34,7 @@ export default function NotFound() { {link.name} diff --git a/apps/dashboard/src/app/(dashboard)/notifications/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/notifications/breadcrumb.tsx index 07afb55d1..ff1644ca6 100644 --- a/apps/dashboard/src/app/(dashboard)/notifications/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/notifications/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { Bell } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return (
-
+
{config[key].label} @@ -147,7 +149,7 @@ export function Client() {
-
+
{config[key].label} @@ -163,7 +165,7 @@ export function Client() {
-
+
Your Notifier diff --git a/apps/dashboard/src/app/(dashboard)/notifications/layout.tsx b/apps/dashboard/src/app/(dashboard)/notifications/layout.tsx index 42727da2e..dce979381 100644 --- a/apps/dashboard/src/app/(dashboard)/notifications/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/notifications/layout.tsx @@ -5,6 +5,7 @@ import { } from "@/components/nav/app-header"; import { AppSidebarTrigger } from "@/components/nav/app-sidebar"; import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; + import { Breadcrumb } from "./breadcrumb"; import { NavActions } from "./nav-actions"; diff --git a/apps/dashboard/src/app/(dashboard)/notifications/page.tsx b/apps/dashboard/src/app/(dashboard)/notifications/page.tsx index b7f03f9a8..3598b76a1 100644 --- a/apps/dashboard/src/app/(dashboard)/notifications/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/notifications/page.tsx @@ -1,4 +1,5 @@ import type { SearchParams } from "nuqs"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/app/(dashboard)/overview/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/overview/breadcrumb.tsx index 0c401a621..020ddd598 100644 --- a/apps/dashboard/src/app/(dashboard)/overview/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/overview/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { LayoutGrid } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return ( (); diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/edit/page.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/edit/page.tsx index 494659239..b3079ce11 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/edit/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/edit/page.tsx @@ -1,5 +1,8 @@ "use client"; +import { useQuery } from "@tanstack/react-query"; +import { useParams } from "next/navigation"; + import { Section, SectionDescription, @@ -9,8 +12,6 @@ import { } from "@/components/content/section"; import { FormStatusPageUpdate } from "@/components/forms/status-page/update"; import { useTRPC } from "@/lib/trpc/client"; -import { useQuery } from "@tanstack/react-query"; -import { useParams } from "next/navigation"; export default function Page() { const { id } = useParams<{ id: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/layout.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/layout.tsx index c972c8c4b..eb9eac213 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/layout.tsx @@ -4,13 +4,13 @@ import { AppHeaderContent, } from "@/components/nav/app-header"; import { AppSidebarTrigger } from "@/components/nav/app-sidebar"; - import { HydrateClient, fetchQueryOrNotFound, getQueryClient, trpc, } from "@/lib/trpc/server"; + import { Breadcrumb } from "./breadcrumb"; import { NavActions } from "./nav-actions"; import { Tabs } from "./tabs"; diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/layout.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/layout.tsx index 3b4a23ed9..3b65d74b6 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/layout.tsx @@ -1,9 +1,11 @@ +import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { RIGHT_SIDEBAR_COOKIE, getSidebarDefaultOpen, } from "@/lib/sidebar-cookie"; import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; -import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { Sidebar } from "../sidebar"; export default async function Layout({ diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/page.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/page.tsx index 38c4b1925..46d930921 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/maintenances/page.tsx @@ -1,5 +1,10 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { Plus } from "lucide-react"; +import { useParams } from "next/navigation"; + import { Link } from "@/components/common/link"; import { Section, @@ -14,10 +19,6 @@ import { FormSheetMaintenance } from "@/components/forms/maintenance/sheet"; import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; import { DataTable } from "@/components/ui/data-table/data-table"; import { useTRPC } from "@/lib/trpc/client"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { Plus } from "lucide-react"; -import { useParams } from "next/navigation"; export default function Page() { const { id } = useParams<{ id: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/nav-actions.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/nav-actions.tsx index 5f41de8e5..372f16377 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/nav-actions.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/nav-actions.tsx @@ -1,9 +1,5 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { NavFeedback } from "@/components/nav/nav-feedback"; -import { getActions } from "@/data/status-pages.client"; -import { useTRPC } from "@/lib/trpc/client"; import { Button } from "@openstatus/ui/components/ui/button"; import { Tooltip, @@ -16,6 +12,11 @@ import { Globe } from "lucide-react"; import { useParams, usePathname, useRouter } from "next/navigation"; import { toast } from "sonner"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { NavFeedback } from "@/components/nav/nav-feedback"; +import { getActions } from "@/data/status-pages.client"; +import { useTRPC } from "@/lib/trpc/client"; + export function NavActions() { const { id } = useParams<{ id: string }>(); const router = useRouter(); @@ -64,7 +65,7 @@ export function NavActions() { target="_blank" rel="noreferrer" > - + diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/sidebar.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/sidebar.tsx index f58bab63f..153da5bd8 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/sidebar.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/sidebar.tsx @@ -1,9 +1,5 @@ "use client"; -import { Link } from "@/components/common/link"; -import { TableCellLink } from "@/components/data-table/table-cell-link"; -import { SidebarRight } from "@/components/nav/sidebar-right"; -import { useTRPC } from "@/lib/trpc/client"; import { Tooltip, TooltipContent, @@ -15,6 +11,11 @@ import { useQuery } from "@tanstack/react-query"; import { ExternalLink } from "lucide-react"; import { useParams } from "next/navigation"; +import { Link } from "@/components/common/link"; +import { TableCellLink } from "@/components/data-table/table-cell-link"; +import { SidebarRight } from "@/components/nav/sidebar-right"; +import { useTRPC } from "@/lib/trpc/client"; + export function Sidebar() { const { id } = useParams<{ id: string }>(); const trpc = useTRPC(); @@ -56,7 +57,7 @@ export function Sidebar() { { label: "Favicon", value: statusPage.icon ? ( -
+
favicon
) : ( diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/[reportId]/page.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/[reportId]/page.tsx index 4e2d01e39..6c53f2847 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/[reportId]/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/[reportId]/page.tsx @@ -1,5 +1,10 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Plus } from "lucide-react"; +import { useParams } from "next/navigation"; + import { EmptyStateContainer, EmptyStateDescription, @@ -19,10 +24,6 @@ import { FormStatusReportUpdateCard } from "@/components/forms/status-report-upd import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; import { getNextStatus } from "@/data/status-report-updates.client"; import { useTRPC } from "@/lib/trpc/client"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { Plus } from "lucide-react"; -import { useParams } from "next/navigation"; export default function Page() { const { reportId } = useParams<{ id: string; reportId: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/layout.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/layout.tsx index 267bfbaa9..9a6eb9926 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/layout.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/layout.tsx @@ -1,9 +1,11 @@ +import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { RIGHT_SIDEBAR_COOKIE, getSidebarDefaultOpen, } from "@/lib/sidebar-cookie"; import { HydrateClient, getQueryClient, trpc } from "@/lib/trpc/server"; -import { SidebarProvider } from "@openstatus/ui/components/ui/sidebar"; + import { Sidebar } from "../sidebar"; export default async function Layout({ diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/page.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/page.tsx index 74294c8a1..e8e0d9947 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/status-reports/page.tsx @@ -1,5 +1,10 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Plus } from "lucide-react"; +import { useParams } from "next/navigation"; + import { Link } from "@/components/common/link"; import { Section, @@ -15,10 +20,6 @@ import { FormSheetStatusReport } from "@/components/forms/status-report/sheet"; import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; import { DataTable } from "@/components/ui/data-table/data-table"; import { useTRPC } from "@/lib/trpc/client"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { Plus } from "lucide-react"; -import { useParams } from "next/navigation"; export default function Page() { const { id } = useParams<{ id: string }>(); diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/subscribers/page.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/subscribers/page.tsx index 4fda4f6e0..1b335b32e 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/subscribers/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/subscribers/page.tsx @@ -1,5 +1,12 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { Lock, Plus } from "lucide-react"; +import { notFound, useParams } from "next/navigation"; +import { useState } from "react"; + import { Link } from "@/components/common/link"; import { BillingOverlay, @@ -19,7 +26,6 @@ import { SectionHeaderRow, SectionTitle, } from "@/components/content/section"; - import { Section } from "@/components/content/section"; import { columns } from "@/components/data-table/subscribers/columns"; import { SubscribersDataTableToolbar } from "@/components/data-table/subscribers/data-table-toolbar"; @@ -29,12 +35,6 @@ import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; import { DataTable } from "@/components/ui/data-table/data-table"; import { DataTablePaginationSimple } from "@/components/ui/data-table/data-table-pagination"; import { useTRPC } from "@/lib/trpc/client"; -import type { RouterOutputs } from "@openstatus/api"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { Lock, Plus } from "lucide-react"; -import { notFound, useParams } from "next/navigation"; -import { useState } from "react"; type Subscriber = RouterOutputs["pageSubscriber"]["list"][number]; diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/tabs.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/tabs.tsx index 216e7ed87..ccdc3bd4c 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/[id]/tabs.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/[id]/tabs.tsx @@ -1,7 +1,9 @@ "use client"; -import { NavTabs } from "@/components/nav/nav-tabs"; import { useParams } from "next/navigation"; + +import { NavTabs } from "@/components/nav/nav-tabs"; + import { STATUS_PAGE_TABS } from "./constants"; export function Tabs() { diff --git a/apps/dashboard/src/app/(dashboard)/status-pages/create/breadcrumb.tsx b/apps/dashboard/src/app/(dashboard)/status-pages/create/breadcrumb.tsx index 5028e591e..5c75011b3 100644 --- a/apps/dashboard/src/app/(dashboard)/status-pages/create/breadcrumb.tsx +++ b/apps/dashboard/src/app/(dashboard)/status-pages/create/breadcrumb.tsx @@ -1,8 +1,9 @@ "use client"; -import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; import { PanelTop } from "lucide-react"; +import { NavBreadcrumb } from "@/components/nav/nav-breadcrumb"; + export function Breadcrumb() { return ( = { diff --git a/apps/dashboard/src/app/api/trpc/edge/[trpc]/route.ts b/apps/dashboard/src/app/api/trpc/edge/[trpc]/route.ts index 215b24ce3..9dd8225ba 100644 --- a/apps/dashboard/src/app/api/trpc/edge/[trpc]/route.ts +++ b/apps/dashboard/src/app/api/trpc/edge/[trpc]/route.ts @@ -1,10 +1,10 @@ +import { createTRPCContext } from "@openstatus/api"; +import { edgeRouter } from "@openstatus/api/src/edge"; import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; import type { NextRequest } from "next/server"; import { auth } from "@/lib/auth"; import { createOnError, guardTRPCSource } from "@/lib/trpc/shared"; -import { createTRPCContext } from "@openstatus/api"; -import { edgeRouter } from "@openstatus/api/src/edge"; export const runtime = "edge"; diff --git a/apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts b/apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts index de648a3b4..944ea4af4 100644 --- a/apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts +++ b/apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts @@ -1,10 +1,10 @@ +import { createTRPCContext } from "@openstatus/api"; +import { lambdaRouter } from "@openstatus/api/src/lambda"; import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; import type { NextRequest } from "next/server"; import { auth } from "@/lib/auth"; import { createOnError, guardTRPCSource } from "@/lib/trpc/shared"; -import { createTRPCContext } from "@openstatus/api"; -import { lambdaRouter } from "@openstatus/api/src/lambda"; // Stripe is incompatible with Edge runtimes due to using Node.js events // export const runtime = "edge"; diff --git a/apps/dashboard/src/app/global-error.tsx b/apps/dashboard/src/app/global-error.tsx index f9babe1cf..eede9cec6 100644 --- a/apps/dashboard/src/app/global-error.tsx +++ b/apps/dashboard/src/app/global-error.tsx @@ -17,7 +17,7 @@ export default function GlobalError({ {/* This is the default Next.js error component but it doesn't allow omitting the statusCode property yet. */} - {/* biome-ignore lint/suspicious/noExplicitAny: */} + {/* oxlint-disable-next-line typescript/no-explicit-any */} diff --git a/apps/dashboard/src/app/layout.tsx b/apps/dashboard/src/app/layout.tsx index a0d95329b..df18a14d1 100644 --- a/apps/dashboard/src/app/layout.tsx +++ b/apps/dashboard/src/app/layout.tsx @@ -1,16 +1,19 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono, Inter } from "next/font/google"; -import "./globals.css"; -import { TailwindIndicator } from "@/components/tailwind-indicator"; -import { ThemeProvider } from "@/components/theme-provider"; -import { auth } from "@/lib/auth"; -import { TRPCReactProvider } from "@/lib/trpc/client"; import { OpenPanelComponent } from "@openpanel/nextjs"; import { Toaster } from "@openstatus/ui/components/ui/sonner"; + +import "./globals.css"; import { cn } from "@openstatus/ui/lib/utils"; +import type { Metadata } from "next"; import { SessionProvider } from "next-auth/react"; +import { Geist, Geist_Mono, Inter } from "next/font/google"; import LocalFont from "next/font/local"; import { NuqsAdapter } from "nuqs/adapters/next/app"; + +import { TailwindIndicator } from "@/components/tailwind-indicator"; +import { ThemeProvider } from "@/components/theme-provider"; +import { auth } from "@/lib/auth"; +import { TRPCReactProvider } from "@/lib/trpc/client"; + import { ogMetadata, twitterMetadata } from "./metadata"; import { defaultMetadata } from "./metadata"; @@ -88,7 +91,7 @@ export default async function RootLayout({ cal.variable, commitMono.variable, inter.variable, - "font-sans antialiased ", + "font-sans antialiased", )} > diff --git a/apps/dashboard/src/app/login/_components/login-button.tsx b/apps/dashboard/src/app/login/_components/login-button.tsx index 4ada8b5b0..2d3a213bc 100644 --- a/apps/dashboard/src/app/login/_components/login-button.tsx +++ b/apps/dashboard/src/app/login/_components/login-button.tsx @@ -30,7 +30,7 @@ export function LoginButton({ variant="secondary" className={cn( "relative w-full", - isLastUsed && "border border-primary", + isLastUsed && "border-primary border", className, )} onClick={(e) => { @@ -43,7 +43,7 @@ export function LoginButton({ {isLastUsed ? ( Last used diff --git a/apps/dashboard/src/app/login/_components/magic-link-form.tsx b/apps/dashboard/src/app/login/_components/magic-link-form.tsx index 29388fe14..866d552e8 100644 --- a/apps/dashboard/src/app/login/_components/magic-link-form.tsx +++ b/apps/dashboard/src/app/login/_components/magic-link-form.tsx @@ -1,10 +1,10 @@ "use client"; -import { useFormStatus } from "react-dom"; - import { Input } from "@openstatus/ui/components/ui/input"; import { Label } from "@openstatus/ui/components/ui/label"; +import { useFormStatus } from "react-dom"; import { toast } from "sonner"; + import { signInWithResendAction } from "./actions"; import { LoginButton } from "./login-button"; diff --git a/apps/dashboard/src/app/login/page.tsx b/apps/dashboard/src/app/login/page.tsx index 3bc658e89..96a30e007 100644 --- a/apps/dashboard/src/app/login/page.tsx +++ b/apps/dashboard/src/app/login/page.tsx @@ -1,11 +1,12 @@ -import type { Metadata } from "next"; -import Link from "next/link"; - -import { signIn } from "@/lib/auth"; import { GitHubIcon } from "@openstatus/icons"; import { GoogleIcon } from "@openstatus/icons"; import { Separator } from "@openstatus/ui/components/ui/separator"; +import type { Metadata } from "next"; +import Link from "next/link"; import type { SearchParams } from "nuqs/server"; + +import { signIn } from "@/lib/auth"; + import { LoginButton } from "./_components/login-button"; import MagicLinkForm from "./_components/magic-link-form"; import { searchParamsCache } from "./search-params"; @@ -33,7 +34,7 @@ export default async function Page(props: {

Sign In

-

+

Get started now. No credit card required.

@@ -68,18 +69,18 @@ export default async function Page(props: {
-

+

By clicking continue, you agree to our{" "} Terms of Service {" "} and{" "} Privacy Policy diff --git a/apps/dashboard/src/app/not-found.tsx b/apps/dashboard/src/app/not-found.tsx index da114012e..306d7d229 100644 --- a/apps/dashboard/src/app/not-found.tsx +++ b/apps/dashboard/src/app/not-found.tsx @@ -1,21 +1,20 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { Button } from "@openstatus/ui/components/ui/button"; - export default function NotFound() { const router = useRouter(); return ( -

+
-
+
-

404 Page not found

-

+

404 Page not found

+

Oops, something went wrong.

diff --git a/apps/dashboard/src/app/onboarding/_steps/step-1.tsx b/apps/dashboard/src/app/onboarding/_steps/step-1.tsx index 31fa21aeb..03314132c 100644 --- a/apps/dashboard/src/app/onboarding/_steps/step-1.tsx +++ b/apps/dashboard/src/app/onboarding/_steps/step-1.tsx @@ -1,5 +1,10 @@ "use client"; +import { AVAILABLE_REGIONS } from "@openstatus/regions"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { ArrowRight } from "lucide-react"; +import { useMemo } from "react"; + import { CreateMonitorForm } from "@/components/forms/onboarding/create-monitor"; import { OnboardingActions, @@ -25,10 +30,7 @@ import { checkResultToResponseLog } from "@/components/onboarding/checks-table-a import type { useStreamChecks } from "@/components/onboarding/use-stream-checks"; import { exampleChecks } from "@/data/onboarding-checks"; import { cn } from "@/lib/utils"; -import { AVAILABLE_REGIONS } from "@openstatus/regions"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { ArrowRight } from "lucide-react"; -import { useMemo } from "react"; + import type { OnboardingMonitor } from "../client"; const TOTAL_REGIONS = AVAILABLE_REGIONS.length; diff --git a/apps/dashboard/src/app/onboarding/_steps/step-2.tsx b/apps/dashboard/src/app/onboarding/_steps/step-2.tsx index 79250f6fa..3187fdd37 100644 --- a/apps/dashboard/src/app/onboarding/_steps/step-2.tsx +++ b/apps/dashboard/src/app/onboarding/_steps/step-2.tsx @@ -1,5 +1,10 @@ "use client"; +import type { ThemeKey } from "@openstatus/theme-store"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { ArrowRight } from "lucide-react"; +import { useState } from "react"; + import { CreatePageForm, type FormValues as CreatePageFormValues, @@ -17,10 +22,7 @@ import { OnboardingStepper, } from "@/components/layout/onboarding-layout"; import { OnboardingStatusPagePreview } from "@/components/onboarding/status-page-preview"; -import type { ThemeKey } from "@openstatus/theme-store"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { ArrowRight } from "lucide-react"; -import { useState } from "react"; + import type { OnboardingPage } from "../client"; export function Step2({ @@ -118,10 +120,12 @@ export function Step2({

{link.name} diff --git a/apps/dashboard/src/app/onboarding/client.tsx b/apps/dashboard/src/app/onboarding/client.tsx index e648ffac2..cd8687bcb 100644 --- a/apps/dashboard/src/app/onboarding/client.tsx +++ b/apps/dashboard/src/app/onboarding/client.tsx @@ -1,12 +1,5 @@ "use client"; -import { - OnboardingLayout, - OnboardingShell, -} from "@/components/layout/onboarding-layout"; -import { useStreamChecks } from "@/components/onboarding/use-stream-checks"; -import { getCompanyDomainFromEmail } from "@/lib/onboarding/email-domain"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Activity, PanelTop, Rocket } from "lucide-react"; @@ -14,6 +7,15 @@ import { usePathname } from "next/navigation"; import { useQueryStates } from "nuqs"; import { generateSlug } from "random-word-slugs"; import { useEffect, useMemo, useRef } from "react"; + +import { + OnboardingLayout, + OnboardingShell, +} from "@/components/layout/onboarding-layout"; +import { useStreamChecks } from "@/components/onboarding/use-stream-checks"; +import { getCompanyDomainFromEmail } from "@/lib/onboarding/email-domain"; +import { useTRPC } from "@/lib/trpc/client"; + import { Step1 } from "./_steps/step-1"; import { Step2 } from "./_steps/step-2"; import { Step3 } from "./_steps/step-3"; diff --git a/apps/dashboard/src/app/onboarding/page.tsx b/apps/dashboard/src/app/onboarding/page.tsx index 371c3901a..2d30beb0c 100644 --- a/apps/dashboard/src/app/onboarding/page.tsx +++ b/apps/dashboard/src/app/onboarding/page.tsx @@ -1,7 +1,9 @@ -import { getQueryClient, trpc } from "@/lib/trpc/server"; import { cookies } from "next/headers"; import { redirect } from "next/navigation"; import type { SearchParams } from "nuqs"; + +import { getQueryClient, trpc } from "@/lib/trpc/server"; + import { Client } from "./client"; import { searchParamsCache } from "./search-params"; diff --git a/apps/dashboard/src/components/chart/chart-area-latency.tsx b/apps/dashboard/src/components/chart/chart-area-latency.tsx index 8ca92fd9e..98cb3d706 100644 --- a/apps/dashboard/src/components/chart/chart-area-latency.tsx +++ b/apps/dashboard/src/components/chart/chart-area-latency.tsx @@ -1,5 +1,15 @@ "use client"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, + ChartTooltipContent, +} from "@openstatus/ui/components/ui/chart"; +import { useQuery } from "@tanstack/react-query"; +import { endOfDay } from "date-fns"; import { Area, AreaChart, @@ -17,16 +27,7 @@ import { } from "@/data/metrics.client"; import { periodToFromDate } from "@/data/metrics.client"; import { useTRPC } from "@/lib/trpc/client"; -import { - type ChartConfig, - ChartContainer, - ChartLegend, - ChartLegendContent, - ChartTooltip, - ChartTooltipContent, -} from "@openstatus/ui/components/ui/chart"; -import { useQuery } from "@tanstack/react-query"; -import { endOfDay } from "date-fns"; + import { ChartTooltipNumber } from "./chart-tooltip-number"; const chartConfig = { diff --git a/apps/dashboard/src/components/chart/chart-area-timing-phases.tsx b/apps/dashboard/src/components/chart/chart-area-timing-phases.tsx index 1b039f383..3902e2682 100644 --- a/apps/dashboard/src/components/chart/chart-area-timing-phases.tsx +++ b/apps/dashboard/src/components/chart/chart-area-timing-phases.tsx @@ -1,5 +1,14 @@ "use client"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, + ChartTooltipContent, +} from "@openstatus/ui/components/ui/chart"; +import { useQuery } from "@tanstack/react-query"; import { Area, AreaChart, @@ -17,15 +26,7 @@ import { mapTimingPhases, } from "@/data/metrics.client"; import { useTRPC } from "@/lib/trpc/client"; -import { - type ChartConfig, - ChartContainer, - ChartLegend, - ChartLegendContent, - ChartTooltip, - ChartTooltipContent, -} from "@openstatus/ui/components/ui/chart"; -import { useQuery } from "@tanstack/react-query"; + import { ChartTooltipNumber, ChartTooltipNumberRaw, @@ -133,7 +134,7 @@ export function ChartAreaTimingPhases({ ); diff --git a/apps/dashboard/src/components/chart/chart-bar-uptime-light.tsx b/apps/dashboard/src/components/chart/chart-bar-uptime-light.tsx index 7d432a6b6..7f8493fc5 100644 --- a/apps/dashboard/src/components/chart/chart-bar-uptime-light.tsx +++ b/apps/dashboard/src/components/chart/chart-bar-uptime-light.tsx @@ -1,10 +1,5 @@ "use client"; -import { Skeleton } from "@openstatus/ui/components/ui/skeleton"; -import { Bar, BarChart, XAxis } from "recharts"; - -import { mapUptime } from "@/data/metrics.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { Region } from "@openstatus/db/src/schema/constants"; import { type ChartConfig, @@ -12,7 +7,12 @@ import { ChartTooltip, ChartTooltipContent, } from "@openstatus/ui/components/ui/chart"; +import { Skeleton } from "@openstatus/ui/components/ui/skeleton"; import { useQuery } from "@tanstack/react-query"; +import { Bar, BarChart, XAxis } from "recharts"; + +import { mapUptime } from "@/data/metrics.client"; +import { useTRPC } from "@/lib/trpc/client"; // import { startOfDay, subDays } from "date-fns"; const chartConfig = { @@ -53,7 +53,7 @@ export function ChartBarUptimeLight({ ); if (isLoading) { - return ; + return ; } const refinedUptime = uptime ? mapUptime(uptime) : []; diff --git a/apps/dashboard/src/components/chart/chart-bar-uptime.tsx b/apps/dashboard/src/components/chart/chart-bar-uptime.tsx index cc421991d..f408334ae 100644 --- a/apps/dashboard/src/components/chart/chart-bar-uptime.tsx +++ b/apps/dashboard/src/components/chart/chart-bar-uptime.tsx @@ -1,14 +1,5 @@ "use client"; -import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts"; - -import { - type PERIODS, - mapUptime, - periodToFromDate, - periodToInterval, -} from "@/data/metrics.client"; -import { useTRPC } from "@/lib/trpc/client"; import { type ChartConfig, ChartContainer, @@ -20,6 +11,15 @@ import { import { useIsMobile } from "@openstatus/ui/hooks/use-mobile"; import { useQuery } from "@tanstack/react-query"; import { endOfDay } from "date-fns"; +import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +import { + type PERIODS, + mapUptime, + periodToFromDate, + periodToInterval, +} from "@/data/metrics.client"; +import { useTRPC } from "@/lib/trpc/client"; const chartConfig = { ok: { diff --git a/apps/dashboard/src/components/chart/chart-line-region.tsx b/apps/dashboard/src/components/chart/chart-line-region.tsx index fd52ced86..f8ab945db 100644 --- a/apps/dashboard/src/components/chart/chart-line-region.tsx +++ b/apps/dashboard/src/components/chart/chart-line-region.tsx @@ -1,7 +1,5 @@ "use client"; -import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; - import { type ChartConfig, ChartContainer, @@ -9,6 +7,8 @@ import { ChartTooltipContent, } from "@openstatus/ui/components/ui/chart"; import { cn } from "@openstatus/ui/lib/utils"; +import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; + import { ChartTooltipNumber } from "./chart-tooltip-number"; const chartConfig = { diff --git a/apps/dashboard/src/components/chart/chart-line-regions.tsx b/apps/dashboard/src/components/chart/chart-line-regions.tsx index 71e19f2ae..40d97b184 100644 --- a/apps/dashboard/src/components/chart/chart-line-regions.tsx +++ b/apps/dashboard/src/components/chart/chart-line-regions.tsx @@ -1,9 +1,5 @@ "use client"; -import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; - -import { getRegionColor } from "@/data/regions"; -import { cn } from "@/lib/utils"; import type { PrivateLocation } from "@openstatus/db/src/schema"; import { monitorRegions } from "@openstatus/db/src/schema/constants"; import { getRegionInfo } from "@openstatus/regions"; @@ -16,6 +12,11 @@ import { ChartTooltipContent, } from "@openstatus/ui/components/ui/chart"; import { useIsMobile } from "@openstatus/ui/hooks/use-mobile"; +import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; + +import { getRegionColor } from "@/data/regions"; +import { cn } from "@/lib/utils"; + import { ChartTooltipNumber } from "./chart-tooltip-number"; function getChartConfig(privateLocations?: PrivateLocation[]) { diff --git a/apps/dashboard/src/components/chart/chart-tooltip-number.tsx b/apps/dashboard/src/components/chart/chart-tooltip-number.tsx index 8ee2db5da..998315d5a 100644 --- a/apps/dashboard/src/components/chart/chart-tooltip-number.tsx +++ b/apps/dashboard/src/components/chart/chart-tooltip-number.tsx @@ -50,9 +50,9 @@ export function ChartTooltipNumberRaw({ style={style} /> {label} -
+
{value} - ms + ms
); diff --git a/apps/dashboard/src/components/chat/chat-conversation.tsx b/apps/dashboard/src/components/chat/chat-conversation.tsx index 0314be216..03dc644e1 100644 --- a/apps/dashboard/src/components/chat/chat-conversation.tsx +++ b/apps/dashboard/src/components/chat/chat-conversation.tsx @@ -12,7 +12,6 @@ type Props = { export function ChatConversation({ messages, status }: Props) { // No inner overflow container — pin the window itself. - // biome-ignore lint/correctness/useExhaustiveDependencies: deps are change triggers, not reads useEffect(() => { if (typeof window === "undefined") return; window.scrollTo({ top: document.body.scrollHeight }); diff --git a/apps/dashboard/src/components/chat/chat-error-banner.tsx b/apps/dashboard/src/components/chat/chat-error-banner.tsx index b265fe56b..fdf8f5e9d 100644 --- a/apps/dashboard/src/components/chat/chat-error-banner.tsx +++ b/apps/dashboard/src/components/chat/chat-error-banner.tsx @@ -8,7 +8,7 @@ export function ChatErrorBanner({ error }: Props) { const message = error.message ?? ""; const isRateLimit = /Rate limit/i.test(message); return ( -
+
{isRateLimit ? `You've hit the daily message cap${formatResetSuffix(message)}.` : "The assistant encountered an error. Try again."} diff --git a/apps/dashboard/src/components/chat/chat-error-boundary.tsx b/apps/dashboard/src/components/chat/chat-error-boundary.tsx index d1d21eb1d..c0cb0e5bc 100644 --- a/apps/dashboard/src/components/chat/chat-error-boundary.tsx +++ b/apps/dashboard/src/components/chat/chat-error-boundary.tsx @@ -25,7 +25,7 @@ export class ChatErrorBoundary extends Component { if (this.state.error) { return (
-
+
The conversation failed to render. Reload to recover.
diff --git a/apps/dashboard/src/components/chat/chat-history.tsx b/apps/dashboard/src/components/chat/chat-history.tsx index 313e32076..01b0c8d30 100644 --- a/apps/dashboard/src/components/chat/chat-history.tsx +++ b/apps/dashboard/src/components/chat/chat-history.tsx @@ -1,10 +1,10 @@ "use client"; -import { Link } from "@/components/common/link"; import { useSidebar } from "@openstatus/ui/components/ui/sidebar"; import { useQuery } from "@tanstack/react-query"; import { formatDistanceToNow } from "date-fns"; +import { Link } from "@/components/common/link"; import { useTRPC } from "@/lib/trpc/client"; const MAX_VISIBLE = 5; @@ -22,7 +22,7 @@ export function ChatHistory() { return (
- + Recent
@@ -31,10 +31,10 @@ export function ChatHistory() {
  • {s.title} - + {formatDistanceToNow(new Date(s.updatedAt), { addSuffix: true, })} @@ -47,7 +47,7 @@ export function ChatHistory() { diff --git a/apps/dashboard/src/components/chat/chat-message.tsx b/apps/dashboard/src/components/chat/chat-message.tsx index 9ab2b5ad4..f207101db 100644 --- a/apps/dashboard/src/components/chat/chat-message.tsx +++ b/apps/dashboard/src/components/chat/chat-message.tsx @@ -41,7 +41,7 @@ export function MessageContent({
    ) => ( ), pre: (props: HTMLAttributes) => (
           ),
    @@ -107,7 +107,7 @@ export function MessageMarkdown({ children }: { children: string }) {
             "[&_li]:ml-4 [&_li]:list-disc [&_ol]:list-decimal",
             "[&_strong]:font-semibold",
             "[&_table]:my-2 [&_table]:w-full [&_table]:border-collapse [&_table]:text-xs",
    -        "[&_th]:border [&_th]:bg-muted/50 [&_th]:px-2 [&_th]:py-1 [&_th]:text-left [&_th]:font-medium",
    +        "[&_th]:bg-muted/50 [&_th]:border [&_th]:px-2 [&_th]:py-1 [&_th]:text-left [&_th]:font-medium",
             "[&_td]:border [&_td]:px-2 [&_td]:py-1",
           )}
         >
    diff --git a/apps/dashboard/src/components/chat/chat-prompt-input.tsx b/apps/dashboard/src/components/chat/chat-prompt-input.tsx
    index 05c3d79dd..967a7c9ff 100644
    --- a/apps/dashboard/src/components/chat/chat-prompt-input.tsx
    +++ b/apps/dashboard/src/components/chat/chat-prompt-input.tsx
    @@ -59,7 +59,7 @@ export function ChatPromptInput({ onSubmit, onStop, status }: Props) {
       }, [isGenerating, onStop]);
     
       return (
    -    
    +
    @@ -95,7 +95,7 @@ export function ChatPromptInput({ onSubmit, onStop, status }: Props) {
    -

    +

    Powered by Claude. AI responses may contain errors, double-check results.

    diff --git a/apps/dashboard/src/components/chat/chat-suggestions.tsx b/apps/dashboard/src/components/chat/chat-suggestions.tsx index 55b62adc2..c8fb6d3ec 100644 --- a/apps/dashboard/src/components/chat/chat-suggestions.tsx +++ b/apps/dashboard/src/components/chat/chat-suggestions.tsx @@ -1,3 +1,4 @@ +import { Badge } from "@openstatus/ui/components/ui/badge"; import { Button } from "@openstatus/ui/components/ui/button"; import { @@ -6,7 +7,6 @@ import { SectionHeader, SectionTitle, } from "@/components/content/section"; -import { Badge } from "@openstatus/ui/components/ui/badge"; const SUGGESTIONS = [ "List all my monitors", diff --git a/apps/dashboard/src/components/chat/chat-tool-part.tsx b/apps/dashboard/src/components/chat/chat-tool-part.tsx index db8b5b756..c7efc34de 100644 --- a/apps/dashboard/src/components/chat/chat-tool-part.tsx +++ b/apps/dashboard/src/components/chat/chat-tool-part.tsx @@ -88,7 +88,7 @@ function ApprovalCard({ ref={cardRef} tabIndex={-1} onKeyDown={onKeyDown} - className="not-prose w-full overflow-hidden rounded-xl border bg-background outline-none" + className="not-prose bg-background w-full overflow-hidden rounded-xl border outline-none" >
    @@ -98,16 +98,16 @@ function ApprovalCard({ {draft ? ( ) : ( -
    +          
                 {JSON.stringify(input, null, 2)}
               
    )}
    -
    +
    - Esc{" "} + Esc{" "} to cancel ·{" "} - ⌘ ↵{" "} + ⌘ ↵{" "} to apply
    @@ -170,7 +170,7 @@ function ToolDisclosure({ > {toolName} - + {summary ? `· ${summary}` : null} {rich !== undefined ? ( @@ -207,7 +207,7 @@ function ToolDisclosure({ ) : null} @@ -234,12 +234,12 @@ function ToolDisclosure({ )} {part.state === "output-error" && part.errorText ? ( -
    +
    {part.errorText}
    ) : null} {state === "output-denied" && part.approval?.reason ? ( -
    +
    {part.approval.reason}
    ) : null} @@ -252,10 +252,10 @@ function ToolDisclosure({ function ToolPanel({ label, body }: { label: string; body: unknown }) { return (
    -

    +

    {label}

    -
    +      
             {typeof body === "string" ? body : JSON.stringify(body, null, 2)}
           
    diff --git a/apps/dashboard/src/components/chat/tool-renderers/details-table.tsx b/apps/dashboard/src/components/chat/tool-renderers/details-table.tsx index 354d6192d..4fede7e36 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/details-table.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/details-table.tsx @@ -26,13 +26,13 @@ export function DetailsTable({ sections, empty }: DetailsTableData) { const total = sections.reduce((acc, s) => acc + s.rows.length, 0); if (total === 0) { return ( -
    +
    {empty ?? "No details to show."}
    ); } return ( -
    +
    {sections.map((section, sIdx) => ( @@ -47,10 +47,10 @@ export function DetailsTable({ sections, empty }: DetailsTableData) { key={`${sIdx}-${row.label}`} className="hover:bg-transparent" > - + {row.label} - + {row.value} diff --git a/apps/dashboard/src/components/chat/tool-renderers/get-response-log.tsx b/apps/dashboard/src/components/chat/tool-renderers/get-response-log.tsx index 68ad5a15a..faef295b7 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/get-response-log.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/get-response-log.tsx @@ -56,7 +56,7 @@ export function getResponseLogDetails( { label: "Headers", value: ( -
    +            
                   {JSON.stringify(output.headers, null, 2)}
                 
    ), @@ -106,7 +106,7 @@ function timingRows(timing: Timing, latency: number): DetailsRow[] { %
    - {value} ms + {value} ms
    ), actor: ( ), createdAt: ( diff --git a/apps/dashboard/src/components/chat/tool-renderers/list-monitors.tsx b/apps/dashboard/src/components/chat/tool-renderers/list-monitors.tsx index ca3da48cc..41e42e3d0 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/list-monitors.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/list-monitors.tsx @@ -34,19 +34,19 @@ export function listMonitorsTable( jobType: ( ), periodicity: ( ), regions: ( ), active: , diff --git a/apps/dashboard/src/components/chat/tool-renderers/list-notifications.tsx b/apps/dashboard/src/components/chat/tool-renderers/list-notifications.tsx index 5139c7320..358eacf01 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/list-notifications.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/list-notifications.tsx @@ -27,7 +27,7 @@ export function listNotificationsTable( provider: ( ), monitors: ( @@ -37,7 +37,7 @@ export function listNotificationsTable( ? "none" : `${n.monitorIds.length} (${n.monitorIds.join(", ")})` } - className="font-mono text-muted-foreground" + className="text-muted-foreground font-mono" /> ), id: , diff --git a/apps/dashboard/src/components/chat/tool-renderers/list-page-components.tsx b/apps/dashboard/src/components/chat/tool-renderers/list-page-components.tsx index cfcd8fcb2..09dba5e84 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/list-page-components.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/list-page-components.tsx @@ -33,7 +33,7 @@ export function listPageComponentsTable( type: ( ), page: , diff --git a/apps/dashboard/src/components/chat/tool-renderers/list-response-logs.tsx b/apps/dashboard/src/components/chat/tool-renderers/list-response-logs.tsx index 10e8d8fa9..bbdade044 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/list-response-logs.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/list-response-logs.tsx @@ -52,7 +52,7 @@ export function listResponseLogsTable( timestamp: ( ), region: , @@ -74,7 +74,7 @@ export function listResponseLogsTable( id: ( ), }, diff --git a/apps/dashboard/src/components/chat/tool-renderers/list-status-pages.tsx b/apps/dashboard/src/components/chat/tool-renderers/list-status-pages.tsx index 31cb04489..b573c70ed 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/list-status-pages.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/list-status-pages.tsx @@ -31,7 +31,7 @@ export function listStatusPagesTable( slug: ( ), id: , diff --git a/apps/dashboard/src/components/chat/tool-renderers/result-table.tsx b/apps/dashboard/src/components/chat/tool-renderers/result-table.tsx index a871100b8..f785f1402 100644 --- a/apps/dashboard/src/components/chat/tool-renderers/result-table.tsx +++ b/apps/dashboard/src/components/chat/tool-renderers/result-table.tsx @@ -42,20 +42,20 @@ export function ResultTable({ }: ResultTableData) { if (rows.length === 0) { return ( -
    +
    {empty}
    ); } return ( -
    +
    {columns.map((col) => ( {col.header} diff --git a/apps/dashboard/src/components/common/changes-table.tsx b/apps/dashboard/src/components/common/changes-table.tsx index 804366342..25f8bd806 100644 --- a/apps/dashboard/src/components/common/changes-table.tsx +++ b/apps/dashboard/src/components/common/changes-table.tsx @@ -21,7 +21,7 @@ export type ChangeRow = { export function ChangesTable({ changes }: { changes: ChangeRow[] }) { if (changes.length === 0) return null; return ( -
    +
    {changes.map((change, idx) => (
    0 && "border-t", )} > -
    +
    {change.field}
    @@ -60,10 +60,10 @@ function DiffLine({ className="group flex items-start gap-2 px-3 py-2 font-mono has-[+[data-kind=added]]:pb-0" data-kind={kind} > - + {sign} - + {formatValue(value)}
    diff --git a/apps/dashboard/src/components/common/code.tsx b/apps/dashboard/src/components/common/code.tsx index 593a4d4fc..4cea2f3ab 100644 --- a/apps/dashboard/src/components/common/code.tsx +++ b/apps/dashboard/src/components/common/code.tsx @@ -16,7 +16,7 @@ export function Code({
    -              
    +
    {key}
    -
    +
    {`${new Intl.NumberFormat("en-US", { maximumFractionDigits: 2, }).format((value / (latency || 1)) * 100)}%`} diff --git a/apps/dashboard/src/components/common/icon-cloud-provider.tsx b/apps/dashboard/src/components/common/icon-cloud-provider.tsx index 4a88c2c98..a1357480e 100644 --- a/apps/dashboard/src/components/common/icon-cloud-provider.tsx +++ b/apps/dashboard/src/components/common/icon-cloud-provider.tsx @@ -34,7 +34,7 @@ export function IconCloudProviderTooltip( diff --git a/apps/dashboard/src/components/common/input-with-addons.tsx b/apps/dashboard/src/components/common/input-with-addons.tsx index b77aa263a..5719a5806 100644 --- a/apps/dashboard/src/components/common/input-with-addons.tsx +++ b/apps/dashboard/src/components/common/input-with-addons.tsx @@ -1,10 +1,8 @@ -import * as React from "react"; - import { Input } from "@openstatus/ui/components/ui/input"; import { cn } from "@openstatus/ui/lib/utils"; +import * as React from "react"; -export interface InputWithAddonsProps - extends React.InputHTMLAttributes { +export interface InputWithAddonsProps extends React.InputHTMLAttributes { leading?: React.ReactNode; trailing?: React.ReactNode; } @@ -20,7 +18,7 @@ const InputWithAddons = React.forwardRef< return (
    {leading ? ( - + {leading} ) : null} @@ -35,7 +33,7 @@ const InputWithAddons = React.forwardRef< {...props} /> {trailing ? ( - + {trailing} ) : null} diff --git a/apps/dashboard/src/components/common/kbd.tsx b/apps/dashboard/src/components/common/kbd.tsx index 92724c885..4aafb2697 100644 --- a/apps/dashboard/src/components/common/kbd.tsx +++ b/apps/dashboard/src/components/common/kbd.tsx @@ -1,9 +1,10 @@ -import { cn } from "@/lib/utils"; import { type VariantProps, cva } from "class-variance-authority"; import type * as React from "react"; +import { cn } from "@/lib/utils"; + const kbdVariants = cva( - "-me-1 ms-2 inline-flex h-5 max-h-full items-center rounded border px-1 font-[inherit] font-medium text-[0.625rem]", + "ms-2 -me-1 inline-flex h-5 max-h-full items-center rounded border px-1 font-[inherit] text-[0.625rem] font-medium", { variants: { variant: { diff --git a/apps/dashboard/src/components/common/link.tsx b/apps/dashboard/src/components/common/link.tsx index b36aa2854..6feb80f40 100644 --- a/apps/dashboard/src/components/common/link.tsx +++ b/apps/dashboard/src/components/common/link.tsx @@ -1,6 +1,7 @@ -import { cn } from "@/lib/utils"; import NextLink from "next/link"; +import { cn } from "@/lib/utils"; + // TODO: we could add cva variants for the link export function Link({ @@ -15,7 +16,7 @@ export function Link({ return ( diff --git a/apps/dashboard/src/components/common/note.tsx b/apps/dashboard/src/components/common/note.tsx index 07f6fd62e..a00947e11 100644 --- a/apps/dashboard/src/components/common/note.tsx +++ b/apps/dashboard/src/components/common/note.tsx @@ -3,7 +3,7 @@ import { cn } from "@openstatus/ui/lib/utils"; import { type VariantProps, cva } from "class-variance-authority"; const noteVariants = cva( - "flex items-center gap-2 rounded-xl border [&>svg]:text-current [&>svg]:shrink-0", + "flex items-center gap-2 rounded-xl border [&>svg]:shrink-0 [&>svg]:text-current", { variants: { variant: { diff --git a/apps/dashboard/src/components/common/pill.tsx b/apps/dashboard/src/components/common/pill.tsx index b9f8a3bfe..5492ecf8c 100644 --- a/apps/dashboard/src/components/common/pill.tsx +++ b/apps/dashboard/src/components/common/pill.tsx @@ -19,13 +19,13 @@ export function Pill({ label, value, className, variant = "default" }: Props) { return (
    svg]:pointer-events-none [&>svg]:size-3", + "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3", className, )} >
    diff --git a/apps/dashboard/src/components/common/wheel-picker.tsx b/apps/dashboard/src/components/common/wheel-picker.tsx index a61eb0282..681234d86 100644 --- a/apps/dashboard/src/components/common/wheel-picker.tsx +++ b/apps/dashboard/src/components/common/wheel-picker.tsx @@ -1,8 +1,9 @@ "use client"; -import { cn } from "@/lib/utils"; import * as React from "react"; +import { cn } from "@/lib/utils"; + // --------------------------------------------------------------------------------------------------------------------- // Context ------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------- @@ -148,7 +149,7 @@ const WheelPickerSelect = React.forwardRef< aria-activedescendant={`wheel-option-${currentIndex}`} tabIndex={0} className={cn( - "relative h-6 w-full rounded-md border border-transparent text-left focus:border-ring focus:outline-none focus:ring-2 focus:ring-ring/50", + "focus:border-ring focus:ring-ring/50 relative h-6 w-full rounded-md border border-transparent text-left focus:ring-2 focus:outline-none", className, )} onKeyDown={handleKeyDown} @@ -208,7 +209,7 @@ const WheelPickerOptions = React.forwardRef< role="option" aria-selected={isSelected} className={cn( - "absolute inset-0 flex cursor-pointer select-none items-center justify-start transition-transform duration-500 ease-out [backface-visibility:hidden]", + "absolute inset-0 flex cursor-pointer items-center justify-start transition-transform duration-500 ease-out select-none [backface-visibility:hidden]", )} style={{ transform: `rotateX(${angle}rad) translateZ(${radius}px)`, @@ -248,8 +249,7 @@ WheelPickerOptions.displayName = "WheelPickerOptions"; type PlaceholderPosition = "first" | "last"; -export interface WheelPickerEmptyProps - extends React.HTMLAttributes { +export interface WheelPickerEmptyProps extends React.HTMLAttributes { position: PlaceholderPosition; } diff --git a/apps/dashboard/src/components/content/billing-addons.tsx b/apps/dashboard/src/components/content/billing-addons.tsx index ed64df277..848994e21 100644 --- a/apps/dashboard/src/components/content/billing-addons.tsx +++ b/apps/dashboard/src/components/content/billing-addons.tsx @@ -1,3 +1,7 @@ +import type { RouterOutputs } from "@openstatus/api"; +import { allPlans } from "@openstatus/db/src/schema/plan/config"; +import type { Addons } from "@openstatus/db/src/schema/plan/schema"; +import { getAddonPriceConfig } from "@openstatus/db/src/schema/plan/utils"; import { AlertDialog, AlertDialogAction, @@ -10,22 +14,18 @@ import { AlertDialogTrigger, } from "@openstatus/ui/components/ui/alert-dialog"; import { Button } from "@openstatus/ui/components/ui/button"; -import { Label } from "@openstatus/ui/components/ui/label"; -import { useCookieState } from "@openstatus/ui/hooks/use-cookie-state"; - -import { useTRPC } from "@/lib/trpc/client"; -import type { RouterOutputs } from "@openstatus/api"; -import { allPlans } from "@openstatus/db/src/schema/plan/config"; -import type { Addons } from "@openstatus/db/src/schema/plan/schema"; -import { getAddonPriceConfig } from "@openstatus/db/src/schema/plan/utils"; import { ButtonGroup } from "@openstatus/ui/components/ui/button-group"; import { Input } from "@openstatus/ui/components/ui/input"; +import { Label } from "@openstatus/ui/components/ui/label"; +import { useCookieState } from "@openstatus/ui/hooks/use-cookie-state"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { isTRPCClientError } from "@trpc/client"; import { Check, MinusIcon, PlusIcon } from "lucide-react"; import { useEffect, useState, useTransition } from "react"; import { toast } from "sonner"; +import { useTRPC } from "@/lib/trpc/client"; + type Workspace = RouterOutputs["workspace"]["get"]; interface BillingAddonsProps { @@ -123,15 +123,15 @@ export function BillingAddons({
    {description}
    - + {formatPrice(price)} {isQuantity ? "/mo./each" : "/mo."} {hasAddon && !isQuantity ? ( - + ) : null} {hasAddon && isQuantity ? ( - +{defaultValue} + +{defaultValue} ) : null}
    diff --git a/apps/dashboard/src/components/content/billing-overlay.tsx b/apps/dashboard/src/components/content/billing-overlay.tsx index dd5fa365f..7303642df 100644 --- a/apps/dashboard/src/components/content/billing-overlay.tsx +++ b/apps/dashboard/src/components/content/billing-overlay.tsx @@ -21,7 +21,7 @@ export function BillingOverlay({ return (
    -
    +
    {label}
    diff --git a/apps/dashboard/src/components/content/block-wrapper.tsx b/apps/dashboard/src/components/content/block-wrapper.tsx index 2782fdde9..dde345cdc 100644 --- a/apps/dashboard/src/components/content/block-wrapper.tsx +++ b/apps/dashboard/src/components/content/block-wrapper.tsx @@ -1,7 +1,5 @@ "use client"; -import * as React from "react"; - import { Button } from "@openstatus/ui/components/ui/button"; import { Collapsible, @@ -9,6 +7,7 @@ import { CollapsibleTrigger, } from "@openstatus/ui/components/ui/collapsible"; import { cn } from "@openstatus/ui/lib/utils"; +import * as React from "react"; export function BlockWrapper({ className, @@ -44,7 +43,7 @@ export function BlockWrapper({ {!isOpened ? (
    diff --git a/apps/dashboard/src/components/content/empty-state.tsx b/apps/dashboard/src/components/content/empty-state.tsx index 38bb2a838..76710b56e 100644 --- a/apps/dashboard/src/components/content/empty-state.tsx +++ b/apps/dashboard/src/components/content/empty-state.tsx @@ -8,7 +8,7 @@ export function EmptyStateContainer({ return (
    ) { return (

    {children} diff --git a/apps/dashboard/src/components/content/section.tsx b/apps/dashboard/src/components/content/section.tsx index 20b1bf157..96530c592 100644 --- a/apps/dashboard/src/components/content/section.tsx +++ b/apps/dashboard/src/components/content/section.tsx @@ -66,7 +66,7 @@ export function SectionTitle({ ...props }: React.ComponentProps<"p">) { return ( -

    +

    {children}

    ); @@ -105,7 +105,7 @@ export function SectionGroupTitle({ ...props }: React.ComponentProps<"p">) { return ( -

    +

    {children}

    ); diff --git a/apps/dashboard/src/components/controls-search/command-region.tsx b/apps/dashboard/src/components/controls-search/command-region.tsx index 36d7bdab6..8a6fdebc2 100644 --- a/apps/dashboard/src/components/controls-search/command-region.tsx +++ b/apps/dashboard/src/components/controls-search/command-region.tsx @@ -1,14 +1,5 @@ "use client"; -import { IconCloudProvider } from "@/components/common/icon-cloud-provider"; -import { Link } from "@/components/common/link"; -import { - BillingOverlay, - BillingOverlayButton, - BillingOverlayDescription, -} from "@/components/content/billing-overlay"; -import type { REGIONS } from "@/data/metrics.client"; -import { useTRPC } from "@/lib/trpc/client"; import { formatRegionCode, groupByContinent } from "@openstatus/regions"; import { Button } from "@openstatus/ui/components/ui/button"; import { @@ -30,6 +21,16 @@ import { useQuery } from "@tanstack/react-query"; import { Check, Globe, Lock } from "lucide-react"; import { parseAsArrayOf, parseAsString, useQueryState } from "nuqs"; +import { IconCloudProvider } from "@/components/common/icon-cloud-provider"; +import { Link } from "@/components/common/link"; +import { + BillingOverlay, + BillingOverlayButton, + BillingOverlayDescription, +} from "@/components/content/billing-overlay"; +import type { REGIONS } from "@/data/metrics.client"; +import { useTRPC } from "@/lib/trpc/client"; + export function CommandRegion({ regions, privateLocations, @@ -131,7 +132,7 @@ export function CommandRegion({ {formatRegionCode(region.code)} - + {region.location} - + Resolution {options.map((item) => ( diff --git a/apps/dashboard/src/components/controls-search/dropdown-percentile.tsx b/apps/dashboard/src/components/controls-search/dropdown-percentile.tsx index 1c26d72b5..38bac274b 100644 --- a/apps/dashboard/src/components/controls-search/dropdown-percentile.tsx +++ b/apps/dashboard/src/components/controls-search/dropdown-percentile.tsx @@ -1,6 +1,5 @@ "use client"; -import { PERCENTILES } from "@/data/metrics.client"; import { Button } from "@openstatus/ui/components/ui/button"; import { DropdownMenu, @@ -14,6 +13,8 @@ import { cn } from "@openstatus/ui/lib/utils"; import { Check } from "lucide-react"; import { parseAsStringLiteral, useQueryState } from "nuqs"; +import { PERCENTILES } from "@/data/metrics.client"; + const parsePercentile = parseAsStringLiteral(PERCENTILES).withDefault("p50"); export function DropdownPercentile() { @@ -31,7 +32,7 @@ export function DropdownPercentile() { - + Percentile {PERCENTILES.map((item) => ( diff --git a/apps/dashboard/src/components/controls-search/dropdown-period.tsx b/apps/dashboard/src/components/controls-search/dropdown-period.tsx index a14e2d6c8..88e0904dd 100644 --- a/apps/dashboard/src/components/controls-search/dropdown-period.tsx +++ b/apps/dashboard/src/components/controls-search/dropdown-period.tsx @@ -1,8 +1,5 @@ "use client"; -import { UpgradeDialog } from "@/components/dialogs/upgrade"; -import { PERIODS, isPaidPeriod } from "@/data/metrics.client"; -import { useTRPC } from "@/lib/trpc/client"; import { Button } from "@openstatus/ui/components/ui/button"; import { DropdownMenu, @@ -17,6 +14,10 @@ import { Check, Lock } from "lucide-react"; import { parseAsStringLiteral, useQueryState } from "nuqs"; import { useState } from "react"; +import { UpgradeDialog } from "@/components/dialogs/upgrade"; +import { PERIODS, isPaidPeriod } from "@/data/metrics.client"; +import { useTRPC } from "@/lib/trpc/client"; + // TODO: where to move it? export const PERIOD_VALUES = [ { @@ -60,7 +61,7 @@ export function DropdownPeriod() { - + Period {PERIOD_VALUES.map(({ value, label }) => { diff --git a/apps/dashboard/src/components/controls-search/dropdown-status.tsx b/apps/dashboard/src/components/controls-search/dropdown-status.tsx index 3af916ec4..9b9dc62c4 100644 --- a/apps/dashboard/src/components/controls-search/dropdown-status.tsx +++ b/apps/dashboard/src/components/controls-search/dropdown-status.tsx @@ -1,6 +1,5 @@ "use client"; -import { STATUS } from "@/data/metrics.client"; import { Button } from "@openstatus/ui/components/ui/button"; import { DropdownMenu, @@ -14,6 +13,8 @@ import { cn } from "@openstatus/ui/lib/utils"; import { Check } from "lucide-react"; import { parseAsStringLiteral, useQueryState } from "nuqs"; +import { STATUS } from "@/data/metrics.client"; + const parseStatus = parseAsStringLiteral(STATUS); export function DropdownStatus() { @@ -28,7 +29,7 @@ export function DropdownStatus() { - + Request Status {STATUS.map((item) => ( diff --git a/apps/dashboard/src/components/controls-search/dropdown-trigger.tsx b/apps/dashboard/src/components/controls-search/dropdown-trigger.tsx index fe22efaf2..707e3abe6 100644 --- a/apps/dashboard/src/components/controls-search/dropdown-trigger.tsx +++ b/apps/dashboard/src/components/controls-search/dropdown-trigger.tsx @@ -1,6 +1,5 @@ "use client"; -import { TRIGGER } from "@/data/metrics.client"; import { Button } from "@openstatus/ui/components/ui/button"; import { DropdownMenu, @@ -14,6 +13,8 @@ import { cn } from "@openstatus/ui/lib/utils"; import { Check } from "lucide-react"; import { parseAsStringLiteral, useQueryState } from "nuqs"; +import { TRIGGER } from "@/data/metrics.client"; + const parseTrigger = parseAsStringLiteral(TRIGGER); export function DropdownTrigger() { @@ -28,7 +29,7 @@ export function DropdownTrigger() { - + Trigger {TRIGGER.map((item) => ( diff --git a/apps/dashboard/src/components/controls-search/popover-date.tsx b/apps/dashboard/src/components/controls-search/popover-date.tsx index 75774c898..27bafc4cc 100644 --- a/apps/dashboard/src/components/controls-search/popover-date.tsx +++ b/apps/dashboard/src/components/controls-search/popover-date.tsx @@ -1,5 +1,3 @@ -import { DatePicker } from "@/components/date-picker"; -import { formatDateRange } from "@/lib/formatter"; import { Button } from "@openstatus/ui/components/ui/button"; import { Popover, @@ -11,6 +9,9 @@ import { parseAsIsoDateTime, useQueryState } from "nuqs"; import { useEffect, useMemo, useRef, useState } from "react"; import type { DateRange } from "react-day-picker"; +import { DatePicker } from "@/components/date-picker"; +import { formatDateRange } from "@/lib/formatter"; + export function PopoverDate() { const [open, setOpen] = useState(false); const today = useRef(new Date()); @@ -24,7 +25,6 @@ export function PopoverDate() { ); const [range, setRange] = useState({ from, to }); - // biome-ignore lint/correctness/useExhaustiveDependencies: const presets = useMemo( () => [ { @@ -102,7 +102,6 @@ export function PopoverDate() { ); }); - // biome-ignore lint/correctness/useExhaustiveDependencies: useEffect(() => { if (!open) { setFrom(range.from ?? null); diff --git a/apps/dashboard/src/components/data-table/audit-logs-workspace/columns.tsx b/apps/dashboard/src/components/data-table/audit-logs-workspace/columns.tsx index 6abb2ba36..6bf77ee02 100644 --- a/apps/dashboard/src/components/data-table/audit-logs-workspace/columns.tsx +++ b/apps/dashboard/src/components/data-table/audit-logs-workspace/columns.tsx @@ -1,6 +1,5 @@ "use client"; -import { cn } from "@/lib/utils"; import type { RouterOutputs } from "@openstatus/api"; import { ModelContextProtocolIcon, SlackIcon } from "@openstatus/icons"; import { @@ -11,6 +10,9 @@ import { import { Badge } from "@openstatus/ui/components/ui/badge"; import type { ColumnDef } from "@tanstack/react-table"; import { KeyIcon, MailIcon, ServerIcon } from "lucide-react"; + +import { cn } from "@/lib/utils"; + import { TableCellDate } from "../table-cell-date"; type AuditLog = RouterOutputs["auditLog"]["list"]["items"][number]; @@ -52,8 +54,8 @@ export const columns: ColumnDef[] = [ if (type === "apiKey") { return (
    -
    - +
    +
    API Key
    @@ -62,8 +64,8 @@ export const columns: ColumnDef[] = [ if (type === "slack") { return (
    -
    - +
    +
    Slack
    @@ -72,8 +74,8 @@ export const columns: ColumnDef[] = [ if (type === "mcp") { return (
    -
    - +
    +
    MCP Server
    @@ -82,8 +84,8 @@ export const columns: ColumnDef[] = [ if (type === "system") { return (
    -
    - +
    +
    System
    @@ -92,8 +94,8 @@ export const columns: ColumnDef[] = [ if (type === "subscriber") { return (
    -
    - +
    +
    Subscriber
    @@ -117,7 +119,7 @@ export const columns: ColumnDef[] = [ {user?.name?.slice(0, 2)} - + {user.name ?? user.email ?? "—"}
    diff --git a/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-row-details.tsx b/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-row-details.tsx index be22dd484..83ca297fa 100644 --- a/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-row-details.tsx +++ b/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-row-details.tsx @@ -1,11 +1,12 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; + import { ChangesTable, buildAuditLogChangeRows, } from "@/components/common/changes-table"; import { CopyRow } from "@/components/common/copy-row"; -import type { RouterOutputs } from "@openstatus/api"; type AuditLog = RouterOutputs["auditLog"]["list"]["items"][number]; @@ -17,13 +18,13 @@ export function DataTableRowDetails({ row }: { row: AuditLog }) { {changes.length ? (
    -
    +
    Changes
    -
    +
    Entry
    diff --git a/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-toolbar.tsx b/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-toolbar.tsx index 165c56d07..15f72f438 100644 --- a/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-toolbar.tsx +++ b/apps/dashboard/src/components/data-table/audit-logs-workspace/data-table-toolbar.tsx @@ -1,11 +1,12 @@ "use client"; -import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; import type { RouterOutputs } from "@openstatus/api"; import { Button } from "@openstatus/ui/components/ui/button"; import type { Table } from "@tanstack/react-table"; import { Database, User, X, Zap } from "lucide-react"; +import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; + type AuditLog = RouterOutputs["auditLog"]["list"]["items"][number]; const ACTOR_TYPE_LABELS: Record = { diff --git a/apps/dashboard/src/components/data-table/audit-logs/columns.tsx b/apps/dashboard/src/components/data-table/audit-logs/columns.tsx index 417c24ae8..dc5961de5 100644 --- a/apps/dashboard/src/components/data-table/audit-logs/columns.tsx +++ b/apps/dashboard/src/components/data-table/audit-logs/columns.tsx @@ -1,13 +1,14 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import type { PrivateLocation } from "@openstatus/db/src/schema"; +import type { ColumnDef } from "@tanstack/react-table"; + import { HoverCardTimestamp } from "@/components/common/hover-card-timestamp"; import { Pill } from "@/components/common/pill"; import { TableCellDate } from "@/components/data-table/table-cell-date"; import { config, getMetadata } from "@/data/audit-logs.client"; import { cn } from "@/lib/utils"; -import type { RouterOutputs } from "@openstatus/api"; -import type { PrivateLocation } from "@openstatus/db/src/schema"; -import type { ColumnDef } from "@tanstack/react-table"; type AuditLog = RouterOutputs["tinybird"]["auditLog"]["data"][number]; diff --git a/apps/dashboard/src/components/data-table/audit-logs/wrapper.tsx b/apps/dashboard/src/components/data-table/audit-logs/wrapper.tsx index 0cbeb6ce9..b161f08c8 100644 --- a/apps/dashboard/src/components/data-table/audit-logs/wrapper.tsx +++ b/apps/dashboard/src/components/data-table/audit-logs/wrapper.tsx @@ -1,5 +1,9 @@ "use client"; +import { Skeleton } from "@openstatus/ui/components/ui/skeleton"; +import { useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; + import { BlockWrapper } from "@/components/content/block-wrapper"; import { EmptyStateContainer, @@ -9,10 +13,7 @@ import { import { DataTable } from "@/components/ui/data-table/data-table"; import { DataTablePaginationSimple } from "@/components/ui/data-table/data-table-pagination"; import { useTRPC } from "@/lib/trpc/client"; -import { Skeleton } from "@openstatus/ui/components/ui/skeleton"; -import { useQuery } from "@tanstack/react-query"; -import { useMemo } from "react"; import { getColumns } from "./columns"; export function AuditLogsWrapper({ diff --git a/apps/dashboard/src/components/data-table/billing/data-table.tsx b/apps/dashboard/src/components/data-table/billing/data-table.tsx index e5b378d89..69d966839 100644 --- a/apps/dashboard/src/components/data-table/billing/data-table.tsx +++ b/apps/dashboard/src/components/data-table/billing/data-table.tsx @@ -1,8 +1,12 @@ "use client"; -import { Check } from "lucide-react"; -import { Fragment, useState, useTransition } from "react"; - +import type { WorkspacePlan } from "@openstatus/db/src/schema"; +import type { BillingInterval } from "@openstatus/db/src/schema/plan/schema"; +import { + getAddonPriceConfig, + getPriceConfig, +} from "@openstatus/db/src/schema/plan/utils"; +import { Badge } from "@openstatus/ui/components/ui/badge"; import { Button } from "@openstatus/ui/components/ui/button"; import { Table, @@ -14,21 +18,16 @@ import { TableRow, } from "@openstatus/ui/components/ui/table"; import { Tabs, TabsList, TabsTrigger } from "@openstatus/ui/components/ui/tabs"; +import { useCookieState } from "@openstatus/ui/hooks/use-cookie-state"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { Check } from "lucide-react"; +import { useRouter } from "next/navigation"; +import { Fragment, useState, useTransition } from "react"; import { config as featureGroups, plans } from "@/data/plans"; import { getStripe } from "@/lib/stripe"; import { useTRPC } from "@/lib/trpc/client"; import { cn } from "@/lib/utils"; -import type { WorkspacePlan } from "@openstatus/db/src/schema"; -import type { BillingInterval } from "@openstatus/db/src/schema/plan/schema"; -import { - getAddonPriceConfig, - getPriceConfig, -} from "@openstatus/db/src/schema/plan/utils"; -import { Badge } from "@openstatus/ui/components/ui/badge"; -import { useCookieState } from "@openstatus/ui/hooks/use-cookie-state"; -import { useMutation, useQuery } from "@tanstack/react-query"; -import { useRouter } from "next/navigation"; const BASE_URL = process.env.NODE_ENV === "production" @@ -99,14 +98,14 @@ export function DataTable({ restrictTo }: { restrictTo?: WorkspacePlan[] }) {

    {plan.title}

    -

    +

    {plan.description}

    @@ -227,7 +226,7 @@ export function DataTable({ restrictTo }: { restrictTo?: WorkspacePlan[] }) { } if (typeof limitValue === "boolean") { return limitValue ? ( - + ) : ( ‐ diff --git a/apps/dashboard/src/components/data-table/data-table-sheet.tsx b/apps/dashboard/src/components/data-table/data-table-sheet.tsx index 64c09d7e7..8f2b9f2a0 100644 --- a/apps/dashboard/src/components/data-table/data-table-sheet.tsx +++ b/apps/dashboard/src/components/data-table/data-table-sheet.tsx @@ -32,7 +32,7 @@ export function DataTableSheetHeader({ }: React.ComponentProps) { return ( {children} @@ -47,7 +47,7 @@ export function DataTableSheetFooter({ }: React.ComponentProps) { return ( {children} diff --git a/apps/dashboard/src/components/data-table/incidents/columns.tsx b/apps/dashboard/src/components/data-table/incidents/columns.tsx index e6f8a9a04..c97958779 100644 --- a/apps/dashboard/src/components/data-table/incidents/columns.tsx +++ b/apps/dashboard/src/components/data-table/incidents/columns.tsx @@ -1,12 +1,14 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import type { ColumnDef } from "@tanstack/react-table"; +import { formatDistanceStrict } from "date-fns"; + import { TableCellDate } from "@/components/data-table/table-cell-date"; import { TableCellLink } from "@/components/data-table/table-cell-link"; import { TableCellNumber } from "@/components/data-table/table-cell-number"; import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; -import type { RouterOutputs } from "@openstatus/api"; -import type { ColumnDef } from "@tanstack/react-table"; -import { formatDistanceStrict } from "date-fns"; + import { DataTableRowActions } from "./data-table-row-actions"; type Incident = RouterOutputs["incident"]["list"][number]; diff --git a/apps/dashboard/src/components/data-table/incidents/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/incidents/data-table-row-actions.tsx index 02c236d03..490c5c61e 100644 --- a/apps/dashboard/src/components/data-table/incidents/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/incidents/data-table-row-actions.tsx @@ -1,10 +1,5 @@ "use client"; -import type { Row } from "@tanstack/react-table"; - -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { getActions } from "@/data/incidents.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { AlertDialog, @@ -17,10 +12,15 @@ import { AlertDialogTitle, } from "@openstatus/ui/components/ui/alert-dialog"; import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { Row } from "@tanstack/react-table"; import { isTRPCClientError } from "@trpc/client"; import { useMemo, useState, useTransition } from "react"; import { toast } from "sonner"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { getActions } from "@/data/incidents.client"; +import { useTRPC } from "@/lib/trpc/client"; + type Incident = RouterOutputs["incident"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/maintenances/columns.tsx b/apps/dashboard/src/components/data-table/maintenances/columns.tsx index 839181c19..2de5d98d0 100644 --- a/apps/dashboard/src/components/data-table/maintenances/columns.tsx +++ b/apps/dashboard/src/components/data-table/maintenances/columns.tsx @@ -1,12 +1,14 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import type { ColumnDef } from "@tanstack/react-table"; +import { formatDistanceStrict } from "date-fns"; + import { ProcessMessage } from "@/components/content/process-message"; import { TableCellDate } from "@/components/data-table/table-cell-date"; import { TableCellNumber } from "@/components/data-table/table-cell-number"; import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; -import type { RouterOutputs } from "@openstatus/api"; -import type { ColumnDef } from "@tanstack/react-table"; -import { formatDistanceStrict } from "date-fns"; + import { DataTableRowActions } from "./data-table-row-actions"; type Maintenance = RouterOutputs["maintenance"]["list"][number]; @@ -29,7 +31,7 @@ export const columns: ColumnDef[] = [ cell: ({ row }) => { const value = String(row.getValue("message")); return ( -
    +
    ); diff --git a/apps/dashboard/src/components/data-table/maintenances/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/maintenances/data-table-row-actions.tsx index 589baf539..d6288cd57 100644 --- a/apps/dashboard/src/components/data-table/maintenances/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/maintenances/data-table-row-actions.tsx @@ -1,16 +1,17 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { FormSheetMaintenance } from "@/components/forms/maintenance/sheet"; -import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; -import { getActions } from "@/data/maintenances.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; import { useRef } from "react"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { FormSheetMaintenance } from "@/components/forms/maintenance/sheet"; +import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; +import { getActions } from "@/data/maintenances.client"; +import { useTRPC } from "@/lib/trpc/client"; + type Maintenance = RouterOutputs["maintenance"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/monitors/columns.tsx b/apps/dashboard/src/components/data-table/monitors/columns.tsx index 020081d03..1a1d1afca 100644 --- a/apps/dashboard/src/components/data-table/monitors/columns.tsx +++ b/apps/dashboard/src/components/data-table/monitors/columns.tsx @@ -1,18 +1,19 @@ "use client"; -import { TableCellLink } from "@/components/data-table/table-cell-link"; +import type { RouterOutputs } from "@openstatus/api"; import { Badge } from "@openstatus/ui/components/ui/badge"; import { Checkbox } from "@openstatus/ui/components/ui/checkbox"; import type { ColumnDef } from "@tanstack/react-table"; -import { DataTableRowActions } from "./data-table-row-actions"; +import { formatDistanceToNow } from "date-fns"; +import { TableCellLink } from "@/components/data-table/table-cell-link"; import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; -import type { RouterOutputs } from "@openstatus/api"; -import { formatDistanceToNow } from "date-fns"; + import { TableCellSkeleton } from "../dable-cell-skeleton"; import { TableCellDate } from "../table-cell-date"; import { TableCellNumber } from "../table-cell-number"; import { TableCellUnavailable } from "../table-cell-unavailable"; +import { DataTableRowActions } from "./data-table-row-actions"; type Monitor = RouterOutputs["monitor"]["list"][number] & { globalMetrics?: @@ -94,13 +95,13 @@ export const columns: ColumnDef[] = [ switch (value) { case "active": - return
    {value}
    ; + return
    {value}
    ; case "degraded": - return
    {value}
    ; + return
    {value}
    ; case "error": - return
    {value}
    ; + return
    {value}
    ; default: - return
    {value}
    ; + return
    {value}
    ; } }, filterFn: (row, _, value) => { @@ -134,12 +135,12 @@ export const columns: ColumnDef[] = [ return
    -
    ; } return ( -
    +
    {value.map((tag) => (
    ; diff --git a/apps/dashboard/src/components/data-table/monitors/data-table-toolbar.tsx b/apps/dashboard/src/components/data-table/monitors/data-table-toolbar.tsx index 6e3f6541e..a76c48d21 100644 --- a/apps/dashboard/src/components/data-table/monitors/data-table-toolbar.tsx +++ b/apps/dashboard/src/components/data-table/monitors/data-table-toolbar.tsx @@ -1,13 +1,12 @@ "use client"; -import type { Table } from "@tanstack/react-table"; -import { Tag, X } from "lucide-react"; - +import type { RouterOutputs } from "@openstatus/api"; import { Button } from "@openstatus/ui/components/ui/button"; import { Input } from "@openstatus/ui/components/ui/input"; +import type { Table } from "@tanstack/react-table"; +import { Tag, X } from "lucide-react"; import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; -import type { RouterOutputs } from "@openstatus/api"; type Monitor = RouterOutputs["monitor"]["list"][number]; type MonitorTag = RouterOutputs["monitorTag"]["list"][number]; diff --git a/apps/dashboard/src/components/data-table/notifications/columns.tsx b/apps/dashboard/src/components/data-table/notifications/columns.tsx index 8e7b18779..acb007084 100644 --- a/apps/dashboard/src/components/data-table/notifications/columns.tsx +++ b/apps/dashboard/src/components/data-table/notifications/columns.tsx @@ -1,11 +1,13 @@ "use client"; -import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; -import { type NotifierProvider, config } from "@/data/notifications.client"; import type { RouterOutputs } from "@openstatus/api"; import { Badge } from "@openstatus/ui/components/ui/badge"; import type { ColumnDef } from "@tanstack/react-table"; import Link from "next/link"; + +import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; +import { type NotifierProvider, config } from "@/data/notifications.client"; + import { TableCellBadge } from "../table-cell-badge"; import { DataTableRowActions } from "./data-table-row-actions"; diff --git a/apps/dashboard/src/components/data-table/notifications/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/notifications/data-table-row-actions.tsx index 96b69868b..e38394cca 100644 --- a/apps/dashboard/src/components/data-table/notifications/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/notifications/data-table-row-actions.tsx @@ -1,14 +1,15 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { FormSheetNotifier } from "@/components/forms/notifications/sheet"; -import { getActions } from "@/data/notifications.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; import { useRef } from "react"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { FormSheetNotifier } from "@/components/forms/notifications/sheet"; +import { getActions } from "@/data/notifications.client"; +import { useTRPC } from "@/lib/trpc/client"; + type Notifier = RouterOutputs["notification"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/page-components/columns.tsx b/apps/dashboard/src/components/data-table/page-components/columns.tsx index ccc6fbfaf..686d34db6 100644 --- a/apps/dashboard/src/components/data-table/page-components/columns.tsx +++ b/apps/dashboard/src/components/data-table/page-components/columns.tsx @@ -1,8 +1,10 @@ "use client"; -import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; import type { RouterOutputs } from "@openstatus/api"; import type { ColumnDef } from "@tanstack/react-table"; + +import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; + import { DataTableRowActions } from "./data-table-row-actions"; type PageComponent = RouterOutputs["pageComponent"]["list"][number]; @@ -21,7 +23,7 @@ export const columns: ColumnDef[] = [ cell: ({ row }) => { const value = row.getValue("description"); return ( - + {value ? String(value) : "-"} ); diff --git a/apps/dashboard/src/components/data-table/page-components/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/page-components/data-table-row-actions.tsx index e1e794fbf..c637e9398 100644 --- a/apps/dashboard/src/components/data-table/page-components/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/page-components/data-table-row-actions.tsx @@ -1,12 +1,13 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { getActions } from "@/data/page-components.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { getActions } from "@/data/page-components.client"; +import { useTRPC } from "@/lib/trpc/client"; + type PageComponent = RouterOutputs["pageComponent"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/private-locations/columns.tsx b/apps/dashboard/src/components/data-table/private-locations/columns.tsx index 465131868..19feb6dd6 100644 --- a/apps/dashboard/src/components/data-table/private-locations/columns.tsx +++ b/apps/dashboard/src/components/data-table/private-locations/columns.tsx @@ -1,9 +1,11 @@ "use client"; -import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; import type { RouterOutputs } from "@openstatus/api"; import type { ColumnDef } from "@tanstack/react-table"; import Link from "next/link"; + +import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; + import { TableCellBadge } from "../table-cell-badge"; import { TableCellDate } from "../table-cell-date"; import { DataTableRowActions } from "./data-table-row-actions"; diff --git a/apps/dashboard/src/components/data-table/private-locations/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/private-locations/data-table-row-actions.tsx index 5b6d5a935..c7c7f229f 100644 --- a/apps/dashboard/src/components/data-table/private-locations/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/private-locations/data-table-row-actions.tsx @@ -1,14 +1,15 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { FormSheetPrivateLocation } from "@/components/forms/private-location/sheet"; -import { getActions } from "@/data/notifications.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; import { useRef } from "react"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { FormSheetPrivateLocation } from "@/components/forms/private-location/sheet"; +import { getActions } from "@/data/notifications.client"; +import { useTRPC } from "@/lib/trpc/client"; + type PrivateLocation = RouterOutputs["privateLocation"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/response-logs/columns.tsx b/apps/dashboard/src/components/data-table/response-logs/columns.tsx index 29f85de37..4e4e65154 100644 --- a/apps/dashboard/src/components/data-table/response-logs/columns.tsx +++ b/apps/dashboard/src/components/data-table/response-logs/columns.tsx @@ -1,11 +1,5 @@ "use client"; -import { HoverCardTimestamp } from "@/components/common/hover-card-timestamp"; -import { HoverCardTiming } from "@/components/common/hover-card-timing"; -import { TableCellDate } from "@/components/data-table/table-cell-date"; -import { TableCellNumber } from "@/components/data-table/table-cell-number"; -import { TableCellRegion } from "@/components/data-table/table-cell-region"; -import { getStatusCodeVariant, textColors } from "@/data/status-codes"; import type { RouterOutputs } from "@openstatus/api"; import type { PrivateLocation } from "@openstatus/db/src/schema"; import { @@ -17,6 +11,13 @@ import { import type { ColumnDef } from "@tanstack/react-table"; import { Clock, Workflow } from "lucide-react"; +import { HoverCardTimestamp } from "@/components/common/hover-card-timestamp"; +import { HoverCardTiming } from "@/components/common/hover-card-timing"; +import { TableCellDate } from "@/components/data-table/table-cell-date"; +import { TableCellNumber } from "@/components/data-table/table-cell-number"; +import { TableCellRegion } from "@/components/data-table/table-cell-region"; +import { getStatusCodeVariant, textColors } from "@/data/status-codes"; + type ResponseLog = RouterOutputs["tinybird"]["list"]["data"][number]; // export const columns: ColumnDef[] = @@ -32,13 +33,13 @@ export function getColumns( cell: ({ row }) => { const value = row.getValue("requestStatus"); if (value === "error") { - return
    ; + return
    ; } if (value === "degraded") { - return
    ; + return
    ; } if (value === "success") { - return
    ; + return
    ; } return
    -
    ; }, @@ -54,7 +55,7 @@ export function getColumns( ); @@ -127,7 +128,7 @@ export function getColumns( - +

    {label}

    diff --git a/apps/dashboard/src/components/data-table/response-logs/data-table-basics.tsx b/apps/dashboard/src/components/data-table/response-logs/data-table-basics.tsx index 3649efeba..2516c162f 100644 --- a/apps/dashboard/src/components/data-table/response-logs/data-table-basics.tsx +++ b/apps/dashboard/src/components/data-table/response-logs/data-table-basics.tsx @@ -1,11 +1,5 @@ "use client"; -import { IconCloudProvider } from "@/components/common/icon-cloud-provider"; -import { BlockWrapper } from "@/components/content/block-wrapper"; -import { TableCellDate } from "@/components/data-table/table-cell-date"; -import { TableCellNumber } from "@/components/data-table/table-cell-number"; -import { getStatusCodeVariant, textColors } from "@/data/status-codes"; -import { formatMilliseconds, formatPercentage } from "@/lib/formatter"; import type { RouterOutputs } from "@openstatus/api"; import type { PrivateLocation } from "@openstatus/db/src/schema"; import { getRegionInfo } from "@openstatus/regions"; @@ -25,6 +19,13 @@ import { import { cn } from "@openstatus/ui/lib/utils"; import { Braces, TableProperties } from "lucide-react"; +import { IconCloudProvider } from "@/components/common/icon-cloud-provider"; +import { BlockWrapper } from "@/components/content/block-wrapper"; +import { TableCellDate } from "@/components/data-table/table-cell-date"; +import { TableCellNumber } from "@/components/data-table/table-cell-number"; +import { getStatusCodeVariant, textColors } from "@/data/status-codes"; +import { formatMilliseconds, formatPercentage } from "@/lib/formatter"; + type ResponseLog = RouterOutputs["tinybird"]["get"]["data"][number]; export function DataTableBasics({ @@ -78,14 +79,14 @@ export function DataTableBasicsHTTP({ Request - + Result {/* TODO: add colored square like list (see columns) */} - +
    {data.id ? ( - + ID - + {data.id} ) : null} - + Timestamp - + - + URL - + {data.url} @@ -136,10 +137,10 @@ export function DataTableBasicsHTTP({ */} - + Status - + - + Latency - + - + Region - + {regionConfig?.code}{" "} {regionConfig?.location} {regionConfig?.flag} @@ -166,25 +167,25 @@ export function DataTableBasicsHTTP({ - + Cloud Provider - + - + {regionConfig?.provider} {data.trigger ? ( - + Trigger - + {data?.trigger} @@ -218,10 +219,10 @@ export function DataTableBasicsHTTP({ key={key} className="[&>:not(:last-child)]:border-r" > - + {key} - + {value} @@ -231,7 +232,7 @@ export function DataTableBasicsHTTP({
    -
    +                    
                           {JSON.stringify(data?.headers, null, 2)}
                         
    @@ -247,10 +248,10 @@ export function DataTableBasicsHTTP({ {Object.entries(data?.timing ?? {}).map(([key, value], index) => ( - + {key} - +
    @@ -258,7 +259,7 @@ export function DataTableBasicsHTTP({
    - + {formatMilliseconds(value)}
    -
    +                
                       {data.message}
                     
    @@ -297,7 +298,7 @@ export function DataTableBasicsHTTP({ -
    +                  
                         {data.body}
                       
    @@ -313,11 +314,11 @@ export function DataTableBasicsHTTP({ {!data.assertions || data.assertions === "[]" ? ( -
    +
    Default status code 2xx assertion
    ) : ( -
    +                  
                         {JSON.stringify(data.assertions, null, 2)}
                       
    )} @@ -356,14 +357,14 @@ export function DataTableBasicsTCP({ Request - + Result {/* TODO: add colored square like list (see columns) */} - +
    {data.id ? ( - + ID - + {data.id} ) : null} - + Timestamp - + - + URI - + {data.uri} - + Latency - + - + Region - + {regionConfig?.flag} {regionConfig?.code}{" "} {regionConfig?.location} @@ -424,25 +425,25 @@ export function DataTableBasicsTCP({ - + Cloud Provider - + - + {regionConfig?.provider} {data.trigger ? ( - + Trigger - + {data?.trigger} @@ -454,7 +455,7 @@ export function DataTableBasicsTCP({ -
    +                
                       {data.errorMessage}
                     
    @@ -492,14 +493,14 @@ export function DataTableBasicsDNS({ Request - + Result {/* TODO: add colored square like list (see columns) */} - +
    {data.id ? ( - + ID - + {data.id} ) : null} - + Timestamp - + - + URI - + {data.uri} - + Latency - + - + Region - + {regionConfig?.flag} {regionConfig?.code}{" "} {regionConfig?.location} @@ -560,25 +561,25 @@ export function DataTableBasicsDNS({ - + Cloud Provider - + - + {regionConfig?.provider} {data.trigger ? ( - + Trigger - + {data?.trigger} @@ -612,10 +613,10 @@ export function DataTableBasicsDNS({ key={key} className="[&>:not(:last-child)]:border-r" > - + {key.toUpperCase()} - + {Array.isArray(value) ? value.join(", ") : value} @@ -627,7 +628,7 @@ export function DataTableBasicsDNS({ -
    +                    
                           {JSON.stringify(data?.records, null, 2)}
                         
    @@ -643,7 +644,7 @@ export function DataTableBasicsDNS({ -
    +                
                       {data.errorMessage}
                     
    @@ -658,11 +659,11 @@ export function DataTableBasicsDNS({ {!data.assertions || data.assertions === "[]" ? ( -
    +
    No assertions
    ) : ( -
    +                  
                         {JSON.stringify(data.assertions, null, 2)}
                       
    )} diff --git a/apps/dashboard/src/components/data-table/response-logs/data-table-sheet-test.tsx b/apps/dashboard/src/components/data-table/response-logs/data-table-sheet-test.tsx index 44cf1b194..fc9a22227 100644 --- a/apps/dashboard/src/components/data-table/response-logs/data-table-sheet-test.tsx +++ b/apps/dashboard/src/components/data-table/response-logs/data-table-sheet-test.tsx @@ -1,12 +1,14 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; + import { DataTableSheet, DataTableSheetContent, DataTableSheetHeader, DataTableSheetTitle, } from "@/components/data-table/data-table-sheet"; -import type { RouterOutputs } from "@openstatus/api"; + import { DataTableBasics } from "./data-table-basics"; type TestTCP = RouterOutputs["checker"]["testTcp"]; diff --git a/apps/dashboard/src/components/data-table/response-logs/data-table-sheet.tsx b/apps/dashboard/src/components/data-table/response-logs/data-table-sheet.tsx index d41d625ec..76f6f24d5 100644 --- a/apps/dashboard/src/components/data-table/response-logs/data-table-sheet.tsx +++ b/apps/dashboard/src/components/data-table/response-logs/data-table-sheet.tsx @@ -1,5 +1,12 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import type { PrivateLocation } from "@openstatus/db/src/schema"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { Separator } from "@openstatus/ui/components/ui/separator"; +import { useCopyToClipboard } from "@openstatus/ui/hooks/use-copy-to-clipboard"; +import { Check, Copy } from "lucide-react"; + import { DataTableSheet, DataTableSheetContent, @@ -7,12 +14,7 @@ import { DataTableSheetHeader, DataTableSheetTitle, } from "@/components/data-table/data-table-sheet"; -import type { RouterOutputs } from "@openstatus/api"; -import type { PrivateLocation } from "@openstatus/db/src/schema"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { Separator } from "@openstatus/ui/components/ui/separator"; -import { useCopyToClipboard } from "@openstatus/ui/hooks/use-copy-to-clipboard"; -import { Check, Copy } from "lucide-react"; + import { DataTableBasics } from "./data-table-basics"; type ResponseLog = RouterOutputs["tinybird"]["get"]["data"][number]; diff --git a/apps/dashboard/src/components/data-table/response-logs/data-table-toolbar.tsx b/apps/dashboard/src/components/data-table/response-logs/data-table-toolbar.tsx index 4aea3508c..c1700b337 100644 --- a/apps/dashboard/src/components/data-table/response-logs/data-table-toolbar.tsx +++ b/apps/dashboard/src/components/data-table/response-logs/data-table-toolbar.tsx @@ -1,14 +1,13 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import { Button } from "@openstatus/ui/components/ui/button"; import type { Table } from "@tanstack/react-table"; import { Activity, MapPin, TriangleAlert, X } from "lucide-react"; -import { Button } from "@openstatus/ui/components/ui/button"; - import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; import { regions } from "@/data/regions"; import { statusCodes } from "@/data/status-codes"; -import type { RouterOutputs } from "@openstatus/api"; type ResponseLog = RouterOutputs["tinybird"]["list"]["data"][number]; @@ -23,7 +22,7 @@ export function ResponseLogsDataTableToolbar({ return (
    -
    +
    {table.getColumn("status") && ( ; } diff --git a/apps/dashboard/src/components/data-table/settings/api-key/data-table.tsx b/apps/dashboard/src/components/data-table/settings/api-key/data-table.tsx index 7575e742c..079ac235e 100644 --- a/apps/dashboard/src/components/data-table/settings/api-key/data-table.tsx +++ b/apps/dashboard/src/components/data-table/settings/api-key/data-table.tsx @@ -1,6 +1,3 @@ -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { formatDate } from "@/lib/formatter"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { Badge } from "@openstatus/ui/components/ui/badge"; import { @@ -13,6 +10,10 @@ import { } from "@openstatus/ui/components/ui/table"; import { useMutation } from "@tanstack/react-query"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { formatDate } from "@/lib/formatter"; +import { useTRPC } from "@/lib/trpc/client"; + type ApiKey = RouterOutputs["apiKeyRouter"]["getAll"][number]; /** @@ -70,7 +71,7 @@ export function DataTable({ {apiKeys.map((apiKey) => ( {apiKey.name} - + {apiKey.description ?? "-"} diff --git a/apps/dashboard/src/components/data-table/settings/invitations/data-table.tsx b/apps/dashboard/src/components/data-table/settings/invitations/data-table.tsx index 498027367..9edcdf3ad 100644 --- a/apps/dashboard/src/components/data-table/settings/invitations/data-table.tsx +++ b/apps/dashboard/src/components/data-table/settings/invitations/data-table.tsx @@ -1,11 +1,3 @@ -import { - EmptyStateContainer, - EmptyStateDescription, - EmptyStateTitle, -} from "@/components/content/empty-state"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { formatDate } from "@/lib/formatter"; -import { useTRPC } from "@/lib/trpc/client"; import { Table, TableBody, @@ -16,6 +8,15 @@ import { } from "@openstatus/ui/components/ui/table"; import { useMutation, useQuery } from "@tanstack/react-query"; +import { + EmptyStateContainer, + EmptyStateDescription, + EmptyStateTitle, +} from "@/components/content/empty-state"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { formatDate } from "@/lib/formatter"; +import { useTRPC } from "@/lib/trpc/client"; + export function DataTable() { const trpc = useTRPC(); const { data: invitations, refetch } = useQuery( diff --git a/apps/dashboard/src/components/data-table/settings/members/data-table.tsx b/apps/dashboard/src/components/data-table/settings/members/data-table.tsx index 8bf2c3fde..1950d1b05 100644 --- a/apps/dashboard/src/components/data-table/settings/members/data-table.tsx +++ b/apps/dashboard/src/components/data-table/settings/members/data-table.tsx @@ -1,6 +1,3 @@ -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { formatDate } from "@/lib/formatter"; -import { useTRPC } from "@/lib/trpc/client"; import { Table, TableBody, @@ -11,6 +8,10 @@ import { } from "@openstatus/ui/components/ui/table"; import { useMutation, useQuery } from "@tanstack/react-query"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { formatDate } from "@/lib/formatter"; +import { useTRPC } from "@/lib/trpc/client"; + export function DataTable() { const trpc = useTRPC(); const { data: members, refetch } = useQuery(trpc.member.list.queryOptions()); diff --git a/apps/dashboard/src/components/data-table/status-pages/columns.tsx b/apps/dashboard/src/components/data-table/status-pages/columns.tsx index e86b64b86..053f7214a 100644 --- a/apps/dashboard/src/components/data-table/status-pages/columns.tsx +++ b/apps/dashboard/src/components/data-table/status-pages/columns.tsx @@ -1,9 +1,11 @@ "use client"; -import { Link } from "@/components/common/link"; -import { TableCellLink } from "@/components/data-table/table-cell-link"; import type { RouterOutputs } from "@openstatus/api"; import type { ColumnDef } from "@tanstack/react-table"; + +import { Link } from "@/components/common/link"; +import { TableCellLink } from "@/components/data-table/table-cell-link"; + import { DataTableRowActions } from "./data-table-row-actions"; type StatusPage = RouterOutputs["page"]["list"][number]; @@ -37,7 +39,7 @@ export const columns: ColumnDef[] = [ {`Favicon ); }, diff --git a/apps/dashboard/src/components/data-table/status-pages/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/status-pages/data-table-row-actions.tsx index 59363bcb5..e2e7a7161 100644 --- a/apps/dashboard/src/components/data-table/status-pages/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/status-pages/data-table-row-actions.tsx @@ -1,14 +1,15 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { getActions } from "@/data/status-pages.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { getActions } from "@/data/status-pages.client"; +import { useTRPC } from "@/lib/trpc/client"; + type StatusPage = RouterOutputs["page"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/status-report-updates/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/status-report-updates/data-table-row-actions.tsx index ed270db24..73fc207e4 100644 --- a/apps/dashboard/src/components/data-table/status-report-updates/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/status-report-updates/data-table-row-actions.tsx @@ -1,14 +1,15 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; -import { getActions } from "@/data/status-report-updates.client"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useParams } from "next/navigation"; import { useRef } from "react"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; +import { getActions } from "@/data/status-report-updates.client"; +import { useTRPC } from "@/lib/trpc/client"; + type StatusReportUpdate = RouterOutputs["statusReport"]["list"][number]["updates"][number]; diff --git a/apps/dashboard/src/components/data-table/status-report-updates/data-table.tsx b/apps/dashboard/src/components/data-table/status-report-updates/data-table.tsx index 4876b7cae..983139c2a 100644 --- a/apps/dashboard/src/components/data-table/status-report-updates/data-table.tsx +++ b/apps/dashboard/src/components/data-table/status-report-updates/data-table.tsx @@ -1,12 +1,5 @@ "use client"; -import { ProcessMessage } from "@/components/content/process-message"; -import { TableCellDate } from "@/components/data-table/table-cell-date"; -import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; -import { icons } from "@/data/icons"; -import { colors, getNextStatus } from "@/data/status-report-updates.client"; -import { useTRPC } from "@/lib/trpc/client"; -import { cn } from "@/lib/utils"; import type { RouterOutputs } from "@openstatus/api"; import { Button } from "@openstatus/ui/components/ui/button"; import { @@ -26,6 +19,15 @@ import { import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Plus } from "lucide-react"; import { useParams } from "next/navigation"; + +import { ProcessMessage } from "@/components/content/process-message"; +import { TableCellDate } from "@/components/data-table/table-cell-date"; +import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; +import { icons } from "@/data/icons"; +import { colors, getNextStatus } from "@/data/status-report-updates.client"; +import { useTRPC } from "@/lib/trpc/client"; +import { cn } from "@/lib/utils"; + import { DataTableRowActions } from "./data-table-row-actions"; type StatusReportUpdates = @@ -123,11 +125,11 @@ export function DataTable({
    -
    +
    - + diff --git a/apps/dashboard/src/components/data-table/status-reports/columns.tsx b/apps/dashboard/src/components/data-table/status-reports/columns.tsx index b93c6458c..7650f5987 100644 --- a/apps/dashboard/src/components/data-table/status-reports/columns.tsx +++ b/apps/dashboard/src/components/data-table/status-reports/columns.tsx @@ -1,17 +1,19 @@ "use client"; -import { TableCellBadge } from "@/components/data-table/table-cell-badge"; -import { TableCellDate } from "@/components/data-table/table-cell-date"; -import { TableCellLink } from "@/components/data-table/table-cell-link"; -import { TableCellNumber } from "@/components/data-table/table-cell-number"; -import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; -import { colors } from "@/data/status-report-updates.client"; import type { RouterOutputs } from "@openstatus/api"; import { Button } from "@openstatus/ui/components/ui/button"; import { cn } from "@openstatus/ui/lib/utils"; import type { ColumnDef } from "@tanstack/react-table"; import { ChevronDown, ChevronUp } from "lucide-react"; import Link from "next/link"; + +import { TableCellBadge } from "@/components/data-table/table-cell-badge"; +import { TableCellDate } from "@/components/data-table/table-cell-date"; +import { TableCellLink } from "@/components/data-table/table-cell-link"; +import { TableCellNumber } from "@/components/data-table/table-cell-number"; +import { DataTableColumnHeader } from "@/components/ui/data-table/data-table-column-header"; +import { colors } from "@/data/status-report-updates.client"; + import { DataTableRowActions } from "./data-table-row-actions"; type StatusReport = RouterOutputs["statusReport"]["list"][number]; diff --git a/apps/dashboard/src/components/data-table/status-reports/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/status-reports/data-table-row-actions.tsx index e57b46764..a554d39cb 100644 --- a/apps/dashboard/src/components/data-table/status-reports/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/status-reports/data-table-row-actions.tsx @@ -1,5 +1,10 @@ "use client"; +import type { RouterOutputs } from "@openstatus/api"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import type { Row } from "@tanstack/react-table"; +import { useRef } from "react"; + import { QuickActions } from "@/components/dropdowns/quick-actions"; import { FormSheetStatusReportUpdate } from "@/components/forms/status-report-update/sheet"; import { FormSheetStatusReport } from "@/components/forms/status-report/sheet"; @@ -7,10 +12,6 @@ import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; import { getNextStatus } from "@/data/status-report-updates.client"; import { getActions } from "@/data/status-reports.client"; import { useTRPC } from "@/lib/trpc/client"; -import type { RouterOutputs } from "@openstatus/api"; -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import type { Row } from "@tanstack/react-table"; -import { useRef } from "react"; type StatusReport = RouterOutputs["statusReport"]["list"][number]; diff --git a/apps/dashboard/src/components/data-table/subscribers/columns.tsx b/apps/dashboard/src/components/data-table/subscribers/columns.tsx index 05396fbfc..f011edf23 100644 --- a/apps/dashboard/src/components/data-table/subscribers/columns.tsx +++ b/apps/dashboard/src/components/data-table/subscribers/columns.tsx @@ -1,6 +1,5 @@ "use client"; -import { formatDate } from "@/lib/formatter"; import type { RouterOutputs } from "@openstatus/api"; import { detectWebhookFlavor } from "@openstatus/subscriptions/client"; import { Badge } from "@openstatus/ui/components/ui/badge"; @@ -10,6 +9,9 @@ import { TooltipTrigger, } from "@openstatus/ui/components/ui/tooltip"; import type { ColumnDef } from "@tanstack/react-table"; + +import { formatDate } from "@/lib/formatter"; + import { DataTableRowActions } from "./data-table-row-actions"; type Subscriber = RouterOutputs["pageSubscriber"]["list"][number]; diff --git a/apps/dashboard/src/components/data-table/subscribers/data-table-row-actions.tsx b/apps/dashboard/src/components/data-table/subscribers/data-table-row-actions.tsx index 3e7505ff3..25c6a4304 100644 --- a/apps/dashboard/src/components/data-table/subscribers/data-table-row-actions.tsx +++ b/apps/dashboard/src/components/data-table/subscribers/data-table-row-actions.tsx @@ -1,9 +1,5 @@ "use client"; -import { QuickActions } from "@/components/dropdowns/quick-actions"; -import { FormSheetSubscriber } from "@/components/forms/subscriber/sheet"; -import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; -import { useTRPC } from "@/lib/trpc/client"; import type { RouterOutputs } from "@openstatus/api"; import { useMutation, useQuery } from "@tanstack/react-query"; import type { Row } from "@tanstack/react-table"; @@ -12,6 +8,11 @@ import { Pencil, Send } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; +import { QuickActions } from "@/components/dropdowns/quick-actions"; +import { FormSheetSubscriber } from "@/components/forms/subscriber/sheet"; +import { toCheckboxTreeItems } from "@/components/ui/checkbox-tree"; +import { useTRPC } from "@/lib/trpc/client"; + type Subscriber = RouterOutputs["pageSubscriber"]["list"][number]; interface DataTableRowActionsProps { diff --git a/apps/dashboard/src/components/data-table/subscribers/data-table-toolbar.tsx b/apps/dashboard/src/components/data-table/subscribers/data-table-toolbar.tsx index b64c793c1..1ffcddc7a 100644 --- a/apps/dashboard/src/components/data-table/subscribers/data-table-toolbar.tsx +++ b/apps/dashboard/src/components/data-table/subscribers/data-table-toolbar.tsx @@ -1,11 +1,12 @@ "use client"; -import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; import type { RouterOutputs } from "@openstatus/api"; import { Button } from "@openstatus/ui/components/ui/button"; import type { Table } from "@tanstack/react-table"; import { CircleCheck, Globe, X } from "lucide-react"; +import { DataTableFacetedFilter } from "@/components/ui/data-table/data-table-faceted-filter"; + type Subscriber = RouterOutputs["pageSubscriber"]["list"][number]; const STATUS_OPTIONS = [ diff --git a/apps/dashboard/src/components/data-table/table-cell-badge.tsx b/apps/dashboard/src/components/data-table/table-cell-badge.tsx index 98fc50eb4..738d2dd83 100644 --- a/apps/dashboard/src/components/data-table/table-cell-badge.tsx +++ b/apps/dashboard/src/components/data-table/table-cell-badge.tsx @@ -1,4 +1,3 @@ -import { cn } from "@/lib/utils"; import { Badge } from "@openstatus/ui/components/ui/badge"; import { Tooltip, @@ -8,6 +7,8 @@ import { } from "@openstatus/ui/components/ui/tooltip"; import { useEffect, useRef, useState } from "react"; +import { cn } from "@/lib/utils"; + export function TableCellBadge({ value, className, @@ -17,7 +18,6 @@ export function TableCellBadge({ const [isTruncated, setIsTruncated] = useState(false); const [open, setOpen] = useState(false); - // biome-ignore lint/correctness/useExhaustiveDependencies: useEffect(() => { if (ref.current) { setIsTruncated(ref.current.scrollWidth > ref.current.clientWidth); diff --git a/apps/dashboard/src/components/data-table/table-cell-date.tsx b/apps/dashboard/src/components/data-table/table-cell-date.tsx index e105ec8cf..bb84a7853 100644 --- a/apps/dashboard/src/components/data-table/table-cell-date.tsx +++ b/apps/dashboard/src/components/data-table/table-cell-date.tsx @@ -1,6 +1,7 @@ +import { format } from "date-fns"; + import { HoverCardTimestamp } from "@/components/common/hover-card-timestamp"; import { cn } from "@/lib/utils"; -import { format } from "date-fns"; export function TableCellDate({ value, diff --git a/apps/dashboard/src/components/data-table/table-cell-link.tsx b/apps/dashboard/src/components/data-table/table-cell-link.tsx index 0f3bbc7de..1f9d13b32 100644 --- a/apps/dashboard/src/components/data-table/table-cell-link.tsx +++ b/apps/dashboard/src/components/data-table/table-cell-link.tsx @@ -1,6 +1,7 @@ +import { ArrowUpRight, ChevronRight } from "lucide-react"; + import { Link } from "@/components/common/link"; import { cn } from "@/lib/utils"; -import { ArrowUpRight, ChevronRight } from "lucide-react"; export function TableCellLink({ value, @@ -25,7 +26,7 @@ export function TableCellLink({ {...props} > {value} - + ); } diff --git a/apps/dashboard/src/components/data-table/table-cell-number.tsx b/apps/dashboard/src/components/data-table/table-cell-number.tsx index bf1b96138..2dcffc267 100644 --- a/apps/dashboard/src/components/data-table/table-cell-number.tsx +++ b/apps/dashboard/src/components/data-table/table-cell-number.tsx @@ -8,13 +8,13 @@ export function TableCellNumber({ }: React.ComponentProps<"div"> & { value: unknown; unit?: string }) { const _value = Number(value); if (Number.isNaN(_value)) { - return
    N/A
    ; + return
    N/A
    ; } return ( -
    +
    {_value} - {unit && {unit}} + {unit && {unit}}
    ); } diff --git a/apps/dashboard/src/components/date-picker.tsx b/apps/dashboard/src/components/date-picker.tsx index 8f4f09fc6..6830ba4b5 100644 --- a/apps/dashboard/src/components/date-picker.tsx +++ b/apps/dashboard/src/components/date-picker.tsx @@ -1,16 +1,16 @@ "use client"; -import { useState } from "react"; -import type { DateRange } from "react-day-picker"; - -import { Kbd } from "@/components/common/kbd"; -import { formatDateForInput } from "@/lib/formatter"; import { Button } from "@openstatus/ui/components/ui/button"; import { Calendar } from "@openstatus/ui/components/ui/calendar"; import { Input } from "@openstatus/ui/components/ui/input"; import { Label } from "@openstatus/ui/components/ui/label"; import { Separator } from "@openstatus/ui/components/ui/separator"; import { endOfDay } from "date-fns"; +import { useState } from "react"; +import type { DateRange } from "react-day-picker"; + +import { Kbd } from "@/components/common/kbd"; +import { formatDateForInput } from "@/lib/formatter"; type DatePickerProps = { range: DateRange; @@ -28,7 +28,7 @@ export function DatePicker({ range, onSelect, presets }: DatePickerProps) {
    -
    +
    Presets
    {presets.map((preset) => { @@ -77,7 +77,7 @@ export function DatePicker({ range, onSelect, presets }: DatePickerProps) {
    -

    +

    Custom Range

    diff --git a/apps/dashboard/src/components/development-indicator.tsx b/apps/dashboard/src/components/development-indicator.tsx index 9448eacb1..d76af66e3 100644 --- a/apps/dashboard/src/components/development-indicator.tsx +++ b/apps/dashboard/src/components/development-indicator.tsx @@ -17,20 +17,20 @@ export function DevelopmentIndicator() { return ( -
    +
    -
    +
    In Beta
    {!isMobile ? (

    - Press F key to provide + Press F key to provide feedback.

    ) : ( diff --git a/apps/dashboard/src/components/dialogs/export-code.tsx b/apps/dashboard/src/components/dialogs/export-code.tsx index 8e3559ef1..671a31f91 100644 --- a/apps/dashboard/src/components/dialogs/export-code.tsx +++ b/apps/dashboard/src/components/dialogs/export-code.tsx @@ -1,4 +1,3 @@ -import { Link } from "@/components/common/link"; import { Button } from "@openstatus/ui/components/ui/button"; import { Dialog, @@ -17,6 +16,8 @@ import { useCopyToClipboard } from "@openstatus/ui/hooks/use-copy-to-clipboard"; import type { DialogProps } from "@radix-ui/react-dialog"; import { Check, Copy } from "lucide-react"; +import { Link } from "@/components/common/link"; + // TODL: make it dynamic const YML = `openstatus-marketing: name: OpenStatus Marketing @@ -48,7 +49,7 @@ export function ExportCodeDialog(props: DialogProps) { Terraform -
    +            
                   {YML}
                   
  • -

    Run external diagnostics

    +

    Run external diagnostics

    {tools.map((tool) => (
    -
    +
    {component.monitor && component.type === "monitor" ? ( {component.monitor.name} ) : ( - + {" "} Static Component @@ -824,14 +827,14 @@ function ComponentRow({ {component.monitor.public ? ( - + Public ) : ( - + Private @@ -858,7 +861,7 @@ function ComponentRow({ type="button" variant="ghost" size="icon" - className="text-destructive hover:bg-destructive/10 hover:text-destructive dark:hover:bg-destructive/20 [&_svg]:size-4 [&_svg]:text-destructive" + className="text-destructive hover:bg-destructive/10 hover:text-destructive dark:hover:bg-destructive/20 [&_svg]:text-destructive [&_svg]:size-4" > @@ -878,7 +881,7 @@ function ComponentRow({ Cancel onDelete(component.id)} > Remove @@ -892,8 +895,10 @@ function ComponentRow({ ); } -interface ComponentGroupRowProps - extends Omit, "value"> { +interface ComponentGroupRowProps extends Omit< + React.ComponentPropsWithoutRef, + "value" +> { group: ComponentGroup; groupIndex: number; onDeleteGroup: (groupId: number) => void; @@ -992,7 +997,7 @@ function ComponentGroupRow({ ); return ( - +
    @@ -1012,7 +1017,7 @@ function ComponentGroupRow({ @@ -1060,7 +1065,7 @@ function ComponentGroupRow({ Add Static Component - + Add Monitor Component @@ -1156,7 +1161,7 @@ function ComponentGroupRow({ onCheckedChange={field.onChange} /> - + Open by default @@ -1169,7 +1174,7 @@ function ComponentGroupRow({ type="button" variant="ghost" size="icon" - className="text-destructive hover:bg-destructive/10 hover:text-destructive dark:hover:bg-destructive/20 [&_svg]:size-4 [&_svg]:text-destructive" + className="text-destructive hover:bg-destructive/10 hover:text-destructive dark:hover:bg-destructive/20 [&_svg]:text-destructive [&_svg]:size-4" // NOTE: delete directly if no components are in the group {...(data.length === 0 ? { onClick: () => onDeleteGroup(group.id) } @@ -1205,7 +1210,7 @@ function ComponentGroupRow({ Cancel onDeleteGroup(group.id)} > Remove @@ -1286,7 +1291,7 @@ function ComponentAttachments({ const remainingCount = allItems.length - displayLimit; return ( -
      +
        {displayedItems.map((item) => (
      • {item.title}{" "} diff --git a/apps/dashboard/src/components/forms/components/form-import.tsx b/apps/dashboard/src/components/forms/components/form-import.tsx index d0bf03951..6dcb5a9f7 100644 --- a/apps/dashboard/src/components/forms/components/form-import.tsx +++ b/apps/dashboard/src/components/forms/components/form-import.tsx @@ -1,17 +1,5 @@ "use client"; -import { Link } from "@/components/common/link"; -import { Note } from "@/components/common/note"; -import { - FormCard, - FormCardContent, - FormCardDescription, - FormCardFooter, - FormCardHeader, - FormCardSeparator, - FormCardTitle, -} from "@/components/forms/form-card"; -import { useTRPC } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { BetterstackIcon, @@ -44,6 +32,19 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { Link } from "@/components/common/link"; +import { Note } from "@/components/common/note"; +import { + FormCard, + FormCardContent, + FormCardDescription, + FormCardFooter, + FormCardHeader, + FormCardSeparator, + FormCardTitle, +} from "@/components/forms/form-card"; +import { useTRPC } from "@/lib/trpc/client"; + const schema = z.object({ provider: z.enum(["statuspage", "betterstack", "instatus"]), apiKey: z.string().min(1, "API key is required"), @@ -190,7 +191,7 @@ export function FormImport({ defaultValue={field.value} className="grid grid-cols-2 gap-4 sm:grid-cols-4" > - + - + - + -
        +
        Missing a provider?{" "} Contact us
        diff --git a/apps/dashboard/src/components/forms/components/telegram-connection-flow.tsx b/apps/dashboard/src/components/forms/components/telegram-connection-flow.tsx index 9b923db3e..93b3a53b8 100644 --- a/apps/dashboard/src/components/forms/components/telegram-connection-flow.tsx +++ b/apps/dashboard/src/components/forms/components/telegram-connection-flow.tsx @@ -1,6 +1,5 @@ "use client"; -import { useTelegramConnection } from "@/hooks/use-telegram-connection"; import { Tabs, TabsContent, @@ -8,6 +7,9 @@ import { TabsTrigger, } from "@openstatus/ui/components/ui/tabs"; import type { UseFormReturn } from "react-hook-form"; + +import { useTelegramConnection } from "@/hooks/use-telegram-connection"; + import type { FormValues } from "../notifications/form-telegram"; import { TelegramManualInput } from "./telegram-manual-input"; import { TelegramQRConnection } from "./telegram-qr-connection"; diff --git a/apps/dashboard/src/components/forms/components/telegram-form-actions.tsx b/apps/dashboard/src/components/forms/components/telegram-form-actions.tsx index a34b0bab2..6e715ed9c 100644 --- a/apps/dashboard/src/components/forms/components/telegram-form-actions.tsx +++ b/apps/dashboard/src/components/forms/components/telegram-form-actions.tsx @@ -1,12 +1,14 @@ "use client"; -import { useTRPC } from "@/lib/trpc/client"; import { Button } from "@openstatus/ui/components/ui/button"; import { useMutation } from "@tanstack/react-query"; import { isTRPCClientError } from "@trpc/client"; import { useTransition } from "react"; import type { UseFormReturn } from "react-hook-form"; import { toast } from "sonner"; + +import { useTRPC } from "@/lib/trpc/client"; + import type { FormValues } from "../notifications/form-telegram"; interface TelegramFormActionsProps { diff --git a/apps/dashboard/src/components/forms/components/telegram-manual-input.tsx b/apps/dashboard/src/components/forms/components/telegram-manual-input.tsx index 94adbf762..88de01dcc 100644 --- a/apps/dashboard/src/components/forms/components/telegram-manual-input.tsx +++ b/apps/dashboard/src/components/forms/components/telegram-manual-input.tsx @@ -1,6 +1,5 @@ "use client"; -import { Link } from "@/components/common/link"; import { FormControl, FormDescription, @@ -11,6 +10,9 @@ import { } from "@openstatus/ui/components/ui/form"; import { Input } from "@openstatus/ui/components/ui/input"; import type { UseFormReturn } from "react-hook-form"; + +import { Link } from "@/components/common/link"; + import type { FormValues } from "../notifications/form-telegram"; interface TelegramManualInputProps { @@ -36,7 +38,7 @@ export function TelegramManualInput({ {successMsg && ( -
        +
        {successMsg}
        )} diff --git a/apps/dashboard/src/components/forms/components/telegram-qr-connection.tsx b/apps/dashboard/src/components/forms/components/telegram-qr-connection.tsx index 989a71a0c..f5bea846b 100644 --- a/apps/dashboard/src/components/forms/components/telegram-qr-connection.tsx +++ b/apps/dashboard/src/components/forms/components/telegram-qr-connection.tsx @@ -2,6 +2,7 @@ import { Button } from "@openstatus/ui/components/ui/button"; import { Input } from "@openstatus/ui/components/ui/input"; import { Label } from "@openstatus/ui/components/ui/label"; import type { UseFormReturn } from "react-hook-form"; + import type { FormValues } from "../notifications/form-telegram"; import { TelegramManualInput } from "./telegram-manual-input"; import TelegramQRCode from "./telegram-qrcode"; @@ -68,7 +69,7 @@ export function TelegramQRConnection({ {userName && ( -
        +
        {`Connected to: ${userName}`}
        )} diff --git a/apps/dashboard/src/components/forms/components/telegram-qrcode.tsx b/apps/dashboard/src/components/forms/components/telegram-qrcode.tsx index a671cd537..0cf86d872 100644 --- a/apps/dashboard/src/components/forms/components/telegram-qrcode.tsx +++ b/apps/dashboard/src/components/forms/components/telegram-qrcode.tsx @@ -30,7 +30,7 @@ export default function TelegramQRCode({ ) : token ? ( ) : null} -
        +
        {isLoading ? ( "Generating QR Code..." ) : isPolling ? ( diff --git a/apps/dashboard/src/components/forms/components/update.tsx b/apps/dashboard/src/components/forms/components/update.tsx index 9bdc6f5a4..ffd66522d 100644 --- a/apps/dashboard/src/components/forms/components/update.tsx +++ b/apps/dashboard/src/components/forms/components/update.tsx @@ -1,11 +1,13 @@ "use client"; -import { FormComponents } from "@/components/forms/components/form-components"; -import { useTRPC } from "@/lib/trpc/client"; import type { PageConfiguration } from "@openstatus/db/src/schema"; import { useMutation, useQuery } from "@tanstack/react-query"; import { useParams } from "next/navigation"; import { useState } from "react"; + +import { FormComponents } from "@/components/forms/components/form-components"; +import { useTRPC } from "@/lib/trpc/client"; + import { FormCardGroup } from "../form-card"; import { FormConfiguration } from "../status-page/form-configuration"; import { FormImport, type ImportFormValues } from "./form-import"; diff --git a/apps/dashboard/src/components/forms/form-alert-dialog.tsx b/apps/dashboard/src/components/forms/form-alert-dialog.tsx index 537aa1232..c1a248530 100644 --- a/apps/dashboard/src/components/forms/form-alert-dialog.tsx +++ b/apps/dashboard/src/components/forms/form-alert-dialog.tsx @@ -95,7 +95,7 @@ export function FormAlertDialog({ Cancel :last-child]:ml-auto [.border-t]:pt-4", + "flex items-center gap-2 border-t px-4 pb-4 [.border-t]:pt-4 [&>:last-child]:ml-auto", { variants: { variant: { @@ -205,7 +204,7 @@ export function FormCardEmpty({
        ) { return ( {children} @@ -62,7 +62,7 @@ export function FormSheetFooter({ }: React.ComponentProps) { return ( {children} diff --git a/apps/dashboard/src/components/forms/maintenance/form.tsx b/apps/dashboard/src/components/forms/maintenance/form.tsx index aad3c6bc3..c9e59df2f 100644 --- a/apps/dashboard/src/components/forms/maintenance/form.tsx +++ b/apps/dashboard/src/components/forms/maintenance/form.tsx @@ -1,20 +1,5 @@ "use client"; -import { - EmptyStateContainer, - EmptyStateTitle, -} from "@/components/content/empty-state"; -import { ProcessMessage } from "@/components/content/process-message"; -import { - FormCardContent, - FormCardSeparator, -} from "@/components/forms/form-card"; -import { useFormSheetDirty } from "@/components/forms/form-sheet"; -import { - CheckboxTree, - type CheckboxTreeItem, -} from "@/components/ui/checkbox-tree"; -import { useTRPC } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@openstatus/ui/components/ui/button"; import { Calendar } from "@openstatus/ui/components/ui/calendar"; @@ -50,6 +35,22 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { + EmptyStateContainer, + EmptyStateTitle, +} from "@/components/content/empty-state"; +import { ProcessMessage } from "@/components/content/process-message"; +import { + FormCardContent, + FormCardSeparator, +} from "@/components/forms/form-card"; +import { useFormSheetDirty } from "@/components/forms/form-sheet"; +import { + CheckboxTree, + type CheckboxTreeItem, +} from "@/components/ui/checkbox-tree"; +import { useTRPC } from "@/lib/trpc/client"; + const schema = z .object({ title: z.string().min(1, "Title is required"), @@ -245,7 +246,7 @@ export function FormMaintenance({ } }} /> -
        +
        @@ -359,7 +360,7 @@ export function FormMaintenance({ } }} /> -
        +
        @@ -409,7 +410,7 @@ export function FormMaintenance({
        -
        +
        diff --git a/apps/dashboard/src/components/forms/maintenance/sheet.tsx b/apps/dashboard/src/components/forms/maintenance/sheet.tsx index bfe2e0c2a..f178a0a09 100644 --- a/apps/dashboard/src/components/forms/maintenance/sheet.tsx +++ b/apps/dashboard/src/components/forms/maintenance/sheet.tsx @@ -1,5 +1,8 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useState } from "react"; + import { FormCard, FormCardGroup } from "@/components/forms/form-card"; import { FormSheetContent, @@ -16,8 +19,6 @@ import { type FormValues, } from "@/components/forms/maintenance/form"; import type { CheckboxTreeItem } from "@/components/ui/checkbox-tree"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useState } from "react"; export function FormSheetMaintenance({ children, diff --git a/apps/dashboard/src/components/forms/monitor-tag/form-monitor-tag.tsx b/apps/dashboard/src/components/forms/monitor-tag/form-monitor-tag.tsx index 67334e124..741c72d64 100644 --- a/apps/dashboard/src/components/forms/monitor-tag/form-monitor-tag.tsx +++ b/apps/dashboard/src/components/forms/monitor-tag/form-monitor-tag.tsx @@ -1,7 +1,5 @@ "use client"; -import { useFormSheetDirty } from "@/components/forms/form-sheet"; -import { useTRPC } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@openstatus/ui/components/ui/button"; import { @@ -21,6 +19,9 @@ import { useFieldArray, useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { useFormSheetDirty } from "@/components/forms/form-sheet"; +import { useTRPC } from "@/lib/trpc/client"; + const tagSchema = z.object({ id: z.number().optional(), name: z.string().min(1, "Name is required"), diff --git a/apps/dashboard/src/components/forms/monitor-tag/sheet.tsx b/apps/dashboard/src/components/forms/monitor-tag/sheet.tsx index 85fea7e24..3442c4992 100644 --- a/apps/dashboard/src/components/forms/monitor-tag/sheet.tsx +++ b/apps/dashboard/src/components/forms/monitor-tag/sheet.tsx @@ -1,5 +1,8 @@ "use client"; +import { Button } from "@openstatus/ui/components/ui/button"; +import { useState } from "react"; + import { FormCard, FormCardContent, @@ -18,8 +21,6 @@ import { FormMonitorTag, type FormValues, } from "@/components/forms/monitor-tag/form-monitor-tag"; -import { Button } from "@openstatus/ui/components/ui/button"; -import { useState } from "react"; export function FormSheetMonitorTag({ children, diff --git a/apps/dashboard/src/components/forms/monitor/form-follow-redirect.tsx b/apps/dashboard/src/components/forms/monitor/form-follow-redirect.tsx index 3fa4d827e..8c783e303 100644 --- a/apps/dashboard/src/components/forms/monitor/form-follow-redirect.tsx +++ b/apps/dashboard/src/components/forms/monitor/form-follow-redirect.tsx @@ -1,15 +1,5 @@ "use client"; -import { Link } from "@/components/common/link"; -import { - FormCard, - FormCardContent, - FormCardDescription, - FormCardFooter, - FormCardFooterInfo, - FormCardHeader, - FormCardTitle, -} from "@/components/forms/form-card"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@openstatus/ui/components/ui/button"; import { @@ -26,6 +16,17 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { Link } from "@/components/common/link"; +import { + FormCard, + FormCardContent, + FormCardDescription, + FormCardFooter, + FormCardFooterInfo, + FormCardHeader, + FormCardTitle, +} from "@/components/forms/form-card"; + export const FOLLOW_REDIRECTS_DEFAULT = true; const schema = z.object({ diff --git a/apps/dashboard/src/components/forms/monitor/form-general.tsx b/apps/dashboard/src/components/forms/monitor/form-general.tsx index a2ff12e23..aeb4ae5e9 100644 --- a/apps/dashboard/src/components/forms/monitor/form-general.tsx +++ b/apps/dashboard/src/components/forms/monitor/form-general.tsx @@ -1,16 +1,5 @@ "use client"; -import { Link } from "@/components/common/link"; -import { - FormCard, - FormCardContent, - FormCardDescription, - FormCardFooter, - FormCardFooterInfo, - FormCardHeader, - FormCardSeparator, - FormCardTitle, -} from "@/components/forms/form-card"; import { zodResolver } from "@hookform/resolvers/zod"; import { dnsRecords, @@ -71,6 +60,18 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { Link } from "@/components/common/link"; +import { + FormCard, + FormCardContent, + FormCardDescription, + FormCardFooter, + FormCardFooterInfo, + FormCardHeader, + FormCardSeparator, + FormCardTitle, +} from "@/components/forms/form-card"; + const TYPES = ["http", "tcp", "dns"] as const; const HTTP_ASSERTION_TYPES = ["status", "header", "textBody"] as const; const DNS_ASSERTION_TYPES = dnsRecords; @@ -284,7 +285,7 @@ export function FormGeneral({ @@ -315,7 +316,7 @@ export function FormGeneral({ })}
        Missing a type?{" "} @@ -697,24 +698,24 @@ export function FormGeneral({ )} /> -
        +
        Examples:
        • Domain:{" "} - + openstatus.dev:443
        • IPv4:{" "} - + 192.168.1.1:443
        • IPv6:{" "} - + [2001:db8:85a3:8d3:1319:8a2e:370:7348]:443
        • @@ -957,8 +958,8 @@ export function FormGeneral({ failed. Do you want to save the monitor anyway? -
          -

          {error}

          +
          +

          {error}

          Cancel diff --git a/apps/dashboard/src/components/forms/monitor/form-notifiers.tsx b/apps/dashboard/src/components/forms/monitor/form-notifiers.tsx index b68b9457f..12718319b 100644 --- a/apps/dashboard/src/components/forms/monitor/form-notifiers.tsx +++ b/apps/dashboard/src/components/forms/monitor/form-notifiers.tsx @@ -1,18 +1,5 @@ "use client"; -import { - EmptyStateContainer, - EmptyStateTitle, -} from "@/components/content/empty-state"; -import { - FormCard, - FormCardContent, - FormCardDescription, - FormCardFooter, - FormCardHeader, - FormCardTitle, -} from "@/components/forms/form-card"; -import { config } from "@/data/notifications.client"; import { zodResolver } from "@hookform/resolvers/zod"; import type { NotificationProvider } from "@openstatus/db/src/schema"; import { Badge } from "@openstatus/ui/components/ui/badge"; @@ -33,6 +20,20 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { + EmptyStateContainer, + EmptyStateTitle, +} from "@/components/content/empty-state"; +import { + FormCard, + FormCardContent, + FormCardDescription, + FormCardFooter, + FormCardHeader, + FormCardTitle, +} from "@/components/forms/form-card"; +import { config } from "@/data/notifications.client"; + const schema = z.object({ notifiers: z.array(z.number()), }); @@ -160,7 +161,7 @@ export function FormNotifiers({ }} /> - + {item.name}{" "}