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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/pages/admin/IncrementalShadcnTestPage
|
|
3
|
+
* @audience installer
|
|
4
|
+
* @layer frontend-page
|
|
5
|
+
* @stability testing
|
|
6
|
+
*
|
|
7
|
+
* Incremental test page to identify problematic shadcn component imports.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useState } from 'react'
|
|
11
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../components/ui/card'
|
|
12
|
+
import { Button } from '../../components/ui/button'
|
|
13
|
+
import { Badge } from '../../components/ui/badge'
|
|
14
|
+
import { Input } from '../../components/ui/input'
|
|
15
|
+
import { Label } from '../../components/ui/label'
|
|
16
|
+
|
|
17
|
+
export function IncrementalShadcnTestPage() {
|
|
18
|
+
const [count, setCount] = useState(0)
|
|
19
|
+
const [text, setText] = useState('')
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div className="flex-1 space-y-6 p-8 pt-6">
|
|
23
|
+
<div className="space-y-2">
|
|
24
|
+
<h1 className="text-3xl font-bold tracking-tight">Incremental shadcn Test</h1>
|
|
25
|
+
<p className="text-muted-foreground">
|
|
26
|
+
Testing 4 shadcn components: Card, Button, Badge, Input, Label
|
|
27
|
+
</p>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div className="grid gap-6 md:grid-cols-2">
|
|
31
|
+
<Card>
|
|
32
|
+
<CardHeader>
|
|
33
|
+
<CardTitle>Form Components</CardTitle>
|
|
34
|
+
<CardDescription>Testing Input and Label</CardDescription>
|
|
35
|
+
</CardHeader>
|
|
36
|
+
<CardContent className="space-y-4">
|
|
37
|
+
<div className="space-y-2">
|
|
38
|
+
<Label htmlFor="text-input">Text Input</Label>
|
|
39
|
+
<Input
|
|
40
|
+
id="text-input"
|
|
41
|
+
placeholder="Type something..."
|
|
42
|
+
value={text}
|
|
43
|
+
onChange={(e) => setText(e.target.value)}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
<p className="text-sm text-muted-foreground">
|
|
47
|
+
You typed: {text || 'nothing'}
|
|
48
|
+
</p>
|
|
49
|
+
</CardContent>
|
|
50
|
+
</Card>
|
|
51
|
+
|
|
52
|
+
<Card>
|
|
53
|
+
<CardHeader>
|
|
54
|
+
<CardTitle>Interactive Components</CardTitle>
|
|
55
|
+
<CardDescription>Testing Button and Badge interaction</CardDescription>
|
|
56
|
+
</CardHeader>
|
|
57
|
+
<CardContent className="space-y-4">
|
|
58
|
+
<div className="flex gap-2">
|
|
59
|
+
<Button onClick={() => setCount(count + 1)}>
|
|
60
|
+
Increment
|
|
61
|
+
</Button>
|
|
62
|
+
<Button variant="outline" onClick={() => setCount(0)}>
|
|
63
|
+
Reset
|
|
64
|
+
</Button>
|
|
65
|
+
</div>
|
|
66
|
+
<div className="flex gap-2">
|
|
67
|
+
<Badge>Count: {count}</Badge>
|
|
68
|
+
<Badge variant={count > 5 ? "destructive" : "default"}>
|
|
69
|
+
{count > 5 ? "High" : "Low"}
|
|
70
|
+
</Badge>
|
|
71
|
+
</div>
|
|
72
|
+
</CardContent>
|
|
73
|
+
</Card>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<Card>
|
|
77
|
+
<CardHeader>
|
|
78
|
+
<CardTitle>Combined Test</CardTitle>
|
|
79
|
+
<CardDescription>All components working together</CardDescription>
|
|
80
|
+
</CardHeader>
|
|
81
|
+
<CardContent className="space-y-4">
|
|
82
|
+
<div className="grid gap-4 md:grid-cols-2">
|
|
83
|
+
<div className="space-y-2">
|
|
84
|
+
<Label htmlFor="combined-input">Enter a number</Label>
|
|
85
|
+
<Input
|
|
86
|
+
id="combined-input"
|
|
87
|
+
type="number"
|
|
88
|
+
placeholder="Enter count"
|
|
89
|
+
value={text}
|
|
90
|
+
onChange={(e) => {
|
|
91
|
+
const val = e.target.value
|
|
92
|
+
setText(val)
|
|
93
|
+
const num = parseInt(val) || 0
|
|
94
|
+
if (num >= 0) setCount(num)
|
|
95
|
+
}}
|
|
96
|
+
/>
|
|
97
|
+
</div>
|
|
98
|
+
<div className="flex items-center gap-2">
|
|
99
|
+
<Button onClick={() => setCount(count + 10)}>
|
|
100
|
+
Add 10
|
|
101
|
+
</Button>
|
|
102
|
+
<Badge variant="outline">Current: {count}</Badge>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</CardContent>
|
|
106
|
+
</Card>
|
|
107
|
+
</div>
|
|
108
|
+
)
|
|
109
|
+
}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/pages/admin/IntegratedDashboard
|
|
3
|
+
* @audience installer
|
|
4
|
+
* @layer frontend-page
|
|
5
|
+
* @stability testing
|
|
6
|
+
*
|
|
7
|
+
* A dashboard page that properly integrates with the Spine admin layout.
|
|
8
|
+
* Uses the existing sidebar and content structure.
|
|
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 { Switch } from '../../components/ui/switch'
|
|
25
|
+
import { Separator } from '../../components/ui/separator'
|
|
26
|
+
import {
|
|
27
|
+
Tabs,
|
|
28
|
+
TabsContent,
|
|
29
|
+
TabsList,
|
|
30
|
+
TabsTrigger,
|
|
31
|
+
} from '../../components/ui/tabs'
|
|
32
|
+
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
33
|
+
import {
|
|
34
|
+
DropdownMenu,
|
|
35
|
+
DropdownMenuContent,
|
|
36
|
+
DropdownMenuItem,
|
|
37
|
+
DropdownMenuLabel,
|
|
38
|
+
DropdownMenuSeparator,
|
|
39
|
+
DropdownMenuTrigger,
|
|
40
|
+
} from '../../components/ui/dropdown-menu'
|
|
41
|
+
import {
|
|
42
|
+
Plus,
|
|
43
|
+
Settings,
|
|
44
|
+
Users,
|
|
45
|
+
FileText,
|
|
46
|
+
BarChart3,
|
|
47
|
+
Search,
|
|
48
|
+
Filter,
|
|
49
|
+
Download,
|
|
50
|
+
Edit,
|
|
51
|
+
Eye,
|
|
52
|
+
ChevronRight,
|
|
53
|
+
Database,
|
|
54
|
+
Shield,
|
|
55
|
+
CheckCircle,
|
|
56
|
+
AlertTriangle,
|
|
57
|
+
TrendingUp,
|
|
58
|
+
Activity,
|
|
59
|
+
MoreHorizontal,
|
|
60
|
+
Calendar,
|
|
61
|
+
Clock
|
|
62
|
+
} from 'lucide-react'
|
|
63
|
+
|
|
64
|
+
export function IntegratedDashboard() {
|
|
65
|
+
const [selectedTab, setSelectedTab] = useState('overview')
|
|
66
|
+
const [searchQuery, setSearchQuery] = useState('')
|
|
67
|
+
const [notifications, setNotifications] = useState(true)
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<div className="flex-1 space-y-6">
|
|
71
|
+
{/* Page Header */}
|
|
72
|
+
<div className="flex items-center justify-between">
|
|
73
|
+
<div>
|
|
74
|
+
<h2 className="text-3xl font-bold tracking-tight">Dashboard</h2>
|
|
75
|
+
<p className="text-muted-foreground">
|
|
76
|
+
Monitor your system performance and key metrics
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
79
|
+
<div className="flex items-center gap-2">
|
|
80
|
+
<Badge variant="outline" className="bg-green-50 text-green-700 border-green-200 dark:bg-green-900/20 dark:text-green-400 dark:border-green-800">
|
|
81
|
+
<CheckCircle className="w-3 h-3 mr-1" />
|
|
82
|
+
System Healthy
|
|
83
|
+
</Badge>
|
|
84
|
+
<Button>
|
|
85
|
+
<Plus className="w-4 h-4 mr-2" />
|
|
86
|
+
New Project
|
|
87
|
+
</Button>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
{/* Search and Filter Bar */}
|
|
92
|
+
<Card>
|
|
93
|
+
<CardContent className="pt-6">
|
|
94
|
+
<div className="flex flex-col gap-4 sm:flex-row sm:items-center">
|
|
95
|
+
<div className="relative flex-1">
|
|
96
|
+
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
|
97
|
+
<Input
|
|
98
|
+
placeholder="Search projects, users, or data..."
|
|
99
|
+
value={searchQuery}
|
|
100
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
101
|
+
className="pl-10"
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
<div className="flex gap-2">
|
|
105
|
+
<Button variant="outline" size="sm">
|
|
106
|
+
<Filter className="h-4 w-4 mr-2" />
|
|
107
|
+
Filter
|
|
108
|
+
</Button>
|
|
109
|
+
<Button variant="outline" size="sm">
|
|
110
|
+
<Download className="h-4 w-4 mr-2" />
|
|
111
|
+
Export
|
|
112
|
+
</Button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</CardContent>
|
|
116
|
+
</Card>
|
|
117
|
+
|
|
118
|
+
{/* Stats Cards */}
|
|
119
|
+
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
|
|
120
|
+
<Card className="relative overflow-hidden">
|
|
121
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
122
|
+
<CardTitle className="text-sm font-medium">Total Users</CardTitle>
|
|
123
|
+
<Users className="h-4 w-4 text-muted-foreground" />
|
|
124
|
+
</CardHeader>
|
|
125
|
+
<CardContent>
|
|
126
|
+
<div className="text-2xl font-bold">2,847</div>
|
|
127
|
+
<p className="text-xs text-muted-foreground flex items-center">
|
|
128
|
+
<TrendingUp className="w-3 h-3 mr-1 text-green-600" />
|
|
129
|
+
+12% from last month
|
|
130
|
+
</p>
|
|
131
|
+
</CardContent>
|
|
132
|
+
<div className="absolute top-0 right-0 h-16 w-16 bg-gradient-to-br from-blue-500/10 to-transparent rounded-bl-2xl"></div>
|
|
133
|
+
</Card>
|
|
134
|
+
|
|
135
|
+
<Card className="relative overflow-hidden">
|
|
136
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
137
|
+
<CardTitle className="text-sm font-medium">Active Projects</CardTitle>
|
|
138
|
+
<FileText className="h-4 w-4 text-muted-foreground" />
|
|
139
|
+
</CardHeader>
|
|
140
|
+
<CardContent>
|
|
141
|
+
<div className="text-2xl font-bold">142</div>
|
|
142
|
+
<p className="text-xs text-muted-foreground flex items-center">
|
|
143
|
+
<TrendingUp className="w-3 h-3 mr-1 text-green-600" />
|
|
144
|
+
+5% from last month
|
|
145
|
+
</p>
|
|
146
|
+
</CardContent>
|
|
147
|
+
<div className="absolute top-0 right-0 h-16 w-16 bg-gradient-to-br from-green-500/10 to-transparent rounded-bl-2xl"></div>
|
|
148
|
+
</Card>
|
|
149
|
+
|
|
150
|
+
<Card className="relative overflow-hidden">
|
|
151
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
152
|
+
<CardTitle className="text-sm font-medium">Data Processed</CardTitle>
|
|
153
|
+
<Database className="h-4 w-4 text-muted-foreground" />
|
|
154
|
+
</CardHeader>
|
|
155
|
+
<CardContent>
|
|
156
|
+
<div className="text-2xl font-bold">1.2M</div>
|
|
157
|
+
<p className="text-xs text-muted-foreground flex items-center">
|
|
158
|
+
<TrendingUp className="w-3 h-3 mr-1 text-green-600" />
|
|
159
|
+
+18% from last month
|
|
160
|
+
</p>
|
|
161
|
+
</CardContent>
|
|
162
|
+
<div className="absolute top-0 right-0 h-16 w-16 bg-gradient-to-br from-purple-500/10 to-transparent rounded-bl-2xl"></div>
|
|
163
|
+
</Card>
|
|
164
|
+
|
|
165
|
+
<Card className="relative overflow-hidden">
|
|
166
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
167
|
+
<CardTitle className="text-sm font-medium">System Health</CardTitle>
|
|
168
|
+
<Activity className="h-4 w-4 text-muted-foreground" />
|
|
169
|
+
</CardHeader>
|
|
170
|
+
<CardContent>
|
|
171
|
+
<div className="text-2xl font-bold">98.5%</div>
|
|
172
|
+
<p className="text-xs text-muted-foreground flex items-center">
|
|
173
|
+
<AlertTriangle className="w-3 h-3 mr-1 text-yellow-600" />
|
|
174
|
+
-0.5% from last month
|
|
175
|
+
</p>
|
|
176
|
+
</CardContent>
|
|
177
|
+
<div className="absolute top-0 right-0 h-16 w-16 bg-gradient-to-br from-orange-500/10 to-transparent rounded-bl-2xl"></div>
|
|
178
|
+
</Card>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
{/* Main Content Tabs */}
|
|
182
|
+
<Tabs value={selectedTab} onValueChange={setSelectedTab} className="space-y-4">
|
|
183
|
+
<TabsList className="grid w-full grid-cols-4">
|
|
184
|
+
<TabsTrigger value="overview">Overview</TabsTrigger>
|
|
185
|
+
<TabsTrigger value="analytics">Analytics</TabsTrigger>
|
|
186
|
+
<TabsTrigger value="reports">Reports</TabsTrigger>
|
|
187
|
+
<TabsTrigger value="settings">Settings</TabsTrigger>
|
|
188
|
+
</TabsList>
|
|
189
|
+
|
|
190
|
+
<TabsContent value="overview" className="space-y-4">
|
|
191
|
+
<div className="grid gap-6 lg:grid-cols-3">
|
|
192
|
+
{/* Recent Activity */}
|
|
193
|
+
<Card className="lg:col-span-2">
|
|
194
|
+
<CardHeader>
|
|
195
|
+
<CardTitle>Recent Activity</CardTitle>
|
|
196
|
+
<CardDescription>
|
|
197
|
+
Latest system events and user actions
|
|
198
|
+
</CardDescription>
|
|
199
|
+
</CardHeader>
|
|
200
|
+
<CardContent>
|
|
201
|
+
<div className="space-y-4">
|
|
202
|
+
<div className="flex items-center gap-4 p-4 rounded-lg border border-border/50 bg-card/50 hover:bg-card transition-colors">
|
|
203
|
+
<div className="h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center">
|
|
204
|
+
<Users className="h-5 w-5 text-primary" />
|
|
205
|
+
</div>
|
|
206
|
+
<div className="flex-1 min-w-0">
|
|
207
|
+
<p className="font-medium truncate">New user registration</p>
|
|
208
|
+
<p className="text-sm text-muted-foreground">John Doe joined 2 minutes ago</p>
|
|
209
|
+
</div>
|
|
210
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground flex-shrink-0" />
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
<div className="flex items-center gap-4 p-4 rounded-lg border border-border/50 bg-card/50 hover:bg-card transition-colors">
|
|
214
|
+
<div className="h-10 w-10 rounded-full bg-secondary/10 flex items-center justify-center">
|
|
215
|
+
<FileText className="h-5 w-5 text-secondary-foreground" />
|
|
216
|
+
</div>
|
|
217
|
+
<div className="flex-1 min-w-0">
|
|
218
|
+
<p className="font-medium truncate">Report generated</p>
|
|
219
|
+
<p className="text-sm text-muted-foreground">Monthly analytics report completed</p>
|
|
220
|
+
</div>
|
|
221
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground flex-shrink-0" />
|
|
222
|
+
</div>
|
|
223
|
+
|
|
224
|
+
<div className="flex items-center gap-4 p-4 rounded-lg border border-border/50 bg-card/50 hover:bg-card transition-colors">
|
|
225
|
+
<div className="h-10 w-10 rounded-full bg-destructive/10 flex items-center justify-center">
|
|
226
|
+
<AlertTriangle className="h-5 w-5 text-destructive" />
|
|
227
|
+
</div>
|
|
228
|
+
<div className="flex-1 min-w-0">
|
|
229
|
+
<p className="font-medium truncate">System alert</p>
|
|
230
|
+
<p className="text-sm text-muted-foreground">High memory usage detected</p>
|
|
231
|
+
</div>
|
|
232
|
+
<ChevronRight className="h-4 w-4 text-muted-foreground flex-shrink-0" />
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</CardContent>
|
|
236
|
+
</Card>
|
|
237
|
+
|
|
238
|
+
{/* Quick Actions */}
|
|
239
|
+
<Card>
|
|
240
|
+
<CardHeader>
|
|
241
|
+
<CardTitle>Quick Actions</CardTitle>
|
|
242
|
+
<CardDescription>
|
|
243
|
+
Common tasks and shortcuts
|
|
244
|
+
</CardDescription>
|
|
245
|
+
</CardHeader>
|
|
246
|
+
<CardContent className="space-y-3">
|
|
247
|
+
<Button className="w-full justify-start gap-2">
|
|
248
|
+
<Plus className="h-4 w-4" />
|
|
249
|
+
Create New Project
|
|
250
|
+
</Button>
|
|
251
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
252
|
+
<Users className="h-4 w-4" />
|
|
253
|
+
Invite Team Member
|
|
254
|
+
</Button>
|
|
255
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
256
|
+
<Download className="h-4 w-4" />
|
|
257
|
+
Export Report
|
|
258
|
+
</Button>
|
|
259
|
+
<Button variant="outline" className="w-full justify-start gap-2">
|
|
260
|
+
<Settings className="h-4 w-4" />
|
|
261
|
+
System Settings
|
|
262
|
+
</Button>
|
|
263
|
+
</CardContent>
|
|
264
|
+
</Card>
|
|
265
|
+
</div>
|
|
266
|
+
</TabsContent>
|
|
267
|
+
|
|
268
|
+
<TabsContent value="analytics" className="space-y-4">
|
|
269
|
+
<Card>
|
|
270
|
+
<CardHeader>
|
|
271
|
+
<CardTitle>Analytics Dashboard</CardTitle>
|
|
272
|
+
<CardDescription>
|
|
273
|
+
System performance and usage metrics
|
|
274
|
+
</CardDescription>
|
|
275
|
+
</CardHeader>
|
|
276
|
+
<CardContent>
|
|
277
|
+
<div className="h-64 flex items-center justify-center border-2 border-dashed border-border rounded-lg bg-muted/20">
|
|
278
|
+
<div className="text-center">
|
|
279
|
+
<BarChart3 className="h-12 w-12 text-muted-foreground mx-auto mb-4" />
|
|
280
|
+
<p className="text-muted-foreground">Analytics charts would be displayed here</p>
|
|
281
|
+
<p className="text-sm text-muted-foreground mt-2">Integration with charting library needed</p>
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</CardContent>
|
|
285
|
+
</Card>
|
|
286
|
+
</TabsContent>
|
|
287
|
+
|
|
288
|
+
<TabsContent value="reports" className="space-y-4">
|
|
289
|
+
<Card>
|
|
290
|
+
<CardHeader>
|
|
291
|
+
<CardTitle>Reports</CardTitle>
|
|
292
|
+
<CardDescription>
|
|
293
|
+
Generated reports and documentation
|
|
294
|
+
</CardDescription>
|
|
295
|
+
</CardHeader>
|
|
296
|
+
<CardContent>
|
|
297
|
+
<div className="space-y-4">
|
|
298
|
+
{[
|
|
299
|
+
{ name: 'Monthly Analytics', date: '2024-01-15', status: 'completed' },
|
|
300
|
+
{ name: 'User Activity Report', date: '2024-01-14', status: 'completed' },
|
|
301
|
+
{ name: 'System Performance', date: '2024-01-13', status: 'processing' },
|
|
302
|
+
].map((report, index) => (
|
|
303
|
+
<div key={index} className="flex items-center justify-between p-4 border border-border/50 rounded-lg bg-card/50">
|
|
304
|
+
<div className="flex items-center gap-3">
|
|
305
|
+
<FileText className="h-5 w-5 text-muted-foreground" />
|
|
306
|
+
<div className="min-w-0 flex-1">
|
|
307
|
+
<p className="font-medium truncate">{report.name}</p>
|
|
308
|
+
<p className="text-sm text-muted-foreground">{report.date}</p>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
<div className="flex items-center gap-2">
|
|
312
|
+
<Badge variant={report.status === 'completed' ? 'default' : 'secondary'}>
|
|
313
|
+
{report.status}
|
|
314
|
+
</Badge>
|
|
315
|
+
<Button variant="ghost" size="sm">
|
|
316
|
+
<Eye className="h-4 w-4" />
|
|
317
|
+
</Button>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
))}
|
|
321
|
+
</div>
|
|
322
|
+
</CardContent>
|
|
323
|
+
</Card>
|
|
324
|
+
</TabsContent>
|
|
325
|
+
|
|
326
|
+
<TabsContent value="settings" className="space-y-4">
|
|
327
|
+
<div className="grid gap-6 lg:grid-cols-2">
|
|
328
|
+
<Card>
|
|
329
|
+
<CardHeader>
|
|
330
|
+
<CardTitle>Preferences</CardTitle>
|
|
331
|
+
<CardDescription>
|
|
332
|
+
Customize your experience
|
|
333
|
+
</CardDescription>
|
|
334
|
+
</CardHeader>
|
|
335
|
+
<CardContent className="space-y-6">
|
|
336
|
+
<div className="flex items-center justify-between">
|
|
337
|
+
<div className="space-y-0.5">
|
|
338
|
+
<Label htmlFor="notifications">Notifications</Label>
|
|
339
|
+
<p className="text-sm text-muted-foreground">
|
|
340
|
+
Receive system notifications
|
|
341
|
+
</p>
|
|
342
|
+
</div>
|
|
343
|
+
<Switch
|
|
344
|
+
id="notifications"
|
|
345
|
+
checked={notifications}
|
|
346
|
+
onCheckedChange={setNotifications}
|
|
347
|
+
/>
|
|
348
|
+
</div>
|
|
349
|
+
|
|
350
|
+
<div className="space-y-2">
|
|
351
|
+
<Label htmlFor="theme">Theme</Label>
|
|
352
|
+
<Select>
|
|
353
|
+
<SelectTrigger id="theme">
|
|
354
|
+
<SelectValue placeholder="Select theme" />
|
|
355
|
+
</SelectTrigger>
|
|
356
|
+
<SelectContent>
|
|
357
|
+
<SelectItem value="light">Light</SelectItem>
|
|
358
|
+
<SelectItem value="dark">Dark</SelectItem>
|
|
359
|
+
<SelectItem value="system">System</SelectItem>
|
|
360
|
+
</SelectContent>
|
|
361
|
+
</Select>
|
|
362
|
+
</div>
|
|
363
|
+
</CardContent>
|
|
364
|
+
</Card>
|
|
365
|
+
|
|
366
|
+
<Card>
|
|
367
|
+
<CardHeader>
|
|
368
|
+
<CardTitle>Security</CardTitle>
|
|
369
|
+
<CardDescription>
|
|
370
|
+
Manage your security settings
|
|
371
|
+
</CardDescription>
|
|
372
|
+
</CardHeader>
|
|
373
|
+
<CardContent className="space-y-6">
|
|
374
|
+
<Alert>
|
|
375
|
+
<Shield className="h-4 w-4" />
|
|
376
|
+
<AlertTitle>Two-factor authentication</AlertTitle>
|
|
377
|
+
<AlertDescription>
|
|
378
|
+
Add an extra layer of security to your account
|
|
379
|
+
</AlertDescription>
|
|
380
|
+
</Alert>
|
|
381
|
+
|
|
382
|
+
<div className="space-y-4">
|
|
383
|
+
<div className="space-y-2">
|
|
384
|
+
<Label htmlFor="current-password">Current Password</Label>
|
|
385
|
+
<Input id="current-password" type="password" />
|
|
386
|
+
</div>
|
|
387
|
+
|
|
388
|
+
<div className="space-y-2">
|
|
389
|
+
<Label htmlFor="new-password">New Password</Label>
|
|
390
|
+
<Input id="new-password" type="password" />
|
|
391
|
+
</div>
|
|
392
|
+
|
|
393
|
+
<Button className="w-full">Update Password</Button>
|
|
394
|
+
</div>
|
|
395
|
+
</CardContent>
|
|
396
|
+
</Card>
|
|
397
|
+
</div>
|
|
398
|
+
</TabsContent>
|
|
399
|
+
</Tabs>
|
|
400
|
+
</div>
|
|
401
|
+
)
|
|
402
|
+
}
|