@streamplace/components 0.0.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +35 -0
  3. package/dist/components/chat/chat-box.js +109 -0
  4. package/dist/components/chat/chat-message.js +76 -0
  5. package/dist/components/chat/chat.js +56 -0
  6. package/dist/components/chat/mention-suggestions.js +39 -0
  7. package/dist/components/chat/mod-view.js +33 -0
  8. package/dist/components/mobile-player/fullscreen.js +69 -0
  9. package/dist/components/mobile-player/fullscreen.native.js +151 -0
  10. package/dist/components/mobile-player/player.js +103 -0
  11. package/dist/components/mobile-player/props.js +1 -0
  12. package/dist/components/mobile-player/shared.js +51 -0
  13. package/dist/components/mobile-player/ui/countdown.js +79 -0
  14. package/dist/components/mobile-player/ui/index.js +5 -0
  15. package/dist/components/mobile-player/ui/input.js +38 -0
  16. package/dist/components/mobile-player/ui/metrics.js +40 -0
  17. package/dist/components/mobile-player/ui/streamer-context-menu.js +4 -0
  18. package/dist/components/mobile-player/ui/viewer-context-menu.js +20 -0
  19. package/dist/components/mobile-player/use-webrtc.js +232 -0
  20. package/dist/components/mobile-player/video.js +375 -0
  21. package/dist/components/mobile-player/video.native.js +238 -0
  22. package/dist/components/mobile-player/webrtc-diagnostics.js +106 -0
  23. package/dist/components/mobile-player/webrtc-primitives.js +25 -0
  24. package/dist/components/mobile-player/webrtc-primitives.native.js +1 -0
  25. package/dist/components/ui/button.js +220 -0
  26. package/dist/components/ui/dialog.js +203 -0
  27. package/dist/components/ui/dropdown.js +148 -0
  28. package/dist/components/ui/icons.js +22 -0
  29. package/dist/components/ui/index.js +22 -0
  30. package/dist/components/ui/input.js +202 -0
  31. package/dist/components/ui/loader.js +7 -0
  32. package/dist/components/ui/primitives/button.js +121 -0
  33. package/dist/components/ui/primitives/input.js +202 -0
  34. package/dist/components/ui/primitives/modal.js +203 -0
  35. package/dist/components/ui/primitives/text.js +286 -0
  36. package/dist/components/ui/resizeable.js +101 -0
  37. package/dist/components/ui/text.js +175 -0
  38. package/dist/components/ui/textarea.js +17 -0
  39. package/dist/components/ui/toast.js +129 -0
  40. package/dist/components/ui/view.js +250 -0
  41. package/dist/hooks/index.js +9 -0
  42. package/dist/hooks/useAvatars.js +32 -0
  43. package/dist/hooks/useCameraToggle.js +9 -0
  44. package/dist/hooks/useKeyboard.js +33 -0
  45. package/dist/hooks/useKeyboardSlide.js +11 -0
  46. package/dist/hooks/useLivestreamInfo.js +62 -0
  47. package/dist/hooks/useOuterAndInnerDimensions.js +27 -0
  48. package/dist/hooks/usePlayerDimensions.js +19 -0
  49. package/dist/hooks/useSegmentTiming.js +62 -0
  50. package/dist/index.js +16 -0
  51. package/dist/lib/facet.js +88 -0
  52. package/dist/lib/theme/atoms.js +620 -0
  53. package/dist/lib/theme/atoms.types.js +5 -0
  54. package/dist/lib/theme/index.js +9 -0
  55. package/dist/lib/theme/theme.js +248 -0
  56. package/dist/lib/theme/tokens.js +383 -0
  57. package/dist/lib/utils.js +94 -0
  58. package/dist/livestream-provider/index.js +25 -0
  59. package/dist/livestream-provider/websocket.js +41 -0
  60. package/dist/livestream-store/chat.js +186 -0
  61. package/dist/livestream-store/context.js +2 -0
  62. package/dist/livestream-store/index.js +4 -0
  63. package/dist/livestream-store/livestream-state.js +1 -0
  64. package/dist/livestream-store/livestream-store.js +42 -0
  65. package/dist/livestream-store/stream-key.js +115 -0
  66. package/dist/livestream-store/websocket-consumer.js +55 -0
  67. package/dist/player-store/context.js +2 -0
  68. package/dist/player-store/index.js +6 -0
  69. package/dist/player-store/player-provider.js +52 -0
  70. package/dist/player-store/player-state.js +22 -0
  71. package/dist/player-store/player-store.js +159 -0
  72. package/dist/player-store/single-player-provider.js +109 -0
  73. package/dist/streamplace-provider/context.js +2 -0
  74. package/dist/streamplace-provider/index.js +16 -0
  75. package/dist/streamplace-provider/poller.js +46 -0
  76. package/dist/streamplace-provider/xrpc.js +0 -0
  77. package/dist/streamplace-store/block.js +23 -0
  78. package/dist/streamplace-store/index.js +3 -0
  79. package/dist/streamplace-store/stream.js +193 -0
  80. package/dist/streamplace-store/streamplace-store.js +37 -0
  81. package/dist/streamplace-store/user.js +47 -0
  82. package/dist/streamplace-store/xrpc.js +12 -0
  83. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
  84. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/56540125 +0 -0
  85. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/67b1eb60 +0 -0
  86. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/7c275f90 +0 -0
  87. package/package.json +50 -8
  88. package/src/components/chat/chat-box.tsx +195 -0
  89. package/src/components/chat/chat-message.tsx +192 -0
  90. package/src/components/chat/chat.tsx +128 -0
  91. package/src/components/chat/mention-suggestions.tsx +71 -0
  92. package/src/components/chat/mod-view.tsx +118 -0
  93. package/src/components/mobile-player/fullscreen.native.tsx +193 -0
  94. package/src/components/mobile-player/fullscreen.tsx +79 -0
  95. package/src/components/mobile-player/player.tsx +134 -0
  96. package/src/components/mobile-player/props.tsx +11 -0
  97. package/src/components/mobile-player/shared.tsx +56 -0
  98. package/src/components/mobile-player/ui/countdown.tsx +119 -0
  99. package/src/components/mobile-player/ui/index.ts +5 -0
  100. package/src/components/mobile-player/ui/input.tsx +85 -0
  101. package/src/components/mobile-player/ui/metrics.tsx +69 -0
  102. package/src/components/mobile-player/ui/streamer-context-menu.tsx +3 -0
  103. package/src/components/mobile-player/ui/viewer-context-menu.tsx +70 -0
  104. package/src/components/mobile-player/use-webrtc.tsx +282 -0
  105. package/src/components/mobile-player/video.native.tsx +360 -0
  106. package/src/components/mobile-player/video.tsx +557 -0
  107. package/src/components/mobile-player/webrtc-diagnostics.tsx +149 -0
  108. package/src/components/mobile-player/webrtc-primitives.native.tsx +6 -0
  109. package/src/components/mobile-player/webrtc-primitives.tsx +33 -0
  110. package/src/components/ui/button.tsx +309 -0
  111. package/src/components/ui/dialog.tsx +376 -0
  112. package/src/components/ui/dropdown.tsx +399 -0
  113. package/src/components/ui/icons.tsx +50 -0
  114. package/src/components/ui/index.ts +33 -0
  115. package/src/components/ui/input.tsx +350 -0
  116. package/src/components/ui/loader.tsx +9 -0
  117. package/src/components/ui/primitives/button.tsx +292 -0
  118. package/src/components/ui/primitives/input.tsx +422 -0
  119. package/src/components/ui/primitives/modal.tsx +421 -0
  120. package/src/components/ui/primitives/text.tsx +499 -0
  121. package/src/components/ui/resizeable.tsx +169 -0
  122. package/src/components/ui/text.tsx +330 -0
  123. package/src/components/ui/textarea.tsx +34 -0
  124. package/src/components/ui/toast.tsx +203 -0
  125. package/src/components/ui/view.tsx +344 -0
  126. package/src/hooks/index.ts +9 -0
  127. package/src/hooks/useAvatars.tsx +44 -0
  128. package/src/hooks/useCameraToggle.ts +12 -0
  129. package/src/hooks/useKeyboard.tsx +41 -0
  130. package/src/hooks/useKeyboardSlide.ts +12 -0
  131. package/src/hooks/useLivestreamInfo.ts +67 -0
  132. package/src/hooks/useOuterAndInnerDimensions.tsx +32 -0
  133. package/src/hooks/usePlayerDimensions.ts +23 -0
  134. package/src/hooks/useSegmentTiming.tsx +88 -0
  135. package/src/index.tsx +27 -0
  136. package/src/lib/facet.ts +131 -0
  137. package/src/lib/theme/atoms.ts +760 -0
  138. package/src/lib/theme/atoms.types.ts +258 -0
  139. package/src/lib/theme/index.ts +48 -0
  140. package/src/lib/theme/theme.tsx +436 -0
  141. package/src/lib/theme/tokens.ts +409 -0
  142. package/src/lib/utils.ts +132 -0
  143. package/src/livestream-provider/index.tsx +48 -0
  144. package/src/livestream-provider/websocket.tsx +47 -0
  145. package/src/livestream-store/chat.tsx +261 -0
  146. package/src/livestream-store/context.tsx +10 -0
  147. package/src/livestream-store/index.tsx +4 -0
  148. package/src/livestream-store/livestream-state.tsx +21 -0
  149. package/src/livestream-store/livestream-store.tsx +59 -0
  150. package/src/livestream-store/stream-key.tsx +124 -0
  151. package/src/livestream-store/websocket-consumer.tsx +62 -0
  152. package/src/player-store/context.tsx +11 -0
  153. package/src/player-store/index.tsx +6 -0
  154. package/src/player-store/player-provider.tsx +89 -0
  155. package/src/player-store/player-state.tsx +187 -0
  156. package/src/player-store/player-store.tsx +239 -0
  157. package/src/player-store/single-player-provider.tsx +181 -0
  158. package/src/streamplace-provider/context.tsx +10 -0
  159. package/src/streamplace-provider/index.tsx +32 -0
  160. package/src/streamplace-provider/poller.tsx +55 -0
  161. package/src/streamplace-provider/xrpc.tsx +0 -0
  162. package/src/streamplace-store/block.tsx +29 -0
  163. package/src/streamplace-store/index.tsx +3 -0
  164. package/src/streamplace-store/stream.tsx +262 -0
  165. package/src/streamplace-store/streamplace-store.tsx +89 -0
  166. package/src/streamplace-store/user.tsx +57 -0
  167. package/src/streamplace-store/xrpc.tsx +15 -0
  168. package/tsconfig.json +9 -0
  169. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,399 @@
