@askrjs/cli 0.0.2 → 0.0.4

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 (310) hide show
  1. package/README.md +46 -7
  2. package/dist/add.d.ts +16 -0
  3. package/dist/add.js +558 -1
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.js +43 -16
  6. package/dist/create.d.ts +5 -0
  7. package/dist/create.js +104 -26
  8. package/dist/directory-swap-DWoHtx7C.js +35 -0
  9. package/dist/discovery-Difb7Y4G.js +323 -0
  10. package/dist/generate.d.ts +5 -0
  11. package/dist/generate.js +461 -0
  12. package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
  13. package/dist/openapi.d.ts +25 -0
  14. package/dist/openapi.js +49 -16
  15. package/dist/planner-VAj7qlxr.js +285 -0
  16. package/dist/range-YUs9eimn.js +125 -0
  17. package/dist/registry-CyrRHRG5.js +209 -0
  18. package/dist/skills/askr-dashboard-charts/SKILL.md +61 -44
  19. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
  20. package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
  21. package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
  22. package/dist/skills.d.ts +18 -0
  23. package/dist/skills.js +1 -1
  24. package/dist/specification-DXnDOC-0.js +49 -0
  25. package/dist/ssg-config.d.ts +41 -0
  26. package/dist/ssg-config.js +1 -0
  27. package/dist/ssg.d.ts +61 -0
  28. package/dist/ssg.js +360 -24
  29. package/dist/templates/full-stack/AGENTS.md +0 -1
  30. package/dist/templates/full-stack/README.md +0 -1
  31. package/dist/templates/full-stack/index.html +0 -1
  32. package/dist/templates/full-stack/package.json +5 -3
  33. package/dist/templates/full-stack/server.ts +5 -9
  34. package/dist/templates/full-stack/src/action-authorizations.ts +2 -2
  35. package/dist/templates/full-stack/src/actions/create-message.ts +5 -5
  36. package/dist/templates/full-stack/src/i18n.ts +4 -4
  37. package/dist/templates/full-stack/src/main.tsx +4 -5
  38. package/dist/templates/full-stack/src/pages/home.tsx +5 -5
  39. package/dist/templates/full-stack/src/pages/layout.tsx +15 -5
  40. package/dist/templates/full-stack/src/pages/not-found.tsx +5 -2
  41. package/dist/templates/full-stack/src/routes.tsx +11 -12
  42. package/dist/templates/full-stack/src/schemas.ts +1 -2
  43. package/dist/templates/full-stack/src/server/action-registry.ts +5 -10
  44. package/dist/templates/full-stack/src/server/actions/create-message.ts +4 -4
  45. package/dist/templates/full-stack/src/server/app.ts +67 -57
  46. package/dist/templates/full-stack/src/server/dependencies.ts +10 -10
  47. package/dist/templates/full-stack/src/server/entry-server.ts +3 -3
  48. package/dist/templates/full-stack/src/telemetry.ts +1 -2
  49. package/dist/templates/full-stack/tests/actions/create-message.test.ts +7 -8
  50. package/dist/templates/full-stack/tsconfig.json +1 -2
  51. package/dist/templates/full-stack/vite.config.ts +5 -6
  52. package/dist/templates/spa/AGENTS.md +1 -1
  53. package/dist/templates/spa/package.json +3 -4
  54. package/dist/templates/spa/src/adapters/operations-client.ts +7 -2
  55. package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
  56. package/dist/templates/spa/src/pages/app/admin-home.tsx +21 -3
  57. package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
  58. package/dist/templates/spa/src/styles.css +1 -1
  59. package/dist/templates/spa/tsconfig.json +2 -1
  60. package/dist/templates/spa/vitest.config.ts +0 -4
  61. package/dist/templates/ssg/README.md +1 -1
  62. package/dist/templates/ssg/package.json +1 -1
  63. package/dist/templates/ssg/ssg.config.ts +7 -0
  64. package/dist/templates/ssg/tests/ssg-config.test.ts +5 -3
  65. package/dist/templates/ssg/tsconfig.json +2 -1
  66. package/dist/templates/ssg/vitest.config.ts +0 -4
  67. package/dist/templates/ssr/package.json +2 -2
  68. package/dist/templates/ssr/server.ts +4 -10
  69. package/dist/templates/ssr/src/entry-server.tsx +6 -4
  70. package/dist/templates/startkit/package.json +2 -2
  71. package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
  72. package/dist/templates/startkit/tsconfig.json +2 -1
  73. package/dist/update.d.ts +41 -0
  74. package/dist/update.js +282 -2
  75. package/dist/writer-D8qe_7ud.js +226 -0
  76. package/package.json +23 -22
  77. package/dist/add-DqhqRzBQ.js +0 -555
  78. package/dist/add-DqhqRzBQ.js.map +0 -1
  79. package/dist/cli.js.map +0 -1
  80. package/dist/create.js.map +0 -1
  81. package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
  82. package/dist/openapi.js.map +0 -1
  83. package/dist/skills-Bh0mEhIx.js.map +0 -1
  84. package/dist/ssg.js.map +0 -1
  85. package/dist/templates/full-stack/src/vite-server.d.ts +0 -6
  86. package/dist/templates/spa/src/styles.d.ts +0 -1
  87. package/dist/templates/ssg/src/vite-env.d.ts +0 -5
  88. package/dist/templates/ssr/src/vite-server.d.ts +0 -7
  89. package/dist/templates/startkit/src/vite-env.d.ts +0 -5
  90. package/dist/update-DyW1na5V.js +0 -1140
  91. package/dist/update-DyW1na5V.js.map +0 -1
  92. package/skills/askr-accessibility/SKILL.md +0 -68
  93. package/skills/askr-accessibility/agents/openai.yaml +0 -4
  94. package/skills/askr-agent-execution/SKILL.md +0 -85
  95. package/skills/askr-agent-execution/agents/openai.yaml +0 -4
  96. package/skills/askr-agent-workflows/SKILL.md +0 -57
  97. package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
  98. package/skills/askr-api-integration/SKILL.md +0 -79
  99. package/skills/askr-api-integration/agents/openai.yaml +0 -4
  100. package/skills/askr-app-builder/SKILL.md +0 -99
  101. package/skills/askr-app-builder/agents/openai.yaml +0 -4
  102. package/skills/askr-auth-access/SKILL.md +0 -74
  103. package/skills/askr-auth-access/agents/openai.yaml +0 -4
  104. package/skills/askr-cli-vite/SKILL.md +0 -76
  105. package/skills/askr-cli-vite/agents/openai.yaml +0 -4
  106. package/skills/askr-dashboard-charts/SKILL.md +0 -82
  107. package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
  108. package/skills/askr-design-system/SKILL.md +0 -86
  109. package/skills/askr-design-system/agents/openai.yaml +0 -4
  110. package/skills/askr-env-config/SKILL.md +0 -74
  111. package/skills/askr-env-config/agents/openai.yaml +0 -4
  112. package/skills/askr-error-loading-empty/SKILL.md +0 -89
  113. package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
  114. package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
  115. package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
  116. package/skills/askr-forms-tables-crud/SKILL.md +0 -98
  117. package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
  118. package/skills/askr-mental-model/SKILL.md +0 -109
  119. package/skills/askr-mental-model/agents/openai.yaml +0 -4
  120. package/skills/askr-migration-react/SKILL.md +0 -81
  121. package/skills/askr-migration-react/agents/openai.yaml +0 -4
  122. package/skills/askr-observability-debugging/SKILL.md +0 -83
  123. package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
  124. package/skills/askr-project-structure/SKILL.md +0 -79
  125. package/skills/askr-project-structure/agents/openai.yaml +0 -4
  126. package/skills/askr-query-mutation/SKILL.md +0 -115
  127. package/skills/askr-query-mutation/agents/openai.yaml +0 -4
  128. package/skills/askr-realtime-streaming/SKILL.md +0 -76
  129. package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
  130. package/skills/askr-resources-data/SKILL.md +0 -100
  131. package/skills/askr-resources-data/agents/openai.yaml +0 -4
  132. package/skills/askr-routing-layouts/SKILL.md +0 -107
  133. package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
  134. package/skills/askr-runtime-reactivity/SKILL.md +0 -92
  135. package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
  136. package/skills/askr-ssr-ssg/SKILL.md +0 -76
  137. package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
  138. package/skills/askr-testing-determinism/SKILL.md +0 -75
  139. package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
  140. package/skills/askr-theming/SKILL.md +0 -86
  141. package/skills/askr-theming/agents/openai.yaml +0 -4
  142. package/skills/askr-ui-composition/SKILL.md +0 -92
  143. package/skills/askr-ui-composition/agents/openai.yaml +0 -4
  144. package/templates/full-stack/AGENTS.md +0 -12
  145. package/templates/full-stack/README.md +0 -18
  146. package/templates/full-stack/gitignore.template +0 -4
  147. package/templates/full-stack/index.html +0 -14
  148. package/templates/full-stack/package.json +0 -37
  149. package/templates/full-stack/server.ts +0 -13
  150. package/templates/full-stack/src/action-authorizations.ts +0 -10
  151. package/templates/full-stack/src/actions/create-message.ts +0 -10
  152. package/templates/full-stack/src/i18n.ts +0 -8
  153. package/templates/full-stack/src/main.tsx +0 -12
  154. package/templates/full-stack/src/pages/home.tsx +0 -25
  155. package/templates/full-stack/src/pages/layout.tsx +0 -33
  156. package/templates/full-stack/src/pages/not-found.tsx +0 -4
  157. package/templates/full-stack/src/routes.tsx +0 -20
  158. package/templates/full-stack/src/schemas.ts +0 -11
  159. package/templates/full-stack/src/server/action-registry.ts +0 -12
  160. package/templates/full-stack/src/server/actions/create-message.ts +0 -14
  161. package/templates/full-stack/src/server/app.ts +0 -66
  162. package/templates/full-stack/src/server/dependencies.ts +0 -55
  163. package/templates/full-stack/src/server/entry-server.ts +0 -8
  164. package/templates/full-stack/src/telemetry.ts +0 -4
  165. package/templates/full-stack/src/vite-server.d.ts +0 -6
  166. package/templates/full-stack/tests/actions/create-message.test.ts +0 -13
  167. package/templates/full-stack/tsconfig.json +0 -16
  168. package/templates/full-stack/vite.config.ts +0 -11
  169. package/templates/spa/AGENTS.md +0 -60
  170. package/templates/spa/README.md +0 -96
  171. package/templates/spa/gitignore.template +0 -16
  172. package/templates/spa/index.html +0 -13
  173. package/templates/spa/package.json +0 -35
  174. package/templates/spa/src/adapters/operations-client.ts +0 -90
  175. package/templates/spa/src/components/shared/metric-card.tsx +0 -27
  176. package/templates/spa/src/components/shared/status-badge.tsx +0 -24
  177. package/templates/spa/src/features/operations/operations.query.ts +0 -9
  178. package/templates/spa/src/main.tsx +0 -10
  179. package/templates/spa/src/pages/_layout.tsx +0 -9
  180. package/templates/spa/src/pages/_routes.tsx +0 -27
  181. package/templates/spa/src/pages/app/_layout.tsx +0 -94
  182. package/templates/spa/src/pages/app/_routes.tsx +0 -10
  183. package/templates/spa/src/pages/app/admin-home.tsx +0 -152
  184. package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
  185. package/templates/spa/src/pages/app/settings.tsx +0 -91
  186. package/templates/spa/src/pages/auth/_layout.tsx +0 -38
  187. package/templates/spa/src/pages/auth/_routes.tsx +0 -6
  188. package/templates/spa/src/pages/auth/login.tsx +0 -63
  189. package/templates/spa/src/pages/not-found.tsx +0 -22
  190. package/templates/spa/src/pages/public/_layout.tsx +0 -47
  191. package/templates/spa/src/pages/public/_routes.tsx +0 -6
  192. package/templates/spa/src/pages/public/home.tsx +0 -143
  193. package/templates/spa/src/shared/format.ts +0 -12
  194. package/templates/spa/src/shared/navigation.ts +0 -15
  195. package/templates/spa/src/styles/components.css +0 -49
  196. package/templates/spa/src/styles/layout.css +0 -192
  197. package/templates/spa/src/styles/reset.css +0 -44
  198. package/templates/spa/src/styles/theme.css +0 -57
  199. package/templates/spa/src/styles/tokens.css +0 -20
  200. package/templates/spa/src/styles.css +0 -7
  201. package/templates/spa/src/styles.d.ts +0 -1
  202. package/templates/spa/tests/app.test.tsx +0 -37
  203. package/templates/spa/tests/components/shared.test.tsx +0 -12
  204. package/templates/spa/tests/resources.test.ts +0 -22
  205. package/templates/spa/tsconfig.json +0 -20
  206. package/templates/spa/tsconfig.node.json +0 -10
  207. package/templates/spa/vite.config.ts +0 -24
  208. package/templates/spa/vitest.config.ts +0 -17
  209. package/templates/ssg/AGENTS.md +0 -55
  210. package/templates/ssg/README.md +0 -39
  211. package/templates/ssg/gitignore.template +0 -17
  212. package/templates/ssg/index.html +0 -13
  213. package/templates/ssg/package.json +0 -35
  214. package/templates/ssg/src/app.tsx +0 -14
  215. package/templates/ssg/src/components/badge.tsx +0 -3
  216. package/templates/ssg/src/components/counter.tsx +0 -30
  217. package/templates/ssg/src/components/site-shell.tsx +0 -111
  218. package/templates/ssg/src/jsx.d.ts +0 -23
  219. package/templates/ssg/src/main.tsx +0 -8
  220. package/templates/ssg/src/pages/about.tsx +0 -82
  221. package/templates/ssg/src/pages/content.tsx +0 -63
  222. package/templates/ssg/src/pages/example.tsx +0 -97
  223. package/templates/ssg/src/pages/home.tsx +0 -51
  224. package/templates/ssg/src/resources/user.ts +0 -15
  225. package/templates/ssg/src/routes.tsx +0 -15
  226. package/templates/ssg/src/styles.css +0 -89
  227. package/templates/ssg/src/vite-env.d.ts +0 -5
  228. package/templates/ssg/ssg.config.ts +0 -34
  229. package/templates/ssg/tests/app.test.tsx +0 -19
  230. package/templates/ssg/tests/components/counter.test.tsx +0 -18
  231. package/templates/ssg/tests/resources.test.ts +0 -11
  232. package/templates/ssg/tests/ssg-config.test.ts +0 -11
  233. package/templates/ssg/tsconfig.json +0 -20
  234. package/templates/ssg/tsconfig.node.json +0 -10
  235. package/templates/ssg/vite.config.ts +0 -24
  236. package/templates/ssg/vitest.config.ts +0 -17
  237. package/templates/ssr/AGENTS.md +0 -28
  238. package/templates/ssr/README.md +0 -38
  239. package/templates/ssr/gitignore.template +0 -16
  240. package/templates/ssr/index.html +0 -13
  241. package/templates/ssr/package.json +0 -34
  242. package/templates/ssr/server.ts +0 -16
  243. package/templates/ssr/src/app.tsx +0 -21
  244. package/templates/ssr/src/components/counter.tsx +0 -26
  245. package/templates/ssr/src/entry-server.tsx +0 -10
  246. package/templates/ssr/src/main.tsx +0 -11
  247. package/templates/ssr/src/pages/about.tsx +0 -75
  248. package/templates/ssr/src/pages/example.tsx +0 -113
  249. package/templates/ssr/src/pages/home.tsx +0 -56
  250. package/templates/ssr/src/resources/user.ts +0 -15
  251. package/templates/ssr/src/routes.tsx +0 -13
  252. package/templates/ssr/src/styles.css +0 -148
  253. package/templates/ssr/src/vite-server.d.ts +0 -7
  254. package/templates/ssr/tests/app.test.tsx +0 -24
  255. package/templates/ssr/tests/components/counter.test.tsx +0 -13
  256. package/templates/ssr/tests/resources.test.ts +0 -11
  257. package/templates/ssr/tsconfig.json +0 -22
  258. package/templates/ssr/tsconfig.node.json +0 -10
  259. package/templates/ssr/tsconfig.server.json +0 -15
  260. package/templates/ssr/vite.config.ts +0 -25
  261. package/templates/ssr/vitest.config.ts +0 -13
  262. package/templates/startkit/AGENTS.md +0 -77
  263. package/templates/startkit/README.md +0 -192
  264. package/templates/startkit/gitignore.template +0 -16
  265. package/templates/startkit/index.html +0 -13
  266. package/templates/startkit/package.json +0 -35
  267. package/templates/startkit/src/components/app-header.tsx +0 -93
  268. package/templates/startkit/src/components/app-sidebar.tsx +0 -95
  269. package/templates/startkit/src/components/data-table.tsx +0 -80
  270. package/templates/startkit/src/components/empty-state.tsx +0 -13
  271. package/templates/startkit/src/components/page-header.tsx +0 -23
  272. package/templates/startkit/src/components/stat-card.tsx +0 -24
  273. package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
  274. package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
  275. package/templates/startkit/src/lib/format.ts +0 -31
  276. package/templates/startkit/src/lib/mock-data.ts +0 -441
  277. package/templates/startkit/src/lib/routes.ts +0 -116
  278. package/templates/startkit/src/main.tsx +0 -12
  279. package/templates/startkit/src/pages/_layout.tsx +0 -56
  280. package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
  281. package/templates/startkit/src/pages/auth/login.tsx +0 -129
  282. package/templates/startkit/src/pages/home.tsx +0 -83
  283. package/templates/startkit/src/pages/not-found.tsx +0 -24
  284. package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
  285. package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
  286. package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
  287. package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
  288. package/templates/startkit/src/router.tsx +0 -7
  289. package/templates/startkit/src/routes/auth-config.ts +0 -38
  290. package/templates/startkit/src/routes/auth.ts +0 -8
  291. package/templates/startkit/src/routes/index.ts +0 -28
  292. package/templates/startkit/src/routes/public.ts +0 -8
  293. package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
  294. package/templates/startkit/src/routes/workspace/index.ts +0 -14
  295. package/templates/startkit/src/styles/components.css +0 -396
  296. package/templates/startkit/src/styles/layout.css +0 -192
  297. package/templates/startkit/src/styles/reset.css +0 -38
  298. package/templates/startkit/src/styles/theme.css +0 -76
  299. package/templates/startkit/src/styles/tokens.css +0 -67
  300. package/templates/startkit/src/styles.css +0 -7
  301. package/templates/startkit/src/toast.ts +0 -55
  302. package/templates/startkit/src/utils/join-classes.ts +0 -4
  303. package/templates/startkit/src/vite-env.d.ts +0 -5
  304. package/templates/startkit/tests/app.test.tsx +0 -32
  305. package/templates/startkit/tests/preferences.test.ts +0 -43
  306. package/templates/startkit/tests/resources.test.ts +0 -82
  307. package/templates/startkit/tsconfig.json +0 -20
  308. package/templates/startkit/tsconfig.node.json +0 -10
  309. package/templates/startkit/vite.config.ts +0 -32
  310. package/templates/startkit/vitest.config.ts +0 -13
