@firecms/ui 3.0.1 → 3.1.0-canary.02232f4

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 (77) hide show
  1. package/README.md +9 -7
  2. package/dist/components/BooleanSwitchWithLabel.d.ts +2 -1
  3. package/dist/components/Card.d.ts +1 -1
  4. package/dist/components/Chip.d.ts +1 -1
  5. package/dist/components/ColorPicker.d.ts +30 -0
  6. package/dist/components/DateTimeField.d.ts +7 -0
  7. package/dist/components/Dialog.d.ts +2 -1
  8. package/dist/components/FileUpload.d.ts +1 -1
  9. package/dist/components/Menu.d.ts +2 -1
  10. package/dist/components/Menubar.d.ts +2 -1
  11. package/dist/components/MultiSelect.d.ts +2 -1
  12. package/dist/components/ResizablePanels.d.ts +16 -0
  13. package/dist/components/SearchBar.d.ts +11 -1
  14. package/dist/components/SearchableSelect.d.ts +48 -0
  15. package/dist/components/Select.d.ts +2 -1
  16. package/dist/components/Sheet.d.ts +1 -0
  17. package/dist/components/Tabs.d.ts +8 -1
  18. package/dist/components/ToggleButtonGroup.d.ts +30 -0
  19. package/dist/components/Tooltip.d.ts +18 -2
  20. package/dist/components/index.d.ts +4 -0
  21. package/dist/hooks/PortalContainerContext.d.ts +31 -0
  22. package/dist/hooks/index.d.ts +1 -0
  23. package/dist/hooks/useOutsideAlerter.d.ts +1 -1
  24. package/dist/icons/FirestoreIcon.d.ts +6 -0
  25. package/dist/icons/components/DatabaseIcon.d.ts +6 -0
  26. package/dist/icons/index.d.ts +2 -0
  27. package/dist/index.css +57 -6
  28. package/dist/index.es.js +2846 -1165
  29. package/dist/index.es.js.map +1 -1
  30. package/dist/index.umd.js +2846 -1165
  31. package/dist/index.umd.js.map +1 -1
  32. package/dist/styles.d.ts +11 -11
  33. package/package.json +7 -7
  34. package/src/components/BooleanSwitch.tsx +3 -3
  35. package/src/components/BooleanSwitchWithLabel.tsx +4 -0
  36. package/src/components/Button.tsx +6 -5
  37. package/src/components/Card.tsx +7 -7
  38. package/src/components/Checkbox.tsx +1 -1
  39. package/src/components/Chip.tsx +4 -3
  40. package/src/components/ColorPicker.tsx +134 -0
  41. package/src/components/DateTimeField.tsx +129 -35
  42. package/src/components/DebouncedTextField.tsx +3 -3
  43. package/src/components/Dialog.tsx +25 -16
  44. package/src/components/DialogActions.tsx +1 -1
  45. package/src/components/ExpandablePanel.tsx +1 -1
  46. package/src/components/FileUpload.tsx +25 -24
  47. package/src/components/IconButton.tsx +3 -2
  48. package/src/components/Menu.tsx +44 -30
  49. package/src/components/Menubar.tsx +14 -3
  50. package/src/components/MultiSelect.tsx +113 -77
  51. package/src/components/Popover.tsx +11 -3
  52. package/src/components/ResizablePanels.tsx +181 -0
  53. package/src/components/SearchBar.tsx +37 -19
  54. package/src/components/SearchableSelect.tsx +335 -0
  55. package/src/components/Select.tsx +86 -73
  56. package/src/components/Separator.tsx +2 -2
  57. package/src/components/Sheet.tsx +12 -3
  58. package/src/components/Skeleton.tsx +4 -2
  59. package/src/components/Slider.tsx +4 -4
  60. package/src/components/Table.tsx +1 -1
  61. package/src/components/Tabs.tsx +150 -37
  62. package/src/components/TextField.tsx +19 -8
  63. package/src/components/TextareaAutosize.tsx +77 -212
  64. package/src/components/ToggleButtonGroup.tsx +67 -0
  65. package/src/components/Tooltip.tsx +16 -8
  66. package/src/components/index.tsx +4 -0
  67. package/src/hooks/PortalContainerContext.tsx +48 -0
  68. package/src/hooks/index.ts +1 -0
  69. package/src/hooks/useInjectStyles.tsx +12 -3
  70. package/src/hooks/useOutsideAlerter.tsx +1 -1
  71. package/src/icons/FirestoreIcon.tsx +47 -0
  72. package/src/icons/components/DatabaseIcon.tsx +10 -0
  73. package/src/icons/index.ts +2 -0
  74. package/src/index.css +57 -6
  75. package/src/styles.ts +11 -11
  76. package/src/util/cls.ts +1 -1
  77. package/tailwind.config.js +2 -3
