@firecms/ui 3.0.0-canary.133 → 3.0.0-canary.135

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/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-100 dark:border-gray-800 dark:border-opacity-80";
9
- export declare const paperMixin = "bg-white rounded-md dark:bg-gray-950 border dark:border-gray-800 dark:border-opacity-80 border-gray-100";
10
- export declare const cardMixin = "bg-white border border-gray-100 dark:border-transparent rounded-md dark:bg-gray-950 dark:border-gray-800 dark:border-opacity-50 m-1 -p-1";
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.133",
4
+ "version": "3.0.0-canary.135",
5
5
  "description": "Awesome Firebase/Firestore-based headless open-source CMS",
6
6
  "funding": {
7
7
  "url": "https://github.com/sponsors/firecmsco"
@@ -61,9 +61,11 @@
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",
@@ -106,7 +108,7 @@
106
108
  "src",
107
109
  "tailwind.config.js"
108
110
  ],
109
- "gitHead": "b8b711f9dd66ea8c5326bfe003df80b6f111e5f9",
111
+ "gitHead": "342200c4215d87e0108c948160dc4f9b22b896be",
110
112
  "publishConfig": {
111
113
  "access": "public"
112
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
+ }
@@ -92,7 +92,7 @@ export function ExpandablePanel({
92
92
 
93
93
  <Collapsible.Trigger
94
94
  className={cls(
95
- "rounded flex items-center justify-between w-full min-h-[52px]",
95
+ "rounded-t flex items-center justify-between w-full min-h-[52px]",
96
96
  "hover:bg-slate-200 hover:bg-opacity-20 dark:hover:bg-gray-800 dark:hover:bg-opacity-20",
97
97
  invisible ? "border-b px-2" : "p-4",
98
98
  invisible && defaultBorderMixin,
@@ -8,6 +8,7 @@ interface SheetProps {
8
8
  open: boolean;
9
9
  title?: string;
10
10
  modal?: boolean;
11
+ includeBackgroundOverlay?: boolean;
11
12
  side?: "top" | "bottom" | "left" | "right";
12
13
  darkBackground?: boolean;
13
14
  transparent?: boolean;
@@ -21,6 +22,7 @@ export const Sheet: React.FC<SheetProps> = ({
21
22
  side = "right",
22
23
  title,
23
24
  modal = true,
25
+ includeBackgroundOverlay = true,
24
26
  open,
25
27
  onOpenChange,
26
28
  transparent,
@@ -53,12 +55,13 @@ export const Sheet: React.FC<SheetProps> = ({
53
55
 
54
56
  return (
55
57
  <DialogPrimitive.Root open={displayed || open}
58
+ modal={modal}
56
59
  onOpenChange={onOpenChange}>
57
60
  <DialogPrimitive.Portal>
58
61
  <DialogPrimitive.Title autoFocus tabIndex={0}>
59
62
  {title ?? "Sheet"}
60
63
  </DialogPrimitive.Title>
61
- {modal && <DialogPrimitive.Overlay
64
+ {includeBackgroundOverlay && <DialogPrimitive.Overlay
62
65
  className={cls(
63
66
  "fixed inset-0 transition-opacity z-20 ease-in-out duration-100 backdrop-blur-sm",
64
67
  "bg-black bg-opacity-50",
@@ -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 outline-none": !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-visible:ring-4 focus-visible:ring-primary focus-visible:ring-opacity-50",
40
+ "hover:ring-4 hover:ring-primary hover:ring-opacity-25",
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 TextProps<C extends React.ElementType> = {
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?: keyof typeof defaultVariantMapping;
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 defaultVariantMapping = {
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 = defaultVariantMapping,
91
+ variantMapping = typographyVariants,
91
92
  style,
92
93
  onClick,
93
94
  ...other
94
- }: TextProps<C>
95
+ }: TypographyProps<C>
95
96
  ) {
96
97
  const Component =
97
98
  component ||
98
- (paragraph ? "p" : variantMapping[variant] || defaultVariantMapping[variant]) ||
99
+ (paragraph ? "p" : variantMapping[variant] || typographyVariants[variant]) ||
99
100
  "span";
100
101
 
101
102
  const classes = cls(
@@ -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-100 dark:border-gray-800 dark:border-opacity-80";
9
- export const paperMixin = "bg-white rounded-md dark:bg-gray-950 border dark:border-gray-800 dark:border-opacity-80 border-gray-100";
10
- export const cardMixin = "bg-white border border-gray-100 dark:border-transparent rounded-md dark:bg-gray-950 dark:border-gray-800 dark:border-opacity-50 m-1 -p-1";
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";