devglide 0.1.1

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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +338 -0
  3. package/bin/claude-md-template.js +94 -0
  4. package/bin/devglide.js +387 -0
  5. package/package.json +85 -0
  6. package/pnpm-workspace.yaml +3 -0
  7. package/src/apps/coder/.turbo/turbo-lint.log +5 -0
  8. package/src/apps/coder/package.json +16 -0
  9. package/src/apps/coder/public/favicon.svg +7 -0
  10. package/src/apps/coder/public/page.css +275 -0
  11. package/src/apps/coder/public/page.js +528 -0
  12. package/src/apps/coder/server.js +3 -0
  13. package/src/apps/documentation/public/page.css +597 -0
  14. package/src/apps/documentation/public/page.js +609 -0
  15. package/src/apps/kanban/.turbo/turbo-lint.log +97 -0
  16. package/src/apps/kanban/.turbo/turbo-typecheck.log +5 -0
  17. package/src/apps/kanban/package.json +32 -0
  18. package/src/apps/kanban/public/favicon.svg +7 -0
  19. package/src/apps/kanban/public/page.css +1010 -0
  20. package/src/apps/kanban/public/page.js +1730 -0
  21. package/src/apps/kanban/public/vendor/marked.min.js +6 -0
  22. package/src/apps/kanban/public/vendor/sortable.min.js +2 -0
  23. package/src/apps/kanban/src/db.ts +319 -0
  24. package/src/apps/kanban/src/index.ts +14 -0
  25. package/src/apps/kanban/src/mcp-helpers.test.ts +88 -0
  26. package/src/apps/kanban/src/mcp-helpers.ts +60 -0
  27. package/src/apps/kanban/src/mcp.ts +59 -0
  28. package/src/apps/kanban/src/routes/attachments.ts +161 -0
  29. package/src/apps/kanban/src/routes/features.ts +233 -0
  30. package/src/apps/kanban/src/routes/issues.ts +373 -0
  31. package/src/apps/kanban/src/tools/feature-tools.ts +164 -0
  32. package/src/apps/kanban/src/tools/item-tools.ts +307 -0
  33. package/src/apps/kanban/src/tools/versioned-entry-tools.ts +72 -0
  34. package/src/apps/kanban/tsconfig.check.json +9 -0
  35. package/src/apps/kanban/tsconfig.json +9 -0
  36. package/src/apps/keymap/.turbo/turbo-lint.log +5 -0
  37. package/src/apps/keymap/package.json +16 -0
  38. package/src/apps/keymap/public/page.css +275 -0
  39. package/src/apps/keymap/public/page.js +294 -0
  40. package/src/apps/keymap/server.js +25 -0
  41. package/src/apps/log/.turbo/turbo-build.log +5 -0
  42. package/src/apps/log/.turbo/turbo-lint.log +45 -0
  43. package/src/apps/log/.turbo/turbo-typecheck.log +5 -0
  44. package/src/apps/log/node_modules/.bin/tsc +21 -0
  45. package/src/apps/log/node_modules/.bin/tsserver +21 -0
  46. package/src/apps/log/node_modules/.bin/tsx +21 -0
  47. package/src/apps/log/package.json +36 -0
  48. package/src/apps/log/public/console-sniffer.js +221 -0
  49. package/src/apps/log/public/favicon.svg +7 -0
  50. package/src/apps/log/public/page.css +322 -0
  51. package/src/apps/log/public/page.js +463 -0
  52. package/src/apps/log/src/index.ts +9 -0
  53. package/src/apps/log/src/mcp.ts +122 -0
  54. package/src/apps/log/src/routes/log.ts +333 -0
  55. package/src/apps/log/src/routes/status.ts +25 -0
  56. package/src/apps/log/src/server-sniffer.ts +118 -0
  57. package/src/apps/log/src/services/file-patterns.ts +39 -0
  58. package/src/apps/log/src/services/file-tailer.ts +228 -0
  59. package/src/apps/log/src/services/line-parser.ts +94 -0
  60. package/src/apps/log/src/services/log-writer.ts +39 -0
  61. package/src/apps/log/tsconfig.json +8 -0
  62. package/src/apps/prompts/.turbo/turbo-build.log +5 -0
  63. package/src/apps/prompts/.turbo/turbo-lint.log +24 -0
  64. package/src/apps/prompts/.turbo/turbo-typecheck.log +5 -0
  65. package/src/apps/prompts/mcp.ts +175 -0
  66. package/src/apps/prompts/node_modules/.bin/tsc +21 -0
  67. package/src/apps/prompts/node_modules/.bin/tsserver +21 -0
  68. package/src/apps/prompts/node_modules/.bin/tsx +21 -0
  69. package/src/apps/prompts/package.json +25 -0
  70. package/src/apps/prompts/public/page.css +315 -0
  71. package/src/apps/prompts/public/page.js +541 -0
  72. package/src/apps/prompts/services/prompt-store.ts +212 -0
  73. package/src/apps/prompts/src/index.ts +9 -0
  74. package/src/apps/prompts/tsconfig.json +8 -0
  75. package/src/apps/prompts/types.ts +27 -0
  76. package/src/apps/shell/.turbo/turbo-build.log +5 -0
  77. package/src/apps/shell/.turbo/turbo-lint.log +34 -0
  78. package/src/apps/shell/.turbo/turbo-typecheck.log +5 -0
  79. package/src/apps/shell/package.json +35 -0
  80. package/src/apps/shell/public/favicon.svg +7 -0
  81. package/src/apps/shell/public/page.css +407 -0
  82. package/src/apps/shell/public/page.js +1577 -0
  83. package/src/apps/shell/src/index.ts +150 -0
  84. package/src/apps/shell/src/mcp.ts +398 -0
  85. package/src/apps/shell/src/shell-types.ts +41 -0
  86. package/src/apps/shell/tsconfig.json +8 -0
  87. package/src/apps/test/.turbo/turbo-build.log +5 -0
  88. package/src/apps/test/.turbo/turbo-lint.log +27 -0
  89. package/src/apps/test/.turbo/turbo-typecheck.log +5 -0
  90. package/src/apps/test/node_modules/.bin/tsc +21 -0
  91. package/src/apps/test/node_modules/.bin/tsserver +21 -0
  92. package/src/apps/test/node_modules/.bin/tsx +21 -0
  93. package/src/apps/test/node_modules/.bin/uuid +21 -0
  94. package/src/apps/test/package.json +35 -0
  95. package/src/apps/test/public/favicon.svg +7 -0
  96. package/src/apps/test/public/page.css +499 -0
  97. package/src/apps/test/public/page.js +417 -0
  98. package/src/apps/test/public/scenario-runner.js +450 -0
  99. package/src/apps/test/src/index.ts +9 -0
  100. package/src/apps/test/src/mcp.ts +192 -0
  101. package/src/apps/test/src/routes/trigger.ts +285 -0
  102. package/src/apps/test/src/services/scenario-broadcaster.ts +60 -0
  103. package/src/apps/test/src/services/scenario-manager.ts +361 -0
  104. package/src/apps/test/src/services/scenario-store.ts +145 -0
  105. package/src/apps/test/tsconfig.json +8 -0
  106. package/src/apps/vocabulary/.turbo/turbo-build.log +5 -0
  107. package/src/apps/vocabulary/.turbo/turbo-lint.log +25 -0
  108. package/src/apps/vocabulary/.turbo/turbo-typecheck.log +5 -0
  109. package/src/apps/vocabulary/mcp.ts +173 -0
  110. package/src/apps/vocabulary/node_modules/.bin/tsc +21 -0
  111. package/src/apps/vocabulary/node_modules/.bin/tsserver +21 -0
  112. package/src/apps/vocabulary/node_modules/.bin/tsx +21 -0
  113. package/src/apps/vocabulary/package.json +25 -0
  114. package/src/apps/vocabulary/public/page.css +247 -0
  115. package/src/apps/vocabulary/public/page.js +444 -0
  116. package/src/apps/vocabulary/services/vocabulary-store.ts +179 -0
  117. package/src/apps/vocabulary/src/index.ts +10 -0
  118. package/src/apps/vocabulary/tsconfig.json +8 -0
  119. package/src/apps/vocabulary/types.ts +22 -0
  120. package/src/apps/voice/.turbo/turbo-build.log +5 -0
  121. package/src/apps/voice/.turbo/turbo-lint.log +43 -0
  122. package/src/apps/voice/.turbo/turbo-typecheck.log +5 -0
  123. package/src/apps/voice/node_modules/.bin/openai +21 -0
  124. package/src/apps/voice/node_modules/.bin/tsc +21 -0
  125. package/src/apps/voice/node_modules/.bin/tsserver +21 -0
  126. package/src/apps/voice/node_modules/.bin/tsx +21 -0
  127. package/src/apps/voice/package.json +35 -0
  128. package/src/apps/voice/public/favicon.svg +7 -0
  129. package/src/apps/voice/public/page.css +388 -0
  130. package/src/apps/voice/public/page.js +718 -0
  131. package/src/apps/voice/src/index.ts +10 -0
  132. package/src/apps/voice/src/mcp.ts +70 -0
  133. package/src/apps/voice/src/providers/index.ts +85 -0
  134. package/src/apps/voice/src/providers/openai-compatible.ts +94 -0
  135. package/src/apps/voice/src/providers/types.ts +27 -0
  136. package/src/apps/voice/src/routes/config.ts +118 -0
  137. package/src/apps/voice/src/routes/transcribe.ts +90 -0
  138. package/src/apps/voice/src/services/config-store.ts +129 -0
  139. package/src/apps/voice/src/services/stats.ts +108 -0
  140. package/src/apps/voice/src/transcribe.ts +11 -0
  141. package/src/apps/voice/src/utils/mime.ts +16 -0
  142. package/src/apps/voice/tsconfig.json +8 -0
  143. package/src/apps/workflow/.turbo/turbo-build.log +5 -0
  144. package/src/apps/workflow/.turbo/turbo-lint.log +96 -0
  145. package/src/apps/workflow/.turbo/turbo-typecheck.log +5 -0
  146. package/src/apps/workflow/engine/executors/decision-executor.ts +87 -0
  147. package/src/apps/workflow/engine/executors/file-executor.ts +90 -0
  148. package/src/apps/workflow/engine/executors/git-executor.ts +137 -0
  149. package/src/apps/workflow/engine/executors/http-executor.ts +65 -0
  150. package/src/apps/workflow/engine/executors/index.ts +28 -0
  151. package/src/apps/workflow/engine/executors/kanban-executor.ts +154 -0
  152. package/src/apps/workflow/engine/executors/llm-executor.ts +46 -0
  153. package/src/apps/workflow/engine/executors/log-executor.ts +62 -0
  154. package/src/apps/workflow/engine/executors/loop-executor.ts +14 -0
  155. package/src/apps/workflow/engine/executors/shell-executor.ts +107 -0
  156. package/src/apps/workflow/engine/executors/sub-workflow-executor.ts +61 -0
  157. package/src/apps/workflow/engine/executors/test-executor.ts +73 -0
  158. package/src/apps/workflow/engine/executors/trigger-executor.ts +39 -0
  159. package/src/apps/workflow/engine/expression-evaluator.ts +117 -0
  160. package/src/apps/workflow/engine/graph-runner.ts +438 -0
  161. package/src/apps/workflow/engine/node-executor.ts +104 -0
  162. package/src/apps/workflow/engine/node-registry.ts +15 -0
  163. package/src/apps/workflow/engine/variable-resolver.ts +109 -0
  164. package/src/apps/workflow/mcp.ts +223 -0
  165. package/src/apps/workflow/node_modules/.bin/tsc +21 -0
  166. package/src/apps/workflow/node_modules/.bin/tsserver +21 -0
  167. package/src/apps/workflow/node_modules/.bin/tsx +21 -0
  168. package/src/apps/workflow/package.json +25 -0
  169. package/src/apps/workflow/public/editor/canvas.js +366 -0
  170. package/src/apps/workflow/public/editor/drag-manager.js +326 -0
  171. package/src/apps/workflow/public/editor/edge-renderer.js +235 -0
  172. package/src/apps/workflow/public/editor/history-manager.js +147 -0
  173. package/src/apps/workflow/public/editor/layout-engine.js +159 -0
  174. package/src/apps/workflow/public/editor/node-renderer.js +199 -0
  175. package/src/apps/workflow/public/editor/selection-manager.js +193 -0
  176. package/src/apps/workflow/public/favicon.svg +7 -0
  177. package/src/apps/workflow/public/models/node-types.js +300 -0
  178. package/src/apps/workflow/public/models/workflow-model.js +257 -0
  179. package/src/apps/workflow/public/page.css +406 -0
  180. package/src/apps/workflow/public/page.js +658 -0
  181. package/src/apps/workflow/public/panels/inspector.js +360 -0
  182. package/src/apps/workflow/public/panels/palette.js +106 -0
  183. package/src/apps/workflow/public/panels/run-view.js +275 -0
  184. package/src/apps/workflow/public/panels/toolbar.js +232 -0
  185. package/src/apps/workflow/public/panels/workflow-list.js +237 -0
  186. package/src/apps/workflow/public/state/store.js +47 -0
  187. package/src/apps/workflow/services/custom-node-loader.ts +48 -0
  188. package/src/apps/workflow/services/legacy-converter.ts +72 -0
  189. package/src/apps/workflow/services/run-manager.ts +190 -0
  190. package/src/apps/workflow/services/workflow-store.ts +424 -0
  191. package/src/apps/workflow/services/workflow-validator.test.ts +103 -0
  192. package/src/apps/workflow/services/workflow-validator.ts +98 -0
  193. package/src/apps/workflow/src/index.ts +10 -0
  194. package/src/apps/workflow/templates/ci-pipeline.json +18 -0
  195. package/src/apps/workflow/templates/code-review.json +22 -0
  196. package/src/apps/workflow/templates/kanban-testing.json +24 -0
  197. package/src/apps/workflow/tsconfig.json +8 -0
  198. package/src/apps/workflow/types.ts +268 -0
  199. package/src/packages/auth-middleware.ts +14 -0
  200. package/src/packages/design-tokens/.turbo/turbo-build.log +10 -0
  201. package/src/packages/design-tokens/STYLEGUIDE.md +414 -0
  202. package/src/packages/design-tokens/build.js +413 -0
  203. package/src/packages/design-tokens/demo/index.html +1367 -0
  204. package/src/packages/design-tokens/demo/proposition-a.html +717 -0
  205. package/src/packages/design-tokens/demo/proposition-b.html +1239 -0
  206. package/src/packages/design-tokens/demo/proposition-c.html +1049 -0
  207. package/src/packages/design-tokens/dist/tailwind-preset.js +115 -0
  208. package/src/packages/design-tokens/dist/tokens.css +345 -0
  209. package/src/packages/design-tokens/dist/tokens.d.ts +229 -0
  210. package/src/packages/design-tokens/dist/tokens.js +386 -0
  211. package/src/packages/design-tokens/package.json +25 -0
  212. package/src/packages/design-tokens/tokens.json +228 -0
  213. package/src/packages/devtools-middleware.ts +22 -0
  214. package/src/packages/eslint-config/index.js +63 -0
  215. package/src/packages/eslint-config/node_modules/.bin/eslint +21 -0
  216. package/src/packages/eslint-config/package.json +18 -0
  217. package/src/packages/json-file-store.ts +232 -0
  218. package/src/packages/mcp-utils/.turbo/turbo-build.log +5 -0
  219. package/src/packages/mcp-utils/dist/index.d.ts +33 -0
  220. package/src/packages/mcp-utils/dist/index.d.ts.map +1 -0
  221. package/src/packages/mcp-utils/dist/index.js +126 -0
  222. package/src/packages/mcp-utils/dist/index.js.map +1 -0
  223. package/src/packages/mcp-utils/node_modules/.bin/tsc +21 -0
  224. package/src/packages/mcp-utils/node_modules/.bin/tsserver +21 -0
  225. package/src/packages/mcp-utils/package.json +32 -0
  226. package/src/packages/mcp-utils/src/index.ts +171 -0
  227. package/src/packages/mcp-utils/tsconfig.json +9 -0
  228. package/src/packages/paths.ts +18 -0
  229. package/src/packages/project-context/index.js +55 -0
  230. package/src/packages/project-context/package.json +13 -0
  231. package/src/packages/project-store.ts +127 -0
  232. package/src/packages/server-sniffer.ts +132 -0
  233. package/src/packages/shared-assets/favicon.svg +7 -0
  234. package/src/packages/shared-assets/keymap-registry.js +512 -0
  235. package/src/packages/shared-assets/logo.svg +6 -0
  236. package/src/packages/shared-assets/package.json +11 -0
  237. package/src/packages/shared-assets/ui-utils.js +48 -0
  238. package/src/packages/shared-assets/voice-widget.d.ts +37 -0
  239. package/src/packages/shared-assets/voice-widget.js +695 -0
  240. package/src/packages/shared-types/.turbo/turbo-build.log +5 -0
  241. package/src/packages/shared-types/dist/index.d.ts +39 -0
  242. package/src/packages/shared-types/dist/index.d.ts.map +1 -0
  243. package/src/packages/shared-types/node_modules/.bin/tsc +21 -0
  244. package/src/packages/shared-types/node_modules/.bin/tsserver +21 -0
  245. package/src/packages/shared-types/package.json +25 -0
  246. package/src/packages/shared-types/src/index.ts +41 -0
  247. package/src/packages/shared-types/tsconfig.json +11 -0
  248. package/src/packages/tsconfig/base.json +15 -0
  249. package/src/packages/tsconfig/next.json +14 -0
  250. package/src/packages/tsconfig/node.json +11 -0
  251. package/src/packages/tsconfig/package.json +10 -0
  252. package/turbo.json +25 -0
