kanban-lite 1.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 (99) hide show
  1. package/.editorconfig +9 -0
  2. package/.github/workflows/ci.yml +59 -0
  3. package/.github/workflows/release.yml +75 -0
  4. package/.prettierignore +6 -0
  5. package/.prettierrc.yaml +4 -0
  6. package/.vscode/extensions.json +3 -0
  7. package/.vscode/launch.json +17 -0
  8. package/.vscode/settings.json +21 -0
  9. package/.vscode/tasks.json +22 -0
  10. package/.vscodeignore +11 -0
  11. package/CHANGELOG.md +184 -0
  12. package/CLAUDE.md +58 -0
  13. package/CONTRIBUTING.md +114 -0
  14. package/LICENSE +22 -0
  15. package/README.md +482 -0
  16. package/SKILL.md +237 -0
  17. package/dist/cli.js +8716 -0
  18. package/dist/extension.js +8463 -0
  19. package/dist/mcp-server.js +1327 -0
  20. package/dist/standalone-webview/icons-Dx9MGYqN.js +180 -0
  21. package/dist/standalone-webview/icons-Dx9MGYqN.js.map +1 -0
  22. package/dist/standalone-webview/index.js +85 -0
  23. package/dist/standalone-webview/index.js.map +1 -0
  24. package/dist/standalone-webview/react-vendor-DkYdDBET.js +25 -0
  25. package/dist/standalone-webview/react-vendor-DkYdDBET.js.map +1 -0
  26. package/dist/standalone-webview/style.css +1 -0
  27. package/dist/standalone.js +7513 -0
  28. package/dist/webview/icons-Dx9MGYqN.js +180 -0
  29. package/dist/webview/icons-Dx9MGYqN.js.map +1 -0
  30. package/dist/webview/index.js +85 -0
  31. package/dist/webview/index.js.map +1 -0
  32. package/dist/webview/react-vendor-DkYdDBET.js +25 -0
  33. package/dist/webview/react-vendor-DkYdDBET.js.map +1 -0
  34. package/dist/webview/style.css +1 -0
  35. package/docs/images/board-overview.png +0 -0
  36. package/docs/images/editor-view.png +0 -0
  37. package/docs/plans/2026-02-20-kanban-json-config-design.md +74 -0
  38. package/docs/plans/2026-02-20-kanban-json-config.md +690 -0
  39. package/eslint.config.mjs +31 -0
  40. package/package.json +161 -0
  41. package/postcss.config.js +6 -0
  42. package/resources/icon-light.png +0 -0
  43. package/resources/icon-light.svg +105 -0
  44. package/resources/icon.png +0 -0
  45. package/resources/icon.svg +105 -0
  46. package/resources/kanban-dark.svg +21 -0
  47. package/resources/kanban-light.svg +21 -0
  48. package/resources/kanban.svg +21 -0
  49. package/src/cli/index.ts +846 -0
  50. package/src/extension/FeatureHeaderProvider.ts +370 -0
  51. package/src/extension/KanbanPanel.ts +973 -0
  52. package/src/extension/SidebarViewProvider.ts +507 -0
  53. package/src/extension/featureFileUtils.ts +82 -0
  54. package/src/extension/index.ts +234 -0
  55. package/src/mcp-server/index.ts +632 -0
  56. package/src/sdk/KanbanSDK.ts +349 -0
  57. package/src/sdk/__tests__/KanbanSDK.test.ts +468 -0
  58. package/src/sdk/__tests__/parser.test.ts +170 -0
  59. package/src/sdk/fileUtils.ts +76 -0
  60. package/src/sdk/index.ts +6 -0
  61. package/src/sdk/parser.ts +70 -0
  62. package/src/sdk/types.ts +15 -0
  63. package/src/shared/config.ts +113 -0
  64. package/src/shared/editorTypes.ts +14 -0
  65. package/src/shared/types.ts +120 -0
  66. package/src/standalone/__tests__/server.integration.test.ts +1916 -0
  67. package/src/standalone/__tests__/webhooks.test.ts +357 -0
  68. package/src/standalone/fileUtils.ts +70 -0
  69. package/src/standalone/index.ts +71 -0
  70. package/src/standalone/server.ts +1046 -0
  71. package/src/standalone/webhooks.ts +135 -0
  72. package/src/webview/App.tsx +469 -0
  73. package/src/webview/assets/main.css +329 -0
  74. package/src/webview/assets/standalone-theme.css +130 -0
  75. package/src/webview/components/ColumnDialog.tsx +119 -0
  76. package/src/webview/components/CreateFeatureDialog.tsx +524 -0
  77. package/src/webview/components/DatePicker.tsx +185 -0
  78. package/src/webview/components/FeatureCard.tsx +186 -0
  79. package/src/webview/components/FeatureEditor.tsx +623 -0
  80. package/src/webview/components/KanbanBoard.tsx +144 -0
  81. package/src/webview/components/KanbanColumn.tsx +159 -0
  82. package/src/webview/components/MarkdownEditor.tsx +291 -0
  83. package/src/webview/components/PrioritySelect.tsx +39 -0
  84. package/src/webview/components/QuickAddInput.tsx +72 -0
  85. package/src/webview/components/SettingsPanel.tsx +284 -0
  86. package/src/webview/components/Toolbar.tsx +175 -0
  87. package/src/webview/components/UndoToast.tsx +70 -0
  88. package/src/webview/index.html +12 -0
  89. package/src/webview/lib/utils.ts +6 -0
  90. package/src/webview/main.tsx +11 -0
  91. package/src/webview/standalone-main.tsx +13 -0
  92. package/src/webview/standalone-shim.ts +132 -0
  93. package/src/webview/standalone.html +12 -0
  94. package/src/webview/store/index.ts +241 -0
  95. package/tailwind.config.js +53 -0
  96. package/tsconfig.json +22 -0
  97. package/vite.config.ts +36 -0
  98. package/vite.standalone.config.ts +62 -0
  99. package/vitest.config.ts +15 -0