package/README.md CHANGED
@@ -67,16 +67,18 @@ export default {
67
67
  Finally, you need to define your primary and secondary colors in your `index.css` file:
68
68
 
69
69
  ```css
70
- @import "@firecms/ui/index.css";
70
+ @import 'tailwindcss';
71
+ @import "@firecms/ui/index.css" layer(base);
71
72
 
72
- @tailwind base;
73
- @tailwind components;
74
- @tailwind utilities;
73
+ @custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
74
+
75
+ @source "../index.html";
76
+ @source "./**/*.{js,ts,jsx,tsx}";
77
+ @source "../node_modules/@firecms/**/*.{js,ts,jsx,tsx}";
75
78
 
76
79
  :root {
77
- --fcms-primary: #0070F4;
78
- --fcms-primary-bg: #0061e610;
79
- --fcms-secondary: #FF5B79;
80
+ --color-primary: #0070F4;
81
+ --color-secondary: #FF5B79;
80
82
  }
81
83
  ```
82
84
 
@@ -9,9 +9,10 @@ export type BooleanSwitchWithLabelProps = BooleanSwitchProps & {
9
9
  fullWidth?: boolean;
10
10
  className?: string;
11
11
  inputClassName?: string;
12
+ switchAdornment?: React.ReactNode;
12
13
  };
13
14
  /**
14
15
  * Simple boolean switch.
15
16
  *
16
17
  */
17
- export declare const BooleanSwitchWithLabel: ({ value, position, size, invisible, onValueChange, error, label, autoFocus, disabled, className, fullWidth, inputClassName, ...props }: BooleanSwitchWithLabelProps) => import("react/jsx-runtime").JSX.Element;
18
+ export declare const BooleanSwitchWithLabel: ({ value, position, size, invisible, onValueChange, error, label, autoFocus, disabled, className, fullWidth, inputClassName, switchAdornment, ...props }: BooleanSwitchWithLabelProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,7 @@ import React from "react";
2
2
  type CardProps = {
3
3
  children: React.ReactNode;
4
4
  style?: React.CSSProperties;
5
- onClick?: () => void;
5
+ onClick?: (e?: React.MouseEvent) => void;
6
6
  className?: string;
7
7
  };
8
8
  declare const Card: React.ForwardRefExoticComponent<CardProps & React.RefAttributes<HTMLDivElement>>;
@@ -19,4 +19,4 @@ export interface ChipProps {
19
19
  /**
20
20
  * @group Preview components
21
21
  */
22
- export declare function Chip({ children, colorScheme, error, outlined, onClick, icon, size, className, style }: ChipProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,30 @@
1
+ import { ChipColorKey } from "./Chip";
2
+ export interface ColorPickerProps {
3
+ /**
4
+ * Currently selected color key
5
+ */
6
+ value?: ChipColorKey;
7
+ /**
8
+ * Callback when color selection changes. Passes undefined when "Auto" is selected.
9
+ */
10
+ onChange: (colorKey: ChipColorKey | undefined) => void;
11
+ /**
12
+ * Size of the color swatches
13
+ */
14
+ size?: "small" | "medium";
15
+ /**
16
+ * Whether to show the "Auto" option that clears the selection
17
+ */
18
+ allowClear?: boolean;
19
+ /**
20
+ * Whether the picker is disabled
21
+ */
22
+ disabled?: boolean;
23
+ }
24
+ /**
25
+ * A color picker component that displays a grid of predefined CHIP_COLORS.
26
+ * Used for selecting colors for enum values, tags, and other chip-based UI elements.
27
+ *
28
+ * @group Form components
29
+ */
30
+ export declare function ColorPicker({ value, onChange, size, allowClear, disabled }: ColorPickerProps): import("react/jsx-runtime").JSX.Element;
@@ -13,5 +13,12 @@ export type DateTimeFieldProps = {
13
13
  inputClassName?: string;
14
14
  invisible?: boolean;
15
15
  locale?: string;
16
+ /**
17
+ * IANA timezone string (e.g., "America/New_York", "Europe/London").
18
+ * Used to display and input dates in the specified timezone.
19
+ * The value passed to onChange will always be in UTC.
20
+ * If not provided, uses the user's local timezone.
21
+ */
22
+ timezone?: string;
16
23
  };
17
24
  export declare const DateTimeField: React.FC<DateTimeFieldProps>;
@@ -19,6 +19,7 @@ export type DialogProps = {
19
19
  * If `true`, the dialog will not focus the first focusable element when opened.
20
20
  */
21
21
  disableInitialFocus?: boolean;
22
+ portalContainer?: HTMLElement | null;
22
23
  };
23
24
  declare const widthClasses: {
24
25
  xs: string;
@@ -34,5 +35,5 @@ declare const widthClasses: {
34
35
  "7xl": string;
35
36
  full: string;
36
37
  };
37
- export declare const Dialog: ({ open, onOpenChange, children, className, containerClassName, fullWidth, fullHeight, fullScreen, scrollable, maxWidth, modal, onOpenAutoFocus, onEscapeKeyDown, onPointerDownOutside, onInteractOutside, disableInitialFocus }: DialogProps) => import("react/jsx-runtime").JSX.Element;
38
+ export declare const Dialog: ({ open, onOpenChange, children, className, containerClassName, fullWidth, fullHeight, fullScreen, scrollable, maxWidth, modal, onOpenAutoFocus, onEscapeKeyDown, onPointerDownOutside, onInteractOutside, disableInitialFocus, portalContainer }: DialogProps) => import("react/jsx-runtime").JSX.Element;
38
39
  export {};
@@ -18,6 +18,6 @@ export type FileUploadProps = {
18
18
  title?: React.ReactNode;
19
19
  uploadDescription?: React.ReactNode;
20
20
  preventDropOnDocument?: boolean;
21
- size?: "medium" | "large";
21
+ size?: "small" | "medium" | "large";
22
22
  };
23
23
  export declare function FileUpload({ accept, onFilesAdded, onFilesRejected, maxSize, disabled, maxFiles, title, uploadDescription, children, preventDropOnDocument, size }: React.PropsWithChildren<FileUploadProps>): import("react/jsx-runtime").JSX.Element;
@@ -16,7 +16,8 @@ export { Menu };
16
16
  export type MenuItemProps = {
17
17
  children: React.ReactNode;
18
18
  dense?: boolean;
19
+ disabled?: boolean;
19
20
  onClick?: (event: React.MouseEvent) => void;
20
21
  className?: string;
21
22
  };
22
- export declare const MenuItem: React.MemoExoticComponent<({ children, dense, onClick, className }: MenuItemProps) => import("react/jsx-runtime").JSX.Element>;
23
+ export declare const MenuItem: React.MemoExoticComponent<({ children, dense, disabled, onClick, className }: MenuItemProps) => import("react/jsx-runtime").JSX.Element>;
@@ -12,8 +12,9 @@ export declare function MenubarTrigger({ children, onSelect, className }: {
12
12
  onSelect?: (event: React.SyntheticEvent) => void;
13
13
  className?: string;
14
14
  }): import("react/jsx-runtime").JSX.Element;
15
- export declare function MenubarPortal({ children, }: {
15
+ export declare function MenubarPortal({ children, portalContainer, }: {
16
16
  children: React.ReactNode;
17
+ portalContainer?: HTMLElement | null;
17
18
  }): import("react/jsx-runtime").JSX.Element;
18
19
  export declare function MenubarContent({ children, className, align, sideOffset, alignOffset, onSelect, ...rest }: {
19
20
  children: React.ReactNode;
@@ -31,11 +31,12 @@ interface MultiSelectProps<T extends MultiSelectValue = string> {
31
31
  multiple?: boolean;
32
32
  includeSelectAll?: boolean;
33
33
  includeClear?: boolean;
34
- inputRef?: React.RefObject<HTMLButtonElement>;
34
+ inputRef?: React.RefObject<HTMLButtonElement | null>;
35
35
  padding?: boolean;
36
36
  invisible?: boolean;
37
37
  children: React.ReactNode;
38
38
  renderValues?: (values: T[]) => React.ReactNode;
39
+ portalContainer?: HTMLElement | null;
39
40
  }
40
41
  export declare const MultiSelect: React.ForwardRefExoticComponent<MultiSelectProps<string> & React.RefAttributes<HTMLButtonElement>>;
41
42
  export interface MultiSelectItemProps<T extends MultiSelectValue = string> {
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ export type ResizablePanelsProps = {
3
+ firstPanel: React.ReactNode;
4
+ secondPanel: React.ReactNode;
5
+ /** Whether the first panel is visible (e.g. Sidebar) */
6
+ showFirstPanel?: boolean;
7
+ /** Whether the second panel is visible (e.g. Results) */
8
+ showSecondPanel?: boolean;
9
+ /** 0-100 representing the width/height of the first panel */
10
+ panelSizePercent: number;
11
+ onPanelSizeChange: (sizePercent: number) => void;
12
+ minPanelSizePx?: number;
13
+ orientation?: 'horizontal' | 'vertical';
14
+ className?: string;
15
+ };
16
+ export declare function ResizablePanels({ firstPanel, secondPanel, showFirstPanel, showSecondPanel, panelSizePercent, onPanelSizeChange, minPanelSizePx, orientation, className }: ResizablePanelsProps): import("react/jsx-runtime").JSX.Element;
@@ -4,6 +4,16 @@ interface SearchBarProps {
4
4
  onTextSearch?: (searchString?: string) => void;
5
5
  placeholder?: string;
6
6
  expandable?: boolean;
7
+ /**
8
+ * Size of the search bar.
9
+ * - "small": 32px height (matches TextField small)
10
+ * - "medium": 44px height (matches TextField medium)
11
+ * @default "medium"
12
+ */
13
+ size?: "small" | "medium";
14
+ /**
15
+ * @deprecated Use size="medium" or size="small" instead. This prop will be removed in a future version.
16
+ */
7
17
  large?: boolean;
8
18
  innerClassName?: string;
9
19
  className?: string;
@@ -12,5 +22,5 @@ interface SearchBarProps {
12
22
  loading?: boolean;
13
23
  inputRef?: React.Ref<HTMLInputElement>;
14
24
  }
15
- export declare function SearchBar({ onClick, onTextSearch, placeholder, expandable, large, innerClassName, className, autoFocus, disabled, loading, inputRef }: SearchBarProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function SearchBar({ onClick, onTextSearch, placeholder, expandable, size, large, innerClassName, className, autoFocus, disabled, loading, inputRef }: SearchBarProps): import("react/jsx-runtime").JSX.Element;
16
26
  export {};
@@ -0,0 +1,48 @@
1
+ import * as React from "react";
2
+ export interface SearchableSelectProps {
3
+ /** Currently selected value. Can be one of the items or a custom string. */
4
+ value?: string;
5
+ /** Callback when the value changes (from selection or custom input). */
6
+ onValueChange?: (value: string) => void;
7
+ /** Placeholder shown when no value is selected. */
8
+ placeholder?: string;
9
+ /** Label above the field. */
10
+ label?: React.ReactNode | string;
11
+ /** Size variant. */
12
+ size?: "smallest" | "small" | "medium" | "large";
13
+ /** Whether the field is disabled. */
14
+ disabled?: boolean;
15
+ /** Whether to show an error state. */
16
+ error?: boolean;
17
+ /** Whether to use the invisible (borderless) style. */
18
+ invisible?: boolean;
19
+ /** CSS class for the trigger button. */
20
+ className?: string;
21
+ /** CSS class for the trigger input area. */
22
+ inputClassName?: string;
23
+ /** Render the selected value in a custom way in the trigger. */
24
+ renderValue?: (value: string) => React.ReactNode;
25
+ /** Whether the popover should trap focus. */
26
+ modalPopover?: boolean;
27
+ /** If true, allow accepting the typed text as the value even if it doesn't match an item. */
28
+ allowCustomValues?: boolean;
29
+ /** Portal container element. */
30
+ portalContainer?: HTMLElement | null;
31
+ /** If true, auto-open the popover on mount so the user can start typing immediately. */
32
+ autoFocus?: boolean;
33
+ /** The option items — use SearchableSelectItem. */
34
+ children: React.ReactNode;
35
+ }
36
+ export interface SearchableSelectItemProps {
37
+ value: string;
38
+ children?: React.ReactNode;
39
+ className?: string;
40
+ }
41
+ export declare const SearchableSelect: React.ForwardRefExoticComponent<SearchableSelectProps & React.RefAttributes<HTMLButtonElement>>;
42
+ /**
43
+ * A single option inside a SearchableSelect.
44
+ * The `value` prop is the string value that gets selected.
45
+ * The `children` is what's displayed in the dropdown.
46
+ * This component is not rendered directly — SearchableSelect reads its props.
47
+ */
48
+ export declare function SearchableSelectItem(_props: SearchableSelectItemProps): null;
@@ -20,11 +20,12 @@ export type SelectProps<T extends SelectValue = string> = {
20
20
  error?: boolean;
21
21
  position?: "item-aligned" | "popper";
22
22
  endAdornment?: React.ReactNode;
23
- inputRef?: React.RefObject<HTMLButtonElement>;
23
+ inputRef?: React.RefObject<HTMLButtonElement | null>;
24
24
  padding?: boolean;
25
25
  invisible?: boolean;
26
26
  children?: React.ReactNode;
27
27
  dataType?: "string" | "number" | "boolean";
28
+ portalContainer?: HTMLElement | null;
28
29
  };
29
30
  export declare const Select: React.ForwardRefExoticComponent<SelectProps<string> & React.RefAttributes<HTMLDivElement>>;
30
31
  export type SelectItemProps<T extends SelectValue = string> = {
@@ -13,6 +13,7 @@ interface SheetProps {
13
13
  style?: React.CSSProperties;
14
14
  overlayClassName?: string;
15
15
  overlayStyle?: React.CSSProperties;
16
+ portalContainer?: HTMLElement | null;
16
17
  }
17
18
  export declare const Sheet: React.FC<SheetProps>;
18
19
  export {};
@@ -1,12 +1,18 @@
1
1
  import React from "react";
2
+ type TabsMode = "primary" | "secondary";
2
3
  export type TabsProps = {
3
4
  value: string;
4
5
  children: React.ReactNode;
5
6
  innerClassName?: string;
6
7
  className?: string;
7
8
  onValueChange: (value: string) => void;
9
+ /**
10
+ * "primary" renders the default pill-style tabs.
11
+ * "secondary" renders underline-style tabs suitable for inner/nested panels.
12
+ */
13
+ mode?: TabsMode;
8
14
  };
9
- export declare function Tabs({ value, onValueChange, className, innerClassName, children }: TabsProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function Tabs({ value, onValueChange, className, innerClassName, children, mode }: TabsProps): import("react/jsx-runtime").JSX.Element;
10
16
  export type TabProps = {
11
17
  value: string;
12
18
  className?: string;
@@ -15,3 +21,4 @@ export type TabProps = {
15
21
  disabled?: boolean;
16
22
  };
17
23
  export declare function Tab({ value, className, innerClassName, children, disabled }: TabProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ export type ToggleButtonOption<T extends string = string> = {
3
+ value: T;
4
+ label: string;
5
+ icon?: React.ReactNode;
6
+ disabled?: boolean;
7
+ };
8
+ export type ToggleButtonGroupProps<T extends string = string> = {
9
+ /**
10
+ * Currently selected value
11
+ */
12
+ value: T;
13
+ /**
14
+ * Callback when value changes
15
+ */
16
+ onValueChange: (value: T) => void;
17
+ /**
18
+ * Options to display
19
+ */
20
+ options: ToggleButtonOption<T>[];
21
+ /**
22
+ * Additional class names for the container
23
+ */
24
+ className?: string;
25
+ };
26
+ /**
27
+ * A toggle button group component for selecting one option from a set.
28
+ * Displays options as buttons in a horizontal row with active state styling.
29
+ */
30
+ export declare function ToggleButtonGroup<T extends string = string>({ value, onValueChange, options, className }: ToggleButtonGroupProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -15,5 +15,21 @@ export type TooltipProps = {
15
15
  className?: string;
16
16
  container?: HTMLElement;
17
17
  style?: React.CSSProperties;
18
- };
19
- export declare const Tooltip: ({ open, defaultOpen, side, delayDuration, sideOffset, align, onOpenChange, title, tooltipClassName, tooltipStyle, children, asChild, container, className, style }: TooltipProps) => import("react/jsx-runtime").JSX.Element;
18
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "title">;
19
+ export declare const Tooltip: React.ForwardRefExoticComponent<{
20
+ open?: boolean;
21
+ defaultOpen?: boolean;
22
+ onOpenChange?: (open: boolean) => void;
23
+ side?: "top" | "bottom" | "left" | "right";
24
+ align?: "start" | "center" | "end";
25
+ sideOffset?: number;
26
+ title?: string | React.ReactNode;
27
+ delayDuration?: number;
28
+ asChild?: boolean;
29
+ tooltipClassName?: string;
30
+ tooltipStyle?: React.CSSProperties;
31
+ children: React.ReactNode;
32
+ className?: string;
33
+ container?: HTMLElement;
34
+ style?: React.CSSProperties;
35
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "title"> & React.RefAttributes<HTMLDivElement>>;
@@ -11,6 +11,7 @@ export * from "./Collapse";
11
11
  export * from "./CircularProgress";
12
12
  export * from "./Checkbox";
13
13
  export * from "./Chip";
14
+ export * from "./ColorPicker";
14
15
  export * from "./DateTimeField";
15
16
  export * from "./Dialog";
16
17
  export * from "./DialogActions";
@@ -29,7 +30,9 @@ export * from "./Menubar";
29
30
  export * from "./MultiSelect";
30
31
  export * from "./Paper";
31
32
  export * from "./RadioGroup";
33
+ export * from "./ResizablePanels";
32
34
  export * from "./SearchBar";
35
+ export * from "./SearchableSelect";
33
36
  export * from "./Select";
34
37
  export * from "./Separator";
35
38
  export * from "./Slider";
@@ -44,3 +47,4 @@ export * from "./Popover";
44
47
  export * from "./Badge";
45
48
  export * from "./DebouncedTextField";
46
49
  export * from "./Skeleton";
50
+ export * from "./ToggleButtonGroup";
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ export interface PortalContainerContextType {
3
+ container: HTMLElement | null;
4
+ }
5
+ export interface PortalContainerProviderProps {
6
+ container: HTMLElement | null;
7
+ children: React.ReactNode;
8
+ }
9
+ /**
10
+ * Provider component that sets the portal container for all descendants.
11
+ * This can be used at any level of the tree to specify where portals should be attached.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const containerRef = useRef<HTMLDivElement>(null);
16
+ *
17
+ * <div ref={containerRef}>
18
+ * <PortalContainerProvider container={containerRef.current}>
19
+ * <YourComponents />
20
+ * </PortalContainerProvider>
21
+ * </div>
22
+ * ```
23
+ */
24
+ export declare function PortalContainerProvider({ container, children }: PortalContainerProviderProps): import("react/jsx-runtime").JSX.Element;
25
+ /**
26
+ * Hook to access the portal container from context.
27
+ * Returns null if no provider is found in the tree.
28
+ *
29
+ * @returns The portal container element or null
30
+ */
31
+ export declare function usePortalContainer(): HTMLElement | null;
@@ -2,3 +2,4 @@ export * from "./useInjectStyles";
2
2
  export * from "./useOutsideAlerter";
3
3
  export * from "./useDebounceValue";
4
4
  export * from "./useIconStyles";
5
+ export * from "./PortalContainerContext";
@@ -2,4 +2,4 @@ import { RefObject } from "react";
2
2
  /**
3
3
  * Hook that alerts clicks outside the passed ref
4
4
  */
5
- export declare function useOutsideAlerter(ref: RefObject<HTMLElement>, onOutsideClick: () => void, active?: boolean): void;
5
+ export declare function useOutsideAlerter(ref: RefObject<HTMLElement | null>, onOutsideClick: () => void, active?: boolean): void;
@@ -0,0 +1,6 @@
1
+ import { IconProps } from "./Icon";
2
+ /**
3
+ * Firebase Firestore flame icon (monochrome, uses currentColor).
4
+ * @group Icons
5
+ */
6
+ export declare function FirestoreIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import { IconProps } from "../Icon";
3
+ /**
4
+ * @group Icons
5
+ */
6
+ export declare const DatabaseIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<HTMLSpanElement>>;
@@ -3,6 +3,7 @@ export * from "./cool_icon_keys";
3
3
  export * from "./Icon";
4
4
  export * from "./GitHubIcon";
5
5
  export * from "./HandleIcon";
6
+ export * from "./FirestoreIcon";
6
7
  export * from "./components/_10kIcon";
7
8
  export * from "./components/_10mpIcon";
8
9
  export * from "./components/_11mpIcon";
@@ -522,6 +523,7 @@ export * from "./components/DataThresholdingIcon";
522
523
  export * from "./components/DataUsageIcon";
523
524
  export * from "./components/DatasetIcon";
524
525
  export * from "./components/DatasetLinkedIcon";
526
+ export * from "./components/DatabaseIcon";
525
527
  export * from "./components/DateRangeIcon";
526
528
  export * from "./components/DeblurIcon";
527
529
  export * from "./components/DeckIcon";
package/dist/index.css CHANGED
@@ -1,3 +1,59 @@
1
+ @theme {
2
+ /* Font Families */
3
+ --font-sans: 'Rubik', 'Roboto', 'Helvetica', 'Arial', sans-serif;
4
+ --font-headers: 'Rubik', 'Roboto', 'Helvetica', 'Arial', sans-serif;
5
+ --font-mono: 'JetBrains Mono', 'Space Mono', 'Lucida Console', monospace;
6
+
7
+ /* Colors */
8
+ --color-primary: #0070F4;
9
+ --color-primary-light: oklch(from var(--color-primary) calc(l + 0.15) c h);
10
+ --color-primary-dark: oklch(from var(--color-primary) calc(l - 0.15) c h);
11
+ --color-secondary: #FF5B79;
12
+ --color-secondary-light: oklch(from var(--color-secondary) calc(l + 0.15) c h);
13
+ --color-secondary-dark: oklch(from var(--color-secondary) calc(l - 0.15) c h);
14
+
15
+ --color-primary-bg: oklch(from var(--color-primary) l c h / 0.1);
16
+ --color-secondary-bg: oklch(from var(--color-secondary) l c h / 0.1);
17
+
18
+ /* Field Colors */
19
+ --color-field-disabled: rgb(224 224 226);
20
+ --color-field-disabled-dark: rgb(35 35 37);
21
+
22
+ /* Text Colors */
23
+ --color-text-primary: rgba(0, 0, 0, 0.87);
24
+ --color-text-secondary: rgba(0, 0, 0, 0.52);
25
+ --color-text-disabled: rgba(0, 0, 0, 0.38);
26
+ --color-text-primary-dark: #ffffff;
27
+ --color-text-secondary-dark: rgba(255, 255, 255, 0.6);
28
+ --color-text-disabled-dark: rgba(255, 255, 255, 0.48);
29
+
30
+ /* Surface Colors */
31
+ --color-surface-50: #f8f8fc;
32
+ --color-surface-100: #e7e7eb;
33
+ --color-surface-200: #cfcfd6;
34
+ --color-surface-300: #b7b7bf;
35
+ --color-surface-400: #a0a0a9;
36
+ --color-surface-500: #87878f;
37
+ --color-surface-600: #6b6b74;
38
+ --color-surface-700: #454552;
39
+ --color-surface-800: #292934;
40
+ --color-surface-900: #18181c;
41
+ --color-surface-950: #101013;
42
+
43
+ /* Surface Accent Colors */
44
+ --color-surface-accent-50: #f8fafc;
45
+ --color-surface-accent-100: #f1f5f9;
46
+ --color-surface-accent-200: #e2e8f0;
47
+ --color-surface-accent-300: #cbd5e1;
48
+ --color-surface-accent-400: #94a3b8;
49
+ --color-surface-accent-500: #64748b;
50
+ --color-surface-accent-600: #475569;
51
+ --color-surface-accent-700: #334155;
52
+ --color-surface-accent-800: #1e293b;
53
+ --color-surface-accent-900: #0f172a;
54
+ --color-surface-accent-950: #020617;
55
+ }
56
+
1
57
  /* Chrome, Safari and Opera */
2
58
  .no-scrollbar::-webkit-scrollbar {
3
59
  display: none;
@@ -63,12 +119,7 @@
63
119
  @apply text-sm font-semibold uppercase;
64
120
  }
65
121
 
66
-
67
122
  :focus-visible {
68
- @apply outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent
69
- }
70
-
71
- a {
72
- @apply text-blue-600 dark:text-blue-400 dark:hover:text-blue-600 hover:text-blue-800
123
+ @apply outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-transparent
73
124
  }
74
125