@hiroleague/taskmanager 0.0.3 → 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 (62) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/index-BpzHnKdP.css +1 -0
  3. package/dist/assets/index-DmNErTAP.js +273 -0
  4. package/dist/index.html +2 -2
  5. package/package.json +1 -1
  6. package/skills/hiro-task-manager-cli/SKILL.md +6 -4
  7. package/skills/hiro-task-manager-cli/reference/cli-access-policy.md +1 -0
  8. package/skills/hiro-task-manager-cli/reference/releases.md +14 -0
  9. package/src/cli/commands/query.ts +56 -56
  10. package/src/cli/commands/releases.ts +22 -0
  11. package/src/cli/handlers/boards.test.ts +669 -669
  12. package/src/cli/handlers/cli-wiring.test.ts +38 -1
  13. package/src/cli/handlers/releases.ts +15 -0
  14. package/src/cli/handlers/search.test.ts +374 -374
  15. package/src/cli/handlers/search.ts +17 -17
  16. package/src/cli/lib/cli-http-errors.test.ts +85 -85
  17. package/src/cli/lib/write/releases.ts +64 -1
  18. package/src/cli/lib/write-result.test.ts +3 -0
  19. package/src/cli/lib/write-result.ts +3 -0
  20. package/src/cli/lib/writeCommands.breadth.test.ts +143 -0
  21. package/src/cli/lib/writeCommands.ts +1 -0
  22. package/src/cli/subprocess.real-stack.test.ts +625 -611
  23. package/src/cli/subprocess.smoke.test.ts +954 -954
  24. package/src/client/api/useBoardChangeStream.ts +421 -168
  25. package/src/client/api/useBoardIndexStream.ts +35 -0
  26. package/src/client/components/board/BoardStatsChips.tsx +233 -233
  27. package/src/client/components/board/BoardStatsContext.tsx +41 -41
  28. package/src/client/components/board/boardHeaderButtonStyles.ts +38 -38
  29. package/src/client/components/board/shortcuts/useBoardShortcutKeydown.ts +49 -49
  30. package/src/client/components/board/useBoardCanvasPanScroll.ts +108 -108
  31. package/src/client/components/board/useBoardTaskContainerDroppableReact.ts +33 -33
  32. package/src/client/components/board/useBoardTaskSortableReact.ts +26 -26
  33. package/src/client/components/layout/AppShell.tsx +5 -2
  34. package/src/client/components/layout/NotificationToasts.tsx +38 -1
  35. package/src/client/components/multi-select.tsx +1206 -1206
  36. package/src/client/components/routing/BoardPage.tsx +20 -20
  37. package/src/client/components/routing/NavigationRegistrar.tsx +13 -13
  38. package/src/client/components/task/TaskCard.tsx +643 -643
  39. package/src/client/components/ui/badge.tsx +49 -49
  40. package/src/client/components/ui/button.tsx +65 -65
  41. package/src/client/components/ui/command.tsx +193 -193
  42. package/src/client/components/ui/dialog.tsx +163 -163
  43. package/src/client/components/ui/input-group.tsx +155 -155
  44. package/src/client/components/ui/input.tsx +19 -19
  45. package/src/client/components/ui/popover.tsx +87 -87
  46. package/src/client/components/ui/separator.tsx +28 -28
  47. package/src/client/components/ui/textarea.tsx +18 -18
  48. package/src/client/index.css +248 -248
  49. package/src/client/lib/appNavigate.ts +16 -16
  50. package/src/client/lib/taskCardDate.ts +111 -111
  51. package/src/client/lib/utils.ts +6 -6
  52. package/src/client/store/notificationUi.ts +14 -0
  53. package/src/server/auth.ts +351 -351
  54. package/src/server/events.ts +31 -4
  55. package/src/server/migrations/registry.ts +43 -43
  56. package/src/server/notificationEvents.ts +8 -1
  57. package/src/server/routes/boards.ts +15 -1
  58. package/src/server/routes/trash.ts +6 -1
  59. package/src/shared/boardEvents.ts +6 -0
  60. package/src/shared/runtimeConfig.ts +256 -256
  61. package/dist/assets/index-hMFTu7sr.css +0 -1
  62. package/dist/assets/index-oKG1C41_.js +0 -273
