olly-molly 0.1.0 → 0.1.3
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/README.md +3 -3
- package/bin/cli.js +137 -52
- package/package.json +4 -15
- package/app/api/agent/execute/route.ts +0 -157
- package/app/api/agent/status/route.ts +0 -38
- package/app/api/check-api-key/route.ts +0 -12
- package/app/api/conversations/[id]/route.ts +0 -35
- package/app/api/conversations/route.ts +0 -24
- package/app/api/members/[id]/route.ts +0 -37
- package/app/api/members/route.ts +0 -12
- package/app/api/pm/breakdown/route.ts +0 -142
- package/app/api/pm/tickets/route.ts +0 -147
- package/app/api/projects/[id]/route.ts +0 -56
- package/app/api/projects/active/route.ts +0 -15
- package/app/api/projects/route.ts +0 -53
- package/app/api/tickets/[id]/logs/route.ts +0 -16
- package/app/api/tickets/[id]/route.ts +0 -60
- package/app/api/tickets/[id]/work-logs/route.ts +0 -16
- package/app/api/tickets/route.ts +0 -37
- package/app/design-system/page.tsx +0 -242
- package/app/favicon.ico +0 -0
- package/app/globals.css +0 -318
- package/app/layout.tsx +0 -37
- package/app/page.tsx +0 -331
- package/components/ThemeProvider.tsx +0 -56
- package/components/ThemeToggle.tsx +0 -31
- package/components/activity/ActivityLog.tsx +0 -96
- package/components/activity/index.ts +0 -1
- package/components/kanban/ConversationList.tsx +0 -75
- package/components/kanban/ConversationView.tsx +0 -132
- package/components/kanban/KanbanBoard.tsx +0 -179
- package/components/kanban/KanbanColumn.tsx +0 -80
- package/components/kanban/SortableTicket.tsx +0 -58
- package/components/kanban/TicketCard.tsx +0 -98
- package/components/kanban/TicketModal.tsx +0 -510
- package/components/kanban/TicketSidebar.tsx +0 -448
- package/components/kanban/index.ts +0 -8
- package/components/pm/PMRequestModal.tsx +0 -196
- package/components/pm/index.ts +0 -1
- package/components/project/ProjectSelector.tsx +0 -211
- package/components/project/index.ts +0 -1
- package/components/team/MemberCard.tsx +0 -147
- package/components/team/TeamPanel.tsx +0 -57
- package/components/team/index.ts +0 -2
- package/components/ui/ApiKeyModal.tsx +0 -101
- package/components/ui/Avatar.tsx +0 -95
- package/components/ui/Badge.tsx +0 -59
- package/components/ui/Button.tsx +0 -60
- package/components/ui/Card.tsx +0 -64
- package/components/ui/Input.tsx +0 -41
- package/components/ui/Modal.tsx +0 -76
- package/components/ui/ResizablePane.tsx +0 -97
- package/components/ui/Select.tsx +0 -45
- package/components/ui/Textarea.tsx +0 -41
- package/components/ui/index.ts +0 -8
- package/db/dev.sqlite +0 -0
- package/db/dev.sqlite-shm +0 -0
- package/db/dev.sqlite-wal +0 -0
- package/db/schema-conversations.sql +0 -26
- package/db/schema-projects.sql +0 -29
- package/db/schema.sql +0 -94
- package/lib/agent-jobs.ts +0 -232
- package/lib/db.ts +0 -564
- package/next.config.ts +0 -10
- package/postcss.config.mjs +0 -7
- package/public/app-icon.png +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/next.svg +0 -1
- package/public/profiles/designer.png +0 -0
- package/public/profiles/dev-backend.png +0 -0
- package/public/profiles/dev-frontend.png +0 -0
- package/public/profiles/pm.png +0 -0
- package/public/profiles/qa.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/tsconfig.json +0 -34
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useState } from 'react';
|
|
4
|
-
import Image from 'next/image';
|
|
5
|
-
import Link from 'next/link';
|
|
6
|
-
import { Button } from '@/components/ui/Button';
|
|
7
|
-
import { Card, CardHeader, CardContent, CardFooter } from '@/components/ui/Card';
|
|
8
|
-
import { Badge, StatusBadge, PriorityBadge } from '@/components/ui/Badge';
|
|
9
|
-
import { Input } from '@/components/ui/Input';
|
|
10
|
-
import { Textarea } from '@/components/ui/Textarea';
|
|
11
|
-
import { Select } from '@/components/ui/Select';
|
|
12
|
-
import { Modal } from '@/components/ui/Modal';
|
|
13
|
-
import { Avatar } from '@/components/ui/Avatar';
|
|
14
|
-
import { ThemeToggle } from '@/components/ThemeToggle';
|
|
15
|
-
|
|
16
|
-
export default function DesignSystemPage() {
|
|
17
|
-
const [selectValue, setSelectValue] = useState('');
|
|
18
|
-
const [modalOpen, setModalOpen] = useState(false);
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<div className="min-h-screen bg-[var(--bg-primary)]">
|
|
22
|
-
{/* Header */}
|
|
23
|
-
<header className="border-b border-[var(--border-primary)]">
|
|
24
|
-
<div className="max-w-5xl mx-auto px-6 py-4 flex items-center justify-between">
|
|
25
|
-
<div className="flex items-center gap-4">
|
|
26
|
-
<Image
|
|
27
|
-
src="/app-icon.png"
|
|
28
|
-
alt="Olly Molly"
|
|
29
|
-
width={32}
|
|
30
|
-
height={32}
|
|
31
|
-
className="opacity-80"
|
|
32
|
-
/>
|
|
33
|
-
<div>
|
|
34
|
-
<h1 className="text-sm font-medium text-[var(--text-primary)]">Design System</h1>
|
|
35
|
-
<p className="text-xs text-[var(--text-muted)]">Olly Molly</p>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
<div className="flex items-center gap-4">
|
|
39
|
-
<Link href="/" className="text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)]">
|
|
40
|
-
← Back
|
|
41
|
-
</Link>
|
|
42
|
-
<ThemeToggle />
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
</header>
|
|
46
|
-
|
|
47
|
-
<main className="max-w-5xl mx-auto px-6 py-12">
|
|
48
|
-
{/* Intro */}
|
|
49
|
-
<div className="mb-16">
|
|
50
|
-
<h1 className="text-display text-[var(--text-primary)] mb-4">Design System</h1>
|
|
51
|
-
<p className="text-body text-[var(--text-secondary)] max-w-lg">
|
|
52
|
-
Minimal design inspired by fontshare.com. Cream backgrounds, black text, thin borders.
|
|
53
|
-
</p>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
{/* Colors */}
|
|
57
|
-
<section className="mb-16">
|
|
58
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Colors</h2>
|
|
59
|
-
<div className="border-t border-[var(--border-primary)]">
|
|
60
|
-
<ColorRow name="bg-primary" value="#F5F4EE" />
|
|
61
|
-
<ColorRow name="bg-secondary" value="#EFEDE5" />
|
|
62
|
-
<ColorRow name="bg-card" value="#FAFAF7" />
|
|
63
|
-
<ColorRow name="border-primary" value="#E0DED6" />
|
|
64
|
-
<ColorRow name="text-primary" value="#1A1A1A" isText />
|
|
65
|
-
<ColorRow name="text-secondary" value="#4A4A4A" isText />
|
|
66
|
-
<ColorRow name="text-muted" value="#9A9A9A" isText />
|
|
67
|
-
</div>
|
|
68
|
-
</section>
|
|
69
|
-
|
|
70
|
-
{/* Typography */}
|
|
71
|
-
<section className="mb-16">
|
|
72
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Typography</h2>
|
|
73
|
-
<div className="border-t border-[var(--border-primary)] divide-y divide-[var(--border-primary)]">
|
|
74
|
-
<div className="py-4 flex items-baseline justify-between">
|
|
75
|
-
<span className="text-display text-[var(--text-primary)]">Display</span>
|
|
76
|
-
<span className="text-xs text-[var(--text-muted)]">2.5rem / 500</span>
|
|
77
|
-
</div>
|
|
78
|
-
<div className="py-4 flex items-baseline justify-between">
|
|
79
|
-
<span className="text-heading-1 text-[var(--text-primary)]">Heading 1</span>
|
|
80
|
-
<span className="text-xs text-[var(--text-muted)]">1.75rem / 500</span>
|
|
81
|
-
</div>
|
|
82
|
-
<div className="py-4 flex items-baseline justify-between">
|
|
83
|
-
<span className="text-heading-2 text-[var(--text-primary)]">Heading 2</span>
|
|
84
|
-
<span className="text-xs text-[var(--text-muted)]">1.25rem / 500</span>
|
|
85
|
-
</div>
|
|
86
|
-
<div className="py-4 flex items-baseline justify-between">
|
|
87
|
-
<span className="text-body text-[var(--text-primary)]">Body Text</span>
|
|
88
|
-
<span className="text-xs text-[var(--text-muted)]">0.875rem</span>
|
|
89
|
-
</div>
|
|
90
|
-
<div className="py-4 flex items-baseline justify-between">
|
|
91
|
-
<span className="text-caption text-[var(--text-muted)]">CAPTION TEXT</span>
|
|
92
|
-
<span className="text-xs text-[var(--text-muted)]">0.75rem</span>
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</section>
|
|
96
|
-
|
|
97
|
-
{/* Buttons */}
|
|
98
|
-
<section className="mb-16">
|
|
99
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Buttons</h2>
|
|
100
|
-
<div className="border-t border-[var(--border-primary)] py-6">
|
|
101
|
-
<div className="flex flex-wrap items-center gap-4 mb-6">
|
|
102
|
-
<Button variant="primary">Primary</Button>
|
|
103
|
-
<Button variant="secondary">Secondary</Button>
|
|
104
|
-
<Button variant="ghost">Ghost</Button>
|
|
105
|
-
<Button variant="danger">Danger</Button>
|
|
106
|
-
</div>
|
|
107
|
-
<div className="flex flex-wrap items-center gap-4">
|
|
108
|
-
<Button size="sm">Small</Button>
|
|
109
|
-
<Button size="md">Medium</Button>
|
|
110
|
-
<Button size="lg">Large</Button>
|
|
111
|
-
<Button disabled>Disabled</Button>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
</section>
|
|
115
|
-
|
|
116
|
-
{/* Badges */}
|
|
117
|
-
<section className="mb-16">
|
|
118
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Badges</h2>
|
|
119
|
-
<div className="border-t border-[var(--border-primary)] py-6">
|
|
120
|
-
<div className="flex flex-wrap gap-3 mb-4">
|
|
121
|
-
<Badge>Default</Badge>
|
|
122
|
-
<Badge variant="success">Success</Badge>
|
|
123
|
-
<Badge variant="warning">Warning</Badge>
|
|
124
|
-
<Badge variant="danger">Danger</Badge>
|
|
125
|
-
<Badge variant="info">Info</Badge>
|
|
126
|
-
</div>
|
|
127
|
-
<div className="flex flex-wrap gap-3 mb-4">
|
|
128
|
-
<StatusBadge status="TODO" />
|
|
129
|
-
<StatusBadge status="IN_PROGRESS" />
|
|
130
|
-
<StatusBadge status="IN_REVIEW" />
|
|
131
|
-
<StatusBadge status="COMPLETE" />
|
|
132
|
-
</div>
|
|
133
|
-
<div className="flex flex-wrap gap-3">
|
|
134
|
-
<PriorityBadge priority="LOW" />
|
|
135
|
-
<PriorityBadge priority="MEDIUM" />
|
|
136
|
-
<PriorityBadge priority="HIGH" />
|
|
137
|
-
<PriorityBadge priority="CRITICAL" />
|
|
138
|
-
</div>
|
|
139
|
-
</div>
|
|
140
|
-
</section>
|
|
141
|
-
|
|
142
|
-
{/* Cards */}
|
|
143
|
-
<section className="mb-16">
|
|
144
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Cards</h2>
|
|
145
|
-
<div className="border border-[var(--border-primary)]">
|
|
146
|
-
<Card variant="bordered">
|
|
147
|
-
<CardHeader>
|
|
148
|
-
<h3 className="text-sm font-medium text-[var(--text-primary)]">Card Title</h3>
|
|
149
|
-
</CardHeader>
|
|
150
|
-
<CardContent>
|
|
151
|
-
<p className="text-sm text-[var(--text-secondary)]">
|
|
152
|
-
Minimal card with thin borders and no shadows.
|
|
153
|
-
</p>
|
|
154
|
-
</CardContent>
|
|
155
|
-
<CardFooter>
|
|
156
|
-
<div className="flex justify-end gap-3">
|
|
157
|
-
<Button variant="ghost" size="sm">Cancel</Button>
|
|
158
|
-
<Button size="sm">Save</Button>
|
|
159
|
-
</div>
|
|
160
|
-
</CardFooter>
|
|
161
|
-
</Card>
|
|
162
|
-
</div>
|
|
163
|
-
</section>
|
|
164
|
-
|
|
165
|
-
{/* Form Elements */}
|
|
166
|
-
<section className="mb-16">
|
|
167
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Form Elements</h2>
|
|
168
|
-
<div className="border-t border-[var(--border-primary)] py-6 space-y-6 max-w-md">
|
|
169
|
-
<Input label="Input" placeholder="Enter text..." />
|
|
170
|
-
<Input label="With Error" placeholder="Enter text..." error="This field has an error" />
|
|
171
|
-
<Select
|
|
172
|
-
label="Select"
|
|
173
|
-
value={selectValue}
|
|
174
|
-
onChange={setSelectValue}
|
|
175
|
-
placeholder="Choose option..."
|
|
176
|
-
options={[
|
|
177
|
-
{ value: '1', label: 'Option 1' },
|
|
178
|
-
{ value: '2', label: 'Option 2' },
|
|
179
|
-
]}
|
|
180
|
-
/>
|
|
181
|
-
<Textarea label="Textarea" placeholder="Write here..." rows={3} />
|
|
182
|
-
</div>
|
|
183
|
-
</section>
|
|
184
|
-
|
|
185
|
-
{/* Avatars */}
|
|
186
|
-
<section className="mb-16">
|
|
187
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Avatars</h2>
|
|
188
|
-
<div className="border-t border-[var(--border-primary)] py-6">
|
|
189
|
-
<div className="flex items-end gap-6">
|
|
190
|
-
<Avatar name="John Doe" size="sm" />
|
|
191
|
-
<Avatar name="Jane Smith" size="md" />
|
|
192
|
-
<Avatar name="Bob Wilson" size="lg" />
|
|
193
|
-
<Avatar name="PM" emoji="👔" size="md" />
|
|
194
|
-
</div>
|
|
195
|
-
</div>
|
|
196
|
-
</section>
|
|
197
|
-
|
|
198
|
-
{/* Modal */}
|
|
199
|
-
<section className="mb-16">
|
|
200
|
-
<h2 className="text-xs font-medium uppercase tracking-wider text-[var(--text-muted)] mb-6">Modal</h2>
|
|
201
|
-
<div className="border-t border-[var(--border-primary)] py-6">
|
|
202
|
-
<Button onClick={() => setModalOpen(true)}>Open Modal</Button>
|
|
203
|
-
</div>
|
|
204
|
-
</section>
|
|
205
|
-
</main>
|
|
206
|
-
|
|
207
|
-
<Modal isOpen={modalOpen} onClose={() => setModalOpen(false)} title="Modal Title">
|
|
208
|
-
<p className="text-sm text-[var(--text-secondary)] mb-6">
|
|
209
|
-
Minimal modal dialog with thin borders.
|
|
210
|
-
</p>
|
|
211
|
-
<div className="flex justify-end gap-3">
|
|
212
|
-
<Button variant="ghost" onClick={() => setModalOpen(false)}>Cancel</Button>
|
|
213
|
-
<Button onClick={() => setModalOpen(false)}>Confirm</Button>
|
|
214
|
-
</div>
|
|
215
|
-
</Modal>
|
|
216
|
-
|
|
217
|
-
{/* Footer */}
|
|
218
|
-
<footer className="border-t border-[var(--border-primary)] py-8">
|
|
219
|
-
<p className="text-center text-xs text-[var(--text-muted)]">
|
|
220
|
-
Olly Molly Design System
|
|
221
|
-
</p>
|
|
222
|
-
</footer>
|
|
223
|
-
</div>
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function ColorRow({ name, value, isText = false }: { name: string; value: string; isText?: boolean }) {
|
|
228
|
-
return (
|
|
229
|
-
<div className="flex items-center justify-between py-3 border-b border-[var(--border-primary)]">
|
|
230
|
-
<div className="flex items-center gap-4">
|
|
231
|
-
<div
|
|
232
|
-
className={`w-8 h-8 border border-[var(--border-primary)] ${isText ? 'flex items-center justify-center bg-[var(--bg-card)]' : ''}`}
|
|
233
|
-
style={{ backgroundColor: isText ? undefined : value }}
|
|
234
|
-
>
|
|
235
|
-
{isText && <span style={{ color: value }} className="text-sm font-medium">A</span>}
|
|
236
|
-
</div>
|
|
237
|
-
<span className="text-sm text-[var(--text-primary)]">{name}</span>
|
|
238
|
-
</div>
|
|
239
|
-
<span className="text-xs text-[var(--text-muted)] font-mono">{value}</span>
|
|
240
|
-
</div>
|
|
241
|
-
);
|
|
242
|
-
}
|
package/app/favicon.ico
DELETED
|
Binary file
|
package/app/globals.css
DELETED
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
|
|
3
|
-
/* ================================
|
|
4
|
-
DESIGN SYSTEM - Minimal Paper
|
|
5
|
-
Inspired by fontshare.com
|
|
6
|
-
================================ */
|
|
7
|
-
|
|
8
|
-
/* Light theme (default) - Minimal cream aesthetic */
|
|
9
|
-
:root,
|
|
10
|
-
[data-theme="light"] {
|
|
11
|
-
/* Backgrounds - cream/eggshell tones */
|
|
12
|
-
--bg-primary: #F5F4EE;
|
|
13
|
-
--bg-secondary: #EFEDE5;
|
|
14
|
-
--bg-tertiary: #E8E6DC;
|
|
15
|
-
--bg-card: #FAFAF7;
|
|
16
|
-
--bg-card-hover: #F5F4EE;
|
|
17
|
-
--bg-column: #F5F4EE;
|
|
18
|
-
|
|
19
|
-
/* Borders - subtle, thin lines */
|
|
20
|
-
--border-primary: #E0DED6;
|
|
21
|
-
--border-secondary: #D0CEC4;
|
|
22
|
-
--border-accent: #1A1A1A;
|
|
23
|
-
|
|
24
|
-
/* Text - high contrast black/gray */
|
|
25
|
-
--text-primary: #1A1A1A;
|
|
26
|
-
--text-secondary: #4A4A4A;
|
|
27
|
-
--text-tertiary: #7A7A7A;
|
|
28
|
-
--text-muted: #9A9A9A;
|
|
29
|
-
|
|
30
|
-
/* Accent - minimal, just black */
|
|
31
|
-
--accent-primary: #1A1A1A;
|
|
32
|
-
--accent-secondary: #3A3A3A;
|
|
33
|
-
--accent-light: #E0DED6;
|
|
34
|
-
|
|
35
|
-
/* Status colors - muted, minimal */
|
|
36
|
-
--status-todo: #F5F4EE;
|
|
37
|
-
--status-todo-text: #7A7A7A;
|
|
38
|
-
--status-progress: #FFF8E7;
|
|
39
|
-
--status-progress-text: #996B00;
|
|
40
|
-
--status-review: #F5F0FF;
|
|
41
|
-
--status-review-text: #6B4FA0;
|
|
42
|
-
--status-done: #F0F7F0;
|
|
43
|
-
--status-done-text: #2D6A2D;
|
|
44
|
-
|
|
45
|
-
/* Priority colors - subtle */
|
|
46
|
-
--priority-low: #F5F4EE;
|
|
47
|
-
--priority-low-text: #7A7A7A;
|
|
48
|
-
--priority-medium: #FFF8E7;
|
|
49
|
-
--priority-medium-text: #996B00;
|
|
50
|
-
--priority-high: #FFF0F0;
|
|
51
|
-
--priority-high-text: #B03030;
|
|
52
|
-
--priority-critical: #FFE0E0;
|
|
53
|
-
--priority-critical-text: #901010;
|
|
54
|
-
|
|
55
|
-
/* Shadows - minimal to none */
|
|
56
|
-
--shadow-sm: none;
|
|
57
|
-
--shadow-md: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
58
|
-
--shadow-lg: 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
59
|
-
--shadow-card: none;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/* Dark theme - Inverted minimal */
|
|
63
|
-
[data-theme="dark"] {
|
|
64
|
-
/* Backgrounds */
|
|
65
|
-
--bg-primary: #141414;
|
|
66
|
-
--bg-secondary: #1C1C1C;
|
|
67
|
-
--bg-tertiary: #242424;
|
|
68
|
-
--bg-card: #1C1C1C;
|
|
69
|
-
--bg-card-hover: #242424;
|
|
70
|
-
--bg-column: #1C1C1C;
|
|
71
|
-
|
|
72
|
-
/* Borders */
|
|
73
|
-
--border-primary: #2A2A2A;
|
|
74
|
-
--border-secondary: #3A3A3A;
|
|
75
|
-
--border-accent: #FFFFFF;
|
|
76
|
-
|
|
77
|
-
/* Text */
|
|
78
|
-
--text-primary: #F5F4EE;
|
|
79
|
-
--text-secondary: #C0C0C0;
|
|
80
|
-
--text-tertiary: #8A8A8A;
|
|
81
|
-
--text-muted: #5A5A5A;
|
|
82
|
-
|
|
83
|
-
/* Accents */
|
|
84
|
-
--accent-primary: #FFFFFF;
|
|
85
|
-
--accent-secondary: #E0E0E0;
|
|
86
|
-
--accent-light: #2A2A2A;
|
|
87
|
-
|
|
88
|
-
/* Status colors - dark variants */
|
|
89
|
-
--status-todo: #1C1C1C;
|
|
90
|
-
--status-todo-text: #8A8A8A;
|
|
91
|
-
--status-progress: #2A2517;
|
|
92
|
-
--status-progress-text: #E0B030;
|
|
93
|
-
--status-review: #251A2A;
|
|
94
|
-
--status-review-text: #B090E0;
|
|
95
|
-
--status-done: #1A2A1A;
|
|
96
|
-
--status-done-text: #70C070;
|
|
97
|
-
|
|
98
|
-
/* Priority colors - dark variants */
|
|
99
|
-
--priority-low: #1C1C1C;
|
|
100
|
-
--priority-low-text: #8A8A8A;
|
|
101
|
-
--priority-medium: #2A2517;
|
|
102
|
-
--priority-medium-text: #E0B030;
|
|
103
|
-
--priority-high: #2A1717;
|
|
104
|
-
--priority-high-text: #E07070;
|
|
105
|
-
--priority-critical: #3A1A1A;
|
|
106
|
-
--priority-critical-text: #FF8080;
|
|
107
|
-
|
|
108
|
-
/* Shadows */
|
|
109
|
-
--shadow-sm: none;
|
|
110
|
-
--shadow-md: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
111
|
-
--shadow-lg: 0 2px 4px rgba(0, 0, 0, 0.3);
|
|
112
|
-
--shadow-card: none;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/* Tailwind theme integration */
|
|
116
|
-
@theme inline {
|
|
117
|
-
--color-background: var(--bg-primary);
|
|
118
|
-
--color-foreground: var(--text-primary);
|
|
119
|
-
--font-sans: var(--font-geist-sans);
|
|
120
|
-
--font-mono: var(--font-geist-mono);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/* ================================
|
|
124
|
-
BASE STYLES
|
|
125
|
-
================================ */
|
|
126
|
-
|
|
127
|
-
html {
|
|
128
|
-
background-color: var(--bg-primary);
|
|
129
|
-
color: var(--text-primary);
|
|
130
|
-
transition: background-color 0.2s ease, color 0.2s ease;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
body {
|
|
134
|
-
background-color: var(--bg-primary);
|
|
135
|
-
color: var(--text-primary);
|
|
136
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
137
|
-
line-height: 1.6;
|
|
138
|
-
-webkit-font-smoothing: antialiased;
|
|
139
|
-
-moz-osx-font-smoothing: grayscale;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/* ================================
|
|
143
|
-
TYPOGRAPHY SYSTEM
|
|
144
|
-
================================ */
|
|
145
|
-
|
|
146
|
-
.text-display {
|
|
147
|
-
font-size: 2.5rem;
|
|
148
|
-
font-weight: 500;
|
|
149
|
-
line-height: 1.1;
|
|
150
|
-
letter-spacing: -0.03em;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
.text-heading-1 {
|
|
154
|
-
font-size: 1.75rem;
|
|
155
|
-
font-weight: 500;
|
|
156
|
-
line-height: 1.2;
|
|
157
|
-
letter-spacing: -0.02em;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.text-heading-2 {
|
|
161
|
-
font-size: 1.25rem;
|
|
162
|
-
font-weight: 500;
|
|
163
|
-
line-height: 1.3;
|
|
164
|
-
letter-spacing: -0.01em;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
.text-heading-3 {
|
|
168
|
-
font-size: 1rem;
|
|
169
|
-
font-weight: 500;
|
|
170
|
-
line-height: 1.4;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.text-body-lg {
|
|
174
|
-
font-size: 1rem;
|
|
175
|
-
line-height: 1.6;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
.text-body {
|
|
179
|
-
font-size: 0.875rem;
|
|
180
|
-
line-height: 1.6;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
.text-body-sm {
|
|
184
|
-
font-size: 0.8125rem;
|
|
185
|
-
line-height: 1.5;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
.text-caption {
|
|
189
|
-
font-size: 0.75rem;
|
|
190
|
-
line-height: 1.4;
|
|
191
|
-
letter-spacing: 0.01em;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/* ================================
|
|
195
|
-
UTILITY CLASSES
|
|
196
|
-
================================ */
|
|
197
|
-
|
|
198
|
-
/* Background utilities */
|
|
199
|
-
.bg-primary { background-color: var(--bg-primary) !important; }
|
|
200
|
-
.bg-secondary { background-color: var(--bg-secondary) !important; }
|
|
201
|
-
.bg-tertiary { background-color: var(--bg-tertiary) !important; }
|
|
202
|
-
.bg-card { background-color: var(--bg-card) !important; }
|
|
203
|
-
.bg-column { background-color: var(--bg-column) !important; }
|
|
204
|
-
|
|
205
|
-
/* Text utilities */
|
|
206
|
-
.text-primary { color: var(--text-primary) !important; }
|
|
207
|
-
.text-secondary { color: var(--text-secondary) !important; }
|
|
208
|
-
.text-tertiary { color: var(--text-tertiary) !important; }
|
|
209
|
-
.text-muted { color: var(--text-muted) !important; }
|
|
210
|
-
.text-accent { color: var(--accent-primary) !important; }
|
|
211
|
-
|
|
212
|
-
/* Border utilities */
|
|
213
|
-
.border-primary { border-color: var(--border-primary) !important; }
|
|
214
|
-
.border-secondary { border-color: var(--border-secondary) !important; }
|
|
215
|
-
.border-accent { border-color: var(--border-accent) !important; }
|
|
216
|
-
|
|
217
|
-
/* ================================
|
|
218
|
-
SCROLLBAR STYLING
|
|
219
|
-
================================ */
|
|
220
|
-
|
|
221
|
-
::-webkit-scrollbar {
|
|
222
|
-
width: 6px;
|
|
223
|
-
height: 6px;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
::-webkit-scrollbar-track {
|
|
227
|
-
background: transparent;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
::-webkit-scrollbar-thumb {
|
|
231
|
-
background: var(--border-secondary);
|
|
232
|
-
border-radius: 3px;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
::-webkit-scrollbar-thumb:hover {
|
|
236
|
-
background: var(--text-muted);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/* ================================
|
|
240
|
-
ANIMATIONS
|
|
241
|
-
================================ */
|
|
242
|
-
|
|
243
|
-
@keyframes fade-in {
|
|
244
|
-
from { opacity: 0; }
|
|
245
|
-
to { opacity: 1; }
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
@keyframes zoom-in-95 {
|
|
249
|
-
from {
|
|
250
|
-
opacity: 0;
|
|
251
|
-
transform: scale(0.98);
|
|
252
|
-
}
|
|
253
|
-
to {
|
|
254
|
-
opacity: 1;
|
|
255
|
-
transform: scale(1);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
@keyframes slide-up {
|
|
260
|
-
from {
|
|
261
|
-
opacity: 0;
|
|
262
|
-
transform: translateY(4px);
|
|
263
|
-
}
|
|
264
|
-
to {
|
|
265
|
-
opacity: 1;
|
|
266
|
-
transform: translateY(0);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
@keyframes gentle-pulse {
|
|
271
|
-
0%, 100% { opacity: 1; }
|
|
272
|
-
50% { opacity: 0.5; }
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
.animate-in {
|
|
276
|
-
animation-duration: 150ms;
|
|
277
|
-
animation-timing-function: ease-out;
|
|
278
|
-
animation-fill-mode: forwards;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
.fade-in { animation-name: fade-in; }
|
|
282
|
-
.zoom-in-95 { animation-name: zoom-in-95; }
|
|
283
|
-
.slide-up { animation-name: slide-up; }
|
|
284
|
-
.gentle-pulse { animation: gentle-pulse 2s ease-in-out infinite; }
|
|
285
|
-
|
|
286
|
-
/* ================================
|
|
287
|
-
LINE CLAMP
|
|
288
|
-
================================ */
|
|
289
|
-
|
|
290
|
-
.line-clamp-2 {
|
|
291
|
-
display: -webkit-box;
|
|
292
|
-
-webkit-line-clamp: 2;
|
|
293
|
-
-webkit-box-orient: vertical;
|
|
294
|
-
overflow: hidden;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
.line-clamp-3 {
|
|
298
|
-
display: -webkit-box;
|
|
299
|
-
-webkit-line-clamp: 3;
|
|
300
|
-
-webkit-box-orient: vertical;
|
|
301
|
-
overflow: hidden;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/* ================================
|
|
305
|
-
MINIMAL BORDER STYLE
|
|
306
|
-
================================ */
|
|
307
|
-
|
|
308
|
-
.border-thin {
|
|
309
|
-
border-width: 1px;
|
|
310
|
-
border-style: solid;
|
|
311
|
-
border-color: var(--border-primary);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
.divider {
|
|
315
|
-
height: 1px;
|
|
316
|
-
background-color: var(--border-primary);
|
|
317
|
-
width: 100%;
|
|
318
|
-
}
|
package/app/layout.tsx
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Metadata } from "next";
|
|
2
|
-
import { Geist, Geist_Mono } from "next/font/google";
|
|
3
|
-
import "./globals.css";
|
|
4
|
-
import { ThemeProvider } from "@/components/ThemeProvider";
|
|
5
|
-
|
|
6
|
-
const geistSans = Geist({
|
|
7
|
-
variable: "--font-geist-sans",
|
|
8
|
-
subsets: ["latin"],
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
const geistMono = Geist_Mono({
|
|
12
|
-
variable: "--font-geist-mono",
|
|
13
|
-
subsets: ["latin"],
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
export const metadata: Metadata = {
|
|
17
|
-
title: "Olly Molly",
|
|
18
|
-
description: "Manage your AI development team with Olly Molly",
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export default function RootLayout({
|
|
22
|
-
children,
|
|
23
|
-
}: Readonly<{
|
|
24
|
-
children: React.ReactNode;
|
|
25
|
-
}>) {
|
|
26
|
-
return (
|
|
27
|
-
<html lang="en" suppressHydrationWarning>
|
|
28
|
-
<body
|
|
29
|
-
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
|
30
|
-
>
|
|
31
|
-
<ThemeProvider>
|
|
32
|
-
{children}
|
|
33
|
-
</ThemeProvider>
|
|
34
|
-
</body>
|
|
35
|
-
</html>
|
|
36
|
-
);
|
|
37
|
-
}
|