@stacksjs/defaults 0.70.207 → 0.70.208
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/TODO.md +21 -0
- package/ai/AGENTS.md +79 -0
- package/ai/README.md +45 -0
- package/ai/claude/launch.json +12 -0
- package/ai/skills/stacks-actions/SKILL.md +128 -0
- package/ai/skills/stacks-ai/SKILL.md +276 -0
- package/ai/skills/stacks-alias/SKILL.md +94 -0
- package/ai/skills/stacks-analytics/SKILL.md +91 -0
- package/ai/skills/stacks-api/SKILL.md +738 -0
- package/ai/skills/stacks-arrays/SKILL.md +277 -0
- package/ai/skills/stacks-auth/SKILL.md +422 -0
- package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
- package/ai/skills/stacks-brandkit/SKILL.md +811 -0
- package/ai/skills/stacks-browse/SKILL.md +127 -0
- package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
- package/ai/skills/stacks-browser/SKILL.md +145 -0
- package/ai/skills/stacks-buddy/SKILL.md +676 -0
- package/ai/skills/stacks-build/SKILL.md +163 -0
- package/ai/skills/stacks-cache/SKILL.md +125 -0
- package/ai/skills/stacks-calendar/SKILL.md +113 -0
- package/ai/skills/stacks-chat/SKILL.md +371 -0
- package/ai/skills/stacks-cli/SKILL.md +112 -0
- package/ai/skills/stacks-cloud/SKILL.md +192 -0
- package/ai/skills/stacks-cms/SKILL.md +217 -0
- package/ai/skills/stacks-collections/SKILL.md +82 -0
- package/ai/skills/stacks-commerce/SKILL.md +114 -0
- package/ai/skills/stacks-composables/SKILL.md +161 -0
- package/ai/skills/stacks-config/SKILL.md +144 -0
- package/ai/skills/stacks-configuration/SKILL.md +154 -0
- package/ai/skills/stacks-cron/SKILL.md +123 -0
- package/ai/skills/stacks-crosswind/SKILL.md +190 -0
- package/ai/skills/stacks-dashboard/SKILL.md +173 -0
- package/ai/skills/stacks-database/SKILL.md +286 -0
- package/ai/skills/stacks-datetime/SKILL.md +269 -0
- package/ai/skills/stacks-dependencies/SKILL.md +111 -0
- package/ai/skills/stacks-deploy/SKILL.md +102 -0
- package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
- package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
- package/ai/skills/stacks-design-output/SKILL.md +55 -0
- package/ai/skills/stacks-design-soft/SKILL.md +156 -0
- package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
- package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
- package/ai/skills/stacks-desktop/SKILL.md +78 -0
- package/ai/skills/stacks-development/SKILL.md +298 -0
- package/ai/skills/stacks-dns/SKILL.md +149 -0
- package/ai/skills/stacks-docs/SKILL.md +109 -0
- package/ai/skills/stacks-email/SKILL.md +236 -0
- package/ai/skills/stacks-enums/SKILL.md +100 -0
- package/ai/skills/stacks-env/SKILL.md +181 -0
- package/ai/skills/stacks-error-handling/SKILL.md +137 -0
- package/ai/skills/stacks-events/SKILL.md +228 -0
- package/ai/skills/stacks-faker/SKILL.md +158 -0
- package/ai/skills/stacks-git/SKILL.md +158 -0
- package/ai/skills/stacks-guard/SKILL.md +98 -0
- package/ai/skills/stacks-health/SKILL.md +75 -0
- package/ai/skills/stacks-http/SKILL.md +316 -0
- package/ai/skills/stacks-i18n/SKILL.md +198 -0
- package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
- package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
- package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
- package/ai/skills/stacks-investigate/SKILL.md +119 -0
- package/ai/skills/stacks-jobs/SKILL.md +136 -0
- package/ai/skills/stacks-lint/SKILL.md +184 -0
- package/ai/skills/stacks-listeners/SKILL.md +99 -0
- package/ai/skills/stacks-logging/SKILL.md +78 -0
- package/ai/skills/stacks-mail/SKILL.md +120 -0
- package/ai/skills/stacks-middleware/SKILL.md +249 -0
- package/ai/skills/stacks-migrations/SKILL.md +105 -0
- package/ai/skills/stacks-models/SKILL.md +267 -0
- package/ai/skills/stacks-new-feature/SKILL.md +206 -0
- package/ai/skills/stacks-notifications/SKILL.md +210 -0
- package/ai/skills/stacks-objects/SKILL.md +205 -0
- package/ai/skills/stacks-office-hours/SKILL.md +134 -0
- package/ai/skills/stacks-orm/SKILL.md +342 -0
- package/ai/skills/stacks-path/SKILL.md +118 -0
- package/ai/skills/stacks-payments/SKILL.md +373 -0
- package/ai/skills/stacks-plan-review/SKILL.md +152 -0
- package/ai/skills/stacks-plugins/SKILL.md +149 -0
- package/ai/skills/stacks-push/SKILL.md +376 -0
- package/ai/skills/stacks-query-builder/SKILL.md +128 -0
- package/ai/skills/stacks-queue/SKILL.md +559 -0
- package/ai/skills/stacks-realtime/SKILL.md +442 -0
- package/ai/skills/stacks-redesign/SKILL.md +182 -0
- package/ai/skills/stacks-registry/SKILL.md +58 -0
- package/ai/skills/stacks-repl/SKILL.md +80 -0
- package/ai/skills/stacks-retro/SKILL.md +122 -0
- package/ai/skills/stacks-review/SKILL.md +135 -0
- package/ai/skills/stacks-router/SKILL.md +231 -0
- package/ai/skills/stacks-routes/SKILL.md +105 -0
- package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
- package/ai/skills/stacks-scheduler/SKILL.md +363 -0
- package/ai/skills/stacks-search-engine/SKILL.md +112 -0
- package/ai/skills/stacks-security/SKILL.md +129 -0
- package/ai/skills/stacks-security-audit/SKILL.md +128 -0
- package/ai/skills/stacks-server/SKILL.md +458 -0
- package/ai/skills/stacks-shell/SKILL.md +62 -0
- package/ai/skills/stacks-slug/SKILL.md +87 -0
- package/ai/skills/stacks-sms/SKILL.md +385 -0
- package/ai/skills/stacks-socials/SKILL.md +303 -0
- package/ai/skills/stacks-storage/SKILL.md +576 -0
- package/ai/skills/stacks-strings/SKILL.md +416 -0
- package/ai/skills/stacks-stx/SKILL.md +176 -0
- package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
- package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
- package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
- package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
- package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
- package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
- package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
- package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
- package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
- package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
- package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
- package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
- package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
- package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
- package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
- package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
- package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
- package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
- package/ai/skills/stacks-testing/SKILL.md +129 -0
- package/ai/skills/stacks-tunnel/SKILL.md +125 -0
- package/ai/skills/stacks-types/SKILL.md +178 -0
- package/ai/skills/stacks-ui/SKILL.md +246 -0
- package/ai/skills/stacks-utils/SKILL.md +444 -0
- package/ai/skills/stacks-validation/SKILL.md +371 -0
- package/ai/skills/stacks-whois/SKILL.md +315 -0
- package/assets/world-map-data.ts +121 -0
- package/bootstrap.ts +114 -0
- package/docs/api-examples.md +46 -0
- package/docs/index.md +24 -0
- package/docs/markdown-examples.md +87 -0
- package/functions/analytics.ts +97 -0
- package/functions/api.ts +143 -0
- package/functions/auth.ts +208 -0
- package/functions/billing/payments.ts +149 -0
- package/functions/blog.ts +120 -0
- package/functions/cms/categorizables.ts +107 -0
- package/functions/cms/pages.ts +108 -0
- package/functions/cms/posts.ts +100 -0
- package/functions/cms/taggables.ts +102 -0
- package/functions/commerce/coupons.ts +128 -0
- package/functions/commerce/customers.ts +128 -0
- package/functions/commerce/gift-cards.ts +119 -0
- package/functions/commerce/orders.ts +112 -0
- package/functions/commerce/payments.ts +119 -0
- package/functions/commerce/products/categories.ts +123 -0
- package/functions/commerce/products/manufacturers.ts +123 -0
- package/functions/commerce/products/products.ts +123 -0
- package/functions/commerce/products/reviews.ts +123 -0
- package/functions/commerce/products/units.ts +123 -0
- package/functions/commerce/products/variants.ts +123 -0
- package/functions/commerce/shippings/delivery-routes.ts +123 -0
- package/functions/commerce/shippings/digital-deliveries.ts +119 -0
- package/functions/commerce/shippings/drivers.ts +123 -0
- package/functions/commerce/shippings/license-keys.ts +123 -0
- package/functions/commerce/shippings/shipping-methods.ts +123 -0
- package/functions/commerce/shippings/shipping-rates.ts +119 -0
- package/functions/commerce/shippings/shipping-zones.ts +119 -0
- package/functions/commerce/taxes.ts +119 -0
- package/functions/commerce/waitlist/products.ts +123 -0
- package/functions/commerce/waitlist/restaurants.ts +123 -0
- package/functions/craft.ts +107 -0
- package/functions/dashboard.ts +153 -0
- package/functions/inbox.ts +95 -0
- package/functions/jobs.ts +86 -0
- package/functions/monitoring/errors.ts +295 -0
- package/functions/queue.ts +111 -0
- package/functions/realtime/websockets.ts +96 -0
- package/functions/realtime.ts +52 -0
- package/functions/releases.ts +49 -0
- package/functions/search.ts +126 -0
- package/functions/toasts.ts +95 -0
- package/functions/uploads.ts +216 -0
- package/ide/.gitignore +4 -0
- package/ide/cursor/rules/auto-imports.mdc +574 -0
- package/ide/cursor/rules/code-style.mdc +12 -0
- package/ide/cursor/rules/documentation.mdc +9 -0
- package/ide/cursor/rules/error-handling-validation.mdc +11 -0
- package/ide/cursor/rules/key-conventions.mdc +11 -0
- package/ide/cursor/rules/project-structure.mdc +169 -0
- package/ide/cursor/rules/readme.mdc +318 -0
- package/ide/cursor/rules/syntax-formatting.mdc +9 -0
- package/ide/cursor/rules/testing.mdc +10 -0
- package/ide/cursor/rules/typescript.mdc +9 -0
- package/ide/cursor/rules/ui-styling.mdc +0 -0
- package/ide/dictionary.txt +397 -0
- package/ide/jetbrains/.fleet/settings.json +4 -0
- package/ide/jetbrains/.idea/.gitignore +5 -0
- package/ide/jetbrains/.idea/.name +1 -0
- package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
- package/ide/jetbrains/.idea/modules.xml +8 -0
- package/ide/jetbrains/.idea/stacks.iml +22 -0
- package/ide/jetbrains/.idea/vcs.xml +6 -0
- package/ide/jetbrains/.idea/webResources.xml +14 -0
- package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
- package/ide/jetbrains/installed.txt +4 -0
- package/ide/jetbrains/options/github-copilot.xml +5 -0
- package/ide/jetbrains/options/nodejs.xml +7 -0
- package/ide/jetbrains/options/templates.xml +124 -0
- package/ide/jetbrains/templates/JavaScript.xml +6 -0
- package/ide/jetbrains/templates/Stacks.xml +8 -0
- package/ide/vscode/.vscode/README.md +23 -0
- package/ide/vscode/.vscode/extensions.json +5 -0
- package/ide/vscode/.vscode/settings.json +176 -0
- package/ide/vscode/.vscode/stacks.code-snippets +181 -0
- package/ide/vscode/LICENSE.md +21 -0
- package/ide/vscode/README.md +36 -0
- package/ide/vscode/logo.png +0 -0
- package/ide/vscode/package.json +79 -0
- package/ide/zed/.zed/settings.json +139 -0
- package/lang/README.md +28 -0
- package/lang/de.yml +14 -0
- package/lang/en.yml +15 -0
- package/package.json +19 -3
- package/project/bootstrap +161 -0
- package/project/buddy +175 -0
- package/project/storage/framework/tsconfig.app.json +50 -0
- package/project/storage/framework/tsconfig.base.json +58 -0
- package/routes/core.ts +78 -0
- package/routes/dashboard-api.ts +233 -0
- package/routes/dashboard.ts +739 -0
- package/routes/email.ts +129 -0
- package/stores/[name].stx +16 -0
- package/stores/git.ts +71 -0
- package/stores/payment.ts +474 -0
- package/stores/queue.ts +43 -0
- package/stores/user.ts +29 -0
- package/stx-components-plugin.ts +25 -0
- package/styles/design-tokens.css +597 -0
- package/types/dashboard.ts +70 -0
- package/types/defaults.ts +438 -0
- package/vcs/github/CODE_OF_CONDUCT.md +83 -0
- package/vcs/github/CONTRIBUTING.md +187 -0
- package/vcs/github/EXPLANATIONS.md +41 -0
- package/vcs/github/FUNDING.yml +1 -0
- package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
- package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- package/vcs/github/SECURITY.md +70 -0
- package/vcs/github/renovate.json +5 -0
- package/vcs/github/stale.yml +14 -0
- package/vcs/github/workflows/README.md +16 -0
- package/vcs/github/workflows/ci.yml +114 -0
- package/vcs/github/workflows/export-size.yml +25 -0
- package/vcs/github/workflows/labeler.yml +13 -0
- package/vcs/github/workflows/release.yml +219 -0
- package/views/[...all].stx +8 -0
- package/views/about.md +3 -0
- package/views/auth/login.stx +1 -0
- package/views/auth/signup.stx +85 -0
- package/views/dashboard/.discovered-models.json +542 -0
- package/views/dashboard/AUDIT.md +904 -0
- package/views/dashboard/[...all].stx +89 -0
- package/views/dashboard/access-tokens/index.stx +177 -0
- package/views/dashboard/actions/index.stx +129 -0
- package/views/dashboard/analytics/blog/index.stx +356 -0
- package/views/dashboard/analytics/browsers/index.stx +263 -0
- package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
- package/views/dashboard/analytics/commerce/web/index.stx +379 -0
- package/views/dashboard/analytics/countries/index.stx +289 -0
- package/views/dashboard/analytics/devices/index.stx +305 -0
- package/views/dashboard/analytics/events/index.stx +536 -0
- package/views/dashboard/analytics/index.stx +88 -0
- package/views/dashboard/analytics/marketing/index.stx +315 -0
- package/views/dashboard/analytics/pages/index.stx +271 -0
- package/views/dashboard/analytics/referrers/index.stx +319 -0
- package/views/dashboard/analytics/web/index.stx +356 -0
- package/views/dashboard/buddy/index.stx +198 -0
- package/views/dashboard/ci/index.stx +462 -0
- package/views/dashboard/cloud/index.stx +452 -0
- package/views/dashboard/commands/index.stx +295 -0
- package/views/dashboard/commerce/categories/index.stx +406 -0
- package/views/dashboard/commerce/coupons/index.stx +485 -0
- package/views/dashboard/commerce/customers/index.stx +410 -0
- package/views/dashboard/commerce/dashboard/index.stx +287 -0
- package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
- package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
- package/views/dashboard/commerce/delivery/drivers.stx +397 -0
- package/views/dashboard/commerce/delivery/index.stx +18 -0
- package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
- package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
- package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
- package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
- package/views/dashboard/commerce/delivery/tabs.ts +25 -0
- package/views/dashboard/commerce/gift-cards/index.stx +561 -0
- package/views/dashboard/commerce/manufacturers/index.stx +308 -0
- package/views/dashboard/commerce/orders/index.stx +247 -0
- package/views/dashboard/commerce/payments/index.stx +535 -0
- package/views/dashboard/commerce/pos/index.stx +653 -0
- package/views/dashboard/commerce/printers/devices/index.stx +273 -0
- package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
- package/views/dashboard/commerce/products/detail.stx +563 -0
- package/views/dashboard/commerce/products/index.stx +370 -0
- package/views/dashboard/commerce/reviews/index.stx +656 -0
- package/views/dashboard/commerce/reviews/index.ts +0 -0
- package/views/dashboard/commerce/taxes/index.stx +377 -0
- package/views/dashboard/commerce/units/index.stx +317 -0
- package/views/dashboard/commerce/variants/index.stx +319 -0
- package/views/dashboard/commerce/waitlist/products.stx +942 -0
- package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
- package/views/dashboard/components/index.stx +330 -0
- package/views/dashboard/composables/index.ts +19 -0
- package/views/dashboard/composables/useChart.ts +77 -0
- package/views/dashboard/composables/useNavigation.ts +99 -0
- package/views/dashboard/composables/useRole.ts +58 -0
- package/views/dashboard/composables/useTheme.ts +74 -0
- package/views/dashboard/content/authors/index.stx +171 -0
- package/views/dashboard/content/blog/index.stx +493 -0
- package/views/dashboard/content/categories/index.stx +169 -0
- package/views/dashboard/content/comments/index.stx +189 -0
- package/views/dashboard/content/dashboard.stx +383 -0
- package/views/dashboard/content/files/index.stx +706 -0
- package/views/dashboard/content/pages/index.stx +174 -0
- package/views/dashboard/content/posts/index.stx +269 -0
- package/views/dashboard/content/seo/index.stx +240 -0
- package/views/dashboard/content/tags/index.stx +167 -0
- package/views/dashboard/data/activity/index.stx +261 -0
- package/views/dashboard/data/dashboard/index.stx +116 -0
- package/views/dashboard/data/subscribers.stx +270 -0
- package/views/dashboard/data/teams.stx +275 -0
- package/views/dashboard/data/users.stx +279 -0
- package/views/dashboard/dependencies/index.stx +178 -0
- package/views/dashboard/deployments/[id].stx +234 -0
- package/views/dashboard/deployments/index.stx +9 -0
- package/views/dashboard/dns/index.stx +163 -0
- package/views/dashboard/environment/index.stx +283 -0
- package/views/dashboard/errors/index.stx +274 -0
- package/views/dashboard/forgot-password.stx +57 -0
- package/views/dashboard/functions/index.stx +159 -0
- package/views/dashboard/health/index.stx +248 -0
- package/views/dashboard/inbox/activity.stx +350 -0
- package/views/dashboard/inbox/index.stx +452 -0
- package/views/dashboard/inbox/settings.stx +290 -0
- package/views/dashboard/index.stx +252 -0
- package/views/dashboard/insights/index.stx +529 -0
- package/views/dashboard/jobs/[id].stx +430 -0
- package/views/dashboard/jobs/history.stx +222 -0
- package/views/dashboard/jobs/index.stx +214 -0
- package/views/dashboard/kanban/[id].stx +899 -0
- package/views/dashboard/kanban/index.stx +260 -0
- package/views/dashboard/layouts/default.stx +565 -0
- package/views/dashboard/layouts/guest.stx +10 -0
- package/views/dashboard/login.stx +48 -0
- package/views/dashboard/logs/index.stx +540 -0
- package/views/dashboard/mailboxes/index.stx +149 -0
- package/views/dashboard/management/permissions/index.stx +490 -0
- package/views/dashboard/marketing/campaigns/index.stx +604 -0
- package/views/dashboard/marketing/lists/index.stx +514 -0
- package/views/dashboard/marketing/reviews/index.stx +475 -0
- package/views/dashboard/marketing/social-posts/index.stx +560 -0
- package/views/dashboard/models/[model].stx +195 -0
- package/views/dashboard/models/index.stx +159 -0
- package/views/dashboard/monitoring/errors/index.stx +415 -0
- package/views/dashboard/notifications/dashboard.stx +383 -0
- package/views/dashboard/notifications/email.stx +336 -0
- package/views/dashboard/notifications/history.stx +373 -0
- package/views/dashboard/notifications/sms.stx +332 -0
- package/views/dashboard/packages/index.stx +195 -0
- package/views/dashboard/queries/[id].stx +381 -0
- package/views/dashboard/queries/history.stx +227 -0
- package/views/dashboard/queries/index.stx +335 -0
- package/views/dashboard/queries/slow.stx +318 -0
- package/views/dashboard/queue/index.stx +427 -0
- package/views/dashboard/realtime/index.stx +429 -0
- package/views/dashboard/register.stx +46 -0
- package/views/dashboard/releases/index.stx +389 -0
- package/views/dashboard/requests/index.stx +462 -0
- package/views/dashboard/serverless/index.stx +475 -0
- package/views/dashboard/servers/[id].stx +299 -0
- package/views/dashboard/servers/index.stx +483 -0
- package/views/dashboard/settings/billing.stx +50 -0
- package/views/dashboard/settings/index.stx +256 -0
- package/views/dashboard/settings/mail.stx +252 -0
- package/views/dashboard/stores/auth.ts +123 -0
- package/views/dashboard/stores/ci.ts +342 -0
- package/views/dashboard/stores/index.ts +129 -0
- package/views/dashboard/stores/kanban.ts +723 -0
- package/views/dashboard/stores/rbac.ts +350 -0
- package/views/dashboard/stx.config.ts +34 -0
- package/views/dashboard/teams/[id].stx +170 -0
- package/views/forum/category.stx +92 -0
- package/views/forum/index.stx +209 -0
- package/views/forum/new-topic.stx +113 -0
- package/views/forum/profile.stx +1 -0
- package/views/forum/topic.stx +143 -0
- package/views/hello-world/[name].stx +47 -0
- package/views/index.stx +21 -0
- package/views/system-tray/index.stx +147 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
@extends('layouts/default')
|
|
2
|
+
|
|
3
|
+
@section('content')
|
|
4
|
+
<div class="py-4 lg:py-8 min-h-screen dark:bg-neutral-800">
|
|
5
|
+
<div class="mb-8 px-4 sm:px-6 lg:px-8">
|
|
6
|
+
<h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-neutral-100">Last 30 days</h3>
|
|
7
|
+
<dl class="grid gap-5 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 mt-5">
|
|
8
|
+
<div class="overflow-hidden relative pt-5 px-4 sm:pt-6 sm:px-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
|
|
9
|
+
<dt>
|
|
10
|
+
<div class="absolute p-3 bg-blue-500 rounded-md">
|
|
11
|
+
<svg class="h-6 w-6 text-white" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" /></svg>
|
|
12
|
+
</div>
|
|
13
|
+
<p class="ml-16 font-medium text-gray-500 text-sm truncate">Total Users</p>
|
|
14
|
+
</dt>
|
|
15
|
+
<dd class="flex items-baseline ml-16 pb-6 sm:pb-7">
|
|
16
|
+
<p class="font-semibold text-2xl text-gray-900 dark:text-neutral-100">12,345</p>
|
|
17
|
+
<p class="flex items-baseline ml-2 font-semibold text-green-600 text-sm">678</p>
|
|
18
|
+
</dd>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="overflow-hidden relative pt-5 px-4 sm:pt-6 sm:px-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
|
|
21
|
+
<dt>
|
|
22
|
+
<div class="absolute p-3 bg-green-500 rounded-md">
|
|
23
|
+
<svg class="h-6 w-6 text-white" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" /></svg>
|
|
24
|
+
</div>
|
|
25
|
+
<p class="ml-16 font-medium text-gray-500 text-sm truncate">Active Sessions</p>
|
|
26
|
+
</dt>
|
|
27
|
+
<dd class="flex items-baseline ml-16 pb-6 sm:pb-7">
|
|
28
|
+
<p class="font-semibold text-2xl text-gray-900 dark:text-neutral-100">4,938</p>
|
|
29
|
+
<p class="flex items-baseline ml-2 font-semibold text-green-600 text-sm">271</p>
|
|
30
|
+
</dd>
|
|
31
|
+
</div>
|
|
32
|
+
</dl>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="mb-8 px-4 sm:px-6 lg:px-8">
|
|
36
|
+
<div class="bg-white dark:bg-neutral-700 rounded-lg shadow">
|
|
37
|
+
<div class="p-6">
|
|
38
|
+
<div class="flex items-center justify-between mb-6">
|
|
39
|
+
<div>
|
|
40
|
+
<h3 class="font-medium text-base text-gray-900 dark:text-neutral-100">User Growth & Activity</h3>
|
|
41
|
+
<p class="mt-1 text-gray-500 text-sm dark:text-neutral-400">Track user registrations and active sessions over time</p>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="flex items-center space-x-4">
|
|
44
|
+
<select x-model="timeRange" @change="changeTimeRange()" class="pl-3 pr-8 py-1.5 h-9 text-gray-900 text-sm dark:text-neutral-100 bg-gray-50 dark:bg-neutral-600 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 focus:ring-2 focus:ring-blue-600">
|
|
45
|
+
<option value="7">Last 7 days</option>
|
|
46
|
+
<option value="30">Last 30 days</option>
|
|
47
|
+
<option value="90">Last 90 days</option>
|
|
48
|
+
<option value="365">Last year</option>
|
|
49
|
+
</select>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="relative h-[400px]">
|
|
53
|
+
<div :show="isLoading" class="flex absolute inset-0 z-10 items-center justify-center bg-opacity-75 bg-white dark:bg-neutral-700 dark:bg-opacity-75">
|
|
54
|
+
<div class="h-8 w-8 border-b-2 border-blue-500 rounded-full animate-spin"></div>
|
|
55
|
+
</div>
|
|
56
|
+
<canvas id="user_growth_chart"></canvas>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="mb-8 px-4 sm:px-6 lg:px-8">
|
|
63
|
+
<div class="bg-white dark:bg-neutral-700 rounded-lg shadow">
|
|
64
|
+
<div class="p-6">
|
|
65
|
+
<div class="flex items-center justify-between mb-6">
|
|
66
|
+
<div>
|
|
67
|
+
<h3 class="font-medium text-base text-gray-900 dark:text-neutral-100">User Model Relationships</h3>
|
|
68
|
+
<p class="mt-1 text-gray-500 text-sm dark:text-neutral-400">Click any model to view details.</p>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="flex">
|
|
72
|
+
<div class="flex relative flex-1 flex-wrap gap-4 items-start justify-start p-4 h-[400px] bg-gray-50 dark:bg-neutral-600 rounded-lg">
|
|
73
|
+
<template :for="model in models">
|
|
74
|
+
<button type="button" @click="selectModel(model)" class="inline-flex flex-col items-center px-4 py-3 bg-white dark:bg-neutral-800 hover:bg-gray-100 dark:hover:bg-neutral-700 ring-1 ring-gray-200 rounded-lg dark:ring-neutral-600 shadow-sm">
|
|
75
|
+
<span class="text-3xl">{{ model.emoji }}</span>
|
|
76
|
+
<span class="mt-2 font-medium text-gray-900 text-sm dark:text-neutral-100">{{ model.name }}</span>
|
|
77
|
+
</button>
|
|
78
|
+
</template>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<div :show="selectedModel() !== null" class="ml-6 p-4 w-64 bg-gray-50 dark:bg-neutral-600 rounded-lg">
|
|
82
|
+
<div class="flex items-center mb-4">
|
|
83
|
+
<span class="mr-2 text-2xl">{{ selectedModel()?.emoji }}</span>
|
|
84
|
+
<h4 class="font-semibold text-gray-900 text-lg dark:text-neutral-100">{{ selectedModel()?.name }}</h4>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="mb-4">
|
|
87
|
+
<p class="text-gray-600 text-sm dark:text-neutral-400">{{ selectedModel()?.description }}</p>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="mb-4">
|
|
90
|
+
<h5 class="mb-2 font-medium text-gray-700 text-sm dark:text-neutral-300">Properties</h5>
|
|
91
|
+
<ul class="space-y-1">
|
|
92
|
+
<template :for="prop in (selectedModel?.properties ?? [])">
|
|
93
|
+
<li class="font-mono text-gray-600 text-sm dark:text-neutral-400">{{ prop }}</li>
|
|
94
|
+
</template>
|
|
95
|
+
</ul>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="mb-6">
|
|
98
|
+
<h5 class="mb-2 font-medium text-gray-700 text-sm dark:text-neutral-300">Relationships</h5>
|
|
99
|
+
<ul class="space-y-1">
|
|
100
|
+
<template :for="rel in (selectedModel?.relationships ?? [])">
|
|
101
|
+
<li class="font-mono text-sm">
|
|
102
|
+
<a :href="resolveModelRoute(rel)" class="text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300">{{ rel }}</a>
|
|
103
|
+
</li>
|
|
104
|
+
</template>
|
|
105
|
+
</ul>
|
|
106
|
+
</div>
|
|
107
|
+
<a :href="resolveModelRoute(selectedModel()?.id ?? '')" class="block px-4 py-2 w-full font-semibold text-center text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md shadow-sm">View Details</a>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="pt-12 px-4 sm:px-6 lg:px-8">
|
|
115
|
+
<div class="sm:flex sm:items-center">
|
|
116
|
+
<div class="sm:flex-auto">
|
|
117
|
+
<h1 class="font-semibold leading-6 text-base text-gray-900 dark:text-neutral-100">Users</h1>
|
|
118
|
+
<p class="mt-2 text-gray-700 text-sm dark:text-neutral-400">A list of all your project users.</p>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="sm:flex-none mt-4 sm:ml-16 sm:mt-0">
|
|
121
|
+
<button type="button" class="block px-3 py-2 font-semibold text-center text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 focus-visible:outline-offset-2 shadow-sm">Add User</button>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="flow-root mt-8">
|
|
125
|
+
<div class="overflow-x-auto -mx-4 -my-2 sm:-mx-6 lg:-mx-8">
|
|
126
|
+
<div class="inline-block py-2 sm:px-6 lg:px-8 min-w-full align-middle">
|
|
127
|
+
<div class="overflow-hidden ring-1 ring-black ring-opacity-5 sm:rounded-lg shadow">
|
|
128
|
+
<table class="min-w-full divide-gray-300 divide-y">
|
|
129
|
+
<thead class="bg-gray-50 dark:bg-neutral-700/50">
|
|
130
|
+
<tr>
|
|
131
|
+
<th class="pl-4 pr-3 py-3.5 sm:pl-6 font-semibold text-gray-900 text-left text-sm">ID</th>
|
|
132
|
+
<th class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm">Name</th>
|
|
133
|
+
<th class="px-3 py-3.5 font-semibold text-gray-900 text-right text-sm">Updated At</th>
|
|
134
|
+
<th class="px-3 py-3.5 font-semibold text-gray-900 text-right text-sm">Created At</th>
|
|
135
|
+
<th class="relative pl-3 pr-4 py-3.5 sm:pr-6"><span class="sr-only">Edit</span></th>
|
|
136
|
+
</tr>
|
|
137
|
+
</thead>
|
|
138
|
+
<tbody class="bg-white dark:bg-neutral-800 divide-gray-200 divide-y">
|
|
139
|
+
<tr>
|
|
140
|
+
<td class="pl-4 pr-3 py-4 sm:pl-6 font-medium text-gray-900 text-sm whitespace-nowrap">1</td>
|
|
141
|
+
<td class="px-3 py-4 text-gray-500 text-right text-sm whitespace-nowrap">
|
|
142
|
+
<div class="flex items-center">
|
|
143
|
+
<div class="flex-shrink-0 h-10 w-10"><img src="https://carefreeagency-eliinova.s3.amazonaws.com/images/avatar/default.svg" alt="" class="h-10 w-10 rounded-full" /></div>
|
|
144
|
+
<div class="ml-4">
|
|
145
|
+
<div class="flex items-center font-medium text-gray-900 text-sm dark:text-neutral-100">Chris Breuer</div>
|
|
146
|
+
<div class="text-gray-500 text-sm dark:text-neutral-400">chris@stacksjs.com</div>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
</td>
|
|
150
|
+
<td class="px-3 py-4 text-gray-500 text-right text-sm whitespace-nowrap">2024/01/22 11:00am</td>
|
|
151
|
+
<td class="px-3 py-4 text-gray-500 text-right text-sm whitespace-nowrap">2024/01/02 4:20pm</td>
|
|
152
|
+
<td class="relative pl-3 pr-4 py-4 sm:pr-6 font-medium text-right text-sm whitespace-nowrap"><a href="#" class="text-blue-600 hover:text-blue-900">Edit</a></td>
|
|
153
|
+
</tr>
|
|
154
|
+
</tbody>
|
|
155
|
+
</table>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<script client>
|
|
164
|
+
|
|
165
|
+
interface ChartLike { destroy: () => void, data: { labels: string[], datasets: Array<{ data: number[] }> }, update: () => void }
|
|
166
|
+
type ChartCtor = new (canvas: HTMLElement, config: { type: string, data: unknown, options?: unknown }) => ChartLike
|
|
167
|
+
|
|
168
|
+
interface ModelNode {
|
|
169
|
+
id: string
|
|
170
|
+
name: string
|
|
171
|
+
description: string
|
|
172
|
+
properties: string[]
|
|
173
|
+
relationships: string[]
|
|
174
|
+
emoji: string
|
|
175
|
+
color: string
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Model relationship graph — moved out of the former `<script server>` block
|
|
179
|
+
// (stacksjs/stacks#1838). Static for now; can be swapped for an API fetch
|
|
180
|
+
// without changing the page.
|
|
181
|
+
const models: ModelNode[] = [
|
|
182
|
+
{ id: 'user', name: 'User', description: 'Core user model representing application users with authentication and profile information.', properties: ['id', 'name', 'email', 'password'], relationships: ['teams', 'accessTokens', 'activities', 'posts'], emoji: '👤', color: '#2563EB' },
|
|
183
|
+
{ id: 'team', name: 'Team', description: 'Represents a group of users who collaborate together. Teams can have multiple users and users can belong to multiple teams.', properties: ['id', 'name', 'owner_id'], relationships: ['users'], emoji: '👥', color: '#60A5FA' },
|
|
184
|
+
{ id: 'accessToken', name: 'AccessToken', description: 'Manages API authentication tokens for users. Each token grants specific permissions for API access.', properties: ['id', 'token', 'user_id'], relationships: ['user'], emoji: '🔑', color: '#3B82F6' },
|
|
185
|
+
{ id: 'activity', name: 'Activity', description: 'Tracks user actions and events within the application for analytics and audit purposes.', properties: ['id', 'type', 'user_id'], relationships: ['user'], emoji: '📊', color: '#93C5FD' },
|
|
186
|
+
{ id: 'post', name: 'Post', description: 'User-generated content model for sharing updates, articles, or other text-based content.', properties: ['id', 'title', 'content'], relationships: ['user'], emoji: '📝', color: '#BFDBFE' },
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
const timeRange = state('30')
|
|
190
|
+
const isLoading = state(false)
|
|
191
|
+
const selectedModel = state<ModelNode | null>(null)
|
|
192
|
+
|
|
193
|
+
function selectModel(model: ModelNode) {
|
|
194
|
+
selectedModel.set(model)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function resolveModelRoute(id: string) {
|
|
198
|
+
const routes: Record<string, string> = {
|
|
199
|
+
user: '/models/users',
|
|
200
|
+
team: '/models/teams', teams: '/models/teams',
|
|
201
|
+
accessToken: '/models/access-tokens', accessTokens: '/models/access-tokens',
|
|
202
|
+
activity: '/models/activities', activities: '/models/activities',
|
|
203
|
+
post: '/models/posts', posts: '/models/posts',
|
|
204
|
+
}
|
|
205
|
+
return routes[id] || '/models'
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function formatDateOffset(daysAgo: number) {
|
|
209
|
+
const date = new Date()
|
|
210
|
+
date.setDate(date.getDate() - daysAgo)
|
|
211
|
+
return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function generateGrowthData(days: number, baseCount: number, dailyGrowth: number) {
|
|
215
|
+
return Array.from({ length: days }, (_, i) => {
|
|
216
|
+
const dayVariance = Math.random() * dailyGrowth * 0.5
|
|
217
|
+
const daysFromStart = days - 1 - i
|
|
218
|
+
return Math.floor(baseCount + (dailyGrowth * daysFromStart) + dayVariance)
|
|
219
|
+
}).reverse()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function buildSeries() {
|
|
223
|
+
const days = Number.parseInt(timeRange())
|
|
224
|
+
const labels = Array.from({ length: days }, (_, i) => formatDateOffset(days - 1 - i)).reverse()
|
|
225
|
+
return {
|
|
226
|
+
labels,
|
|
227
|
+
users: generateGrowthData(days, 2000, 20),
|
|
228
|
+
sessions: generateGrowthData(days, Math.floor(2000 * 0.4), Math.floor(20 * 0.4)),
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
let chartHandle: ChartLike | null = null
|
|
233
|
+
|
|
234
|
+
function changeTimeRange() {
|
|
235
|
+
if (!chartHandle)
|
|
236
|
+
return
|
|
237
|
+
const series = buildSeries()
|
|
238
|
+
chartHandle.data.labels = series.labels
|
|
239
|
+
chartHandle.data.datasets[0].data = series.users
|
|
240
|
+
chartHandle.data.datasets[1].data = series.sessions
|
|
241
|
+
chartHandle.update()
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
onMount(async () => {
|
|
245
|
+
const { Chart, registerables } = await import('@stacksjs/charts')
|
|
246
|
+
Chart.register(...registerables)
|
|
247
|
+
const Ctor = Chart as unknown as ChartCtor
|
|
248
|
+
const series = buildSeries()
|
|
249
|
+
chartHandle = useChart({
|
|
250
|
+
Chart: Ctor,
|
|
251
|
+
id: 'user_growth_chart',
|
|
252
|
+
type: 'line',
|
|
253
|
+
data: {
|
|
254
|
+
labels: series.labels,
|
|
255
|
+
datasets: [
|
|
256
|
+
{ label: 'Total Users', data: series.users, borderColor: 'rgb(59, 130, 246)', backgroundColor: 'rgba(59, 130, 246, 0.1)', fill: true, tension: 0.4 },
|
|
257
|
+
{ label: 'Active Sessions', data: series.sessions, borderColor: 'rgb(34, 197, 94)', backgroundColor: 'rgba(34, 197, 94, 0.1)', fill: true, tension: 0.4 },
|
|
258
|
+
],
|
|
259
|
+
},
|
|
260
|
+
options: {
|
|
261
|
+
responsive: true,
|
|
262
|
+
maintainAspectRatio: false,
|
|
263
|
+
scales: {
|
|
264
|
+
y: { type: 'linear', beginAtZero: true, grid: { color: 'rgba(200, 200, 200, 0.1)' }, ticks: { color: 'rgb(156, 163, 175)' } },
|
|
265
|
+
x: { type: 'category', grid: { display: false }, ticks: { color: 'rgb(156, 163, 175)' } },
|
|
266
|
+
},
|
|
267
|
+
plugins: { legend: { display: true, position: 'top', align: 'end', labels: { color: 'rgb(156, 163, 175)', boxWidth: 12, padding: 15 } } },
|
|
268
|
+
interaction: { mode: 'index', intersect: false },
|
|
269
|
+
},
|
|
270
|
+
}) as unknown as ChartLike
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
onDestroy(() => {
|
|
274
|
+
chartHandle?.destroy()
|
|
275
|
+
chartHandle = null
|
|
276
|
+
})
|
|
277
|
+
</script>
|
|
278
|
+
|
|
279
|
+
@endsection
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
@extends('layouts/default')
|
|
2
|
+
|
|
3
|
+
@section('content')
|
|
4
|
+
<script client>
|
|
5
|
+
|
|
6
|
+
interface Dependency {
|
|
7
|
+
name: string
|
|
8
|
+
version: string
|
|
9
|
+
status: 'installed' | 'pending' | 'outdated' | 'failed'
|
|
10
|
+
source?: 'pantry' | 'system'
|
|
11
|
+
description?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Placeholder rows — moved out of the former `<script server>` block
|
|
15
|
+
// (stacksjs/stacks#1838). Wire this up to `pantry list --json` (or
|
|
16
|
+
// whatever the real source of truth is) once the Pantry CLI exposes a
|
|
17
|
+
// listing API. The shape above is what the table renders against — keep
|
|
18
|
+
// it stable so the wiring is a one-line swap of `dependencies = …`.
|
|
19
|
+
const dependencies: Dependency[] = [
|
|
20
|
+
{ name: 'Node.js', version: '22.11.0', status: 'pending', source: 'pantry' },
|
|
21
|
+
{ name: 'Redis', version: '8.0.0', status: 'installed', source: 'pantry' },
|
|
22
|
+
{ name: 'PostgreSQL', version: '18.3', status: 'installed', source: 'pantry' },
|
|
23
|
+
{ name: 'Bun', version: '1.3.14', status: 'installed', source: 'system' },
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
const totalCount = dependencies.length
|
|
27
|
+
const installedCount = dependencies.filter(d => d.status === 'installed').length
|
|
28
|
+
const pendingCount = dependencies.filter(d => d.status === 'pending').length
|
|
29
|
+
|
|
30
|
+
function statusVariant(status: string) {
|
|
31
|
+
if (status === 'installed') return 'success'
|
|
32
|
+
if (status === 'pending') return 'warning'
|
|
33
|
+
if (status === 'outdated') return 'info'
|
|
34
|
+
if (status === 'failed') return 'danger'
|
|
35
|
+
return 'default'
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div class="mx-auto pb-12 pt-6 px-6 space-y-6 max-w-6xl">
|
|
40
|
+
|
|
41
|
+
<PageHeader
|
|
42
|
+
title="Dependencies"
|
|
43
|
+
description="Discover and manage system dependencies installed via Pantry"
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
<!-- Search row -->
|
|
47
|
+
<Card variant="default" padding="md">
|
|
48
|
+
<div class="flex gap-3 items-end">
|
|
49
|
+
<div class="flex-1 min-w-0">
|
|
50
|
+
<label class="block mb-1.5 font-medium text-neutral-700 text-sm dark:text-neutral-200">
|
|
51
|
+
Search the registry
|
|
52
|
+
</label>
|
|
53
|
+
<div class="relative">
|
|
54
|
+
<svg class="absolute left-3 top-1/2 h-4 w-4 text-neutral-400 pointer-events-none -translate-y-1/2" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
55
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
|
56
|
+
</svg>
|
|
57
|
+
<input
|
|
58
|
+
type="search"
|
|
59
|
+
name="dependency-search"
|
|
60
|
+
placeholder="redis, postgresql, openssl…"
|
|
61
|
+
class="block pl-9 pr-3 py-2 w-full text-neutral-900 text-sm dark:text-white placeholder:text-neutral-400 bg-white dark:bg-white/5 border border-black/10 rounded-lg dark:border-white/15 focus:border-blue-500/50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 shadow-sm"
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
<Button type="submit" variant="primary" size="md">Search</Button>
|
|
66
|
+
</div>
|
|
67
|
+
<p class="mt-3 text-neutral-500 text-xs dark:text-neutral-400">
|
|
68
|
+
Dependencies install through <a href="https://github.com/stacksjs/pantry" target="_blank" rel="noopener" class="font-medium text-blue-600 dark:text-blue-400 hover:underline">Pantry</a> —
|
|
69
|
+
our package manager and registry. Installed binaries land in <code class="px-1 py-0.5 font-mono text-[11px] bg-black/5 dark:bg-white/10 rounded">pantry/.bin</code>.
|
|
70
|
+
</p>
|
|
71
|
+
</Card>
|
|
72
|
+
|
|
73
|
+
<!-- Stats -->
|
|
74
|
+
<div class="grid gap-3 grid-cols-3">
|
|
75
|
+
<Card variant="default" padding="md">
|
|
76
|
+
<div class="flex gap-3 items-center">
|
|
77
|
+
<div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-blue-600 dark:text-blue-400 bg-blue-500/10 dark:bg-blue-400/15 rounded-lg">
|
|
78
|
+
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.8">
|
|
79
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"/>
|
|
80
|
+
</svg>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="min-w-0">
|
|
83
|
+
<p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Total</p>
|
|
84
|
+
<p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ totalCount }}</p>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</Card>
|
|
88
|
+
<Card variant="default" padding="md">
|
|
89
|
+
<div class="flex gap-3 items-center">
|
|
90
|
+
<div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-green-600 dark:text-green-400 bg-green-500/10 dark:bg-green-400/15 rounded-lg">
|
|
91
|
+
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
92
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/>
|
|
93
|
+
</svg>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="min-w-0">
|
|
96
|
+
<p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Installed</p>
|
|
97
|
+
<p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ installedCount }}</p>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</Card>
|
|
101
|
+
<Card variant="default" padding="md">
|
|
102
|
+
<div class="flex gap-3 items-center">
|
|
103
|
+
<div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-amber-600 dark:text-amber-400 bg-amber-500/10 dark:bg-amber-400/15 rounded-lg">
|
|
104
|
+
<svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
105
|
+
<circle cx="12" cy="12" r="9"/>
|
|
106
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M12 7v5l3 2"/>
|
|
107
|
+
</svg>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="min-w-0">
|
|
110
|
+
<p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Pending</p>
|
|
111
|
+
<p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ pendingCount }}</p>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</Card>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<!-- Installed table -->
|
|
118
|
+
<Card variant="default" padding="none">
|
|
119
|
+
<div class="flex items-baseline justify-between px-5 py-4 border-b border-neutral-200/60 dark:border-white/5">
|
|
120
|
+
<div>
|
|
121
|
+
<h3 class="font-semibold text-base text-neutral-900 dark:text-white">Installed</h3>
|
|
122
|
+
<p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">
|
|
123
|
+
{{ totalCount }} {{ totalCount === 1 ? 'dependency' : 'dependencies' }} tracked by Pantry
|
|
124
|
+
</p>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
@if(dependencies.length === 0)
|
|
129
|
+
<div class="p-8">
|
|
130
|
+
<EmptyState
|
|
131
|
+
title="No dependencies yet"
|
|
132
|
+
description="Search above to install your first dependency."
|
|
133
|
+
/>
|
|
134
|
+
</div>
|
|
135
|
+
@else
|
|
136
|
+
<div class="overflow-x-auto">
|
|
137
|
+
<table class="min-w-full divide-neutral-200/60 divide-y dark:divide-white/5">
|
|
138
|
+
<thead class="bg-neutral-50/60 dark:bg-white/[0.02]">
|
|
139
|
+
<tr>
|
|
140
|
+
<th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Name</th>
|
|
141
|
+
<th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Version</th>
|
|
142
|
+
<th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Source</th>
|
|
143
|
+
<th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Status</th>
|
|
144
|
+
<th class="px-5 py-2.5 text-right">
|
|
145
|
+
<span class="sr-only">Actions</span>
|
|
146
|
+
</th>
|
|
147
|
+
</tr>
|
|
148
|
+
</thead>
|
|
149
|
+
<tbody class="divide-neutral-200/60 divide-y dark:divide-white/5">
|
|
150
|
+
<template :for="dep in dependencies">
|
|
151
|
+
<tr class="hover:bg-neutral-50/70 dark:hover:bg-white/[0.02] transition-colors">
|
|
152
|
+
<td class="px-5 py-3 font-medium text-neutral-900 text-sm dark:text-white">{{ dep.name }}</td>
|
|
153
|
+
<td class="px-5 py-3 font-mono tabular-nums text-[13px] text-neutral-500 dark:text-neutral-400">{{ dep.version }}</td>
|
|
154
|
+
<td class="px-5 py-3 capitalize text-neutral-500 text-sm dark:text-neutral-400">{{ dep.source ?? 'unknown' }}</td>
|
|
155
|
+
<td class="px-5 py-3">
|
|
156
|
+
<Badge :variant="statusVariant(dep.status)" size="sm">{{ dep.status }}</Badge>
|
|
157
|
+
</td>
|
|
158
|
+
<td class="px-5 py-3 text-right">
|
|
159
|
+
<div class="inline-flex gap-1">
|
|
160
|
+
<div :if="dep.status === 'installed'" class="inline-flex gap-1">
|
|
161
|
+
<Button variant="secondary" size="sm">Upgrade</Button>
|
|
162
|
+
<Button variant="ghost" size="sm">Remove</Button>
|
|
163
|
+
</div>
|
|
164
|
+
<div :if="dep.status !== 'installed'">
|
|
165
|
+
<Button variant="primary" size="sm">Install</Button>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</td>
|
|
169
|
+
</tr>
|
|
170
|
+
</template>
|
|
171
|
+
</tbody>
|
|
172
|
+
</table>
|
|
173
|
+
</div>
|
|
174
|
+
@endif
|
|
175
|
+
</Card>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
@endsection
|