diff --git a/apps/web/src/components/analytics/network-overview-analytics-card.tsx b/apps/web/src/components/analytics/network-overview-analytics-card.tsx index 868074d..389a288 100644 --- a/apps/web/src/components/analytics/network-overview-analytics-card.tsx +++ b/apps/web/src/components/analytics/network-overview-analytics-card.tsx @@ -51,7 +51,7 @@ export function NetworkOverviewAnalyticsCard({ label: 'Offline', percent: 100 - speakersPct, }} - footer={`Пиры Established: ${net.peersEstablished}/${net.peersEnabled}`} + footer={`Пиры установлены: ${net.peersEstablished}/${net.peersEnabled}`} /> ) diff --git a/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx b/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx index 39ea5b1..97de9a6 100644 --- a/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx +++ b/apps/web/src/components/dashboard/dashboard-kpi-grid.tsx @@ -82,7 +82,7 @@ function buildKpis({ icon: , iconClassName: 'text-success', value: loading ? '—' : `${network.peersEstablished}/${peersEnabled}`, - label: 'Пиры Established', + label: 'Пиры установлены', footer: ( {loading ? '…' : `${network.peersTotal} в каталоге`} @@ -94,13 +94,13 @@ function buildKpis({ icon: , iconClassName: 'text-warning', value: loading ? '—' : `${network.speakersOnline}/${network.speakersTotal}`, - label: 'Спикеры online', + label: 'Спикеры в сети', footer: ( - {loading ? '…' : 'live-снимок'} + {loading ? '…' : 'онлайн'} ), }, diff --git a/apps/web/src/components/dashboard/dashboard-modules-grid.tsx b/apps/web/src/components/dashboard/dashboard-modules-grid.tsx index 11f6fc5..d779e4e 100644 --- a/apps/web/src/components/dashboard/dashboard-modules-grid.tsx +++ b/apps/web/src/components/dashboard/dashboard-modules-grid.tsx @@ -11,8 +11,8 @@ import { } from 'lucide-react' import { useCallback, useMemo, useState } from 'react' -import { CategoryBadge, ModeBadge } from '@/components/category-badge' -import { DataGridMutedCell, DataGridPrimaryCell } from '@/components/data-grid-cell' +import { CategoryBadge } from '@/components/category-badge' +import { DataGridPrimaryCell } from '@/components/data-grid-cell' import { DashboardFramePanel } from '@/components/dashboard/dashboard-frame-panel' import { Badge } from '@/components/reui/badge' import { DataGrid } from '@/components/reui/data-grid/data-grid' @@ -40,6 +40,7 @@ import { InputGroupButton, InputGroupInput, } from '@evobgp/ui/components/input-group' +import { DATA_GRID_PAGINATION_RU } from '@/lib/data-grid-defaults' import { moduleTypeRu } from '@/lib/ui-labels' import type { ModuleRow } from '@/types/api' import { @@ -51,20 +52,19 @@ import { type SortingState, } from '@tanstack/react-table' -type ModuleSort = 'name' | 'type' | 'priority' | 'last_refreshed_at' +type ModuleSort = 'name' | 'type' | 'priority' type EnabledFilter = 'all' | 'enabled' | 'disabled' const sortLabels: Record = { name: 'Название', type: 'Тип', priority: 'Приоритет', - last_refreshed_at: 'Обновлено', } const EMPTY_MESSAGE = 'Нет модулей по выбранным фильтрам.' function buildSorting(sortBy: ModuleSort): SortingState { - return [{ id: sortBy, desc: sortBy === 'last_refreshed_at' }] + return [{ id: sortBy, desc: false }] } export function DashboardModulesGrid({ @@ -138,30 +138,9 @@ export function DashboardModulesGrid({ cell: ({ row }) => ( {row.original.priority} ), + size: 88, meta: { headerTitle: 'Приоритет' }, }, - { - id: 'enabled', - accessorFn: (row) => (row.enabled !== false ? 'enabled' : 'disabled'), - header: ({ column }) => , - cell: ({ row }) => , - meta: { headerTitle: 'Состояние' }, - }, - { - id: 'last_refreshed_at', - accessorFn: (row) => row.last_refreshed_at ?? '', - header: ({ column }) => , - cell: ({ row }) => ( - - {row.original.last_refreshed_at - ? new Date(row.original.last_refreshed_at).toLocaleString('ru-RU') - : '—'} - - ), - sortingFn: (a, b) => - (a.original.last_refreshed_at ?? '').localeCompare(b.original.last_refreshed_at ?? ''), - meta: { headerTitle: 'Обновлено' }, - }, ], [], ) @@ -337,8 +316,8 @@ export function DashboardModulesGrid({ {filteredModules.length > 0 ? ( ) : ( diff --git a/apps/web/src/components/dashboard/dashboard-network-health.tsx b/apps/web/src/components/dashboard/dashboard-network-health.tsx index 3efadc9..aa5a4dd 100644 --- a/apps/web/src/components/dashboard/dashboard-network-health.tsx +++ b/apps/web/src/components/dashboard/dashboard-network-health.tsx @@ -57,7 +57,7 @@ export function DashboardNetworkHealth({ } primary={{ value: loading ? '—' : `${utilization}%`, - label: mode === 'peers' ? 'Утилизация пиров' : 'Спикеры online', + label: mode === 'peers' ? 'Утилизация пиров' : 'Спикеры в сети', percent: loading ? 0 : utilization, badge: ( @@ -67,7 +67,7 @@ export function DashboardNetworkHealth({ }} secondary={{ value: loading ? '—' : offline, - label: mode === 'peers' ? 'Не Established' : 'Offline', + label: mode === 'peers' ? 'Не установлены' : 'Не в сети', percent: total > 0 ? Math.round((offline / total) * 100) : 0, }} footer={ diff --git a/apps/web/src/components/dashboard/dashboard-quick-links.tsx b/apps/web/src/components/dashboard/dashboard-quick-links.tsx index b073733..7a6c6a9 100644 --- a/apps/web/src/components/dashboard/dashboard-quick-links.tsx +++ b/apps/web/src/components/dashboard/dashboard-quick-links.tsx @@ -7,7 +7,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'lookup', title: 'Проверка IP/домена', - description: 'Membership в списках и community (entry + snapshot).', + description: 'Проверка IP в списках и BGP-сообществах.', to: '/lookup', icon: , iconClassName: 'text-primary', @@ -23,7 +23,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'communities', title: 'BGP-сообщества', - description: 'Справочник communities для политик экспорта.', + description: 'Справочник BGP-сообществ для политик экспорта.', to: '/directories', icon: , iconClassName: 'text-info', @@ -31,7 +31,7 @@ const ACTIONS: QuickActionItem[] = [ { id: 'network', title: 'Сеть', - description: 'Обзор пиров, спикеров и live-сессий BGP.', + description: 'Обзор пиров, спикеров и живых BGP-сессий.', to: '/network', search: { tab: 'overview' }, icon: , diff --git a/apps/web/src/components/network/network-kpi.tsx b/apps/web/src/components/network/network-kpi.tsx index 0568034..75e493e 100644 --- a/apps/web/src/components/network/network-kpi.tsx +++ b/apps/web/src/components/network/network-kpi.tsx @@ -30,7 +30,7 @@ export function NetworkKpi({ id: 'peers-established', icon: , iconClassName: 'text-success', - label: 'Пиры Established', + label: 'Пиры установлены', value: loading ? '—' : `${net.peersEstablished}/${net.peersEnabled}`, footer: ( @@ -44,7 +44,7 @@ export function NetworkKpi({ id: 'speakers-online', icon: , iconClassName: 'text-info', - label: 'Спикеры online', + label: 'Спикеры в сети', value: loading ? '—' : `${net.speakersOnline}/${net.speakersTotal}`, footer: ( - {loading ? '…' : 'live'} + {loading ? '…' : 'онлайн'} ), to: '/network', diff --git a/apps/web/src/components/network/network-peers-card.tsx b/apps/web/src/components/network/network-peers-card.tsx index e2f7d96..60bf245 100644 --- a/apps/web/src/components/network/network-peers-card.tsx +++ b/apps/web/src/components/network/network-peers-card.tsx @@ -32,13 +32,13 @@ function peerDeleteLabel(p: PeerRow): string { const PEER_TABS = [ { id: 'all', label: 'Все' }, - { id: 'established', label: 'Established' }, + { id: 'established', label: 'Установлены' }, { id: 'pending', label: 'Ожидание' }, { id: 'disabled', label: 'Выключены' }, ] const SESSION_STATE_OPTIONS = [ - { value: 'Established', label: 'Established' }, + { value: 'Established', label: 'Установлена' }, { value: 'Idle', label: 'Idle' }, { value: 'Active', label: 'Active' }, { value: 'Connect', label: 'Connect' }, diff --git a/apps/web/src/components/network/peer-form-dialog.tsx b/apps/web/src/components/network/peer-form-dialog.tsx index 09786b1..62ab2cc 100644 --- a/apps/web/src/components/network/peer-form-dialog.tsx +++ b/apps/web/src/components/network/peer-form-dialog.tsx @@ -72,7 +72,7 @@ export function PeerFormDialog({ } const asn = Number(remoteAsn) if (!asn || asn <= 0) { - toast.error('Remote ASN должен быть больше 0') + toast.error('ASN соседа должен быть больше 0') return } const body: BgpPeerCreate = { @@ -132,7 +132,7 @@ export function PeerFormDialog({ /> - Remote ASN + ASN соседа ({ fields={filterFields} onChange={handleFiltersChange} size="default" + i18n={FILTERS_I18N_RU} trigger={ @@ -355,11 +358,8 @@ export function ResourcePage({ diff --git a/apps/web/src/components/reui-kit/settings-shell.tsx b/apps/web/src/components/reui-kit/settings-shell.tsx index e0a40bf..2438329 100644 --- a/apps/web/src/components/reui-kit/settings-shell.tsx +++ b/apps/web/src/components/reui-kit/settings-shell.tsx @@ -43,16 +43,21 @@ interface SettingsShellProps { */ export function SettingsShell({ title = 'Настройки', - description = 'Подключение UI и параметры плоскости управления', + description, tabs = DEFAULT_TABS, }: SettingsShellProps) { const isMobile = useIsMobile() const pathname = useRouterState({ select: (s) => s.location.pathname }) + const headerDescription = + description ?? + (pathname.startsWith('/tenant-settings') + ? 'Глобальные параметры BIRD и плоскости управления' + : 'Подключение UI и параметры плоскости управления') return ( - + v && setFilter(v as JobFilter)}> - + + {FILTER_ITEMS.find((item) => item.value === filter)?.label} + {FILTER_ITEMS.map((item) => ( diff --git a/apps/web/src/lib/filters-i18n.ts b/apps/web/src/lib/filters-i18n.ts new file mode 100644 index 0000000..7f97611 --- /dev/null +++ b/apps/web/src/lib/filters-i18n.ts @@ -0,0 +1,94 @@ +import { + DEFAULT_I18N, + type FilterI18nConfig, +} from '@/components/reui/filters' + +const OPERATOR_LABEL_RU: Record = { + is: 'равно', + is_not: 'не равно', + is_any_of: 'любое из', + is_not_any_of: 'кроме', + includes_all: 'включает все', + excludes_all: 'исключает все', + before: 'до', + after: 'после', + between: 'между', + not_between: 'вне диапазона', + contains: 'содержит', + not_contains: 'не содержит', + starts_with: 'начинается с', + ends_with: 'заканчивается на', + equals: 'равно', + not_equals: 'не равно', + greater_than: 'больше', + less_than: 'меньше', + overlaps: 'пересекается', + includes: 'включает', + excludes: 'исключает', + empty: 'пусто', + not_empty: 'не пусто', +} + +export const FILTERS_I18N_RU: FilterI18nConfig = { + ...DEFAULT_I18N, + addFilter: 'Фильтр', + searchFields: 'Фильтр…', + noFieldsFound: 'Поля не найдены.', + noResultsFound: 'Ничего не найдено.', + select: 'Выбрать…', + true: 'Да', + false: 'Нет', + min: 'Мин.', + max: 'Макс.', + to: '—', + typeAndPressEnter: 'Введите и нажмите Enter', + selected: 'выбрано', + selectedCount: 'выбрано', + addFilterTitle: 'Добавить фильтр', + operators: { + ...DEFAULT_I18N.operators, + is: 'равно', + isNot: 'не равно', + isAnyOf: 'любое из', + isNotAnyOf: 'кроме', + includesAll: 'включает все', + excludesAll: 'исключает все', + before: 'до', + after: 'после', + between: 'между', + notBetween: 'вне диапазона', + contains: 'содержит', + notContains: 'не содержит', + startsWith: 'начинается с', + endsWith: 'заканчивается на', + isExactly: 'точно', + equals: 'равно', + notEquals: 'не равно', + greaterThan: 'больше', + lessThan: 'меньше', + overlaps: 'пересекается', + includes: 'включает', + excludes: 'исключает', + includesAllOf: 'включает все', + includesAnyOf: 'включает любое', + empty: 'пусто', + notEmpty: 'не пусто', + }, + placeholders: { + enterField: (fieldType: string) => `Введите ${fieldType}…`, + selectField: 'Выбрать…', + searchField: (fieldName: string) => `Поиск ${fieldName.toLowerCase()}…`, + enterKey: 'Введите ключ…', + enterValue: 'Введите значение…', + }, + helpers: { + formatOperator: (operator: string) => + OPERATOR_LABEL_RU[operator] ?? operator.replace(/_/g, ' '), + }, + validation: { + invalidEmail: 'Некорректный email', + invalidUrl: 'Некорректный URL', + invalidTel: 'Некорректный телефон', + invalid: 'Некорректное значение', + }, +} diff --git a/apps/web/src/routes/_auth/access.tsx b/apps/web/src/routes/_auth/access.tsx index 9b8cfd8..1204d87 100644 --- a/apps/web/src/routes/_auth/access.tsx +++ b/apps/web/src/routes/_auth/access.tsx @@ -64,7 +64,7 @@ function AccessComponent() { variant: revokedCount > 0 ? 'warning' : 'default', footer: ( 0 ? 'warning-light' : 'outline'} size="sm"> - revoked + отозваны ), }, diff --git a/apps/web/tsconfig.tsbuildinfo b/apps/web/tsconfig.tsbuildinfo index 66fddfb..191b2e9 100644 --- a/apps/web/tsconfig.tsbuildinfo +++ b/apps/web/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/main.tsx","./src/routetree.gen.ts","./src/vite-env.d.ts","./src/components/app-switcher.tsx","./src/components/badge-tabs.tsx","./src/components/category-badge.tsx","./src/components/confirm-dialog.tsx","./src/components/counted-line-tabs.tsx","./src/components/data-grid-cell.tsx","./src/components/data-grid-shell.tsx","./src/components/data-grid-toolbar.tsx","./src/components/drawer-layout.tsx","./src/components/empty-state.tsx","./src/components/form-drawer.tsx","./src/components/kpi-stat-grid.tsx","./src/components/loading-button.tsx","./src/components/page-header.tsx","./src/components/page-shell.tsx","./src/components/panel-card.tsx","./src/components/query-state.tsx","./src/components/select-field.tsx","./src/components/skeletons.tsx","./src/components/status-badge.tsx","./src/components/theme-provider.tsx","./src/components/truncated-text.tsx","./src/components/access/access-api-keys-card.tsx","./src/components/access/access-api-keys-grid.tsx","./src/components/access/api-key-create-dialog.tsx","./src/components/access/api-key-token-dialog.tsx","./src/components/analytics/analytics-activity-list.tsx","./src/components/analytics/analytics-card-shell.tsx","./src/components/analytics/analytics-kpi-row.tsx","./src/components/analytics/analytics-progress.tsx","./src/components/analytics/analytics-segment-control.tsx","./src/components/analytics/chart-bar-strip.tsx","./src/components/analytics/chart-donut-metric.tsx","./src/components/analytics/dashboard-network-capacity-card.tsx","./src/components/analytics/dashboard-operations-flow-card.tsx","./src/components/analytics/dashboard-platform-card.tsx","./src/components/analytics/index.ts","./src/components/analytics/monitoring-health-card.tsx","./src/components/analytics/network-overview-analytics-card.tsx","./src/components/dashboard/card-dot-field.tsx","./src/components/dashboard/dashboard-activity-timeline.tsx","./src/components/dashboard/dashboard-frame-panel.tsx","./src/components/dashboard/dashboard-kpi-grid.tsx","./src/components/dashboard/dashboard-kpi-sparkline-row.tsx","./src/components/dashboard/dashboard-modules-grid.tsx","./src/components/dashboard/dashboard-network-health.tsx","./src/components/dashboard/dashboard-network-panel.tsx","./src/components/dashboard/dashboard-operations-breakdown.tsx","./src/components/dashboard/dashboard-quick-links.tsx","./src/components/dashboard/dashboard-recent-jobs-grid.tsx","./src/components/dashboard/dashboard-recent-revisions-grid.tsx","./src/components/directories/directories-communities-grid.tsx","./src/components/directories/directories-doh-grid.tsx","./src/components/examples/c-input-group-37.tsx","./src/components/examples/c-select-4.tsx","./src/components/examples/c-tabs-2.tsx","./src/components/examples/c-tabs-6.tsx","./src/components/examples/c-tabs-7.tsx","./src/components/layout/app-shell.tsx","./src/components/layout/apps-menu.tsx","./src/components/layout/command-palette.tsx","./src/components/layout/nav-user.tsx","./src/components/layout/system-monitor-popover.tsx","./src/components/lookup/lookup-add-step.tsx","./src/components/lookup/lookup-matches-grid.tsx","./src/components/lookup/lookup-search-form.tsx","./src/components/lookup/lookup-status-banner.tsx","./src/components/lookup/lookup-wizard.tsx","./src/components/modules/community-select.tsx","./src/components/modules/module-as-entry-dialog.tsx","./src/components/modules/module-cdn-source-dialog.tsx","./src/components/modules/module-domain-entry-dialog.tsx","./src/components/modules/module-edit-dialog.tsx","./src/components/modules/module-entries-grid.tsx","./src/components/modules/module-entries-section.tsx","./src/components/modules/module-ip-range-entry-dialog.tsx","./src/components/modules/module-kpi-cards.tsx","./src/components/modules/modules-list-grid.tsx","./src/components/monitoring/monitoring-ready-grid.tsx","./src/components/network/network-discovered-peers-card.tsx","./src/components/network/network-kpi.tsx","./src/components/network/network-peers-card.tsx","./src/components/network/network-peers-grid.tsx","./src/components/network/network-speakers-card.tsx","./src/components/network/network-speakers-grid.tsx","./src/components/network/peer-form-dialog.tsx","./src/components/network/speaker-form-dialog.tsx","./src/components/operations/operations-jobs-card.tsx","./src/components/operations/operations-jobs-grid.tsx","./src/components/operations/operations-revisions-grid.tsx","./src/components/patterns/donut-breakdown-card.tsx","./src/components/patterns/illustrated-empty-state.tsx","./src/components/patterns/index.ts","./src/components/patterns/kpi-sparkline-card.tsx","./src/components/patterns/metric-tone-styles.ts","./src/components/patterns/panel-corners.tsx","./src/components/patterns/projects-empty-state.tsx","./src/components/patterns/segmented-progress-card.tsx","./src/components/reui/alert.tsx","./src/components/reui/autocomplete.tsx","./src/components/reui/badge.tsx","./src/components/reui/date-selector.tsx","./src/components/reui/filters.tsx","./src/components/reui/frame.tsx","./src/components/reui/icon-stack.tsx","./src/components/reui/number-field.tsx","./src/components/reui/rating.tsx","./src/components/reui/stepper.tsx","./src/components/reui/timeline.tsx","./src/components/reui/data-grid/data-grid-column-filter.tsx","./src/components/reui/data-grid/data-grid-column-header.tsx","./src/components/reui/data-grid/data-grid-column-visibility.tsx","./src/components/reui/data-grid/data-grid-pagination.tsx","./src/components/reui/data-grid/data-grid-scroll-area.tsx","./src/components/reui/data-grid/data-grid-table-dnd-rows.tsx","./src/components/reui/data-grid/data-grid-table-dnd.tsx","./src/components/reui/data-grid/data-grid-table-virtual.tsx","./src/components/reui/data-grid/data-grid-table.tsx","./src/components/reui/data-grid/data-grid.tsx","./src/components/reui-kit/detail-panel.tsx","./src/components/reui-kit/filter-utils.ts","./src/components/reui-kit/frame-data-grid.tsx","./src/components/reui-kit/index.ts","./src/components/reui-kit/kpi-cols.ts","./src/components/reui-kit/kpi-stat-grid.tsx","./src/components/reui-kit/ops-dashboard.tsx","./src/components/reui-kit/quick-action-grid.tsx","./src/components/reui-kit/resource-page.tsx","./src/components/reui-kit/settings-shell.tsx","./src/components/schedule/schedule-agenda-panel.tsx","./src/components/schedule/schedule-calendar-view.tsx","./src/components/schedule/schedule-jobs-card.tsx","./src/components/schedule/schedule-jobs-grid.tsx","./src/components/schedule/schedule-modules-grid.tsx","./src/components/settings/appearance-settings-tab.tsx","./src/components/settings/connection-settings-tab.tsx","./src/components/settings/sections-settings-tab.tsx","./src/components/settings/session-settings-tab.tsx","./src/components/settings/settings-kv-grid.tsx","./src/components/settings/settings-page-shell.tsx","./src/components/settings/settings-setting-field.tsx","./src/components/settings/settings-tabs-data.tsx","./src/components/ui/svgs/anthropicblack.tsx","./src/components/ui/svgs/anthropicwhite.tsx","./src/components/ui/svgs/convex.tsx","./src/components/ui/svgs/discord.tsx","./src/components/ui/svgs/gemini.tsx","./src/components/ui/svgs/googlecloud.tsx","./src/components/ui/svgs/hono.tsx","./src/components/ui/svgs/loom.tsx","./src/components/ui/svgs/mintlify.tsx","./src/components/ui/svgs/n8n.tsx","./src/components/ui/svgs/neon.tsx","./src/components/ui/svgs/openai.tsx","./src/components/ui/svgs/openaidark.tsx","./src/components/ui/svgs/paper.tsx","./src/components/ui/svgs/planetscale.tsx","./src/components/ui/svgs/planetscaledark.tsx","./src/components/ui/svgs/prisma.tsx","./src/components/ui/svgs/prismadark.tsx","./src/components/ui/svgs/remixdark.tsx","./src/components/ui/svgs/remixlight.tsx","./src/components/ui/svgs/resendiconblack.tsx","./src/components/ui/svgs/resendiconwhite.tsx","./src/components/ui/svgs/slack.tsx","./src/components/ui/svgs/stripe.tsx","./src/components/ui/svgs/supabase.tsx","./src/components/ui/svgs/zoom.tsx","./src/hooks/use-app-switcher.ts","./src/hooks/use-client-data-grid.ts","./src/hooks/use-copy-to-clipboard.ts","./src/hooks/use-file-upload.ts","./src/hooks/use-mobile.ts","./src/lib/api-client.test.ts","./src/lib/api-client.ts","./src/lib/app-switcher-config.ts","./src/lib/auth.ts","./src/lib/data-grid-defaults.ts","./src/lib/queryclient.ts","./src/lib/router.ts","./src/lib/ui-labels.ts","./src/lib/ui-surface.ts","./src/lib/access/api-key-labels.ts","./src/lib/metrics/deployment-progress.ts","./src/lib/metrics/index.ts","./src/lib/metrics/job-status-breakdown.ts","./src/lib/metrics/module-type-breakdown.ts","./src/lib/metrics/peer-capacity-bars.ts","./src/lib/metrics/peer-session-breakdown.ts","./src/lib/metrics/readiness-breakdown.ts","./src/lib/metrics/recent-platform-activity.ts","./src/lib/metrics/types.ts","./src/lib/modules/display.ts","./src/lib/modules/helpers.ts","./src/queries/api-keys.ts","./src/queries/app-switcher.ts","./src/queries/auth.ts","./src/queries/directories.ts","./src/queries/lookup.ts","./src/queries/modules.ts","./src/queries/monitoring.ts","./src/queries/network.ts","./src/queries/operations.ts","./src/queries/overview.ts","./src/queries/settings.ts","./src/routes/__root.tsx","./src/routes/_auth.tsx","./src/routes/auth.callback.tsx","./src/routes/index.tsx","./src/routes/_auth/access.tsx","./src/routes/_auth/dashboard.tsx","./src/routes/_auth/directories.tsx","./src/routes/_auth/lookup.tsx","./src/routes/_auth/monitoring.tsx","./src/routes/_auth/network.tsx","./src/routes/_auth/operations.tsx","./src/routes/_auth/schedule.tsx","./src/routes/_auth/settings.tsx","./src/routes/_auth/tenant-settings.tsx","./src/routes/_auth/modules/$moduleid.tsx","./src/routes/_auth/modules/index.tsx","./src/routes/_auth/modules/new.tsx","./src/types/api.gen.ts","./src/types/api.ts","./vite.config.ts"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/main.tsx","./src/routetree.gen.ts","./src/vite-env.d.ts","./src/components/app-switcher.tsx","./src/components/badge-tabs.tsx","./src/components/category-badge.tsx","./src/components/confirm-dialog.tsx","./src/components/counted-line-tabs.tsx","./src/components/data-grid-cell.tsx","./src/components/data-grid-shell.tsx","./src/components/data-grid-toolbar.tsx","./src/components/empty-state.tsx","./src/components/form-drawer.tsx","./src/components/kpi-stat-grid.tsx","./src/components/loading-button.tsx","./src/components/page-header.tsx","./src/components/page-shell.tsx","./src/components/panel-card.tsx","./src/components/query-state.tsx","./src/components/select-field.tsx","./src/components/skeletons.tsx","./src/components/status-badge.tsx","./src/components/theme-provider.tsx","./src/components/truncated-text.tsx","./src/components/access/access-api-keys-card.tsx","./src/components/access/access-api-keys-grid.tsx","./src/components/access/api-key-create-dialog.tsx","./src/components/access/api-key-token-dialog.tsx","./src/components/analytics/analytics-activity-list.tsx","./src/components/analytics/analytics-card-shell.tsx","./src/components/analytics/analytics-kpi-row.tsx","./src/components/analytics/analytics-progress.tsx","./src/components/analytics/analytics-segment-control.tsx","./src/components/analytics/chart-bar-strip.tsx","./src/components/analytics/chart-donut-metric.tsx","./src/components/analytics/dashboard-network-capacity-card.tsx","./src/components/analytics/dashboard-operations-flow-card.tsx","./src/components/analytics/dashboard-platform-card.tsx","./src/components/analytics/index.ts","./src/components/analytics/monitoring-health-card.tsx","./src/components/analytics/network-overview-analytics-card.tsx","./src/components/dashboard/card-dot-field.tsx","./src/components/dashboard/dashboard-activity-timeline.tsx","./src/components/dashboard/dashboard-frame-panel.tsx","./src/components/dashboard/dashboard-kpi-grid.tsx","./src/components/dashboard/dashboard-kpi-sparkline-row.tsx","./src/components/dashboard/dashboard-modules-grid.tsx","./src/components/dashboard/dashboard-network-health.tsx","./src/components/dashboard/dashboard-network-panel.tsx","./src/components/dashboard/dashboard-operations-breakdown.tsx","./src/components/dashboard/dashboard-quick-links.tsx","./src/components/dashboard/dashboard-recent-jobs-grid.tsx","./src/components/dashboard/dashboard-recent-revisions-grid.tsx","./src/components/directories/community-create-dialog.tsx","./src/components/directories/directories-communities-grid.tsx","./src/components/directories/directories-doh-grid.tsx","./src/components/directories/directories-row-actions.tsx","./src/components/directories/doh-profile-create-dialog.tsx","./src/components/examples/c-input-group-37.tsx","./src/components/examples/c-select-4.tsx","./src/components/examples/c-tabs-2.tsx","./src/components/examples/c-tabs-6.tsx","./src/components/examples/c-tabs-7.tsx","./src/components/layout/app-shell.tsx","./src/components/layout/apps-menu.tsx","./src/components/layout/command-palette.tsx","./src/components/layout/nav-user.tsx","./src/components/layout/system-monitor-popover.tsx","./src/components/lookup/lookup-add-step.tsx","./src/components/lookup/lookup-matches-grid.tsx","./src/components/lookup/lookup-search-form.tsx","./src/components/lookup/lookup-status-banner.tsx","./src/components/lookup/lookup-wizard.tsx","./src/components/modules/community-select.tsx","./src/components/modules/module-as-entry-dialog.tsx","./src/components/modules/module-cdn-source-dialog.tsx","./src/components/modules/module-domain-entry-dialog.tsx","./src/components/modules/module-edit-dialog.tsx","./src/components/modules/module-entries-grid.tsx","./src/components/modules/module-entries-section.tsx","./src/components/modules/module-ip-range-entry-dialog.tsx","./src/components/modules/module-kpi-cards.tsx","./src/components/modules/modules-list-grid.tsx","./src/components/monitoring/monitoring-ready-grid.tsx","./src/components/network/network-discovered-peers-card.tsx","./src/components/network/network-kpi.tsx","./src/components/network/network-peers-card.tsx","./src/components/network/network-peers-grid.tsx","./src/components/network/network-speakers-card.tsx","./src/components/network/network-speakers-grid.tsx","./src/components/network/peer-form-dialog.tsx","./src/components/network/speaker-form-dialog.tsx","./src/components/operations/operations-jobs-card.tsx","./src/components/operations/operations-jobs-grid.tsx","./src/components/operations/operations-revisions-grid.tsx","./src/components/patterns/donut-breakdown-card.tsx","./src/components/patterns/illustrated-empty-state.tsx","./src/components/patterns/index.ts","./src/components/patterns/kpi-sparkline-card.tsx","./src/components/patterns/metric-tone-styles.ts","./src/components/patterns/panel-corners.tsx","./src/components/patterns/projects-empty-state.tsx","./src/components/patterns/segmented-progress-card.tsx","./src/components/reui/alert.tsx","./src/components/reui/autocomplete.tsx","./src/components/reui/badge.tsx","./src/components/reui/date-selector.tsx","./src/components/reui/filters.tsx","./src/components/reui/frame.tsx","./src/components/reui/icon-stack.tsx","./src/components/reui/icon-tile.tsx","./src/components/reui/number-field.tsx","./src/components/reui/rating.tsx","./src/components/reui/stepper.tsx","./src/components/reui/timeline.tsx","./src/components/reui/data-grid/data-grid-column-filter.tsx","./src/components/reui/data-grid/data-grid-column-header.tsx","./src/components/reui/data-grid/data-grid-column-visibility.tsx","./src/components/reui/data-grid/data-grid-pagination.tsx","./src/components/reui/data-grid/data-grid-scroll-area.tsx","./src/components/reui/data-grid/data-grid-table-dnd-rows.tsx","./src/components/reui/data-grid/data-grid-table-dnd.tsx","./src/components/reui/data-grid/data-grid-table-virtual.tsx","./src/components/reui/data-grid/data-grid-table.tsx","./src/components/reui/data-grid/data-grid.tsx","./src/components/reui-kit/detail-panel.tsx","./src/components/reui-kit/filter-utils.ts","./src/components/reui-kit/frame-data-grid.tsx","./src/components/reui-kit/index.ts","./src/components/reui-kit/kpi-cols.ts","./src/components/reui-kit/kpi-stat-grid.tsx","./src/components/reui-kit/ops-dashboard.tsx","./src/components/reui-kit/quick-action-grid.tsx","./src/components/reui-kit/resource-page.tsx","./src/components/reui-kit/settings-shell.tsx","./src/components/schedule/schedule-agenda-panel.tsx","./src/components/schedule/schedule-calendar-view.tsx","./src/components/schedule/schedule-jobs-card.tsx","./src/components/schedule/schedule-jobs-grid.tsx","./src/components/schedule/schedule-modules-grid.tsx","./src/components/settings/appearance-settings-tab.tsx","./src/components/settings/connection-settings-tab.tsx","./src/components/settings/sections-settings-tab.tsx","./src/components/settings/session-settings-tab.tsx","./src/components/settings/setting-row.tsx","./src/components/settings/settings-card.tsx","./src/components/settings/settings-field-group.tsx","./src/components/settings/settings-kv-grid.tsx","./src/components/settings/settings-page-shell.tsx","./src/components/settings/settings-setting-field.tsx","./src/components/settings/settings-tabs-data.tsx","./src/components/ui/svgs/anthropicblack.tsx","./src/components/ui/svgs/anthropicwhite.tsx","./src/components/ui/svgs/convex.tsx","./src/components/ui/svgs/discord.tsx","./src/components/ui/svgs/gemini.tsx","./src/components/ui/svgs/googlecloud.tsx","./src/components/ui/svgs/hono.tsx","./src/components/ui/svgs/loom.tsx","./src/components/ui/svgs/mintlify.tsx","./src/components/ui/svgs/n8n.tsx","./src/components/ui/svgs/neon.tsx","./src/components/ui/svgs/openai.tsx","./src/components/ui/svgs/openaidark.tsx","./src/components/ui/svgs/paper.tsx","./src/components/ui/svgs/planetscale.tsx","./src/components/ui/svgs/planetscaledark.tsx","./src/components/ui/svgs/prisma.tsx","./src/components/ui/svgs/prismadark.tsx","./src/components/ui/svgs/remixdark.tsx","./src/components/ui/svgs/remixlight.tsx","./src/components/ui/svgs/resendiconblack.tsx","./src/components/ui/svgs/resendiconwhite.tsx","./src/components/ui/svgs/slack.tsx","./src/components/ui/svgs/stripe.tsx","./src/components/ui/svgs/supabase.tsx","./src/components/ui/svgs/zoom.tsx","./src/hooks/use-app-switcher.ts","./src/hooks/use-client-data-grid.ts","./src/hooks/use-copy-to-clipboard.ts","./src/hooks/use-file-upload.ts","./src/hooks/use-mobile.ts","./src/lib/api-client.test.ts","./src/lib/api-client.ts","./src/lib/app-switcher-config.ts","./src/lib/auth.ts","./src/lib/data-grid-defaults.ts","./src/lib/filters-i18n.ts","./src/lib/queryclient.ts","./src/lib/router.ts","./src/lib/ui-labels.ts","./src/lib/ui-surface.ts","./src/lib/access/api-key-labels.ts","./src/lib/metrics/deployment-progress.ts","./src/lib/metrics/index.ts","./src/lib/metrics/job-status-breakdown.ts","./src/lib/metrics/module-type-breakdown.ts","./src/lib/metrics/peer-capacity-bars.ts","./src/lib/metrics/peer-session-breakdown.ts","./src/lib/metrics/readiness-breakdown.test.ts","./src/lib/metrics/readiness-breakdown.ts","./src/lib/metrics/recent-platform-activity.ts","./src/lib/metrics/types.ts","./src/lib/modules/display.ts","./src/lib/modules/helpers.ts","./src/queries/api-keys.ts","./src/queries/app-switcher.ts","./src/queries/auth.ts","./src/queries/directories.ts","./src/queries/lookup.ts","./src/queries/modules.ts","./src/queries/monitoring.ts","./src/queries/network.ts","./src/queries/operations.ts","./src/queries/overview.ts","./src/queries/settings.ts","./src/routes/__root.tsx","./src/routes/_auth.tsx","./src/routes/auth.callback.tsx","./src/routes/index.tsx","./src/routes/_auth/_settings.tsx","./src/routes/_auth/access.tsx","./src/routes/_auth/dashboard.tsx","./src/routes/_auth/directories.tsx","./src/routes/_auth/lookup.tsx","./src/routes/_auth/monitoring.tsx","./src/routes/_auth/network.tsx","./src/routes/_auth/operations.tsx","./src/routes/_auth/schedule.tsx","./src/routes/_auth/_settings/settings.tsx","./src/routes/_auth/_settings/tenant-settings.tsx","./src/routes/_auth/modules/$moduleid.tsx","./src/routes/_auth/modules/index.tsx","./src/routes/_auth/modules/new.tsx","./src/types/api.gen.ts","./src/types/api.ts","./vite.config.ts"],"version":"5.9.3"} \ No newline at end of file