@leanspec/ui-components 0.2.10
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 +244 -0
- package/dist/components/graph/dependency-graph.d.ts +28 -0
- package/dist/components/graph/dependency-graph.d.ts.map +1 -0
- package/dist/components/graph/index.d.ts +3 -0
- package/dist/components/graph/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/layout/empty-state.d.ts +23 -0
- package/dist/components/layout/empty-state.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +3 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/loading-skeletons.d.ts +38 -0
- package/dist/components/layout/loading-skeletons.d.ts.map +1 -0
- package/dist/components/navigation/back-to-top.d.ts +16 -0
- package/dist/components/navigation/back-to-top.d.ts.map +1 -0
- package/dist/components/navigation/index.d.ts +3 -0
- package/dist/components/navigation/index.d.ts.map +1 -0
- package/dist/components/navigation/theme-toggle.d.ts +26 -0
- package/dist/components/navigation/theme-toggle.d.ts.map +1 -0
- package/dist/components/project/index.d.ts +5 -0
- package/dist/components/project/index.d.ts.map +1 -0
- package/dist/components/project/project-avatar.d.ts +18 -0
- package/dist/components/project/project-avatar.d.ts.map +1 -0
- package/dist/components/project/project-card.d.ts +42 -0
- package/dist/components/project/project-card.d.ts.map +1 -0
- package/dist/components/project/project-dialog.d.ts +22 -0
- package/dist/components/project/project-dialog.d.ts.map +1 -0
- package/dist/components/project/project-switcher.d.ts +28 -0
- package/dist/components/project/project-switcher.d.ts.map +1 -0
- package/dist/components/search/filter-select.d.ts +28 -0
- package/dist/components/search/filter-select.d.ts.map +1 -0
- package/dist/components/search/index.d.ts +4 -0
- package/dist/components/search/index.d.ts.map +1 -0
- package/dist/components/search/search-input.d.ts +23 -0
- package/dist/components/search/search-input.d.ts.map +1 -0
- package/dist/components/search/search-results.d.ts +9 -0
- package/dist/components/search/search-results.d.ts.map +1 -0
- package/dist/components/spec/index.d.ts +10 -0
- package/dist/components/spec/index.d.ts.map +1 -0
- package/dist/components/spec/priority-badge.d.ts +33 -0
- package/dist/components/spec/priority-badge.d.ts.map +1 -0
- package/dist/components/spec/priority-editor.d.ts +24 -0
- package/dist/components/spec/priority-editor.d.ts.map +1 -0
- package/dist/components/spec/spec-card.d.ts +20 -0
- package/dist/components/spec/spec-card.d.ts.map +1 -0
- package/dist/components/spec/spec-metadata.d.ts +36 -0
- package/dist/components/spec/spec-metadata.d.ts.map +1 -0
- package/dist/components/spec/spec-timeline.d.ts +22 -0
- package/dist/components/spec/spec-timeline.d.ts.map +1 -0
- package/dist/components/spec/status-badge.d.ts +33 -0
- package/dist/components/spec/status-badge.d.ts.map +1 -0
- package/dist/components/spec/status-editor.d.ts +24 -0
- package/dist/components/spec/status-editor.d.ts.map +1 -0
- package/dist/components/spec/tag-badge.d.ts +30 -0
- package/dist/components/spec/tag-badge.d.ts.map +1 -0
- package/dist/components/spec/tags-editor.d.ts +24 -0
- package/dist/components/spec/tags-editor.d.ts.map +1 -0
- package/dist/components/stats/index.d.ts +4 -0
- package/dist/components/stats/index.d.ts.map +1 -0
- package/dist/components/stats/progress-bar.d.ts +20 -0
- package/dist/components/stats/progress-bar.d.ts.map +1 -0
- package/dist/components/stats/stats-card.d.ts +27 -0
- package/dist/components/stats/stats-card.d.ts.map +1 -0
- package/dist/components/stats/stats-overview.d.ts +36 -0
- package/dist/components/stats/stats-overview.d.ts.map +1 -0
- package/dist/components/ui/avatar.d.ts +19 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/card.d.ts +9 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/command.d.ts +81 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +20 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/index.d.ts +12 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/input.d.ts +6 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/popover.d.ts +7 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/select.d.ts +14 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/separator.d.ts +10 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/skeleton.d.ts +6 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/use-debounce.d.ts +9 -0
- package/dist/hooks/use-debounce.d.ts.map +1 -0
- package/dist/hooks/use-local-storage.d.ts +5 -0
- package/dist/hooks/use-local-storage.d.ts.map +1 -0
- package/dist/index.cjs +33 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10142 -0
- package/dist/lib/color-utils.d.ts +21 -0
- package/dist/lib/color-utils.d.ts.map +1 -0
- package/dist/lib/date-utils.d.ts +21 -0
- package/dist/lib/date-utils.d.ts.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +10 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/specs.d.ts +169 -0
- package/dist/types/specs.d.ts.map +1 -0
- package/dist/ui-components.css +1 -0
- package/package.json +90 -0
package/README.md
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# @leanspec/ui-components
|
|
2
|
+
|
|
3
|
+
Framework-agnostic, tree-shakeable UI components for LeanSpec.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @leanspec/ui-components
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @leanspec/ui-components
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { StatusBadge, PriorityBadge, SpecCard, EmptyState, SearchInput } from '@leanspec/ui-components';
|
|
17
|
+
import '@leanspec/ui-components/styles.css';
|
|
18
|
+
|
|
19
|
+
function MyComponent() {
|
|
20
|
+
return (
|
|
21
|
+
<div>
|
|
22
|
+
<SearchInput placeholder="Search specs..." onSearch={(q) => console.log(q)} />
|
|
23
|
+
<StatusBadge status="in-progress" />
|
|
24
|
+
<PriorityBadge priority="high" />
|
|
25
|
+
<SpecCard
|
|
26
|
+
spec={{
|
|
27
|
+
specNumber: 185,
|
|
28
|
+
specName: 'ui-components',
|
|
29
|
+
title: 'UI Components',
|
|
30
|
+
status: 'in-progress',
|
|
31
|
+
priority: 'high',
|
|
32
|
+
tags: ['ui', 'components'],
|
|
33
|
+
updatedAt: new Date().toISOString(),
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Components
|
|
42
|
+
|
|
43
|
+
### Spec Components
|
|
44
|
+
|
|
45
|
+
- `StatusBadge` - Display spec status with icon
|
|
46
|
+
- `PriorityBadge` - Display spec priority with icon
|
|
47
|
+
- `SpecCard` - Compact spec card for lists
|
|
48
|
+
- `SpecMetadata` - Metadata display card with all spec details
|
|
49
|
+
- `TagBadge` - Display a single tag
|
|
50
|
+
- `TagList` - Display multiple tags with truncation
|
|
51
|
+
|
|
52
|
+
### Project Components
|
|
53
|
+
|
|
54
|
+
- `ProjectAvatar` - Avatar with initials and color from project name
|
|
55
|
+
- `ProjectCard` - Project card with avatar, description, stats, and tags
|
|
56
|
+
- `ProjectSwitcher` - Project switcher dropdown (framework-agnostic with callbacks)
|
|
57
|
+
- `ProjectDialog` - Project creation/edit dialog (framework-agnostic with callbacks)
|
|
58
|
+
|
|
59
|
+
### Stats Components
|
|
60
|
+
|
|
61
|
+
- `StatsCard` - Single stat card with icon and trend indicator
|
|
62
|
+
- `StatsOverview` - Grid of stats cards for project overview
|
|
63
|
+
- `ProgressBar` - Horizontal progress bar with variants
|
|
64
|
+
|
|
65
|
+
### Search & Filter Components
|
|
66
|
+
|
|
67
|
+
- `SearchInput` - Search input with keyboard shortcut hint
|
|
68
|
+
- `FilterSelect` - Dropdown filter component
|
|
69
|
+
- `SearchResults` - Search results grid display
|
|
70
|
+
|
|
71
|
+
### Graph Components
|
|
72
|
+
|
|
73
|
+
- `SpecDependencyGraph` - Interactive dependency graph using ReactFlow (framework-agnostic with callbacks)
|
|
74
|
+
|
|
75
|
+
### Navigation Components
|
|
76
|
+
|
|
77
|
+
- `ThemeToggle` - Light/dark theme toggle button
|
|
78
|
+
- `BackToTop` - Floating scroll-to-top button
|
|
79
|
+
|
|
80
|
+
### UI Components
|
|
81
|
+
|
|
82
|
+
- `Avatar` - Avatar with image and fallback
|
|
83
|
+
- `Badge` - Base badge component with variants
|
|
84
|
+
- `Button` - Button with variants (default, destructive, outline, secondary, ghost, link)
|
|
85
|
+
- `Card` - Card container with header, content, footer
|
|
86
|
+
- `Input` - Form input field
|
|
87
|
+
- `Separator` - Horizontal or vertical divider
|
|
88
|
+
- `Skeleton` - Loading placeholder
|
|
89
|
+
|
|
90
|
+
### Layout Components
|
|
91
|
+
|
|
92
|
+
- `EmptyState` - Empty state placeholder with icon, title, description, action
|
|
93
|
+
- `SpecListSkeleton` - Loading skeleton for spec list
|
|
94
|
+
- `SpecDetailSkeleton` - Loading skeleton for spec detail
|
|
95
|
+
- `StatsCardSkeleton` - Loading skeleton for stats card
|
|
96
|
+
- `KanbanBoardSkeleton` - Loading skeleton for kanban board
|
|
97
|
+
- `ProjectCardSkeleton` - Loading skeleton for project card
|
|
98
|
+
- `SidebarSkeleton` - Loading skeleton for sidebar
|
|
99
|
+
- `ContentSkeleton` - Generic content skeleton
|
|
100
|
+
|
|
101
|
+
## Hooks
|
|
102
|
+
|
|
103
|
+
- `useLocalStorage` - Persist state in localStorage
|
|
104
|
+
- `useDebounce` - Debounce a value
|
|
105
|
+
- `useDebouncedCallback` - Debounce a callback function
|
|
106
|
+
- `useTheme` - Theme state management with localStorage persistence
|
|
107
|
+
|
|
108
|
+
## Utilities
|
|
109
|
+
|
|
110
|
+
- `cn` - Merge Tailwind CSS classes
|
|
111
|
+
- `formatDate` - Format date in readable format
|
|
112
|
+
- `formatDateTime` - Format date with time
|
|
113
|
+
- `formatRelativeTime` - Format relative time (e.g., "2 days ago")
|
|
114
|
+
- `formatDuration` - Format duration between dates
|
|
115
|
+
- `getColorFromString` - Generate consistent color from string
|
|
116
|
+
- `getContrastColor` - Get contrasting text color for background
|
|
117
|
+
- `getInitials` - Get initials from name string
|
|
118
|
+
- `PROJECT_COLORS` - Predefined color palette
|
|
119
|
+
|
|
120
|
+
## Types
|
|
121
|
+
|
|
122
|
+
All spec-related TypeScript types are exported:
|
|
123
|
+
|
|
124
|
+
- `Spec`, `LightweightSpec`, `SidebarSpec`
|
|
125
|
+
- `SpecStatus`, `SpecPriority`
|
|
126
|
+
- `StatsResult`, `DependencyGraph`, etc.
|
|
127
|
+
|
|
128
|
+
## Advanced Usage Examples
|
|
129
|
+
|
|
130
|
+
### Using SpecDependencyGraph
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
import { SpecDependencyGraph } from '@leanspec/ui-components';
|
|
134
|
+
|
|
135
|
+
function MyDependencyView({ relationships, specNumber, specTitle }) {
|
|
136
|
+
return (
|
|
137
|
+
<div style={{ height: '600px' }}>
|
|
138
|
+
<SpecDependencyGraph
|
|
139
|
+
relationships={relationships}
|
|
140
|
+
specNumber={specNumber}
|
|
141
|
+
specTitle={specTitle}
|
|
142
|
+
onNodeClick={(specId) => {
|
|
143
|
+
// Handle navigation to spec
|
|
144
|
+
router.push(`/specs/${specId}`);
|
|
145
|
+
}}
|
|
146
|
+
labels={{
|
|
147
|
+
title: 'Dependencies',
|
|
148
|
+
subtitle: 'Click to navigate',
|
|
149
|
+
}}
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Using ProjectSwitcher
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { ProjectSwitcher } from '@leanspec/ui-components';
|
|
160
|
+
|
|
161
|
+
function MyProjectSwitcher({ currentProject, projects }) {
|
|
162
|
+
return (
|
|
163
|
+
<ProjectSwitcher
|
|
164
|
+
currentProject={currentProject}
|
|
165
|
+
projects={projects}
|
|
166
|
+
onProjectSelect={(projectId) => {
|
|
167
|
+
// Handle project switching
|
|
168
|
+
router.push(`/projects/${projectId}`);
|
|
169
|
+
}}
|
|
170
|
+
onAddProject={() => {
|
|
171
|
+
// Open project creation dialog
|
|
172
|
+
setShowDialog(true);
|
|
173
|
+
}}
|
|
174
|
+
onManageProjects={() => {
|
|
175
|
+
// Navigate to project management
|
|
176
|
+
router.push('/projects');
|
|
177
|
+
}}
|
|
178
|
+
/>
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Using ProjectDialog
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
import { ProjectDialog } from '@leanspec/ui-components';
|
|
187
|
+
|
|
188
|
+
function MyProjectDialog({ open, onOpenChange }) {
|
|
189
|
+
return (
|
|
190
|
+
<ProjectDialog
|
|
191
|
+
open={open}
|
|
192
|
+
onOpenChange={onOpenChange}
|
|
193
|
+
onSubmit={async (path) => {
|
|
194
|
+
// Handle project creation
|
|
195
|
+
await createProject(path);
|
|
196
|
+
onOpenChange(false);
|
|
197
|
+
}}
|
|
198
|
+
onBrowseFolder={async () => {
|
|
199
|
+
// Show native file picker (Tauri/Electron)
|
|
200
|
+
const result = await window.__TAURI__.dialog.open({
|
|
201
|
+
directory: true,
|
|
202
|
+
});
|
|
203
|
+
return result;
|
|
204
|
+
}}
|
|
205
|
+
/>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Using SearchResults
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import { SearchResults } from '@leanspec/ui-components';
|
|
214
|
+
|
|
215
|
+
function MySearch({ query, results, isSearching }) {
|
|
216
|
+
return (
|
|
217
|
+
<SearchResults
|
|
218
|
+
query={query}
|
|
219
|
+
results={results}
|
|
220
|
+
isSearching={isSearching}
|
|
221
|
+
onSpecClick={(specId) => {
|
|
222
|
+
router.push(`/specs/${specId}`);
|
|
223
|
+
}}
|
|
224
|
+
/>
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Development
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Install dependencies
|
|
233
|
+
pnpm install
|
|
234
|
+
|
|
235
|
+
# Build the library
|
|
236
|
+
pnpm build
|
|
237
|
+
|
|
238
|
+
# Run tests
|
|
239
|
+
pnpm test
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## License
|
|
243
|
+
|
|
244
|
+
MIT
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import 'reactflow/dist/style.css';
|
|
2
|
+
import type { CompleteSpecRelationships } from '../../types/specs';
|
|
3
|
+
export interface DependencyGraphProps {
|
|
4
|
+
relationships: CompleteSpecRelationships;
|
|
5
|
+
specNumber?: number | null;
|
|
6
|
+
specTitle: string;
|
|
7
|
+
onNodeClick?: (specId: string) => void;
|
|
8
|
+
labels?: {
|
|
9
|
+
title?: string;
|
|
10
|
+
subtitle?: string;
|
|
11
|
+
badge?: string;
|
|
12
|
+
currentBadge?: string;
|
|
13
|
+
currentSubtitle?: string;
|
|
14
|
+
dependsOnBadge?: string;
|
|
15
|
+
dependsOnSubtitle?: string;
|
|
16
|
+
requiredByBadge?: string;
|
|
17
|
+
requiredBySubtitle?: string;
|
|
18
|
+
completedSubtitle?: string;
|
|
19
|
+
inProgressSubtitle?: string;
|
|
20
|
+
plannedBlockingSubtitle?: string;
|
|
21
|
+
plannedCanProceedSubtitle?: string;
|
|
22
|
+
archivedSubtitle?: string;
|
|
23
|
+
};
|
|
24
|
+
statusLabels?: Record<string, string>;
|
|
25
|
+
priorityLabels?: Record<string, string>;
|
|
26
|
+
}
|
|
27
|
+
export declare function SpecDependencyGraph(props: DependencyGraphProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=dependency-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../../src/components/graph/dependency-graph.tsx"],"names":[],"mappings":"AAcA,OAAO,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,yBAAyB,EAAwB,MAAM,mBAAmB,CAAC;AAyUzF,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,yBAAyB,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,yBAAyB,CAAC,EAAE,MAAM,CAAC;QACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AA0GD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,2CAM9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmptyState component for displaying placeholder content when no data is available
|
|
3
|
+
*/
|
|
4
|
+
import { type LucideIcon } from 'lucide-react';
|
|
5
|
+
export interface EmptyStateAction {
|
|
6
|
+
label: string;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
href?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface EmptyStateProps {
|
|
11
|
+
/** Icon to display */
|
|
12
|
+
icon: LucideIcon;
|
|
13
|
+
/** Title text */
|
|
14
|
+
title: string;
|
|
15
|
+
/** Description text */
|
|
16
|
+
description: string;
|
|
17
|
+
/** Optional action button */
|
|
18
|
+
action?: EmptyStateAction;
|
|
19
|
+
/** Additional CSS classes */
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function EmptyState({ icon: Icon, title, description, action, className }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=empty-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty-state.d.ts","sourceRoot":"","sources":["../../../src/components/layout/empty-state.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,2CA4BhG"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { EmptyState, type EmptyStateProps, type EmptyStateAction } from './empty-state';
|
|
2
|
+
export { SpecListSkeleton, SpecDetailSkeleton, StatsCardSkeleton, KanbanBoardSkeleton, ProjectCardSkeleton, SidebarSkeleton, ContentSkeleton, type ContentSkeletonProps, } from './loading-skeletons';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loading skeleton components for various UI states
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Skeleton for spec list loading state
|
|
6
|
+
*/
|
|
7
|
+
export declare function SpecListSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
/**
|
|
9
|
+
* Skeleton for spec detail loading state
|
|
10
|
+
*/
|
|
11
|
+
export declare function SpecDetailSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/**
|
|
13
|
+
* Skeleton for stats card loading state
|
|
14
|
+
*/
|
|
15
|
+
export declare function StatsCardSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* Skeleton for kanban board loading state
|
|
18
|
+
*/
|
|
19
|
+
export declare function KanbanBoardSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
/**
|
|
21
|
+
* Skeleton for project card loading state
|
|
22
|
+
*/
|
|
23
|
+
export declare function ProjectCardSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
/**
|
|
25
|
+
* Skeleton for sidebar loading state
|
|
26
|
+
*/
|
|
27
|
+
export declare function SidebarSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
/**
|
|
29
|
+
* Generic content skeleton with configurable lines
|
|
30
|
+
*/
|
|
31
|
+
export interface ContentSkeletonProps {
|
|
32
|
+
/** Number of lines to display */
|
|
33
|
+
lines?: number;
|
|
34
|
+
/** Additional CSS classes */
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function ContentSkeleton({ lines, className }: ContentSkeletonProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=loading-skeletons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading-skeletons.d.ts","sourceRoot":"","sources":["../../../src/components/layout/loading-skeletons.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,gBAAgB,4CAyB/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,4CA0CjC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,4CAehC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,4CA2BlC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,4CAkBlC;AAED;;GAEG;AACH,wBAAgB,eAAe,4CAW9B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAS,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAc7E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BackToTop component
|
|
3
|
+
* Floating button that scrolls to the top of the page
|
|
4
|
+
*/
|
|
5
|
+
export interface BackToTopProps {
|
|
6
|
+
/** Scroll threshold before showing button (in pixels) */
|
|
7
|
+
threshold?: number;
|
|
8
|
+
/** Additional CSS classes */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Position from bottom (in pixels or CSS value) */
|
|
11
|
+
bottom?: string | number;
|
|
12
|
+
/** Position from right (in pixels or CSS value) */
|
|
13
|
+
right?: string | number;
|
|
14
|
+
}
|
|
15
|
+
export declare function BackToTop({ threshold, className, bottom, right, }: BackToTopProps): import("react/jsx-runtime").JSX.Element | null;
|
|
16
|
+
//# sourceMappingURL=back-to-top.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"back-to-top.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/back-to-top.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,EACxB,SAAe,EACf,SAAS,EACT,MAAW,EACX,KAAU,GACX,EAAE,cAAc,kDA0ChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Toggle component
|
|
3
|
+
* Switches between light and dark themes
|
|
4
|
+
* Framework-agnostic - no dependency on next-themes
|
|
5
|
+
*/
|
|
6
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
7
|
+
export interface ThemeToggleProps {
|
|
8
|
+
/** Current theme */
|
|
9
|
+
theme?: Theme;
|
|
10
|
+
/** Callback when theme changes */
|
|
11
|
+
onThemeChange?: (theme: Theme) => void;
|
|
12
|
+
/** Additional CSS classes */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** Size variant */
|
|
15
|
+
size?: 'default' | 'sm' | 'lg' | 'icon';
|
|
16
|
+
}
|
|
17
|
+
export declare function ThemeToggle({ theme, onThemeChange, className, size, }: ThemeToggleProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
/**
|
|
19
|
+
* Hook for managing theme state with localStorage persistence
|
|
20
|
+
*/
|
|
21
|
+
export declare function useTheme(defaultTheme?: Theme): {
|
|
22
|
+
theme: Theme;
|
|
23
|
+
setTheme: (newTheme: Theme) => void;
|
|
24
|
+
mounted: boolean;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=theme-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/theme-toggle.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;CACzC;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAe,EACf,aAAa,EACb,SAAS,EACT,IAAa,GACd,EAAE,gBAAgB,2CA8BlB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAE,KAAgB;;yBAiDP,KAAK;;EAKpD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ProjectAvatar, type ProjectAvatarProps } from './project-avatar';
|
|
2
|
+
export { ProjectCard, type ProjectCardProps, type ProjectCardData } from './project-card';
|
|
3
|
+
export { ProjectSwitcher, type ProjectSwitcherProps, type Project } from './project-switcher';
|
|
4
|
+
export { ProjectDialog, type ProjectDialogProps } from './project-dialog';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Avatar Component
|
|
3
|
+
* Displays a project avatar with initials and custom color
|
|
4
|
+
*/
|
|
5
|
+
export interface ProjectAvatarProps {
|
|
6
|
+
/** Project name (used for initials) */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Custom color (hex) - if not provided, will be generated from name */
|
|
9
|
+
color?: string;
|
|
10
|
+
/** Optional icon URL/path */
|
|
11
|
+
icon?: string;
|
|
12
|
+
/** Size variant */
|
|
13
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
14
|
+
/** Additional CSS classes */
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function ProjectAvatar({ name, color, icon, size, className, }: ProjectAvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=project-avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-avatar.d.ts","sourceRoot":"","sources":["../../../src/components/project/project-avatar.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAW,EACX,SAAS,GACV,EAAE,kBAAkB,2CAmBpB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectCard component
|
|
3
|
+
* Displays a project card with avatar, name, description, and stats
|
|
4
|
+
*/
|
|
5
|
+
export interface ProjectCardData {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string | null;
|
|
9
|
+
color?: string | null;
|
|
10
|
+
icon?: string | null;
|
|
11
|
+
favorite?: boolean;
|
|
12
|
+
specsCount?: number;
|
|
13
|
+
updatedAt?: string | Date | null;
|
|
14
|
+
tags?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ProjectCardProps {
|
|
17
|
+
/** Project data to display */
|
|
18
|
+
project: ProjectCardData;
|
|
19
|
+
/** Click handler for the card */
|
|
20
|
+
onClick?: () => void;
|
|
21
|
+
/** Handler for favorite toggle */
|
|
22
|
+
onFavoriteToggle?: (favorite: boolean) => void;
|
|
23
|
+
/** Handler for more options */
|
|
24
|
+
onMoreOptions?: () => void;
|
|
25
|
+
/** Whether the card is currently selected */
|
|
26
|
+
selected?: boolean;
|
|
27
|
+
/** Additional CSS classes */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Locale for date formatting */
|
|
30
|
+
locale?: string;
|
|
31
|
+
/** Labels for localization */
|
|
32
|
+
labels?: {
|
|
33
|
+
specs?: string;
|
|
34
|
+
spec?: string;
|
|
35
|
+
updated?: string;
|
|
36
|
+
noDescription?: string;
|
|
37
|
+
toggleFavorite?: string;
|
|
38
|
+
moreOptions?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export declare function ProjectCard({ project, onClick, onFavoriteToggle, onMoreOptions, selected, className, locale, labels, }: ProjectCardProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
//# sourceMappingURL=project-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-card.d.ts","sourceRoot":"","sources":["../../../src/components/project/project-card.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAWD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,QAAgB,EAChB,SAAS,EACT,MAAM,EACN,MAAW,GACZ,EAAE,gBAAgB,2CAyHlB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ProjectDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (open: boolean) => void;
|
|
4
|
+
onSubmit: (path: string) => Promise<void> | void;
|
|
5
|
+
onBrowseFolder?: () => Promise<string | null>;
|
|
6
|
+
isLoading?: boolean;
|
|
7
|
+
labels?: {
|
|
8
|
+
title?: string;
|
|
9
|
+
descriptionPicker?: string;
|
|
10
|
+
descriptionManual?: string;
|
|
11
|
+
pathLabel?: string;
|
|
12
|
+
pathPlaceholder?: string;
|
|
13
|
+
pathHelp?: string;
|
|
14
|
+
action?: string;
|
|
15
|
+
adding?: string;
|
|
16
|
+
cancel?: string;
|
|
17
|
+
browseFolders?: string;
|
|
18
|
+
enterManually?: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function ProjectDialog({ open, onOpenChange, onSubmit, onBrowseFolder, isLoading, labels, }: ProjectDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=project-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/project/project-dialog.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,SAAiB,EACjB,MAAM,GACP,EAAE,kBAAkB,2CAkHpB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface Project {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
color?: string;
|
|
6
|
+
favorite?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface ProjectSwitcherProps {
|
|
9
|
+
currentProject?: Project | null;
|
|
10
|
+
projects: Project[];
|
|
11
|
+
isLoading?: boolean;
|
|
12
|
+
collapsed?: boolean;
|
|
13
|
+
isSwitching?: boolean;
|
|
14
|
+
onProjectSelect?: (projectId: string) => void;
|
|
15
|
+
onAddProject?: () => void;
|
|
16
|
+
onManageProjects?: () => void;
|
|
17
|
+
labels?: {
|
|
18
|
+
switching?: string;
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
searchPlaceholder?: string;
|
|
21
|
+
noProject?: string;
|
|
22
|
+
projects?: string;
|
|
23
|
+
createProject?: string;
|
|
24
|
+
manageProjects?: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function ProjectSwitcher({ currentProject, projects, isLoading, collapsed, isSwitching, onProjectSelect, onAddProject, onManageProjects, labels, }: ProjectSwitcherProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=project-switcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-switcher.d.ts","sourceRoot":"","sources":["../../../src/components/project/project-switcher.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,EAC9B,cAAc,EACd,QAAQ,EACR,SAAiB,EACjB,SAAiB,EACjB,WAAmB,EACnB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,MAAM,GACP,EAAE,oBAAoB,2CAgJtB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FilterSelect component
|
|
3
|
+
* Simple dropdown for filtering
|
|
4
|
+
*/
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
export interface FilterOption {
|
|
7
|
+
value: string;
|
|
8
|
+
label: string;
|
|
9
|
+
icon?: React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export interface FilterSelectProps {
|
|
12
|
+
/** Current selected value */
|
|
13
|
+
value?: string;
|
|
14
|
+
/** Available options */
|
|
15
|
+
options: FilterOption[];
|
|
16
|
+
/** Callback when selection changes */
|
|
17
|
+
onChange?: (value: string) => void;
|
|
18
|
+
/** Placeholder when no value selected */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** Additional CSS classes */
|
|
21
|
+
className?: string;
|
|
22
|
+
/** Allow clearing selection */
|
|
23
|
+
clearable?: boolean;
|
|
24
|
+
/** Label for clear option */
|
|
25
|
+
clearLabel?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function FilterSelect({ value, options, onChange, placeholder, className, clearable, clearLabel, }: FilterSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=filter-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-select.d.ts","sourceRoot":"","sources":["../../../src/components/search/filter-select.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,WAAyB,EACzB,SAAS,EACT,SAAgB,EAChB,UAAkB,GACnB,EAAE,iBAAiB,2CAiFnB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SearchInput, type SearchInputProps } from './search-input';
|
|
2
|
+
export { FilterSelect, type FilterSelectProps, type FilterOption } from './filter-select';
|
|
3
|
+
export { SearchResults, type SearchResultsProps } from './search-results';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchInput component
|
|
3
|
+
* Input field with search icon and keyboard shortcut hint
|
|
4
|
+
*/
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
export interface SearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {
|
|
7
|
+
/** Current search value */
|
|
8
|
+
value?: string;
|
|
9
|
+
/** Callback when value changes */
|
|
10
|
+
onChange?: (value: string) => void;
|
|
11
|
+
/** Callback when search is submitted (Enter key) */
|
|
12
|
+
onSearch?: (value: string) => void;
|
|
13
|
+
/** Show keyboard shortcut hint */
|
|
14
|
+
showShortcut?: boolean;
|
|
15
|
+
/** Keyboard shortcut key (displayed in hint) */
|
|
16
|
+
shortcutKey?: string;
|
|
17
|
+
/** Show clear button when there's a value */
|
|
18
|
+
clearable?: boolean;
|
|
19
|
+
/** Additional CSS classes for the container */
|
|
20
|
+
containerClassName?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function SearchInput({ value, onChange, onSearch, showShortcut, shortcutKey, clearable, className, containerClassName, placeholder, ...props }: SearchInputProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=search-input.d.ts.map
|