linked-data-browser 0.0.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/.eslintrc.js +13 -0
- package/.ldo/profile.context.ts +459 -0
- package/.ldo/profile.schema.ts +751 -0
- package/.ldo/profile.shapeTypes.ts +71 -0
- package/.ldo/profile.typings.ts +295 -0
- package/.prettierignore +6 -0
- package/.prettierrc +10 -0
- package/.shapes/profile.shex +121 -0
- package/README.md +3 -0
- package/app/index.tsx +25 -0
- package/app.json +37 -0
- package/assets/images/adaptive-icon.png +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/icon.png +0 -0
- package/assets/images/splash.png +0 -0
- package/babel.config.js +6 -0
- package/components/DataBrowser.tsx +57 -0
- package/components/ResourceView.tsx +14 -0
- package/components/TargetResourceProvider.tsx +128 -0
- package/components/ThemeProvider.tsx +123 -0
- package/components/nav/DialogProvider.tsx +140 -0
- package/components/nav/Layout.tsx +118 -0
- package/components/nav/header/AddressBox.tsx +126 -0
- package/components/nav/header/AvatarMenu.tsx +62 -0
- package/components/nav/header/Header.tsx +28 -0
- package/components/nav/header/SignInMenu.tsx +126 -0
- package/components/nav/header/ThemeToggleMenu.tsx +34 -0
- package/components/nav/header/ViewMenu.tsx +88 -0
- package/components/nav/useValidView.tsx +51 -0
- package/components/nav/utilityResourceViews/ErrorMessageResourceView.tsx +26 -0
- package/components/ui/avatar.tsx +53 -0
- package/components/ui/button.tsx +88 -0
- package/components/ui/card.tsx +101 -0
- package/components/ui/dialog.tsx +159 -0
- package/components/ui/dropdown-menu.tsx +275 -0
- package/components/ui/input.tsx +25 -0
- package/components/ui/label.tsx +34 -0
- package/components/ui/navigation-menu.tsx +200 -0
- package/components/ui/popover.tsx +45 -0
- package/components/ui/progress.tsx +79 -0
- package/components/ui/radio-group.tsx +59 -0
- package/components/ui/separator.tsx +27 -0
- package/components/ui/switch.tsx +105 -0
- package/components/ui/text.tsx +30 -0
- package/components/ui/tooltip.tsx +46 -0
- package/components.json +7 -0
- package/global.css +61 -0
- package/index.js +12 -0
- package/lib/android-navigation-bar.ts +11 -0
- package/lib/constants.ts +18 -0
- package/lib/icons/ArrowRight.tsx +4 -0
- package/lib/icons/Check.tsx +4 -0
- package/lib/icons/ChevronDown.tsx +4 -0
- package/lib/icons/ChevronRight.tsx +4 -0
- package/lib/icons/ChevronUp.tsx +4 -0
- package/lib/icons/ChevronsRight.tsx +4 -0
- package/lib/icons/CircleSlash.tsx +4 -0
- package/lib/icons/CircleX.tsx +4 -0
- package/lib/icons/Code.tsx +4 -0
- package/lib/icons/EllipsisVertical.tsx +4 -0
- package/lib/icons/EyeOff.tsx +4 -0
- package/lib/icons/File.tsx +4 -0
- package/lib/icons/Folder.tsx +4 -0
- package/lib/icons/Folders.tsx +4 -0
- package/lib/icons/Info.tsx +4 -0
- package/lib/icons/MonitorSmartphone.tsx +4 -0
- package/lib/icons/MoonStar.tsx +4 -0
- package/lib/icons/OctagonX.tsx +4 -0
- package/lib/icons/RefreshCw.tsx +4 -0
- package/lib/icons/ShieldX.tsx +4 -0
- package/lib/icons/Sun.tsx +4 -0
- package/lib/icons/TextCursorInput.tsx +4 -0
- package/lib/icons/Trash.tsx +4 -0
- package/lib/icons/ViewIcon.tsx +4 -0
- package/lib/icons/X.tsx +4 -0
- package/lib/icons/iconWithClassName.ts +14 -0
- package/lib/utils.ts +6 -0
- package/metro.config.js +6 -0
- package/nativewind-env.d.ts +1 -0
- package/package.json +89 -0
- package/resourceViews/Container/ContainerConfig.tsx +13 -0
- package/resourceViews/Container/ContainerView.tsx +148 -0
- package/resourceViews/RawCode/RawCodeConfig.tsx +11 -0
- package/resourceViews/RawCode/RawCodeEditor.tsx +37 -0
- package/resourceViews/RawCode/RawCodeView.tsx +67 -0
- package/scripts/adjust-server-paths.js +37 -0
- package/scripts/adjust-standalone-paths.js +28 -0
- package/tailwind.config.js +69 -0
- package/test-server/server-config.json +75 -0
- package/test-server/solid-css-seed.json +11 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as PopoverPrimitive from '@rn-primitives/popover';
|
|
3
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
4
|
+
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
|
|
5
|
+
import { cn } from '~/lib/utils';
|
|
6
|
+
import { TextClassContext } from '~/components/ui/text';
|
|
7
|
+
|
|
8
|
+
const Popover = PopoverPrimitive.Root;
|
|
9
|
+
|
|
10
|
+
const PopoverTrigger = PopoverPrimitive.Trigger;
|
|
11
|
+
|
|
12
|
+
function PopoverContent({
|
|
13
|
+
className,
|
|
14
|
+
align = 'center',
|
|
15
|
+
sideOffset = 4,
|
|
16
|
+
portalHost,
|
|
17
|
+
...props
|
|
18
|
+
}: PopoverPrimitive.ContentProps & {
|
|
19
|
+
ref?: React.RefObject<PopoverPrimitive.ContentRef>;
|
|
20
|
+
portalHost?: string;
|
|
21
|
+
}) {
|
|
22
|
+
return (
|
|
23
|
+
<PopoverPrimitive.Portal hostName={portalHost}>
|
|
24
|
+
<PopoverPrimitive.Overlay
|
|
25
|
+
style={Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined}
|
|
26
|
+
>
|
|
27
|
+
<Animated.View entering={FadeIn.duration(200)} exiting={FadeOut}>
|
|
28
|
+
<TextClassContext.Provider value="text-popover-foreground">
|
|
29
|
+
<PopoverPrimitive.Content
|
|
30
|
+
align={align}
|
|
31
|
+
sideOffset={sideOffset}
|
|
32
|
+
className={cn(
|
|
33
|
+
'z-50 w-72 rounded-md web:cursor-auto border border-border bg-popover p-4 shadow-md shadow-foreground/5 web:outline-none web:data-[side=bottom]:slide-in-from-top-2 web:data-[side=left]:slide-in-from-right-2 web:data-[side=right]:slide-in-from-left-2 web:data-[side=top]:slide-in-from-bottom-2 web:animate-in web:zoom-in-95 web:fade-in-0',
|
|
34
|
+
className,
|
|
35
|
+
)}
|
|
36
|
+
{...props}
|
|
37
|
+
/>
|
|
38
|
+
</TextClassContext.Provider>
|
|
39
|
+
</Animated.View>
|
|
40
|
+
</PopoverPrimitive.Overlay>
|
|
41
|
+
</PopoverPrimitive.Portal>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { Popover, PopoverContent, PopoverTrigger };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as ProgressPrimitive from '@rn-primitives/progress';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Platform, View } from 'react-native';
|
|
4
|
+
import Animated, {
|
|
5
|
+
Extrapolation,
|
|
6
|
+
interpolate,
|
|
7
|
+
useAnimatedStyle,
|
|
8
|
+
useDerivedValue,
|
|
9
|
+
withSpring,
|
|
10
|
+
} from 'react-native-reanimated';
|
|
11
|
+
import { cn } from '~/lib/utils';
|
|
12
|
+
|
|
13
|
+
function Progress({
|
|
14
|
+
className,
|
|
15
|
+
value,
|
|
16
|
+
indicatorClassName,
|
|
17
|
+
...props
|
|
18
|
+
}: ProgressPrimitive.RootProps & {
|
|
19
|
+
ref?: React.RefObject<ProgressPrimitive.RootRef>;
|
|
20
|
+
indicatorClassName?: string;
|
|
21
|
+
}) {
|
|
22
|
+
return (
|
|
23
|
+
<ProgressPrimitive.Root
|
|
24
|
+
className={cn(
|
|
25
|
+
'relative h-4 w-full overflow-hidden rounded-full bg-secondary',
|
|
26
|
+
className,
|
|
27
|
+
)}
|
|
28
|
+
{...props}
|
|
29
|
+
>
|
|
30
|
+
<Indicator value={value} className={indicatorClassName} />
|
|
31
|
+
</ProgressPrimitive.Root>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { Progress };
|
|
36
|
+
|
|
37
|
+
function Indicator({
|
|
38
|
+
value,
|
|
39
|
+
className,
|
|
40
|
+
}: {
|
|
41
|
+
value: number | undefined | null;
|
|
42
|
+
className?: string;
|
|
43
|
+
}) {
|
|
44
|
+
const progress = useDerivedValue(() => value ?? 0);
|
|
45
|
+
|
|
46
|
+
const indicator = useAnimatedStyle(() => {
|
|
47
|
+
return {
|
|
48
|
+
width: withSpring(
|
|
49
|
+
`${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,
|
|
50
|
+
{ overshootClamping: true },
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (Platform.OS === 'web') {
|
|
56
|
+
return (
|
|
57
|
+
<View
|
|
58
|
+
className={cn(
|
|
59
|
+
'h-full w-full flex-1 bg-primary web:transition-all',
|
|
60
|
+
className,
|
|
61
|
+
)}
|
|
62
|
+
style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}
|
|
63
|
+
>
|
|
64
|
+
<ProgressPrimitive.Indicator
|
|
65
|
+
className={cn('h-full w-full', className)}
|
|
66
|
+
/>
|
|
67
|
+
</View>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<ProgressPrimitive.Indicator asChild>
|
|
73
|
+
<Animated.View
|
|
74
|
+
style={indicator}
|
|
75
|
+
className={cn('h-full bg-foreground', className)}
|
|
76
|
+
/>
|
|
77
|
+
</ProgressPrimitive.Indicator>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React, { PropsWithChildren } from 'react';
|
|
2
|
+
import * as RadioGroupPrimitive from '@rn-primitives/radio-group';
|
|
3
|
+
import { View } from 'react-native';
|
|
4
|
+
import { cn } from '~/lib/utils';
|
|
5
|
+
import { Label } from './label';
|
|
6
|
+
|
|
7
|
+
function RadioGroup({
|
|
8
|
+
className,
|
|
9
|
+
...props
|
|
10
|
+
}: RadioGroupPrimitive.RootProps & {
|
|
11
|
+
ref?: React.RefObject<RadioGroupPrimitive.RootRef>;
|
|
12
|
+
}) {
|
|
13
|
+
return (
|
|
14
|
+
<RadioGroupPrimitive.Root
|
|
15
|
+
className={cn('web:grid gap-2', className)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function RadioGroupItem({
|
|
22
|
+
className,
|
|
23
|
+
...props
|
|
24
|
+
}: RadioGroupPrimitive.ItemProps & {
|
|
25
|
+
ref?: React.RefObject<RadioGroupPrimitive.ItemRef>;
|
|
26
|
+
}) {
|
|
27
|
+
return (
|
|
28
|
+
<RadioGroupPrimitive.Item
|
|
29
|
+
className={cn(
|
|
30
|
+
'aspect-square h-4 w-4 native:h-5 native:w-5 rounded-full justify-center items-center border border-primary text-primary web:ring-offset-background web:focus:outline-none web:focus-visible:ring-2 web:focus-visible:ring-ring web:focus-visible:ring-offset-2',
|
|
31
|
+
props.disabled && 'web:cursor-not-allowed opacity-50',
|
|
32
|
+
className,
|
|
33
|
+
)}
|
|
34
|
+
{...props}
|
|
35
|
+
>
|
|
36
|
+
<RadioGroupPrimitive.Indicator className="flex items-center justify-center">
|
|
37
|
+
<View className="aspect-square h-[9px] w-[9px] native:h-[10] native:w-[10] bg-primary rounded-full" />
|
|
38
|
+
</RadioGroupPrimitive.Indicator>
|
|
39
|
+
</RadioGroupPrimitive.Item>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function RadioGroupItemWithLabel({
|
|
44
|
+
value,
|
|
45
|
+
children,
|
|
46
|
+
}: PropsWithChildren<{
|
|
47
|
+
value: string;
|
|
48
|
+
}>) {
|
|
49
|
+
return (
|
|
50
|
+
<View className={'flex-row gap-2 items-center'}>
|
|
51
|
+
<RadioGroupItem aria-labelledby={`label-for-${value}`} value={value} />
|
|
52
|
+
<Label nativeID={`label-for-${value}`} className="flex flex-row gap-1">
|
|
53
|
+
{children}
|
|
54
|
+
</Label>
|
|
55
|
+
</View>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { RadioGroup, RadioGroupItem, RadioGroupItemWithLabel };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as SeparatorPrimitive from '@rn-primitives/separator';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cn } from '~/lib/utils';
|
|
4
|
+
|
|
5
|
+
function Separator({
|
|
6
|
+
className,
|
|
7
|
+
orientation = 'horizontal',
|
|
8
|
+
decorative = true,
|
|
9
|
+
...props
|
|
10
|
+
}: SeparatorPrimitive.RootProps & {
|
|
11
|
+
ref?: React.RefObject<SeparatorPrimitive.RootRef>;
|
|
12
|
+
}) {
|
|
13
|
+
return (
|
|
14
|
+
<SeparatorPrimitive.Root
|
|
15
|
+
decorative={decorative}
|
|
16
|
+
orientation={orientation}
|
|
17
|
+
className={cn(
|
|
18
|
+
'shrink-0 bg-border',
|
|
19
|
+
orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',
|
|
20
|
+
className
|
|
21
|
+
)}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { Separator };
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as SwitchPrimitives from '@rn-primitives/switch';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Platform } from 'react-native';
|
|
4
|
+
import Animated, {
|
|
5
|
+
interpolateColor,
|
|
6
|
+
useAnimatedStyle,
|
|
7
|
+
useDerivedValue,
|
|
8
|
+
withTiming,
|
|
9
|
+
} from 'react-native-reanimated';
|
|
10
|
+
import { cn } from '~/lib/utils';
|
|
11
|
+
import { useThemeChange } from '../ThemeProvider';
|
|
12
|
+
|
|
13
|
+
function SwitchWeb({
|
|
14
|
+
className,
|
|
15
|
+
...props
|
|
16
|
+
}: SwitchPrimitives.RootProps & {
|
|
17
|
+
ref?: React.RefObject<SwitchPrimitives.RootRef>;
|
|
18
|
+
}) {
|
|
19
|
+
return (
|
|
20
|
+
<SwitchPrimitives.Root
|
|
21
|
+
className={cn(
|
|
22
|
+
'peer flex-row h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed',
|
|
23
|
+
props.checked ? 'bg-primary' : 'bg-input',
|
|
24
|
+
props.disabled && 'opacity-50',
|
|
25
|
+
className,
|
|
26
|
+
)}
|
|
27
|
+
{...props}
|
|
28
|
+
>
|
|
29
|
+
<SwitchPrimitives.Thumb
|
|
30
|
+
className={cn(
|
|
31
|
+
'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-md shadow-foreground/5 ring-0 transition-transform',
|
|
32
|
+
props.checked ? 'translate-x-5' : 'translate-x-0',
|
|
33
|
+
)}
|
|
34
|
+
/>
|
|
35
|
+
</SwitchPrimitives.Root>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const RGB_COLORS = {
|
|
40
|
+
light: {
|
|
41
|
+
primary: 'rgb(24, 24, 27)',
|
|
42
|
+
input: 'rgb(228, 228, 231)',
|
|
43
|
+
},
|
|
44
|
+
dark: {
|
|
45
|
+
primary: 'rgb(250, 250, 250)',
|
|
46
|
+
input: 'rgb(39, 39, 42)',
|
|
47
|
+
},
|
|
48
|
+
} as const;
|
|
49
|
+
|
|
50
|
+
function SwitchNative({
|
|
51
|
+
className,
|
|
52
|
+
...props
|
|
53
|
+
}: SwitchPrimitives.RootProps & {
|
|
54
|
+
ref?: React.RefObject<SwitchPrimitives.RootRef>;
|
|
55
|
+
}) {
|
|
56
|
+
const { colorScheme } = useThemeChange();
|
|
57
|
+
const translateX = useDerivedValue(() => (props.checked ? 18 : 0));
|
|
58
|
+
const animatedRootStyle = useAnimatedStyle(() => {
|
|
59
|
+
return {
|
|
60
|
+
backgroundColor: interpolateColor(
|
|
61
|
+
translateX.value,
|
|
62
|
+
[0, 18],
|
|
63
|
+
[RGB_COLORS[colorScheme].input, RGB_COLORS[colorScheme].primary],
|
|
64
|
+
),
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
const animatedThumbStyle = useAnimatedStyle(() => ({
|
|
68
|
+
transform: [
|
|
69
|
+
{ translateX: withTiming(translateX.value, { duration: 200 }) },
|
|
70
|
+
],
|
|
71
|
+
}));
|
|
72
|
+
return (
|
|
73
|
+
<Animated.View
|
|
74
|
+
style={animatedRootStyle}
|
|
75
|
+
className={cn(
|
|
76
|
+
'h-8 w-[46px] rounded-full',
|
|
77
|
+
props.disabled && 'opacity-50',
|
|
78
|
+
)}
|
|
79
|
+
>
|
|
80
|
+
<SwitchPrimitives.Root
|
|
81
|
+
className={cn(
|
|
82
|
+
'flex-row h-8 w-[46px] shrink-0 items-center rounded-full border-2 border-transparent',
|
|
83
|
+
props.checked ? 'bg-primary' : 'bg-input',
|
|
84
|
+
className,
|
|
85
|
+
)}
|
|
86
|
+
{...props}
|
|
87
|
+
>
|
|
88
|
+
<Animated.View style={animatedThumbStyle}>
|
|
89
|
+
<SwitchPrimitives.Thumb
|
|
90
|
+
className={
|
|
91
|
+
'h-7 w-7 rounded-full bg-background shadow-md shadow-foreground/25 ring-0'
|
|
92
|
+
}
|
|
93
|
+
/>
|
|
94
|
+
</Animated.View>
|
|
95
|
+
</SwitchPrimitives.Root>
|
|
96
|
+
</Animated.View>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const Switch = Platform.select({
|
|
101
|
+
web: SwitchWeb,
|
|
102
|
+
default: SwitchNative,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
export { Switch };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Slot from '@rn-primitives/slot';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Text as RNText } from 'react-native';
|
|
4
|
+
import { cn } from '~/lib/utils';
|
|
5
|
+
|
|
6
|
+
const TextClassContext = React.createContext<string | undefined>(undefined);
|
|
7
|
+
|
|
8
|
+
function Text({
|
|
9
|
+
className,
|
|
10
|
+
asChild = false,
|
|
11
|
+
...props
|
|
12
|
+
}: React.ComponentProps<typeof RNText> & {
|
|
13
|
+
ref?: React.RefObject<RNText>;
|
|
14
|
+
asChild?: boolean;
|
|
15
|
+
}) {
|
|
16
|
+
const textClass = React.useContext(TextClassContext);
|
|
17
|
+
const Component = asChild ? Slot.Text : RNText;
|
|
18
|
+
return (
|
|
19
|
+
<Component
|
|
20
|
+
className={cn(
|
|
21
|
+
'text-base text-foreground web:select-text',
|
|
22
|
+
textClass,
|
|
23
|
+
className,
|
|
24
|
+
)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { Text, TextClassContext };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as TooltipPrimitive from '@rn-primitives/tooltip';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
4
|
+
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
|
|
5
|
+
import { TextClassContext } from '~/components/ui/text';
|
|
6
|
+
import { cn } from '~/lib/utils';
|
|
7
|
+
|
|
8
|
+
const Tooltip = TooltipPrimitive.Root;
|
|
9
|
+
|
|
10
|
+
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
11
|
+
|
|
12
|
+
function TooltipContent({
|
|
13
|
+
className,
|
|
14
|
+
sideOffset = 4,
|
|
15
|
+
portalHost,
|
|
16
|
+
...props
|
|
17
|
+
}: TooltipPrimitive.ContentProps & {
|
|
18
|
+
ref?: React.RefObject<TooltipPrimitive.ContentRef>;
|
|
19
|
+
portalHost?: string;
|
|
20
|
+
}) {
|
|
21
|
+
return (
|
|
22
|
+
<TooltipPrimitive.Portal hostName={portalHost}>
|
|
23
|
+
<TooltipPrimitive.Overlay
|
|
24
|
+
style={Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined}
|
|
25
|
+
>
|
|
26
|
+
<Animated.View
|
|
27
|
+
entering={Platform.select({ web: undefined, default: FadeIn })}
|
|
28
|
+
exiting={Platform.select({ web: undefined, default: FadeOut })}
|
|
29
|
+
>
|
|
30
|
+
<TextClassContext.Provider value="text-sm native:text-base text-popover-foreground">
|
|
31
|
+
<TooltipPrimitive.Content
|
|
32
|
+
sideOffset={sideOffset}
|
|
33
|
+
className={cn(
|
|
34
|
+
'z-50 overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 shadow-md shadow-foreground/5 web:animate-in web:fade-in-0 web:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
|
|
35
|
+
className,
|
|
36
|
+
)}
|
|
37
|
+
{...props}
|
|
38
|
+
/>
|
|
39
|
+
</TextClassContext.Provider>
|
|
40
|
+
</Animated.View>
|
|
41
|
+
</TooltipPrimitive.Overlay>
|
|
42
|
+
</TooltipPrimitive.Portal>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { Tooltip, TooltipContent, TooltipTrigger };
|
package/components.json
ADDED
package/global.css
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
:root {
|
|
7
|
+
--background: 0 0% 100%;
|
|
8
|
+
--foreground: 240 10% 3.9%;
|
|
9
|
+
--card: 0 0% 100%;
|
|
10
|
+
--card-foreground: 240 10% 3.9%;
|
|
11
|
+
--popover: 0 0% 100%;
|
|
12
|
+
--popover-foreground: 240 10% 3.9%;
|
|
13
|
+
--primary: 240 5.9% 10%;
|
|
14
|
+
--primary-foreground: 0 0% 98%;
|
|
15
|
+
--secondary: 240 4.8% 95.9%;
|
|
16
|
+
--secondary-foreground: 240 5.9% 10%;
|
|
17
|
+
--muted: 240 4.8% 95.9%;
|
|
18
|
+
--muted-foreground: 240 3.8% 46.1%;
|
|
19
|
+
--accent: 240 4.8% 95.9%;
|
|
20
|
+
--accent-foreground: 240 5.9% 10%;
|
|
21
|
+
--destructive: 0 84.2% 60.2%;
|
|
22
|
+
--destructive-foreground: 0 0% 98%;
|
|
23
|
+
--border: 240 5.9% 90%;
|
|
24
|
+
--input: 240 5.9% 90%;
|
|
25
|
+
--ring: 240 5.9% 10%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.dark:root {
|
|
29
|
+
--background: 240 10% 3.9%;
|
|
30
|
+
--foreground: 0 0% 98%;
|
|
31
|
+
--card: 240 10% 3.9%;
|
|
32
|
+
--card-foreground: 0 0% 98%;
|
|
33
|
+
--popover: 240 10% 3.9%;
|
|
34
|
+
--popover-foreground: 0 0% 98%;
|
|
35
|
+
--primary: 0 0% 98%;
|
|
36
|
+
--primary-foreground: 240 5.9% 10%;
|
|
37
|
+
--secondary: 240 3.7% 15.9%;
|
|
38
|
+
--secondary-foreground: 0 0% 98%;
|
|
39
|
+
--muted: 240 3.7% 15.9%;
|
|
40
|
+
--muted-foreground: 240 5% 64.9%;
|
|
41
|
+
--accent: 240 3.7% 15.9%;
|
|
42
|
+
--accent-foreground: 0 0% 98%;
|
|
43
|
+
--destructive: 0 72% 51%;
|
|
44
|
+
--destructive-foreground: 0 0% 98%;
|
|
45
|
+
--border: 240 3.7% 15.9%;
|
|
46
|
+
--input: 240 3.7% 15.9%;
|
|
47
|
+
--ring: 240 4.9% 83.9%;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.scrollbar-hide {
|
|
52
|
+
-ms-overflow-style: none;
|
|
53
|
+
/* IE/Edge */
|
|
54
|
+
scrollbar-width: none;
|
|
55
|
+
/* Firefox */
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.scrollbar-hide::-webkit-scrollbar {
|
|
59
|
+
display: none;
|
|
60
|
+
/* Chrome, Safari, Opera */
|
|
61
|
+
}
|
package/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { registerRootComponent } from 'expo';
|
|
3
|
+
import { Screen } from './app/index';
|
|
4
|
+
|
|
5
|
+
// https://docs.expo.dev/router/reference/troubleshooting/#expo_router_app_root-not-defined
|
|
6
|
+
|
|
7
|
+
// Must be exported or Fast Refresh won't update the context
|
|
8
|
+
export function App() {
|
|
9
|
+
return <Screen />;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
registerRootComponent(App);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as NavigationBar from 'expo-navigation-bar';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
3
|
+
import { NAV_THEME } from '~/lib/constants';
|
|
4
|
+
|
|
5
|
+
export async function setAndroidNavigationBar(theme: 'light' | 'dark') {
|
|
6
|
+
if (Platform.OS !== 'android') return;
|
|
7
|
+
await NavigationBar.setButtonStyleAsync(theme === 'dark' ? 'light' : 'dark');
|
|
8
|
+
await NavigationBar.setBackgroundColorAsync(
|
|
9
|
+
theme === 'dark' ? NAV_THEME.dark.background : NAV_THEME.light.background,
|
|
10
|
+
);
|
|
11
|
+
}
|
package/lib/constants.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const NAV_THEME = {
|
|
2
|
+
light: {
|
|
3
|
+
background: 'hsl(0 0% 100%)', // background
|
|
4
|
+
border: 'hsl(240 5.9% 90%)', // border
|
|
5
|
+
card: 'hsl(0 0% 100%)', // card
|
|
6
|
+
notification: 'hsl(0 84.2% 60.2%)', // destructive
|
|
7
|
+
primary: 'hsl(240 5.9% 10%)', // primary
|
|
8
|
+
text: 'hsl(240 10% 3.9%)', // foreground
|
|
9
|
+
},
|
|
10
|
+
dark: {
|
|
11
|
+
background: 'hsl(240 10% 3.9%)', // background
|
|
12
|
+
border: 'hsl(240 3.7% 15.9%)', // border
|
|
13
|
+
card: 'hsl(240 10% 3.9%)', // card
|
|
14
|
+
notification: 'hsl(0 72% 51%)', // destructive
|
|
15
|
+
primary: 'hsl(0 0% 98%)', // primary
|
|
16
|
+
text: 'hsl(0 0% 98%)', // foreground
|
|
17
|
+
},
|
|
18
|
+
};
|
package/lib/icons/X.tsx
ADDED