@leanspec/ui 0.2.13 → 0.2.15-dev.21022397862

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 (149) hide show
  1. package/bin/leanspec-ui.js +191 -0
  2. package/dist/assets/_baseUniq-CRqreL7N.js +1 -0
  3. package/dist/assets/arc-DMhx9AJT.js +1 -0
  4. package/dist/assets/architectureDiagram-VXUJARFQ-DM0L0YzO.js +36 -0
  5. package/dist/assets/blockDiagram-VD42YOAC-DHQXDHsD.js +122 -0
  6. package/dist/assets/c4Diagram-YG6GDRKO-0L7o2gpH.js +10 -0
  7. package/dist/assets/channel-2tOl0nAZ.js +1 -0
  8. package/dist/assets/chunk-4BX2VUAB-CwFT-Uaj.js +1 -0
  9. package/dist/assets/chunk-55IACEB6-CjvuUHHG.js +1 -0
  10. package/dist/assets/chunk-B4BG7PRW-BRJBysMK.js +165 -0
  11. package/dist/assets/chunk-DI55MBZ5-BnNEeoaA.js +220 -0
  12. package/dist/assets/chunk-FMBD7UC4-BK2l30pm.js +15 -0
  13. package/dist/assets/chunk-QN33PNHL-BN_cZkCU.js +1 -0
  14. package/dist/assets/chunk-QZHKN3VN-Brc3Yrub.js +1 -0
  15. package/dist/assets/chunk-TZMSLE5B-D2zzpLfO.js +1 -0
  16. package/dist/assets/classDiagram-2ON5EDUG-BB9CSNmS.js +1 -0
  17. package/dist/assets/classDiagram-v2-WZHVMYZB-BB9CSNmS.js +1 -0
  18. package/dist/assets/clone-BjxVFtyI.js +1 -0
  19. package/dist/assets/core-DV6XEvTN.js +1 -0
  20. package/dist/assets/cose-bilkent-S5V4N54A-CLJgM3XR.js +1 -0
  21. package/dist/assets/cytoscape.esm-5J0xJHOV.js +321 -0
  22. package/dist/assets/dagre-6UL2VRFP-_IFvBJKJ.js +4 -0
  23. package/dist/assets/diagram-PSM6KHXK--83HIYSQ.js +24 -0
  24. package/dist/assets/diagram-QEK2KX5R-6jAWnCnZ.js +43 -0
  25. package/dist/assets/diagram-S2PKOQOG-D5pwHvjZ.js +24 -0
  26. package/dist/assets/erDiagram-Q2GNP2WA-B4FV3mTd.js +60 -0
  27. package/dist/assets/flowDiagram-NV44I4VS-mtD2kF4M.js +162 -0
  28. package/dist/assets/ganttDiagram-JELNMOA3-BKALgqTK.js +267 -0
  29. package/dist/assets/gitGraphDiagram-NY62KEGX-Bd7r0pAf.js +65 -0
  30. package/dist/assets/graph-B2rEI7cK.js +1 -0
  31. package/dist/assets/index-Bekv_o1t.css +1 -0
  32. package/dist/assets/index-DSRxU-E5.js +389 -0
  33. package/dist/assets/infoDiagram-WHAUD3N6--nJOBKqh.js +2 -0
  34. package/dist/assets/journeyDiagram-XKPGCS4Q-BzGutKN3.js +139 -0
  35. package/dist/assets/kanban-definition-3W4ZIXB7-DyQO17vq.js +89 -0
  36. package/dist/assets/katex-XbL3y5x-.js +261 -0
  37. package/dist/assets/layout-iCSHU015.js +1 -0
  38. package/dist/assets/min-BK_AIJdo.js +1 -0
  39. package/dist/assets/mindmap-definition-VGOIOE7T-BZMj_6zo.js +68 -0
  40. package/dist/assets/pieDiagram-ADFJNKIX-CkAGsq9p.js +30 -0
  41. package/dist/assets/quadrantDiagram-AYHSOK5B-CWa93px1.js +7 -0
  42. package/dist/assets/requirementDiagram-UZGBJVZJ-CufFVR8c.js +64 -0
  43. package/dist/assets/sankeyDiagram-TZEHDZUN-BEPgVgU4.js +10 -0
  44. package/dist/assets/sequenceDiagram-WL72ISMW-BkdBWhel.js +145 -0
  45. package/dist/assets/stateDiagram-FKZM4ZOC-D5T73yx0.js +1 -0
  46. package/dist/assets/stateDiagram-v2-4FDKWEC3-9hJWG2n6.js +1 -0
  47. package/dist/assets/timeline-definition-IT6M3QCI-CX7kTdU2.js +61 -0
  48. package/dist/assets/treemap-KMMF4GRG-ftWCQ9lJ.js +128 -0
  49. package/dist/assets/xychartDiagram-PRI3JC2R-Ngrels4n.js +7 -0
  50. package/{index.html → dist/index.html} +2 -1
  51. package/package.json +13 -3
  52. package/eslint.config.js +0 -23
  53. package/postcss.config.js +0 -6
  54. package/src/App.css +0 -42
  55. package/src/App.tsx +0 -17
  56. package/src/assets/react.svg +0 -1
  57. package/src/components/LanguageSwitcher.tsx +0 -67
  58. package/src/components/Layout.tsx +0 -88
  59. package/src/components/MainSidebar.tsx +0 -163
  60. package/src/components/MermaidDiagram.tsx +0 -85
  61. package/src/components/MinimalLayout.tsx +0 -51
  62. package/src/components/Navigation.tsx +0 -254
  63. package/src/components/PriorityBadge.tsx +0 -59
  64. package/src/components/ProjectSwitcher.tsx +0 -222
  65. package/src/components/QuickSearch.tsx +0 -225
  66. package/src/components/RootRedirect.tsx +0 -40
  67. package/src/components/SpecDetailLayout.context.ts +0 -10
  68. package/src/components/SpecDetailLayout.tsx +0 -14
  69. package/src/components/SpecsNavSidebar.tsx +0 -615
  70. package/src/components/StatusBadge.tsx +0 -59
  71. package/src/components/ThemeToggle.tsx +0 -25
  72. package/src/components/Tooltip.tsx +0 -29
  73. package/src/components/context/ContextClient.tsx +0 -471
  74. package/src/components/context/ContextFileDetail.tsx +0 -163
  75. package/src/components/dashboard/ActivityItem.tsx +0 -36
  76. package/src/components/dashboard/DashboardClient.tsx +0 -218
  77. package/src/components/dashboard/SpecListItem.tsx +0 -58
  78. package/src/components/dashboard/StatCard.tsx +0 -52
  79. package/src/components/dependencies/SpecNode.tsx +0 -128
  80. package/src/components/dependencies/SpecSidebar.tsx +0 -256
  81. package/src/components/dependencies/constants.ts +0 -25
  82. package/src/components/dependencies/types.ts +0 -38
  83. package/src/components/dependencies/utils.ts +0 -261
  84. package/src/components/metadata-editors/PriorityEditor.tsx +0 -89
  85. package/src/components/metadata-editors/StatusEditor.tsx +0 -85
  86. package/src/components/metadata-editors/TagsEditor.tsx +0 -207
  87. package/src/components/projects/CreateProjectDialog.tsx +0 -162
  88. package/src/components/projects/DirectoryPicker.tsx +0 -182
  89. package/src/components/shared/BackToTop.tsx +0 -39
  90. package/src/components/shared/ColorPicker.tsx +0 -68
  91. package/src/components/shared/EmptyState.tsx +0 -35
  92. package/src/components/shared/ErrorBoundary.tsx +0 -79
  93. package/src/components/shared/PageHeader.tsx +0 -23
  94. package/src/components/shared/PageTransition.tsx +0 -40
  95. package/src/components/shared/ProjectAvatar.tsx +0 -107
  96. package/src/components/shared/Skeletons.tsx +0 -184
  97. package/src/components/spec-detail/EditableMetadata.tsx +0 -129
  98. package/src/components/spec-detail/MarkdownRenderer.tsx +0 -47
  99. package/src/components/spec-detail/TableOfContents.tsx +0 -150
  100. package/src/components/specs/BoardView.tsx +0 -204
  101. package/src/components/specs/ListView.tsx +0 -62
  102. package/src/components/specs/SpecsFilters.tsx +0 -190
  103. package/src/contexts/KeyboardShortcutsContext.tsx +0 -95
  104. package/src/contexts/LayoutContext.tsx +0 -45
  105. package/src/contexts/ProjectContext.tsx +0 -163
  106. package/src/contexts/ThemeContext.tsx +0 -90
  107. package/src/contexts/index.ts +0 -7
  108. package/src/hooks/useKeyboardShortcuts.ts +0 -87
  109. package/src/index.css +0 -624
  110. package/src/lib/api.ts +0 -72
  111. package/src/lib/backend-adapter.ts +0 -382
  112. package/src/lib/date-utils.ts +0 -122
  113. package/src/lib/i18n.test.ts +0 -57
  114. package/src/lib/i18n.ts +0 -51
  115. package/src/lib/markdown-utils.ts +0 -38
  116. package/src/lib/sub-spec-utils.ts +0 -166
  117. package/src/lib/utils.ts +0 -6
  118. package/src/locales/en/common.json +0 -660
  119. package/src/locales/en/errors.json +0 -20
  120. package/src/locales/en/help.json +0 -8
  121. package/src/locales/zh-CN/common.json +0 -660
  122. package/src/locales/zh-CN/errors.json +0 -20
  123. package/src/locales/zh-CN/help.json +0 -8
  124. package/src/main.tsx +0 -12
  125. package/src/pages/ContextPage.tsx +0 -111
  126. package/src/pages/DashboardPage.tsx +0 -97
  127. package/src/pages/DependenciesPage.tsx +0 -881
  128. package/src/pages/ProjectsPage.tsx +0 -432
  129. package/src/pages/SpecDetailPage.tsx +0 -592
  130. package/src/pages/SpecsPage.tsx +0 -319
  131. package/src/pages/StatsPage.tsx +0 -307
  132. package/src/router/projectRoutes.tsx +0 -36
  133. package/src/router.tsx +0 -33
  134. package/src/test/setup.ts +0 -39
  135. package/src/types/api.ts +0 -185
  136. package/tailwind.config.ts +0 -57
  137. package/tsconfig.app.json +0 -29
  138. package/tsconfig.json +0 -7
  139. package/tsconfig.node.json +0 -26
  140. package/tsconfig.tsbuildinfo +0 -1
  141. package/vite.config.ts +0 -27
  142. package/vitest.config.ts +0 -18
  143. /package/{public → dist}/favicon.ico +0 -0
  144. /package/{public → dist}/github-mark-white.svg +0 -0
  145. /package/{public → dist}/github-mark.svg +0 -0
  146. /package/{public → dist}/logo-dark-bg.svg +0 -0
  147. /package/{public → dist}/logo-with-bg.svg +0 -0
  148. /package/{public → dist}/logo.svg +0 -0
  149. /package/{public → dist}/vite.svg +0 -0
