spine-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.framework/README.md +129 -0
- package/.framework/cli/bin.cjs +14 -0
- package/.framework/cli/commands/agents.ts +153 -0
- package/.framework/cli/commands/auth.ts +94 -0
- package/.framework/cli/commands/create-app.ts +185 -0
- package/.framework/cli/commands/dev.ts +295 -0
- package/.framework/cli/commands/doctor.ts +442 -0
- package/.framework/cli/commands/generate.ts +332 -0
- package/.framework/cli/commands/init.ts +272 -0
- package/.framework/cli/commands/install-app.ts +391 -0
- package/.framework/cli/commands/items.ts +253 -0
- package/.framework/cli/commands/migrations.ts +141 -0
- package/.framework/cli/commands/pipelines.ts +166 -0
- package/.framework/cli/commands/status.ts +197 -0
- package/.framework/cli/commands/system.ts +184 -0
- package/.framework/cli/commands/test.ts +227 -0
- package/.framework/cli/commands/uninstall-app.ts +166 -0
- package/.framework/cli/context.ts +268 -0
- package/.framework/cli/env-loader.ts +36 -0
- package/.framework/cli/index.ts +106 -0
- package/.framework/cli/welcome.cjs +45 -0
- package/.framework/docs/API.md +384 -0
- package/.framework/docs/STABILITY.md +52 -0
- package/.framework/docs/admin-routes.md +76 -0
- package/.framework/docs/api-docs-progress.md +38 -0
- package/.framework/docs/api-governance.md +146 -0
- package/.framework/docs/api-testing-results.md +212 -0
- package/.framework/docs/apis/admin-configs.md +567 -0
- package/.framework/docs/apis/admin-data.md +272 -0
- package/.framework/docs/apis/index.md +231 -0
- package/.framework/docs/apis/internal.md +295 -0
- package/.framework/docs/apis/runtime.md +537 -0
- package/.framework/docs/assembly-launch-guide.md +138 -0
- package/.framework/docs/audit-results.md +590 -0
- package/.framework/docs/authorization-model.md +170 -0
- package/.framework/docs/db-api-inventory.md +95 -0
- package/.framework/docs/examples/custom-app/README.md +77 -0
- package/.framework/docs/examples/custom-function/README.md +27 -0
- package/.framework/docs/examples/custom-function/handler.ts +48 -0
- package/.framework/docs/examples/custom-webhook/README.md +68 -0
- package/.framework/docs/gap-remediation-backlog.md +103 -0
- package/.framework/docs/guides/cli-guide.md +224 -0
- package/.framework/docs/guides/getting-started.md +103 -0
- package/.framework/docs/guides/import-guide.md +193 -0
- package/.framework/docs/guides/testing-guide.md +229 -0
- package/.framework/docs/permission-examples.md +326 -0
- package/.framework/docs/ui-adoption-verification.md +111 -0
- package/.framework/docs/ui-api-coverage.md +84 -0
- package/.framework/docs/v2-compatibility-audit.md +228 -0
- package/.framework/functions/.gitkeep +1 -0
- package/.framework/functions/_shared/agent-runner.ts +1097 -0
- package/.framework/functions/_shared/app-manifest.ts +184 -0
- package/.framework/functions/_shared/audit.ts +150 -0
- package/.framework/functions/_shared/db.ts +174 -0
- package/.framework/functions/_shared/index.ts +382 -0
- package/.framework/functions/_shared/middleware.ts +490 -0
- package/.framework/functions/_shared/permissions.ts +1325 -0
- package/.framework/functions/_shared/pipeline-runner.ts +731 -0
- package/.framework/functions/_shared/principal.ts +760 -0
- package/.framework/functions/_shared/schema-utils.ts +967 -0
- package/.framework/functions/_shared/testing.ts +258 -0
- package/.framework/functions/_shared/trigger-engine.ts +425 -0
- package/.framework/functions/_shared/webhook-registration.ts +168 -0
- package/.framework/functions/_shared/webhook-registry.ts +129 -0
- package/.framework/functions/account-nodes.ts +111 -0
- package/.framework/functions/admin-data.ts +606 -0
- package/.framework/functions/ai-agents.ts +323 -0
- package/.framework/functions/api-keys.ts +376 -0
- package/.framework/functions/apps.ts +483 -0
- package/.framework/functions/auth.ts +196 -0
- package/.framework/functions/debug-auth.ts +107 -0
- package/.framework/functions/embeddings.ts +556 -0
- package/.framework/functions/integration-routes.ts +523 -0
- package/.framework/functions/integrations.ts +319 -0
- package/.framework/functions/item-progress.ts +272 -0
- package/.framework/functions/logs.ts +438 -0
- package/.framework/functions/observability.ts +275 -0
- package/.framework/functions/pipeline-executions.ts +494 -0
- package/.framework/functions/pipelines.ts +485 -0
- package/.framework/functions/prompt-configs.ts +339 -0
- package/.framework/functions/roles.ts +387 -0
- package/.framework/functions/system-cron.ts +742 -0
- package/.framework/functions/system.ts +323 -0
- package/.framework/functions/tests.ts +119 -0
- package/.framework/functions/timers.ts +357 -0
- package/.framework/functions/triggers.ts +563 -0
- package/.framework/functions/types.ts +604 -0
- package/.framework/migrations/000_foundation.sql +1256 -0
- package/.framework/migrations/001_seed.sql +92 -0
- package/.framework/migrations/002_seed_constraints.sql +13 -0
- package/.framework/migrations/003_auth_user_trigger.sql +59 -0
- package/.framework/src/App.tsx +126 -0
- package/.framework/src/apps/admin/index.tsx +173 -0
- package/.framework/src/components/AppWrapper.tsx +56 -0
- package/.framework/src/components/CustomAppLoader.tsx +116 -0
- package/.framework/src/components/admin/AdminListPage.tsx +151 -0
- package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
- package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
- package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
- package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
- package/.framework/src/components/app-sidebar.tsx +228 -0
- package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
- package/.framework/src/components/layout/AppShell.tsx +91 -0
- package/.framework/src/components/layout/Header.tsx +88 -0
- package/.framework/src/components/layout/Layout.tsx +95 -0
- package/.framework/src/components/layout/Sidebar.tsx +329 -0
- package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
- package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
- package/.framework/src/components/runtime/DataFilters.tsx +91 -0
- package/.framework/src/components/runtime/DataHeader.tsx +68 -0
- package/.framework/src/components/runtime/DataListPage.tsx +124 -0
- package/.framework/src/components/runtime/DataStats.tsx +70 -0
- package/.framework/src/components/runtime/DataTable.tsx +174 -0
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
- package/.framework/src/components/runtime/index.ts +18 -0
- package/.framework/src/components/search-form.tsx +29 -0
- package/.framework/src/components/shared/AgentView.tsx +213 -0
- package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
- package/.framework/src/components/shared/SchemaFields.tsx +226 -0
- package/.framework/src/components/ui/DataTable.tsx +343 -0
- package/.framework/src/components/ui/Form.tsx +281 -0
- package/.framework/src/components/ui/ItemCard.tsx +296 -0
- package/.framework/src/components/ui/ItemListView.tsx +308 -0
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
- package/.framework/src/components/ui/Modal.tsx +61 -0
- package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
- package/.framework/src/components/ui/accordion.tsx +82 -0
- package/.framework/src/components/ui/alert-dialog.tsx +197 -0
- package/.framework/src/components/ui/alert.tsx +76 -0
- package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
- package/.framework/src/components/ui/avatar.tsx +110 -0
- package/.framework/src/components/ui/badge.tsx +49 -0
- package/.framework/src/components/ui/breadcrumb.tsx +122 -0
- package/.framework/src/components/ui/button-group.tsx +83 -0
- package/.framework/src/components/ui/button.tsx +65 -0
- package/.framework/src/components/ui/calendar.tsx +222 -0
- package/.framework/src/components/ui/card.tsx +100 -0
- package/.framework/src/components/ui/carousel.tsx +240 -0
- package/.framework/src/components/ui/chart.tsx +373 -0
- package/.framework/src/components/ui/checkbox.tsx +31 -0
- package/.framework/src/components/ui/collapsible.tsx +33 -0
- package/.framework/src/components/ui/combobox.tsx +299 -0
- package/.framework/src/components/ui/command.tsx +193 -0
- package/.framework/src/components/ui/context-menu.tsx +261 -0
- package/.framework/src/components/ui/dialog.tsx +165 -0
- package/.framework/src/components/ui/direction.tsx +22 -0
- package/.framework/src/components/ui/drawer.tsx +132 -0
- package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
- package/.framework/src/components/ui/empty.tsx +104 -0
- package/.framework/src/components/ui/field.tsx +238 -0
- package/.framework/src/components/ui/hover-card.tsx +42 -0
- package/.framework/src/components/ui/input-group.tsx +153 -0
- package/.framework/src/components/ui/input-otp.tsx +87 -0
- package/.framework/src/components/ui/input.tsx +19 -0
- package/.framework/src/components/ui/item.tsx +196 -0
- package/.framework/src/components/ui/kbd.tsx +26 -0
- package/.framework/src/components/ui/label.tsx +22 -0
- package/.framework/src/components/ui/menubar.tsx +277 -0
- package/.framework/src/components/ui/native-select.tsx +61 -0
- package/.framework/src/components/ui/navigation-menu.tsx +164 -0
- package/.framework/src/components/ui/pagination.tsx +129 -0
- package/.framework/src/components/ui/popover.tsx +87 -0
- package/.framework/src/components/ui/progress.tsx +31 -0
- package/.framework/src/components/ui/radio-group.tsx +42 -0
- package/.framework/src/components/ui/resizable.tsx +50 -0
- package/.framework/src/components/ui/scroll-area.tsx +53 -0
- package/.framework/src/components/ui/select.tsx +195 -0
- package/.framework/src/components/ui/separator.tsx +26 -0
- package/.framework/src/components/ui/sheet.tsx +145 -0
- package/.framework/src/components/ui/sidebar.tsx +706 -0
- package/.framework/src/components/ui/skeleton.tsx +13 -0
- package/.framework/src/components/ui/slider.tsx +59 -0
- package/.framework/src/components/ui/sonner.tsx +47 -0
- package/.framework/src/components/ui/spinner.tsx +10 -0
- package/.framework/src/components/ui/switch.tsx +33 -0
- package/.framework/src/components/ui/table-primitives.tsx +141 -0
- package/.framework/src/components/ui/table.tsx +114 -0
- package/.framework/src/components/ui/tabs.tsx +90 -0
- package/.framework/src/components/ui/textarea.tsx +18 -0
- package/.framework/src/components/ui/toggle-group.tsx +89 -0
- package/.framework/src/components/ui/toggle.tsx +45 -0
- package/.framework/src/components/ui/tooltip.tsx +57 -0
- package/.framework/src/contexts/AppContext.tsx +133 -0
- package/.framework/src/contexts/AuthContext.tsx +371 -0
- package/.framework/src/hooks/use-mobile.ts +19 -0
- package/.framework/src/hooks/useApi.ts +526 -0
- package/.framework/src/hooks/useApps.ts +114 -0
- package/.framework/src/hooks/useEntityList.ts +190 -0
- package/.framework/src/hooks/useEntityRecord.ts +308 -0
- package/.framework/src/hooks/useForm.ts +307 -0
- package/.framework/src/hooks/useListSchema.ts +264 -0
- package/.framework/src/hooks/useSchemaRecord.ts +223 -0
- package/.framework/src/index.css +128 -0
- package/.framework/src/lib/api.ts +156 -0
- package/.framework/src/lib/supabase.ts +94 -0
- package/.framework/src/lib/utils.ts +317 -0
- package/.framework/src/main.tsx +27 -0
- package/.framework/src/pages/DashboardPage.tsx +181 -0
- package/.framework/src/pages/NotFoundPage.tsx +39 -0
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
- package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
- package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
- package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
- package/.framework/src/pages/admin/AppsPage.tsx +355 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
- package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
- package/.framework/src/pages/admin/LogsPage.tsx +283 -0
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
- package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
- package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
- package/.framework/src/pages/admin/RolesPage.tsx +292 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
- package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
- package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
- package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
- package/.framework/src/pages/admin/TimersPage.tsx +376 -0
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
- package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
- package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
- package/.framework/src/pages/admin/TypesPage.tsx +295 -0
- package/.framework/src/pages/auth/LoginPage.tsx +188 -0
- package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
- package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
- package/.framework/src/types/auth.ts +125 -0
- package/.framework/src/types/types.ts +407 -0
- package/STRUCTURE.md +150 -0
- package/config/components.json +25 -0
- package/config/deno.lock +108 -0
- package/config/package-lock.json +17183 -0
- package/config/postcss.config.cjs +10 -0
- package/config/tailwind.config.cjs +78 -0
- package/config/tsconfig.build.json +32 -0
- package/config/tsconfig.cli.json +18 -0
- package/config/tsconfig.json +41 -0
- package/config/tsconfig.node.json +17 -0
- package/config/tsconfig.node.tsbuildinfo +1 -0
- package/config/tsconfig.tsbuildinfo +1 -0
- package/config/typedoc.json +16 -0
- package/config/vite.config.d.ts +2 -0
- package/config/vite.config.ts +72 -0
- package/dist/cli/commands/agents.d.ts +39 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/auth.d.ts +36 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/create-app.d.ts +23 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +39 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +42 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +36 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +30 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts +30 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -0
- package/dist/cli/commands/items.d.ts +45 -0
- package/dist/cli/commands/items.d.ts.map +1 -0
- package/dist/cli/commands/migrations.d.ts +41 -0
- package/dist/cli/commands/migrations.d.ts.map +1 -0
- package/dist/cli/commands/pipelines.d.ts +40 -0
- package/dist/cli/commands/pipelines.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +23 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/system.d.ts +29 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/test.d.ts +46 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-app.d.ts +23 -0
- package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
- package/dist/cli/context.d.ts +88 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/env-loader.d.ts +14 -0
- package/dist/cli/env-loader.d.ts.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/functions/_shared/agent-runner.d.ts +156 -0
- package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
- package/dist/functions/_shared/app-manifest.d.ts +68 -0
- package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
- package/dist/functions/_shared/audit.d.ts +91 -0
- package/dist/functions/_shared/audit.d.ts.map +1 -0
- package/dist/functions/_shared/db.d.ts +125 -0
- package/dist/functions/_shared/db.d.ts.map +1 -0
- package/dist/functions/_shared/index.d.ts +298 -0
- package/dist/functions/_shared/index.d.ts.map +1 -0
- package/dist/functions/_shared/middleware.d.ts +315 -0
- package/dist/functions/_shared/middleware.d.ts.map +1 -0
- package/dist/functions/_shared/permissions.d.ts +626 -0
- package/dist/functions/_shared/permissions.d.ts.map +1 -0
- package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
- package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
- package/dist/functions/_shared/principal.d.ts +284 -0
- package/dist/functions/_shared/principal.d.ts.map +1 -0
- package/dist/functions/_shared/schema-utils.d.ts +181 -0
- package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
- package/dist/functions/_shared/testing.d.ts +172 -0
- package/dist/functions/_shared/testing.d.ts.map +1 -0
- package/dist/functions/_shared/trigger-engine.d.ts +140 -0
- package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registration.d.ts +81 -0
- package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registry.d.ts +57 -0
- package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
- package/dist/functions/account-nodes.d.ts +48 -0
- package/dist/functions/account-nodes.d.ts.map +1 -0
- package/dist/functions/admin-data.d.ts +178 -0
- package/dist/functions/admin-data.d.ts.map +1 -0
- package/dist/functions/ai-agents.d.ts +125 -0
- package/dist/functions/ai-agents.d.ts.map +1 -0
- package/dist/functions/api-keys.d.ts +140 -0
- package/dist/functions/api-keys.d.ts.map +1 -0
- package/dist/functions/apps.d.ts +163 -0
- package/dist/functions/apps.d.ts.map +1 -0
- package/dist/functions/auth.d.ts +74 -0
- package/dist/functions/auth.d.ts.map +1 -0
- package/dist/functions/debug-auth.d.ts +33 -0
- package/dist/functions/debug-auth.d.ts.map +1 -0
- package/dist/functions/embeddings.d.ts +205 -0
- package/dist/functions/embeddings.d.ts.map +1 -0
- package/dist/functions/integration-routes.d.ts +45 -0
- package/dist/functions/integration-routes.d.ts.map +1 -0
- package/dist/functions/integrations.d.ts +124 -0
- package/dist/functions/integrations.d.ts.map +1 -0
- package/dist/functions/item-progress.d.ts +41 -0
- package/dist/functions/item-progress.d.ts.map +1 -0
- package/dist/functions/logs.d.ts +162 -0
- package/dist/functions/logs.d.ts.map +1 -0
- package/dist/functions/observability.d.ts +123 -0
- package/dist/functions/observability.d.ts.map +1 -0
- package/dist/functions/pipeline-executions.d.ts +190 -0
- package/dist/functions/pipeline-executions.d.ts.map +1 -0
- package/dist/functions/pipelines.d.ts +171 -0
- package/dist/functions/pipelines.d.ts.map +1 -0
- package/dist/functions/prompt-configs.d.ts +125 -0
- package/dist/functions/prompt-configs.d.ts.map +1 -0
- package/dist/functions/roles.d.ts +118 -0
- package/dist/functions/roles.d.ts.map +1 -0
- package/dist/functions/system-cron.d.ts +65 -0
- package/dist/functions/system-cron.d.ts.map +1 -0
- package/dist/functions/system.d.ts +29 -0
- package/dist/functions/system.d.ts.map +1 -0
- package/dist/functions/tests.d.ts +28 -0
- package/dist/functions/tests.d.ts.map +1 -0
- package/dist/functions/timers.d.ts +139 -0
- package/dist/functions/timers.d.ts.map +1 -0
- package/dist/functions/triggers.d.ts +203 -0
- package/dist/functions/triggers.d.ts.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +364 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/package.json +192 -0
- package/scripts/app-install-cli.ts +286 -0
- package/scripts/assemble-frontend.sh +79 -0
- package/scripts/assemble-functions.sh +62 -0
- package/scripts/assemble.sh +35 -0
- package/scripts/boundary-check.sh +106 -0
- package/scripts/build-manifest.sh +80 -0
- package/scripts/check-core-integrity.sh +82 -0
- package/scripts/ingest-chunks.cjs +202 -0
- package/scripts/kb-chunk-parser.cjs +312 -0
- package/scripts/kb-chunk-parser.ts +330 -0
- package/scripts/load-test-app-install.ts +484 -0
- package/scripts/netlify-dev-wrapper.sh +22 -0
- package/scripts/verify-integrity.sh +69 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/pages/admin/DesignedPage
|
|
3
|
+
* @audience installer
|
|
4
|
+
* @layer frontend-page
|
|
5
|
+
* @stability testing
|
|
6
|
+
*
|
|
7
|
+
* A properly designed page with left navigation and content area.
|
|
8
|
+
* Demonstrates shadcn components in a real application context.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { useState } from 'react'
|
|
12
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
|
|
13
|
+
import { Button } from '../../components/ui/button'
|
|
14
|
+
import { Input } from '../../components/ui/input'
|
|
15
|
+
import { Label } from '../../components/ui/label'
|
|
16
|
+
import { Badge } from '../../components/ui/badge'
|
|
17
|
+
import {
|
|
18
|
+
Select,
|
|
19
|
+
SelectContent,
|
|
20
|
+
SelectItem,
|
|
21
|
+
SelectTrigger,
|
|
22
|
+
SelectValue,
|
|
23
|
+
} from '../../components/ui/select'
|
|
24
|
+
import { Checkbox } from '../../components/ui/checkbox'
|
|
25
|
+
import { Switch } from '../../components/ui/switch'
|
|
26
|
+
import { Separator } from '../../components/ui/separator'
|
|
27
|
+
import {
|
|
28
|
+
Dialog,
|
|
29
|
+
DialogContent,
|
|
30
|
+
DialogDescription,
|
|
31
|
+
DialogHeader,
|
|
32
|
+
DialogTitle,
|
|
33
|
+
DialogTrigger,
|
|
34
|
+
} from '../../components/ui/dialog'
|
|
35
|
+
import {
|
|
36
|
+
Tabs,
|
|
37
|
+
TabsContent,
|
|
38
|
+
TabsList,
|
|
39
|
+
TabsTrigger,
|
|
40
|
+
} from '../../components/ui/tabs'
|
|
41
|
+
import {
|
|
42
|
+
Accordion,
|
|
43
|
+
AccordionContent,
|
|
44
|
+
AccordionItem,
|
|
45
|
+
AccordionTrigger,
|
|
46
|
+
} from '../../components/ui/accordion'
|
|
47
|
+
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
48
|
+
import {
|
|
49
|
+
DropdownMenu,
|
|
50
|
+
DropdownMenuContent,
|
|
51
|
+
DropdownMenuItem,
|
|
52
|
+
DropdownMenuLabel,
|
|
53
|
+
DropdownMenuSeparator,
|
|
54
|
+
DropdownMenuTrigger,
|
|
55
|
+
} from '../../components/ui/dropdown-menu'
|
|
56
|
+
import {
|
|
57
|
+
Plus,
|
|
58
|
+
Settings,
|
|
59
|
+
Users,
|
|
60
|
+
FileText,
|
|
61
|
+
BarChart3,
|
|
62
|
+
Bell,
|
|
63
|
+
Search,
|
|
64
|
+
Filter,
|
|
65
|
+
MoreHorizontal,
|
|
66
|
+
Download,
|
|
67
|
+
Edit,
|
|
68
|
+
Trash2,
|
|
69
|
+
Eye,
|
|
70
|
+
ChevronRight,
|
|
71
|
+
Home,
|
|
72
|
+
Database,
|
|
73
|
+
Shield,
|
|
74
|
+
Zap
|
|
75
|
+
} from 'lucide-react'
|
|
76
|
+
|
|
77
|
+
export function DesignedPage() {
|
|
78
|
+
const [selectedTab, setSelectedTab] = useState('overview')
|
|
79
|
+
const [searchQuery, setSearchQuery] = useState('')
|
|
80
|
+
const [notifications, setNotifications] = useState(true)
|
|
81
|
+
const [autoSave, setAutoSave] = useState(true)
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div className="flex min-h-screen bg-background">
|
|
85
|
+
{/* Left Navigation */}
|
|
86
|
+
<div className="w-64 flex-shrink-0 border-r border-border bg-card">
|
|
87
|
+
<div className="flex h-16 items-center px-6 border-b border-border">
|
|
88
|
+
<div className="flex items-center gap-2">
|
|
89
|
+
<div className="h-8 w-8 rounded-lg bg-primary flex items-center justify-center">
|
|
90
|
+
<Zap className="h-4 w-4 text-primary-foreground" />
|
|
91
|
+
</div>
|
|
92
|
+
<span className="text-lg font-semibold">Spine</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<nav className="p-4 space-y-2">
|
|
97
|
+
<div className="space-y-1">
|
|
98
|
+
<Button variant="ghost" className="w-full justify-start gap-2 text-primary bg-primary/10">
|
|
99
|
+
<Home className="h-4 w-4" />
|
|
100
|
+
Dashboard
|
|
101
|
+
</Button>
|
|
102
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
103
|
+
<Database className="h-4 w-4" />
|
|
104
|
+
Data Management
|
|
105
|
+
</Button>
|
|
106
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
107
|
+
<Users className="h-4 w-4" />
|
|
108
|
+
User Accounts
|
|
109
|
+
</Button>
|
|
110
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
111
|
+
<Shield className="h-4 w-4" />
|
|
112
|
+
Security
|
|
113
|
+
</Button>
|
|
114
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
115
|
+
<BarChart3 className="h-4 w-4" />
|
|
116
|
+
Analytics
|
|
117
|
+
</Button>
|
|
118
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
119
|
+
<FileText className="h-4 w-4" />
|
|
120
|
+
Reports
|
|
121
|
+
</Button>
|
|
122
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
123
|
+
<Settings className="h-4 w-4" />
|
|
124
|
+
Settings
|
|
125
|
+
</Button>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<Separator className="my-4" />
|
|
129
|
+
|
|
130
|
+
<div className="space-y-1">
|
|
131
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
132
|
+
<Bell className="h-4 w-4" />
|
|
133
|
+
Notifications
|
|
134
|
+
<Badge variant="secondary" className="ml-auto">3</Badge>
|
|
135
|
+
</Button>
|
|
136
|
+
<Button variant="ghost" className="w-full justify-start gap-2">
|
|
137
|
+
<Plus className="h-4 w-4" />
|
|
138
|
+
New Project
|
|
139
|
+
</Button>
|
|
140
|
+
</div>
|
|
141
|
+
</nav>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
{/* Main Content Area */}
|
|
145
|
+
<div className="flex-1 flex flex-col min-w-0">
|
|
146
|
+
{/* Header */}
|
|
147
|
+
<header className="h-16 border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 flex-shrink-0">
|
|
148
|
+
<div className="flex h-16 items-center justify-between px-6">
|
|
149
|
+
<div className="flex items-center gap-4">
|
|
150
|
+
<h1 className="text-2xl font-semibold">Dashboard Overview</h1>
|
|
151
|
+
<Badge variant="outline">Production</Badge>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<div className="flex items-center gap-4">
|
|
155
|
+
<div className="relative">
|
|
156
|
+
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
|
157
|
+
<Input
|
|
158
|
+
placeholder="Search..."
|
|
159
|
+
value={searchQuery}
|
|
160
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
161
|
+
className="pl-10 w-64"
|
|
162
|
+
/>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<Button variant="outline" size="sm">
|
|
166
|
+
<Filter className="h-4 w-4 mr-2" />
|
|
167
|
+
Filter
|
|
168
|
+
</Button>
|
|
169
|
+
|
|
170
|
+
<DropdownMenu>
|
|
171
|
+
<DropdownMenuTrigger asChild>
|
|
172
|
+
<Button variant="outline" size="sm">
|
|
173
|
+
<Settings className="h-4 w-4" />
|
|
174
|
+
</Button>
|
|
175
|
+
</DropdownMenuTrigger>
|
|
176
|
+
<DropdownMenuContent align="end">
|
|
177
|
+
<DropdownMenuLabel>Settings</DropdownMenuLabel>
|
|
178
|
+
<DropdownMenuSeparator />
|
|
179
|
+
<DropdownMenuItem>
|
|
180
|
+
<Edit className="h-4 w-4 mr-2" />
|
|
181
|
+
Edit Profile
|
|
182
|
+
</DropdownMenuItem>
|
|
183
|
+
<DropdownMenuItem>
|
|
184
|
+
<Bell className="h-4 w-4 mr-2" />
|
|
185
|
+
Notifications
|
|
186
|
+
</DropdownMenuItem>
|
|
187
|
+
<DropdownMenuSeparator />
|
|
188
|
+
<DropdownMenuItem>
|
|
189
|
+
<Download className="h-4 w-4 mr-2" />
|
|
190
|
+
Export Data
|
|
191
|
+
</DropdownMenuItem>
|
|
192
|
+
</DropdownMenuContent>
|
|
193
|
+
</DropdownMenu>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
</header>
|
|
197
|
+
|
|
198
|
+
{/* Page Content */}
|
|
199
|
+
<main className="flex-1 overflow-auto p-6">
|
|
200
|
+
<div className="max-w-7xl mx-auto space-y-6">
|
|
201
|
+
{/* Stats Cards */}
|
|
202
|
+
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-4">
|
|
203
|
+
<Card>
|
|
204
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
205
|
+
<CardTitle className="text-sm font-medium">Total Users</CardTitle>
|
|
206
|
+
<Users className="h-4 w-4 text-muted-foreground" />
|
|
207
|
+
</CardHeader>
|
|
208
|
+
<CardContent>
|
|
209
|
+
<div className="text-2xl font-bold">2,847</div>
|
|
210
|
+
<p className="text-xs text-muted-foreground">
|
|
211
|
+
+12% from last month
|
|
212
|
+
</p>
|
|
213
|
+
</CardContent>
|
|
214
|
+
</Card>
|
|
215
|
+
|
|
216
|
+
<Card>
|
|
217
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
218
|
+
<CardTitle className="text-sm font-medium">Active Projects</CardTitle>
|
|
219
|
+
<FileText className="h-4 w-4 text-muted-foreground" />
|
|
220
|
+
</CardHeader>
|
|
221
|
+
<CardContent>
|
|
222
|
+
<div className="text-2xl font-bold">142</div>
|
|
223
|
+
<p className="text-xs text-muted-foreground">
|
|
224
|
+
+5% from last month
|
|
225
|
+
</p>
|
|
226
|
+
</CardContent>
|
|
227
|
+
</Card>
|
|
228
|
+
|
|
229
|
+
<Card>
|
|
230
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
231
|
+
<CardTitle className="text-sm font-medium">Data Processed</CardTitle>
|
|
232
|
+
<Database className="h-4 w-4 text-muted-foreground" />
|
|
233
|
+
</CardHeader>
|
|
234
|
+
<CardContent>
|
|
235
|
+
<div className="text-2xl font-bold">1.2M</div>
|
|
236
|
+
<p className="text-xs text-muted-foreground">
|
|
237
|
+
+18% from last month
|
|
238
|
+
</p>
|
|
239
|
+
</CardContent>
|
|
240
|
+
</Card>
|
|
241
|
+
|
|
242
|
+
<Card>
|
|
243
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
244
|
+
<CardTitle className="text-sm font-medium">System Health</CardTitle>
|
|
245
|
+
<Shield className="h-4 w-4 text-muted-foreground" />
|
|
246
|
+
</CardHeader>
|
|
247
|
+
<CardContent>
|
|
248
|
+
<div className="text-2xl font-bold">98.5%</div>
|
|
249
|
+
<p className="text-xs text-muted-foreground">
|
|
250
|
+
+0.5% from last month
|
|
251
|
+
</p>
|
|
252
|
+
</CardContent>
|
|
253
|
+
</Card>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
{/* Main Content Tabs */}
|
|
257
|
+
<Tabs value={selectedTab} onValueChange={setSelectedTab} className="space-y-4">
|
|
258
|
+
<TabsList className="grid w-full grid-cols-4">
|
|
259
|
+
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
260
|
+
<TabsTrigger value="analytics">Analytics</TabsTrigger>
|
|
261
|
+
<TabsTrigger value="reports">Reports</TabsTrigger>
|
|
262
|
+
<TabsTrigger value="settings">Settings</TabsTrigger>
|
|
263
|
+
</TabsList>
|
|
264
|
+
|
|
265
|
+
<TabsContent value="overview" className="space-y-4">
|
|
266
|
+
<div className="grid gap-6 lg:grid-cols-3">
|
|
267
|
+
{/* Recent Activity */}
|
|
268
|
+
<Card className="lg:col-span-2">
|
|
269
|
+
<CardHeader>
|
|
270
|
+
<CardTitle>Recent Activity</CardTitle>
|
|
271
|
+
<CardDescription>
|
|
272
|
+
Latest system events and user actions
|
|
273
|
+
</CardDescription>
|
|
274
|
+
</CardHeader>
|
|
275
|
+
<CardContent>
|
|
276
|
+
<div className="space-y-4">
|
|
277
|
+
<div className="flex items-center gap-4 p-3 rounded-lg border border-border/50">
|
|
278
|
+
<div className="h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center">
|
|
279
|
+
<Users className="h-4 w-4 text-primary" />
|
|
280
|
+
</div>
|
|
281
|
+
<div className="flex-1">
|
|
282
|
+
<p className="text-sm font-medium">New user registration</p>
|
|
283
|
+
<p className="text-xs text-muted-foreground">John Doe joined 2 minutes ago</p>
|
|
284
|
+
</div>
|
|
285
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground" />
|
|
286
|
+
</div>
|
|
287
|
+
|
|
288
|
+
<div className="flex items-center gap-4 p-3 rounded-lg border border-border/50">
|
|
289
|
+
<div className="h-8 w-8 rounded-full bg-secondary/10 flex items-center justify-center">
|
|
290
|
+
<FileText className="h-4 w-4 text-secondary-foreground" />
|
|
291
|
+
</div>
|
|
292
|
+
<div className="flex-1">
|
|
293
|
+
<p className="text-sm font-medium">Report generated</p>
|
|
294
|
+
<p className="text-xs text-muted-foreground">Monthly analytics report completed</p>
|
|
295
|
+
</div>
|
|
296
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground" />
|
|
297
|
+
</div>
|
|
298
|
+
|
|
299
|
+
<div className="flex items-center gap-4 p-3 rounded-lg border border-border/50">
|
|
300
|
+
<div className="h-8 w-8 rounded-full bg-destructive/10 flex items-center justify-center">
|
|
301
|
+
<Alert className="h-4 w-4 text-destructive" />
|
|
302
|
+
</div>
|
|
303
|
+
<div className="flex-1">
|
|
304
|
+
<p className="text-sm font-medium">System alert</p>
|
|
305
|
+
<p className="text-xs text-muted-foreground">High memory usage detected</p>
|
|
306
|
+
</div>
|
|
307
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground" />
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
</CardContent>
|
|
311
|
+
</Card>
|
|
312
|
+
|
|
313
|
+
{/* Quick Actions */}
|
|
314
|
+
<Card>
|
|
315
|
+
<CardHeader>
|
|
316
|
+
<CardTitle>Quick Actions</CardTitle>
|
|
317
|
+
<CardDescription>
|
|
318
|
+
Common tasks and shortcuts
|
|
319
|
+
</CardDescription>
|
|
320
|
+
</CardHeader>
|
|
321
|
+
<CardContent className="space-y-3">
|
|
322
|
+
<Button className="w-full justify-start gap-2">
|
|
323
|
+
<Plus className="h-4 w-4" />
|
|
324
|
+
Create New Project
|
|
325
|
+
</Button>
|
|
326
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
327
|
+
<Users className="h-4 w-4" />
|
|
328
|
+
Invite Team Member
|
|
329
|
+
</Button>
|
|
330
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
331
|
+
<Download className="h-4 w-4" />
|
|
332
|
+
Export Report
|
|
333
|
+
</Button>
|
|
334
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
335
|
+
<Settings className="h-4 w-4" />
|
|
336
|
+
System Settings
|
|
337
|
+
</Button>
|
|
338
|
+
</CardContent>
|
|
339
|
+
</Card>
|
|
340
|
+
</div>
|
|
341
|
+
</TabsContent>
|
|
342
|
+
|
|
343
|
+
<TabsContent value="analytics" className="space-y-4">
|
|
344
|
+
<Card>
|
|
345
|
+
<CardHeader>
|
|
346
|
+
<CardTitle>Analytics Dashboard</CardTitle>
|
|
347
|
+
<CardDescription>
|
|
348
|
+
System performance and usage metrics
|
|
349
|
+
</CardDescription>
|
|
350
|
+
</CardHeader>
|
|
351
|
+
<CardContent>
|
|
352
|
+
<div className="h-64 flex items-center justify-center border-2 border-dashed border-border rounded-lg">
|
|
353
|
+
<div className="text-center">
|
|
354
|
+
<BarChart3 className="h-12 w-12 text-muted-foreground mx-auto mb-4" />
|
|
355
|
+
<p className="text-muted-foreground">Analytics charts would be displayed here</p>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
</CardContent>
|
|
359
|
+
</Card>
|
|
360
|
+
</TabsContent>
|
|
361
|
+
|
|
362
|
+
<TabsContent value="reports" className="space-y-4">
|
|
363
|
+
<Card>
|
|
364
|
+
<CardHeader>
|
|
365
|
+
<CardTitle>Reports</CardTitle>
|
|
366
|
+
<CardDescription>
|
|
367
|
+
Generated reports and documentation
|
|
368
|
+
</CardDescription>
|
|
369
|
+
</CardHeader>
|
|
370
|
+
<CardContent>
|
|
371
|
+
<div className="space-y-4">
|
|
372
|
+
{[
|
|
373
|
+
{ name: 'Monthly Analytics', date: '2024-01-15', status: 'completed' },
|
|
374
|
+
{ name: 'User Activity Report', date: '2024-01-14', status: 'completed' },
|
|
375
|
+
{ name: 'System Performance', date: '2024-01-13', status: 'processing' },
|
|
376
|
+
].map((report, index) => (
|
|
377
|
+
<div key={index} className="flex items-center justify-between p-3 border border-border/50 rounded-lg">
|
|
378
|
+
<div className="flex items-center gap-3">
|
|
379
|
+
<FileText className="h-4 w-4 text-muted-foreground" />
|
|
380
|
+
<div>
|
|
381
|
+
<p className="text-sm font-medium">{report.name}</p>
|
|
382
|
+
<p className="text-xs text-muted-foreground">{report.date}</p>
|
|
383
|
+
</div>
|
|
384
|
+
</div>
|
|
385
|
+
<div className="flex items-center gap-2">
|
|
386
|
+
<Badge variant={report.status === 'completed' ? 'default' : 'secondary'}>
|
|
387
|
+
{report.status}
|
|
388
|
+
</Badge>
|
|
389
|
+
<Button variant="ghost" size="sm">
|
|
390
|
+
<Eye className="h-4 w-4" />
|
|
391
|
+
</Button>
|
|
392
|
+
</div>
|
|
393
|
+
</div>
|
|
394
|
+
))}
|
|
395
|
+
</div>
|
|
396
|
+
</CardContent>
|
|
397
|
+
</Card>
|
|
398
|
+
</TabsContent>
|
|
399
|
+
|
|
400
|
+
<TabsContent value="settings" className="space-y-4">
|
|
401
|
+
<div className="grid gap-6 lg:grid-cols-2">
|
|
402
|
+
<Card>
|
|
403
|
+
<CardHeader>
|
|
404
|
+
<CardTitle>Preferences</CardTitle>
|
|
405
|
+
<CardDescription>
|
|
406
|
+
Customize your experience
|
|
407
|
+
</CardDescription>
|
|
408
|
+
</CardHeader>
|
|
409
|
+
<CardContent className="space-y-4">
|
|
410
|
+
<div className="flex items-center justify-between">
|
|
411
|
+
<div className="space-y-0.5">
|
|
412
|
+
<Label htmlFor="notifications">Notifications</Label>
|
|
413
|
+
<p className="text-sm text-muted-foreground">
|
|
414
|
+
Receive system notifications
|
|
415
|
+
</p>
|
|
416
|
+
</div>
|
|
417
|
+
<Switch
|
|
418
|
+
id="notifications"
|
|
419
|
+
checked={notifications}
|
|
420
|
+
onCheckedChange={setNotifications}
|
|
421
|
+
/>
|
|
422
|
+
</div>
|
|
423
|
+
|
|
424
|
+
<div className="flex items-center justify-between">
|
|
425
|
+
<div className="space-y-0.5">
|
|
426
|
+
<Label htmlFor="autosave">Auto-save</Label>
|
|
427
|
+
<p className="text-sm text-muted-foreground">
|
|
428
|
+
Automatically save changes
|
|
429
|
+
</p>
|
|
430
|
+
</div>
|
|
431
|
+
<Switch
|
|
432
|
+
id="autosave"
|
|
433
|
+
checked={autoSave}
|
|
434
|
+
onCheckedChange={setAutoSave}
|
|
435
|
+
/>
|
|
436
|
+
</div>
|
|
437
|
+
|
|
438
|
+
<div className="space-y-2">
|
|
439
|
+
<Label htmlFor="theme">Theme</Label>
|
|
440
|
+
<Select>
|
|
441
|
+
<SelectTrigger id="theme">
|
|
442
|
+
<SelectValue placeholder="Select theme" />
|
|
443
|
+
</SelectTrigger>
|
|
444
|
+
<SelectContent>
|
|
445
|
+
<SelectItem value="light">Light</SelectItem>
|
|
446
|
+
<SelectItem value="dark">Dark</SelectItem>
|
|
447
|
+
<SelectItem value="system">System</SelectItem>
|
|
448
|
+
</SelectContent>
|
|
449
|
+
</Select>
|
|
450
|
+
</div>
|
|
451
|
+
</CardContent>
|
|
452
|
+
</Card>
|
|
453
|
+
|
|
454
|
+
<Card>
|
|
455
|
+
<CardHeader>
|
|
456
|
+
<CardTitle>Security</CardTitle>
|
|
457
|
+
<CardDescription>
|
|
458
|
+
Manage your security settings
|
|
459
|
+
</CardDescription>
|
|
460
|
+
</CardHeader>
|
|
461
|
+
<CardContent className="space-y-4">
|
|
462
|
+
<Alert>
|
|
463
|
+
<Shield className="h-4 w-4" />
|
|
464
|
+
<AlertTitle>Two-factor authentication</AlertTitle>
|
|
465
|
+
<AlertDescription>
|
|
466
|
+
Add an extra layer of security to your account
|
|
467
|
+
</AlertDescription>
|
|
468
|
+
</Alert>
|
|
469
|
+
|
|
470
|
+
<div className="space-y-2">
|
|
471
|
+
<Label htmlFor="current-password">Current Password</Label>
|
|
472
|
+
<Input id="current-password" type="password" />
|
|
473
|
+
</div>
|
|
474
|
+
|
|
475
|
+
<div className="space-y-2">
|
|
476
|
+
<Label htmlFor="new-password">New Password</Label>
|
|
477
|
+
<Input id="new-password" type="password" />
|
|
478
|
+
</div>
|
|
479
|
+
|
|
480
|
+
<Button className="w-full">Update Password</Button>
|
|
481
|
+
</CardContent>
|
|
482
|
+
</Card>
|
|
483
|
+
</div>
|
|
484
|
+
</TabsContent>
|
|
485
|
+
</Tabs>
|
|
486
|
+
</div>
|
|
487
|
+
</main>
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
)
|
|
491
|
+
}
|