@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.
Files changed (113) hide show
  1. package/README.md +244 -0
  2. package/dist/components/graph/dependency-graph.d.ts +28 -0
  3. package/dist/components/graph/dependency-graph.d.ts.map +1 -0
  4. package/dist/components/graph/index.d.ts +3 -0
  5. package/dist/components/graph/index.d.ts.map +1 -0
  6. package/dist/components/index.d.ts +9 -0
  7. package/dist/components/index.d.ts.map +1 -0
  8. package/dist/components/layout/empty-state.d.ts +23 -0
  9. package/dist/components/layout/empty-state.d.ts.map +1 -0
  10. package/dist/components/layout/index.d.ts +3 -0
  11. package/dist/components/layout/index.d.ts.map +1 -0
  12. package/dist/components/layout/loading-skeletons.d.ts +38 -0
  13. package/dist/components/layout/loading-skeletons.d.ts.map +1 -0
  14. package/dist/components/navigation/back-to-top.d.ts +16 -0
  15. package/dist/components/navigation/back-to-top.d.ts.map +1 -0
  16. package/dist/components/navigation/index.d.ts +3 -0
  17. package/dist/components/navigation/index.d.ts.map +1 -0
  18. package/dist/components/navigation/theme-toggle.d.ts +26 -0
  19. package/dist/components/navigation/theme-toggle.d.ts.map +1 -0
  20. package/dist/components/project/index.d.ts +5 -0
  21. package/dist/components/project/index.d.ts.map +1 -0
  22. package/dist/components/project/project-avatar.d.ts +18 -0
  23. package/dist/components/project/project-avatar.d.ts.map +1 -0
  24. package/dist/components/project/project-card.d.ts +42 -0
  25. package/dist/components/project/project-card.d.ts.map +1 -0
  26. package/dist/components/project/project-dialog.d.ts +22 -0
  27. package/dist/components/project/project-dialog.d.ts.map +1 -0
  28. package/dist/components/project/project-switcher.d.ts +28 -0
  29. package/dist/components/project/project-switcher.d.ts.map +1 -0
  30. package/dist/components/search/filter-select.d.ts +28 -0
  31. package/dist/components/search/filter-select.d.ts.map +1 -0
  32. package/dist/components/search/index.d.ts +4 -0
  33. package/dist/components/search/index.d.ts.map +1 -0
  34. package/dist/components/search/search-input.d.ts +23 -0
  35. package/dist/components/search/search-input.d.ts.map +1 -0
  36. package/dist/components/search/search-results.d.ts +9 -0
  37. package/dist/components/search/search-results.d.ts.map +1 -0
  38. package/dist/components/spec/index.d.ts +10 -0
  39. package/dist/components/spec/index.d.ts.map +1 -0
  40. package/dist/components/spec/priority-badge.d.ts +33 -0
  41. package/dist/components/spec/priority-badge.d.ts.map +1 -0
  42. package/dist/components/spec/priority-editor.d.ts +24 -0
  43. package/dist/components/spec/priority-editor.d.ts.map +1 -0
  44. package/dist/components/spec/spec-card.d.ts +20 -0
  45. package/dist/components/spec/spec-card.d.ts.map +1 -0
  46. package/dist/components/spec/spec-metadata.d.ts +36 -0
  47. package/dist/components/spec/spec-metadata.d.ts.map +1 -0
  48. package/dist/components/spec/spec-timeline.d.ts +22 -0
  49. package/dist/components/spec/spec-timeline.d.ts.map +1 -0
  50. package/dist/components/spec/status-badge.d.ts +33 -0
  51. package/dist/components/spec/status-badge.d.ts.map +1 -0
  52. package/dist/components/spec/status-editor.d.ts +24 -0
  53. package/dist/components/spec/status-editor.d.ts.map +1 -0
  54. package/dist/components/spec/tag-badge.d.ts +30 -0
  55. package/dist/components/spec/tag-badge.d.ts.map +1 -0
  56. package/dist/components/spec/tags-editor.d.ts +24 -0
  57. package/dist/components/spec/tags-editor.d.ts.map +1 -0
  58. package/dist/components/stats/index.d.ts +4 -0
  59. package/dist/components/stats/index.d.ts.map +1 -0
  60. package/dist/components/stats/progress-bar.d.ts +20 -0
  61. package/dist/components/stats/progress-bar.d.ts.map +1 -0
  62. package/dist/components/stats/stats-card.d.ts +27 -0
  63. package/dist/components/stats/stats-card.d.ts.map +1 -0
  64. package/dist/components/stats/stats-overview.d.ts +36 -0
  65. package/dist/components/stats/stats-overview.d.ts.map +1 -0
  66. package/dist/components/ui/avatar.d.ts +19 -0
  67. package/dist/components/ui/avatar.d.ts.map +1 -0
  68. package/dist/components/ui/badge.d.ts +10 -0
  69. package/dist/components/ui/badge.d.ts.map +1 -0
  70. package/dist/components/ui/button.d.ts +12 -0
  71. package/dist/components/ui/button.d.ts.map +1 -0
  72. package/dist/components/ui/card.d.ts +9 -0
  73. package/dist/components/ui/card.d.ts.map +1 -0
  74. package/dist/components/ui/command.d.ts +81 -0
  75. package/dist/components/ui/command.d.ts.map +1 -0
  76. package/dist/components/ui/dialog.d.ts +20 -0
  77. package/dist/components/ui/dialog.d.ts.map +1 -0
  78. package/dist/components/ui/index.d.ts +12 -0
  79. package/dist/components/ui/index.d.ts.map +1 -0
  80. package/dist/components/ui/input.d.ts +6 -0
  81. package/dist/components/ui/input.d.ts.map +1 -0
  82. package/dist/components/ui/popover.d.ts +7 -0
  83. package/dist/components/ui/popover.d.ts.map +1 -0
  84. package/dist/components/ui/select.d.ts +14 -0
  85. package/dist/components/ui/select.d.ts.map +1 -0
  86. package/dist/components/ui/separator.d.ts +10 -0
  87. package/dist/components/ui/separator.d.ts.map +1 -0
  88. package/dist/components/ui/skeleton.d.ts +6 -0
  89. package/dist/components/ui/skeleton.d.ts.map +1 -0
  90. package/dist/hooks/index.d.ts +3 -0
  91. package/dist/hooks/index.d.ts.map +1 -0
  92. package/dist/hooks/use-debounce.d.ts +9 -0
  93. package/dist/hooks/use-debounce.d.ts.map +1 -0
  94. package/dist/hooks/use-local-storage.d.ts +5 -0
  95. package/dist/hooks/use-local-storage.d.ts.map +1 -0
  96. package/dist/index.cjs +33 -0
  97. package/dist/index.d.ts +12 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +10142 -0
  100. package/dist/lib/color-utils.d.ts +21 -0
  101. package/dist/lib/color-utils.d.ts.map +1 -0
  102. package/dist/lib/date-utils.d.ts +21 -0
  103. package/dist/lib/date-utils.d.ts.map +1 -0
  104. package/dist/lib/index.d.ts +4 -0
  105. package/dist/lib/index.d.ts.map +1 -0
  106. package/dist/lib/utils.d.ts +10 -0
  107. package/dist/lib/utils.d.ts.map +1 -0
  108. package/dist/types/index.d.ts +2 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/specs.d.ts +169 -0
  111. package/dist/types/specs.d.ts.map +1 -0
  112. package/dist/ui-components.css +1 -0
  113. 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,3 @@
1
+ export { SpecDependencyGraph } from './dependency-graph';
2
+ export type { DependencyGraphProps } from './dependency-graph';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,9 @@
1
+ export * from './ui';
2
+ export * from './spec';
3
+ export * from './layout';
4
+ export * from './project';
5
+ export * from './navigation';
6
+ export * from './search';
7
+ export * from './stats';
8
+ export * from './graph';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { ThemeToggle, useTheme, type ThemeToggleProps, type Theme } from './theme-toggle';
2
+ export { BackToTop, type BackToTopProps } from './back-to-top';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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