@@ -1,249 +1,249 @@
1
- @import "tailwindcss";
2
- @import "tw-animate-css";
3
- @import "shadcn/tailwind.css";
4
- @import "@fontsource-variable/plus-jakarta-sans";
5
- @import "@fontsource/lora";
6
-
7
- @custom-variant dark (&:is(.dark *));
8
-
9
- @theme inline {
10
- --color-background: var(--background);
11
- --color-foreground: var(--foreground);
12
- --color-card: var(--card);
13
- --color-card-foreground: var(--card-foreground);
14
- --color-popover: var(--popover);
15
- --color-popover-foreground: var(--popover-foreground);
16
- --color-primary: var(--primary);
17
- --color-primary-foreground: var(--primary-foreground);
18
- --color-secondary: var(--secondary);
19
- --color-secondary-foreground: var(--secondary-foreground);
20
- --color-muted: var(--muted);
21
- --color-muted-foreground: var(--muted-foreground);
22
- --color-accent: var(--accent);
23
- --color-accent-foreground: var(--accent-foreground);
24
- --color-destructive: var(--destructive);
25
- --color-destructive-foreground: var(--destructive-foreground);
26
- --color-border: var(--border);
27
- --color-input: var(--input);
28
- --color-ring: var(--ring);
29
- --color-chart-1: var(--chart-1);
30
- --color-chart-2: var(--chart-2);
31
- --color-chart-3: var(--chart-3);
32
- --color-chart-4: var(--chart-4);
33
- --color-chart-5: var(--chart-5);
34
- --radius-sm: calc(var(--radius) * 0.6);
35
- --radius-md: calc(var(--radius) * 0.8);
36
- --radius-lg: var(--radius);
37
- --radius-xl: calc(var(--radius) * 1.4);
38
- --radius-2xl: calc(var(--radius) * 1.8);
39
- --radius-3xl: calc(var(--radius) * 2.2);
40
- --radius-4xl: calc(var(--radius) * 2.6);
41
- --color-sidebar: var(--sidebar);
42
- --color-sidebar-foreground: var(--sidebar-foreground);
43
- --color-sidebar-primary: var(--sidebar-primary);
44
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
45
- --color-sidebar-accent: var(--sidebar-accent);
46
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
47
- --color-sidebar-border: var(--sidebar-border);
48
- --color-sidebar-ring: var(--sidebar-ring);
49
- --color-header: var(--header);
50
- --color-header-border: var(--header-border);
51
- --color-board-canvas: var(--board-canvas);
52
- --color-list-column: var(--list-column);
53
- --color-task-card: var(--task-card);
54
- --color-task-card-foreground: var(--task-card-foreground);
55
- /* Swap typography roles so body uses Jakarta and headings use Lora. */
56
- --font-sans: 'Plus Jakarta Sans Variable', sans-serif;
57
- --font-heading: 'Lora', serif;
58
- }
59
-
60
- :root {
61
- --radius: 0.625rem;
62
- --background: oklch(1 0 0);
63
- --foreground: oklch(0.141 0.005 285.823);
64
- --card: oklch(0.9 0 0);
65
- --card-foreground: oklch(0.141 0.005 285.823);
66
- --popover: oklch(1 0 0);
67
- --popover-foreground: oklch(0.141 0.005 285.823);
68
- --primary: oklch(0.5 0.134 242.749);
69
- --primary-foreground: oklch(0.977 0.013 236.62);
70
- --secondary: oklch(0.967 0.001 286.375);
71
- --secondary-foreground: oklch(0.21 0.006 285.885);
72
- --muted: oklch(0.967 0.001 286.375);
73
- --muted-foreground: oklch(0.552 0.016 285.938);
74
- --accent: oklch(0.967 0.001 286.375);
75
- --accent-foreground: oklch(0.21 0.006 285.885);
76
- --destructive: oklch(0.577 0.245 27.325);
77
- --border: oklch(0.92 0.004 286.32);
78
- --input: oklch(0.92 0.004 286.32);
79
- --ring: oklch(0.705 0.015 286.067);
80
- --chart-1: oklch(0.871 0.006 286.286);
81
- --chart-2: oklch(0.552 0.016 285.938);
82
- --chart-3: oklch(0.442 0.017 285.786);
83
- --chart-4: oklch(0.37 0.013 285.805);
84
- --chart-5: oklch(0.274 0.006 286.033);
85
- --sidebar: oklch(0.985 0 0);
86
- --sidebar-foreground: oklch(0.141 0.005 285.823);
87
- --sidebar-primary: oklch(0.588 0.158 241.966);
88
- --sidebar-primary-foreground: oklch(0.977 0.013 236.62);
89
- --sidebar-accent: oklch(0.967 0.001 286.375);
90
- --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
91
- --sidebar-border: oklch(0.92 0.004 286.32);
92
- --sidebar-ring: oklch(0.705 0.015 286.067);
93
- --scrollbar-track: oklch(0.94 0 0);
94
- --scrollbar-thumb: oklch(0.72 0 0);
95
- --scrollbar-thumb-hover: oklch(0.62 0 0);
96
- --board-canvas: var(--background);
97
- /* Muted surface so list columns read against the board; task cards use --task-card */
98
- --list-column: var(--muted);
99
- --task-card: var(--card);
100
- --task-card-foreground: var(--card-foreground);
101
- --header: var(--background);
102
- --header-border: var(--border);
103
- }
104
-
105
- .dark {
106
- --background: oklch(0.141 0.005 285.823);
107
- --foreground: oklch(0.985 0 0);
108
- --card: oklch(0.21 0.006 285.885);
109
- --card-foreground: oklch(0.985 0 0);
110
- --popover: oklch(0.21 0.006 285.885);
111
- --popover-foreground: oklch(0.985 0 0);
112
- --primary: oklch(0.443 0.11 240.79);
113
- --primary-foreground: oklch(0.977 0.013 236.62);
114
- --secondary: oklch(0.274 0.006 286.033);
115
- --secondary-foreground: oklch(0.985 0 0);
116
- --muted: oklch(0.274 0.006 286.033);
117
- --muted-foreground: oklch(0.705 0.015 286.067);
118
- --accent: oklch(0.274 0.006 286.033);
119
- --accent-foreground: oklch(0.985 0 0);
120
- --destructive: oklch(0.704 0.191 22.216);
121
- --border: oklch(1 0 0 / 10%);
122
- --input: oklch(1 0 0 / 15%);
123
- --ring: oklch(0.552 0.016 285.938);
124
- --chart-1: oklch(0.871 0.006 286.286);
125
- --chart-2: oklch(0.552 0.016 285.938);
126
- --chart-3: oklch(0.442 0.017 285.786);
127
- --chart-4: oklch(0.37 0.013 285.805);
128
- --chart-5: oklch(0.274 0.006 286.033);
129
- /* Sidebar: cool charcoal (slightly blue) so it reads as “dark gray” vs. near-black header */
130
- --sidebar: oklch(0.21 0.006 285.885);
131
- --sidebar-foreground: oklch(0.985 0 0);
132
- --sidebar-primary: oklch(0.685 0.169 237.323);
133
- --sidebar-primary-foreground: oklch(0.293 0.066 243.157);
134
- --sidebar-accent: oklch(0.274 0.006 286.033);
135
- --sidebar-accent-foreground: oklch(0.985 0 0);
136
- --sidebar-border: oklch(1 0 0 / 10%);
137
- --sidebar-ring: oklch(0.552 0.016 285.938);
138
- /* Header strip: true dark; separates from sidebar + main canvas */
139
- --header: oklch(0.06 0.004 285);
140
- --header-border: oklch(1 0 0 / 11%);
141
- --scrollbar-track: oklch(0.2 0 0);
142
- --scrollbar-thumb: oklch(0.4 0 0);
143
- --scrollbar-thumb-hover: oklch(0.5 0 0);
144
- /* Between --background and --card; list columns match sidebar */
145
- --board-canvas: oklch(0.178 0.006 285.85);
146
- --list-column: var(--sidebar);
147
- /* Same C/H as --sidebar; only L is higher so cards read as one step above the list */
148
- --task-card: oklch(0.30 0.016 268);
149
- --task-card-foreground: oklch(0.985 0 0);
150
- }
151
-
152
- @layer base {
153
- * {
154
- @apply border-border outline-ring/50;
155
- scrollbar-width: thin;
156
- scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
157
- }
158
-
159
- *::-webkit-scrollbar {
160
- width: 10px;
161
- height: 10px;
162
- }
163
-
164
- *::-webkit-scrollbar-track {
165
- background: var(--scrollbar-track);
166
- }
167
-
168
- *::-webkit-scrollbar-thumb {
169
- background-color: var(--scrollbar-thumb);
170
- border-radius: 9999px;
171
- border: 2px solid transparent;
172
- background-clip: padding-box;
173
- }
174
-
175
- *::-webkit-scrollbar-thumb:hover {
176
- background-color: var(--scrollbar-thumb-hover);
177
- }
178
-
179
- body {
180
- @apply antialiased bg-background text-foreground;
181
- }
182
- html {
183
- @apply font-sans;
184
- }
185
- /* Apply the requested heading font globally without changing theme colors. */
186
- h1, h2, h3, h4, h5, h6 {
187
- @apply font-heading;
188
- }
189
- }
190
-
191
- @layer components {
192
- /* App header title: teal-first cool gradient (no orange); light uses darker stops for white bg */
193
- .app-title-gradient {
194
- /* Use background-image, not background: shorthand resets background-clip and breaks text clipping */
195
- background-image: linear-gradient(90deg, #0f766e 0%, #0e7490 42%, #0369a1 100%);
196
- -webkit-background-clip: text;
197
- background-clip: text;
198
- color: #0f766e;
199
- -webkit-text-fill-color: transparent;
200
- }
201
-
202
- .dark .app-title-gradient {
203
- background-image: linear-gradient(90deg, #2dd4bf 0%, #22d3ee 48%, #7dd3fc 100%);
204
- }
205
-
206
- /*
207
- * Board stats chips — waiting-to-load indicator.
208
- * Source / find later: https://css-loaders.com/dots/ (search repo: css-loaders.com/dots)
209
- * Namespaced class + keyframes to avoid colliding with a generic `.loader`.
210
- */
211
- .board-stats-dots-loader {
212
- width: 14px;
213
- aspect-ratio: 1;
214
- opacity: 0.85;
215
- color: inherit;
216
- --_g: no-repeat radial-gradient(farthest-side, currentColor 90%, transparent);
217
- background: var(--_g), var(--_g), var(--_g), var(--_g);
218
- background-size: 40% 40%;
219
- animation: board-stats-dots-l46 1s infinite;
220
- }
221
-
222
- @keyframes board-stats-dots-l46 {
223
- 0% {
224
- background-position: 0 0, 100% 0, 100% 100%, 0 100%;
225
- }
226
- 40%,
227
- 50% {
228
- background-position: 100% 100%, 100% 0, 0 0, 0 100%;
229
- }
230
- 90%,
231
- 100% {
232
- background-position: 100% 100%, 0 100%, 0 0, 100% 0;
233
- }
234
- }
235
-
236
- /*
237
- * Task MD editor (@uiw/react-md-editor): Tailwind Preflight sets ul/ol { list-style: none },
238
- * which removes bullets and numbers in the preview pane. Restore normal list styling here.
239
- * Checkbox task lines use .contains-task-list li.task-list-item { list-style: none } from the library.
240
- */
241
- .task-md-editor .w-md-editor-preview ul {
242
- list-style-type: disc;
243
- padding-inline-start: 1.5rem;
244
- }
245
- .task-md-editor .w-md-editor-preview ol {
246
- list-style-type: decimal;
247
- padding-inline-start: 1.5rem;
248
- }
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "shadcn/tailwind.css";
4
+ @import "@fontsource-variable/plus-jakarta-sans";
5
+ @import "@fontsource/lora";
6
+
7
+ @custom-variant dark (&:is(.dark *));
8
+
9
+ @theme inline {
10
+ --color-background: var(--background);
11
+ --color-foreground: var(--foreground);
12
+ --color-card: var(--card);
13
+ --color-card-foreground: var(--card-foreground);
14
+ --color-popover: var(--popover);
15
+ --color-popover-foreground: var(--popover-foreground);
16
+ --color-primary: var(--primary);
17
+ --color-primary-foreground: var(--primary-foreground);
18
+ --color-secondary: var(--secondary);
19
+ --color-secondary-foreground: var(--secondary-foreground);
20
+ --color-muted: var(--muted);
21
+ --color-muted-foreground: var(--muted-foreground);
22
+ --color-accent: var(--accent);
23
+ --color-accent-foreground: var(--accent-foreground);
24
+ --color-destructive: var(--destructive);
25
+ --color-destructive-foreground: var(--destructive-foreground);
26
+ --color-border: var(--border);
27
+ --color-input: var(--input);
28
+ --color-ring: var(--ring);
29
+ --color-chart-1: var(--chart-1);
30
+ --color-chart-2: var(--chart-2);
31
+ --color-chart-3: var(--chart-3);
32
+ --color-chart-4: var(--chart-4);
33
+ --color-chart-5: var(--chart-5);
34
+ --radius-sm: calc(var(--radius) * 0.6);
35
+ --radius-md: calc(var(--radius) * 0.8);
36
+ --radius-lg: var(--radius);
37
+ --radius-xl: calc(var(--radius) * 1.4);
38
+ --radius-2xl: calc(var(--radius) * 1.8);
39
+ --radius-3xl: calc(var(--radius) * 2.2);
40
+ --radius-4xl: calc(var(--radius) * 2.6);
41
+ --color-sidebar: var(--sidebar);
42
+ --color-sidebar-foreground: var(--sidebar-foreground);
43
+ --color-sidebar-primary: var(--sidebar-primary);
44
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
45
+ --color-sidebar-accent: var(--sidebar-accent);
46
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
47
+ --color-sidebar-border: var(--sidebar-border);
48
+ --color-sidebar-ring: var(--sidebar-ring);
49
+ --color-header: var(--header);
50
+ --color-header-border: var(--header-border);
51
+ --color-board-canvas: var(--board-canvas);
52
+ --color-list-column: var(--list-column);
53
+ --color-task-card: var(--task-card);
54
+ --color-task-card-foreground: var(--task-card-foreground);
55
+ /* Swap typography roles so body uses Jakarta and headings use Lora. */
56
+ --font-sans: 'Plus Jakarta Sans Variable', sans-serif;
57
+ --font-heading: 'Lora', serif;
58
+ }
59
+
60
+ :root {
61
+ --radius: 0.625rem;
62
+ --background: oklch(1 0 0);
63
+ --foreground: oklch(0.141 0.005 285.823);
64
+ --card: oklch(0.9 0 0);
65
+ --card-foreground: oklch(0.141 0.005 285.823);
66
+ --popover: oklch(1 0 0);
67
+ --popover-foreground: oklch(0.141 0.005 285.823);
68
+ --primary: oklch(0.5 0.134 242.749);
69
+ --primary-foreground: oklch(0.977 0.013 236.62);
70
+ --secondary: oklch(0.967 0.001 286.375);
71
+ --secondary-foreground: oklch(0.21 0.006 285.885);
72
+ --muted: oklch(0.967 0.001 286.375);
73
+ --muted-foreground: oklch(0.552 0.016 285.938);
74
+ --accent: oklch(0.967 0.001 286.375);
75
+ --accent-foreground: oklch(0.21 0.006 285.885);
76
+ --destructive: oklch(0.577 0.245 27.325);
77
+ --border: oklch(0.92 0.004 286.32);
78
+ --input: oklch(0.92 0.004 286.32);
79
+ --ring: oklch(0.705 0.015 286.067);
80
+ --chart-1: oklch(0.871 0.006 286.286);
81
+ --chart-2: oklch(0.552 0.016 285.938);
82
+ --chart-3: oklch(0.442 0.017 285.786);
83
+ --chart-4: oklch(0.37 0.013 285.805);
84
+ --chart-5: oklch(0.274 0.006 286.033);
85
+ --sidebar: oklch(0.985 0 0);
86
+ --sidebar-foreground: oklch(0.141 0.005 285.823);
87
+ --sidebar-primary: oklch(0.588 0.158 241.966);
88
+ --sidebar-primary-foreground: oklch(0.977 0.013 236.62);
89
+ --sidebar-accent: oklch(0.967 0.001 286.375);
90
+ --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
91
+ --sidebar-border: oklch(0.92 0.004 286.32);
92
+ --sidebar-ring: oklch(0.705 0.015 286.067);
93
+ --scrollbar-track: oklch(0.94 0 0);
94
+ --scrollbar-thumb: oklch(0.72 0 0);
95
+ --scrollbar-thumb-hover: oklch(0.62 0 0);
96
+ --board-canvas: var(--background);
97
+ /* Muted surface so list columns read against the board; task cards use --task-card */
98
+ --list-column: var(--muted);
99
+ --task-card: var(--card);
100
+ --task-card-foreground: var(--card-foreground);
101
+ --header: var(--background);
102
+ --header-border: var(--border);
103
+ }
104
+
105
+ .dark {
106
+ --background: oklch(0.141 0.005 285.823);
107
+ --foreground: oklch(0.985 0 0);
108
+ --card: oklch(0.21 0.006 285.885);
109
+ --card-foreground: oklch(0.985 0 0);
110
+ --popover: oklch(0.21 0.006 285.885);
111
+ --popover-foreground: oklch(0.985 0 0);
112
+ --primary: oklch(0.443 0.11 240.79);
113
+ --primary-foreground: oklch(0.977 0.013 236.62);
114
+ --secondary: oklch(0.274 0.006 286.033);
115
+ --secondary-foreground: oklch(0.985 0 0);
116
+ --muted: oklch(0.274 0.006 286.033);
117
+ --muted-foreground: oklch(0.705 0.015 286.067);
118
+ --accent: oklch(0.274 0.006 286.033);
119
+ --accent-foreground: oklch(0.985 0 0);
120
+ --destructive: oklch(0.704 0.191 22.216);
121
+ --border: oklch(1 0 0 / 10%);
122
+ --input: oklch(1 0 0 / 15%);
123
+ --ring: oklch(0.552 0.016 285.938);
124
+ --chart-1: oklch(0.871 0.006 286.286);
125
+ --chart-2: oklch(0.552 0.016 285.938);
126
+ --chart-3: oklch(0.442 0.017 285.786);
127
+ --chart-4: oklch(0.37 0.013 285.805);
128
+ --chart-5: oklch(0.274 0.006 286.033);
129
+ /* Sidebar: cool charcoal (slightly blue) so it reads as “dark gray” vs. near-black header */
130
+ --sidebar: oklch(0.21 0.006 285.885);
131
+ --sidebar-foreground: oklch(0.985 0 0);
132
+ --sidebar-primary: oklch(0.685 0.169 237.323);
133
+ --sidebar-primary-foreground: oklch(0.293 0.066 243.157);
134
+ --sidebar-accent: oklch(0.274 0.006 286.033);
135
+ --sidebar-accent-foreground: oklch(0.985 0 0);
136
+ --sidebar-border: oklch(1 0 0 / 10%);
137
+ --sidebar-ring: oklch(0.552 0.016 285.938);
138
+ /* Header strip: true dark; separates from sidebar + main canvas */
139
+ --header: oklch(0.06 0.004 285);
140
+ --header-border: oklch(1 0 0 / 11%);
141
+ --scrollbar-track: oklch(0.2 0 0);
142
+ --scrollbar-thumb: oklch(0.4 0 0);
143
+ --scrollbar-thumb-hover: oklch(0.5 0 0);
144
+ /* Between --background and --card; list columns match sidebar */
145
+ --board-canvas: oklch(0.178 0.006 285.85);
146
+ --list-column: var(--sidebar);
147
+ /* Same C/H as --sidebar; only L is higher so cards read as one step above the list */
148
+ --task-card: oklch(0.30 0.016 268);
149
+ --task-card-foreground: oklch(0.985 0 0);
150
+ }
151
+
152
+ @layer base {
153
+ * {
154
+ @apply border-border outline-ring/50;
155
+ scrollbar-width: thin;
156
+ scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
157
+ }
158
+
159
+ *::-webkit-scrollbar {
160
+ width: 10px;
161
+ height: 10px;
162
+ }
163
+
164
+ *::-webkit-scrollbar-track {
165
+ background: var(--scrollbar-track);
166
+ }
167
+
168
+ *::-webkit-scrollbar-thumb {
169
+ background-color: var(--scrollbar-thumb);
170
+ border-radius: 9999px;
171
+ border: 2px solid transparent;
172
+ background-clip: padding-box;
173
+ }
174
+
175
+ *::-webkit-scrollbar-thumb:hover {
176
+ background-color: var(--scrollbar-thumb-hover);
177
+ }
178
+
179
+ body {
180
+ @apply antialiased bg-background text-foreground;
181
+ }
182
+ html {
183
+ @apply font-sans;
184
+ }
185
+ /* Apply the requested heading font globally without changing theme colors. */
186
+ h1, h2, h3, h4, h5, h6 {
187
+ @apply font-heading;
188
+ }
189
+ }
190
+
191
+ @layer components {
192
+ /* App header title: teal-first cool gradient (no orange); light uses darker stops for white bg */
193
+ .app-title-gradient {
194
+ /* Use background-image, not background: shorthand resets background-clip and breaks text clipping */
195
+ background-image: linear-gradient(90deg, #0f766e 0%, #0e7490 42%, #0369a1 100%);
196
+ -webkit-background-clip: text;
197
+ background-clip: text;
198
+ color: #0f766e;
199
+ -webkit-text-fill-color: transparent;
200
+ }
201
+
202
+ .dark .app-title-gradient {
203
+ background-image: linear-gradient(90deg, #2dd4bf 0%, #22d3ee 48%, #7dd3fc 100%);
204
+ }
205
+
206
+ /*
207
+ * Board stats chips — waiting-to-load indicator.
208
+ * Source / find later: https://css-loaders.com/dots/ (search repo: css-loaders.com/dots)
209
+ * Namespaced class + keyframes to avoid colliding with a generic `.loader`.
210
+ */
211
+ .board-stats-dots-loader {
212
+ width: 14px;
213
+ aspect-ratio: 1;
214
+ opacity: 0.85;
215
+ color: inherit;
216
+ --_g: no-repeat radial-gradient(farthest-side, currentColor 90%, transparent);
217
+ background: var(--_g), var(--_g), var(--_g), var(--_g);
218
+ background-size: 40% 40%;
219
+ animation: board-stats-dots-l46 1s infinite;
220
+ }
221
+
222
+ @keyframes board-stats-dots-l46 {
223
+ 0% {
224
+ background-position: 0 0, 100% 0, 100% 100%, 0 100%;
225
+ }
226
+ 40%,
227
+ 50% {
228
+ background-position: 100% 100%, 100% 0, 0 0, 0 100%;
229
+ }
230
+ 90%,
231
+ 100% {
232
+ background-position: 100% 100%, 0 100%, 0 0, 100% 0;
233
+ }
234
+ }
235
+
236
+ /*
237
+ * Task MD editor (@uiw/react-md-editor): Tailwind Preflight sets ul/ol { list-style: none },
238
+ * which removes bullets and numbers in the preview pane. Restore normal list styling here.
239
+ * Checkbox task lines use .contains-task-list li.task-list-item { list-style: none } from the library.
240
+ */
241
+ .task-md-editor .w-md-editor-preview ul {
242
+ list-style-type: disc;
243
+ padding-inline-start: 1.5rem;
244
+ }
245
+ .task-md-editor .w-md-editor-preview ol {
246
+ list-style-type: decimal;
247
+ padding-inline-start: 1.5rem;
248
+ }
249
249
  }
@@ -1,16 +1,16 @@
1
- import type { NavigateFunction } from "react-router-dom";
2
-
3
- let impl: NavigateFunction | null = null;
4
-
5
- /** Called from a component under the router (e.g. once on mount). */
6
- export function registerAppNavigate(fn: NavigateFunction | null): void {
7
- impl = fn;
8
- }
9
-
10
- /** Imperative navigation for mutations and non-component code. */
11
- export function appNavigate(
12
- to: string,
13
- options?: { replace?: boolean },
14
- ): void {
15
- impl?.(to, { replace: options?.replace ?? false });
16
- }
1
+ import type { NavigateFunction } from "react-router-dom";
2
+
3
+ let impl: NavigateFunction | null = null;
4
+
5
+ /** Called from a component under the router (e.g. once on mount). */
6
+ export function registerAppNavigate(fn: NavigateFunction | null): void {
7
+ impl = fn;
8
+ }
9
+
10
+ /** Imperative navigation for mutations and non-component code. */
11
+ export function appNavigate(
12
+ to: string,
13
+ options?: { replace?: boolean },
14
+ ): void {
15
+ impl?.(to, { replace: options?.replace ?? false });
16
+ }