package/src/index.css DELETED
@@ -1,624 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- @layer base {
6
- :root {
7
- --background: 0 0% 100%;
8
- --foreground: 222.2 84% 4.9%;
9
- --card: 0 0% 100%;
10
- --card-foreground: 222.2 84% 4.9%;
11
- --popover: 0 0% 100%;
12
- --popover-foreground: 222.2 84% 4.9%;
13
- --primary: 221.2 83.2% 53.3%;
14
- --primary-foreground: 210 40% 98%;
15
- --secondary: 210 40% 96.1%;
16
- --secondary-foreground: 222.2 47.4% 11.2%;
17
- --muted: 210 40% 96.1%;
18
- --muted-foreground: 215.4 16.3% 46.9%;
19
- --accent: 210 40% 96.1%;
20
- --accent-foreground: 222.2 47.4% 11.2%;
21
- --destructive: 0 84.2% 60.2%;
22
- --destructive-foreground: 210 40% 98%;
23
- --border: 214.3 31.8% 91.4%;
24
- --input: 214.3 31.8% 91.4%;
25
- --ring: 221.2 83.2% 53.3%;
26
- --radius: 0.5rem;
27
- }
28
-
29
- .dark {
30
- --background: 222.2 84% 4.9%;
31
- --foreground: 210 40% 98%;
32
- --card: 222.2 84% 4.9%;
33
- --card-foreground: 210 40% 98%;
34
- --popover: 222.2 84% 4.9%;
35
- --popover-foreground: 210 40% 98%;
36
- --primary: 217.2 91.2% 59.8%;
37
- --primary-foreground: 222.2 47.4% 11.2%;
38
- --secondary: 217.2 32.6% 17.5%;
39
- --secondary-foreground: 210 40% 98%;
40
- --muted: 217.2 32.6% 17.5%;
41
- --muted-foreground: 215 20.2% 65.1%;
42
- --accent: 217.2 32.6% 17.5%;
43
- --accent-foreground: 210 40% 98%;
44
- --destructive: 0 62.8% 30.6%;
45
- --destructive-foreground: 210 40% 98%;
46
- --border: 217.2 32.6% 17.5%;
47
- --input: 217.2 32.6% 17.5%;
48
- --ring: 224.3 76.3% 48%;
49
- }
50
-
51
- /* Override Tailwind's default border color to use theme variable */
52
- * {
53
- border-color: hsl(var(--border));
54
- }
55
- }
56
-
57
- body {
58
- font-family: system-ui, -apple-system, sans-serif;
59
- @apply bg-background text-foreground antialiased;
60
- }
61
-
62
- /* Smooth transitions */
63
- * {
64
- @apply transition-colors duration-150 ease-in-out;
65
- }
66
-
67
- /* Remove transition from transform for better performance */
68
- *:where([class*="transform"], [class*="scale"], [class*="translate"]) {
69
- @apply transition-all duration-150 ease-in-out;
70
- }
71
-
72
- /* Disable transitions for theme changes to prevent flash */
73
- html.changing-theme * {
74
- transition: none !important;
75
- }
76
-
77
- /* Syntax highlighting - VS Code inspired theme */
78
- .hljs {
79
- background: hsl(220 13% 96%);
80
- color: hsl(220 14% 10%);
81
- padding: 0;
82
- border-radius: 0.5rem;
83
- overflow-x: auto;
84
- font-size: 0.875rem;
85
- line-height: 1.7;
86
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
87
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
88
- border: 1px solid hsl(220 13% 91%);
89
- }
90
-
91
- .hljs-comment,
92
- .hljs-quote {
93
- color: hsl(220 10% 40%);
94
- font-style: italic;
95
- }
96
-
97
- .hljs-keyword,
98
- .hljs-selector-tag,
99
- .hljs-subst {
100
- color: hsl(286 60% 50%);
101
- font-weight: 600;
102
- }
103
-
104
- .hljs-number,
105
- .hljs-literal,
106
- .hljs-variable,
107
- .hljs-template-variable,
108
- .hljs-tag .hljs-attr {
109
- color: hsl(207 82% 45%);
110
- }
111
-
112
- .hljs-string,
113
- .hljs-doctag {
114
- color: hsl(95 38% 40%);
115
- }
116
-
117
- .hljs-title,
118
- .hljs-section,
119
- .hljs-selector-id {
120
- color: hsl(29 54% 45%);
121
- font-weight: 600;
122
- }
123
-
124
- .hljs-type,
125
- .hljs-class .hljs-title {
126
- color: hsl(39 67% 50%);
127
- }
128
-
129
- .hljs-tag,
130
- .hljs-name,
131
- .hljs-attribute {
132
- color: hsl(355 65% 55%);
133
- font-weight: normal;
134
- }
135
-
136
- .hljs-regexp,
137
- .hljs-link {
138
- color: hsl(187 47% 45%);
139
- }
140
-
141
- .hljs-symbol,
142
- .hljs-bullet {
143
- color: hsl(41 53% 50%);
144
- }
145
-
146
- .hljs-built_in,
147
- .hljs-builtin-name {
148
- color: hsl(187 47% 45%);
149
- }
150
-
151
- .hljs-meta {
152
- color: hsl(220 14% 40%);
153
- }
154
-
155
- .hljs-deletion {
156
- background: hsl(0 100% 90%);
157
- color: hsl(0 100% 30%);
158
- }
159
-
160
- .hljs-addition {
161
- background: hsl(120 100% 90%);
162
- color: hsl(120 100% 25%);
163
- }
164
-
165
- .hljs-emphasis {
166
- font-style: italic;
167
- }
168
-
169
- .hljs-strong {
170
- font-weight: 700;
171
- }
172
-
173
- /* Syntax highlighting - Dark mode */
174
- .dark .hljs {
175
- background: hsl(220 13% 14%);
176
- color: hsl(220 14% 96%);
177
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.3);
178
- border-color: hsl(220 13% 20%);
179
- }
180
-
181
- .dark .hljs-comment,
182
- .dark .hljs-quote {
183
- color: hsl(220 10% 45%);
184
- }
185
-
186
- .dark .hljs-keyword,
187
- .dark .hljs-selector-tag,
188
- .dark .hljs-subst {
189
- color: hsl(286 60% 72%);
190
- }
191
-
192
- .dark .hljs-number,
193
- .dark .hljs-literal,
194
- .dark .hljs-variable,
195
- .dark .hljs-template-variable,
196
- .dark .hljs-tag .hljs-attr {
197
- color: hsl(207 82% 71%);
198
- }
199
-
200
- .dark .hljs-string,
201
- .dark .hljs-doctag {
202
- color: hsl(95 38% 67%);
203
- }
204
-
205
- .dark .hljs-title,
206
- .dark .hljs-section,
207
- .dark .hljs-selector-id {
208
- color: hsl(29 54% 66%);
209
- }
210
-
211
- .dark .hljs-type,
212
- .dark .hljs-class .hljs-title {
213
- color: hsl(39 67% 74%);
214
- }
215
-
216
- .dark .hljs-tag,
217
- .dark .hljs-name,
218
- .dark .hljs-attribute {
219
- color: hsl(355 65% 70%);
220
- }
221
-
222
- .dark .hljs-regexp,
223
- .dark .hljs-link {
224
- color: hsl(187 47% 60%);
225
- }
226
-
227
- .dark .hljs-symbol,
228
- .dark .hljs-bullet {
229
- color: hsl(41 53% 72%);
230
- }
231
-
232
- .dark .hljs-built_in,
233
- .dark .hljs-builtin-name {
234
- color: hsl(187 47% 60%);
235
- }
236
-
237
- .dark .hljs-meta {
238
- color: hsl(220 14% 76%);
239
- }
240
-
241
- .dark .hljs-deletion {
242
- background: hsl(0 100% 25%);
243
- color: hsl(0 100% 90%);
244
- }
245
-
246
- .dark .hljs-addition {
247
- background: hsl(120 100% 25%);
248
- color: hsl(120 100% 90%);
249
- }
250
-
251
- /* Prose styling for markdown content */
252
- .prose {
253
- max-width: none;
254
- color: hsl(222.2 84% 4.9%);
255
- font-size: 1rem;
256
- line-height: 1.75;
257
- }
258
-
259
- /* Mobile-specific prose adjustments */
260
- @media (max-width: 640px) {
261
- .prose {
262
- font-size: 0.9375rem;
263
- line-height: 1.65;
264
- }
265
-
266
- .prose h1 {
267
- font-size: 1.75em;
268
- }
269
-
270
- .prose h2 {
271
- font-size: 1.5em;
272
- }
273
-
274
- .prose h3 {
275
- font-size: 1.25em;
276
- }
277
-
278
- .prose h4 {
279
- font-size: 1.125em;
280
- }
281
-
282
- .prose pre {
283
- margin-left: -0.75rem;
284
- margin-right: -0.75rem;
285
- border-radius: 0;
286
- }
287
-
288
- .prose table {
289
- display: block;
290
- overflow-x: auto;
291
- -webkit-overflow-scrolling: touch;
292
- }
293
- }
294
-
295
- .prose h1,
296
- .prose h2,
297
- .prose h3,
298
- .prose h4,
299
- .prose h5,
300
- .prose h6 {
301
- font-weight: 600;
302
- line-height: 1.25;
303
- margin-top: 1.5em;
304
- margin-bottom: 0.5em;
305
- color: hsl(222.2 84% 4.9%);
306
- scroll-margin-top: 5rem;
307
- }
308
-
309
- .prose h1 {
310
- font-size: 2em;
311
- margin-top: 0;
312
- border-bottom: 1px solid hsl(214.3 31.8% 91.4%);
313
- padding-bottom: 0.25em;
314
- }
315
-
316
- .prose h2 {
317
- font-size: 1.65em;
318
- border-bottom: 1px solid hsl(214.3 31.8% 91.4%);
319
- padding-bottom: 0.25em;
320
- }
321
-
322
- .prose h3 {
323
- font-size: 1.35em;
324
- }
325
-
326
- .prose h4 {
327
- font-size: 1.15em;
328
- }
329
-
330
- .prose h5 {
331
- font-size: 1.05em;
332
- }
333
-
334
- .prose h6 {
335
- font-size: 1em;
336
- }
337
-
338
- .prose p {
339
- margin-top: 1em;
340
- margin-bottom: 1em;
341
- line-height: 1.7;
342
- }
343
-
344
- .prose a {
345
- color: hsl(221 83% 53%);
346
- text-decoration: underline;
347
- text-decoration-color: hsl(221 83% 53% / 0.3);
348
- transition: all 0.2s;
349
- }
350
-
351
- .prose a:hover {
352
- text-decoration-color: hsl(221 83% 53%);
353
- color: hsl(221 83% 43%);
354
- }
355
-
356
- .prose :not(pre)>code {
357
- background: hsl(220 13% 95%);
358
- color: hsl(355 65% 45%);
359
- padding: 0.2em 0.4em;
360
- border-radius: 0.25rem;
361
- font-size: 0.875em;
362
- font-weight: 600;
363
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
364
- border: 1px solid hsl(220 13% 88%);
365
- }
366
-
367
- .prose pre {
368
- margin: 1.25em 0;
369
- overflow-x: auto;
370
- border-radius: 0.5rem;
371
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
372
- border: 1px solid hsl(220 13% 91%);
373
- }
374
-
375
- .prose pre code {
376
- background: transparent !important;
377
- border-radius: 0 !important;
378
- border: none !important;
379
- font-size: 0.875em;
380
- line-height: 1.7;
381
- color: inherit;
382
- font-weight: 400;
383
- display: block;
384
- }
385
-
386
- .prose ul,
387
- .prose ol {
388
- margin-top: 0.75em;
389
- margin-bottom: 0.75em;
390
- padding-left: 1.625em;
391
- }
392
-
393
- .prose li {
394
- margin-top: 0.5em;
395
- margin-bottom: 0.5em;
396
- }
397
-
398
- .prose blockquote {
399
- border-left: 4px solid hsl(221 83% 53%);
400
- padding-left: 1em;
401
- padding-top: 0.25em;
402
- padding-bottom: 0.25em;
403
- margin: 1em 0;
404
- background: hsl(210 40% 98%);
405
- border-radius: 0 0.25rem 0.25rem 0;
406
- color: hsl(215.4 16.3% 36.9%);
407
- }
408
-
409
- .prose blockquote p {
410
- margin: 0.5em 0;
411
- }
412
-
413
- .prose table {
414
- width: 100%;
415
- border-collapse: collapse;
416
- margin: 1.5em 0;
417
- }
418
-
419
- .prose th,
420
- .prose td {
421
- border: 1px solid hsl(214.3 31.8% 91.4%);
422
- padding: 0.5em 1em;
423
- text-align: left;
424
- }
425
-
426
- .prose th {
427
- background: hsl(var(--muted));
428
- font-weight: 600;
429
- color: hsl(var(--muted-foreground));
430
- }
431
-
432
- .prose hr {
433
- border: none;
434
- border-top: 1px solid hsl(214.3 31.8% 91.4%);
435
- margin: 2em 0;
436
- }
437
-
438
- .prose img {
439
- max-width: 100%;
440
- height: auto;
441
- border-radius: 0.5rem;
442
- margin: 1.5em 0;
443
- }
444
-
445
- .prose strong,
446
- .prose b {
447
- font-weight: 600;
448
- color: hsl(222.2 84% 4.9%);
449
- }
450
-
451
- /* Dark mode prose styling */
452
- .dark .prose {
453
- color: hsl(210 40% 98%);
454
- }
455
-
456
- .dark .prose strong,
457
- .dark .prose b {
458
- font-weight: 600;
459
- color: hsl(210 40% 98%);
460
- }
461
-
462
- .dark .prose h1,
463
- .dark .prose h2,
464
- .dark .prose h3,
465
- .dark .prose h4,
466
- .dark .prose h5,
467
- .dark .prose h6 {
468
- color: hsl(210 40% 98%);
469
- }
470
-
471
- .dark .prose h1,
472
- .dark .prose h2 {
473
- border-bottom-color: hsl(217.2 32.6% 17.5%);
474
- }
475
-
476
- .dark .prose a {
477
- color: hsl(217 91% 70%);
478
- text-decoration-color: hsl(217 91% 70% / 0.3);
479
- }
480
-
481
- .dark .prose a:hover {
482
- text-decoration-color: hsl(217 91% 70%);
483
- color: hsl(217 91% 80%);
484
- }
485
-
486
- .dark .prose :not(pre)>code {
487
- background: hsl(220 13% 18%);
488
- color: hsl(355 65% 70%);
489
- border-color: hsl(220 13% 25%);
490
- font-weight: 600;
491
- }
492
-
493
- .dark .prose pre {
494
- border-color: hsl(220 13% 20%);
495
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.3), 0 2px 4px -2px rgb(0 0 0 / 0.3);
496
- }
497
-
498
- .dark .prose blockquote {
499
- border-left-color: hsl(217 91% 70%);
500
- background: hsl(217.2 32.6% 12%);
501
- color: hsl(215 20% 75%);
502
- }
503
-
504
- .dark .prose th,
505
- .dark .prose td {
506
- border-color: hsl(217.2 32.6% 17.5%);
507
- }
508
-
509
- .dark .prose th {
510
- background: hsl(var(--muted));
511
- color: hsl(var(--muted-foreground));
512
- }
513
-
514
- .dark .prose hr {
515
- border-top-color: hsl(217.2 32.6% 17.5%);
516
- }
517
-
518
- /* Custom scrollbar styles */
519
- @layer utilities {
520
- .scrollbar-thin {
521
- scrollbar-width: thin;
522
- }
523
-
524
- .scrollbar-thumb-muted-foreground\/20::-webkit-scrollbar-thumb {
525
- background-color: hsl(var(--muted-foreground) / 0.2);
526
- }
527
-
528
- .scrollbar-thumb-muted-foreground\/40::-webkit-scrollbar-thumb {
529
- background-color: hsl(var(--muted-foreground) / 0.4);
530
- }
531
-
532
- .scrollbar-track-transparent::-webkit-scrollbar-track {
533
- background-color: transparent;
534
- }
535
-
536
- .hover\:scrollbar-thumb-muted-foreground\/40:hover::-webkit-scrollbar-thumb {
537
- background-color: hsl(var(--muted-foreground) / 0.4);
538
- }
539
-
540
- ::-webkit-scrollbar {
541
- width: 8px;
542
- height: 8px;
543
- }
544
-
545
- ::-webkit-scrollbar-track {
546
- background: transparent;
547
- }
548
-
549
- ::-webkit-scrollbar-thumb {
550
- background-color: hsl(var(--muted-foreground) / 0.2);
551
- border-radius: 4px;
552
- }
553
-
554
- ::-webkit-scrollbar-thumb:hover {
555
- background-color: hsl(var(--muted-foreground) / 0.4);
556
- }
557
-
558
- /* Prevent horizontal scrolling where needed */
559
- .overflow-x-hidden {
560
- overflow-x: hidden !important;
561
- }
562
-
563
- /* Vertical text for collapsed columns (ADO-style) */
564
- .writing-mode-vertical-rl {
565
- writing-mode: vertical-rl;
566
- }
567
-
568
- .vertical-text {
569
- writing-mode: vertical-rl;
570
- transform: rotate(180deg);
571
- }
572
-
573
- /* Auto-hiding scrollbar - visible only on hover */
574
- .scrollbar-auto-hide {
575
- scrollbar-width: thin;
576
- scrollbar-color: transparent transparent;
577
- }
578
-
579
- .scrollbar-auto-hide:hover {
580
- scrollbar-color: hsl(var(--muted-foreground) / 0.3) transparent;
581
- }
582
-
583
- .scrollbar-auto-hide::-webkit-scrollbar {
584
- width: 4px;
585
- }
586
-
587
- .scrollbar-auto-hide::-webkit-scrollbar-track {
588
- background: transparent;
589
- }
590
-
591
- .scrollbar-auto-hide::-webkit-scrollbar-thumb {
592
- background-color: transparent;
593
- border-radius: 20px;
594
- }
595
-
596
- .scrollbar-auto-hide:hover::-webkit-scrollbar-thumb {
597
- background-color: hsl(var(--muted-foreground) / 0.3);
598
- }
599
-
600
- /* Touch-friendly interactions */
601
- .touch-manipulation {
602
- touch-action: manipulation;
603
- -webkit-tap-highlight-color: transparent;
604
- }
605
-
606
- /* Smooth scrolling with momentum on mobile */
607
- .scroll-smooth-mobile {
608
- -webkit-overflow-scrolling: touch;
609
- scroll-behavior: smooth;
610
- }
611
-
612
- /* Snap scrolling for horizontal board view */
613
- .snap-x {
614
- scroll-snap-type: x mandatory;
615
- }
616
-
617
- .snap-start {
618
- scroll-snap-align: start;
619
- }
620
-
621
- .snap-mandatory {
622
- scroll-snap-type: x mandatory;
623
- }
624
- }
package/src/lib/api.ts DELETED
@@ -1,72 +0,0 @@
1
- import { getBackend, APIError, type BackendAdapter } from "./backend-adapter";
2
- import i18n from "./i18n";
3
- import type { ListParams, Spec, SpecDetail, Stats, DependencyGraph } from "../types/api";
4
-
5
- /**
6
- * Project-aware API wrapper
7
- * Automatically injects currentProjectId from context into backend adapter calls
8
- */
9
- class ProjectAPI {
10
- private backend: BackendAdapter;
11
- private _currentProjectId: string | null = null;
12
-
13
- constructor() {
14
- this.backend = getBackend();
15
- }
16
-
17
- setCurrentProjectId(projectId: string | null) {
18
- this._currentProjectId = projectId;
19
- }
20
-
21
- getCurrentProjectId(): string {
22
- if (!this._currentProjectId) {
23
- throw new Error(i18n.t('projects.errors.noProjectSelected', { ns: 'common' }));
24
- }
25
- return this._currentProjectId;
26
- }
27
-
28
- // Pass-through methods that don't need projectId
29
- getProjects = () => this.backend.getProjects();
30
- createProject = (path: string, options?: { favorite?: boolean; color?: string; name?: string; description?: string | null }) =>
31
- this.backend.createProject(path, options);
32
- updateProject = (projectId: string, updates: Parameters<BackendAdapter['updateProject']>[1]) =>
33
- this.backend.updateProject(projectId, updates);
34
- deleteProject = (projectId: string) => this.backend.deleteProject(projectId);
35
- validateProject = (projectId: string) => this.backend.validateProject(projectId);
36
- listDirectory = (path?: string) => this.backend.listDirectory(path);
37
- getContextFiles = () => this.backend.getContextFiles();
38
- getContextFile = (path: string) => this.backend.getContextFile(path);
39
-
40
- // Project-scoped methods that automatically inject currentProjectId
41
- async getProjectContext(): Promise<import('../types/api').ProjectContext> {
42
- return this.backend.getProjectContext(this.getCurrentProjectId());
43
- }
44
-
45
- async getSpecs(params?: ListParams): Promise<Spec[]> {
46
- return this.backend.getSpecs(this.getCurrentProjectId(), params);
47
- }
48
-
49
- async getSpec(specName: string): Promise<SpecDetail> {
50
- return this.backend.getSpec(this.getCurrentProjectId(), specName);
51
- }
52
-
53
- async updateSpec(specName: string, updates: Partial<Pick<Spec, 'status' | 'priority' | 'tags'>>): Promise<void> {
54
- return this.backend.updateSpec(this.getCurrentProjectId(), specName, updates);
55
- }
56
-
57
- async getStats(): Promise<Stats> {
58
- return this.backend.getStats(this.getCurrentProjectId());
59
- }
60
-
61
- async getProjectStats(projectId: string): Promise<Stats> {
62
- return this.backend.getProjectStats(projectId);
63
- }
64
-
65
- async getDependencies(specName?: string): Promise<DependencyGraph> {
66
- return this.backend.getDependencies(this.getCurrentProjectId(), specName);
67
- }
68
- }
69
-
70
- export const api = new ProjectAPI();
71
-
72
- export { APIError };