@assistkick/create 1.5.0 → 1.7.0
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.
- package/dist/bin/create.js +0 -0
- package/package.json +7 -9
- package/templates/assistkick-product-system/packages/frontend/index.html +3 -0
- package/templates/assistkick-product-system/packages/frontend/package.json +5 -1
- package/templates/assistkick-product-system/packages/frontend/src/App.tsx +16 -7
- package/templates/assistkick-product-system/packages/frontend/src/components/DesignSystemView.tsx +363 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +6 -8
- package/templates/assistkick-product-system/packages/frontend/src/components/KanbanView.tsx +92 -188
- package/templates/assistkick-product-system/packages/frontend/src/components/QaIssueSheet.tsx +11 -20
- package/templates/assistkick-product-system/packages/frontend/src/components/SidePanel.tsx +15 -70
- package/templates/assistkick-product-system/packages/frontend/src/components/Toolbar.tsx +149 -77
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCard.tsx +254 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCardShowcase.tsx +216 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/NavBarSidekick.tsx +163 -0
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useGraph.ts +6 -21
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useProjects.ts +15 -80
- package/templates/assistkick-product-system/packages/frontend/src/routes/CoherenceRoute.tsx +19 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/DashboardLayout.tsx +54 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/DesignSystemRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/GraphRoute.tsx +93 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/KanbanRoute.tsx +30 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/TerminalRoute.tsx +9 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/UsersRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGitModalStore.ts +14 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGraphStore.ts +36 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGraphUIStore.ts +25 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useProjectStore.ts +87 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useQaSheetStore.ts +27 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useSidePanelStore.ts +76 -0
- package/templates/assistkick-product-system/packages/frontend/src/styles/index.css +64 -100
- package/templates/assistkick-product-system/packages/frontend/vite.config.ts +2 -1
- package/templates/assistkick-product-system/packages/shared/lib/graph.ts +11 -5
- package/templates/assistkick-product-system/packages/shared/tools/add_node.ts +4 -11
- package/templates/skills/assistkick-bootstrap/SKILL.md +3 -3
- package/templates/skills/assistkick-code-reviewer/SKILL.md +2 -2
- package/templates/skills/assistkick-debugger/SKILL.md +2 -2
- package/templates/skills/assistkick-developer/SKILL.md +3 -3
- package/templates/skills/assistkick-interview/SKILL.md +2 -2
- package/templates/assistkick-product-system/packages/frontend/package-lock.json +0 -2666
package/dist/bin/create.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistkick/create",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Scaffold assistkick-product-system into any project",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,16 +10,14 @@
|
|
|
10
10
|
"dist",
|
|
11
11
|
"templates"
|
|
12
12
|
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"prepare_templates": "bash scripts/prepare_templates.sh",
|
|
16
|
-
"prepublishOnly": "bash scripts/prepare_templates.sh && pnpm build",
|
|
17
|
-
"publish": "npm publish",
|
|
18
|
-
"test": "tsx --test tests/**/*.test.ts"
|
|
19
|
-
},
|
|
20
13
|
"devDependencies": {
|
|
21
14
|
"@types/node": "^25.3.3",
|
|
22
15
|
"tsx": "^4.21.0",
|
|
23
16
|
"typescript": "^5.9.3"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"prepare_templates": "bash scripts/prepare_templates.sh",
|
|
21
|
+
"test": "tsx --test tests/**/*.test.ts"
|
|
24
22
|
}
|
|
25
|
-
}
|
|
23
|
+
}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
7
10
|
<title>Dev Product System</title>
|
|
8
11
|
</head>
|
|
9
12
|
<body>
|
|
@@ -14,16 +14,20 @@
|
|
|
14
14
|
"@xterm/addon-web-links": "^0.12.0",
|
|
15
15
|
"@xterm/xterm": "^6.0.0",
|
|
16
16
|
"d3": "^7.9.0",
|
|
17
|
+
"lucide-react": "^0.577.0",
|
|
17
18
|
"marked": "^15.0.0",
|
|
18
19
|
"react": "^19.1.0",
|
|
19
20
|
"react-dom": "^19.1.0",
|
|
20
|
-
"react-router-dom": "^7.6.0"
|
|
21
|
+
"react-router-dom": "^7.6.0",
|
|
22
|
+
"zustand": "^5.0.11"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {
|
|
25
|
+
"@tailwindcss/vite": "^4.2.1",
|
|
23
26
|
"@types/d3": "^7.4.3",
|
|
24
27
|
"@types/react": "^19.1.0",
|
|
25
28
|
"@types/react-dom": "^19.1.0",
|
|
26
29
|
"@vitejs/plugin-react": "^4.5.2",
|
|
30
|
+
"tailwindcss": "^4.2.1",
|
|
27
31
|
"typescript": "^5.9.3",
|
|
28
32
|
"vite": "^7.3.1"
|
|
29
33
|
}
|
|
@@ -6,7 +6,13 @@ import { RegisterRoute } from './routes/register';
|
|
|
6
6
|
import { ForgotPasswordRoute } from './routes/forgot_password';
|
|
7
7
|
import { ResetPasswordRoute } from './routes/reset_password';
|
|
8
8
|
import { AcceptInvitationRoute } from './routes/accept_invitation';
|
|
9
|
-
import {
|
|
9
|
+
import { DashboardLayout } from './routes/DashboardLayout';
|
|
10
|
+
import { GraphRoute } from './routes/GraphRoute';
|
|
11
|
+
import { KanbanRoute } from './routes/KanbanRoute';
|
|
12
|
+
import { CoherenceRoute } from './routes/CoherenceRoute';
|
|
13
|
+
import { UsersRoute } from './routes/UsersRoute';
|
|
14
|
+
import { TerminalRoute } from './routes/TerminalRoute';
|
|
15
|
+
import { DesignSystemRoute } from './routes/DesignSystemRoute';
|
|
10
16
|
|
|
11
17
|
export function App() {
|
|
12
18
|
return (
|
|
@@ -17,12 +23,15 @@ export function App() {
|
|
|
17
23
|
<Route path="/reset-password" element={<ResetPasswordRoute />} />
|
|
18
24
|
<Route path="/accept-invitation" element={<AcceptInvitationRoute />} />
|
|
19
25
|
<Route element={<ProtectedRoute />}>
|
|
20
|
-
<Route
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
<Route element={<DashboardLayout />}>
|
|
27
|
+
<Route path="/" element={<Navigate to="/kanban" replace />} />
|
|
28
|
+
<Route path="/graph" element={<GraphRoute />} />
|
|
29
|
+
<Route path="/kanban" element={<KanbanRoute />} />
|
|
30
|
+
<Route path="/coherence" element={<CoherenceRoute />} />
|
|
31
|
+
<Route path="/users" element={<UsersRoute />} />
|
|
32
|
+
<Route path="/terminal" element={<TerminalRoute />} />
|
|
33
|
+
<Route path="/design-system" element={<DesignSystemRoute />} />
|
|
34
|
+
</Route>
|
|
26
35
|
</Route>
|
|
27
36
|
</Routes>
|
|
28
37
|
);
|
package/templates/assistkick-product-system/packages/frontend/src/components/DesignSystemView.tsx
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Columns3, Clock, FileText, Search, Settings } from 'lucide-react';
|
|
3
|
+
import { NavBarSidekick } from './ds/NavBarSidekick';
|
|
4
|
+
import type { NavItem as SidekickNavItem } from './ds/NavBarSidekick';
|
|
5
|
+
import { KanbanCardShowcase } from './ds/KanbanCardShowcase';
|
|
6
|
+
|
|
7
|
+
interface DesignSystemViewProps {
|
|
8
|
+
visible: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* ── Collapsible card section ── */
|
|
12
|
+
|
|
13
|
+
function Section({ title, defaultOpen = false, children }: {
|
|
14
|
+
title: string;
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
children: React.ReactNode;
|
|
17
|
+
}) {
|
|
18
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<section className="mb-5">
|
|
22
|
+
<button
|
|
23
|
+
onClick={() => setOpen(v => !v)}
|
|
24
|
+
className={[
|
|
25
|
+
'flex w-full items-center justify-between',
|
|
26
|
+
'rounded-2xl px-6 py-4',
|
|
27
|
+
'bg-surface-alt border border-edge',
|
|
28
|
+
'cursor-pointer text-left outline-none',
|
|
29
|
+
'transition-colors duration-150 hover:border-content/15',
|
|
30
|
+
].join(' ')}
|
|
31
|
+
>
|
|
32
|
+
<span className="text-[13px] font-bold uppercase tracking-widest text-content">
|
|
33
|
+
{title}
|
|
34
|
+
</span>
|
|
35
|
+
<span
|
|
36
|
+
className="text-[12px] text-content-muted transition-transform duration-200"
|
|
37
|
+
style={{ transform: open ? 'rotate(180deg)' : 'rotate(0deg)' }}
|
|
38
|
+
>
|
|
39
|
+
▾
|
|
40
|
+
</span>
|
|
41
|
+
</button>
|
|
42
|
+
{open && (
|
|
43
|
+
<div className="mt-3 rounded-2xl border border-edge bg-surface-alt p-6">
|
|
44
|
+
{children}
|
|
45
|
+
</div>
|
|
46
|
+
)}
|
|
47
|
+
</section>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* ── Subsection label ── */
|
|
52
|
+
|
|
53
|
+
function SubLabel({ children }: { children: React.ReactNode }) {
|
|
54
|
+
return (
|
|
55
|
+
<h4 className="mb-3 mt-8 text-[11px] font-bold uppercase tracking-widest text-content-muted">
|
|
56
|
+
{children}
|
|
57
|
+
</h4>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* ── Token data ── */
|
|
62
|
+
|
|
63
|
+
const COLOR_TOKENS = [
|
|
64
|
+
{ name: '--bg-primary', token: 'surface', label: 'Surface', desc: 'Page background' },
|
|
65
|
+
{ name: '--bg-secondary', token: 'surface-alt', label: 'Surface Alt', desc: 'Card background' },
|
|
66
|
+
{ name: '--bg-tertiary', token: 'surface-raised', label: 'Surface Raised', desc: 'Raised elements' },
|
|
67
|
+
{ name: '--border-color', token: 'edge', label: 'Edge', desc: 'Borders & dividers' },
|
|
68
|
+
{ name: '--text-primary', token: 'content', label: 'Content', desc: 'Primary text' },
|
|
69
|
+
{ name: '--text-secondary', token: 'content-secondary', label: 'Content 2nd', desc: 'Secondary text' },
|
|
70
|
+
{ name: '--text-muted', token: 'content-muted', label: 'Muted', desc: 'Placeholder text' },
|
|
71
|
+
{ name: '--accent', token: 'accent', label: 'Accent', desc: 'Primary — green' },
|
|
72
|
+
{ name: '--accent-secondary', token: 'accent-secondary', label: 'Accent 2nd', desc: 'Secondary — orange' },
|
|
73
|
+
{ name: '--error-color', token: 'error', label: 'Error', desc: 'Error states' },
|
|
74
|
+
{ name: '--panel-bg', token: 'panel', label: 'Panel', desc: 'Side panel bg' },
|
|
75
|
+
{ name: '--completeness-bg', token: 'completeness-bg', label: 'Progress BG', desc: 'Track' },
|
|
76
|
+
{ name: '--completeness-fill', token: 'completeness-fill', label: 'Progress Fill', desc: 'Fill' },
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
const TYPOGRAPHY_SCALE = [
|
|
80
|
+
{ name: '3xl', size: '28px', weight: '700', element: 'Page title' },
|
|
81
|
+
{ name: '2xl', size: '22px', weight: '600', element: 'Section heading' },
|
|
82
|
+
{ name: 'xl', size: '18px', weight: '600', element: 'Subsection' },
|
|
83
|
+
{ name: 'lg', size: '16px', weight: '500', element: 'Large body' },
|
|
84
|
+
{ name: 'base', size: '14px', weight: '400', element: 'Body text' },
|
|
85
|
+
{ name: 'sm', size: '13px', weight: '400', element: 'Small text' },
|
|
86
|
+
{ name: 'xs', size: '12px', weight: '400', element: 'Caption' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const SPACING_SCALE = [
|
|
90
|
+
{ name: '1', px: 4 },
|
|
91
|
+
{ name: '2', px: 8 },
|
|
92
|
+
{ name: '3', px: 12 },
|
|
93
|
+
{ name: '4', px: 16 },
|
|
94
|
+
{ name: '6', px: 24 },
|
|
95
|
+
{ name: '8', px: 32 },
|
|
96
|
+
{ name: '10', px: 40 },
|
|
97
|
+
{ name: '12', px: 48 },
|
|
98
|
+
{ name: '16', px: 64 },
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
/* ── Demo data ── */
|
|
102
|
+
|
|
103
|
+
const DEMO_SIDEKICK_ITEMS: SidekickNavItem[] = [
|
|
104
|
+
{ id: 'board', label: 'Board', icon: <Columns3 size={14} strokeWidth={2} />, description: 'Kanban board view' },
|
|
105
|
+
{ id: 'timeline', label: 'Timeline', icon: <Clock size={14} strokeWidth={2} />, description: 'Gantt chart & milestones' },
|
|
106
|
+
{ id: 'docs', label: 'Docs', icon: <FileText size={14} strokeWidth={2} />, description: 'Documentation & notes' },
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
/* ── Main ── */
|
|
110
|
+
|
|
111
|
+
export function DesignSystemView({ visible }: DesignSystemViewProps) {
|
|
112
|
+
if (!visible) return null;
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<div className="absolute inset-0 overflow-y-auto bg-surface text-content">
|
|
116
|
+
<div className="px-10 py-14">
|
|
117
|
+
|
|
118
|
+
{/* Page Header */}
|
|
119
|
+
<div className="mb-10">
|
|
120
|
+
<h1 className="text-[32px] font-bold uppercase tracking-tight text-content">
|
|
121
|
+
Design System
|
|
122
|
+
</h1>
|
|
123
|
+
<p className="mt-2 text-[14px] leading-relaxed text-content-secondary">
|
|
124
|
+
Living style guide. Tailwind CSS + CSS custom properties. Toggle theme to see tokens adapt.
|
|
125
|
+
</p>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
{/* ── NavBar Segmented ── */}
|
|
129
|
+
<Section title="Navigation Bar" defaultOpen>
|
|
130
|
+
<p className="mb-5 text-[13px] text-content-muted">
|
|
131
|
+
Segmented control with filled active state and an integrated command palette search.
|
|
132
|
+
Active item gets an accent fill with glow. Press '/' or click to open command palette.
|
|
133
|
+
</p>
|
|
134
|
+
|
|
135
|
+
<div className="rounded-2xl border border-edge overflow-hidden">
|
|
136
|
+
<NavBarSidekick
|
|
137
|
+
items={DEMO_SIDEKICK_ITEMS}
|
|
138
|
+
brand={
|
|
139
|
+
<div className="flex items-center gap-2">
|
|
140
|
+
<div className="flex h-8 w-8 items-center justify-center rounded-lg border border-accent/30 font-bold text-accent">
|
|
141
|
+
<Columns3 size={16} strokeWidth={2} />
|
|
142
|
+
</div>
|
|
143
|
+
<div>
|
|
144
|
+
<div className="text-[12px] font-semibold text-content leading-none">Workspace</div>
|
|
145
|
+
<div className="text-[10px] text-content-muted">Pro plan</div>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
}
|
|
149
|
+
actions={
|
|
150
|
+
<div className="flex items-center gap-1.5">
|
|
151
|
+
<button className="flex h-8 w-8 items-center justify-center rounded-lg border border-edge text-content-muted hover:border-content/20 hover:text-content cursor-pointer outline-none transition-colors">
|
|
152
|
+
<Settings size={14} strokeWidth={2} />
|
|
153
|
+
</button>
|
|
154
|
+
<div className="h-5 w-px bg-edge mx-1" />
|
|
155
|
+
</div>
|
|
156
|
+
}
|
|
157
|
+
trailing={
|
|
158
|
+
<div className="flex items-center gap-1.5">
|
|
159
|
+
<div className="flex h-8 w-8 items-center justify-center rounded-full bg-accent text-[11px] font-bold text-surface">
|
|
160
|
+
VD
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
}
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<SubLabel>Segment States</SubLabel>
|
|
168
|
+
<div className="flex flex-wrap gap-3">
|
|
169
|
+
{[
|
|
170
|
+
{ state: 'Default', label: 'Item', active: false },
|
|
171
|
+
{ state: 'Hover', label: 'Item', active: false, hover: true },
|
|
172
|
+
{ state: 'Active', label: 'Item', active: true },
|
|
173
|
+
].map(({ state, label, active, hover }) => (
|
|
174
|
+
<div key={state} className="rounded-xl border border-edge px-4 py-2.5 text-center min-w-[100px]">
|
|
175
|
+
<div
|
|
176
|
+
className={[
|
|
177
|
+
'inline-flex items-center gap-2 rounded-lg px-3 py-1.5 text-[11px] font-semibold uppercase tracking-wider',
|
|
178
|
+
active
|
|
179
|
+
? 'bg-accent text-surface'
|
|
180
|
+
: hover
|
|
181
|
+
? 'bg-surface-raised text-content'
|
|
182
|
+
: 'text-content-muted',
|
|
183
|
+
].join(' ')}
|
|
184
|
+
style={active ? { boxShadow: '0 2px 8px -2px var(--accent)' } : {}}
|
|
185
|
+
>
|
|
186
|
+
<Columns3 size={12} strokeWidth={2} />
|
|
187
|
+
{label}
|
|
188
|
+
</div>
|
|
189
|
+
<div className="mt-1.5 text-[10px] text-content-muted">{state}</div>
|
|
190
|
+
</div>
|
|
191
|
+
))}
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
<SubLabel>Command Palette</SubLabel>
|
|
195
|
+
<div className="flex flex-wrap gap-3">
|
|
196
|
+
<div className="rounded-xl border border-edge px-4 py-2.5 text-center">
|
|
197
|
+
<div className="flex h-8 items-center gap-2 rounded-lg border border-edge px-3 text-[12px] text-content-muted">
|
|
198
|
+
<Search size={13} strokeWidth={2} />
|
|
199
|
+
Search
|
|
200
|
+
<kbd className="ml-1 rounded border border-edge bg-surface-raised px-1 py-0.5 text-[9px] font-mono text-content-muted">/</kbd>
|
|
201
|
+
</div>
|
|
202
|
+
<div className="mt-1 text-[10px] text-content-muted">Closed</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div className="rounded-xl border border-edge px-4 py-2.5 text-center">
|
|
205
|
+
<div className="flex h-8 items-center gap-2 rounded-lg border border-accent/40 bg-surface px-3 text-[12px] text-content">
|
|
206
|
+
<Search size={13} strokeWidth={2} />
|
|
207
|
+
Search
|
|
208
|
+
<kbd className="ml-1 rounded border border-edge bg-surface-raised px-1 py-0.5 text-[9px] font-mono text-content-muted">/</kbd>
|
|
209
|
+
</div>
|
|
210
|
+
<div className="mt-1 text-[10px] text-content-muted">Open</div>
|
|
211
|
+
</div>
|
|
212
|
+
<div className="rounded-xl border border-edge px-4 py-2.5">
|
|
213
|
+
<div className="rounded-lg border border-edge bg-surface px-3 py-1.5">
|
|
214
|
+
<div className="text-[12px] text-content">doc<span className="animate-pulse text-accent">|</span></div>
|
|
215
|
+
<div className="mt-1.5 flex items-center gap-2 rounded-md bg-accent/10 px-2 py-1 text-[11px] text-accent">
|
|
216
|
+
<FileText size={12} strokeWidth={2} /> Docs
|
|
217
|
+
<span className="text-[10px] text-content-muted">— Documentation & notes</span>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
<div className="mt-1 text-[10px] text-content-muted text-center">With results</div>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</Section>
|
|
224
|
+
|
|
225
|
+
{/* ── Kanban Card ── */}
|
|
226
|
+
<Section title="Kanban Card" defaultOpen>
|
|
227
|
+
<p className="mb-5 text-[13px] text-content-muted">
|
|
228
|
+
Glass aesthetic with gradient accent strips, frosted backdrop, and floating pill badges.
|
|
229
|
+
States: idle, active pipeline, interrupted/rejected, and blocked.
|
|
230
|
+
</p>
|
|
231
|
+
<KanbanCardShowcase />
|
|
232
|
+
</Section>
|
|
233
|
+
|
|
234
|
+
{/* ── Colors ── */}
|
|
235
|
+
<Section title="Color Palette">
|
|
236
|
+
<p className="mb-5 text-[13px] text-content-muted">
|
|
237
|
+
Theme tokens for surfaces, text, accents, and borders. Adapts to light and dark themes.
|
|
238
|
+
</p>
|
|
239
|
+
<div className="grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4">
|
|
240
|
+
{COLOR_TOKENS.map(({ name, token, label, desc }) => (
|
|
241
|
+
<div
|
|
242
|
+
key={name}
|
|
243
|
+
className="overflow-hidden rounded-2xl border border-edge"
|
|
244
|
+
>
|
|
245
|
+
<div
|
|
246
|
+
className="h-16"
|
|
247
|
+
style={{ backgroundColor: `var(${name})` }}
|
|
248
|
+
/>
|
|
249
|
+
<div className="bg-surface-alt px-4 py-3">
|
|
250
|
+
<div className="text-[13px] font-semibold text-content">{label}</div>
|
|
251
|
+
<div className="mt-0.5 font-mono text-[10px] text-accent">{token}</div>
|
|
252
|
+
<div className="mt-0.5 text-[11px] text-content-muted">{desc}</div>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
))}
|
|
256
|
+
</div>
|
|
257
|
+
</Section>
|
|
258
|
+
|
|
259
|
+
{/* ── Typography ── */}
|
|
260
|
+
<Section title="Typography">
|
|
261
|
+
<p className="mb-5 text-[13px] text-content-muted">
|
|
262
|
+
Inter / system-ui. Generous line-heights for comfortable reading.
|
|
263
|
+
</p>
|
|
264
|
+
|
|
265
|
+
<div className="rounded-2xl border border-edge overflow-hidden">
|
|
266
|
+
{TYPOGRAPHY_SCALE.map(({ name, size, weight, element }, i) => (
|
|
267
|
+
<div
|
|
268
|
+
key={name}
|
|
269
|
+
className={[
|
|
270
|
+
'flex items-baseline gap-6 px-5 py-4',
|
|
271
|
+
i > 0 ? 'border-t border-edge' : '',
|
|
272
|
+
].join(' ')}
|
|
273
|
+
>
|
|
274
|
+
<div className="w-14 shrink-0">
|
|
275
|
+
<div className="font-mono text-[10px] font-semibold text-accent">{name}</div>
|
|
276
|
+
<div className="font-mono text-[10px] text-content-muted">{size}</div>
|
|
277
|
+
</div>
|
|
278
|
+
<div className="w-24 shrink-0 text-[11px] text-content-muted uppercase tracking-wide">
|
|
279
|
+
{element}
|
|
280
|
+
</div>
|
|
281
|
+
<div
|
|
282
|
+
className="min-w-0 flex-1 truncate text-content"
|
|
283
|
+
style={{
|
|
284
|
+
fontSize: size,
|
|
285
|
+
fontWeight: Number(weight),
|
|
286
|
+
fontFamily: 'var(--font-system)',
|
|
287
|
+
lineHeight: 1.5,
|
|
288
|
+
}}
|
|
289
|
+
>
|
|
290
|
+
The quick brown fox
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
))}
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
<SubLabel>Weights</SubLabel>
|
|
297
|
+
<div className="flex flex-wrap gap-3">
|
|
298
|
+
{[
|
|
299
|
+
{ label: 'Regular', value: 400 },
|
|
300
|
+
{ label: 'Medium', value: 500 },
|
|
301
|
+
{ label: 'Semibold', value: 600 },
|
|
302
|
+
{ label: 'Bold', value: 700 },
|
|
303
|
+
].map(({ label, value }) => (
|
|
304
|
+
<div
|
|
305
|
+
key={value}
|
|
306
|
+
className="rounded-2xl border border-edge px-5 py-3 text-center"
|
|
307
|
+
>
|
|
308
|
+
<div
|
|
309
|
+
className="text-[16px] text-content"
|
|
310
|
+
style={{ fontWeight: value, fontFamily: 'var(--font-system)' }}
|
|
311
|
+
>
|
|
312
|
+
Aa
|
|
313
|
+
</div>
|
|
314
|
+
<div className="mt-1 text-[10px] uppercase tracking-wider text-content-muted">{label}</div>
|
|
315
|
+
<div className="font-mono text-[10px] text-accent">{value}</div>
|
|
316
|
+
</div>
|
|
317
|
+
))}
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<SubLabel>Monospace</SubLabel>
|
|
321
|
+
<div className="rounded-2xl border border-edge bg-surface px-5 py-4">
|
|
322
|
+
<div className="font-mono text-[13px] leading-relaxed text-content">
|
|
323
|
+
<span className="text-accent">const</span>{' '}graph{' '}={' '}
|
|
324
|
+
<span className="text-accent">await</span>{' '}readGraph(projectId);
|
|
325
|
+
</div>
|
|
326
|
+
<div className="mt-2 font-mono text-[10px] text-content-muted uppercase tracking-wide">
|
|
327
|
+
ui-monospace · SF Mono · Cascadia Code · Fira Code
|
|
328
|
+
</div>
|
|
329
|
+
</div>
|
|
330
|
+
</Section>
|
|
331
|
+
|
|
332
|
+
{/* ── Spacing ── */}
|
|
333
|
+
<Section title="Spacing">
|
|
334
|
+
<p className="mb-5 text-[13px] text-content-muted">
|
|
335
|
+
4px base unit. Tailwind utilities: p-2 = 8px, m-4 = 16px, gap-6 = 24px.
|
|
336
|
+
</p>
|
|
337
|
+
|
|
338
|
+
<div className="flex flex-wrap gap-4">
|
|
339
|
+
{SPACING_SCALE.map(({ name, px }) => (
|
|
340
|
+
<div
|
|
341
|
+
key={name}
|
|
342
|
+
className="flex flex-col items-center gap-2 rounded-2xl border border-edge px-4 py-3"
|
|
343
|
+
style={{ minWidth: '64px' }}
|
|
344
|
+
>
|
|
345
|
+
<div
|
|
346
|
+
className="rounded-lg bg-accent/25"
|
|
347
|
+
style={{ width: `${Math.max(px, 8)}px`, height: `${Math.max(px, 8)}px` }}
|
|
348
|
+
/>
|
|
349
|
+
<div className="font-mono text-[11px] font-semibold text-accent">{name}</div>
|
|
350
|
+
<div className="font-mono text-[10px] text-content-muted">{px}px</div>
|
|
351
|
+
</div>
|
|
352
|
+
))}
|
|
353
|
+
</div>
|
|
354
|
+
</Section>
|
|
355
|
+
|
|
356
|
+
{/* Footer */}
|
|
357
|
+
<div className="mt-6 pb-12 text-center text-[11px] uppercase tracking-widest text-content-muted">
|
|
358
|
+
Toggle theme to preview token adaptation
|
|
359
|
+
</div>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
);
|
|
363
|
+
}
|
package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import React, { useState, useEffect, useCallback } from 'react';
|
|
2
2
|
import { apiClient } from '../api/client';
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
interface GitRepoModalProps {
|
|
6
|
-
project: Project;
|
|
7
|
-
onClose: () => void;
|
|
8
|
-
onProjectUpdated: () => void;
|
|
9
|
-
}
|
|
3
|
+
import { useGitModalStore } from '../stores/useGitModalStore';
|
|
4
|
+
import { useProjectStore } from '../stores/useProjectStore';
|
|
10
5
|
|
|
11
6
|
interface Installation {
|
|
12
7
|
id: number;
|
|
@@ -24,7 +19,10 @@ interface Repo {
|
|
|
24
19
|
|
|
25
20
|
type Tab = 'status' | 'github' | 'url' | 'init';
|
|
26
21
|
|
|
27
|
-
export function GitRepoModal(
|
|
22
|
+
export function GitRepoModal() {
|
|
23
|
+
const project = useGitModalStore((s) => s.project)!;
|
|
24
|
+
const onClose = useGitModalStore((s) => s.close);
|
|
25
|
+
const onProjectUpdated = useProjectStore((s) => s.refetchProjects);
|
|
28
26
|
const [tab, setTab] = useState<Tab>('status');
|
|
29
27
|
const [loading, setLoading] = useState(false);
|
|
30
28
|
const [error, setError] = useState<string | null>(null);
|