@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.
Files changed (408) hide show
  1. package/TODO.md +21 -0
  2. package/ai/AGENTS.md +79 -0
  3. package/ai/README.md +45 -0
  4. package/ai/claude/launch.json +12 -0
  5. package/ai/skills/stacks-actions/SKILL.md +128 -0
  6. package/ai/skills/stacks-ai/SKILL.md +276 -0
  7. package/ai/skills/stacks-alias/SKILL.md +94 -0
  8. package/ai/skills/stacks-analytics/SKILL.md +91 -0
  9. package/ai/skills/stacks-api/SKILL.md +738 -0
  10. package/ai/skills/stacks-arrays/SKILL.md +277 -0
  11. package/ai/skills/stacks-auth/SKILL.md +422 -0
  12. package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
  13. package/ai/skills/stacks-brandkit/SKILL.md +811 -0
  14. package/ai/skills/stacks-browse/SKILL.md +127 -0
  15. package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
  16. package/ai/skills/stacks-browser/SKILL.md +145 -0
  17. package/ai/skills/stacks-buddy/SKILL.md +676 -0
  18. package/ai/skills/stacks-build/SKILL.md +163 -0
  19. package/ai/skills/stacks-cache/SKILL.md +125 -0
  20. package/ai/skills/stacks-calendar/SKILL.md +113 -0
  21. package/ai/skills/stacks-chat/SKILL.md +371 -0
  22. package/ai/skills/stacks-cli/SKILL.md +112 -0
  23. package/ai/skills/stacks-cloud/SKILL.md +192 -0
  24. package/ai/skills/stacks-cms/SKILL.md +217 -0
  25. package/ai/skills/stacks-collections/SKILL.md +82 -0
  26. package/ai/skills/stacks-commerce/SKILL.md +114 -0
  27. package/ai/skills/stacks-composables/SKILL.md +161 -0
  28. package/ai/skills/stacks-config/SKILL.md +144 -0
  29. package/ai/skills/stacks-configuration/SKILL.md +154 -0
  30. package/ai/skills/stacks-cron/SKILL.md +123 -0
  31. package/ai/skills/stacks-crosswind/SKILL.md +190 -0
  32. package/ai/skills/stacks-dashboard/SKILL.md +173 -0
  33. package/ai/skills/stacks-database/SKILL.md +286 -0
  34. package/ai/skills/stacks-datetime/SKILL.md +269 -0
  35. package/ai/skills/stacks-dependencies/SKILL.md +111 -0
  36. package/ai/skills/stacks-deploy/SKILL.md +102 -0
  37. package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
  38. package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
  39. package/ai/skills/stacks-design-output/SKILL.md +55 -0
  40. package/ai/skills/stacks-design-soft/SKILL.md +156 -0
  41. package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
  42. package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
  43. package/ai/skills/stacks-desktop/SKILL.md +78 -0
  44. package/ai/skills/stacks-development/SKILL.md +298 -0
  45. package/ai/skills/stacks-dns/SKILL.md +149 -0
  46. package/ai/skills/stacks-docs/SKILL.md +109 -0
  47. package/ai/skills/stacks-email/SKILL.md +236 -0
  48. package/ai/skills/stacks-enums/SKILL.md +100 -0
  49. package/ai/skills/stacks-env/SKILL.md +181 -0
  50. package/ai/skills/stacks-error-handling/SKILL.md +137 -0
  51. package/ai/skills/stacks-events/SKILL.md +228 -0
  52. package/ai/skills/stacks-faker/SKILL.md +158 -0
  53. package/ai/skills/stacks-git/SKILL.md +158 -0
  54. package/ai/skills/stacks-guard/SKILL.md +98 -0
  55. package/ai/skills/stacks-health/SKILL.md +75 -0
  56. package/ai/skills/stacks-http/SKILL.md +316 -0
  57. package/ai/skills/stacks-i18n/SKILL.md +198 -0
  58. package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
  59. package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
  60. package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
  61. package/ai/skills/stacks-investigate/SKILL.md +119 -0
  62. package/ai/skills/stacks-jobs/SKILL.md +136 -0
  63. package/ai/skills/stacks-lint/SKILL.md +184 -0
  64. package/ai/skills/stacks-listeners/SKILL.md +99 -0
  65. package/ai/skills/stacks-logging/SKILL.md +78 -0
  66. package/ai/skills/stacks-mail/SKILL.md +120 -0
  67. package/ai/skills/stacks-middleware/SKILL.md +249 -0
  68. package/ai/skills/stacks-migrations/SKILL.md +105 -0
  69. package/ai/skills/stacks-models/SKILL.md +267 -0
  70. package/ai/skills/stacks-new-feature/SKILL.md +206 -0
  71. package/ai/skills/stacks-notifications/SKILL.md +210 -0
  72. package/ai/skills/stacks-objects/SKILL.md +205 -0
  73. package/ai/skills/stacks-office-hours/SKILL.md +134 -0
  74. package/ai/skills/stacks-orm/SKILL.md +342 -0
  75. package/ai/skills/stacks-path/SKILL.md +118 -0
  76. package/ai/skills/stacks-payments/SKILL.md +373 -0
  77. package/ai/skills/stacks-plan-review/SKILL.md +152 -0
  78. package/ai/skills/stacks-plugins/SKILL.md +149 -0
  79. package/ai/skills/stacks-push/SKILL.md +376 -0
  80. package/ai/skills/stacks-query-builder/SKILL.md +128 -0
  81. package/ai/skills/stacks-queue/SKILL.md +559 -0
  82. package/ai/skills/stacks-realtime/SKILL.md +442 -0
  83. package/ai/skills/stacks-redesign/SKILL.md +182 -0
  84. package/ai/skills/stacks-registry/SKILL.md +58 -0
  85. package/ai/skills/stacks-repl/SKILL.md +80 -0
  86. package/ai/skills/stacks-retro/SKILL.md +122 -0
  87. package/ai/skills/stacks-review/SKILL.md +135 -0
  88. package/ai/skills/stacks-router/SKILL.md +231 -0
  89. package/ai/skills/stacks-routes/SKILL.md +105 -0
  90. package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
  91. package/ai/skills/stacks-scheduler/SKILL.md +363 -0
  92. package/ai/skills/stacks-search-engine/SKILL.md +112 -0
  93. package/ai/skills/stacks-security/SKILL.md +129 -0
  94. package/ai/skills/stacks-security-audit/SKILL.md +128 -0
  95. package/ai/skills/stacks-server/SKILL.md +458 -0
  96. package/ai/skills/stacks-shell/SKILL.md +62 -0
  97. package/ai/skills/stacks-slug/SKILL.md +87 -0
  98. package/ai/skills/stacks-sms/SKILL.md +385 -0
  99. package/ai/skills/stacks-socials/SKILL.md +303 -0
  100. package/ai/skills/stacks-storage/SKILL.md +576 -0
  101. package/ai/skills/stacks-strings/SKILL.md +416 -0
  102. package/ai/skills/stacks-stx/SKILL.md +176 -0
  103. package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
  104. package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
  105. package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
  106. package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
  107. package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
  108. package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
  109. package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
  110. package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
  111. package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
  112. package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
  113. package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
  114. package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
  115. package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
  116. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
  117. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
  118. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
  119. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
  120. package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
  121. package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
  122. package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
  123. package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
  124. package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
  125. package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
  126. package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
  127. package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
  128. package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
  129. package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
  130. package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
  131. package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
  132. package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
  133. package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
  134. package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
  135. package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
  136. package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
  137. package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
  138. package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
  139. package/ai/skills/stacks-testing/SKILL.md +129 -0
  140. package/ai/skills/stacks-tunnel/SKILL.md +125 -0
  141. package/ai/skills/stacks-types/SKILL.md +178 -0
  142. package/ai/skills/stacks-ui/SKILL.md +246 -0
  143. package/ai/skills/stacks-utils/SKILL.md +444 -0
  144. package/ai/skills/stacks-validation/SKILL.md +371 -0
  145. package/ai/skills/stacks-whois/SKILL.md +315 -0
  146. package/assets/world-map-data.ts +121 -0
  147. package/bootstrap.ts +114 -0
  148. package/docs/api-examples.md +46 -0
  149. package/docs/index.md +24 -0
  150. package/docs/markdown-examples.md +87 -0
  151. package/functions/analytics.ts +97 -0
  152. package/functions/api.ts +143 -0
  153. package/functions/auth.ts +208 -0
  154. package/functions/billing/payments.ts +149 -0
  155. package/functions/blog.ts +120 -0
  156. package/functions/cms/categorizables.ts +107 -0
  157. package/functions/cms/pages.ts +108 -0
  158. package/functions/cms/posts.ts +100 -0
  159. package/functions/cms/taggables.ts +102 -0
  160. package/functions/commerce/coupons.ts +128 -0
  161. package/functions/commerce/customers.ts +128 -0
  162. package/functions/commerce/gift-cards.ts +119 -0
  163. package/functions/commerce/orders.ts +112 -0
  164. package/functions/commerce/payments.ts +119 -0
  165. package/functions/commerce/products/categories.ts +123 -0
  166. package/functions/commerce/products/manufacturers.ts +123 -0
  167. package/functions/commerce/products/products.ts +123 -0
  168. package/functions/commerce/products/reviews.ts +123 -0
  169. package/functions/commerce/products/units.ts +123 -0
  170. package/functions/commerce/products/variants.ts +123 -0
  171. package/functions/commerce/shippings/delivery-routes.ts +123 -0
  172. package/functions/commerce/shippings/digital-deliveries.ts +119 -0
  173. package/functions/commerce/shippings/drivers.ts +123 -0
  174. package/functions/commerce/shippings/license-keys.ts +123 -0
  175. package/functions/commerce/shippings/shipping-methods.ts +123 -0
  176. package/functions/commerce/shippings/shipping-rates.ts +119 -0
  177. package/functions/commerce/shippings/shipping-zones.ts +119 -0
  178. package/functions/commerce/taxes.ts +119 -0
  179. package/functions/commerce/waitlist/products.ts +123 -0
  180. package/functions/commerce/waitlist/restaurants.ts +123 -0
  181. package/functions/craft.ts +107 -0
  182. package/functions/dashboard.ts +153 -0
  183. package/functions/inbox.ts +95 -0
  184. package/functions/jobs.ts +86 -0
  185. package/functions/monitoring/errors.ts +295 -0
  186. package/functions/queue.ts +111 -0
  187. package/functions/realtime/websockets.ts +96 -0
  188. package/functions/realtime.ts +52 -0
  189. package/functions/releases.ts +49 -0
  190. package/functions/search.ts +126 -0
  191. package/functions/toasts.ts +95 -0
  192. package/functions/uploads.ts +216 -0
  193. package/ide/.gitignore +4 -0
  194. package/ide/cursor/rules/auto-imports.mdc +574 -0
  195. package/ide/cursor/rules/code-style.mdc +12 -0
  196. package/ide/cursor/rules/documentation.mdc +9 -0
  197. package/ide/cursor/rules/error-handling-validation.mdc +11 -0
  198. package/ide/cursor/rules/key-conventions.mdc +11 -0
  199. package/ide/cursor/rules/project-structure.mdc +169 -0
  200. package/ide/cursor/rules/readme.mdc +318 -0
  201. package/ide/cursor/rules/syntax-formatting.mdc +9 -0
  202. package/ide/cursor/rules/testing.mdc +10 -0
  203. package/ide/cursor/rules/typescript.mdc +9 -0
  204. package/ide/cursor/rules/ui-styling.mdc +0 -0
  205. package/ide/dictionary.txt +397 -0
  206. package/ide/jetbrains/.fleet/settings.json +4 -0
  207. package/ide/jetbrains/.idea/.gitignore +5 -0
  208. package/ide/jetbrains/.idea/.name +1 -0
  209. package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
  210. package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
  211. package/ide/jetbrains/.idea/modules.xml +8 -0
  212. package/ide/jetbrains/.idea/stacks.iml +22 -0
  213. package/ide/jetbrains/.idea/vcs.xml +6 -0
  214. package/ide/jetbrains/.idea/webResources.xml +14 -0
  215. package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
  216. package/ide/jetbrains/installed.txt +4 -0
  217. package/ide/jetbrains/options/github-copilot.xml +5 -0
  218. package/ide/jetbrains/options/nodejs.xml +7 -0
  219. package/ide/jetbrains/options/templates.xml +124 -0
  220. package/ide/jetbrains/templates/JavaScript.xml +6 -0
  221. package/ide/jetbrains/templates/Stacks.xml +8 -0
  222. package/ide/vscode/.vscode/README.md +23 -0
  223. package/ide/vscode/.vscode/extensions.json +5 -0
  224. package/ide/vscode/.vscode/settings.json +176 -0
  225. package/ide/vscode/.vscode/stacks.code-snippets +181 -0
  226. package/ide/vscode/LICENSE.md +21 -0
  227. package/ide/vscode/README.md +36 -0
  228. package/ide/vscode/logo.png +0 -0
  229. package/ide/vscode/package.json +79 -0
  230. package/ide/zed/.zed/settings.json +139 -0
  231. package/lang/README.md +28 -0
  232. package/lang/de.yml +14 -0
  233. package/lang/en.yml +15 -0
  234. package/package.json +19 -3
  235. package/project/bootstrap +161 -0
  236. package/project/buddy +175 -0
  237. package/project/storage/framework/tsconfig.app.json +50 -0
  238. package/project/storage/framework/tsconfig.base.json +58 -0
  239. package/routes/core.ts +78 -0
  240. package/routes/dashboard-api.ts +233 -0
  241. package/routes/dashboard.ts +739 -0
  242. package/routes/email.ts +129 -0
  243. package/stores/[name].stx +16 -0
  244. package/stores/git.ts +71 -0
  245. package/stores/payment.ts +474 -0
  246. package/stores/queue.ts +43 -0
  247. package/stores/user.ts +29 -0
  248. package/stx-components-plugin.ts +25 -0
  249. package/styles/design-tokens.css +597 -0
  250. package/types/dashboard.ts +70 -0
  251. package/types/defaults.ts +438 -0
  252. package/vcs/github/CODE_OF_CONDUCT.md +83 -0
  253. package/vcs/github/CONTRIBUTING.md +187 -0
  254. package/vcs/github/EXPLANATIONS.md +41 -0
  255. package/vcs/github/FUNDING.yml +1 -0
  256. package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
  257. package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
  258. package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  259. package/vcs/github/SECURITY.md +70 -0
  260. package/vcs/github/renovate.json +5 -0
  261. package/vcs/github/stale.yml +14 -0
  262. package/vcs/github/workflows/README.md +16 -0
  263. package/vcs/github/workflows/ci.yml +114 -0
  264. package/vcs/github/workflows/export-size.yml +25 -0
  265. package/vcs/github/workflows/labeler.yml +13 -0
  266. package/vcs/github/workflows/release.yml +219 -0
  267. package/views/[...all].stx +8 -0
  268. package/views/about.md +3 -0
  269. package/views/auth/login.stx +1 -0
  270. package/views/auth/signup.stx +85 -0
  271. package/views/dashboard/.discovered-models.json +542 -0
  272. package/views/dashboard/AUDIT.md +904 -0
  273. package/views/dashboard/[...all].stx +89 -0
  274. package/views/dashboard/access-tokens/index.stx +177 -0
  275. package/views/dashboard/actions/index.stx +129 -0
  276. package/views/dashboard/analytics/blog/index.stx +356 -0
  277. package/views/dashboard/analytics/browsers/index.stx +263 -0
  278. package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
  279. package/views/dashboard/analytics/commerce/web/index.stx +379 -0
  280. package/views/dashboard/analytics/countries/index.stx +289 -0
  281. package/views/dashboard/analytics/devices/index.stx +305 -0
  282. package/views/dashboard/analytics/events/index.stx +536 -0
  283. package/views/dashboard/analytics/index.stx +88 -0
  284. package/views/dashboard/analytics/marketing/index.stx +315 -0
  285. package/views/dashboard/analytics/pages/index.stx +271 -0
  286. package/views/dashboard/analytics/referrers/index.stx +319 -0
  287. package/views/dashboard/analytics/web/index.stx +356 -0
  288. package/views/dashboard/buddy/index.stx +198 -0
  289. package/views/dashboard/ci/index.stx +462 -0
  290. package/views/dashboard/cloud/index.stx +452 -0
  291. package/views/dashboard/commands/index.stx +295 -0
  292. package/views/dashboard/commerce/categories/index.stx +406 -0
  293. package/views/dashboard/commerce/coupons/index.stx +485 -0
  294. package/views/dashboard/commerce/customers/index.stx +410 -0
  295. package/views/dashboard/commerce/dashboard/index.stx +287 -0
  296. package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
  297. package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
  298. package/views/dashboard/commerce/delivery/drivers.stx +397 -0
  299. package/views/dashboard/commerce/delivery/index.stx +18 -0
  300. package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
  301. package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
  302. package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
  303. package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
  304. package/views/dashboard/commerce/delivery/tabs.ts +25 -0
  305. package/views/dashboard/commerce/gift-cards/index.stx +561 -0
  306. package/views/dashboard/commerce/manufacturers/index.stx +308 -0
  307. package/views/dashboard/commerce/orders/index.stx +247 -0
  308. package/views/dashboard/commerce/payments/index.stx +535 -0
  309. package/views/dashboard/commerce/pos/index.stx +653 -0
  310. package/views/dashboard/commerce/printers/devices/index.stx +273 -0
  311. package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
  312. package/views/dashboard/commerce/products/detail.stx +563 -0
  313. package/views/dashboard/commerce/products/index.stx +370 -0
  314. package/views/dashboard/commerce/reviews/index.stx +656 -0
  315. package/views/dashboard/commerce/reviews/index.ts +0 -0
  316. package/views/dashboard/commerce/taxes/index.stx +377 -0
  317. package/views/dashboard/commerce/units/index.stx +317 -0
  318. package/views/dashboard/commerce/variants/index.stx +319 -0
  319. package/views/dashboard/commerce/waitlist/products.stx +942 -0
  320. package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
  321. package/views/dashboard/components/index.stx +330 -0
  322. package/views/dashboard/composables/index.ts +19 -0
  323. package/views/dashboard/composables/useChart.ts +77 -0
  324. package/views/dashboard/composables/useNavigation.ts +99 -0
  325. package/views/dashboard/composables/useRole.ts +58 -0
  326. package/views/dashboard/composables/useTheme.ts +74 -0
  327. package/views/dashboard/content/authors/index.stx +171 -0
  328. package/views/dashboard/content/blog/index.stx +493 -0
  329. package/views/dashboard/content/categories/index.stx +169 -0
  330. package/views/dashboard/content/comments/index.stx +189 -0
  331. package/views/dashboard/content/dashboard.stx +383 -0
  332. package/views/dashboard/content/files/index.stx +706 -0
  333. package/views/dashboard/content/pages/index.stx +174 -0
  334. package/views/dashboard/content/posts/index.stx +269 -0
  335. package/views/dashboard/content/seo/index.stx +240 -0
  336. package/views/dashboard/content/tags/index.stx +167 -0
  337. package/views/dashboard/data/activity/index.stx +261 -0
  338. package/views/dashboard/data/dashboard/index.stx +116 -0
  339. package/views/dashboard/data/subscribers.stx +270 -0
  340. package/views/dashboard/data/teams.stx +275 -0
  341. package/views/dashboard/data/users.stx +279 -0
  342. package/views/dashboard/dependencies/index.stx +178 -0
  343. package/views/dashboard/deployments/[id].stx +234 -0
  344. package/views/dashboard/deployments/index.stx +9 -0
  345. package/views/dashboard/dns/index.stx +163 -0
  346. package/views/dashboard/environment/index.stx +283 -0
  347. package/views/dashboard/errors/index.stx +274 -0
  348. package/views/dashboard/forgot-password.stx +57 -0
  349. package/views/dashboard/functions/index.stx +159 -0
  350. package/views/dashboard/health/index.stx +248 -0
  351. package/views/dashboard/inbox/activity.stx +350 -0
  352. package/views/dashboard/inbox/index.stx +452 -0
  353. package/views/dashboard/inbox/settings.stx +290 -0
  354. package/views/dashboard/index.stx +252 -0
  355. package/views/dashboard/insights/index.stx +529 -0
  356. package/views/dashboard/jobs/[id].stx +430 -0
  357. package/views/dashboard/jobs/history.stx +222 -0
  358. package/views/dashboard/jobs/index.stx +214 -0
  359. package/views/dashboard/kanban/[id].stx +899 -0
  360. package/views/dashboard/kanban/index.stx +260 -0
  361. package/views/dashboard/layouts/default.stx +565 -0
  362. package/views/dashboard/layouts/guest.stx +10 -0
  363. package/views/dashboard/login.stx +48 -0
  364. package/views/dashboard/logs/index.stx +540 -0
  365. package/views/dashboard/mailboxes/index.stx +149 -0
  366. package/views/dashboard/management/permissions/index.stx +490 -0
  367. package/views/dashboard/marketing/campaigns/index.stx +604 -0
  368. package/views/dashboard/marketing/lists/index.stx +514 -0
  369. package/views/dashboard/marketing/reviews/index.stx +475 -0
  370. package/views/dashboard/marketing/social-posts/index.stx +560 -0
  371. package/views/dashboard/models/[model].stx +195 -0
  372. package/views/dashboard/models/index.stx +159 -0
  373. package/views/dashboard/monitoring/errors/index.stx +415 -0
  374. package/views/dashboard/notifications/dashboard.stx +383 -0
  375. package/views/dashboard/notifications/email.stx +336 -0
  376. package/views/dashboard/notifications/history.stx +373 -0
  377. package/views/dashboard/notifications/sms.stx +332 -0
  378. package/views/dashboard/packages/index.stx +195 -0
  379. package/views/dashboard/queries/[id].stx +381 -0
  380. package/views/dashboard/queries/history.stx +227 -0
  381. package/views/dashboard/queries/index.stx +335 -0
  382. package/views/dashboard/queries/slow.stx +318 -0
  383. package/views/dashboard/queue/index.stx +427 -0
  384. package/views/dashboard/realtime/index.stx +429 -0
  385. package/views/dashboard/register.stx +46 -0
  386. package/views/dashboard/releases/index.stx +389 -0
  387. package/views/dashboard/requests/index.stx +462 -0
  388. package/views/dashboard/serverless/index.stx +475 -0
  389. package/views/dashboard/servers/[id].stx +299 -0
  390. package/views/dashboard/servers/index.stx +483 -0
  391. package/views/dashboard/settings/billing.stx +50 -0
  392. package/views/dashboard/settings/index.stx +256 -0
  393. package/views/dashboard/settings/mail.stx +252 -0
  394. package/views/dashboard/stores/auth.ts +123 -0
  395. package/views/dashboard/stores/ci.ts +342 -0
  396. package/views/dashboard/stores/index.ts +129 -0
  397. package/views/dashboard/stores/kanban.ts +723 -0
  398. package/views/dashboard/stores/rbac.ts +350 -0
  399. package/views/dashboard/stx.config.ts +34 -0
  400. package/views/dashboard/teams/[id].stx +170 -0
  401. package/views/forum/category.stx +92 -0
  402. package/views/forum/index.stx +209 -0
  403. package/views/forum/new-topic.stx +113 -0
  404. package/views/forum/profile.stx +1 -0
  405. package/views/forum/topic.stx +143 -0
  406. package/views/hello-world/[name].stx +47 -0
  407. package/views/index.stx +21 -0
  408. 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
@@ -0,0 +1,4 @@
1
+ !jetbrains/.fleet
2
+ !jetbrains/.idea
3
+ !vscode/.vscode
4
+ !zed/.zed