@gv-tech/ui-native 2.22.2 → 2.23.1

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 (44) hide show
  1. package/dist/button-group.d.ts +9 -0
  2. package/dist/button-group.d.ts.map +1 -0
  3. package/dist/combobox.d.ts +22 -0
  4. package/dist/combobox.d.ts.map +1 -0
  5. package/dist/direction.d.ts +5 -0
  6. package/dist/direction.d.ts.map +1 -0
  7. package/dist/empty.d.ts +11 -0
  8. package/dist/empty.d.ts.map +1 -0
  9. package/dist/field.d.ts +15 -0
  10. package/dist/field.d.ts.map +1 -0
  11. package/dist/hooks/use-theme.d.ts +16 -0
  12. package/dist/hooks/use-theme.d.ts.map +1 -1
  13. package/dist/index.d.ts +12 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/input-group.d.ts +12 -0
  16. package/dist/input-group.d.ts.map +1 -0
  17. package/dist/input-otp.d.ts +9 -0
  18. package/dist/input-otp.d.ts.map +1 -0
  19. package/dist/item.d.ts +15 -0
  20. package/dist/item.d.ts.map +1 -0
  21. package/dist/kbd.d.ts +7 -0
  22. package/dist/kbd.d.ts.map +1 -0
  23. package/dist/native-select.d.ts +8 -0
  24. package/dist/native-select.d.ts.map +1 -0
  25. package/dist/sidebar.d.ts +37 -0
  26. package/dist/sidebar.d.ts.map +1 -0
  27. package/dist/spinner.d.ts +6 -0
  28. package/dist/spinner.d.ts.map +1 -0
  29. package/dist/ui-native.cjs +1 -1
  30. package/dist/ui-native.mjs +1457 -883
  31. package/package.json +1 -1
  32. package/src/button-group.tsx +30 -0
  33. package/src/combobox.tsx +125 -0
  34. package/src/direction.tsx +12 -0
  35. package/src/empty.tsx +38 -0
  36. package/src/field.tsx +89 -0
  37. package/src/index.ts +108 -0
  38. package/src/input-group.tsx +54 -0
  39. package/src/input-otp.tsx +34 -0
  40. package/src/item.tsx +74 -0
  41. package/src/kbd.tsx +16 -0
  42. package/src/native-select.tsx +30 -0
  43. package/src/sidebar.tsx +209 -0
  44. package/src/spinner.tsx +9 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gv-tech/ui-native",
3
- "version": "2.22.2",
3
+ "version": "2.23.1",
4
4
  "description": "React Native implementations of the GV Tech design system components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,30 @@
