@stacksjs/defaults 0.70.206 → 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,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Search Composable
|
|
3
|
+
*
|
|
4
|
+
* Provides search functionality across all models for the dashboard.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ref } from '@stacksjs/stx'
|
|
8
|
+
|
|
9
|
+
const baseUrl = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
10
|
+
|
|
11
|
+
export interface SearchResultItem {
|
|
12
|
+
id: string | number
|
|
13
|
+
title: string
|
|
14
|
+
subtitle?: string
|
|
15
|
+
href: string
|
|
16
|
+
icon: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface SearchResults {
|
|
20
|
+
[modelType: string]: SearchResultItem[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const modelIcons: Record<string, string> = {
|
|
24
|
+
users: 'i-hugeicons-user-group',
|
|
25
|
+
products: 'i-hugeicons-shopping-bag-02',
|
|
26
|
+
customers: 'i-hugeicons-user-02',
|
|
27
|
+
orders: 'i-hugeicons-shopping-cart-01',
|
|
28
|
+
posts: 'i-hugeicons-note-edit',
|
|
29
|
+
pages: 'i-hugeicons-file-02',
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let searchTimeout: ReturnType<typeof setTimeout> | null = null
|
|
33
|
+
|
|
34
|
+
export function useGlobalSearch() {
|
|
35
|
+
const query = ref('')
|
|
36
|
+
const results = ref<SearchResults>({})
|
|
37
|
+
const isSearching = ref(false)
|
|
38
|
+
const isOpen = ref(false)
|
|
39
|
+
const selectedIndex = ref(0)
|
|
40
|
+
|
|
41
|
+
async function search(q: string) {
|
|
42
|
+
if (!q.trim()) {
|
|
43
|
+
results.value = {}
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
isSearching.value = true
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(`${baseUrl}/search?q=${encodeURIComponent(q)}`, {
|
|
51
|
+
headers: { 'Accept': 'application/json' },
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
if (response.ok) {
|
|
55
|
+
const data = await response.json()
|
|
56
|
+
results.value = data.results || {}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
console.error('Search failed:', e)
|
|
61
|
+
results.value = {}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
isSearching.value = false
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function debouncedSearch(q: string) {
|
|
69
|
+
query.value = q
|
|
70
|
+
if (searchTimeout) clearTimeout(searchTimeout)
|
|
71
|
+
searchTimeout = setTimeout(() => search(q), 300)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function open() {
|
|
75
|
+
isOpen.value = true
|
|
76
|
+
selectedIndex.value = 0
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function close() {
|
|
80
|
+
isOpen.value = false
|
|
81
|
+
query.value = ''
|
|
82
|
+
results.value = {}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function flatResults(): SearchResultItem[] {
|
|
86
|
+
return Object.values(results.value).flat()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function moveUp() {
|
|
90
|
+
const items = flatResults()
|
|
91
|
+
if (items.length === 0) return
|
|
92
|
+
selectedIndex.value = selectedIndex.value <= 0 ? items.length - 1 : selectedIndex.value - 1
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function moveDown() {
|
|
96
|
+
const items = flatResults()
|
|
97
|
+
if (items.length === 0) return
|
|
98
|
+
selectedIndex.value = selectedIndex.value >= items.length - 1 ? 0 : selectedIndex.value + 1
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function selectCurrent(): string | null {
|
|
102
|
+
const items = flatResults()
|
|
103
|
+
const selected = items[selectedIndex.value]
|
|
104
|
+
if (selected) {
|
|
105
|
+
close()
|
|
106
|
+
return selected.href
|
|
107
|
+
}
|
|
108
|
+
return null
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
query,
|
|
113
|
+
results,
|
|
114
|
+
isSearching,
|
|
115
|
+
isOpen,
|
|
116
|
+
selectedIndex,
|
|
117
|
+
modelIcons,
|
|
118
|
+
search: debouncedSearch,
|
|
119
|
+
open,
|
|
120
|
+
close,
|
|
121
|
+
moveUp,
|
|
122
|
+
moveDown,
|
|
123
|
+
selectCurrent,
|
|
124
|
+
flatResults,
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { state } from '@stacksjs/stx'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight global toast notification system for the dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists: every commerce/CMS composable was swallowing fetch
|
|
7
|
+
* failures with `console.error`, which is invisible to the user — they'd
|
|
8
|
+
* click "Save" and see nothing happen. `pushToast()` surfaces the result
|
|
9
|
+
* via the `<ToastList>` rendered in the dashboard layout.
|
|
10
|
+
*
|
|
11
|
+
* Usage from a composable:
|
|
12
|
+
*
|
|
13
|
+
* try { ... }
|
|
14
|
+
* catch (err) {
|
|
15
|
+
* pushToast('error', 'Failed to save customer', { detail: String(err) })
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* Usage from a `<script client>` block: import `useToasts` and call
|
|
19
|
+
* `pushToast(...)` directly.
|
|
20
|
+
*
|
|
21
|
+
* The store is a `state()` signal so templates can iterate it with
|
|
22
|
+
* `@foreach(toasts() as toast)` and stay reactive. Toasts live in
|
|
23
|
+
* memory only — they intentionally do NOT persist across reloads,
|
|
24
|
+
* since stale "Failed to save 30 minutes ago" messages would be
|
|
25
|
+
* worse than no message.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type ToastType = 'success' | 'error' | 'warning' | 'info'
|
|
29
|
+
|
|
30
|
+
export interface Toast {
|
|
31
|
+
readonly id: number
|
|
32
|
+
readonly type: ToastType
|
|
33
|
+
readonly title: string
|
|
34
|
+
/** Secondary line — typically the underlying error message. */
|
|
35
|
+
readonly detail?: string
|
|
36
|
+
/** Auto-dismiss in ms. 0 = sticky (user must dismiss). */
|
|
37
|
+
readonly durationMs: number
|
|
38
|
+
/** Wall-clock timestamp at push time, for ordering / display. */
|
|
39
|
+
readonly createdAt: number
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface PushToastOptions {
|
|
43
|
+
detail?: string
|
|
44
|
+
/** Override the default auto-dismiss duration (ms). 0 to make sticky. */
|
|
45
|
+
durationMs?: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const toasts = state<Toast[]>([])
|
|
49
|
+
let nextId = 1
|
|
50
|
+
|
|
51
|
+
// Errors get longer dwell because a user might need to read & screenshot.
|
|
52
|
+
// Success is short — it's just a "yep, that worked" pat on the back.
|
|
53
|
+
const DEFAULT_DURATION_MS: Record<ToastType, number> = {
|
|
54
|
+
success: 4000,
|
|
55
|
+
info: 4000,
|
|
56
|
+
warning: 6000,
|
|
57
|
+
error: 8000,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function pushToast(type: ToastType, title: string, opts: PushToastOptions = {}): number {
|
|
61
|
+
const id = nextId++
|
|
62
|
+
const durationMs = opts.durationMs ?? DEFAULT_DURATION_MS[type]
|
|
63
|
+
const toast: Toast = {
|
|
64
|
+
id,
|
|
65
|
+
type,
|
|
66
|
+
title,
|
|
67
|
+
detail: opts.detail,
|
|
68
|
+
durationMs,
|
|
69
|
+
createdAt: Date.now(),
|
|
70
|
+
}
|
|
71
|
+
toasts.update(arr => [...arr, toast])
|
|
72
|
+
|
|
73
|
+
if (durationMs > 0 && typeof globalThis.setTimeout === 'function') {
|
|
74
|
+
globalThis.setTimeout(() => dismissToast(id), durationMs)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return id
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function dismissToast(id: number): void {
|
|
81
|
+
toasts.update(arr => arr.filter(t => t.id !== id))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function clearAllToasts(): void {
|
|
85
|
+
toasts.set([])
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function useToasts() {
|
|
89
|
+
return {
|
|
90
|
+
toasts,
|
|
91
|
+
pushToast,
|
|
92
|
+
dismissToast,
|
|
93
|
+
clearAllToasts,
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct-upload composable (stacksjs/stacks#1856 Stage 6).
|
|
3
|
+
*
|
|
4
|
+
* Pairs with `Storage.disk('s3').presignedUploadUrl(...)` on the
|
|
5
|
+
* server: the browser hits a small "presign" endpoint, gets a
|
|
6
|
+
* presigned PUT URL back, and uploads bytes directly to S3 (or any
|
|
7
|
+
* S3-compatible backend) without round-tripping through the app
|
|
8
|
+
* server. The app server only sees the final `{ url, path }` once the
|
|
9
|
+
* upload resolves — large file payloads never pass through it.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* // In a dashboard page's `<script client>`:
|
|
14
|
+
* import { useDirectUpload } from '../../functions/uploads'
|
|
15
|
+
*
|
|
16
|
+
* const { upload, progress, error, isUploading, reset } = useDirectUpload({
|
|
17
|
+
* presignEndpoint: '/api/me/avatar/presign',
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* async function onFileChange(e) {
|
|
21
|
+
* const file = e.target.files?.[0]
|
|
22
|
+
* if (!file) return
|
|
23
|
+
* const result = await upload(file)
|
|
24
|
+
* if (result) {
|
|
25
|
+
* // persist `result.path` against the user record via a normal
|
|
26
|
+
* // POST to your own action — this composable does NOT touch
|
|
27
|
+
* // your DB; it only handles the browser-to-S3 leg.
|
|
28
|
+
* await fetch('/api/me/avatar', {
|
|
29
|
+
* method: 'POST',
|
|
30
|
+
* body: JSON.stringify({ path: result.path }),
|
|
31
|
+
* })
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* Why not use `fetch()`? `XMLHttpRequest` is still the only way to get
|
|
37
|
+
* upload progress events in the browser. `fetch()`'s streams API
|
|
38
|
+
* lacks an `upload.onprogress` equivalent across the major engines as
|
|
39
|
+
* of this writing.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import { state } from '@stacksjs/stx'
|
|
43
|
+
import { useAuth } from './auth'
|
|
44
|
+
|
|
45
|
+
export interface PresignResponse {
|
|
46
|
+
/** The presigned URL the browser PUTs to. */
|
|
47
|
+
url: string
|
|
48
|
+
/** Storage path the file lands at (persist this alongside the user record). */
|
|
49
|
+
path: string
|
|
50
|
+
/** Stable storage key (mirrors `path` when no prefix is configured). */
|
|
51
|
+
key?: string
|
|
52
|
+
/** MIME type the URL was signed against. The PUT must match exactly. */
|
|
53
|
+
contentType: string
|
|
54
|
+
/** Advisory size cap. Not enforced by S3 on a presigned PUT — see server-side note. */
|
|
55
|
+
maxBytes?: number
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface DirectUploadResult {
|
|
59
|
+
/** Storage path of the uploaded file. Persist this. */
|
|
60
|
+
path: string
|
|
61
|
+
/** Echoed back from the presign response for caller convenience. */
|
|
62
|
+
key?: string
|
|
63
|
+
/** Stored MIME type. */
|
|
64
|
+
contentType: string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface UseDirectUploadOptions {
|
|
68
|
+
/**
|
|
69
|
+
* Endpoint that returns a {@link PresignResponse}. Called with
|
|
70
|
+
* `POST { contentType, size, filename }` so the server can pick the
|
|
71
|
+
* right disk + filename + maxBytes for the file.
|
|
72
|
+
*/
|
|
73
|
+
presignEndpoint: string
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Optional progress callback. Receives a percentage `0..100`.
|
|
77
|
+
* Use this when you want side-effects beyond the `progress` signal
|
|
78
|
+
* (e.g. analytics events).
|
|
79
|
+
*/
|
|
80
|
+
onProgress?: (percent: number) => void
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Optional bearer token override. Defaults to the value from
|
|
84
|
+
* `useAuth().getToken()` so the presign endpoint sees the same auth
|
|
85
|
+
* the rest of the dashboard uses.
|
|
86
|
+
*/
|
|
87
|
+
authToken?: string
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface UseDirectUploadHandle {
|
|
91
|
+
/** Trigger the upload. Returns the storage path on success, `null` on failure. */
|
|
92
|
+
upload: (file: File) => Promise<DirectUploadResult | null>
|
|
93
|
+
/** Upload progress as a 0..100 percentage. */
|
|
94
|
+
progress: () => number
|
|
95
|
+
/** True while the upload is in-flight. */
|
|
96
|
+
isUploading: () => boolean
|
|
97
|
+
/** Last error message, or `null` if the most recent upload succeeded. */
|
|
98
|
+
error: () => string | null
|
|
99
|
+
/** Reset progress + error state to their initial values. */
|
|
100
|
+
reset: () => void
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function useDirectUpload(options: UseDirectUploadOptions): UseDirectUploadHandle {
|
|
104
|
+
const progress = state(0)
|
|
105
|
+
const isUploading = state(false)
|
|
106
|
+
const error = state<string | null>(null)
|
|
107
|
+
|
|
108
|
+
function reset(): void {
|
|
109
|
+
progress.set(0)
|
|
110
|
+
isUploading.set(false)
|
|
111
|
+
error.set(null)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function presign(file: File): Promise<PresignResponse> {
|
|
115
|
+
const token = options.authToken ?? useAuth().getToken()
|
|
116
|
+
const headers: Record<string, string> = {
|
|
117
|
+
'Accept': 'application/json',
|
|
118
|
+
'Content-Type': 'application/json',
|
|
119
|
+
}
|
|
120
|
+
if (token) headers.Authorization = `Bearer ${token}`
|
|
121
|
+
|
|
122
|
+
const res = await fetch(options.presignEndpoint, {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers,
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
contentType: file.type || 'application/octet-stream',
|
|
127
|
+
size: file.size,
|
|
128
|
+
filename: file.name,
|
|
129
|
+
}),
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
if (!res.ok) {
|
|
133
|
+
const body = await res.text().catch(() => '')
|
|
134
|
+
throw new Error(`Presign endpoint returned ${res.status}: ${body || res.statusText}`)
|
|
135
|
+
}
|
|
136
|
+
return await res.json() as PresignResponse
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* PUT the file straight to the storage backend. Uses XHR so we can
|
|
141
|
+
* surface progress — `fetch()` lacks a portable upload-progress API.
|
|
142
|
+
*/
|
|
143
|
+
function uploadDirect(file: File, presigned: PresignResponse): Promise<void> {
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
const xhr = new XMLHttpRequest()
|
|
146
|
+
xhr.open('PUT', presigned.url, true)
|
|
147
|
+
xhr.setRequestHeader('Content-Type', presigned.contentType)
|
|
148
|
+
|
|
149
|
+
xhr.upload.onprogress = (event) => {
|
|
150
|
+
if (event.lengthComputable) {
|
|
151
|
+
const percent = Math.floor((event.loaded / event.total) * 100)
|
|
152
|
+
progress.set(percent)
|
|
153
|
+
options.onProgress?.(percent)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
xhr.onload = () => {
|
|
158
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
159
|
+
progress.set(100)
|
|
160
|
+
options.onProgress?.(100)
|
|
161
|
+
resolve()
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
reject(new Error(`Direct upload failed: HTTP ${xhr.status} ${xhr.statusText}`))
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
xhr.onerror = () => reject(new Error('Direct upload failed: network error'))
|
|
169
|
+
xhr.onabort = () => reject(new Error('Direct upload aborted'))
|
|
170
|
+
|
|
171
|
+
xhr.send(file)
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function upload(file: File): Promise<DirectUploadResult | null> {
|
|
176
|
+
reset()
|
|
177
|
+
isUploading.set(true)
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
const presigned = await presign(file)
|
|
181
|
+
|
|
182
|
+
// Advisory client-side size check. The server can't actually
|
|
183
|
+
// enforce maxBytes on a simple presigned PUT (see the server-
|
|
184
|
+
// side comment in `S3StorageAdapter.presignedUploadUrl`), so
|
|
185
|
+
// this catches honest mistakes here rather than letting them
|
|
186
|
+
// upload a 100MB file just to discover the policy later.
|
|
187
|
+
if (presigned.maxBytes && file.size > presigned.maxBytes) {
|
|
188
|
+
throw new Error(`File too large: ${file.size} bytes exceeds the ${presigned.maxBytes}-byte cap.`)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
await uploadDirect(file, presigned)
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
path: presigned.path,
|
|
195
|
+
key: presigned.key,
|
|
196
|
+
contentType: presigned.contentType,
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
const message = e instanceof Error ? e.message : String(e)
|
|
201
|
+
error.set(message)
|
|
202
|
+
return null
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
isUploading.set(false)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
upload,
|
|
211
|
+
progress: () => progress(),
|
|
212
|
+
isUploading: () => isUploading(),
|
|
213
|
+
error: () => error(),
|
|
214
|
+
reset,
|
|
215
|
+
}
|
|
216
|
+
}
|
package/ide/.gitignore
ADDED