1
+ import BottomSheet, { BottomSheetView } from "@gorhom/bottom-sheet";
2
+ import * as DropdownMenuPrimitive from "@rn-primitives/dropdown-menu";
3
+ import {
4
+ Check,
5
+ CheckCircle,
6
+ ChevronDown,
7
+ ChevronRight,
8
+ ChevronUp,
9
+ Circle,
10
+ } from "lucide-react-native";
11
+ import { forwardRef, ReactNode, useMemo, useRef } from "react";
12
+ import {
13
+ Platform,
14
+ Pressable,
15
+ StyleSheet,
16
+ Text,
17
+ useWindowDimensions,
18
+ View,
19
+ } from "react-native";
20
+ import {
21
+ a,
22
+ bg,
23
+ borderRadius,
24
+ colors,
25
+ fontSize,
26
+ gap,
27
+ h,
28
+ layout,
29
+ ml,
30
+ mt,
31
+ mx,
32
+ p,
33
+ pb,
34
+ pl,
35
+ pr,
36
+ pt,
37
+ px,
38
+ py,
39
+ right,
40
+ textColors,
41
+ } from "../../lib/theme/atoms";
42
+ import {
43
+ objectFromObjects,
44
+ TextContext as TextClassContext,
45
+ } from "./primitives/text";
46
+
47
+ export const DropdownMenu = DropdownMenuPrimitive.Root;
48
+ export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
49
+ export const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
50
+ export const DropdownMenuSub = DropdownMenuPrimitive.Sub;
51
+ export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
52
+
53
+ export const DropdownMenuBottomSheet = forwardRef<
54
+ any,
55
+ DropdownMenuPrimitive.ContentProps & {
56
+ overlayStyle?: any;
57
+ portalHost?: string;
58
+ }
59
+ >(function DropdownMenuBottomSheet(
60
+ { overlayStyle, portalHost, children },
61
+ _ref,
62
+ ) {
63
+ // Use the primitives' context to know if open
64
+ const { open, onOpenChange } = DropdownMenuPrimitive.useRootContext();
65
+ const snapPoints = useMemo(() => ["25%", "50%", "80%"], []);
66
+ const sheetRef = useRef<BottomSheet>(null);
67
+
68
+ return (
69
+ <DropdownMenuPrimitive.Portal hostName={portalHost}>
70
+ <BottomSheet
71
+ ref={sheetRef}
72
+ // why the heck is this 1-indexed
73
+ index={open ? 3 : -1}
74
+ snapPoints={snapPoints}
75
+ enablePanDownToClose
76
+ onClose={() => onOpenChange?.(false)}
77
+ style={[overlayStyle]}
78
+ backgroundStyle={[bg.black, a.radius.all.md, a.shadows.md, p[1]]}
79
+ handleIndicatorStyle={[
80
+ a.sizes.width[12],
81
+ a.sizes.height[1],
82
+ bg.gray[500],
83
+ ]}
84
+ >
85
+ <BottomSheetView style={[px[2]]}>
86
+ {typeof children === "function"
87
+ ? children({ pressed: true })
88
+ : children}
89
+ </BottomSheetView>
90
+ </BottomSheet>
91
+ </DropdownMenuPrimitive.Portal>
92
+ );
93
+ });
94
+
95
+ export const DropdownMenuSubTrigger = forwardRef<
96
+ any,
97
+ DropdownMenuPrimitive.SubTriggerProps & { inset?: boolean } & {
98
+ ref?: React.RefObject<DropdownMenuPrimitive.SubTriggerRef>;
99
+ className?: string;
100
+ inset?: boolean;
101
+ children?: React.ReactNode;
102
+ }
103
+ >(({ inset, children, ...props }, ref) => {
104
+ const { open } = DropdownMenuPrimitive.useSubContext();
105
+ const Icon =
106
+ Platform.OS === "web" ? ChevronRight : open ? ChevronUp : ChevronDown;
107
+ return (
108
+ <TextClassContext.Provider
109
+ value={objectFromObjects([
110
+ a.textColors.primary[500],
111
+ a.fontSize.base,
112
+ open && a.textColors.primary[700],
113
+ ])}
114
+ >
115
+ <DropdownMenuPrimitive.SubTrigger ref={ref} {...props}>
116
+ <View
117
+ style={[
118
+ inset && gap[2],
119
+ layout.flex.row,
120
+ layout.flex.alignCenter,
121
+ p[2],
122
+ pr[8],
123
+ ]}
124
+ >
125
+ {children}
126
+ <View style={[a.layout.position.absolute, a.position.right[1]]}>
127
+ <Icon size={18} color={colors.gray[200]} />
128
+ </View>
129
+ </View>
130
+ </DropdownMenuPrimitive.SubTrigger>
131
+ </TextClassContext.Provider>
132
+ );
133
+ });
134
+
135
+ export const DropdownMenuSubContent = forwardRef<
136
+ any,
137
+ DropdownMenuPrimitive.SubContentProps
138
+ >((props, ref) => {
139
+ return (
140
+ <DropdownMenuPrimitive.SubContent
141
+ ref={ref}
142
+ style={[
143
+ a.zIndex[50],
144
+ a.sizes.minWidth[32],
145
+ a.overflow.hidden,
146
+ a.radius.all.md,
147
+ a.borders.width.thin,
148
+ a.borders.color.gray[600],
149
+ mt[1],
150
+ bg.black,
151
+ p[1],
152
+ a.shadows.md,
153
+ ]}
154
+ {...props}
155
+ />
156
+ );
157
+ });
158
+
159
+ export const DropdownMenuContent = forwardRef<
160
+ any,
161
+ DropdownMenuPrimitive.ContentProps & {
162
+ overlayStyle?: any;
163
+ portalHost?: string;
164
+ }
165
+ >(({ overlayStyle, portalHost, ...props }, ref) => {
166
+ return (
167
+ <DropdownMenuPrimitive.Portal hostName={portalHost}>
168
+ <DropdownMenuPrimitive.Overlay
169
+ style={[
170
+ Platform.OS !== "web" ? StyleSheet.absoluteFill : undefined,
171
+ overlayStyle,
172
+ ]}
173
+ >
174
+ <DropdownMenuPrimitive.Content
175
+ ref={ref}
176
+ style={
177
+ [
178
+ a.zIndex[50],
179
+ a.sizes.minWidth[32],
180
+ a.sizes.maxWidth[64],
181
+ a.overflow.hidden,
182
+ a.radius.all.md,
183
+ a.borders.width.thin,
184
+ a.borders.color.gray[800],
185
+ bg.gray[950],
186
+ p[2],
187
+ a.shadows.md,
188
+ ] as any
189
+ }
190
+ {...props}
191
+ />
192
+ </DropdownMenuPrimitive.Overlay>
193
+ </DropdownMenuPrimitive.Portal>
194
+ );
195
+ });
196
+
197
+ export const ResponsiveDropdownMenuContent = forwardRef<any, any>(
198
+ ({ children, ...props }, ref) => {
199
+ const { width } = useWindowDimensions();
200
+
201
+ // On web, you might want to always use the normal dropdown
202
+ const isBottomSheet = Platform.OS !== "web" && width < 800;
203
+
204
+ if (isBottomSheet) {
205
+ return (
206
+ <DropdownMenuBottomSheet ref={ref} {...props}>
207
+ {children}
208
+ </DropdownMenuBottomSheet>
209
+ );
210
+ }
211
+ return (
212
+ <DropdownMenuContent ref={ref} {...props}>
213
+ {children}
214
+ </DropdownMenuContent>
215
+ );
216
+ },
217
+ );
218
+
219
+ import React from "react";
220
+
221
+ export const DropdownMenuItem = forwardRef<
222
+ any,
223
+ DropdownMenuPrimitive.ItemProps & { inset?: boolean; disabled?: boolean }
224
+ >(({ inset, disabled, style, children, ...props }, ref) => {
225
+ return (
226
+ <Pressable {...props}>
227
+ <TextClassContext.Provider
228
+ value={objectFromObjects([a.textColors.gray[900], a.fontSize.base])}
229
+ >
230
+ <View
231
+ style={[
232
+ a.layout.flex.row,
233
+ a.layout.flex.alignCenter,
234
+ a.radius.all.sm,
235
+ py[1],
236
+ pl[2],
237
+ pr[2],
238
+ ]}
239
+ >
240
+ {typeof children === "function"
241
+ ? children({ pressed: true })
242
+ : children}
243
+ </View>
244
+ </TextClassContext.Provider>
245
+ </Pressable>
246
+ );
247
+ });
248
+
249
+ export const DropdownMenuCheckboxItem = forwardRef<
250
+ any,
251
+ DropdownMenuPrimitive.CheckboxItemProps & {
252
+ ref?: React.RefObject<DropdownMenuPrimitive.CheckboxItemRef>;
253
+ children?: React.ReactNode;
254
+ }
255
+ >(({ children, checked, ...props }, ref) => {
256
+ return (
257
+ <DropdownMenuPrimitive.CheckboxItem
258
+ ref={ref}
259
+ checked={checked}
260
+ closeOnPress={props.closeOnPress || false}
261
+ {...props}
262
+ >
263
+ <View
264
+ style={[
265
+ a.layout.flex.row,
266
+ a.layout.flex.alignCenter,
267
+ a.radius.all.sm,
268
+ py[1],
269
+ pl[2],
270
+ pr[2],
271
+ pr[8],
272
+ ]}
273
+ >
274
+ {children}
275
+ <View style={[pl[1], layout.position.absolute, right[1]]}>
276
+ {checked ? (
277
+ <CheckCircle size={14} strokeWidth={3} color="white" />
278
+ ) : (
279
+ <Circle size={14} strokeWidth={3} color={a.colors.gray[400]} />
280
+ )}
281
+ </View>
282
+ </View>
283
+ </DropdownMenuPrimitive.CheckboxItem>
284
+ );
285
+ });
286
+
287
+ export const DropdownMenuRadioItem = forwardRef<
288
+ any,
289
+ DropdownMenuPrimitive.RadioItemProps & {
290
+ ref?: React.RefObject<DropdownMenuPrimitive.RadioItemRef>;
291
+ children?: React.ReactNode;
292
+ }
293
+ >(({ children, ...props }, ref) => {
294
+ return (
295
+ <DropdownMenuPrimitive.RadioItem
296
+ ref={ref}
297
+ closeOnPress={props.closeOnPress || false}
298
+ {...props}
299
+ >
300
+ <View
301
+ style={[
302
+ a.layout.flex.row,
303
+ a.layout.flex.alignCenter,
304
+ a.radius.all.sm,
305
+ py[1],
306
+ pl[2],
307
+ pr[1],
308
+ ]}
309
+ >
310
+ <View style={[pl[1], layout.position.absolute, right[1]]}>
311
+ <DropdownMenuPrimitive.ItemIndicator>
312
+ <Check size={14} strokeWidth={3} color="white" />
313
+ </DropdownMenuPrimitive.ItemIndicator>
314
+ </View>
315
+ {children}
316
+ </View>
317
+ </DropdownMenuPrimitive.RadioItem>
318
+ );
319
+ });
320
+
321
+ export const DropdownMenuLabel = forwardRef<
322
+ any,
323
+ DropdownMenuPrimitive.LabelProps & { inset?: boolean }
324
+ >(({ inset, ...props }, ref) => {
325
+ return (
326
+ <Text
327
+ ref={ref}
328
+ style={[
329
+ px[2],
330
+ py[2],
331
+ a.textColors.gray[200],
332
+ a.fontSize.base,
333
+ inset && gap[2],
334
+ ]}
335
+ {...props}
336
+ />
337
+ );
338
+ });
339
+
340
+ export const DropdownMenuSeparator = forwardRef<
341
+ any,
342
+ DropdownMenuPrimitive.SeparatorProps
343
+ >((props, ref) => {
344
+ return (
345
+ <View
346
+ ref={ref}
347
+ style={[mx[2], h[0.5] || { height: 0.5 }, bg.gray[800]]}
348
+ {...props}
349
+ />
350
+ );
351
+ });
352
+
353
+ export function DropdownMenuShortcut(props: any) {
354
+ return (
355
+ <Text
356
+ style={[
357
+ ml.auto,
358
+ a.textColors.gray[500],
359
+ a.fontSize.sm,
360
+ a.letterSpacing.widest,
361
+ ]}
362
+ {...props}
363
+ />
364
+ );
365
+ }
366
+
367
+ export const DropdownMenuGroup = forwardRef<
368
+ any,
369
+ { inset?: boolean; title?: string; children: ReactNode }
370
+ >((props, ref) => {
371
+ const { inset, title, children, ...rest } = props;
372
+ return (
373
+ <View style={[pt[2], inset ? gap[2] : gap[1]]} ref={ref} {...rest}>
374
+ {title && (
375
+ <Text style={[textColors.gray[400], pb[1], pl[2]]}>{title}</Text>
376
+ )}
377
+ <View
378
+ style={[
379
+ bg.gray[900],
380
+ Platform.OS === "web" ? px[2] : p[2],
381
+ gap[2],
382
+ { borderRadius: borderRadius.lg, gap: 10 },
383
+ ]}
384
+ >
385
+ {children}
386
+ </View>
387
+ </View>
388
+ );
389
+ });
390
+
391
+ export const DropdownMenuInfo = forwardRef<any, any>(
392
+ ({ description, ...props }, ref) => {
393
+ return (
394
+ <Text style={[textColors.gray[400], pt[1], pl[2], pb[2], fontSize.sm]}>
395
+ {description}
396
+ </Text>
397
+ );
398
+ },
399
+ );
@@ -0,0 +1,50 @@
1
+ import { type LucideProps } from "lucide-react-native";
2
+ import React from "react";
3
+ import { useTheme } from "../../lib/theme";
4
+
5
+ // Simple icon wrapper that integrates with theme
6
+ export interface IconProps {
7
+ variant?:
8
+ | "default"
9
+ | "muted"
10
+ | "primary"
11
+ | "secondary"
12
+ | "destructive"
13
+ | "success"
14
+ | "warning";
15
+ size?: number | "sm" | "md" | "lg" | "xl";
16
+ color?: string;
17
+ }
18
+
19
+ // Size mapping
20
+ const sizeMap = {
21
+ sm: 16,
22
+ md: 20,
23
+ lg: 24,
24
+ xl: 32,
25
+ } as const;
26
+
27
+ // HOC to create themed icons
28
+ export function createThemedIcon(
29
+ IconComponent: React.ComponentType<LucideProps>,
30
+ ): React.FC<IconProps> {
31
+ return ({ variant = "default", size = "md", color, ...restProps }) => {
32
+ let theme = useTheme(); // Ensure theme is available
33
+ // Calculate size
34
+ const iconSize = typeof size === "number" ? size : sizeMap[size];
35
+
36
+ // Calculate color if not provided using atoms
37
+ const iconColor =
38
+ color ||
39
+ theme.theme.colors[variant] ||
40
+ theme.theme.colors.secondaryForeground;
41
+
42
+ return (
43
+ <IconComponent
44
+ size={iconSize}
45
+ color={iconColor}
46
+ {...(restProps as Omit<LucideProps, "size" | "color">)}
47
+ />
48
+ );
49
+ };
50
+ }
@@ -0,0 +1,33 @@
1
+ // Export primitive components
2
+ export * from "./primitives/button";
3
+ export * from "./primitives/input";
4
+ export * from "./primitives/modal";
5
+ export * from "./primitives/text";
6
+
7
+ // Export styled components
8
+ export * from "./button";
9
+ export * from "./dialog";
10
+ export * from "./dropdown";
11
+ export * from "./icons";
12
+ export * from "./input";
13
+ export * from "./loader";
14
+ export * from "./resizeable";
15
+ export * from "./text";
16
+ export * from "./toast";
17
+ export * from "./view";
18
+
19
+ // Component collections for easy importing
20
+ export { ButtonPrimitive } from "./primitives/button";
21
+ export { InputPrimitive } from "./primitives/input";
22
+ export { ModalPrimitive } from "./primitives/modal";
23
+ export { TextPrimitive } from "./primitives/text";
24
+
25
+ // Re-export commonly used types
26
+ export type { Theme } from "../../lib/theme/theme";
27
+ export type { ButtonProps } from "./button";
28
+ export type { DialogProps } from "./dialog";
29
+ export type { InputProps } from "./input";
30
+ export type { TextProps } from "./text";
31
+ export type { ViewProps } from "./view";
32
+
33
+ export * from "../../lib/theme";