@@ -1,118 +0,0 @@
1
- import { state } from '@askrjs/askr';
2
- import { resource } from '@askrjs/askr/resources';
3
- import { Button } from '@askrjs/ui/button';
4
- import {
5
- BarChart3Icon,
6
- CircleDollarSignIcon,
7
- Clock3Icon,
8
- UsersIcon,
9
- } from '@askrjs/lucide';
10
- import DataTable, { type DataTableColumn } from '../../components/data-table';
11
- import EmptyState from '../../components/empty-state';
12
- import PageHeader from '../../components/page-header';
13
- import StatCard from '../../components/stat-card';
14
- import { getDashboardData, type ActivityEntry } from '../../lib/mock-data';
15
- import { formatRelativeDate } from '../../lib/format';
16
-
17
- export default function DashboardPage() {
18
- const [hideActivityState, setHideActivityState] = state(false);
19
- const dashboardResource = resource(
20
- async ({ signal }) => getDashboardData({ signal }),
21
- []
22
- );
23
-
24
- const stats = () => dashboardResource.value?.stats ?? [];
25
- const activities = () =>
26
- hideActivityState() ? [] : (dashboardResource.value?.activities ?? []);
27
-
28
- const columns: DataTableColumn<ActivityEntry>[] = [
29
- { key: 'actor', header: 'Actor', render: (row) => row.actor },
30
- { key: 'action', header: 'Action', render: (row) => row.action },
31
- { key: 'resource', header: 'Resource', render: (row) => row.resource },
32
- {
33
- key: 'timestamp',
34
- header: 'When',
35
- render: (row) => (
36
- <span class="muted">{formatRelativeDate(row.timestamp)}</span>
37
- ),
38
- },
39
- ];
40
-
41
- const iconByStatKey = {
42
- mrr: CircleDollarSignIcon,
43
- accounts: UsersIcon,
44
- pending: Clock3Icon,
45
- seats: BarChart3Icon,
46
- } as const;
47
-
48
- return (
49
- <section class="stack-lg">
50
- <PageHeader
51
- title="Dashboard"
52
- description="Overview of workspace health, growth, and recent team activity."
53
- actions={
54
- <Button
55
- onPress={() => dashboardResource.refresh()}
56
- disabled={dashboardResource.pending}
57
- >
58
- {dashboardResource.pending ? 'Refreshing...' : 'Refresh'}
59
- </Button>
60
- }
61
- />
62
-
63
- <div class="stat-grid">
64
- {stats().map((stat) => {
65
- const Icon =
66
- iconByStatKey[stat.key as keyof typeof iconByStatKey] ??
67
- BarChart3Icon;
68
- return (
69
- <StatCard
70
- label={stat.label}
71
- value={stat.value}
72
- trend={stat.trend}
73
- icon={Icon}
74
- />
75
- );
76
- })}
77
- </div>
78
-
79
- <section class="panel stack-md">
80
- <div class="section-head">
81
- <div>
82
- <h2>Recent activity</h2>
83
- <p class="muted">
84
- The activity table demonstrates loading, empty, and retry
85
- behavior.
86
- </p>
87
- </div>
88
- <Button
89
- onPress={() => setHideActivityState((current) => !current)}
90
- class="button-secondary"
91
- disabled={dashboardResource.pending}
92
- >
93
- {hideActivityState() ? 'Show activity' : 'Show empty state'}
94
- </Button>
95
- </div>
96
-
97
- {dashboardResource.error ? (
98
- <EmptyState
99
- title="Could not load dashboard"
100
- description={dashboardResource.error.message}
101
- action={
102
- <Button onPress={() => dashboardResource.refresh()}>Retry</Button>
103
- }
104
- />
105
- ) : (
106
- <DataTable
107
- rows={activities}
108
- rowKey={(row) => row.id}
109
- columns={columns}
110
- isLoading={dashboardResource.pending && !dashboardResource.value}
111
- emptyTitle="No activity yet"
112
- emptyDescription="Your activity feed will appear as soon as workspace events are recorded."
113
- />
114
- )}
115
- </section>
116
- </section>
117
- );
118
- }
@@ -1,218 +0,0 @@
1
- import { state } from '@askrjs/askr';
2
- import { Button } from '@askrjs/ui/button';
3
- import {
4
- Dialog,
5
- DialogClose,
6
- DialogContent,
7
- DialogDescription,
8
- DialogOverlay,
9
- DialogPortal,
10
- DialogTitle,
11
- DialogTrigger,
12
- } from '@askrjs/ui/dialog';
13
- import { Input } from '@askrjs/ui/input';
14
- import { Field, Inline } from '@askrjs/themes/components';
15
- import {
16
- Select,
17
- SelectContent,
18
- SelectItem,
19
- SelectPortal,
20
- SelectTrigger,
21
- SelectValue,
22
- } from '@askrjs/ui/select';
23
- import { Switch } from '@askrjs/ui/switch';
24
- import { SaveIcon } from '@askrjs/lucide';
25
- import PageHeader from '../../components/page-header';
26
- import {
27
- appearanceMode,
28
- setAppearance,
29
- type AppearanceMode,
30
- } from '../../lib/mock-data';
31
- import { showToast } from '../../toast';
32
-
33
- export default function SettingsPage() {
34
- const [fullNameState, setFullNameState] = state('Alex Morgan');
35
- const [emailState, setEmailState] = state('alex@example.com');
36
- const [timezoneState, setTimezoneState] = state('utc');
37
- const [marketingEmailsState, setMarketingEmailsState] = state(false);
38
- const [incidentAlertsState, setIncidentAlertsState] = state(true);
39
- const [validationErrorState, setValidationErrorState] = state('');
40
- const [savingState, setSavingState] = state(false);
41
-
42
- const save = async () => {
43
- if (!fullNameState().trim()) {
44
- setValidationErrorState('Full name is required.');
45
- return;
46
- }
47
-
48
- if (!emailState().trim().includes('@')) {
49
- setValidationErrorState('Email must be valid.');
50
- return;
51
- }
52
-
53
- setValidationErrorState('');
54
- setSavingState(true);
55
-
56
- await new Promise((resolve) => setTimeout(resolve, 260));
57
-
58
- setSavingState(false);
59
- showToast({
60
- title: 'Settings saved',
61
- description:
62
- 'Profile and preference values were persisted in mock state.',
63
- });
64
- };
65
-
66
- return (
67
- <section class="stack-lg">
68
- <PageHeader
69
- title="Settings"
70
- description="Profile settings, workspace preferences, and production form patterns."
71
- actions={
72
- <Button onPress={() => void save()} disabled={savingState()}>
73
- <SaveIcon size={14} aria-hidden="true" />{' '}
74
- {savingState() ? 'Saving...' : 'Save changes'}
75
- </Button>
76
- }
77
- />
78
-
79
- <div class="settings-grid">
80
- <section class="panel stack-md">
81
- <h2>Profile</h2>
82
-
83
- <Field id="profile-name">
84
- <label htmlFor="profile-name">Full name</label>
85
- <Input
86
- id="profile-name"
87
- value={fullNameState()}
88
- onInput={(event: Event) =>
89
- setFullNameState((event.target as HTMLInputElement).value)
90
- }
91
- />
92
- </Field>
93
-
94
- <Field id="profile-email">
95
- <label htmlFor="profile-email">Email</label>
96
- <Input
97
- id="profile-email"
98
- type="email"
99
- value={emailState()}
100
- onInput={(event: Event) =>
101
- setEmailState((event.target as HTMLInputElement).value)
102
- }
103
- />
104
- </Field>
105
-
106
- <Field id="profile-timezone">
107
- <label id="profile-timezone-label">Timezone</label>
108
- <Select value={timezoneState()} onValueChange={setTimezoneState}>
109
- <SelectTrigger aria-labelledby="profile-timezone-label">
110
- <SelectValue placeholder="Select timezone" />
111
- </SelectTrigger>
112
- <SelectPortal>
113
- <SelectContent>
114
- <SelectItem value="utc">UTC</SelectItem>
115
- <SelectItem value="pst">Pacific Time</SelectItem>
116
- <SelectItem value="est">Eastern Time</SelectItem>
117
- </SelectContent>
118
- </SelectPortal>
119
- </Select>
120
- </Field>
121
-
122
- {validationErrorState() && (
123
- <p class="field-error" role="alert">
124
- {validationErrorState()}
125
- </p>
126
- )}
127
- </section>
128
-
129
- <section class="panel stack-md">
130
- <h2>Preferences</h2>
131
-
132
- <label class="switch-row">
133
- <div>
134
- <strong>Incident alerts</strong>
135
- <p class="muted">
136
- Receive critical service incident notifications.
137
- </p>
138
- </div>
139
- <Switch
140
- checked={incidentAlertsState()}
141
- onCheckedChange={setIncidentAlertsState}
142
- />
143
- </label>
144
-
145
- <label class="switch-row">
146
- <div>
147
- <strong>Marketing emails</strong>
148
- <p class="muted">Product updates and launch notes.</p>
149
- </div>
150
- <Switch
151
- checked={marketingEmailsState()}
152
- onCheckedChange={setMarketingEmailsState}
153
- />
154
- </label>
155
-
156
- <Field id="appearance-mode">
157
- <label id="appearance-mode-label">Appearance mode</label>
158
- <Select
159
- value={appearanceMode()}
160
- onValueChange={(value) => setAppearance(value as AppearanceMode)}
161
- >
162
- <SelectTrigger aria-labelledby="appearance-mode-label">
163
- <SelectValue placeholder="Appearance" />
164
- </SelectTrigger>
165
- <SelectPortal>
166
- <SelectContent>
167
- <SelectItem value="default">Default</SelectItem>
168
- <SelectItem value="harbor">Harbor</SelectItem>
169
- <SelectItem value="ink">Ink</SelectItem>
170
- </SelectContent>
171
- </SelectPortal>
172
- </Select>
173
- </Field>
174
-
175
- <Inline align="center" gap="var(--ak-space-sm)" wrap="wrap">
176
- <Button class="button-secondary" disabled>
177
- Disabled action example
178
- </Button>
179
-
180
- <Dialog>
181
- <DialogTrigger asChild>
182
- <Button class="button-secondary">Open modal example</Button>
183
- </DialogTrigger>
184
- <DialogPortal>
185
- <DialogOverlay />
186
- <DialogContent class="panel stack-md">
187
- <DialogTitle>Reset workspace preferences?</DialogTitle>
188
- <DialogDescription>
189
- This is a modal wiring example. Connect this to real
190
- persistence logic.
191
- </DialogDescription>
192
- <div class="inline-end">
193
- <DialogClose asChild>
194
- <Button class="button-secondary">Cancel</Button>
195
- </DialogClose>
196
- <DialogClose asChild>
197
- <Button
198
- onPress={() =>
199
- showToast({
200
- title: 'Preferences reset',
201
- description:
202
- 'Demonstration modal action completed.',
203
- })
204
- }
205
- >
206
- Confirm reset
207
- </Button>
208
- </DialogClose>
209
- </div>
210
- </DialogContent>
211
- </DialogPortal>
212
- </Dialog>
213
- </Inline>
214
- </section>
215
- </div>
216
- </section>
217
- );
218
- }
@@ -1,7 +0,0 @@
1
- import { createRouteRegistry } from '@askrjs/askr/router';
2
- import { registerAppRoutes } from './routes';
3
- import { routeAuth } from './routes/auth-config';
4
-
5
- export const pageRegistry = createRouteRegistry(registerAppRoutes, {
6
- auth: routeAuth,
7
- });
@@ -1,38 +0,0 @@
1
- import type { RouteAuthOptions } from '@askrjs/askr/router';
2
- import { getSessionEmail } from '../lib/mock-data';
3
- import {
4
- dashboardRoute,
5
- loginRoute,
6
- normalizeProtectedRouteTarget,
7
- } from '../lib/routes';
8
-
9
- export const routeAuth: RouteAuthOptions = {
10
- resolve: () => {
11
- const email = getSessionEmail();
12
-
13
- if (!email) {
14
- return {
15
- authenticated: false,
16
- principal: null,
17
- session: null,
18
- tenant: null,
19
- };
20
- }
21
-
22
- const principal = { id: email, subject: email, email };
23
- const session = { id: `browser:${email}`, subject: email };
24
-
25
- return {
26
- authenticated: true,
27
- principal,
28
- session,
29
- tenant: null,
30
- };
31
- },
32
- loginPath: loginRoute.href,
33
- authenticatedRedirectTo: ({ search }) => {
34
- const nextTarget = new URLSearchParams(search).get('next');
35
- const resolvedTarget = normalizeProtectedRouteTarget(nextTarget);
36
- return resolvedTarget || dashboardRoute.href;
37
- },
38
- };
@@ -1,8 +0,0 @@
1
- import { lazy, route } from '@askrjs/askr/router';
2
-
3
- export function registerAuthRoutes(): void {
4
- route(
5
- '/login',
6
- lazy(() => import('../pages/auth/login'))
7
- );
8
- }
@@ -1,28 +0,0 @@
1
- import { fallback, group, lazy } from '@askrjs/askr/router';
2
- import { requireAnonymous, requireUser } from '@askrjs/auth';
3
- import App from '../pages/_layout';
4
- import AuthLayout from '../pages/auth/_layout';
5
- import AppLayout from '../pages/workspace/_layout';
6
- import { registerAuthRoutes } from './auth';
7
- import { registerPublicRoutes } from './public';
8
- import { registerWorkspaceRoutes } from './workspace';
9
-
10
- export function registerAppRoutes(): void {
11
- group({ layout: App }, () => {
12
- registerPublicRoutes();
13
-
14
- group({ layout: AuthLayout, auth: requireAnonymous() }, () => {
15
- registerAuthRoutes();
16
- });
17
-
18
- group({ layout: AppLayout, auth: requireUser() }, () => {
19
- registerWorkspaceRoutes();
20
- });
21
-
22
- fallback(lazy(() => import('../pages/not-found')));
23
- });
24
- }
25
-
26
- export { registerAuthRoutes } from './auth';
27
- export { registerPublicRoutes } from './public';
28
- export { registerWorkspaceRoutes } from './workspace';
@@ -1,8 +0,0 @@
1
- import { lazy, route } from '@askrjs/askr/router';
2
-
3
- export function registerPublicRoutes(): void {
4
- route(
5
- '/',
6
- lazy(() => import('../pages/home'))
7
- );
8
- }
@@ -1,8 +0,0 @@
1
- import { lazy, route } from '@askrjs/askr/router';
2
-
3
- export function registerAccountRoutes(): void {
4
- route(
5
- '/accounts',
6
- lazy(() => import('../../pages/workspace/accounts'))
7
- );
8
- }
@@ -1,14 +0,0 @@
1
- import { lazy, route } from '@askrjs/askr/router';
2
- import { registerAccountRoutes } from './accounts';
3
-
4
- export function registerWorkspaceRoutes(): void {
5
- route(
6
- '/dashboard',
7
- lazy(() => import('../../pages/workspace/dashboard'))
8
- );
9
- registerAccountRoutes();
10
- route(
11
- '/settings',
12
- lazy(() => import('../../pages/workspace/settings'))
13
- );
14
- }