@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,383 @@
1
+ @extends('layouts/default')
2
+
3
+ @section('content')
4
+ @title('Dashboard - Blog')
5
+ <PageLayout>
6
+ <PageHeader title="Content Dashboard" description="Overview of your blog's performance">
7
+ <template #actions>
8
+ <select x-model="timeRange" class="block pl-3 pr-10 py-1.5 text-gray-900 sm:leading-6 sm:text-sm dark:text-white dark:bg-neutral-800 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-700 focus:ring-2 focus:ring-blue-600">
9
+ <template :for="range in timeRanges">
10
+ <option :value="range">{{ range }}</option>
11
+ </template>
12
+ </select>
13
+ </template>
14
+ </PageHeader>
15
+
16
+ <dl class="grid gap-5 grid-cols-1 sm:grid-cols-2 lg:grid-cols-4">
17
+ <div class="overflow-hidden px-4 py-5 sm:p-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
18
+ <dt class="font-medium text-gray-500 text-sm truncate dark:text-neutral-300">Total Posts</dt>
19
+ <dd class="mt-1 font-semibold text-3xl text-gray-900 tracking-tight dark:text-white">{{ totalPosts }}</dd>
20
+ <dd class="flex items-center mt-2 text-green-600 text-sm dark:text-green-400">
21
+ <div class="mr-1 h-4 w-4 i-hugeicons-analytics-up"></div>
22
+ <span>5.2% increase</span>
23
+ </dd>
24
+ </div>
25
+
26
+ <div class="overflow-hidden px-4 py-5 sm:p-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
27
+ <dt class="font-medium text-gray-500 text-sm truncate dark:text-neutral-300">Total Views</dt>
28
+ <dd class="mt-1 font-semibold text-3xl text-gray-900 tracking-tight dark:text-white">{{ totalViews.toLocaleString() }}</dd>
29
+ <dd class="flex items-center mt-2 text-green-600 text-sm dark:text-green-400">
30
+ <div class="mr-1 h-4 w-4 i-hugeicons-analytics-up"></div>
31
+ <span>8.1% increase</span>
32
+ </dd>
33
+ </div>
34
+
35
+ <div class="overflow-hidden px-4 py-5 sm:p-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
36
+ <dt class="font-medium text-gray-500 text-sm truncate dark:text-neutral-300">Total Comments</dt>
37
+ <dd class="mt-1 font-semibold text-3xl text-gray-900 tracking-tight dark:text-white">{{ totalComments.toLocaleString() }}</dd>
38
+ <dd class="flex items-center mt-2 text-green-600 text-sm dark:text-green-400">
39
+ <div class="mr-1 h-4 w-4 i-hugeicons-analytics-up"></div>
40
+ <span>12.3% increase</span>
41
+ </dd>
42
+ </div>
43
+
44
+ <div class="overflow-hidden px-4 py-5 sm:p-6 bg-white dark:bg-neutral-800 rounded-lg shadow">
45
+ <dt class="font-medium text-gray-500 text-sm truncate dark:text-neutral-300">Avg. Engagement</dt>
46
+ <dd class="mt-1 font-semibold text-3xl text-gray-900 tracking-tight dark:text-white">{{ averageEngagement }}</dd>
47
+ <dd class="flex items-center mt-2 text-red-600 text-sm dark:text-red-400">
48
+ <div class="mr-1 h-4 w-4 i-hugeicons-analytics-down"></div>
49
+ <span>0.5% decrease</span>
50
+ </dd>
51
+ </div>
52
+ </dl>
53
+
54
+ <div class="grid gap-5 grid-cols-1 lg:grid-cols-2">
55
+ <div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
56
+ <div class="p-6">
57
+ <h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Page Views</h3>
58
+ <div class="mt-2 h-80">
59
+ <canvas id="content_views_chart"></canvas>
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
65
+ <div class="p-6">
66
+ <h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Content Categories</h3>
67
+ <div class="mt-2 h-80">
68
+ <canvas id="content_category_chart"></canvas>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+
74
+ <div>
75
+ <div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
76
+ <div class="flex items-center justify-between px-4 py-5 sm:px-6">
77
+ <h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Top Performing Posts</h3>
78
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 focus-visible:outline-offset-2 shadow-sm">
79
+ <div class="mr-1 h-5 w-5 i-hugeicons-plus-sign"></div>
80
+ New Post
81
+ </button>
82
+ </div>
83
+ <div class="border-gray-200 border-t dark:border-neutral-700">
84
+ <table class="min-w-full divide-gray-200 divide-y dark:divide-neutral-700">
85
+ <thead class="bg-gray-50 dark:bg-neutral-700">
86
+ <tr>
87
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Title</th>
88
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Category</th>
89
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Views</th>
90
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Comments</th>
91
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Published</th>
92
+ <th scope="col" class="px-6 py-3 font-medium text-gray-500 text-left text-xs tracking-wider uppercase dark:text-neutral-300">Status</th>
93
+ <th scope="col" class="relative pl-3 pr-4 py-3.5 sm:pr-6"><span class="sr-only">Actions</span></th>
94
+ </tr>
95
+ </thead>
96
+ <tbody class="bg-white dark:bg-neutral-800 divide-gray-200 divide-y dark:divide-neutral-700">
97
+ <template :for="post in topPosts">
98
+ <tr>
99
+ <td class="px-6 py-4 font-medium text-gray-900 text-sm whitespace-nowrap dark:text-white">{{ post.title }}</td>
100
+ <td class="px-6 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ post.category }}</td>
101
+ <td class="px-6 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ post.views.toLocaleString() }}</td>
102
+ <td class="px-6 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ post.comments }}</td>
103
+ <td class="px-6 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ post.published }}</td>
104
+ <td class="px-6 py-4 whitespace-nowrap">
105
+ <span class="inline-flex px-2 font-semibold leading-5 text-green-800 text-xs dark:text-green-300 bg-green-100 dark:bg-green-900 rounded-full">{{ post.status }}</span>
106
+ </td>
107
+ <td class="relative pl-3 pr-4 py-4 sm:pr-6 font-medium text-right text-sm whitespace-nowrap">
108
+ <div class="flex items-center justify-end space-x-2">
109
+ <button type="button" class="text-gray-400 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300 duration-150 transition-colors">
110
+ <div class="h-5 w-5 i-hugeicons-view"></div>
111
+ </button>
112
+ <button type="button" class="text-gray-400 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300 duration-150 transition-colors">
113
+ <div class="h-5 w-5 i-hugeicons-edit-01"></div>
114
+ </button>
115
+ <button type="button" class="text-gray-400 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300 duration-150 transition-colors">
116
+ <div class="h-5 w-5 i-hugeicons-waste"></div>
117
+ </button>
118
+ </div>
119
+ </td>
120
+ </tr>
121
+ </template>
122
+ </tbody>
123
+ </table>
124
+ </div>
125
+ </div>
126
+ </div>
127
+
128
+ <div class="grid gap-5 grid-cols-1 lg:grid-cols-2">
129
+ <div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
130
+ <div class="flex items-center justify-between px-4 py-5 sm:px-6">
131
+ <h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Recent Comments</h3>
132
+ <div class="flex space-x-2">
133
+ <div class="relative">
134
+ <select class="block pl-3 pr-10 py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white dark:bg-neutral-800 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-700 focus:ring-2 focus:ring-blue-600">
135
+ <option>All comments</option>
136
+ <option>Approved</option>
137
+ <option>Pending</option>
138
+ <option>Spam</option>
139
+ </select>
140
+ </div>
141
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
142
+ <div class="mr-1 h-4 w-4 i-hugeicons-refresh"></div>
143
+ Refresh
144
+ </button>
145
+ </div>
146
+ </div>
147
+ <div class="border-gray-200 border-t dark:border-neutral-700">
148
+ <ul role="list" class="overflow-y-auto max-h-[500px] divide-gray-200 divide-y dark:divide-neutral-700">
149
+ <template :for="comment in recentComments">
150
+ <li class="px-4 py-4 sm:px-6 hover:bg-gray-50 dark:hover:bg-neutral-700 duration-150 transition">
151
+ <div class="flex items-center justify-between">
152
+ <div class="flex items-center">
153
+ <div class="flex-shrink-0">
154
+ <div class="flex items-center justify-center h-10 w-10 bg-gray-200 dark:bg-neutral-700 rounded-full">
155
+ <div class="h-6 w-6 text-gray-500 dark:text-neutral-400 i-hugeicons-user-01"></div>
156
+ </div>
157
+ </div>
158
+ <div class="ml-4">
159
+ <div class="flex items-center font-medium text-gray-900 dark:text-white">
160
+ {{ comment.author }}
161
+ <span :if="comment.id <= 2" class="inline-flex items-center ml-2 px-2 py-1 font-medium text-blue-700 text-xs dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 ring-1 ring-blue-700/10 ring-inset rounded-md dark:ring-blue-400/30">New</span>
162
+ </div>
163
+ <div class="text-gray-500 text-sm dark:text-neutral-400">{{ comment.email }}</div>
164
+ </div>
165
+ </div>
166
+ <div>
167
+ <span :class="commentStatusClass(comment.status)">{{ comment.status }}</span>
168
+ </div>
169
+ </div>
170
+ <div class="mt-2 text-gray-700 text-sm dark:text-neutral-300">
171
+ <p>{{ comment.content }}</p>
172
+ </div>
173
+ <div class="flex items-center mt-2 text-gray-500 text-sm dark:text-neutral-400">
174
+ <div class="mr-1 h-4 w-4 i-hugeicons-document-text"></div>
175
+ <p>On: <a href="#" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">{{ comment.post }}</a> • <span class="whitespace-nowrap">{{ comment.date }}</span></p>
176
+ </div>
177
+ <div class="flex mt-2 space-x-2">
178
+ <button :if="comment.status !== 'Approved'" type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
179
+ <div class="mr-1 h-4 w-4 i-hugeicons-checkmark-circle-02"></div>
180
+ Approve
181
+ </button>
182
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
183
+ <div class="mr-1 h-4 w-4 i-hugeicons-edit-01"></div>
184
+ Reply
185
+ </button>
186
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
187
+ <div class="mr-1 h-4 w-4 i-hugeicons-waste"></div>
188
+ Delete
189
+ </button>
190
+ </div>
191
+ </li>
192
+ </template>
193
+ </ul>
194
+ <div class="flex items-center justify-between px-4 py-4 sm:px-6 bg-gray-50 dark:bg-neutral-700">
195
+ <a href="#" class="font-medium text-blue-600 text-sm dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">View all comments<span aria-hidden="true"> &rarr;</span></a>
196
+ <div class="text-gray-500 text-sm dark:text-neutral-400">Showing 5 of 42 comments</div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+
201
+ <div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
202
+ <div class="flex items-center justify-between px-4 py-5 sm:px-6">
203
+ <h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Draft Posts</h3>
204
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 focus-visible:outline-offset-2 shadow-sm">
205
+ <div class="mr-1 h-4 w-4 i-hugeicons-plus-sign"></div>
206
+ New Draft
207
+ </button>
208
+ </div>
209
+ <div class="border-gray-200 border-t dark:border-neutral-700">
210
+ <ul role="list" class="overflow-y-auto max-h-[500px] divide-gray-200 divide-y dark:divide-neutral-700">
211
+ <template :for="post in draftPosts">
212
+ <li class="px-4 py-4 sm:px-6 hover:bg-gray-50 dark:hover:bg-neutral-700 duration-150 transition">
213
+ <div class="flex items-center justify-between">
214
+ <div>
215
+ <div class="flex items-center font-medium text-gray-900 dark:text-white">
216
+ {{ post.title }}
217
+ <span :if="post.id === 6" class="inline-flex items-center ml-2 px-2 py-1 font-medium text-green-700 text-xs dark:text-green-400 bg-green-50 dark:bg-green-900/30 ring-1 ring-green-600/20 ring-inset rounded-md dark:ring-green-500/30">Updated today</span>
218
+ </div>
219
+ <div class="flex items-center mt-1 text-gray-500 text-sm dark:text-neutral-400">
220
+ <div class="mr-1 h-4 w-4 i-hugeicons-folder-01"></div>
221
+ <span>{{ post.category }}</span>
222
+ <span class="mx-2">&middot;</span>
223
+ <div class="mr-1 h-4 w-4 i-hugeicons-user-01"></div>
224
+ <span>{{ post.author }}</span>
225
+ <span :if="post.id === 7" class="inline-flex items-center ml-2 px-2 py-1 font-medium text-xs text-yellow-800 dark:text-yellow-400 bg-yellow-50 dark:bg-yellow-900/30 ring-1 ring-inset ring-yellow-600/20 rounded-md dark:ring-yellow-500/30">Needs review</span>
226
+ </div>
227
+ </div>
228
+ <div class="flex items-center text-gray-500 text-sm dark:text-neutral-400">
229
+ <div class="mr-1 h-4 w-4 i-hugeicons-calendar"></div>
230
+ Last edited: {{ post.lastEdited }}
231
+ </div>
232
+ </div>
233
+ <div class="mt-3 h-1.5 w-full bg-gray-200 dark:bg-neutral-700 rounded-full">
234
+ <div class="h-1.5 bg-blue-600 rounded-full" :style="'width: ' + draftProgressWidth(post.id)"></div>
235
+ </div>
236
+ <div class="mt-1 text-gray-500 text-right text-xs dark:text-neutral-400">{{ draftProgressLabel(post.id) }}</div>
237
+ <div class="flex mt-2 space-x-2">
238
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
239
+ <div class="mr-1 h-4 w-4 i-hugeicons-edit-01"></div>
240
+ Edit
241
+ </button>
242
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm">
243
+ <div class="mr-1 h-4 w-4 i-hugeicons-view"></div>
244
+ Preview
245
+ </button>
246
+ <button type="button" class="inline-flex items-center px-2.5 py-1.5 font-semibold text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 focus-visible:outline-offset-2 shadow-sm">
247
+ <div class="mr-1 h-4 w-4 i-hugeicons-paper-plane"></div>
248
+ Publish
249
+ </button>
250
+ </div>
251
+ </li>
252
+ </template>
253
+ </ul>
254
+ <div class="flex items-center justify-between px-4 py-4 sm:px-6 bg-gray-50 dark:bg-neutral-700">
255
+ <a href="#" class="font-medium text-blue-600 text-sm dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">View all drafts<span aria-hidden="true"> &rarr;</span></a>
256
+ <div class="text-gray-500 text-sm dark:text-neutral-400">Showing 3 of 12 drafts</div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ </PageLayout>
262
+
263
+ <script client>
264
+
265
+ interface ChartLike { destroy: () => void }
266
+ type ChartCtor = new (canvas: HTMLElement, config: { type: string, data: unknown, options?: unknown }) => ChartLike
267
+
268
+ // Static demo data + view helpers — moved out of the former
269
+ // `<script server>` block (stacksjs/stacks#1838).
270
+ const timeRanges = ['Today', 'Last 7 days', 'Last 30 days', 'Last 90 days', 'Last year', 'All time']
271
+
272
+ const topPosts = [
273
+ { id: 1, title: '10 Tips for Better Code Quality', category: 'Tutorials', views: 12450, comments: 78, published: '2023-12-01', status: 'Published' },
274
+ { id: 2, title: 'The Future of JavaScript Frameworks', category: 'Technology', views: 9870, comments: 124, published: '2023-11-28', status: 'Published' },
275
+ { id: 3, title: 'Getting Started with STX', category: 'Tutorials', views: 8760, comments: 45, published: '2023-11-25', status: 'Published' },
276
+ { id: 4, title: 'Review: Latest MacBook Pro', category: 'Reviews', views: 7650, comments: 92, published: '2023-11-20', status: 'Published' },
277
+ { id: 5, title: 'Understanding Web Accessibility', category: 'Tutorials', views: 6540, comments: 31, published: '2023-11-15', status: 'Published' },
278
+ ]
279
+
280
+ const recentComments = [
281
+ { id: 1, author: 'John Smith', email: 'john.smith@example.com', content: "Great article! This helped me solve a problem I've been stuck on for days.", post: '10 Tips for Better Code Quality', date: '2023-12-01', status: 'Approved' },
282
+ { id: 2, author: 'Sarah Johnson', email: 'sarah.j@example.com', content: 'I disagree with point #3. In my experience, that approach causes more problems than it solves.', post: 'The Future of JavaScript Frameworks', date: '2023-12-01', status: 'Pending' },
283
+ { id: 3, author: 'Michael Brown', email: 'mbrown@example.com', content: 'Thanks for the tutorial! Could you elaborate more on the setup process?', post: 'Getting Started with STX', date: '2023-11-30', status: 'Approved' },
284
+ { id: 4, author: 'Emily Davis', email: 'emily.davis@example.com', content: 'I found a typo in the third paragraph. It should be "their" not "there".', post: '10 Tips for Better Code Quality', date: '2023-11-30', status: 'Approved' },
285
+ { id: 5, author: 'David Wilson', email: 'dwilson@example.com', content: 'This review seems biased. Have you tried comparing it with the competition?', post: 'Review: Latest MacBook Pro', date: '2023-11-29', status: 'Spam' },
286
+ ]
287
+
288
+ const draftPosts = [
289
+ { id: 6, title: 'Introduction to TypeScript', category: 'Tutorials', lastEdited: '2023-12-01', author: 'Jane Doe' },
290
+ { id: 7, title: 'Building a REST API with Node.js', category: 'Tutorials', lastEdited: '2023-11-29', author: 'John Smith' },
291
+ { id: 8, title: 'CSS Grid vs Flexbox', category: 'Tutorials', lastEdited: '2023-11-27', author: 'Jane Doe' },
292
+ ]
293
+
294
+ const totalPosts = 127
295
+ const totalViews = 256890
296
+ const totalComments = 3427
297
+ const averageEngagement = '4.2%'
298
+
299
+ function commentStatusClass(status) {
300
+ const tone = status === 'Approved'
301
+ ? 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300'
302
+ : status === 'Spam'
303
+ ? 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300'
304
+ : 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300'
305
+ return `${tone} inline-flex items-center px-2 py-1 font-medium text-xs rounded-md`
306
+ }
307
+
308
+ function draftProgressWidth(id) {
309
+ if (id === 6) return '90%'
310
+ if (id === 7) return '65%'
311
+ return '40%'
312
+ }
313
+
314
+ function draftProgressLabel(id) {
315
+ if (id === 6) return 'Almost ready'
316
+ if (id === 7) return 'In progress'
317
+ return 'Just started'
318
+ }
319
+
320
+ // `timeRange` shadows the static `timeRanges` filter label list above.
321
+ const timeRange = state('Last 30 days')
322
+
323
+ const viewsData = {
324
+ labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
325
+ datasets: [{
326
+ label: 'Page Views',
327
+ backgroundColor: 'rgba(59, 130, 246, 0.2)',
328
+ borderColor: 'rgba(59, 130, 246, 1)',
329
+ borderWidth: 2,
330
+ pointBackgroundColor: 'rgba(59, 130, 246, 1)',
331
+ pointBorderColor: '#fff',
332
+ pointHoverBackgroundColor: '#fff',
333
+ pointHoverBorderColor: 'rgba(59, 130, 246, 1)',
334
+ fill: true,
335
+ tension: 0.4,
336
+ data: [12500, 14200, 13800, 15600, 16800, 16200, 17500, 18200, 19100, 18600, 20100, 21500],
337
+ }],
338
+ }
339
+
340
+ const categoryData = {
341
+ labels: ['Technology', 'Tutorials', 'News', 'Reviews', 'Opinion'],
342
+ datasets: [{
343
+ backgroundColor: ['rgba(59, 130, 246, 0.8)', 'rgba(16, 185, 129, 0.8)', 'rgba(245, 158, 11, 0.8)', 'rgba(239, 68, 68, 0.8)', 'rgba(139, 92, 246, 0.8)'],
344
+ borderColor: ['rgba(59, 130, 246, 1)', 'rgba(16, 185, 129, 1)', 'rgba(245, 158, 11, 1)', 'rgba(239, 68, 68, 1)', 'rgba(139, 92, 246, 1)'],
345
+ borderWidth: 1,
346
+ data: [35, 25, 20, 15, 5],
347
+ }],
348
+ }
349
+
350
+ const chartOptions = {
351
+ responsive: true,
352
+ maintainAspectRatio: false,
353
+ plugins: { legend: { display: false } },
354
+ scales: {
355
+ y: { beginAtZero: true, grid: { display: true, color: 'rgba(0, 0, 0, 0.05)' } },
356
+ x: { grid: { display: false } },
357
+ },
358
+ }
359
+
360
+ const doughnutOptions = {
361
+ responsive: true,
362
+ maintainAspectRatio: false,
363
+ plugins: { legend: { position: 'right', labels: { boxWidth: 15, padding: 15 } } },
364
+ }
365
+
366
+ let chartHandles: Array<{ destroy: () => void }> = []
367
+
368
+ onMount(async () => {
369
+ const { Chart, registerables } = await import('@stacksjs/charts')
370
+ Chart.register(...registerables)
371
+ const Ctor = Chart as unknown as ChartCtor
372
+ const views = useChart({ Chart: Ctor, id: 'content_views_chart', type: 'line', data: viewsData, options: chartOptions })
373
+ const category = useChart({ Chart: Ctor, id: 'content_category_chart', type: 'doughnut', data: categoryData, options: doughnutOptions })
374
+ chartHandles = [views.instance, category.instance].filter((c): c is ChartLike => c !== null)
375
+ })
376
+
377
+ onDestroy(() => {
378
+ chartHandles.forEach(c => c.destroy())
379
+ chartHandles = []
380
+ })
381
+ </script>
382
+
383
+ @endsection