package/package.json ADDED
@@ -0,0 +1,161 @@
1
+ {
2
+ "name": "kanban-lite",
3
+ "displayName": "Kanban Lite",
4
+ "description": "A kanban board for your codebase. Features stored as markdown.",
5
+ "version": "1.0.4",
6
+ "publisher": "borgius",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/borgius/kanban-lite"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/borgius/kanban-lite/issues"
14
+ },
15
+ "homepage": "https://github.com/borgius/kanban-lite#readme",
16
+ "icon": "resources/icon.png",
17
+ "galleryBanner": {
18
+ "color": "#1e1e1e",
19
+ "theme": "dark"
20
+ },
21
+ "engines": {
22
+ "vscode": "^1.85.0"
23
+ },
24
+ "categories": [
25
+ "Other",
26
+ "Visualization"
27
+ ],
28
+ "keywords": [
29
+ "kanban",
30
+ "markdown",
31
+ "project management",
32
+ "task management",
33
+ "board"
34
+ ],
35
+ "activationEvents": [
36
+ "onWebviewPanel:kanban-lite.panel",
37
+ "onView:kanban-lite.boardView"
38
+ ],
39
+ "main": "./dist/extension.js",
40
+ "contributes": {
41
+ "viewsContainers": {
42
+ "activitybar": [
43
+ {
44
+ "id": "kanban-lite",
45
+ "title": "Kanban Lite",
46
+ "icon": "resources/kanban.svg"
47
+ }
48
+ ]
49
+ },
50
+ "views": {
51
+ "kanban-lite": [
52
+ {
53
+ "id": "kanban-lite.boardView",
54
+ "name": "Board",
55
+ "type": "webview"
56
+ }
57
+ ]
58
+ },
59
+ "commands": [
60
+ {
61
+ "command": "kanban-lite.open",
62
+ "title": "Open Kanban Board",
63
+ "category": "Kanban Lite",
64
+ "icon": {
65
+ "light": "resources/kanban-light.svg",
66
+ "dark": "resources/kanban-dark.svg"
67
+ }
68
+ },
69
+ {
70
+ "command": "kanban-lite.addFeature",
71
+ "title": "Add Feature",
72
+ "category": "Kanban Lite"
73
+ }
74
+ ],
75
+ "menus": {
76
+ "editor/title/run": [
77
+ {
78
+ "command": "kanban-lite.open",
79
+ "when": "resourceLangId == markdown"
80
+ }
81
+ ]
82
+ }
83
+ },
84
+ "bin": {
85
+ "kanban-md": "./dist/standalone.js",
86
+ "kanban-lite": "./dist/cli.js",
87
+ "kl": "./dist/cli.js",
88
+ "kanban-mcp": "./dist/mcp-server.js"
89
+ },
90
+ "scripts": {
91
+ "publish:all": "vsce publish && ovsx publish",
92
+ "vscode:prepublish": "npm run build",
93
+ "build": "npm run build:extension && npm run build:webview && npm run build:standalone-webview && npm run build:cli && npm run build:mcp",
94
+ "build:cli": "esbuild src/cli/index.ts --bundle --outfile=dist/cli.js --format=cjs --platform=node --banner:js=\"#!/usr/bin/env node\"",
95
+ "build:mcp": "esbuild src/mcp-server/index.ts --bundle --outfile=dist/mcp-server.js --format=cjs --platform=node --external:@modelcontextprotocol/sdk --external:zod --banner:js=\"#!/usr/bin/env node\"",
96
+ "build:extension": "esbuild src/extension/index.ts --bundle --outfile=dist/extension.js --external:vscode --format=cjs --platform=node",
97
+ "build:webview": "vite build",
98
+ "build:standalone": "npm run build:standalone-server && npm run build:standalone-webview",
99
+ "build:standalone-server": "esbuild src/standalone/index.ts --bundle --outfile=dist/standalone.js --format=cjs --platform=node --banner:js=\"#!/usr/bin/env node\"",
100
+ "build:standalone-webview": "vite build --config vite.standalone.config.ts",
101
+ "standalone": "npm run build:standalone && node dist/standalone.js",
102
+ "watch": "concurrently \"npm run watch:extension\" \"npm run watch:webview\"",
103
+ "watch:extension": "esbuild src/extension/index.ts --bundle --outfile=dist/extension.js --external:vscode --format=cjs --platform=node --watch",
104
+ "watch:webview": "vite build --watch",
105
+ "watch:standalone-server": "esbuild src/standalone/index.ts --bundle --outfile=dist/standalone.js --format=cjs --platform=node --banner:js=\"#!/usr/bin/env node\" --watch",
106
+ "dev:standalone-server": "node --watch-path=dist/standalone.js dist/standalone.js --port 3001 --no-browser",
107
+ "dev:standalone-vite": "vite dev --config vite.standalone.config.ts",
108
+ "dev": "npm run build:standalone-server && concurrently \"npm run watch:extension\" \"npm run watch:webview\" \"npm run watch:standalone-server\" \"npm run dev:standalone-server\" \"npm run dev:standalone-vite\"",
109
+ "test": "vitest run",
110
+ "test:watch": "vitest",
111
+ "lint": "eslint src",
112
+ "typecheck": "tsc --noEmit",
113
+ "package": "vsce package --no-dependencies -o releases/",
114
+ "release": "npm version patch && npm run build && npm publish",
115
+ "release:minor": "npm version minor && npm run build && npm publish",
116
+ "release:major": "npm version major && npm run build && npm publish"
117
+ },
118
+ "devDependencies": {
119
+ "@eslint/js": "^9.39.2",
120
+ "@tailwindcss/typography": "^0.5.19",
121
+ "@types/node": "^20.10.0",
122
+ "@types/react": "^18.2.0",
123
+ "@types/react-dom": "^18.2.0",
124
+ "@types/vscode": "^1.85.0",
125
+ "@types/ws": "^8.5.0",
126
+ "@vitejs/plugin-react": "^4.2.0",
127
+ "@vscode/vsce": "^3.7.1",
128
+ "autoprefixer": "^10.4.16",
129
+ "concurrently": "^9.2.1",
130
+ "esbuild": "^0.19.0",
131
+ "eslint": "^9.39.2",
132
+ "eslint-plugin-react": "^7.37.5",
133
+ "eslint-plugin-react-hooks": "^7.0.1",
134
+ "ovsx": "^0.10.8",
135
+ "postcss": "^8.4.32",
136
+ "tailwindcss": "^3.4.0",
137
+ "typescript": "^5.3.0",
138
+ "typescript-eslint": "^8.53.0",
139
+ "vite": "^5.0.0",
140
+ "vitest": "^4.0.18"
141
+ },
142
+ "dependencies": {
143
+ "@modelcontextprotocol/sdk": "^1.12.1",
144
+ "@tiptap/extension-placeholder": "^3.15.3",
145
+ "@tiptap/pm": "^3.15.3",
146
+ "@tiptap/react": "^3.15.3",
147
+ "@tiptap/starter-kit": "^3.15.3",
148
+ "chokidar": "^4.0.0",
149
+ "clsx": "^2.1.1",
150
+ "fractional-indexing": "^3.2.0",
151
+ "lucide-react": "^0.562.0",
152
+ "marked": "^17.0.3",
153
+ "open": "^10.1.0",
154
+ "react": "^18.2.0",
155
+ "react-dom": "^18.2.0",
156
+ "tailwind-merge": "^2.2.0",
157
+ "tiptap-markdown": "^0.9.0",
158
+ "ws": "^8.18.0",
159
+ "zustand": "^5.0.10"
160
+ }
161
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
Binary file
@@ -0,0 +1,105 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#f8fafc"/>
5
+ <stop offset="50%" stop-color="#f1f5f9"/>
6
+ <stop offset="100%" stop-color="#e2e8f0"/>
7
+ </linearGradient>
8
+ <linearGradient id="col1" x1="0%" y1="0%" x2="0%" y2="100%">
9
+ <stop offset="0%" stop-color="#10b981"/>
10
+ <stop offset="100%" stop-color="#059669"/>
11
+ </linearGradient>
12
+ <linearGradient id="col2" x1="0%" y1="0%" x2="0%" y2="100%">
13
+ <stop offset="0%" stop-color="#f59e0b"/>
14
+ <stop offset="100%" stop-color="#d97706"/>
15
+ </linearGradient>
16
+ <linearGradient id="col3" x1="0%" y1="0%" x2="0%" y2="100%">
17
+ <stop offset="0%" stop-color="#ec4899"/>
18
+ <stop offset="100%" stop-color="#db2777"/>
19
+ </linearGradient>
20
+ <linearGradient id="card1" x1="0%" y1="0%" x2="0%" y2="100%">
21
+ <stop offset="0%" stop-color="#d1fae5"/>
22
+ <stop offset="100%" stop-color="#a7f3d0"/>
23
+ </linearGradient>
24
+ <linearGradient id="card2" x1="0%" y1="0%" x2="0%" y2="100%">
25
+ <stop offset="0%" stop-color="#fef3c7"/>
26
+ <stop offset="100%" stop-color="#fde68a"/>
27
+ </linearGradient>
28
+ <linearGradient id="card3" x1="0%" y1="0%" x2="0%" y2="100%">
29
+ <stop offset="0%" stop-color="#fce7f3"/>
30
+ <stop offset="100%" stop-color="#fbcfe8"/>
31
+ </linearGradient>
32
+ <filter id="shadow" x="-10%" y="-10%" width="120%" height="120%">
33
+ <feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#64748b" flood-opacity="0.15"/>
34
+ </filter>
35
+ <clipPath id="squircle-clip">
36
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48"/>
37
+ </clipPath>
38
+ </defs>
39
+
40
+ <!-- Background squircle -->
41
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48" fill="url(#bg)"/>
42
+ <!-- Subtle border -->
43
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.25"/>
44
+
45
+ <g clip-path="url(#squircle-clip)">
46
+ <!-- Subtle grid dots for texture -->
47
+ <g opacity="0.06" fill="#64748b">
48
+ <circle cx="40" cy="40" r="1"/><circle cx="72" cy="40" r="1"/><circle cx="104" cy="40" r="1"/><circle cx="136" cy="40" r="1"/><circle cx="168" cy="40" r="1"/><circle cx="200" cy="40" r="1"/><circle cx="232" cy="40" r="1"/>
49
+ <circle cx="40" cy="72" r="1"/><circle cx="72" cy="72" r="1"/><circle cx="104" cy="72" r="1"/><circle cx="136" cy="72" r="1"/><circle cx="168" cy="72" r="1"/><circle cx="200" cy="72" r="1"/><circle cx="232" cy="72" r="1"/>
50
+ <circle cx="40" cy="104" r="1"/><circle cx="72" cy="104" r="1"/><circle cx="104" cy="104" r="1"/><circle cx="136" cy="104" r="1"/><circle cx="168" cy="104" r="1"/><circle cx="200" cy="104" r="1"/><circle cx="232" cy="104" r="1"/>
51
+ <circle cx="40" cy="136" r="1"/><circle cx="72" cy="136" r="1"/><circle cx="104" cy="136" r="1"/><circle cx="136" cy="136" r="1"/><circle cx="168" cy="136" r="1"/><circle cx="200" cy="136" r="1"/><circle cx="232" cy="136" r="1"/>
52
+ <circle cx="40" cy="168" r="1"/><circle cx="72" cy="168" r="1"/><circle cx="104" cy="168" r="1"/><circle cx="136" cy="168" r="1"/><circle cx="168" cy="168" r="1"/><circle cx="200" cy="168" r="1"/><circle cx="232" cy="168" r="1"/>
53
+ <circle cx="40" cy="200" r="1"/><circle cx="72" cy="200" r="1"/><circle cx="104" cy="200" r="1"/><circle cx="136" cy="200" r="1"/><circle cx="168" cy="200" r="1"/><circle cx="200" cy="200" r="1"/><circle cx="232" cy="200" r="1"/>
54
+ </g>
55
+
56
+ <!-- Column 1: To Do (green) -->
57
+ <g filter="url(#shadow)">
58
+ <rect x="28" y="44" width="60" height="172" rx="10" fill="white" opacity="0.7"/>
59
+ <rect x="34" y="50" width="48" height="5" rx="2.5" fill="url(#col1)"/>
60
+ <rect x="34" y="64" width="48" height="28" rx="6" fill="url(#card1)"/>
61
+ <rect x="40" y="72" width="24" height="3" rx="1.5" fill="#059669" opacity="0.4"/>
62
+ <rect x="40" y="78" width="16" height="3" rx="1.5" fill="#059669" opacity="0.25"/>
63
+ <rect x="34" y="98" width="48" height="28" rx="6" fill="url(#card1)" opacity="0.8"/>
64
+ <rect x="40" y="106" width="20" height="3" rx="1.5" fill="#059669" opacity="0.35"/>
65
+ <rect x="40" y="112" width="28" height="3" rx="1.5" fill="#059669" opacity="0.2"/>
66
+ <rect x="34" y="132" width="48" height="28" rx="6" fill="url(#card1)" opacity="0.6"/>
67
+ <rect x="40" y="140" width="30" height="3" rx="1.5" fill="#059669" opacity="0.3"/>
68
+ <rect x="40" y="146" width="18" height="3" rx="1.5" fill="#059669" opacity="0.18"/>
69
+ </g>
70
+
71
+ <!-- Column 2: In Progress (amber) -->
72
+ <g filter="url(#shadow)">
73
+ <rect x="98" y="36" width="60" height="184" rx="10" fill="white" opacity="0.7"/>
74
+ <rect x="104" y="42" width="48" height="5" rx="2.5" fill="url(#col2)"/>
75
+ <rect x="104" y="56" width="48" height="32" rx="6" fill="url(#card2)"/>
76
+ <rect x="110" y="64" width="28" height="3" rx="1.5" fill="#d97706" opacity="0.4"/>
77
+ <rect x="110" y="70" width="20" height="3" rx="1.5" fill="#d97706" opacity="0.25"/>
78
+ <rect x="110" y="76" width="14" height="3" rx="1.5" fill="#d97706" opacity="0.18"/>
79
+ <rect x="104" y="94" width="48" height="28" rx="6" fill="url(#card2)" opacity="0.8"/>
80
+ <rect x="110" y="102" width="22" height="3" rx="1.5" fill="#d97706" opacity="0.35"/>
81
+ <rect x="110" y="108" width="32" height="3" rx="1.5" fill="#d97706" opacity="0.2"/>
82
+ <g transform="rotate(-3, 128, 148)">
83
+ <rect x="102" y="130" width="52" height="30" rx="6" fill="url(#card2)" stroke="#d97706" stroke-width="1" stroke-opacity="0.2"/>
84
+ <rect x="108" y="138" width="26" height="3" rx="1.5" fill="#d97706" opacity="0.5"/>
85
+ <rect x="108" y="144" width="18" height="3" rx="1.5" fill="#d97706" opacity="0.3"/>
86
+ </g>
87
+ </g>
88
+
89
+ <!-- Column 3: Done (pink) -->
90
+ <g filter="url(#shadow)">
91
+ <rect x="168" y="44" width="60" height="172" rx="10" fill="white" opacity="0.7"/>
92
+ <rect x="174" y="50" width="48" height="5" rx="2.5" fill="url(#col3)"/>
93
+ <rect x="174" y="64" width="48" height="28" rx="6" fill="url(#card3)"/>
94
+ <rect x="180" y="72" width="22" height="3" rx="1.5" fill="#db2777" opacity="0.4"/>
95
+ <rect x="180" y="78" width="30" height="3" rx="1.5" fill="#db2777" opacity="0.25"/>
96
+ <circle cx="211" cy="72" r="5" fill="#db2777" opacity="0.15"/>
97
+ <path d="M208,72 L210,74.5 L214.5,69.5" fill="none" stroke="#db2777" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.6"/>
98
+ <rect x="174" y="98" width="48" height="28" rx="6" fill="url(#card3)" opacity="0.8"/>
99
+ <rect x="180" y="106" width="26" height="3" rx="1.5" fill="#db2777" opacity="0.35"/>
100
+ <rect x="180" y="112" width="16" height="3" rx="1.5" fill="#db2777" opacity="0.2"/>
101
+ <circle cx="211" cy="106" r="5" fill="#db2777" opacity="0.12"/>
102
+ <path d="M208,106 L210,108.5 L214.5,103.5" fill="none" stroke="#db2777" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.4"/>
103
+ </g>
104
+ </g>
105
+ </svg>
Binary file
@@ -0,0 +1,105 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#1e1b4b"/>
5
+ <stop offset="50%" stop-color="#0f172a"/>
6
+ <stop offset="100%" stop-color="#020617"/>
7
+ </linearGradient>
8
+ <linearGradient id="col1" x1="0%" y1="0%" x2="0%" y2="100%">
9
+ <stop offset="0%" stop-color="#34d399"/>
10
+ <stop offset="100%" stop-color="#059669"/>
11
+ </linearGradient>
12
+ <linearGradient id="col2" x1="0%" y1="0%" x2="0%" y2="100%">
13
+ <stop offset="0%" stop-color="#fbbf24"/>
14
+ <stop offset="100%" stop-color="#d97706"/>
15
+ </linearGradient>
16
+ <linearGradient id="col3" x1="0%" y1="0%" x2="0%" y2="100%">
17
+ <stop offset="0%" stop-color="#f472b6"/>
18
+ <stop offset="100%" stop-color="#db2777"/>
19
+ </linearGradient>
20
+ <linearGradient id="card1" x1="0%" y1="0%" x2="0%" y2="100%">
21
+ <stop offset="0%" stop-color="#6ee7b7"/>
22
+ <stop offset="100%" stop-color="#34d399"/>
23
+ </linearGradient>
24
+ <linearGradient id="card2" x1="0%" y1="0%" x2="0%" y2="100%">
25
+ <stop offset="0%" stop-color="#fde68a"/>
26
+ <stop offset="100%" stop-color="#fbbf24"/>
27
+ </linearGradient>
28
+ <linearGradient id="card3" x1="0%" y1="0%" x2="0%" y2="100%">
29
+ <stop offset="0%" stop-color="#f9a8d4"/>
30
+ <stop offset="100%" stop-color="#f472b6"/>
31
+ </linearGradient>
32
+ <filter id="shadow" x="-10%" y="-10%" width="120%" height="120%">
33
+ <feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#000" flood-opacity="0.3"/>
34
+ </filter>
35
+ <clipPath id="squircle-clip">
36
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48"/>
37
+ </clipPath>
38
+ </defs>
39
+
40
+ <!-- Background squircle -->
41
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48" fill="url(#bg)"/>
42
+ <!-- Subtle border -->
43
+ <rect x="4" y="4" width="248" height="248" rx="48" ry="48" fill="none" stroke="white" stroke-width="1" opacity="0.08"/>
44
+
45
+ <g clip-path="url(#squircle-clip)">
46
+ <!-- Subtle grid dots for texture -->
47
+ <g opacity="0.04" fill="white">
48
+ <circle cx="40" cy="40" r="1"/><circle cx="72" cy="40" r="1"/><circle cx="104" cy="40" r="1"/><circle cx="136" cy="40" r="1"/><circle cx="168" cy="40" r="1"/><circle cx="200" cy="40" r="1"/><circle cx="232" cy="40" r="1"/>
49
+ <circle cx="40" cy="72" r="1"/><circle cx="72" cy="72" r="1"/><circle cx="104" cy="72" r="1"/><circle cx="136" cy="72" r="1"/><circle cx="168" cy="72" r="1"/><circle cx="200" cy="72" r="1"/><circle cx="232" cy="72" r="1"/>
50
+ <circle cx="40" cy="104" r="1"/><circle cx="72" cy="104" r="1"/><circle cx="104" cy="104" r="1"/><circle cx="136" cy="104" r="1"/><circle cx="168" cy="104" r="1"/><circle cx="200" cy="104" r="1"/><circle cx="232" cy="104" r="1"/>
51
+ <circle cx="40" cy="136" r="1"/><circle cx="72" cy="136" r="1"/><circle cx="104" cy="136" r="1"/><circle cx="136" cy="136" r="1"/><circle cx="168" cy="136" r="1"/><circle cx="200" cy="136" r="1"/><circle cx="232" cy="136" r="1"/>
52
+ <circle cx="40" cy="168" r="1"/><circle cx="72" cy="168" r="1"/><circle cx="104" cy="168" r="1"/><circle cx="136" cy="168" r="1"/><circle cx="168" cy="168" r="1"/><circle cx="200" cy="168" r="1"/><circle cx="232" cy="168" r="1"/>
53
+ <circle cx="40" cy="200" r="1"/><circle cx="72" cy="200" r="1"/><circle cx="104" cy="200" r="1"/><circle cx="136" cy="200" r="1"/><circle cx="168" cy="200" r="1"/><circle cx="200" cy="200" r="1"/><circle cx="232" cy="200" r="1"/>
54
+ </g>
55
+
56
+ <!-- Column 1: To Do (green) -->
57
+ <g filter="url(#shadow)">
58
+ <rect x="28" y="44" width="60" height="172" rx="10" fill="white" opacity="0.06"/>
59
+ <rect x="34" y="50" width="48" height="5" rx="2.5" fill="url(#col1)" opacity="0.9"/>
60
+ <rect x="34" y="64" width="48" height="28" rx="6" fill="url(#card1)" opacity="0.85"/>
61
+ <rect x="40" y="72" width="24" height="3" rx="1.5" fill="white" opacity="0.6"/>
62
+ <rect x="40" y="78" width="16" height="3" rx="1.5" fill="white" opacity="0.35"/>
63
+ <rect x="34" y="98" width="48" height="28" rx="6" fill="url(#card1)" opacity="0.65"/>
64
+ <rect x="40" y="106" width="20" height="3" rx="1.5" fill="white" opacity="0.5"/>
65
+ <rect x="40" y="112" width="28" height="3" rx="1.5" fill="white" opacity="0.3"/>
66
+ <rect x="34" y="132" width="48" height="28" rx="6" fill="url(#card1)" opacity="0.45"/>
67
+ <rect x="40" y="140" width="30" height="3" rx="1.5" fill="white" opacity="0.4"/>
68
+ <rect x="40" y="146" width="18" height="3" rx="1.5" fill="white" opacity="0.25"/>
69
+ </g>
70
+
71
+ <!-- Column 2: In Progress (amber) -->
72
+ <g filter="url(#shadow)">
73
+ <rect x="98" y="36" width="60" height="184" rx="10" fill="white" opacity="0.06"/>
74
+ <rect x="104" y="42" width="48" height="5" rx="2.5" fill="url(#col2)" opacity="0.9"/>
75
+ <rect x="104" y="56" width="48" height="32" rx="6" fill="url(#card2)" opacity="0.85"/>
76
+ <rect x="110" y="64" width="28" height="3" rx="1.5" fill="white" opacity="0.6"/>
77
+ <rect x="110" y="70" width="20" height="3" rx="1.5" fill="white" opacity="0.35"/>
78
+ <rect x="110" y="76" width="14" height="3" rx="1.5" fill="white" opacity="0.25"/>
79
+ <rect x="104" y="94" width="48" height="28" rx="6" fill="url(#card2)" opacity="0.65"/>
80
+ <rect x="110" y="102" width="22" height="3" rx="1.5" fill="white" opacity="0.5"/>
81
+ <rect x="110" y="108" width="32" height="3" rx="1.5" fill="white" opacity="0.3"/>
82
+ <g transform="rotate(-3, 128, 148)">
83
+ <rect x="102" y="130" width="52" height="30" rx="6" fill="url(#card2)" opacity="0.9" stroke="white" stroke-width="1" stroke-opacity="0.2"/>
84
+ <rect x="108" y="138" width="26" height="3" rx="1.5" fill="white" opacity="0.7"/>
85
+ <rect x="108" y="144" width="18" height="3" rx="1.5" fill="white" opacity="0.4"/>
86
+ </g>
87
+ </g>
88
+
89
+ <!-- Column 3: Done (pink) -->
90
+ <g filter="url(#shadow)">
91
+ <rect x="168" y="44" width="60" height="172" rx="10" fill="white" opacity="0.06"/>
92
+ <rect x="174" y="50" width="48" height="5" rx="2.5" fill="url(#col3)" opacity="0.9"/>
93
+ <rect x="174" y="64" width="48" height="28" rx="6" fill="url(#card3)" opacity="0.85"/>
94
+ <rect x="180" y="72" width="22" height="3" rx="1.5" fill="white" opacity="0.6"/>
95
+ <rect x="180" y="78" width="30" height="3" rx="1.5" fill="white" opacity="0.35"/>
96
+ <circle cx="211" cy="72" r="5" fill="white" opacity="0.25"/>
97
+ <path d="M208,72 L210,74.5 L214.5,69.5" fill="none" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.7"/>
98
+ <rect x="174" y="98" width="48" height="28" rx="6" fill="url(#card3)" opacity="0.65"/>
99
+ <rect x="180" y="106" width="26" height="3" rx="1.5" fill="white" opacity="0.5"/>
100
+ <rect x="180" y="112" width="16" height="3" rx="1.5" fill="white" opacity="0.3"/>
101
+ <circle cx="211" cy="106" r="5" fill="white" opacity="0.2"/>
102
+ <path d="M208,106 L210,108.5 L214.5,103.5" fill="none" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"/>
103
+ </g>
104
+ </g>
105
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
2
+ <!-- Column 1 (green) -->
3
+ <rect x="2" y="3" width="5.5" height="16" rx="1.2" fill="white" opacity="0.08"/>
4
+ <rect x="2.8" y="3.8" width="3.9" height="0.8" rx="0.4" fill="#34d399"/>
5
+ <rect x="2.8" y="5.5" width="3.9" height="2.8" rx="0.8" fill="#34d399" opacity="0.7"/>
6
+ <rect x="2.8" y="9" width="3.9" height="2.8" rx="0.8" fill="#34d399" opacity="0.5"/>
7
+ <rect x="2.8" y="12.5" width="3.9" height="2.8" rx="0.8" fill="#34d399" opacity="0.35"/>
8
+ <!-- Column 2 (amber) -->
9
+ <rect x="9.25" y="2" width="5.5" height="18" rx="1.2" fill="white" opacity="0.08"/>
10
+ <rect x="10.05" y="2.8" width="3.9" height="0.8" rx="0.4" fill="#fbbf24"/>
11
+ <rect x="10.05" y="4.5" width="3.9" height="3.2" rx="0.8" fill="#fbbf24" opacity="0.7"/>
12
+ <rect x="10.05" y="8.4" width="3.9" height="2.8" rx="0.8" fill="#fbbf24" opacity="0.5"/>
13
+ <g transform="rotate(-3, 12, 14)">
14
+ <rect x="9.85" y="12" width="4.3" height="2.8" rx="0.8" fill="#fbbf24" opacity="0.8" stroke="white" stroke-width="0.3" stroke-opacity="0.3"/>
15
+ </g>
16
+ <!-- Column 3 (pink) -->
17
+ <rect x="16.5" y="3" width="5.5" height="16" rx="1.2" fill="white" opacity="0.08"/>
18
+ <rect x="17.3" y="3.8" width="3.9" height="0.8" rx="0.4" fill="#f472b6"/>
19
+ <rect x="17.3" y="5.5" width="3.9" height="2.8" rx="0.8" fill="#f472b6" opacity="0.7"/>
20
+ <rect x="17.3" y="9" width="3.9" height="2.8" rx="0.8" fill="#f472b6" opacity="0.5"/>
21
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
2
+ <!-- Column 1 (green) -->
3
+ <rect x="2" y="3" width="5.5" height="16" rx="1.2" fill="#64748b" opacity="0.08"/>
4
+ <rect x="2.8" y="3.8" width="3.9" height="0.8" rx="0.4" fill="#059669"/>
5
+ <rect x="2.8" y="5.5" width="3.9" height="2.8" rx="0.8" fill="#059669" opacity="0.6"/>
6
+ <rect x="2.8" y="9" width="3.9" height="2.8" rx="0.8" fill="#059669" opacity="0.4"/>
7
+ <rect x="2.8" y="12.5" width="3.9" height="2.8" rx="0.8" fill="#059669" opacity="0.25"/>
8
+ <!-- Column 2 (amber) -->
9
+ <rect x="9.25" y="2" width="5.5" height="18" rx="1.2" fill="#64748b" opacity="0.08"/>
10
+ <rect x="10.05" y="2.8" width="3.9" height="0.8" rx="0.4" fill="#d97706"/>
11
+ <rect x="10.05" y="4.5" width="3.9" height="3.2" rx="0.8" fill="#d97706" opacity="0.6"/>
12
+ <rect x="10.05" y="8.4" width="3.9" height="2.8" rx="0.8" fill="#d97706" opacity="0.4"/>
13
+ <g transform="rotate(-3, 12, 14)">
14
+ <rect x="9.85" y="12" width="4.3" height="2.8" rx="0.8" fill="#d97706" opacity="0.7" stroke="#d97706" stroke-width="0.3" stroke-opacity="0.3"/>
15
+ </g>
16
+ <!-- Column 3 (pink) -->
17
+ <rect x="16.5" y="3" width="5.5" height="16" rx="1.2" fill="#64748b" opacity="0.08"/>
18
+ <rect x="17.3" y="3.8" width="3.9" height="0.8" rx="0.4" fill="#db2777"/>
19
+ <rect x="17.3" y="5.5" width="3.9" height="2.8" rx="0.8" fill="#db2777" opacity="0.6"/>
20
+ <rect x="17.3" y="9" width="3.9" height="2.8" rx="0.8" fill="#db2777" opacity="0.4"/>
21
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
2
+ <!-- Column 1 -->
3
+ <rect x="2" y="3" width="5.5" height="16" rx="1.2" opacity="0.08"/>
4
+ <rect x="2.8" y="3.8" width="3.9" height="0.8" rx="0.4" opacity="0.9"/>
5
+ <rect x="2.8" y="5.5" width="3.9" height="2.8" rx="0.8" opacity="0.6"/>
6
+ <rect x="2.8" y="9" width="3.9" height="2.8" rx="0.8" opacity="0.4"/>
7
+ <rect x="2.8" y="12.5" width="3.9" height="2.8" rx="0.8" opacity="0.25"/>
8
+ <!-- Column 2 -->
9
+ <rect x="9.25" y="2" width="5.5" height="18" rx="1.2" opacity="0.08"/>
10
+ <rect x="10.05" y="2.8" width="3.9" height="0.8" rx="0.4" opacity="0.9"/>
11
+ <rect x="10.05" y="4.5" width="3.9" height="3.2" rx="0.8" opacity="0.6"/>
12
+ <rect x="10.05" y="8.4" width="3.9" height="2.8" rx="0.8" opacity="0.4"/>
13
+ <g transform="rotate(-3, 12, 14)">
14
+ <rect x="9.85" y="12" width="4.3" height="2.8" rx="0.8" opacity="0.7"/>
15
+ </g>
16
+ <!-- Column 3 -->
17
+ <rect x="16.5" y="3" width="5.5" height="16" rx="1.2" opacity="0.08"/>
18
+ <rect x="17.3" y="3.8" width="3.9" height="0.8" rx="0.4" opacity="0.9"/>
19
+ <rect x="17.3" y="5.5" width="3.9" height="2.8" rx="0.8" opacity="0.6"/>
20
+ <rect x="17.3" y="9" width="3.9" height="2.8" rx="0.8" opacity="0.4"/>
21
+ </svg>