@gv-tech/ui-native 2.22.2 → 2.23.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.
- package/dist/button-group.d.ts +9 -0
- package/dist/button-group.d.ts.map +1 -0
- package/dist/combobox.d.ts +22 -0
- package/dist/combobox.d.ts.map +1 -0
- package/dist/direction.d.ts +5 -0
- package/dist/direction.d.ts.map +1 -0
- package/dist/empty.d.ts +11 -0
- package/dist/empty.d.ts.map +1 -0
- package/dist/field.d.ts +15 -0
- package/dist/field.d.ts.map +1 -0
- package/dist/hooks/use-theme.d.ts +16 -0
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/input-group.d.ts +12 -0
- package/dist/input-group.d.ts.map +1 -0
- package/dist/input-otp.d.ts +9 -0
- package/dist/input-otp.d.ts.map +1 -0
- package/dist/item.d.ts +15 -0
- package/dist/item.d.ts.map +1 -0
- package/dist/kbd.d.ts +7 -0
- package/dist/kbd.d.ts.map +1 -0
- package/dist/native-select.d.ts +8 -0
- package/dist/native-select.d.ts.map +1 -0
- package/dist/sidebar.d.ts +37 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/spinner.d.ts +6 -0
- package/dist/spinner.d.ts.map +1 -0
- package/dist/ui-native.cjs +1 -1
- package/dist/ui-native.mjs +1457 -883
- package/package.json +1 -1
- package/src/button-group.tsx +30 -0
- package/src/combobox.tsx +125 -0
- package/src/direction.tsx +12 -0
- package/src/empty.tsx +38 -0
- package/src/field.tsx +89 -0
- package/src/index.ts +108 -0
- package/src/input-group.tsx +54 -0
- package/src/input-otp.tsx +34 -0
- package/src/item.tsx +74 -0
- package/src/kbd.tsx +16 -0
- package/src/native-select.tsx +30 -0
- package/src/sidebar.tsx +209 -0
- package/src/spinner.tsx +9 -0
package/package.json
CHANGED
|
@@ -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 };
|
package/src/combobox.tsx
ADDED
|
@@ -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 };
|