@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,159 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ <script client>
5
+
6
+ interface FunctionRow {
7
+ name: string
8
+ size: string
9
+ path: string
10
+ updatedAt: string
11
+ createdAt: string
12
+ status: 'active' | 'draft' | 'archived'
13
+ }
14
+
15
+ // Placeholder data — moved out of the former `<script server>` block
16
+ // (stacksjs/stacks#1838). Wire this up to whatever lists
17
+ // `./resources/functions/*` once the framework exposes a directory
18
+ // walker — the table renders against
19
+ // `name/size/path/updatedAt/createdAt/status` so the swap is a one-line
20
+ // replacement of `functions = …`.
21
+ const functions: FunctionRow[] = [
22
+ { name: 'sendInvoice', size: '5.2 kB', path: './resources/functions/send-invoice.ts', updatedAt: '2026-04-19 09:04', createdAt: '2025-11-03 08:23', status: 'active' },
23
+ { name: 'syncCustomer', size: '3.8 kB', path: './resources/functions/sync-customer.ts', updatedAt: '2026-04-12 14:11', createdAt: '2025-12-01 11:45', status: 'active' },
24
+ { name: 'cleanupSessions', size: '2.1 kB', path: './resources/functions/cleanup-sessions.ts', updatedAt: '2026-03-30 22:08', createdAt: '2026-01-14 09:02', status: 'active' },
25
+ { name: 'reportDigest', size: '6.4 kB', path: './resources/functions/report-digest.ts', updatedAt: '2026-04-22 07:55', createdAt: '2026-02-09 13:31', status: 'draft' },
26
+ ]
27
+
28
+ const totalCount = functions.length
29
+ const activeCount = functions.filter(f => f.status === 'active').length
30
+ const draftCount = functions.filter(f => f.status === 'draft').length
31
+
32
+ function statusVariant(status: string) {
33
+ if (status === 'active') return 'success'
34
+ if (status === 'draft') return 'warning'
35
+ if (status === 'archived') return 'default'
36
+ return 'default'
37
+ }
38
+ </script>
39
+
40
+ <div class="mx-auto pb-12 pt-6 px-6 space-y-6 max-w-6xl">
41
+
42
+ <PageHeader
43
+ title="Functions"
44
+ description="Serverless functions defined in resources/functions"
45
+ >
46
+ <template #actions>
47
+ <Button variant="primary" size="md">Create function</Button>
48
+ </template>
49
+ </PageHeader>
50
+
51
+ <!-- Stats -->
52
+ <div class="grid gap-3 grid-cols-3">
53
+ <Card variant="default" padding="md">
54
+ <div class="flex gap-3 items-center">
55
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-blue-600 dark:text-blue-400 bg-blue-500/10 dark:bg-blue-400/15 rounded-lg">
56
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.8">
57
+ <path stroke-linecap="round" stroke-linejoin="round" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/>
58
+ </svg>
59
+ </div>
60
+ <div class="min-w-0">
61
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Total</p>
62
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ totalCount }}</p>
63
+ </div>
64
+ </div>
65
+ </Card>
66
+ <Card variant="default" padding="md">
67
+ <div class="flex gap-3 items-center">
68
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-green-600 dark:text-green-400 bg-green-500/10 dark:bg-green-400/15 rounded-lg">
69
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
70
+ <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/>
71
+ </svg>
72
+ </div>
73
+ <div class="min-w-0">
74
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Active</p>
75
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ activeCount }}</p>
76
+ </div>
77
+ </div>
78
+ </Card>
79
+ <Card variant="default" padding="md">
80
+ <div class="flex gap-3 items-center">
81
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-amber-600 dark:text-amber-400 bg-amber-500/10 dark:bg-amber-400/15 rounded-lg">
82
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
83
+ <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/>
84
+ </svg>
85
+ </div>
86
+ <div class="min-w-0">
87
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Draft</p>
88
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ draftCount }}</p>
89
+ </div>
90
+ </div>
91
+ </Card>
92
+ </div>
93
+
94
+ <!-- Functions table -->
95
+ <Card variant="default" padding="none">
96
+ <div class="flex items-baseline justify-between px-5 py-4 border-b border-neutral-200/60 dark:border-white/5">
97
+ <div>
98
+ <h3 class="font-semibold text-base text-neutral-900 dark:text-white">All functions</h3>
99
+ <p class="mt-0.5 text-neutral-500 text-xs dark:text-neutral-400">
100
+ {{ totalCount }} {{ totalCount === 1 ? 'function' : 'functions' }} loaded from <code class="px-1 py-0.5 font-mono text-[11px] bg-black/5 dark:bg-white/10 rounded">resources/functions</code>
101
+ </p>
102
+ </div>
103
+ </div>
104
+
105
+ @if(functions.length === 0)
106
+ <div class="p-8">
107
+ <EmptyState
108
+ title="No functions yet"
109
+ description="Create your first function in resources/functions/."
110
+ />
111
+ </div>
112
+ @else
113
+ <div class="overflow-x-auto">
114
+ <table class="min-w-full divide-neutral-200/60 divide-y dark:divide-white/5">
115
+ <thead class="bg-neutral-50/60 dark:bg-white/[0.02]">
116
+ <tr>
117
+ <th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Name</th>
118
+ <th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Path</th>
119
+ <th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Size</th>
120
+ <th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Status</th>
121
+ <th class="px-5 py-2.5 font-medium text-[11px] text-left text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Updated</th>
122
+ <th class="px-5 py-2.5 text-right">
123
+ <span class="sr-only">Actions</span>
124
+ </th>
125
+ </tr>
126
+ </thead>
127
+ <tbody class="divide-neutral-200/60 divide-y dark:divide-white/5">
128
+ <template :for="fn in functions">
129
+ <tr class="hover:bg-neutral-50/60 dark:hover:bg-white/[0.02] transition-colors">
130
+ <td class="px-5 py-3 font-medium text-neutral-900 text-sm whitespace-nowrap dark:text-white">
131
+ {{ fn.name }}
132
+ </td>
133
+ <td class="px-5 py-3 font-mono text-neutral-500 text-xs whitespace-nowrap dark:text-neutral-400">
134
+ {{ fn.path }}
135
+ </td>
136
+ <td class="px-5 py-3 font-mono text-neutral-600 text-xs whitespace-nowrap dark:text-neutral-300">
137
+ {{ fn.size }}
138
+ </td>
139
+ <td class="px-5 py-3 whitespace-nowrap">
140
+ <Badge :variant="statusVariant(fn.status)" size="sm">{{ fn.status }}</Badge>
141
+ </td>
142
+ <td class="px-5 py-3 text-neutral-500 text-xs whitespace-nowrap dark:text-neutral-400">
143
+ {{ fn.updatedAt }}
144
+ </td>
145
+ <td class="px-5 py-3 text-right whitespace-nowrap">
146
+ <a href="#" class="text-blue-600 text-sm dark:text-blue-400 hover:underline">
147
+ Edit
148
+ </a>
149
+ </td>
150
+ </tr>
151
+ </template>
152
+ </tbody>
153
+ </table>
154
+ </div>
155
+ @endif
156
+ </Card>
157
+
158
+ </div>
159
+ @endsection
@@ -0,0 +1,248 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ <script client>
5
+
6
+ // Health checks demo data — moved out of the former `<script server>`
7
+ // block (stacksjs/stacks#1838).
8
+ interface Metric {
9
+ label: string
10
+ value: string
11
+ }
12
+
13
+ interface HealthCheck {
14
+ name: string
15
+ status: 'success' | 'info' | 'warning' | 'danger'
16
+ description: string
17
+ /** Inline SVG path data — `d=""` content for a 24x24 stroke icon. */
18
+ iconPath: string
19
+ metrics: Metric[]
20
+ }
21
+
22
+ // Placeholder data — moved out of the former `<script server>` block
23
+ // (stacksjs/stacks#1838). Wire this to a real health endpoint once the
24
+ // dashboard exposes one (e.g. `GET /api/dashboard/health`). The
25
+ // `iconPath` strings are inline SVG `d` attributes — we render them
26
+ // with a single shared <svg> wrapper so the icon system doesn't
27
+ // depend on a CSS engine.
28
+ const checks: HealthCheck[] = [
29
+ {
30
+ name: 'Uptime',
31
+ status: 'success',
32
+ description: 'Your site is up. Last checked less than a minute ago.',
33
+ iconPath: 'M13 10V3L4 14h7v7l9-11h-7z',
34
+ metrics: [
35
+ { label: 'Past 7 days', value: '100%' },
36
+ { label: 'Past 14 days', value: '100%' },
37
+ { label: 'Past 30 days', value: '100%' },
38
+ ],
39
+ },
40
+ {
41
+ name: 'Performance',
42
+ status: 'success',
43
+ description: 'Your site is fast. Last checked 3 minutes ago.',
44
+ iconPath: 'M13 10V3L4 14h7v7l9-11h-7z',
45
+ metrics: [
46
+ { label: 'Response time', value: '235ms' },
47
+ { label: 'Success rate', value: '99.95%' },
48
+ ],
49
+ },
50
+ {
51
+ name: 'Certificate health',
52
+ status: 'success',
53
+ description: 'TLS certificate is healthy. Last checked 3 minutes ago.',
54
+ iconPath: 'M9 12l2 2 4-4M21 12c0 4.97-4.03 9-9 9s-9-4.03-9-9 4.03-9 9-9 9 4.03 9 9z',
55
+ metrics: [
56
+ { label: 'Expires in', value: '274 days' },
57
+ { label: 'Last renewal', value: '2 months ago' },
58
+ ],
59
+ },
60
+ {
61
+ name: 'Broken links',
62
+ status: 'success',
63
+ description: 'No broken links found across crawled pages.',
64
+ iconPath: 'M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1',
65
+ metrics: [
66
+ { label: 'Broken links', value: '0' },
67
+ { label: 'URLs crawled', value: '583' },
68
+ ],
69
+ },
70
+ {
71
+ name: 'Mixed content',
72
+ status: 'success',
73
+ description: 'No mixed content found. Last checked an hour ago.',
74
+ iconPath: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z',
75
+ metrics: [
76
+ { label: 'Mixed content', value: '0' },
77
+ { label: 'URLs crawled', value: '583' },
78
+ ],
79
+ },
80
+ {
81
+ name: 'Certificate transparency',
82
+ status: 'info',
83
+ description: 'CT log entry verified. Last checked less than a minute ago.',
84
+ iconPath: 'M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z',
85
+ metrics: [
86
+ { label: 'Last check', value: '< 1 min ago' },
87
+ { label: 'Status', value: 'Verified' },
88
+ ],
89
+ },
90
+ {
91
+ name: 'Application health',
92
+ status: 'success',
93
+ description: 'All application checks passing. Last checked 10 minutes ago.',
94
+ iconPath: 'M5 13l4 4L19 7',
95
+ metrics: [
96
+ { label: 'Total checks', value: '2' },
97
+ { label: 'Failed', value: '0' },
98
+ { label: 'Last check', value: '10 min ago' },
99
+ ],
100
+ },
101
+ {
102
+ name: 'DNS',
103
+ status: 'success',
104
+ description: 'DNS records resolved cleanly. Last checked an hour ago.',
105
+ iconPath: 'M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z',
106
+ metrics: [
107
+ { label: 'Records', value: '18' },
108
+ { label: 'URLs crawled', value: '20' },
109
+ ],
110
+ },
111
+ ]
112
+
113
+ const passingCount = checks.filter(c => c.status === 'success').length
114
+ const totalCount = checks.length
115
+ const overallStatus: 'success' | 'warning' | 'danger' =
116
+ checks.some(c => c.status === 'danger')
117
+ ? 'danger'
118
+ : checks.some(c => c.status === 'warning')
119
+ ? 'warning'
120
+ : 'success'
121
+
122
+ const statusIconBg = {
123
+ success: 'bg-green-500/10 text-green-600 dark:bg-green-400/15 dark:text-green-400',
124
+ info: 'bg-blue-500/10 text-blue-600 dark:bg-blue-400/15 dark:text-blue-400',
125
+ warning: 'bg-orange-500/10 text-orange-600 dark:bg-orange-400/15 dark:text-orange-400',
126
+ danger: 'bg-red-500/10 text-red-600 dark:bg-red-400/15 dark:text-red-400',
127
+ }
128
+
129
+ const statusBadgeVariant = {
130
+ success: 'success',
131
+ info: 'primary',
132
+ warning: 'warning',
133
+ danger: 'danger',
134
+ }
135
+
136
+ // Pluralize the metrics-grid columns based on count. Done here in JS
137
+ // because STX templates do not accept array values in `:class`
138
+ // binding (`class="{{ a }} {{ cond ? b : c }}"`); a precomputed string is
139
+ // simpler than threading conditional classes through the template.
140
+ function metricsGridCols(count: number) {
141
+ if (count <= 1) return 'grid-cols-1'
142
+ if (count === 2) return 'grid-cols-2'
143
+ return 'grid-cols-3'
144
+ }
145
+ </script>
146
+
147
+ <div class="mx-auto pb-12 pt-6 px-6 space-y-6 max-w-6xl">
148
+
149
+ <PageHeader title="Health" description="System uptime, performance, and certificate checks">
150
+ <template #actions>
151
+ <Badge :variant="statusBadgeVariant[overallStatus]" size="md">
152
+ {{ overallStatus === 'success' ? 'All systems normal' : overallStatus === 'warning' ? 'Degraded' : 'Critical' }}
153
+ </Badge>
154
+ </template>
155
+ </PageHeader>
156
+
157
+ <!-- Overview stats -->
158
+ <div class="grid gap-4 grid-cols-2 lg:grid-cols-4">
159
+ <Card variant="default" padding="md">
160
+ <div class="flex gap-3 items-center">
161
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-green-600 dark:text-green-400 bg-green-500/10 dark:bg-green-400/15 rounded-lg">
162
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
163
+ <path stroke-linecap="round" stroke-linejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z"/>
164
+ </svg>
165
+ </div>
166
+ <div class="min-w-0">
167
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Uptime</p>
168
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">100%</p>
169
+ </div>
170
+ </div>
171
+ </Card>
172
+ <Card variant="default" padding="md">
173
+ <div class="flex gap-3 items-center">
174
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-blue-600 dark:text-blue-400 bg-blue-500/10 dark:bg-blue-400/15 rounded-lg">
175
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
176
+ <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
177
+ </svg>
178
+ </div>
179
+ <div class="min-w-0">
180
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">Health checks</p>
181
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">{{ passingCount }}/{{ totalCount }}</p>
182
+ </div>
183
+ </div>
184
+ </Card>
185
+ <Card variant="default" padding="md">
186
+ <div class="flex gap-3 items-center">
187
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-purple-600 dark:text-purple-400 bg-purple-500/10 dark:bg-purple-400/15 rounded-lg">
188
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
189
+ <path stroke-linecap="round" stroke-linejoin="round" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/>
190
+ </svg>
191
+ </div>
192
+ <div class="min-w-0">
193
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">URLs monitored</p>
194
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">583</p>
195
+ </div>
196
+ </div>
197
+ </Card>
198
+ <Card variant="default" padding="md">
199
+ <div class="flex gap-3 items-center">
200
+ <div class="flex flex-shrink-0 items-center justify-center h-10 w-10 text-cyan-600 dark:text-cyan-400 bg-cyan-500/10 dark:bg-cyan-400/15 rounded-lg">
201
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
202
+ <path stroke-linecap="round" stroke-linejoin="round" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
203
+ </svg>
204
+ </div>
205
+ <div class="min-w-0">
206
+ <p class="text-[11px] text-neutral-500 tracking-wider uppercase dark:text-neutral-400">DNS records</p>
207
+ <p class="font-semibold leading-tight text-2xl text-neutral-900 tracking-tight dark:text-white">18</p>
208
+ </div>
209
+ </div>
210
+ </Card>
211
+ </div>
212
+
213
+ <!-- Detailed checks -->
214
+ <div class="grid gap-4 grid-cols-1 lg:grid-cols-2">
215
+ <template :for="check in checks">
216
+ <Card variant="default" padding="md" hoverable>
217
+ <div class="flex gap-4 items-start">
218
+ <div :class="statusIconBg[check.status]" class="flex flex-shrink-0 items-center justify-center h-10 w-10 rounded-lg">
219
+ <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
220
+ <path stroke-linecap="round" stroke-linejoin="round" :d="check.iconPath"/>
221
+ </svg>
222
+ </div>
223
+
224
+ <div class="flex-1 min-w-0">
225
+ <div class="flex gap-2 items-center justify-between">
226
+ <h3 class="font-medium text-[14px] text-neutral-900 truncate dark:text-white">{{ check.name }}</h3>
227
+ <Badge :variant="statusBadgeVariant[check.status]" size="sm">{{ check.status }}</Badge>
228
+ </div>
229
+ <p class="mt-1 line-clamp-2 text-[12px] text-neutral-500 dark:text-neutral-400">
230
+ {{ check.description }}
231
+ </p>
232
+
233
+ <dl :class="'grid gap-2 mt-4 ' + metricsGridCols(check.metrics.length)">
234
+ <template :for="m in check.metrics">
235
+ <div class="overflow-hidden px-3 py-2 bg-black/[0.03] dark:bg-white/[0.05] rounded-lg">
236
+ <dt class="font-medium text-[11px] text-neutral-500 truncate dark:text-neutral-400">{{ m.label }}</dt>
237
+ <dd class="mt-0.5 font-semibold text-[14px] text-neutral-900 tracking-tight dark:text-white">{{ m.value }}</dd>
238
+ </div>
239
+ </template>
240
+ </dl>
241
+ </div>
242
+ </div>
243
+ </Card>
244
+ </template>
245
+ </div>
246
+ </div>
247
+
248
+ @endsection