@@ -0,0 +1,1010 @@
1
+ .page-kanban {
2
+ font-family: var(--df-font-mono);
3
+ background: var(--df-color-bg-base);
4
+ color: var(--df-color-text-primary);
5
+ -webkit-font-smoothing: antialiased;
6
+ min-height: 100vh;
7
+ font-size: var(--df-font-size-sm);
8
+ overflow: hidden;
9
+ position: relative;
10
+ }
11
+
12
+ .page-kanban a {
13
+ color: inherit;
14
+ text-decoration: none;
15
+ }
16
+
17
+ /* ── App Header ──────────────────────────────────────────────────────────── */
18
+
19
+ .page-kanban .app-header {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--df-space-2);
23
+ height: 38px;
24
+ padding: 0 var(--df-space-4);
25
+ background: var(--df-color-bg-surface);
26
+ border-bottom: 1px solid var(--df-color-border-default);
27
+ flex-shrink: 0;
28
+ }
29
+
30
+ .page-kanban .app-name {
31
+ font-size: var(--df-font-size-md);
32
+ font-weight: normal;
33
+ color: var(--df-color-accent-default);
34
+ font-family: var(--df-font-mono);
35
+ letter-spacing: var(--df-letter-spacing-wider);
36
+ text-transform: uppercase;
37
+ }
38
+
39
+ .page-kanban .board-edit-btn {
40
+ background: none;
41
+ border: none;
42
+ color: var(--df-text-muted);
43
+ cursor: pointer;
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ padding: 4px;
48
+ border-radius: var(--df-radius-sm);
49
+ margin-left: var(--df-space-1);
50
+ transition: color var(--df-duration-fast), background var(--df-duration-fast);
51
+ }
52
+ .page-kanban .board-edit-btn:hover {
53
+ color: var(--df-text-primary);
54
+ background: var(--df-bg-hover);
55
+ }
56
+
57
+ .page-kanban .header-actions {
58
+ margin-left: auto;
59
+ display: flex;
60
+ align-items: center;
61
+ gap: var(--df-space-3);
62
+ }
63
+
64
+ .page-kanban .back-btn {
65
+ display: inline-flex;
66
+ align-items: center;
67
+ gap: var(--df-space-1);
68
+ background: none;
69
+ border: none;
70
+ color: var(--df-color-text-secondary);
71
+ font-family: var(--df-font-mono);
72
+ font-size: var(--df-font-size-sm);
73
+ cursor: pointer;
74
+ padding: 0;
75
+ transition: color var(--df-duration-fast);
76
+ }
77
+
78
+ .page-kanban .back-btn:hover {
79
+ color: var(--df-color-accent-default);
80
+ }
81
+
82
+ /* ── Sync Badge ──────────────────────────────────────────────────────────── */
83
+
84
+ .page-kanban .sync-badge {
85
+ display: inline-flex;
86
+ align-items: center;
87
+ gap: var(--df-space-1);
88
+ font-size: var(--df-font-size-xs);
89
+ color: var(--df-color-state-success);
90
+ letter-spacing: var(--df-letter-spacing-normal);
91
+ transition: opacity var(--df-duration-base);
92
+ }
93
+
94
+ .page-kanban .sync-indicator {
95
+ position: absolute;
96
+ bottom: var(--df-space-6);
97
+ right: var(--df-space-6);
98
+ display: flex;
99
+ align-items: center;
100
+ gap: var(--df-space-2);
101
+ background: var(--df-color-bg-surface);
102
+ border: 1px solid color-mix(in srgb, var(--df-color-state-success) 30%, transparent);
103
+ clip-path: var(--df-clip-sm);
104
+ padding: var(--df-space-2) var(--df-space-3);
105
+ font-size: var(--df-font-size-xs);
106
+ color: var(--df-color-state-success);
107
+ letter-spacing: var(--df-letter-spacing-normal);
108
+ opacity: 0;
109
+ transform: translateY(8px);
110
+ transition: opacity var(--df-duration-base), transform var(--df-duration-base);
111
+ z-index: var(--df-z-index-toast);
112
+ pointer-events: none;
113
+ }
114
+
115
+ .page-kanban .sync-indicator.visible {
116
+ opacity: 1;
117
+ transform: translateY(0);
118
+ }
119
+
120
+ .page-kanban .sync-dot {
121
+ width: 6px;
122
+ height: 6px;
123
+ background: var(--df-color-state-success);
124
+ flex-shrink: 0;
125
+ }
126
+
127
+ /* ── Section Title ───────────────────────────────────────────────────────── */
128
+
129
+ .page-kanban .section-title {
130
+ font-size: var(--df-font-size-xs);
131
+ font-weight: normal;
132
+ text-transform: uppercase;
133
+ letter-spacing: var(--df-letter-spacing-wider);
134
+ color: var(--df-color-text-secondary);
135
+ margin-bottom: var(--df-space-4);
136
+ }
137
+
138
+ /* ── Feature List ────────────────────────────────────────────────────────── */
139
+
140
+ .page-kanban .features-container {
141
+ max-width: var(--df-max-width-lg);
142
+ margin: 0 auto;
143
+ padding: var(--df-space-8) var(--df-space-4);
144
+ overflow-y: auto;
145
+ height: calc(100vh - 38px);
146
+ }
147
+
148
+ .page-kanban .features-grid {
149
+ display: grid;
150
+ grid-template-columns: 1fr;
151
+ grid-auto-rows: 140px;
152
+ gap: var(--df-space-4);
153
+ }
154
+
155
+ @media (min-width: 640px) {
156
+ .page-kanban .features-grid { grid-template-columns: repeat(2, 1fr); }
157
+ }
158
+
159
+ @media (min-width: 1024px) {
160
+ .page-kanban .features-grid { grid-template-columns: repeat(3, 1fr); }
161
+ }
162
+
163
+ /* ── Feature Card ────────────────────────────────────────────────────────── */
164
+
165
+ .page-kanban .feature-card {
166
+ display: flex;
167
+ flex-direction: column;
168
+ height: 140px;
169
+ background: var(--df-color-bg-raised);
170
+ border: 1px solid var(--df-color-border-default);
171
+ clip-path: var(--df-clip-sm);
172
+ padding: var(--df-space-4);
173
+ cursor: pointer;
174
+ transition: border-color var(--df-duration-fast), background var(--df-duration-fast);
175
+ position: relative;
176
+ }
177
+
178
+ .page-kanban .feature-card:hover {
179
+ border-color: var(--df-color-accent-default);
180
+ background: color-mix(in srgb, var(--df-color-accent-default) 4%, var(--df-color-bg-raised));
181
+ }
182
+
183
+ .page-kanban .feature-card-top {
184
+ display: flex;
185
+ align-items: flex-start;
186
+ gap: var(--df-space-3);
187
+ margin-bottom: var(--df-space-3);
188
+ min-height: 0;
189
+ flex: 1;
190
+ }
191
+
192
+ .page-kanban .feature-card-icon {
193
+ width: 36px;
194
+ height: 36px;
195
+ flex-shrink: 0;
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ clip-path: var(--df-clip-sm);
200
+ }
201
+
202
+ .page-kanban .feature-card-dot {
203
+ width: 8px;
204
+ height: 8px;
205
+ }
206
+
207
+ .page-kanban .feature-card-info {
208
+ flex: 1;
209
+ min-width: 0;
210
+ }
211
+
212
+ .page-kanban .feature-card-name {
213
+ font-size: var(--df-font-size-sm);
214
+ font-weight: normal;
215
+ text-transform: uppercase;
216
+ letter-spacing: var(--df-letter-spacing-wider);
217
+ color: var(--df-color-text-primary);
218
+ overflow: hidden;
219
+ text-overflow: ellipsis;
220
+ white-space: nowrap;
221
+ }
222
+
223
+ .page-kanban .feature-card-desc {
224
+ font-size: var(--df-font-size-xs);
225
+ color: var(--df-color-text-secondary);
226
+ letter-spacing: var(--df-letter-spacing-normal);
227
+ line-height: var(--df-line-height-normal);
228
+ margin-top: var(--df-space-1);
229
+ display: -webkit-box;
230
+ -webkit-line-clamp: 2;
231
+ -webkit-box-orient: vertical;
232
+ overflow: hidden;
233
+ min-height: calc(2 * 1em * var(--df-line-height-normal));
234
+ }
235
+
236
+ .page-kanban .feature-card-footer {
237
+ display: flex;
238
+ align-items: center;
239
+ padding-top: var(--df-space-3);
240
+ border-top: 1px solid var(--df-color-border-subtle);
241
+ }
242
+
243
+ .page-kanban .feature-card-count {
244
+ font-size: var(--df-font-size-xs);
245
+ color: var(--df-color-text-secondary);
246
+ letter-spacing: var(--df-letter-spacing-normal);
247
+ }
248
+
249
+ .page-kanban .feature-delete-btn {
250
+ margin-left: auto;
251
+ background: none;
252
+ border: none;
253
+ color: var(--df-color-text-muted);
254
+ font-size: var(--df-font-size-lg);
255
+ cursor: pointer;
256
+ padding: 0 var(--df-space-1);
257
+ line-height: 1;
258
+ transition: color var(--df-duration-fast);
259
+ }
260
+
261
+ .page-kanban .feature-delete-btn:hover {
262
+ color: var(--df-color-state-error);
263
+ }
264
+
265
+ .page-kanban .feature-edit-btn {
266
+ background: none;
267
+ border: none;
268
+ color: var(--df-text-muted);
269
+ cursor: pointer;
270
+ display: inline-flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ padding: 4px;
274
+ border-radius: var(--df-radius-sm);
275
+ opacity: 0;
276
+ transition: opacity var(--df-duration-fast), color var(--df-duration-fast), background var(--df-duration-fast);
277
+ }
278
+ .page-kanban .feature-card:hover .feature-edit-btn { opacity: 1; }
279
+ .page-kanban .feature-edit-btn:hover {
280
+ color: var(--df-text-primary);
281
+ background: var(--df-bg-hover);
282
+ }
283
+
284
+ /* ── Empty State ─────────────────────────────────────────────────────────── */
285
+
286
+ .page-kanban .empty-state {
287
+ display: flex;
288
+ flex-direction: column;
289
+ align-items: center;
290
+ justify-content: center;
291
+ padding: var(--df-space-24) 0;
292
+ gap: var(--df-space-4);
293
+ }
294
+
295
+ .page-kanban .empty-icon { opacity: 0.5; }
296
+
297
+ .page-kanban .empty-text {
298
+ font-size: var(--df-font-size-sm);
299
+ color: var(--df-color-text-secondary);
300
+ letter-spacing: var(--df-letter-spacing-normal);
301
+ }
302
+
303
+ /* ── Search Bar ──────────────────────────────────────────────────────────── */
304
+
305
+ .page-kanban .board-search {
306
+ padding: var(--df-space-3) var(--df-space-4) 0;
307
+ }
308
+
309
+ .page-kanban .search-bar {
310
+ display: flex;
311
+ position: relative;
312
+ max-width: 300px;
313
+ flex: 1;
314
+ }
315
+
316
+ .page-kanban .search-input {
317
+ width: 100%;
318
+ background: var(--df-color-bg-raised);
319
+ border: 1px solid var(--df-color-border-default);
320
+ border-radius: 0;
321
+ color: var(--df-color-text-primary);
322
+ font-family: var(--df-font-mono);
323
+ font-size: var(--df-font-size-xs);
324
+ padding: var(--df-space-1) var(--df-space-3);
325
+ outline: none;
326
+ transition: border-color var(--df-duration-fast);
327
+ }
328
+
329
+ .page-kanban .search-input:focus-visible {
330
+ border-color: var(--df-color-accent-default);
331
+ box-shadow: inset 0 0 0 1px var(--df-color-accent-dim);
332
+ }
333
+
334
+ .page-kanban .search-input::placeholder {
335
+ color: var(--df-color-text-secondary);
336
+ }
337
+
338
+ .page-kanban .search-clear {
339
+ position: absolute;
340
+ right: var(--df-space-1);
341
+ top: 50%;
342
+ transform: translateY(-50%);
343
+ background: none;
344
+ border: none;
345
+ color: var(--df-color-text-muted);
346
+ font-size: var(--df-font-size-sm);
347
+ cursor: pointer;
348
+ padding: 0 var(--df-space-1);
349
+ line-height: 1;
350
+ transition: color var(--df-duration-fast);
351
+ }
352
+
353
+ .page-kanban .search-clear:hover {
354
+ color: var(--df-color-text-primary);
355
+ }
356
+
357
+ /* ── Board Columns ───────────────────────────────────────────────────────── */
358
+
359
+ .page-kanban .board-columns {
360
+ display: flex;
361
+ gap: var(--df-space-4);
362
+ padding: var(--df-space-4);
363
+ height: calc(100vh - 38px - 38px);
364
+ overflow-x: auto;
365
+ overflow-y: hidden;
366
+ }
367
+
368
+ .page-kanban .kanban-column {
369
+ flex: 1;
370
+ min-width: 240px;
371
+ max-width: 360px;
372
+ display: flex;
373
+ flex-direction: column;
374
+ }
375
+
376
+ .page-kanban .column-header {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: var(--df-space-2);
380
+ padding: var(--df-space-2);
381
+ margin-bottom: var(--df-space-2);
382
+ flex-shrink: 0;
383
+ }
384
+
385
+ .page-kanban .column-dot {
386
+ width: 6px;
387
+ height: 6px;
388
+ flex-shrink: 0;
389
+ }
390
+
391
+ .page-kanban .column-name {
392
+ font-size: var(--df-font-size-xs);
393
+ font-weight: normal;
394
+ text-transform: uppercase;
395
+ letter-spacing: var(--df-letter-spacing-wider);
396
+ color: var(--df-color-text-secondary);
397
+ }
398
+
399
+ .page-kanban .column-count {
400
+ font-size: var(--df-font-size-xs);
401
+ color: var(--df-color-text-secondary);
402
+ letter-spacing: var(--df-letter-spacing-normal);
403
+ margin-left: var(--df-space-1);
404
+ }
405
+
406
+ /* ── Drop Zone ───────────────────────────────────────────────────────────── */
407
+
408
+ .page-kanban .column-drop-zone {
409
+ display: flex;
410
+ flex-direction: column;
411
+ gap: var(--df-space-2);
412
+ min-height: 128px;
413
+ flex: 1;
414
+ border: 1px solid var(--df-color-border-subtle);
415
+ background: color-mix(in srgb, var(--df-color-bg-surface) 50%, transparent);
416
+ padding: var(--df-space-2);
417
+ overflow-y: auto;
418
+ transition: border-color var(--df-duration-fast), background var(--df-duration-fast);
419
+ }
420
+
421
+ .page-kanban .column-drop-zone.drag-over {
422
+ border-color: var(--df-color-accent-default);
423
+ background: color-mix(in srgb, var(--df-color-accent-default) 5%, transparent);
424
+ }
425
+
426
+ /* ── Add Issue Button ────────────────────────────────────────────────────── */
427
+
428
+ .page-kanban .add-issue-btn {
429
+ width: 100%;
430
+ background: transparent;
431
+ border: 1px solid var(--df-color-border-subtle);
432
+ color: var(--df-color-text-muted);
433
+ font-family: var(--df-font-mono);
434
+ font-size: var(--df-font-size-xs);
435
+ letter-spacing: var(--df-letter-spacing-wide);
436
+ text-transform: uppercase;
437
+ padding: var(--df-space-2) var(--df-space-3);
438
+ cursor: pointer;
439
+ transition: color var(--df-duration-fast), border-color var(--df-duration-fast);
440
+ margin-top: var(--df-space-2);
441
+ flex-shrink: 0;
442
+ }
443
+
444
+ .page-kanban .add-issue-btn:hover {
445
+ color: var(--df-color-accent-default);
446
+ border-color: var(--df-color-accent-default);
447
+ }
448
+
449
+ /* ── Issue Card ──────────────────────────────────────────────────────────── */
450
+
451
+ .page-kanban .issue-card {
452
+ background: var(--df-color-bg-raised);
453
+ border: 1px solid var(--df-color-border-default);
454
+ clip-path: var(--df-clip-sm);
455
+ padding: var(--df-space-3);
456
+ cursor: grab;
457
+ transition: border-color var(--df-duration-fast), background var(--df-duration-fast), opacity var(--df-duration-fast), transform var(--df-duration-fast);
458
+ user-select: none;
459
+ }
460
+
461
+ .page-kanban .issue-card:hover {
462
+ border-color: var(--df-color-accent-default);
463
+ background: color-mix(in srgb, var(--df-color-accent-default) 4%, var(--df-color-bg-raised));
464
+ }
465
+
466
+ .page-kanban .issue-card:active { cursor: grabbing; }
467
+
468
+ .page-kanban .issue-card.sortable-ghost {
469
+ opacity: 0.4;
470
+ transform: scale(0.95);
471
+ }
472
+
473
+ .page-kanban .issue-card-title {
474
+ font-size: var(--df-font-size-sm);
475
+ color: var(--df-color-text-primary);
476
+ line-height: var(--df-line-height-normal);
477
+ margin-bottom: var(--df-space-2);
478
+ display: -webkit-box;
479
+ -webkit-line-clamp: 3;
480
+ -webkit-box-orient: vertical;
481
+ overflow: hidden;
482
+ }
483
+
484
+ .page-kanban .issue-card-badges {
485
+ display: flex;
486
+ gap: 6px;
487
+ flex-wrap: wrap;
488
+ }
489
+
490
+ /* ── Badges ──────────────────────────────────────────────────────────────── */
491
+
492
+ .page-kanban .badge {
493
+ font-size: var(--df-font-size-xs);
494
+ font-family: var(--df-font-mono);
495
+ font-weight: 600;
496
+ text-transform: uppercase;
497
+ letter-spacing: var(--df-letter-spacing-wide);
498
+ clip-path: var(--df-clip-sm);
499
+ padding: 2px 8px;
500
+ white-space: nowrap;
501
+ line-height: 1.4;
502
+ }
503
+
504
+ .page-kanban .badge-low {
505
+ background: color-mix(in srgb, var(--df-color-state-info) 10%, transparent);
506
+ color: var(--df-color-state-info);
507
+ border: 1px solid color-mix(in srgb, var(--df-color-state-info) 30%, transparent);
508
+ }
509
+
510
+ .page-kanban .badge-medium {
511
+ background: color-mix(in srgb, var(--df-color-state-warning) 10%, transparent);
512
+ color: var(--df-color-state-warning);
513
+ border: 1px solid color-mix(in srgb, var(--df-color-state-warning) 30%, transparent);
514
+ }
515
+
516
+ .page-kanban .badge-high {
517
+ background: color-mix(in srgb, var(--df-color-state-error) 10%, transparent);
518
+ color: var(--df-color-state-error);
519
+ border: 1px solid color-mix(in srgb, var(--df-color-state-error) 30%, transparent);
520
+ }
521
+
522
+ .page-kanban .badge-urgent {
523
+ background: color-mix(in srgb, var(--df-color-state-error) 15%, transparent);
524
+ color: var(--df-color-state-error);
525
+ border: 1px solid color-mix(in srgb, var(--df-color-state-error) 40%, transparent);
526
+ }
527
+
528
+ .page-kanban .badge-bug {
529
+ background: color-mix(in srgb, var(--df-color-state-error) 10%, transparent);
530
+ color: var(--df-color-state-error);
531
+ border: 1px solid color-mix(in srgb, var(--df-color-state-error) 30%, transparent);
532
+ }
533
+
534
+ .page-kanban .badge-secondary {
535
+ background: var(--df-color-bg-overlay);
536
+ color: var(--df-color-text-secondary);
537
+ border: 1px solid var(--df-color-border-default);
538
+ }
539
+
540
+ .page-kanban .badge-due {
541
+ background: color-mix(in srgb, var(--df-color-state-info) 8%, transparent);
542
+ color: var(--df-color-state-info);
543
+ border: 1px solid color-mix(in srgb, var(--df-color-state-info) 25%, transparent);
544
+ }
545
+
546
+ .page-kanban .badge-due-overdue {
547
+ background: color-mix(in srgb, var(--df-color-state-error) 10%, transparent);
548
+ color: var(--df-color-state-error);
549
+ border: 1px solid color-mix(in srgb, var(--df-color-state-error) 30%, transparent);
550
+ }
551
+
552
+ .page-kanban .badge-review {
553
+ background: color-mix(in srgb, #8b5cf6 12%, transparent);
554
+ color: #8b5cf6;
555
+ border: 1px solid color-mix(in srgb, #8b5cf6 30%, transparent);
556
+ }
557
+
558
+ .page-kanban .badge-worklog {
559
+ background: color-mix(in srgb, #14b8a6 12%, transparent);
560
+ color: #14b8a6;
561
+ border: 1px solid color-mix(in srgb, #14b8a6 30%, transparent);
562
+ }
563
+
564
+ /* ── Forms ────────────────────────────────────────────────────────────────── */
565
+
566
+ .page-kanban label {
567
+ font-size: var(--df-font-size-xs);
568
+ color: var(--df-color-text-secondary);
569
+ letter-spacing: var(--df-letter-spacing-wide);
570
+ text-transform: uppercase;
571
+ display: flex;
572
+ align-items: center;
573
+ gap: var(--df-space-2);
574
+ }
575
+
576
+ .page-kanban input[type="text"],
577
+ .page-kanban input[type="date"],
578
+ .page-kanban textarea,
579
+ .page-kanban select {
580
+ width: 100%;
581
+ background: var(--df-color-bg-raised);
582
+ border: 1px solid var(--df-color-border-default);
583
+ border-radius: 0;
584
+ color: var(--df-color-text-primary);
585
+ font-family: var(--df-font-mono);
586
+ font-size: var(--df-font-size-sm);
587
+ padding: var(--df-space-2) var(--df-space-3);
588
+ outline: none;
589
+ transition: border-color var(--df-duration-fast);
590
+ }
591
+
592
+ .page-kanban textarea {
593
+ resize: vertical;
594
+ line-height: var(--df-line-height-normal);
595
+ }
596
+
597
+ .page-kanban input:focus-visible,
598
+ .page-kanban textarea:focus-visible,
599
+ .page-kanban select:focus-visible {
600
+ border-color: var(--df-color-accent-default);
601
+ box-shadow: inset 0 0 0 1px var(--df-color-accent-dim);
602
+ }
603
+
604
+ .page-kanban input::placeholder,
605
+ .page-kanban textarea::placeholder {
606
+ color: var(--df-color-text-muted);
607
+ }
608
+
609
+ .page-kanban select {
610
+ cursor: pointer;
611
+ appearance: none;
612
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23636e7b'/%3E%3C/svg%3E");
613
+ background-repeat: no-repeat;
614
+ background-position: right 10px center;
615
+ padding-right: var(--df-space-6);
616
+ }
617
+
618
+ .page-kanban select option {
619
+ background: var(--df-color-bg-raised);
620
+ }
621
+
622
+ /* ── Color Picker ────────────────────────────────────────────────────────── */
623
+
624
+ .page-kanban .color-picker {
625
+ display: flex;
626
+ gap: var(--df-space-2);
627
+ flex-wrap: wrap;
628
+ }
629
+
630
+ .page-kanban .color-swatch {
631
+ width: 28px;
632
+ height: 28px;
633
+ border-radius: var(--df-radius-full);
634
+ border: 2px solid transparent;
635
+ cursor: pointer;
636
+ transition: border-color var(--df-duration-fast), transform var(--df-duration-fast);
637
+ outline: none;
638
+ }
639
+
640
+ .page-kanban .color-swatch:hover { transform: scale(1.15); }
641
+
642
+ .page-kanban .color-swatch.selected {
643
+ border-color: var(--df-color-text-primary);
644
+ box-shadow: 0 0 0 2px var(--df-color-bg-surface), 0 0 0 4px currentColor;
645
+ }
646
+
647
+ /* ── Description Tabs ────────────────────────────────────────────────────── */
648
+
649
+ .page-kanban .description-header {
650
+ display: flex;
651
+ align-items: center;
652
+ justify-content: space-between;
653
+ margin-bottom: var(--df-space-1);
654
+ }
655
+
656
+ .page-kanban .description-tabs {
657
+ display: flex;
658
+ border: 1px solid var(--df-color-border-default);
659
+ border-bottom: none;
660
+ overflow: hidden;
661
+ }
662
+
663
+ .page-kanban .description-tab {
664
+ padding: var(--df-space-1) 10px;
665
+ background: var(--df-color-bg-raised);
666
+ border: none;
667
+ border-right: 1px solid var(--df-color-border-default);
668
+ color: var(--df-color-text-secondary);
669
+ font-family: var(--df-font-mono);
670
+ font-size: var(--df-font-size-xs);
671
+ text-transform: uppercase;
672
+ letter-spacing: var(--df-letter-spacing-wider);
673
+ cursor: pointer;
674
+ transition: background var(--df-duration-fast), color var(--df-duration-fast);
675
+ }
676
+
677
+ .page-kanban .description-tab:last-child { border-right: none; }
678
+ .page-kanban .description-tab:hover { color: var(--df-color-text-primary); }
679
+
680
+ .page-kanban .description-tab.active {
681
+ background: var(--df-color-accent-default);
682
+ color: var(--df-color-accent-contrast);
683
+ }
684
+
685
+ /* ── Markdown Preview ────────────────────────────────────────────────────── */
686
+
687
+ .page-kanban .markdown-preview {
688
+ min-height: 160px;
689
+ border: 1px solid var(--df-color-border-default);
690
+ background: var(--df-color-bg-raised);
691
+ padding: var(--df-space-3);
692
+ font-size: var(--df-font-size-sm);
693
+ color: var(--df-color-text-primary);
694
+ line-height: var(--df-line-height-loose);
695
+ overflow-y: auto;
696
+ }
697
+
698
+ .page-kanban .markdown-preview h1,
699
+ .page-kanban .markdown-preview h2,
700
+ .page-kanban .markdown-preview h3 {
701
+ font-size: var(--df-font-size-sm);
702
+ font-weight: 600;
703
+ text-transform: uppercase;
704
+ letter-spacing: var(--df-letter-spacing-wide);
705
+ color: var(--df-color-text-primary);
706
+ margin: var(--df-space-3) 0 var(--df-space-1);
707
+ }
708
+
709
+ .page-kanban .markdown-preview h1:first-child,
710
+ .page-kanban .markdown-preview h2:first-child,
711
+ .page-kanban .markdown-preview h3:first-child { margin-top: 0; }
712
+
713
+ .page-kanban .markdown-preview p { margin-bottom: var(--df-space-2); }
714
+
715
+ .page-kanban .markdown-preview code {
716
+ background: var(--df-color-bg-overlay);
717
+ padding: 1px var(--df-space-1);
718
+ font-family: var(--df-font-mono);
719
+ font-size: var(--df-font-size-xs);
720
+ color: var(--df-color-accent-default);
721
+ }
722
+
723
+ .page-kanban .markdown-preview pre {
724
+ background: var(--df-color-bg-overlay);
725
+ border: 1px solid var(--df-color-border-default);
726
+ padding: var(--df-space-3);
727
+ margin: var(--df-space-2) 0;
728
+ overflow-x: auto;
729
+ }
730
+
731
+ .page-kanban .markdown-preview pre code { background: none; padding: 0; }
732
+
733
+ .page-kanban .markdown-preview ul,
734
+ .page-kanban .markdown-preview ol {
735
+ padding-left: var(--df-space-5);
736
+ margin-bottom: var(--df-space-2);
737
+ }
738
+
739
+ .page-kanban .markdown-preview li { margin-bottom: var(--df-space-1); }
740
+
741
+ .page-kanban .markdown-preview a {
742
+ color: var(--df-color-text-link);
743
+ text-decoration: underline;
744
+ }
745
+
746
+ .page-kanban .markdown-preview blockquote {
747
+ border-left: 2px solid var(--df-color-accent-default);
748
+ padding-left: var(--df-space-3);
749
+ color: var(--df-color-text-secondary);
750
+ margin: var(--df-space-2) 0;
751
+ }
752
+
753
+ /* ── Attachment Gallery ──────────────────────────────────────────────────── */
754
+
755
+ .page-kanban .attachment-gallery {
756
+ display: flex;
757
+ gap: var(--df-space-2);
758
+ flex-wrap: wrap;
759
+ }
760
+
761
+ .page-kanban .attachment-thumb {
762
+ width: 80px;
763
+ height: 80px;
764
+ border: 1px solid var(--df-color-border-default);
765
+ overflow: hidden;
766
+ position: relative;
767
+ cursor: pointer;
768
+ transition: border-color var(--df-duration-fast);
769
+ }
770
+
771
+ .page-kanban .attachment-thumb:hover { border-color: var(--df-color-accent-default); }
772
+
773
+ .page-kanban .attachment-thumb img {
774
+ width: 100%;
775
+ height: 100%;
776
+ object-fit: cover;
777
+ }
778
+
779
+ .page-kanban .attachment-thumb-delete {
780
+ position: absolute;
781
+ top: 2px;
782
+ right: 2px;
783
+ background: var(--df-color-bg-base);
784
+ border: 1px solid var(--df-color-border-default);
785
+ color: var(--df-color-text-secondary);
786
+ font-size: var(--df-font-size-xs);
787
+ width: 18px;
788
+ height: 18px;
789
+ display: flex;
790
+ align-items: center;
791
+ justify-content: center;
792
+ cursor: pointer;
793
+ opacity: 0;
794
+ transition: opacity var(--df-duration-fast), color var(--df-duration-fast);
795
+ line-height: 1;
796
+ }
797
+
798
+ .page-kanban .attachment-thumb:hover .attachment-thumb-delete { opacity: 1; }
799
+ .page-kanban .attachment-thumb-delete:hover { color: var(--df-color-state-error); }
800
+
801
+ .page-kanban .attachment-drop-zone {
802
+ border: 1px dashed var(--df-color-border-strong);
803
+ padding: var(--df-space-4);
804
+ text-align: center;
805
+ color: var(--df-color-text-muted);
806
+ font-size: var(--df-font-size-xs);
807
+ letter-spacing: var(--df-letter-spacing-normal);
808
+ cursor: pointer;
809
+ transition: border-color var(--df-duration-fast), background var(--df-duration-fast);
810
+ }
811
+
812
+ .page-kanban .attachment-drop-zone:hover,
813
+ .page-kanban .attachment-drop-zone.drag-over {
814
+ border-color: var(--df-color-accent-default);
815
+ background: color-mix(in srgb, var(--df-color-accent-default) 4%, transparent);
816
+ }
817
+
818
+ .page-kanban .attachment-pending {
819
+ border-style: dashed;
820
+ border-color: var(--df-color-accent-muted);
821
+ }
822
+
823
+ .page-kanban .attachment-pending img { opacity: 0.7; }
824
+
825
+ /* ── Labels ──────────────────────────────────────────────────────────────── */
826
+
827
+ .page-kanban .labels-list {
828
+ display: flex;
829
+ gap: var(--df-space-2);
830
+ flex-wrap: wrap;
831
+ }
832
+
833
+ .page-kanban .label-badge {
834
+ display: inline-flex;
835
+ align-items: center;
836
+ gap: var(--df-space-1);
837
+ font-size: var(--df-font-size-xs);
838
+ font-family: var(--df-font-mono);
839
+ letter-spacing: var(--df-letter-spacing-wide);
840
+ text-transform: uppercase;
841
+ padding: 2px 8px;
842
+ background: var(--df-color-bg-overlay);
843
+ border: 1px solid var(--df-color-border-default);
844
+ clip-path: var(--df-clip-sm);
845
+ color: var(--df-color-text-primary);
846
+ }
847
+
848
+ .page-kanban .label-remove {
849
+ background: none;
850
+ border: none;
851
+ color: var(--df-color-text-muted);
852
+ font-size: var(--df-font-size-xs);
853
+ cursor: pointer;
854
+ padding: 0;
855
+ line-height: 1;
856
+ transition: color var(--df-duration-fast);
857
+ }
858
+
859
+ .page-kanban .label-remove:hover { color: var(--df-color-state-error); }
860
+
861
+ .page-kanban .label-input-row {
862
+ display: flex;
863
+ gap: var(--df-space-2);
864
+ }
865
+
866
+ .page-kanban .label-input-row input { flex: 1; }
867
+
868
+ /* ── Image Preview Overlay ───────────────────────────────────────────────── */
869
+
870
+ .page-kanban .image-preview-overlay {
871
+ position: fixed;
872
+ inset: 0;
873
+ background: color-mix(in srgb, var(--df-color-bg-base) 90%, transparent);
874
+ display: flex;
875
+ align-items: center;
876
+ justify-content: center;
877
+ z-index: 500;
878
+ padding: var(--df-space-8);
879
+ cursor: zoom-out;
880
+ }
881
+
882
+ .page-kanban .image-preview-overlay img {
883
+ max-width: 100%;
884
+ max-height: 100%;
885
+ object-fit: contain;
886
+ border: 1px solid var(--df-color-border-default);
887
+ }
888
+
889
+ .page-kanban .image-preview-close {
890
+ position: absolute;
891
+ top: var(--df-space-4);
892
+ right: var(--df-space-4);
893
+ background: var(--df-color-bg-surface);
894
+ border: 1px solid var(--df-color-border-default);
895
+ color: var(--df-color-text-primary);
896
+ font-size: var(--df-font-size-xl);
897
+ width: 36px;
898
+ height: 36px;
899
+ display: flex;
900
+ align-items: center;
901
+ justify-content: center;
902
+ cursor: pointer;
903
+ clip-path: var(--df-clip-sm);
904
+ transition: color var(--df-duration-fast), border-color var(--df-duration-fast);
905
+ }
906
+
907
+ .page-kanban .image-preview-close:hover {
908
+ color: var(--df-color-accent-default);
909
+ border-color: var(--df-color-accent-default);
910
+ }
911
+
912
+ /* ── Versioned Entries ───────────────────────────────────────────────────── */
913
+
914
+ .page-kanban .versioned-columns {
915
+ display: grid;
916
+ grid-template-columns: 1fr 1fr;
917
+ gap: var(--df-space-4);
918
+ }
919
+
920
+ @media (max-width: 640px) {
921
+ .page-kanban .versioned-columns { grid-template-columns: 1fr; }
922
+ }
923
+
924
+ .page-kanban .versioned-column-header {
925
+ font-size: var(--df-font-size-xs);
926
+ font-weight: 600;
927
+ text-transform: uppercase;
928
+ letter-spacing: var(--df-letter-spacing-wider);
929
+ color: var(--df-color-text-secondary);
930
+ margin-bottom: var(--df-space-2);
931
+ }
932
+
933
+ .page-kanban .versioned-tab-content {
934
+ display: flex;
935
+ flex-direction: column;
936
+ gap: var(--df-space-2);
937
+ }
938
+
939
+ .page-kanban .versioned-entries {
940
+ display: flex;
941
+ flex-direction: column;
942
+ gap: var(--df-space-2);
943
+ }
944
+
945
+ .page-kanban .versioned-entry {
946
+ border: 1px solid var(--df-color-border-default);
947
+ background: var(--df-color-bg-raised);
948
+ padding: var(--df-space-4);
949
+ }
950
+
951
+ .page-kanban .versioned-entry-header {
952
+ display: flex;
953
+ align-items: center;
954
+ gap: var(--df-space-2);
955
+ margin-bottom: var(--df-space-2);
956
+ }
957
+
958
+ .page-kanban .versioned-entry-date {
959
+ font-size: var(--df-font-size-xs);
960
+ color: var(--df-color-text-muted);
961
+ }
962
+
963
+ .page-kanban .versioned-entry-content.markdown-preview {
964
+ min-height: unset;
965
+ border: none;
966
+ background: none;
967
+ padding: var(--df-space-2) var(--df-space-3);
968
+ }
969
+
970
+ .page-kanban .versioned-entries-empty {
971
+ color: var(--df-color-text-muted);
972
+ font-size: var(--df-font-size-xs);
973
+ padding: var(--df-space-5);
974
+ text-align: center;
975
+ border: 1px dashed var(--df-color-border-default);
976
+ }
977
+
978
+ /* ── Loading ─────────────────────────────────────────────────────────────── */
979
+
980
+ .page-kanban .loading {
981
+ display: flex;
982
+ align-items: center;
983
+ justify-content: center;
984
+ height: calc(100vh - 38px);
985
+ color: var(--df-color-text-muted);
986
+ font-size: var(--df-font-size-sm);
987
+ letter-spacing: var(--df-letter-spacing-wider);
988
+ text-transform: uppercase;
989
+ }
990
+
991
+ /* ── Misc ────────────────────────────────────────────────────────────────── */
992
+
993
+ .page-kanban .text-muted { color: var(--df-color-text-muted); }
994
+
995
+ .page-kanban .hidden { display: none !important; }
996
+
997
+ /* ── Scrollbar ───────────────────────────────────────────────────────────── */
998
+
999
+ .page-kanban ::-webkit-scrollbar { width: 6px; height: 6px; }
1000
+ .page-kanban ::-webkit-scrollbar-track { background: transparent; }
1001
+ .page-kanban ::-webkit-scrollbar-thumb { background: var(--df-color-border-default); }
1002
+ .page-kanban ::-webkit-scrollbar-thumb:hover { background: var(--df-color-border-strong); }
1003
+
1004
+ /* ── Responsive ──────────────────────────────────────────────────────────── */
1005
+
1006
+ @media (max-width: 639px) {
1007
+ .page-kanban .board-columns { gap: var(--df-space-3); padding: var(--df-space-3); }
1008
+ .page-kanban .kanban-column { min-width: 200px; }
1009
+ .page-kanban .features-container { padding: var(--df-space-4) var(--df-space-3); }
1010
+ }