{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "cantera", "homepage": "https://canteraui.xyz", "author": "MR ", "items": [ { "name": "oauth-types", "type": "registry:lib", "title": "OAuth Types", "author": "MR ", "description": "Generic OAuth types for cantera components: providers, scopes, connections, accounts. The lingua franca adapters translate into.", "categories": ["authentication", "types"], "files": [ { "path": "registry/lib/oauth-types.ts", "type": "registry:lib", "target": "lib/oauth-types.ts" } ] }, { "name": "aps-oauth-preset", "type": "registry:lib", "title": "APS OAuth Preset", "author": "MR ", "description": "Autodesk Platform Services (ACC) preset: provider metadata, scope catalog, scope bundles, and adapters into cantera's oauth types.", "categories": ["authentication", "providers", "autodesk"], "registryDependencies": ["@cantera/oauth-types"], "files": [ { "path": "registry/lib/aps-oauth-preset.tsx", "type": "registry:lib", "target": "lib/aps-oauth-preset.tsx" } ] }, { "name": "status-tokens", "type": "registry:item", "title": "Status Tokens", "author": "MR ", "description": "Semantic status colors — success, warning, danger, neutral — each with a foreground and a surface companion, contrast-verified in light and dark. The palette every cantera status surface renders from.", "categories": ["theming", "status"], "files": [ { "path": "registry/lib/status-tokens.ts", "type": "registry:lib", "target": "lib/status-tokens.ts" } ], "cssVars": { "theme": { "color-status-success": "var(--status-success, var(--foreground))", "color-status-success-foreground": "var(--status-success-foreground, var(--background))", "color-status-success-surface": "var(--status-success-surface, var(--muted))", "color-status-warning": "var(--status-warning, var(--foreground))", "color-status-warning-foreground": "var(--status-warning-foreground, var(--background))", "color-status-warning-surface": "var(--status-warning-surface, var(--muted))", "color-status-danger": "var(--status-danger, var(--destructive))", "color-status-danger-foreground": "var(--status-danger-foreground, var(--background))", "color-status-danger-surface": "var(--status-danger-surface, var(--muted))", "color-status-neutral": "var(--status-neutral, var(--muted-foreground))", "color-status-neutral-foreground": "var(--status-neutral-foreground, var(--background))", "color-status-neutral-surface": "var(--status-neutral-surface, var(--muted))" }, "light": { "status-success": "oklch(0.5 0.13 150)", "status-success-foreground": "oklch(0.985 0.01 150)", "status-success-surface": "oklch(0.955 0.035 150)", "status-warning": "oklch(0.52 0.11 72)", "status-warning-foreground": "oklch(0.99 0.01 85)", "status-warning-surface": "oklch(0.955 0.045 85)", "status-danger": "oklch(0.52 0.2 27)", "status-danger-foreground": "oklch(0.985 0.005 27)", "status-danger-surface": "oklch(0.94 0.03 27)", "status-neutral": "oklch(0.48 0 0)", "status-neutral-foreground": "oklch(0.985 0 0)", "status-neutral-surface": "oklch(0.955 0 0)" }, "dark": { "status-success": "oklch(0.78 0.15 150)", "status-success-foreground": "oklch(0.19 0.04 150)", "status-success-surface": "oklch(0.28 0.05 150)", "status-warning": "oklch(0.8 0.14 80)", "status-warning-foreground": "oklch(0.2 0.04 80)", "status-warning-surface": "oklch(0.29 0.05 80)", "status-danger": "oklch(0.72 0.16 25)", "status-danger-foreground": "oklch(0.19 0.04 25)", "status-danger-surface": "oklch(0.29 0.06 25)", "status-neutral": "oklch(0.75 0 0)", "status-neutral-foreground": "oklch(0.2 0 0)", "status-neutral-surface": "oklch(0.29 0 0)" } }, "docs": "Status tokens installed. The solid pairs (bg-status-* with text-status-*-foreground) are the default treatment; the -surface companions are for soft rows and callouts and must always carry text-status-* ink. If your theme redefines :root without these variables, the utilities fall back to foreground / destructive / muted so nothing renders invisible. lib/status-tokens.ts ships the same twelve tokens as typed var() strings (statusCssVars) for the places a class cannot reach: inline styles, chart series, canvas fills." }, { "name": "provider-sign-in-button", "type": "registry:component", "title": "Provider Sign-In Button", "author": "MR ", "description": "A sign-in button for a single OAuth provider: brand icon, label, loading state. Works as a link or a click handler.", "categories": ["authentication", "buttons"], "dependencies": ["lucide-react"], "registryDependencies": ["button", "@cantera/oauth-types"], "files": [ { "path": "registry/ui/provider-sign-in-button.tsx", "type": "registry:ui" } ] }, { "name": "sign-in-card", "type": "registry:component", "title": "Sign-In Card", "author": "MR ", "description": "A multi-provider sign-in chooser card. Server-renderable via an href template, or client-driven via a callback.", "categories": ["authentication", "login"], "registryDependencies": ["card", "@cantera/provider-sign-in-button", "@cantera/oauth-types"], "files": [ { "path": "registry/ui/sign-in-card.tsx", "type": "registry:ui" } ] }, { "name": "scope-picker", "type": "registry:component", "title": "Scope Picker", "author": "MR ", "description": "A controlled OAuth scope picker: checkbox list with descriptions, one-click presets, required scopes pinned on, and an escape hatch for scopes outside the catalog.", "categories": ["authentication", "permissions", "forms"], "dependencies": ["lucide-react"], "registryDependencies": [ "badge", "button", "checkbox", "input", "label", "@cantera/oauth-types", "@cantera/status-tokens" ], "files": [ { "path": "registry/ui/scope-picker.tsx", "type": "registry:ui" } ] }, { "name": "user-account-badge", "type": "registry:component", "title": "User Account Badge", "author": "MR ", "description": "An avatar-and-name chip for a connected account, with optional provider mark. Server-safe.", "categories": ["authentication", "account"], "registryDependencies": ["avatar", "@cantera/oauth-types", "@cantera/status-tokens"], "files": [ { "path": "registry/ui/user-account-badge.tsx", "type": "registry:ui" } ] }, { "name": "token-status", "type": "registry:component", "title": "Token Status", "author": "MR ", "description": "Status line for an OAuth grant: connection state, token expiry, and held scopes. Server-safe.", "categories": ["authentication", "status"], "registryDependencies": ["badge", "@cantera/status-tokens", "@cantera/oauth-types"], "files": [ { "path": "registry/ui/token-status.tsx", "type": "registry:ui" } ] }, { "name": "connection-card", "type": "registry:component", "title": "Connection Card", "author": "MR ", "description": "A provider connection at a glance: account, grant status, scopes, and disconnect / reconnect actions.", "categories": ["authentication", "connections"], "dependencies": ["lucide-react"], "registryDependencies": [ "button", "card", "@cantera/user-account-badge", "@cantera/token-status", "@cantera/oauth-types" ], "files": [ { "path": "registry/ui/connection-card.tsx", "type": "registry:ui" } ] }, { "name": "acc-sign-in", "type": "registry:block", "title": "ACC Sign-In", "author": "MR ", "description": "Complete Autodesk (APS / ACC) sign-in flow on aec-auth: consent redirect, code exchange, vault-managed refresh, signed session, and a live connection panel.", "categories": ["authentication", "login", "autodesk"], "dependencies": ["aec-auth"], "registryDependencies": [ "@cantera/sign-in-card", "@cantera/connection-card", "@cantera/aps-oauth-preset", "@cantera/oauth-types" ], "files": [ { "path": "registry/blocks/acc-sign-in/page.tsx", "type": "registry:page", "target": "app/sign-in/page.tsx" }, { "path": "registry/blocks/acc-sign-in/components/acc-connection-panel.tsx", "type": "registry:component", "target": "components/acc-connection-panel.tsx" }, { "path": "registry/blocks/acc-sign-in/lib/acc-auth.ts", "type": "registry:lib", "target": "lib/acc-auth.ts" }, { "path": "registry/blocks/acc-sign-in/api/auth-start-route.ts", "type": "registry:file", "target": "app/api/auth/[provider]/route.ts" }, { "path": "registry/blocks/acc-sign-in/api/auth-callback-route.ts", "type": "registry:file", "target": "app/api/auth/callback/[provider]/route.ts" }, { "path": "registry/blocks/acc-sign-in/api/signout-route.ts", "type": "registry:file", "target": "app/api/auth/signout/route.ts" } ], "envVars": { "APS_CLIENT_ID": "", "APS_CLIENT_SECRET": "", "SESSION_SECRET": "", "APS_AUTH_BASE_URL": "" }, "docs": "Installed: app/sign-in/page.tsx, the /api/auth/* route handlers, and lib/acc-auth.ts (aec-auth vault wiring).\n\nEnvironment (added to .env.local as empty keys — fill them in):\n- APS_CLIENT_ID / APS_CLIENT_SECRET — your APS app credentials.\n- SESSION_SECRET — HMAC key for the session cookie. Generate one with `openssl rand -base64 32`. In production the block fails closed without it: a shared default key would let anyone mint a session for any user.\n- APS_AUTH_BASE_URL — optional auth-origin override, absolute or relative (\"/emulate/aps\") for an embedded emulator. Leave it unset to talk to real APS.\n\nACC_AUTH_DEMO=1 is the escape hatch that allows the insecure fallback session secret in production. It exists for emulator-backed showcases only — never set it anywhere real accounts exist.\n\nThe default vault store is in-memory: correct for a demo, wrong for production. Swap in a durable VaultStore (see the aec-auth README) before you ship." }, { "name": "connections-page", "type": "registry:block", "title": "Connections Page", "author": "MR ", "description": "The page that manages every provider grant: one card per connection, with connect, reconnect, and disconnect — plus the designed empty, loading, and error states a real fetch needs.", "categories": ["authentication", "connections", "dashboard", "autodesk"], "dependencies": ["aec-auth", "lucide-react"], "registryDependencies": [ "button", "@cantera/connection-card", "@cantera/provider-sign-in-button", "@cantera/token-status", "@cantera/user-account-badge", "@cantera/acc-sign-in", "@cantera/aps-oauth-preset", "@cantera/oauth-types", "@cantera/status-tokens" ], "files": [ { "path": "registry/blocks/connections-page/page.tsx", "type": "registry:page", "target": "app/connections/page.tsx" }, { "path": "registry/blocks/connections-page/loading.tsx", "type": "registry:file", "target": "app/connections/loading.tsx" }, { "path": "registry/blocks/connections-page/components/connections-view.tsx", "type": "registry:component", "target": "components/connections-view.tsx" }, { "path": "registry/blocks/connections-page/components/connections-manager.tsx", "type": "registry:component", "target": "components/connections-manager.tsx" } ], "envVars": { "APS_CLIENT_ID": "", "APS_CLIENT_SECRET": "", "SESSION_SECRET": "", "APS_AUTH_BASE_URL": "" }, "docs": "Installed: app/connections/page.tsx with its loading skeleton, plus ConnectionsView (presentational) and ConnectionsManager (wiring).\n\nThis block takes acc-sign-in as a registry dependency for the /api/auth/* routes and the aec-auth glue, so one environment configures both:\n- APS_CLIENT_ID / APS_CLIENT_SECRET — your APS app credentials.\n- SESSION_SECRET — required in production; the block fails closed without it.\n- APS_AUTH_BASE_URL — optional auth-origin override for an emulator. Unset means real APS.\n\nACC_AUTH_DEMO=1 allows the insecure fallback session secret and must never be set where real accounts exist.\n\nConnectionsView never fetches — providers and connections in, callbacks out — so point it at any backend." }, { "name": "project-types", "type": "registry:lib", "title": "Project Types", "author": "MR ", "description": "Generic project-context types for cantera components: hubs, projects, model translations, sheet version sets. The lingua franca adapters translate into.", "categories": ["projects", "types"], "files": [ { "path": "registry/lib/project-types.ts", "type": "registry:lib", "target": "lib/project-types.ts" } ] }, { "name": "aps-data-preset", "type": "registry:lib", "title": "APS Data Preset", "author": "MR ", "description": "Autodesk Platform Services (ACC) data preset: adapters from Data Management, Model Derivative, and ACC Sheets payloads into cantera's project types.", "categories": ["projects", "providers", "autodesk"], "registryDependencies": ["@cantera/project-types"], "files": [ { "path": "registry/lib/aps-data-preset.ts", "type": "registry:lib", "target": "lib/aps-data-preset.ts" } ] }, { "name": "hub-switcher", "type": "registry:component", "title": "Hub Switcher", "author": "MR ", "description": "The hub context switch: which ACC hub — or any Hub — the rest of the screen works against, with region context and a pending state for the switch itself.", "categories": ["projects", "navigation"], "dependencies": ["lucide-react"], "registryDependencies": ["select", "@cantera/project-types"], "files": [ { "path": "registry/ui/hub-switcher.tsx", "type": "registry:ui" } ] }, { "name": "project-picker", "type": "registry:component", "title": "Project Picker", "author": "MR ", "description": "The project choice every ACC screen starts from: a searchable combobox grouped by hub, with the loading, error, and empty states a real fetch needs.", "categories": ["projects", "navigation"], "dependencies": ["lucide-react"], "registryDependencies": [ "button", "command", "popover", "@cantera/project-types", "@cantera/status-tokens" ], "files": [ { "path": "registry/ui/project-picker.tsx", "type": "registry:ui" } ] }, { "name": "version-set-select", "type": "registry:component", "title": "Version Set Select", "author": "MR ", "description": "Which issuance of the construction sheets to read from, every option carrying its issuance date — building from a superseded set is an expensive mistake.", "categories": ["projects", "sheets"], "dependencies": ["lucide-react"], "registryDependencies": ["select", "@cantera/project-types"], "files": [ { "path": "registry/ui/version-set-select.tsx", "type": "registry:ui" } ] }, { "name": "model-status-card", "type": "registry:component", "title": "Model Status Card", "author": "MR ", "description": "The translation state of one design: whether the model is viewable yet, how far along it is, and what failed — with a retry on the async-pending contract.", "categories": ["projects", "status"], "dependencies": ["lucide-react"], "registryDependencies": [ "badge", "button", "card", "@cantera/token-status", "@cantera/status-tokens", "@cantera/project-types" ], "files": [ { "path": "registry/ui/model-status-card.tsx", "type": "registry:ui" } ] }, { "name": "status-tokens-demo", "type": "registry:example", "title": "Status Tokens Example", "author": "MR ", "description": "A full page rendering Status Tokens, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["theming", "status"], "registryDependencies": ["@cantera/status-tokens"], "files": [ { "path": "registry/examples/status-tokens-demo.tsx", "type": "registry:component", "target": "components/examples/status-tokens-demo.tsx" }, { "path": "registry/examples/pages/status-tokens-demo-page.tsx", "type": "registry:page", "target": "app/examples/status-tokens/page.tsx" } ] }, { "name": "provider-sign-in-button-demo", "type": "registry:example", "title": "Provider Sign-In Button Example", "author": "MR ", "description": "A full page rendering Provider Sign-In Button, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "buttons"], "registryDependencies": [ "@cantera/aps-oauth-preset", "@cantera/oauth-types", "@cantera/provider-sign-in-button" ], "files": [ { "path": "registry/examples/provider-sign-in-button-demo.tsx", "type": "registry:component", "target": "components/examples/provider-sign-in-button-demo.tsx" }, { "path": "registry/examples/pages/provider-sign-in-button-demo-page.tsx", "type": "registry:page", "target": "app/examples/provider-sign-in-button/page.tsx" } ] }, { "name": "sign-in-card-demo", "type": "registry:example", "title": "Sign-In Card Example", "author": "MR ", "description": "A full page rendering Sign-In Card, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "login"], "registryDependencies": [ "@cantera/aps-oauth-preset", "@cantera/oauth-types", "@cantera/sign-in-card" ], "files": [ { "path": "registry/examples/sign-in-card-demo.tsx", "type": "registry:component", "target": "components/examples/sign-in-card-demo.tsx" }, { "path": "registry/examples/pages/sign-in-card-demo-page.tsx", "type": "registry:page", "target": "app/examples/sign-in-card/page.tsx" } ] }, { "name": "scope-picker-demo", "type": "registry:example", "title": "Scope Picker Example", "author": "MR ", "description": "A full page rendering Scope Picker, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "permissions", "forms"], "registryDependencies": ["@cantera/aps-oauth-preset", "@cantera/scope-picker"], "files": [ { "path": "registry/examples/scope-picker-demo.tsx", "type": "registry:component", "target": "components/examples/scope-picker-demo.tsx" }, { "path": "registry/examples/pages/scope-picker-demo-page.tsx", "type": "registry:page", "target": "app/examples/scope-picker/page.tsx" } ] }, { "name": "user-account-badge-demo", "type": "registry:example", "title": "User Account Badge Example", "author": "MR ", "description": "A full page rendering User Account Badge, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "account"], "registryDependencies": ["@cantera/aps-oauth-preset", "@cantera/user-account-badge"], "files": [ { "path": "registry/examples/user-account-badge-demo.tsx", "type": "registry:component", "target": "components/examples/user-account-badge-demo.tsx" }, { "path": "registry/examples/pages/user-account-badge-demo-page.tsx", "type": "registry:page", "target": "app/examples/user-account-badge/page.tsx" } ] }, { "name": "token-status-demo", "type": "registry:example", "title": "Token Status Example", "author": "MR ", "description": "A full page rendering Token Status, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "status"], "registryDependencies": [ "@cantera/aps-oauth-preset", "@cantera/oauth-types", "@cantera/token-status" ], "files": [ { "path": "registry/examples/token-status-demo.tsx", "type": "registry:component", "target": "components/examples/token-status-demo.tsx" }, { "path": "registry/examples/pages/token-status-demo-page.tsx", "type": "registry:page", "target": "app/examples/token-status/page.tsx" } ] }, { "name": "connection-card-demo", "type": "registry:example", "title": "Connection Card Example", "author": "MR ", "description": "A full page rendering Connection Card, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["authentication", "connections"], "registryDependencies": [ "@cantera/aps-oauth-preset", "@cantera/connection-card", "@cantera/oauth-types" ], "files": [ { "path": "registry/examples/connection-card-demo.tsx", "type": "registry:component", "target": "components/examples/connection-card-demo.tsx" }, { "path": "registry/examples/pages/connection-card-demo-page.tsx", "type": "registry:page", "target": "app/examples/connection-card/page.tsx" } ] }, { "name": "hub-switcher-demo", "type": "registry:example", "title": "Hub Switcher Example", "author": "MR ", "description": "A full page rendering Hub Switcher, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["projects", "navigation"], "registryDependencies": ["@cantera/hub-switcher", "@cantera/project-types"], "files": [ { "path": "registry/examples/hub-switcher-demo.tsx", "type": "registry:component", "target": "components/examples/hub-switcher-demo.tsx" }, { "path": "registry/examples/pages/hub-switcher-demo-page.tsx", "type": "registry:page", "target": "app/examples/hub-switcher/page.tsx" } ] }, { "name": "project-picker-demo", "type": "registry:example", "title": "Project Picker Example", "author": "MR ", "description": "A full page rendering Project Picker, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["projects", "navigation"], "registryDependencies": ["@cantera/project-picker", "@cantera/project-types"], "files": [ { "path": "registry/examples/project-picker-demo.tsx", "type": "registry:component", "target": "components/examples/project-picker-demo.tsx" }, { "path": "registry/examples/pages/project-picker-demo-page.tsx", "type": "registry:page", "target": "app/examples/project-picker/page.tsx" } ] }, { "name": "version-set-select-demo", "type": "registry:example", "title": "Version Set Select Example", "author": "MR ", "description": "A full page rendering Version Set Select, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["projects", "sheets"], "registryDependencies": ["@cantera/project-types", "@cantera/version-set-select"], "files": [ { "path": "registry/examples/version-set-select-demo.tsx", "type": "registry:component", "target": "components/examples/version-set-select-demo.tsx" }, { "path": "registry/examples/pages/version-set-select-demo-page.tsx", "type": "registry:page", "target": "app/examples/version-set-select/page.tsx" } ] }, { "name": "model-status-card-demo", "type": "registry:example", "title": "Model Status Card Example", "author": "MR ", "description": "A full page rendering Model Status Card, with its own sample data — what \"Open in v0\" hands over, and what to copy when wiring the component into a real screen.", "categories": ["projects", "status"], "registryDependencies": ["@cantera/model-status-card", "@cantera/project-types"], "files": [ { "path": "registry/examples/model-status-card-demo.tsx", "type": "registry:component", "target": "components/examples/model-status-card-demo.tsx" }, { "path": "registry/examples/pages/model-status-card-demo-page.tsx", "type": "registry:page", "target": "app/examples/model-status-card/page.tsx" } ] } ] }