1
+ import type { ButtonGroupBaseProps, ButtonGroupSeparatorBaseProps, ButtonGroupTextBaseProps } from '@gv-tech/ui-core';
2
+ import * as React from 'react';
3
+ import { Text, View } from 'react-native';
4
+ import { cn } from './lib/utils';
5
+
6
+ // TODO: Implement proper React Native ButtonGroup logic
7
+ function ButtonGroup({ className, orientation, ...props }: React.ComponentProps<typeof View> & ButtonGroupBaseProps) {
8
+ return <View className={cn('flex flex-row', className)} {...props} />;
9
+ }
10
+
11
+ function ButtonGroupText({
12
+ className,
13
+ asChild,
14
+ ...props
15
+ }: React.ComponentProps<typeof Text> & ButtonGroupTextBaseProps) {
16
+ return <Text className={cn('text-sm font-medium', className)} {...props} />;
17
+ }
18
+
19
+ function ButtonGroupSeparator({
20
+ className,
21
+ orientation,
22
+ ...props
23
+ }: React.ComponentProps<typeof View> & ButtonGroupSeparatorBaseProps) {
24
+ return <View className={cn('bg-border h-full w-px', className)} {...props} />;
25
+ }
26
+
27
+ // Stub for buttonGroupVariants to satisfy web/native shared imports if needed
28
+ const buttonGroupVariants = () => '';
29
+
30
+ export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants };
@@ -0,0 +1,125 @@
1
+ import type {
2
+ ComboboxChipBaseProps,
3
+ ComboboxChipsBaseProps,
4
+ ComboboxChipsInputBaseProps,
5
+ ComboboxClearBaseProps,
6
+ ComboboxCollectionBaseProps,
7
+ ComboboxContentBaseProps,
8
+ ComboboxEmptyBaseProps,
9
+ ComboboxGroupBaseProps,
10
+ ComboboxInputBaseProps,
11
+ ComboboxItemBaseProps,
12
+ ComboboxLabelBaseProps,
13
+ ComboboxListBaseProps,
14
+ ComboboxSeparatorBaseProps,
15
+ ComboboxTriggerBaseProps,
16
+ ComboboxValueBaseProps,
17
+ } from '@gv-tech/ui-core';
18
+ import * as React from 'react';
19
+ import { Text, View } from 'react-native';
20
+ import { cn } from './lib/utils';
21
+
22
+ function Combobox({ className, ...props }: React.ComponentProps<typeof View>) {
23
+ return (
24
+ <View className={cn('border-destructive/50 rounded-md border border-dashed p-4', className)} {...props}>
25
+ <Text className="text-destructive font-mono text-xs">Combobox (Not Implemented)</Text>
26
+ </View>
27
+ );
28
+ }
29
+
30
+ function ComboboxValue({ className, ...props }: React.ComponentProps<typeof View> & ComboboxValueBaseProps) {
31
+ return <View className={className} {...props} />;
32
+ }
33
+
34
+ function ComboboxTrigger({ className, ...props }: React.ComponentProps<typeof View> & ComboboxTriggerBaseProps) {
35
+ return <View className={className} {...props} />;
36
+ }
37
+
38
+ function ComboboxClear({ className, ...props }: React.ComponentProps<typeof View> & ComboboxClearBaseProps) {
39
+ return <View className={className} {...props} />;
40
+ }
41
+
42
+ function ComboboxInput({
43
+ className,
44
+ showClear,
45
+ showTrigger,
46
+ ...props
47
+ }: React.ComponentProps<typeof View> & ComboboxInputBaseProps) {
48
+ return <View className={className} {...props} />;
49
+ }
50
+
51
+ function ComboboxContent({
52
+ className,
53
+ side,
54
+ sideOffset,
55
+ align,
56
+ alignOffset,
57
+ anchor,
58
+ ...props
59
+ }: React.ComponentProps<typeof View> & ComboboxContentBaseProps) {
60
+ return <View className={className} {...props} />;
61
+ }
62
+
63
+ function ComboboxList({ className, ...props }: React.ComponentProps<typeof View> & ComboboxListBaseProps) {
64
+ return <View className={className} {...props} />;
65
+ }
66
+
67
+ function ComboboxItem({ className, ...props }: React.ComponentProps<typeof View> & ComboboxItemBaseProps) {
68
+ return <View className={className} {...props} />;
69
+ }
70
+
71
+ function ComboboxGroup({ className, ...props }: React.ComponentProps<typeof View> & ComboboxGroupBaseProps) {
72
+ return <View className={className} {...props} />;
73
+ }
74
+
75
+ function ComboboxLabel({ className, ...props }: React.ComponentProps<typeof View> & ComboboxLabelBaseProps) {
76
+ return <View className={className} {...props} />;
77
+ }
78
+
79
+ function ComboboxCollection({ className, ...props }: React.ComponentProps<typeof View> & ComboboxCollectionBaseProps) {
80
+ return <View className={className} {...props} />;
81
+ }
82
+
83
+ function ComboboxEmpty({ className, ...props }: React.ComponentProps<typeof View> & ComboboxEmptyBaseProps) {
84
+ return <View className={className} {...props} />;
85
+ }
86
+
87
+ function ComboboxSeparator({ className, ...props }: React.ComponentProps<typeof View> & ComboboxSeparatorBaseProps) {
88
+ return <View className={className} {...props} />;
89
+ }
90
+
91
+ function ComboboxChips({ className, ...props }: React.ComponentProps<typeof View> & ComboboxChipsBaseProps) {
92
+ return <View className={className} {...props} />;
93
+ }
94
+
95
+ function ComboboxChip({ className, showRemove, ...props }: React.ComponentProps<typeof View> & ComboboxChipBaseProps) {
96
+ return <View className={className} {...props} />;
97
+ }
98
+
99
+ function ComboboxChipsInput({ className, ...props }: React.ComponentProps<typeof View> & ComboboxChipsInputBaseProps) {
100
+ return <View className={className} {...props} />;
101
+ }
102
+
103
+ function useComboboxAnchor() {
104
+ return React.useRef(null);
105
+ }
106
+
107
+ export {
108
+ Combobox,
109
+ ComboboxChip,
110
+ ComboboxChips,
111
+ ComboboxChipsInput,
112
+ ComboboxClear,
113
+ ComboboxCollection,
114
+ ComboboxContent,
115
+ ComboboxEmpty,
116
+ ComboboxGroup,
117
+ ComboboxInput,
118
+ ComboboxItem,
119
+ ComboboxLabel,
120
+ ComboboxList,
121
+ ComboboxSeparator,
122
+ ComboboxTrigger,
123
+ ComboboxValue,
124
+ useComboboxAnchor,
125
+ };
@@ -0,0 +1,12 @@
1
+ import type { DirectionProviderBaseProps } from '@gv-tech/ui-core';
2
+
3
+ function DirectionProvider({ children, dir, direction }: DirectionProviderBaseProps) {
4
+ // RN direction is mostly handled via I18nManager
5
+ return <>{children}</>;
6
+ }
7
+
8
+ function useDirection() {
9
+ return 'ltr';
10
+ }
11
+
12
+ export { DirectionProvider, useDirection };
package/src/empty.tsx ADDED
@@ -0,0 +1,38 @@
1
+ import type { EmptyBaseProps, EmptyMediaBaseProps } from '@gv-tech/ui-core';
2
+ import * as React from 'react';
3
+ import { Text, View } from 'react-native';
4
+ import { cn } from './lib/utils';
5
+
6
+ function Empty({ className, ...props }: React.ComponentProps<typeof View> & EmptyBaseProps) {
7
+ return (
8
+ <View
9
+ className={cn(
10
+ 'border-border flex w-full items-center justify-center rounded-xl border-2 border-dashed p-6',
11
+ className,
12
+ )}
13
+ {...props}
14
+ />
15
+ );
16
+ }
17
+
18
+ function EmptyHeader({ className, ...props }: React.ComponentProps<typeof View>) {
19
+ return <View className={cn('flex flex-col items-center gap-2', className)} {...props} />;
20
+ }
21
+
22
+ function EmptyMedia({ className, variant, ...props }: React.ComponentProps<typeof View> & EmptyMediaBaseProps) {
23
+ return <View className={cn('flex items-center justify-center', className)} {...props} />;
24
+ }
25
+
26
+ function EmptyTitle({ className, ...props }: React.ComponentProps<typeof Text>) {
27
+ return <Text className={cn('text-foreground text-lg font-semibold', className)} {...props} />;
28
+ }
29
+
30
+ function EmptyDescription({ className, ...props }: React.ComponentProps<typeof Text>) {
31
+ return <Text className={cn('text-muted-foreground text-center text-sm', className)} {...props} />;
32
+ }
33
+
34
+ function EmptyContent({ className, ...props }: React.ComponentProps<typeof View>) {
35
+ return <View className={cn('mt-4 flex flex-col items-center gap-2', className)} {...props} />;
36
+ }
37
+
38
+ export { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle };
package/src/field.tsx ADDED
@@ -0,0 +1,89 @@
1
+ import type {
2
+ FieldBaseProps,
3
+ FieldContentBaseProps,
4
+ FieldDescriptionBaseProps,
5
+ FieldErrorBaseProps,
6
+ FieldGroupBaseProps,
7
+ FieldLabelBaseProps,
8
+ FieldLegendBaseProps,
9
+ FieldSeparatorBaseProps,
10
+ FieldSetBaseProps,
11
+ FieldTitleBaseProps,
12
+ } from '@gv-tech/ui-core';
13
+ import * as React from 'react';
14
+ import { Text, View } from 'react-native';
15
+ import { cn } from './lib/utils';
16
+
17
+ function Field({ className, orientation, ...props }: React.ComponentProps<typeof View> & FieldBaseProps) {
18
+ return <View className={cn('flex flex-col gap-2', className)} {...props} />;
19
+ }
20
+
21
+ function FieldContent({ className, ...props }: React.ComponentProps<typeof View> & FieldContentBaseProps) {
22
+ return <View className={cn('flex flex-col', className)} {...props} />;
23
+ }
24
+
25
+ function FieldDescription({ className, ...props }: React.ComponentProps<typeof Text> & FieldDescriptionBaseProps) {
26
+ return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;
27
+ }
28
+
29
+ function FieldError({
30
+ className,
31
+ errors,
32
+ children,
33
+ ...props
34
+ }: React.ComponentProps<typeof Text> & FieldErrorBaseProps) {
35
+ const message = children || (errors && errors[0]?.message);
36
+ if (!message) {
37
+ return null;
38
+ }
39
+ return (
40
+ <Text className={cn('text-destructive text-sm', className)} {...props}>
41
+ {message}
42
+ </Text>
43
+ );
44
+ }
45
+
46
+ function FieldGroup({ className, ...props }: React.ComponentProps<typeof View> & FieldGroupBaseProps) {
47
+ return <View className={cn('flex flex-col gap-4', className)} {...props} />;
48
+ }
49
+
50
+ function FieldLabel({ className, ...props }: React.ComponentProps<typeof Text> & FieldLabelBaseProps) {
51
+ return <Text className={cn('text-sm font-medium', className)} {...props} />;
52
+ }
53
+
54
+ function FieldLegend({ className, variant, ...props }: React.ComponentProps<typeof Text> & FieldLegendBaseProps) {
55
+ return <Text className={cn('font-medium', variant === 'label' ? 'text-sm' : 'text-base', className)} {...props} />;
56
+ }
57
+
58
+ function FieldSeparator({
59
+ className,
60
+ children,
61
+ ...props
62
+ }: React.ComponentProps<typeof View> & FieldSeparatorBaseProps) {
63
+ return (
64
+ <View className={cn('bg-border my-2 h-px', className)} {...props}>
65
+ {children ? <Text className="bg-background absolute px-2 text-xs">{children}</Text> : null}
66
+ </View>
67
+ );
68
+ }
69
+
70
+ function FieldSet({ className, ...props }: React.ComponentProps<typeof View> & FieldSetBaseProps) {
71
+ return <View className={cn('flex flex-col gap-4', className)} {...props} />;
72
+ }
73
+
74
+ function FieldTitle({ className, ...props }: React.ComponentProps<typeof Text> & FieldTitleBaseProps) {
75
+ return <Text className={cn('text-sm font-medium', className)} {...props} />;
76
+ }
77
+
78
+ export {
79
+ Field,
80
+ FieldContent,
81
+ FieldDescription,
82
+ FieldError,
83
+ FieldGroup,
84
+ FieldLabel,
85
+ FieldLegend,
86
+ FieldSeparator,
87
+ FieldSet,
88
+ FieldTitle,
89
+ };
package/src/index.ts CHANGED
@@ -327,3 +327,111 @@ export {
327
327
  TableOfContentsHeading,
328
328
  TableOfContentsList,
329
329
  } from './table-of-contents';
