@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.
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,290 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ @title('Mail - Settings')
5
+ <div class="min-h-screen dark:bg-neutral-800">
6
+ <div class="flex h-screen">
7
+ <EmailSidebar :activeFolder="activeFolder" :folders="folders" :unreadCounts="unreadCounts" @update:active-folder="handleFolderChange" @compose="handleCompose" />
8
+
9
+ <div class="flex overflow-hidden flex-1 flex-col">
10
+ <div class="px-6 py-4 bg-white dark:bg-neutral-700 border-b border-gray-200 dark:border-neutral-600">
11
+ <div class="flex items-center justify-between">
12
+ <h1 class="font-bold text-2xl text-gray-900 dark:text-white">Settings</h1>
13
+ <div>
14
+ <button @click="saveSettings()" :disabled="isLoading" class="flex items-center px-4 py-2 font-medium text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md disabled:opacity-50">
15
+ <i :show="isIdle" class="mr-2 text-lg i-hugeicons-checkmark-circle-02"></i>
16
+ <i :show="isLoading" class="mr-2 text-lg animate-spin i-hugeicons-refresh"></i>
17
+ Save Changes
18
+ </button>
19
+ </div>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="flex overflow-hidden flex-1">
24
+ <div class="overflow-y-auto w-64 bg-white dark:bg-neutral-700 border-gray-200 border-r dark:border-neutral-600">
25
+ <nav class="p-4">
26
+ <ul class="space-y-1">
27
+ @foreach(settingsSections as section)
28
+ <li>
29
+ <button @click="setActiveSection('{{ section.id }}')" class="w-full flex items-center px-3 py-3 text-sm rounded-md {{ activeSection() === section.id ? 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-100' : 'text-gray-700 hover:bg-gray-100 dark:text-neutral-200 dark:hover:bg-neutral-600' }}">
30
+ <i class="{{ section.icon }} text-lg"></i>
31
+ <span class="ml-3">{{ section.name }}</span>
32
+ </button>
33
+ </li>
34
+ @endforeach
35
+ </ul>
36
+ </nav>
37
+ </div>
38
+
39
+ <div class="overflow-y-auto flex-1 p-6">
40
+ <div :show="isGeneralSection" class="space-y-6">
41
+ <div class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
42
+ <h2 class="mb-4 font-medium text-gray-900 text-lg dark:text-white">Display Settings</h2>
43
+
44
+ <div class="space-y-4">
45
+ <div>
46
+ <label for="displayDensity" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Display Density</label>
47
+ <select id="displayDensity" x-model="displayDensity" class="block mt-1 pl-3 pr-10 py-2 w-full text-base text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500">
48
+ <option value="comfortable">Comfortable</option>
49
+ <option value="default">Default</option>
50
+ <option value="compact">Compact</option>
51
+ </select>
52
+ </div>
53
+
54
+ <div>
55
+ <label for="theme" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Theme</label>
56
+ <select id="theme" x-model="theme" class="block mt-1 pl-3 pr-10 py-2 w-full text-base text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500">
57
+ <option value="light">Light</option>
58
+ <option value="dark">Dark</option>
59
+ <option value="system">System Default</option>
60
+ </select>
61
+ </div>
62
+
63
+ <div>
64
+ <label for="language" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Language</label>
65
+ <select id="language" x-model="language" class="block mt-1 pl-3 pr-10 py-2 w-full text-base text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500">
66
+ <option value="en">English</option>
67
+ <option value="fr">French</option>
68
+ <option value="de">German</option>
69
+ <option value="es">Spanish</option>
70
+ <option value="ja">Japanese</option>
71
+ </select>
72
+ </div>
73
+ </div>
74
+ </div>
75
+
76
+ <div class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
77
+ <h2 class="mb-4 font-medium text-gray-900 text-lg dark:text-white">Email Behavior</h2>
78
+
79
+ <div class="space-y-4">
80
+ <div>
81
+ <label for="defaultReplyBehavior" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Default Reply Behavior</label>
82
+ <select id="defaultReplyBehavior" x-model="defaultReplyBehavior" class="block mt-1 pl-3 pr-10 py-2 w-full text-base text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500">
83
+ <option value="reply">Reply</option>
84
+ <option value="replyAll">Reply All</option>
85
+ </select>
86
+ </div>
87
+
88
+ <div>
89
+ <label for="autoAdvance" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">After archiving or deleting an email, show</label>
90
+ <select id="autoAdvance" x-model="autoAdvance" class="block mt-1 pl-3 pr-10 py-2 w-full text-base text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500">
91
+ <option value="newer">Newer conversation</option>
92
+ <option value="older">Older conversation</option>
93
+ <option value="back">Back to inbox</option>
94
+ </select>
95
+ </div>
96
+
97
+ <div class="flex items-center">
98
+ <input id="sendAndArchive" type="checkbox" x-model="sendAndArchive" class="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />
99
+ <label for="sendAndArchive" class="block ml-2 text-gray-700 text-sm dark:text-neutral-300">Show "Send & Archive" button in reply</label>
100
+ </div>
101
+
102
+ <div class="flex items-center">
103
+ <input id="desktopNotifications" type="checkbox" x-model="desktopNotifications" class="h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500" />
104
+ <label for="desktopNotifications" class="block ml-2 text-gray-700 text-sm dark:text-neutral-300">Enable desktop notifications</label>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+
110
+ <div :show="isAccountsSection" class="space-y-6">
111
+ <div class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
112
+ <h2 class="mb-4 font-medium text-gray-900 text-lg dark:text-white">Account Information</h2>
113
+
114
+ <div class="space-y-4">
115
+ <div>
116
+ <label for="name" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Your Name</label>
117
+ <input id="name" type="text" x-model="accountName" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500" />
118
+ </div>
119
+
120
+ <div>
121
+ <label for="email" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Email Address</label>
122
+ <input id="email" type="email" x-model="accountEmail" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500" />
123
+ </div>
124
+ </div>
125
+ </div>
126
+
127
+ <div class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
128
+ <h2 class="mb-4 font-medium text-gray-900 text-lg dark:text-white">Email Signature</h2>
129
+
130
+ <div>
131
+ <label for="signature" class="block mb-2 font-medium text-gray-700 text-sm dark:text-neutral-300">Signature</label>
132
+ <div class="p-2 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600">
133
+ <textarea id="signature" x-model="signature" rows="4" class="block px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-transparent border-0 focus:outline-none focus:ring-0"></textarea>
134
+ </div>
135
+ <p class="mt-1 text-gray-500 text-xs dark:text-neutral-400">HTML formatting is supported</p>
136
+ </div>
137
+ </div>
138
+
139
+ <div class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
140
+ <div class="flex items-center justify-between mb-4">
141
+ <h2 class="font-medium text-gray-900 text-lg dark:text-white">Vacation Responder</h2>
142
+ <div class="flex items-center">
143
+ <span class="mr-2 text-gray-700 text-sm dark:text-neutral-300">Off</span>
144
+ <button type="button" @click="toggleVacationResponder()" class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 {{ vacationEnabled() ? 'bg-blue-600' : 'bg-gray-200 dark:bg-neutral-700' }}">
145
+ <span class="pointer-events-none inline-block h-5 w-5 rounded-full bg-white dark:bg-neutral-800 shadow transform ring-0 transition ease-in-out duration-200 {{ vacationEnabled() ? 'translate-x-5' : 'translate-x-0' }}"></span>
146
+ </button>
147
+ <span class="ml-2 text-gray-700 text-sm dark:text-neutral-300">On</span>
148
+ </div>
149
+ </div>
150
+
151
+ <div :show="vacationEnabled" class="space-y-4">
152
+ <div class="grid gap-4 grid-cols-1 md:grid-cols-2">
153
+ <div>
154
+ <label for="startDate" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Start Date</label>
155
+ <input id="startDate" type="date" x-model="vacationStartDate" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500" />
156
+ </div>
157
+ <div>
158
+ <label for="endDate" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">End Date</label>
159
+ <input id="endDate" type="date" x-model="vacationEndDate" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500" />
160
+ </div>
161
+ </div>
162
+
163
+ <div>
164
+ <label for="subject" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Subject</label>
165
+ <input id="subject" type="text" x-model="vacationSubject" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500" />
166
+ </div>
167
+
168
+ <div>
169
+ <label for="message" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Message</label>
170
+ <textarea id="message" x-model="vacationMessage" rows="4" class="block mt-1 px-3 py-2 w-full text-gray-900 sm:text-sm dark:text-neutral-100 bg-white dark:bg-neutral-600 border border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:outline-none focus:ring-blue-500"></textarea>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ <div :show="isOtherSection" class="p-6 bg-white dark:bg-neutral-700 rounded-lg shadow">
177
+ <div class="flex flex-col items-center justify-center py-12">
178
+ <div class="mb-4 p-6 bg-blue-100 dark:bg-blue-900 rounded-full">
179
+ <i class="{{ activeSectionIcon() }} text-4xl text-blue-600 dark:text-blue-400"></i>
180
+ </div>
181
+ <h2 class="mb-2 font-medium text-gray-900 text-xl dark:text-white">{{ activeSectionName() }} Settings</h2>
182
+ <p class="max-w-md text-center text-gray-500 dark:text-neutral-400">This section is under development. More settings will be available soon.</p>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+
191
+ <script client>
192
+ interface SettingsSection {
193
+ id: string
194
+ name: string
195
+ icon: string
196
+ }
197
+
198
+ const folders = [
199
+ { id: 'inbox', name: 'Inbox', icon: 'inbox' },
200
+ { id: 'starred', name: 'Starred', icon: 'star' },
201
+ { id: 'sent', name: 'Sent', icon: 'mail-send-01' },
202
+ { id: 'drafts', name: 'Drafts', icon: 'license-draft' },
203
+ { id: 'archive', name: 'Archive', icon: 'archive' },
204
+ { id: 'spam', name: 'Spam', icon: 'spam' },
205
+ { id: 'trash', name: 'Trash', icon: 'waste' },
206
+ ]
207
+
208
+ const unreadCounts = {
209
+ inbox: 2,
210
+ starred: 1,
211
+ sent: 0,
212
+ drafts: 0,
213
+ archive: 0,
214
+ spam: 1,
215
+ trash: 0,
216
+ }
217
+
218
+ const settingsSections: SettingsSection[] = [
219
+ { id: 'general', name: 'General', icon: 'i-hugeicons-settings-01' },
220
+ { id: 'accounts', name: 'Account', icon: 'i-hugeicons-mail-account-02' },
221
+ { id: 'notifications', name: 'Notifications', icon: 'i-hugeicons-notification-01' },
222
+ { id: 'filters', name: 'Filters & Blocking', icon: 'i-hugeicons-filter-mail-circle' },
223
+ { id: 'labels', name: 'Labels', icon: 'i-hugeicons-tag-01' },
224
+ { id: 'security', name: 'Security', icon: 'i-hugeicons-security-check' },
225
+ ]
226
+
227
+ const activeFolder = state('inbox')
228
+ const activeSection = state('general')
229
+ const isLoading = state(false)
230
+
231
+ const displayDensity = state('default')
232
+ const defaultReplyBehavior = state('replyAll')
233
+ const sendAndArchive = state(true)
234
+ const autoAdvance = state('newer')
235
+ const desktopNotifications = state(true)
236
+ const theme = state('system')
237
+ const language = state('en')
238
+
239
+ const accountName = state('User')
240
+ const accountEmail = state('me@stacksjs.com')
241
+ const signature = state('<p>Best regards,<br>User</p>')
242
+ const vacationEnabled = state(false)
243
+ const vacationStartDate = state('')
244
+ const vacationEndDate = state('')
245
+ const vacationSubject = state('Out of Office')
246
+ const vacationMessage = state('I am currently out of office with limited access to email.')
247
+
248
+ const isIdle = derived(() => !isLoading())
249
+ const isGeneralSection = derived(() => activeSection() === 'general')
250
+ const isAccountsSection = derived(() => activeSection() === 'accounts')
251
+ const isOtherSection = derived(() => activeSection() !== 'general' && activeSection() !== 'accounts')
252
+
253
+ function activeSectionMeta(): SettingsSection | undefined {
254
+ return settingsSections.find(s => s.id === activeSection())
255
+ }
256
+
257
+ function activeSectionName(): string { return activeSectionMeta()?.name ?? '' }
258
+ function activeSectionIcon(): string { return activeSectionMeta()?.icon ?? '' }
259
+
260
+ function setActiveSection(id: string): void {
261
+ activeSection.set(id)
262
+ }
263
+
264
+ function toggleVacationResponder(): void {
265
+ vacationEnabled.update(v => !v)
266
+ }
267
+
268
+ function handleFolderChange(folder: string): void {
269
+ activeFolder.set(folder)
270
+ navigate(`/inbox?folder=${encodeURIComponent(folder)}`)
271
+ }
272
+
273
+ function handleCompose(): void {
274
+ navigate('/inbox?compose=true')
275
+ }
276
+
277
+ async function saveSettings(): Promise<void> {
278
+ isLoading.set(true)
279
+ try {
280
+ await new Promise(resolve => setTimeout(resolve, 1000))
281
+ // eslint-disable-next-line no-alert
282
+ alert('Settings saved successfully')
283
+ }
284
+ finally {
285
+ isLoading.set(false)
286
+ }
287
+ }
288
+ </script>
289
+
290
+ @endsection
@@ -0,0 +1,252 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ <script client>
5
+ const stats = state([
6
+ { title: 'Total Users', value: '0', trend: 0, trendLabel: 'vs last period', icon: 'i-hugeicons-user-group' },
7
+ { title: 'Active Projects', value: '0', trend: 0, trendLabel: 'vs last period', icon: 'i-hugeicons-folder-02' },
8
+ { title: 'Revenue', value: '$0', trend: 0, trendLabel: 'Current total', icon: 'i-hugeicons-money-03' },
9
+ { title: 'Orders', value: '0', trend: 0, trendLabel: 'Current total', icon: 'i-hugeicons-shopping-cart-02' },
10
+ ])
11
+
12
+ const httpMetrics = state([
13
+ { title: 'HTTP Requests', value: '0', detail: 'All captured requests', icon: 'i-hugeicons-global' },
14
+ { title: 'Average Response', value: '0ms', detail: 'No requests captured', icon: 'i-hugeicons-clock-01' },
15
+ { title: 'Success Rate', value: '100%', detail: '2xx and 3xx responses', icon: 'i-hugeicons-checkmark-circle-02' },
16
+ { title: 'Error Rate', value: '0%', detail: '4xx and 5xx responses', icon: 'i-hugeicons-alert-02' },
17
+ ])
18
+
19
+ const recentActivity = state([])
20
+
21
+ const systemHealth = state([])
22
+
23
+ function getStatusDotClass(status) {
24
+ if (status === 'healthy') return 'bg-green-500'
25
+ if (status === 'degraded') return 'bg-amber-500'
26
+ if (status === 'critical') return 'bg-red-500'
27
+ return 'bg-gray-500'
28
+ }
29
+
30
+ function getActivityStatusClass(status) {
31
+ if (status === 'success') return 'text-green-600 dark:text-green-400 bg-green-100 dark:bg-green-900/30'
32
+ if (status === 'error') return 'text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900/30'
33
+ if (status === 'warning') return 'text-amber-600 dark:text-amber-400 bg-amber-100 dark:bg-amber-900/30'
34
+ return 'text-blue-600 dark:text-blue-400 bg-blue-100 dark:bg-blue-900/30'
35
+ }
36
+
37
+ function getActivityIconClass(status) {
38
+ if (status === 'success') return 'i-hugeicons-checkmark-circle-02 h-4 w-4'
39
+ if (status === 'error') return 'i-hugeicons-alert-02 h-4 w-4'
40
+ if (status === 'warning') return 'i-hugeicons-alert-circle h-4 w-4'
41
+ return 'i-hugeicons-information-circle h-4 w-4'
42
+ }
43
+
44
+ async function loadDashboard() {
45
+ try {
46
+ const response = await fetch('/api/dashboard/home', { headers: { accept: 'application/json' } })
47
+ if (!response.ok) return
48
+
49
+ const data = await response.json()
50
+ if (Array.isArray(data.stats)) {
51
+ const iconFor = label => ({
52
+ 'Total Users': 'i-hugeicons-user-group',
53
+ 'Products': 'i-hugeicons-package',
54
+ 'Revenue': 'i-hugeicons-money-03',
55
+ 'Orders': 'i-hugeicons-shopping-cart-02',
56
+ })[label] || 'i-hugeicons-chart-up'
57
+ stats.set(data.stats.map(stat => ({
58
+ title: stat.label,
59
+ value: stat.value,
60
+ trend: 0,
61
+ trendLabel: 'Current total',
62
+ icon: iconFor(stat.label),
63
+ })))
64
+ }
65
+ if (Array.isArray(data.httpMetrics)) httpMetrics.set(data.httpMetrics)
66
+ if (Array.isArray(data.services)) {
67
+ systemHealth.set(data.services.map(service => ({ ...service, uptime: service.uptime || 'Current' })))
68
+ }
69
+ if (Array.isArray(data.activities)) {
70
+ recentActivity.set(data.activities.map(activity => ({
71
+ type: activity.type,
72
+ title: activity.message,
73
+ time: activity.time,
74
+ status: 'success',
75
+ })))
76
+ }
77
+ }
78
+ catch {
79
+ // Keep the useful empty state while a fresh database is being created.
80
+ }
81
+ }
82
+
83
+ onMount(loadDashboard)
84
+ </script>
85
+
86
+ <div class="mx-auto p-6 max-w-7xl">
87
+ <!-- Header -->
88
+ <PageHeader title="Dashboard" description="Welcome back! Here's an overview of your system." />
89
+
90
+ <!-- Stats Grid -->
91
+ <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 mb-8">
92
+ <template :for="stat in stats">
93
+ <div class="p-5 bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700">
94
+ <div class="flex items-center justify-between">
95
+ <div>
96
+ <p class="font-medium text-neutral-500 text-sm dark:text-neutral-400">{{ stat.title }}</p>
97
+ <p class="mt-1 font-semibold text-2xl text-neutral-900 dark:text-white">{{ stat.value }}</p>
98
+ <p class="mt-1 text-neutral-500 text-xs dark:text-neutral-400">{{ stat.trendLabel }}</p>
99
+ </div>
100
+ <div class="flex-shrink-0 p-3 bg-neutral-100 dark:bg-neutral-700 rounded-xl">
101
+ <div :class="stat.icon" class="h-6 w-6 text-neutral-500 dark:text-neutral-400"></div>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </template>
106
+ </div>
107
+
108
+ <div class="mb-8">
109
+ <div class="flex items-end justify-between mb-4">
110
+ <div>
111
+ <h2 class="font-semibold text-base text-neutral-900 dark:text-white">HTTP performance</h2>
112
+ <p class="mt-1 text-neutral-500 text-sm dark:text-neutral-400">Live metrics from captured application requests.</p>
113
+ </div>
114
+ <StxLink to="/requests" class="text-neutral-500 text-sm hover:text-neutral-700 dark:hover:text-neutral-300">Request history</StxLink>
115
+ </div>
116
+ <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4">
117
+ <template :for="metric in httpMetrics">
118
+ <div class="p-5 bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700">
119
+ <div class="flex gap-4 items-start justify-between">
120
+ <div>
121
+ <p class="font-medium text-neutral-500 text-sm dark:text-neutral-400">{{ metric.title }}</p>
122
+ <p class="mt-1 font-semibold text-2xl text-neutral-900 dark:text-white">{{ metric.value }}</p>
123
+ <p class="mt-1 text-neutral-500 text-xs dark:text-neutral-400">{{ metric.detail }}</p>
124
+ </div>
125
+ <div class="flex-shrink-0 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-xl">
126
+ <div :class="metric.icon" class="h-5 w-5 text-blue-600 dark:text-blue-400"></div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </template>
131
+ </div>
132
+ </div>
133
+
134
+ <!-- Quick Links -->
135
+ <div class="mb-8">
136
+ <h2 class="mb-4 font-semibold text-base text-neutral-900 dark:text-white">Quick Links</h2>
137
+ <div class="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4">
138
+ <a href="/content/dashboard" data-stx-link class="block p-5 no-underline bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700 hover:shadow-md transition-shadow">
139
+ <div class="flex gap-4 items-center">
140
+ <div class="flex-shrink-0 p-3 bg-blue-500 rounded-xl">
141
+ <div class="h-5 w-5 text-white i-hugeicons-book-open-01"></div>
142
+ </div>
143
+ <div class="flex-1 min-w-0">
144
+ <p class="font-medium text-neutral-900 text-sm dark:text-white">Blog</p>
145
+ <p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">Manage your blog posts</p>
146
+ </div>
147
+ </div>
148
+ </a>
149
+ <a href="/commerce/dashboard" data-stx-link class="block p-5 no-underline bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700 hover:shadow-md transition-shadow">
150
+ <div class="flex gap-4 items-center">
151
+ <div class="flex-shrink-0 p-3 bg-green-500 rounded-xl">
152
+ <div class="h-5 w-5 text-white i-hugeicons-store-01"></div>
153
+ </div>
154
+ <div class="flex-1 min-w-0">
155
+ <p class="font-medium text-neutral-900 text-sm dark:text-white">Commerce</p>
156
+ <p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">View orders and products</p>
157
+ </div>
158
+ </div>
159
+ </a>
160
+ <a href="/cloud" data-stx-link class="block p-5 no-underline bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700 hover:shadow-md transition-shadow">
161
+ <div class="flex gap-4 items-center">
162
+ <div class="flex-shrink-0 p-3 bg-purple-500 rounded-xl">
163
+ <div class="h-5 w-5 text-white i-hugeicons-cloud"></div>
164
+ </div>
165
+ <div class="flex-1 min-w-0">
166
+ <p class="font-medium text-neutral-900 text-sm dark:text-white">Cloud</p>
167
+ <p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">Monitor infrastructure</p>
168
+ </div>
169
+ </div>
170
+ </a>
171
+ <a href="/settings" data-stx-link class="block p-5 no-underline bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700 hover:shadow-md transition-shadow">
172
+ <div class="flex gap-4 items-center">
173
+ <div class="flex-shrink-0 p-3 bg-neutral-500 rounded-xl">
174
+ <div class="h-5 w-5 text-white i-hugeicons-settings-02"></div>
175
+ </div>
176
+ <div class="flex-1 min-w-0">
177
+ <p class="font-medium text-neutral-900 text-sm dark:text-white">Settings</p>
178
+ <p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">Configure your app</p>
179
+ </div>
180
+ </div>
181
+ </a>
182
+ </div>
183
+ </div>
184
+
185
+ <!-- System Health + Recent Activity -->
186
+ <div class="grid gap-6 grid-cols-1 lg:grid-cols-2">
187
+ <!-- System Health -->
188
+ <div class="bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700">
189
+ <div class="flex items-center justify-between p-5 border-b border-neutral-200 dark:border-neutral-700">
190
+ <h3 class="font-semibold text-base text-neutral-900 dark:text-white">System Health</h3>
191
+ <StxLink to="/health" class="text-neutral-500 text-sm hover:text-neutral-700 dark:hover:text-neutral-300">View all</StxLink>
192
+ </div>
193
+ <div class="divide-neutral-100 divide-y dark:divide-neutral-700">
194
+ <template :for="service in systemHealth">
195
+ <div class="flex items-center justify-between px-5 py-3.5">
196
+ <div class="flex gap-3 items-center">
197
+ <span :class="getStatusDotClass(service.status)" class="h-2.5 w-2.5 rounded-full"></span>
198
+ <span class="font-medium text-neutral-700 text-sm dark:text-neutral-200">{{ service.name }}</span>
199
+ </div>
200
+ <div class="flex gap-4 items-center">
201
+ <span class="text-neutral-500 text-sm dark:text-neutral-400">{{ service.latency }}</span>
202
+ <span class="text-neutral-500 text-sm dark:text-neutral-400">{{ service.uptime }}</span>
203
+ <span class="px-2 py-0.5 font-medium text-green-700 text-xs dark:text-green-400 bg-green-100 dark:bg-green-900/30 rounded-full">{{ service.status }}</span>
204
+ </div>
205
+ </div>
206
+ </template>
207
+ </div>
208
+ </div>
209
+
210
+ <!-- Recent Activity -->
211
+ <div class="bg-white dark:bg-neutral-800 border border-neutral-200 rounded-xl dark:border-neutral-700">
212
+ <div class="flex items-center justify-between p-5 border-b border-neutral-200 dark:border-neutral-700">
213
+ <h3 class="font-semibold text-base text-neutral-900 dark:text-white">Recent Activity</h3>
214
+ <StxLink to="/data/activity" class="text-neutral-500 text-sm hover:text-neutral-700 dark:hover:text-neutral-300">View all</StxLink>
215
+ </div>
216
+ <div class="divide-neutral-100 divide-y dark:divide-neutral-700">
217
+ <template :for="activity in recentActivity">
218
+ <div class="flex gap-4 items-center px-5 py-3.5">
219
+ <div :class="getActivityStatusClass(activity.status)" class="flex-shrink-0 p-2 rounded-lg">
220
+ <div :class="getActivityIconClass(activity.status)"></div>
221
+ </div>
222
+ <div class="flex-1 min-w-0">
223
+ <p class="font-medium text-neutral-900 text-sm truncate dark:text-white">{{ activity.title }}</p>
224
+ <p class="text-neutral-500 text-xs dark:text-neutral-400">{{ activity.time }}</p>
225
+ </div>
226
+ </div>
227
+ </template>
228
+ <div :show="recentActivity().length === 0" class="flex flex-col items-center justify-center px-5 py-12 text-center">
229
+ <div class="h-8 w-8 text-neutral-300 dark:text-neutral-600 i-hugeicons-activity-03"></div>
230
+ <p class="mt-3 text-neutral-500 text-sm dark:text-neutral-400">No recent activity yet</p>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+
236
+ <!-- Resources -->
237
+ <div class="grid gap-4 grid-cols-1 sm:grid-cols-3 mt-8">
238
+ <a href="https://docs.stacksjs.org" target="_blank" class="p-5 bg-blue-50 dark:bg-blue-900/20 rounded-xl hover:shadow-md transition-shadow">
239
+ <h4 class="font-semibold text-blue-900 text-sm dark:text-blue-200">Documentation</h4>
240
+ <p class="mt-1 text-blue-700 text-xs dark:text-blue-300">Guides and API references</p>
241
+ </a>
242
+ <a href="https://stacksjs.com/discord" target="_blank" class="p-5 bg-purple-50 dark:bg-purple-900/20 rounded-xl hover:shadow-md transition-shadow">
243
+ <h4 class="font-semibold text-purple-900 text-sm dark:text-purple-200">Community</h4>
244
+ <p class="mt-1 text-purple-700 text-xs dark:text-purple-300">Join our Discord</p>
245
+ </a>
246
+ <a href="https://github.com/stacksjs/stacks" target="_blank" class="p-5 bg-green-50 dark:bg-green-900/20 rounded-xl hover:shadow-md transition-shadow">
247
+ <h4 class="font-semibold text-green-900 text-sm dark:text-green-200">GitHub</h4>
248
+ <p class="mt-1 text-green-700 text-xs dark:text-green-300">Star us on GitHub</p>
249
+ </a>
250
+ </div>
251
+ </div>
252
+ @endsection