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.
Files changed (77) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.js +137 -52
  3. package/package.json +4 -15
  4. package/app/api/agent/execute/route.ts +0 -157
  5. package/app/api/agent/status/route.ts +0 -38
  6. package/app/api/check-api-key/route.ts +0 -12
  7. package/app/api/conversations/[id]/route.ts +0 -35
  8. package/app/api/conversations/route.ts +0 -24
  9. package/app/api/members/[id]/route.ts +0 -37
  10. package/app/api/members/route.ts +0 -12
  11. package/app/api/pm/breakdown/route.ts +0 -142
  12. package/app/api/pm/tickets/route.ts +0 -147
  13. package/app/api/projects/[id]/route.ts +0 -56
  14. package/app/api/projects/active/route.ts +0 -15
  15. package/app/api/projects/route.ts +0 -53
  16. package/app/api/tickets/[id]/logs/route.ts +0 -16
  17. package/app/api/tickets/[id]/route.ts +0 -60
  18. package/app/api/tickets/[id]/work-logs/route.ts +0 -16
  19. package/app/api/tickets/route.ts +0 -37
  20. package/app/design-system/page.tsx +0 -242
  21. package/app/favicon.ico +0 -0
  22. package/app/globals.css +0 -318
  23. package/app/layout.tsx +0 -37
  24. package/app/page.tsx +0 -331
  25. package/components/ThemeProvider.tsx +0 -56
  26. package/components/ThemeToggle.tsx +0 -31
  27. package/components/activity/ActivityLog.tsx +0 -96
  28. package/components/activity/index.ts +0 -1
  29. package/components/kanban/ConversationList.tsx +0 -75
  30. package/components/kanban/ConversationView.tsx +0 -132
  31. package/components/kanban/KanbanBoard.tsx +0 -179
  32. package/components/kanban/KanbanColumn.tsx +0 -80
  33. package/components/kanban/SortableTicket.tsx +0 -58
  34. package/components/kanban/TicketCard.tsx +0 -98
  35. package/components/kanban/TicketModal.tsx +0 -510
  36. package/components/kanban/TicketSidebar.tsx +0 -448
  37. package/components/kanban/index.ts +0 -8
  38. package/components/pm/PMRequestModal.tsx +0 -196
  39. package/components/pm/index.ts +0 -1
  40. package/components/project/ProjectSelector.tsx +0 -211
  41. package/components/project/index.ts +0 -1
  42. package/components/team/MemberCard.tsx +0 -147
  43. package/components/team/TeamPanel.tsx +0 -57
  44. package/components/team/index.ts +0 -2
  45. package/components/ui/ApiKeyModal.tsx +0 -101
  46. package/components/ui/Avatar.tsx +0 -95
  47. package/components/ui/Badge.tsx +0 -59
  48. package/components/ui/Button.tsx +0 -60
  49. package/components/ui/Card.tsx +0 -64
  50. package/components/ui/Input.tsx +0 -41
  51. package/components/ui/Modal.tsx +0 -76
  52. package/components/ui/ResizablePane.tsx +0 -97
  53. package/components/ui/Select.tsx +0 -45
  54. package/components/ui/Textarea.tsx +0 -41
  55. package/components/ui/index.ts +0 -8
  56. package/db/dev.sqlite +0 -0
  57. package/db/dev.sqlite-shm +0 -0
  58. package/db/dev.sqlite-wal +0 -0
  59. package/db/schema-conversations.sql +0 -26
  60. package/db/schema-projects.sql +0 -29
  61. package/db/schema.sql +0 -94
  62. package/lib/agent-jobs.ts +0 -232
  63. package/lib/db.ts +0 -564
  64. package/next.config.ts +0 -10
  65. package/postcss.config.mjs +0 -7
  66. package/public/app-icon.png +0 -0
  67. package/public/file.svg +0 -1
  68. package/public/globe.svg +0 -1
  69. package/public/next.svg +0 -1
  70. package/public/profiles/designer.png +0 -0
  71. package/public/profiles/dev-backend.png +0 -0
  72. package/public/profiles/dev-frontend.png +0 -0
  73. package/public/profiles/pm.png +0 -0
  74. package/public/profiles/qa.png +0 -0
  75. package/public/vercel.svg +0 -1
  76. package/public/window.svg +0 -1
  77. 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
- }