330
+
331
+ // Button Group
332
+ export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants } from './button-group';
333
+
334
+ // Direction
335
+ export { DirectionProvider, useDirection } from './direction';
336
+
337
+ // Empty
338
+ export { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from './empty';
339
+
340
+ // Spinner
341
+ export { Spinner } from './spinner';
342
+
343
+ // Field
344
+ export {
345
+ Field,
346
+ FieldContent,
347
+ FieldDescription,
348
+ FieldError,
349
+ FieldGroup,
350
+ FieldLabel,
351
+ FieldLegend,
352
+ FieldSeparator,
353
+ FieldSet,
354
+ FieldTitle,
355
+ } from './field';
356
+
357
+ // Input Group
358
+ export {
359
+ InputGroup,
360
+ InputGroupAddon,
361
+ InputGroupButton,
362
+ InputGroupInput,
363
+ InputGroupText,
364
+ InputGroupTextarea,
365
+ } from './input-group';
366
+
367
+ // Native Select
368
+ export { NativeSelect, NativeSelectOptGroup, NativeSelectOption } from './native-select';
369
+
370
+ // Kbd
371
+ export { Kbd, KbdGroup } from './kbd';
372
+
373
+ // Item
374
+ export {
375
+ Item,
376
+ ItemActions,
377
+ ItemContent,
378
+ ItemDescription,
379
+ ItemFooter,
380
+ ItemGroup,
381
+ ItemHeader,
382
+ ItemMedia,
383
+ ItemSeparator,
384
+ ItemTitle,
385
+ } from './item';
386
+
387
+ // Combobox
388
+ export {
389
+ Combobox,
390
+ ComboboxChip,
391
+ ComboboxChips,
392
+ ComboboxChipsInput,
393
+ ComboboxClear,
394
+ ComboboxCollection,
395
+ ComboboxContent,
396
+ ComboboxEmpty,
397
+ ComboboxGroup,
398
+ ComboboxInput,
399
+ ComboboxItem,
400
+ ComboboxLabel,
401
+ ComboboxList,
402
+ ComboboxSeparator,
403
+ ComboboxTrigger,
404
+ ComboboxValue,
405
+ useComboboxAnchor,
406
+ } from './combobox';
407
+
408
+ // Input OTP
409
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from './input-otp';
410
+
411
+ // Sidebar
412
+ export {
413
+ Sidebar,
414
+ SidebarContent,
415
+ SidebarFooter,
416
+ SidebarGroup,
417
+ SidebarGroupAction,
418
+ SidebarGroupContent,
419
+ SidebarGroupLabel,
420
+ SidebarHeader,
421
+ SidebarInput,
422
+ SidebarInset,
423
+ SidebarMenu,
424
+ SidebarMenuAction,
425
+ SidebarMenuBadge,
426
+ SidebarMenuButton,
427
+ SidebarMenuItem,
428
+ SidebarMenuSkeleton,
429
+ SidebarMenuSub,
430
+ SidebarMenuSubButton,
431
+ SidebarMenuSubItem,
432
+ SidebarProvider,
433
+ SidebarRail,
434
+ SidebarSeparator,
435
+ SidebarTrigger,
436
+ useSidebar,
437
+ } from './sidebar';
@@ -0,0 +1,54 @@
1
+ import type {
2
+ InputGroupAddonBaseProps,
3
+ InputGroupBaseProps,
4
+ InputGroupButtonBaseProps,
5
+ InputGroupInputBaseProps,
6
+ InputGroupTextareaBaseProps,
7
+ InputGroupTextBaseProps,
8
+ } from '@gv-tech/ui-core';
9
+ import * as React from 'react';
10
+ import { Text, TextInput, View } from 'react-native';
11
+ import { Button } from './button';
12
+ import { cn } from './lib/utils';
13
+
14
+ function InputGroup({ className, ...props }: React.ComponentProps<typeof View> & InputGroupBaseProps) {
15
+ return <View className={cn('border-input flex flex-row items-center rounded-md border', className)} {...props} />;
16
+ }
17
+
18
+ function InputGroupAddon({ className, align, ...props }: React.ComponentProps<typeof View> & InputGroupAddonBaseProps) {
19
+ return <View className={cn('p-2', className)} {...props} />;
20
+ }
21
+
22
+ function InputGroupButton({
23
+ className,
24
+ type,
25
+ variant,
26
+ size,
27
+ ...props
28
+ }: React.ComponentProps<typeof Button> & InputGroupButtonBaseProps) {
29
+ return (
30
+ <Button
31
+ variant={variant as React.ComponentProps<typeof Button>['variant']}
32
+ size={size as React.ComponentProps<typeof Button>['size']}
33
+ className={className}
34
+ {...(props as Record<string, unknown>)}
35
+ />
36
+ );
37
+ }
38
+
39
+ function InputGroupText({ className, ...props }: React.ComponentProps<typeof Text> & InputGroupTextBaseProps) {
40
+ return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;
41
+ }
42
+
43
+ function InputGroupInput({ className, ...props }: React.ComponentProps<typeof TextInput> & InputGroupInputBaseProps) {
44
+ return <TextInput className={cn('text-foreground flex-1 px-3 py-2', className)} {...props} />;
45
+ }
46
+
47
+ function InputGroupTextarea({
48
+ className,
49
+ ...props
50
+ }: React.ComponentProps<typeof TextInput> & InputGroupTextareaBaseProps) {
51
+ return <TextInput multiline className={cn('text-foreground flex-1 px-3 py-2', className)} {...props} />;
52
+ }
53
+
54
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea };
@@ -0,0 +1,34 @@
1
+ import type {
2
+ InputOTPBaseProps,
3
+ InputOTPGroupBaseProps,
4
+ InputOTPSeparatorBaseProps,
5
+ InputOTPSlotBaseProps,
6
+ } from '@gv-tech/ui-core';
7
+ import * as React from 'react';
8
+ import { Text, View } from 'react-native';
9
+ import { cn } from './lib/utils';
10
+
11
+ function InputOTP({ className, containerClassName, ...props }: React.ComponentProps<typeof View> & InputOTPBaseProps) {
12
+ return (
13
+ <View
14
+ className={cn('border-destructive/50 rounded-md border border-dashed p-4', containerClassName, className)}
15
+ {...props}
16
+ >
17
+ <Text className="text-destructive font-mono text-xs">InputOTP (Not Implemented)</Text>
18
+ </View>
19
+ );
20
+ }
21
+
22
+ function InputOTPGroup({ className, ...props }: React.ComponentProps<typeof View> & InputOTPGroupBaseProps) {
23
+ return <View className={className} {...props} />;
24
+ }
25
+
26
+ function InputOTPSlot({ className, index, ...props }: React.ComponentProps<typeof View> & InputOTPSlotBaseProps) {
27
+ return <View className={className} {...props} />;
28
+ }
29
+
30
+ function InputOTPSeparator({ className, ...props }: React.ComponentProps<typeof View> & InputOTPSeparatorBaseProps) {
31
+ return <View className={className} {...props} />;
32
+ }
33
+
34
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
package/src/item.tsx ADDED
@@ -0,0 +1,74 @@
1
+ import type {
2
+ ItemActionsBaseProps,
3
+ ItemBaseProps,
4
+ ItemContentBaseProps,
5
+ ItemDescriptionBaseProps,
6
+ ItemFooterBaseProps,
7
+ ItemGroupBaseProps,
8
+ ItemHeaderBaseProps,
9
+ ItemMediaBaseProps,
10
+ ItemSeparatorBaseProps,
11
+ ItemTitleBaseProps,
12
+ } from '@gv-tech/ui-core';
13
+ import * as React from 'react';
14
+ import { Text, View } from 'react-native';
15
+ import { cn } from './lib/utils';
16
+
17
+ function Item({ className, variant, size, ...props }: React.ComponentProps<typeof View> & ItemBaseProps) {
18
+ return (
19
+ <View className={cn('flex flex-row flex-wrap items-center gap-2 rounded-lg border p-3', className)} {...props} />
20
+ );
21
+ }
22
+
23
+ function ItemActions({ className, ...props }: React.ComponentProps<typeof View> & ItemActionsBaseProps) {
24
+ return <View className={cn('flex flex-row items-center gap-2', className)} {...props} />;
25
+ }
26
+
27
+ function ItemContent({ className, ...props }: React.ComponentProps<typeof View> & ItemContentBaseProps) {
28
+ return <View className={cn('flex flex-1 flex-col gap-1', className)} {...props} />;
29
+ }
30
+
31
+ function ItemDescription({ className, ...props }: React.ComponentProps<typeof Text> & ItemDescriptionBaseProps) {
32
+ return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;
33
+ }
34
+
35
+ function ItemFooter({ className, ...props }: React.ComponentProps<typeof View> & ItemFooterBaseProps) {
36
+ return <View className={cn('flex w-full flex-row items-center justify-between gap-2', className)} {...props} />;
37
+ }
38
+
39
+ function ItemGroup({ className, ...props }: React.ComponentProps<typeof View> & ItemGroupBaseProps) {
40
+ return <View className={cn('flex flex-col gap-4', className)} {...props} />;
41
+ }
42
+
43
+ function ItemHeader({ className, ...props }: React.ComponentProps<typeof View> & ItemHeaderBaseProps) {
44
+ return <View className={cn('flex w-full flex-row items-center justify-between gap-2', className)} {...props} />;
45
+ }
46
+
47
+ function ItemMedia({ className, variant, ...props }: React.ComponentProps<typeof View> & ItemMediaBaseProps) {
48
+ return <View className={cn('flex shrink-0 items-center justify-center gap-2', className)} {...props} />;
49
+ }
50
+
51
+ function ItemSeparator({
52
+ className,
53
+ orientation,
54
+ ...props
55
+ }: React.ComponentProps<typeof View> & ItemSeparatorBaseProps) {
56
+ return <View className={cn('bg-border my-2 h-px w-full', className)} {...props} />;
57
+ }
58
+
59
+ function ItemTitle({ className, ...props }: React.ComponentProps<typeof Text> & ItemTitleBaseProps) {
60
+ return <Text className={cn('text-sm font-medium', className)} {...props} />;
61
+ }
62
+
63
+ export {
64
+ Item,
65
+ ItemActions,
66
+ ItemContent,
67
+ ItemDescription,
68
+ ItemFooter,
69
+ ItemGroup,
70
+ ItemHeader,
71
+ ItemMedia,
72
+ ItemSeparator,
73
+ ItemTitle,
74
+ };
package/src/kbd.tsx ADDED
@@ -0,0 +1,16 @@
1
+ import type { KbdBaseProps, KbdGroupBaseProps } from '@gv-tech/ui-core';
2
+ import * as React from 'react';
3
+ import { Text, View } from 'react-native';
4
+ import { cn } from './lib/utils';
5
+
6
+ function Kbd({ className, ...props }: React.ComponentProps<typeof Text> & KbdBaseProps) {
7
+ return (
8
+ <Text className={cn('bg-muted text-muted-foreground rounded-sm px-1 font-mono text-xs', className)} {...props} />
9
+ );
10
+ }
11
+
12
+ function KbdGroup({ className, ...props }: React.ComponentProps<typeof View> & KbdGroupBaseProps) {
13
+ return <View className={cn('flex flex-row items-center gap-1', className)} {...props} />;
14
+ }
15
+
16
+ export { Kbd, KbdGroup };
@@ -0,0 +1,30 @@
1
+ import type {
2
+ NativeSelectBaseProps,
3
+ NativeSelectOptGroupBaseProps,
4
+ NativeSelectOptionBaseProps,
5
+ } from '@gv-tech/ui-core';
6
+ import * as React from 'react';
7
+ import { Text, View } from 'react-native';
8
+ import { cn } from './lib/utils';
9
+
10
+ function NativeSelect({ className, size, ...props }: React.ComponentProps<typeof View> & NativeSelectBaseProps) {
11
+ // Native select relies on @react-native-picker/picker, providing shim
12
+ return (
13
+ <View className={cn('border-input rounded-md border p-2', className)} {...props}>
14
+ <Text className="text-muted-foreground">Select Not Implemented (Use Picker)</Text>
15
+ </View>
16
+ );
17
+ }
18
+
19
+ function NativeSelectOption({ className, ...props }: React.ComponentProps<typeof View> & NativeSelectOptionBaseProps) {
20
+ return <View className={className} {...props} />;
21
+ }
22
+
23
+ function NativeSelectOptGroup({
24
+ className,
25
+ ...props
26
+ }: React.ComponentProps<typeof View> & NativeSelectOptGroupBaseProps) {
27
+ return <View className={className} {...props} />;
28
+ }
29
+
30
+ export { NativeSelect, NativeSelectOptGroup, NativeSelectOption };