@firecms/ui 3.0.0-canary.132 → 3.0.0-canary.134
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/components/DialogTitle.d.ts +9 -0
- package/dist/components/ExpandablePanel.d.ts +2 -1
- package/dist/components/Sheet.d.ts +1 -0
- package/dist/components/Slider.d.ts +21 -0
- package/dist/components/Typography.d.ts +5 -4
- package/dist/components/index.d.ts +2 -0
- package/dist/index.es.js +124 -13
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +126 -15
- package/dist/index.umd.js.map +1 -1
- package/dist/styles.d.ts +3 -3
- package/package.json +5 -2
- package/src/components/DialogTitle.tsx +34 -0
- package/src/components/ExpandablePanel.tsx +9 -6
- package/src/components/Sheet.tsx +5 -2
- package/src/components/Slider.tsx +109 -0
- package/src/components/Typography.tsx +8 -7
- package/src/components/index.tsx +2 -0
- package/src/styles.ts +3 -3
package/dist/styles.d.ts
CHANGED
@@ -5,8 +5,8 @@ export declare const fieldBackgroundMixin = "bg-opacity-50 bg-slate-200 dark:bg-
|
|
5
5
|
export declare const fieldBackgroundInvisibleMixin = "bg-opacity-0 bg-slate-100 dark:bg-gray-800 dark:bg-opacity-0";
|
6
6
|
export declare const fieldBackgroundDisabledMixin = "dark:bg-gray-800 bg-opacity-50 dark:bg-opacity-90";
|
7
7
|
export declare const fieldBackgroundHoverMixin = "hover:bg-opacity-70 dark:hover:bg-gray-700 dark:hover:bg-opacity-40";
|
8
|
-
export declare const defaultBorderMixin = "border-gray-
|
9
|
-
export declare const paperMixin = "bg-white rounded-md dark:bg-gray-950 border
|
10
|
-
export declare const cardMixin = "bg-white border border-gray-
|
8
|
+
export declare const defaultBorderMixin = "border-gray-200 border-opacity-40 dark:border-gray-700 dark:border-opacity-50";
|
9
|
+
export declare const paperMixin = "bg-white rounded-md dark:bg-gray-950 border border-gray-200 border-opacity-40 dark:border-gray-700 dark:border-opacity-50";
|
10
|
+
export declare const cardMixin = "bg-white border border-gray-200 border-opacity-40 dark:border-transparent rounded-md dark:bg-gray-950 dark:border-gray-700 dark:border-opacity-50 m-1 -p-1";
|
11
11
|
export declare const cardClickableMixin = "hover:bg-primary-bg dark:hover:bg-primary-bg hover:bg-opacity-20 dark:hover:bg-opacity-20 hover:ring-2 hover:ring-primary cursor-pointer";
|
12
12
|
export declare const cardSelectedMixin = "bg-primary-bg dark:bg-primary-bg bg-opacity-30 dark:bg-opacity-10 ring-1 ring-primary ring-opacity-75";
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@firecms/ui",
|
3
3
|
"type": "module",
|
4
|
-
"version": "3.0.0-canary.
|
4
|
+
"version": "3.0.0-canary.134",
|
5
5
|
"description": "Awesome Firebase/Firestore-based headless open-source CMS",
|
6
6
|
"funding": {
|
7
7
|
"url": "https://github.com/sponsors/firecmsco"
|
@@ -61,12 +61,15 @@
|
|
61
61
|
"@radix-ui/react-scroll-area": "^1.2.0",
|
62
62
|
"@radix-ui/react-select": "^2.1.2",
|
63
63
|
"@radix-ui/react-separator": "^1.1.0",
|
64
|
+
"@radix-ui/react-slider": "^1.2.1",
|
64
65
|
"@radix-ui/react-switch": "^1.1.1",
|
65
66
|
"@radix-ui/react-tabs": "^1.1.1",
|
66
67
|
"@radix-ui/react-tooltip": "^1.1.3",
|
68
|
+
"@radix-ui/react-visually-hidden": "^1.1.0",
|
67
69
|
"clsx": "^2.1.1",
|
68
70
|
"cmdk": "^0.2.1",
|
69
71
|
"date-fns": "^3.6.0",
|
72
|
+
"markdown-it": "^14.1.0",
|
70
73
|
"material-icons": "^1.13.12",
|
71
74
|
"react-datepicker": "^7.4.0",
|
72
75
|
"react-dropzone": "^14.2.9",
|
@@ -105,7 +108,7 @@
|
|
105
108
|
"src",
|
106
109
|
"tailwind.config.js"
|
107
110
|
],
|
108
|
-
"gitHead": "
|
111
|
+
"gitHead": "7cb5af44caa66defa18013655b4b9789661b69e0",
|
109
112
|
"publishConfig": {
|
110
113
|
"access": "public"
|
111
114
|
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
3
|
+
import * as VisuallyHidden from "@radix-ui/react-visually-hidden";
|
4
|
+
import { Typography, TypographyProps, TypographyVariant } from "./Typography";
|
5
|
+
|
6
|
+
export type DialogContentProps = TypographyProps & {
|
7
|
+
children: React.ReactNode,
|
8
|
+
hidden?: boolean,
|
9
|
+
className?: string,
|
10
|
+
variant?: TypographyVariant
|
11
|
+
};
|
12
|
+
|
13
|
+
export function DialogTitle({
|
14
|
+
children,
|
15
|
+
hidden,
|
16
|
+
className,
|
17
|
+
variant = "h4",
|
18
|
+
...props
|
19
|
+
}: DialogContentProps) {
|
20
|
+
|
21
|
+
const title = <DialogPrimitive.Title asChild>
|
22
|
+
<Typography variant={variant}
|
23
|
+
className={className}
|
24
|
+
{...props}>
|
25
|
+
{children}
|
26
|
+
</Typography>
|
27
|
+
</DialogPrimitive.Title>;
|
28
|
+
|
29
|
+
if (hidden) {
|
30
|
+
return <VisuallyHidden.Root>{title}</VisuallyHidden.Root>
|
31
|
+
}
|
32
|
+
|
33
|
+
return title;
|
34
|
+
}
|
@@ -15,7 +15,8 @@ export function ExpandablePanel({
|
|
15
15
|
initiallyExpanded = true,
|
16
16
|
titleClassName,
|
17
17
|
asField,
|
18
|
-
className
|
18
|
+
className,
|
19
|
+
innerClassName
|
19
20
|
}: PropsWithChildren<{
|
20
21
|
title: React.ReactNode,
|
21
22
|
invisible?: boolean,
|
@@ -24,7 +25,8 @@ export function ExpandablePanel({
|
|
24
25
|
onExpandedChange?: (expanded: boolean) => void,
|
25
26
|
titleClassName?: string,
|
26
27
|
asField?: boolean,
|
27
|
-
className?: string
|
28
|
+
className?: string,
|
29
|
+
innerClassName?: string
|
28
30
|
}>) {
|
29
31
|
|
30
32
|
useInjectStyles("ExpandablePanel", `
|
@@ -79,7 +81,8 @@ export function ExpandablePanel({
|
|
79
81
|
className={cls(
|
80
82
|
!invisible && defaultBorderMixin + " border",
|
81
83
|
"rounded-md",
|
82
|
-
"w-full"
|
84
|
+
"w-full",
|
85
|
+
className
|
83
86
|
)}
|
84
87
|
open={open}
|
85
88
|
onOpenChange={(updatedOpen: boolean) => {
|
@@ -89,8 +92,8 @@ export function ExpandablePanel({
|
|
89
92
|
|
90
93
|
<Collapsible.Trigger
|
91
94
|
className={cls(
|
92
|
-
"rounded flex items-center justify-between w-full min-h-[52px]",
|
93
|
-
"hover:bg-slate-
|
95
|
+
"rounded-t flex items-center justify-between w-full min-h-[52px]",
|
96
|
+
"hover:bg-slate-200 hover:bg-opacity-20 dark:hover:bg-gray-800 dark:hover:bg-opacity-20",
|
94
97
|
invisible ? "border-b px-2" : "p-4",
|
95
98
|
invisible && defaultBorderMixin,
|
96
99
|
asField && fieldBackgroundMixin,
|
@@ -107,7 +110,7 @@ export function ExpandablePanel({
|
|
107
110
|
overflow: allowOverflow ? "visible" : "hidden"
|
108
111
|
}}
|
109
112
|
>
|
110
|
-
<div className={
|
113
|
+
<div className={innerClassName}>
|
111
114
|
{children}
|
112
115
|
</div>
|
113
116
|
</Collapsible.Content>
|
package/src/components/Sheet.tsx
CHANGED
@@ -7,6 +7,7 @@ interface SheetProps {
|
|
7
7
|
children: React.ReactNode;
|
8
8
|
open: boolean;
|
9
9
|
title?: string;
|
10
|
+
modal?: boolean;
|
10
11
|
side?: "top" | "bottom" | "left" | "right";
|
11
12
|
darkBackground?: boolean;
|
12
13
|
transparent?: boolean;
|
@@ -19,6 +20,7 @@ export const Sheet: React.FC<SheetProps> = ({
|
|
19
20
|
children,
|
20
21
|
side = "right",
|
21
22
|
title,
|
23
|
+
modal = true,
|
22
24
|
open,
|
23
25
|
onOpenChange,
|
24
26
|
transparent,
|
@@ -51,12 +53,13 @@ export const Sheet: React.FC<SheetProps> = ({
|
|
51
53
|
|
52
54
|
return (
|
53
55
|
<DialogPrimitive.Root open={displayed || open}
|
56
|
+
modal={modal}
|
54
57
|
onOpenChange={onOpenChange}>
|
55
58
|
<DialogPrimitive.Portal>
|
56
59
|
<DialogPrimitive.Title autoFocus tabIndex={0}>
|
57
60
|
{title ?? "Sheet"}
|
58
61
|
</DialogPrimitive.Title>
|
59
|
-
<DialogPrimitive.Overlay
|
62
|
+
{modal && <DialogPrimitive.Overlay
|
60
63
|
className={cls(
|
61
64
|
"fixed inset-0 transition-opacity z-20 ease-in-out duration-100 backdrop-blur-sm",
|
62
65
|
"bg-black bg-opacity-50",
|
@@ -68,7 +71,7 @@ export const Sheet: React.FC<SheetProps> = ({
|
|
68
71
|
pointerEvents: displayed ? "auto" : "none"
|
69
72
|
}}
|
70
73
|
onClick={() => onOpenChange && onOpenChange(false)}
|
71
|
-
/>
|
74
|
+
/>}
|
72
75
|
<DialogPrimitive.Content
|
73
76
|
{...props}
|
74
77
|
onFocusCapture={(event) => event.preventDefault()}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
import * as React from "react";
|
2
|
+
import { cls } from "../util";
|
3
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
4
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
5
|
+
|
6
|
+
export interface SliderProps {
|
7
|
+
className?: string;
|
8
|
+
name?: string;
|
9
|
+
disabled?: boolean;
|
10
|
+
orientation?: React.AriaAttributes["aria-orientation"];
|
11
|
+
dir?: "ltr" | "rtl";
|
12
|
+
min?: number;
|
13
|
+
max?: number;
|
14
|
+
step?: number;
|
15
|
+
minStepsBetweenThumbs?: number;
|
16
|
+
value?: number[];
|
17
|
+
defaultValue?: number[];
|
18
|
+
onValueChange?: (value: number[]) => void;
|
19
|
+
onValueCommit?: (value: number[]) => void;
|
20
|
+
inverted?: boolean;
|
21
|
+
form?: string;
|
22
|
+
size?: "small" | "regular";
|
23
|
+
}
|
24
|
+
|
25
|
+
function SliderThumb(props: {
|
26
|
+
props: Omit<React.PropsWithoutRef<SliderProps>, "size" | "className">,
|
27
|
+
index: number,
|
28
|
+
hovered: boolean,
|
29
|
+
classes: string
|
30
|
+
}) {
|
31
|
+
return <TooltipPrimitive.Root open={props.hovered}>
|
32
|
+
<TooltipPrimitive.Trigger asChild>
|
33
|
+
<SliderPrimitive.Thumb
|
34
|
+
className={cls({
|
35
|
+
"border-primary bg-primary hover:bg-primary-dark focus-visible:ring-4 focus-visible:ring-primary outline-none focus-visible:ring-opacity-50": !props.props.disabled,
|
36
|
+
"border-slate-300 bg-slate-300 dark:border-gray-700 dark:bg-gray-700": props.props.disabled
|
37
|
+
},
|
38
|
+
props.classes,
|
39
|
+
"focus:ring-8 focus:ring-primary focus:ring-opacity-75",
|
40
|
+
"hover:ring-8 hover:ring-primary hover:ring-opacity-75",
|
41
|
+
"block rounded-full transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50")}
|
42
|
+
|
43
|
+
/>
|
44
|
+
</TooltipPrimitive.Trigger>
|
45
|
+
<TooltipPrimitive.Content side="top"
|
46
|
+
sideOffset={5}
|
47
|
+
className={cls(
|
48
|
+
"TooltipContent",
|
49
|
+
"max-w-lg leading-relaxed",
|
50
|
+
"z-50 rounded px-3 py-2 text-xs leading-none bg-slate-700 dark:bg-slate-800 bg-opacity-90 font-medium text-slate-50 shadow-2xl select-none duration-400 ease-in transform opacity-100",
|
51
|
+
)}>
|
52
|
+
{props.props.value?.[props.index]}
|
53
|
+
</TooltipPrimitive.Content>
|
54
|
+
</TooltipPrimitive.Root>;
|
55
|
+
}
|
56
|
+
|
57
|
+
const Slider = React.forwardRef<
|
58
|
+
React.ElementRef<typeof SliderPrimitive.Root>,
|
59
|
+
SliderProps
|
60
|
+
>(({
|
61
|
+
className,
|
62
|
+
size = "regular",
|
63
|
+
...props
|
64
|
+
}, ref) => {
|
65
|
+
const [hovered, setHovered] = React.useState(false);
|
66
|
+
|
67
|
+
const thumbSizeClasses =
|
68
|
+
size === "small"
|
69
|
+
? "h-4 w-4" // Smaller size for the thumb
|
70
|
+
: "h-6 w-6"; // Default size
|
71
|
+
|
72
|
+
return (
|
73
|
+
<TooltipPrimitive.Provider delayDuration={200}>
|
74
|
+
<SliderPrimitive.Root
|
75
|
+
ref={ref}
|
76
|
+
onMouseEnter={() => setHovered(true)}
|
77
|
+
onMouseLeave={() => setHovered(false)}
|
78
|
+
className={cls(
|
79
|
+
"relative flex w-full touch-none select-none items-center",
|
80
|
+
className
|
81
|
+
)}
|
82
|
+
{...props}
|
83
|
+
>
|
84
|
+
<SliderPrimitive.Track
|
85
|
+
style={{ height: size === "small" ? 4 : 8 }}
|
86
|
+
className={"relative w-full grow overflow-hidden rounded-full bg-slate-300 bg-opacity-40 dark:bg-gray-700 dark:bg-opacity-40"}>
|
87
|
+
|
88
|
+
<SliderPrimitive.Range
|
89
|
+
className={cls("absolute h-full", {
|
90
|
+
"bg-primary": !props.disabled,
|
91
|
+
"bg-slate-300 dark:bg-gray-700": props.disabled,
|
92
|
+
})}
|
93
|
+
/>
|
94
|
+
</SliderPrimitive.Track>
|
95
|
+
|
96
|
+
{(props.value ?? [0]).map((_, index) => <SliderThumb
|
97
|
+
key={index}
|
98
|
+
index={index}
|
99
|
+
props={props}
|
100
|
+
hovered={hovered}
|
101
|
+
classes={thumbSizeClasses}/>)}
|
102
|
+
</SliderPrimitive.Root>
|
103
|
+
</TooltipPrimitive.Provider>
|
104
|
+
);
|
105
|
+
});
|
106
|
+
|
107
|
+
Slider.displayName = "Slider";
|
108
|
+
|
109
|
+
export { Slider };
|
@@ -1,7 +1,8 @@
|
|
1
1
|
import React, { ReactEventHandler } from "react";
|
2
2
|
import { cls } from "../util";
|
3
3
|
|
4
|
-
export type
|
4
|
+
export type TypographyVariant = keyof typeof typographyVariants;
|
5
|
+
export type TypographyProps<C extends React.ElementType = "span"> = {
|
5
6
|
align?: "center" | "inherit" | "justify" | "left" | "right";
|
6
7
|
children?: React.ReactNode;
|
7
8
|
className?: string;
|
@@ -9,14 +10,14 @@ export type TextProps<C extends React.ElementType> = {
|
|
9
10
|
gutterBottom?: boolean;
|
10
11
|
noWrap?: boolean;
|
11
12
|
paragraph?: boolean;
|
12
|
-
variant?:
|
13
|
+
variant?: TypographyVariant;
|
13
14
|
variantMapping?: { [key: string]: string };
|
14
15
|
color?: "inherit" | "initial" | "primary" | "secondary" | "disabled" | "error";
|
15
16
|
onClick?: ReactEventHandler<HTMLElement>;
|
16
17
|
style?: React.CSSProperties;
|
17
18
|
} & React.ComponentPropsWithoutRef<C>;
|
18
19
|
|
19
|
-
const
|
20
|
+
const typographyVariants = {
|
20
21
|
h1: "h1",
|
21
22
|
h2: "h2",
|
22
23
|
h3: "h3",
|
@@ -76,7 +77,7 @@ const variantToClasses = {
|
|
76
77
|
button: "typography-button"
|
77
78
|
};
|
78
79
|
|
79
|
-
export function Typography<C extends React.ElementType>(
|
80
|
+
export function Typography<C extends React.ElementType = "span">(
|
80
81
|
{
|
81
82
|
align = "inherit",
|
82
83
|
color = "primary",
|
@@ -87,15 +88,15 @@ export function Typography<C extends React.ElementType>(
|
|
87
88
|
noWrap = false,
|
88
89
|
paragraph = false,
|
89
90
|
variant = "body1",
|
90
|
-
variantMapping =
|
91
|
+
variantMapping = typographyVariants,
|
91
92
|
style,
|
92
93
|
onClick,
|
93
94
|
...other
|
94
|
-
}:
|
95
|
+
}: TypographyProps<C>
|
95
96
|
) {
|
96
97
|
const Component =
|
97
98
|
component ||
|
98
|
-
(paragraph ? "p" : variantMapping[variant] ||
|
99
|
+
(paragraph ? "p" : variantMapping[variant] || typographyVariants[variant]) ||
|
99
100
|
"span";
|
100
101
|
|
101
102
|
const classes = cls(
|
package/src/components/index.tsx
CHANGED
@@ -15,6 +15,7 @@ export * from "./DateTimeField";
|
|
15
15
|
export * from "./Dialog";
|
16
16
|
export * from "./DialogActions";
|
17
17
|
export * from "./DialogContent";
|
18
|
+
export * from "./DialogTitle";
|
18
19
|
export * from "./ExpandablePanel";
|
19
20
|
export * from "./FileUpload";
|
20
21
|
export * from "./IconButton";
|
@@ -31,6 +32,7 @@ export * from "./RadioGroup";
|
|
31
32
|
export * from "./SearchBar";
|
32
33
|
export * from "./Select";
|
33
34
|
export * from "./Separator";
|
35
|
+
export * from "./Slider";
|
34
36
|
export * from "./Sheet";
|
35
37
|
export * from "./TextareaAutosize";
|
36
38
|
export * from "./TextField";
|
package/src/styles.ts
CHANGED
@@ -5,8 +5,8 @@ export const fieldBackgroundMixin = "bg-opacity-50 bg-slate-200 dark:bg-gray-800
|
|
5
5
|
export const fieldBackgroundInvisibleMixin = "bg-opacity-0 bg-slate-100 dark:bg-gray-800 dark:bg-opacity-0";
|
6
6
|
export const fieldBackgroundDisabledMixin = "dark:bg-gray-800 bg-opacity-50 dark:bg-opacity-90";
|
7
7
|
export const fieldBackgroundHoverMixin = "hover:bg-opacity-70 dark:hover:bg-gray-700 dark:hover:bg-opacity-40";
|
8
|
-
export const defaultBorderMixin = "border-gray-
|
9
|
-
export const paperMixin = "bg-white rounded-md dark:bg-gray-950 border
|
10
|
-
export const cardMixin = "bg-white border border-gray-
|
8
|
+
export const defaultBorderMixin = "border-gray-200 border-opacity-40 dark:border-gray-700 dark:border-opacity-50";
|
9
|
+
export const paperMixin = "bg-white rounded-md dark:bg-gray-950 border border-gray-200 border-opacity-40 dark:border-gray-700 dark:border-opacity-50";
|
10
|
+
export const cardMixin = "bg-white border border-gray-200 border-opacity-40 dark:border-transparent rounded-md dark:bg-gray-950 dark:border-gray-700 dark:border-opacity-50 m-1 -p-1";
|
11
11
|
export const cardClickableMixin = "hover:bg-primary-bg dark:hover:bg-primary-bg hover:bg-opacity-20 dark:hover:bg-opacity-20 hover:ring-2 hover:ring-primary cursor-pointer";
|
12
12
|
export const cardSelectedMixin = "bg-primary-bg dark:bg-primary-bg bg-opacity-30 dark:bg-opacity-10 ring-1 ring-primary ring-opacity-75";
|