@pixpilot/shadcn-ui 0.36.0 → 0.37.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.
@@ -0,0 +1,82 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_svg = require('./utils/svg.cjs');
3
+ let __pixpilot_shadcn = require("@pixpilot/shadcn");
4
+ __pixpilot_shadcn = require_rolldown_runtime.__toESM(__pixpilot_shadcn);
5
+ let react = require("react");
6
+ react = require_rolldown_runtime.__toESM(react);
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
9
+
10
+ //#region src/IconToggle.tsx
11
+ /**
12
+ * IconToggle - A toggle button component with customizable icons for checked/unchecked states.
13
+ * Perfect for visibility toggles, theme switches, or any boolean state with visual feedback.
14
+ * Icons can be React components (like lucide-react icons) or SVG markup strings.
15
+ */
16
+ const IconToggle = react.default.forwardRef(({ checked: controlledChecked, defaultChecked = false, onCheckedChange, onChange, checkedIcon, uncheckedIcon, size = "default", variant = "default", className, disabled,...props }, ref) => {
17
+ const [uncontrolledChecked, setUncontrolledChecked] = react.default.useState(defaultChecked);
18
+ const isControlled = controlledChecked !== void 0;
19
+ const checked = isControlled ? controlledChecked : uncontrolledChecked;
20
+ const handleClick = (0, react.useCallback)((e) => {
21
+ if (disabled) return;
22
+ const newChecked = !checked;
23
+ if (!isControlled) setUncontrolledChecked(newChecked);
24
+ onCheckedChange?.(newChecked);
25
+ onChange?.(newChecked);
26
+ props.onClick?.(e);
27
+ }, [
28
+ checked,
29
+ disabled,
30
+ isControlled,
31
+ onChange,
32
+ onCheckedChange,
33
+ props
34
+ ]);
35
+ const renderIcon = (icon) => {
36
+ if (icon === void 0 || icon === null) return null;
37
+ if (require_svg.isSvgMarkupString(icon)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38
+ "data-slot": "svg-mask",
39
+ "aria-hidden": "true",
40
+ className: "inline-block h-4 w-4",
41
+ style: {
42
+ backgroundColor: "currentColor",
43
+ WebkitMaskImage: require_svg.svgMarkupToMaskUrl(icon),
44
+ maskImage: require_svg.svgMarkupToMaskUrl(icon),
45
+ WebkitMaskRepeat: "no-repeat",
46
+ maskRepeat: "no-repeat",
47
+ WebkitMaskPosition: "center",
48
+ maskPosition: "center",
49
+ WebkitMaskSize: "contain",
50
+ maskSize: "contain"
51
+ }
52
+ });
53
+ return icon;
54
+ };
55
+ const sizeClasses = {
56
+ sm: "size-7",
57
+ default: "size-9",
58
+ lg: "size-11"
59
+ };
60
+ const variantClasses = {
61
+ default: "bg-background border border-input hover:bg-accent hover:text-accent-foreground data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:hover:bg-primary/90",
62
+ outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground data-[state=checked]:border-primary data-[state=checked]:text-primary",
63
+ ghost: "hover:bg-accent hover:text-accent-foreground data-[state=checked]:bg-primary/10 data-[state=checked]:text-primary"
64
+ };
65
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
66
+ ref,
67
+ type: "button",
68
+ role: "switch",
69
+ "aria-checked": checked,
70
+ "data-state": checked ? "checked" : "unchecked",
71
+ "data-slot": "icon-toggle",
72
+ disabled,
73
+ className: (0, __pixpilot_shadcn.cn)("inline-flex items-center justify-center rounded-md text-sm font-medium transition-all outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50", "[&_svg]:pointer-events-none [&_svg:not([class*=\"size-\"])]:size-4 [&_svg]:shrink-0", sizeClasses[size], variantClasses[variant], className),
74
+ onClick: handleClick,
75
+ ...props,
76
+ children: checked ? renderIcon(checkedIcon) : renderIcon(uncheckedIcon)
77
+ });
78
+ });
79
+ IconToggle.displayName = "IconToggle";
80
+
81
+ //#endregion
82
+ exports.IconToggle = IconToggle;
@@ -0,0 +1,49 @@
1
+ import React from "react";
2
+
3
+ //#region src/IconToggle.d.ts
4
+ interface IconToggleProps extends Omit<React.ComponentProps<'button'>, 'onChange'> {
5
+ /**
6
+ * The checked/toggled state
7
+ */
8
+ checked?: boolean;
9
+ /**
10
+ * Default checked state for uncontrolled usage
11
+ */
12
+ defaultChecked?: boolean;
13
+ /**
14
+ * Called when the toggle state changes (controlled)
15
+ */
16
+ onCheckedChange?: (checked: boolean) => void;
17
+ /**
18
+ * Called when the toggle state changes (alternative handler)
19
+ */
20
+ onChange?: (checked: boolean) => void;
21
+ /**
22
+ * Icon to show when checked (true state)
23
+ * Can be a React component (like lucide-react icons) or SVG markup string
24
+ */
25
+ checkedIcon?: React.ReactNode | string;
26
+ /**
27
+ * Icon to show when unchecked (false state)
28
+ * Can be a React component (like lucide-react icons) or SVG markup string
29
+ */
30
+ uncheckedIcon?: React.ReactNode | string;
31
+ /**
32
+ * Size variant of the toggle button
33
+ * @default 'default'
34
+ */
35
+ size?: 'sm' | 'default' | 'lg';
36
+ /**
37
+ * Visual variant of the toggle button
38
+ * @default 'default'
39
+ */
40
+ variant?: 'default' | 'outline' | 'ghost';
41
+ }
42
+ /**
43
+ * IconToggle - A toggle button component with customizable icons for checked/unchecked states.
44
+ * Perfect for visibility toggles, theme switches, or any boolean state with visual feedback.
45
+ * Icons can be React components (like lucide-react icons) or SVG markup strings.
46
+ */
47
+ declare const IconToggle: React.ForwardRefExoticComponent<Omit<IconToggleProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
48
+ //#endregion
49
+ export { IconToggle, IconToggleProps };
@@ -0,0 +1,49 @@
1
+ import React from "react";
2
+
3
+ //#region src/IconToggle.d.ts
4
+ interface IconToggleProps extends Omit<React.ComponentProps<'button'>, 'onChange'> {
5
+ /**
6
+ * The checked/toggled state
7
+ */
8
+ checked?: boolean;
9
+ /**
10
+ * Default checked state for uncontrolled usage
11
+ */
12
+ defaultChecked?: boolean;
13
+ /**
14
+ * Called when the toggle state changes (controlled)
15
+ */
16
+ onCheckedChange?: (checked: boolean) => void;
17
+ /**
18
+ * Called when the toggle state changes (alternative handler)
19
+ */
20
+ onChange?: (checked: boolean) => void;
21
+ /**
22
+ * Icon to show when checked (true state)
23
+ * Can be a React component (like lucide-react icons) or SVG markup string
24
+ */
25
+ checkedIcon?: React.ReactNode | string;
26
+ /**
27
+ * Icon to show when unchecked (false state)
28
+ * Can be a React component (like lucide-react icons) or SVG markup string
29
+ */
30
+ uncheckedIcon?: React.ReactNode | string;
31
+ /**
32
+ * Size variant of the toggle button
33
+ * @default 'default'
34
+ */
35
+ size?: 'sm' | 'default' | 'lg';
36
+ /**
37
+ * Visual variant of the toggle button
38
+ * @default 'default'
39
+ */
40
+ variant?: 'default' | 'outline' | 'ghost';
41
+ }
42
+ /**
43
+ * IconToggle - A toggle button component with customizable icons for checked/unchecked states.
44
+ * Perfect for visibility toggles, theme switches, or any boolean state with visual feedback.
45
+ * Icons can be React components (like lucide-react icons) or SVG markup strings.
46
+ */
47
+ declare const IconToggle: React.ForwardRefExoticComponent<Omit<IconToggleProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
48
+ //#endregion
49
+ export { IconToggle, IconToggleProps };
@@ -0,0 +1,78 @@
1
+ import { isSvgMarkupString, svgMarkupToMaskUrl } from "./utils/svg.js";
2
+ import { cn } from "@pixpilot/shadcn";
3
+ import React, { useCallback } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+
6
+ //#region src/IconToggle.tsx
7
+ /**
8
+ * IconToggle - A toggle button component with customizable icons for checked/unchecked states.
9
+ * Perfect for visibility toggles, theme switches, or any boolean state with visual feedback.
10
+ * Icons can be React components (like lucide-react icons) or SVG markup strings.
11
+ */
12
+ const IconToggle = React.forwardRef(({ checked: controlledChecked, defaultChecked = false, onCheckedChange, onChange, checkedIcon, uncheckedIcon, size = "default", variant = "default", className, disabled,...props }, ref) => {
13
+ const [uncontrolledChecked, setUncontrolledChecked] = React.useState(defaultChecked);
14
+ const isControlled = controlledChecked !== void 0;
15
+ const checked = isControlled ? controlledChecked : uncontrolledChecked;
16
+ const handleClick = useCallback((e) => {
17
+ if (disabled) return;
18
+ const newChecked = !checked;
19
+ if (!isControlled) setUncontrolledChecked(newChecked);
20
+ onCheckedChange?.(newChecked);
21
+ onChange?.(newChecked);
22
+ props.onClick?.(e);
23
+ }, [
24
+ checked,
25
+ disabled,
26
+ isControlled,
27
+ onChange,
28
+ onCheckedChange,
29
+ props
30
+ ]);
31
+ const renderIcon = (icon) => {
32
+ if (icon === void 0 || icon === null) return null;
33
+ if (isSvgMarkupString(icon)) return /* @__PURE__ */ jsx("span", {
34
+ "data-slot": "svg-mask",
35
+ "aria-hidden": "true",
36
+ className: "inline-block h-4 w-4",
37
+ style: {
38
+ backgroundColor: "currentColor",
39
+ WebkitMaskImage: svgMarkupToMaskUrl(icon),
40
+ maskImage: svgMarkupToMaskUrl(icon),
41
+ WebkitMaskRepeat: "no-repeat",
42
+ maskRepeat: "no-repeat",
43
+ WebkitMaskPosition: "center",
44
+ maskPosition: "center",
45
+ WebkitMaskSize: "contain",
46
+ maskSize: "contain"
47
+ }
48
+ });
49
+ return icon;
50
+ };
51
+ const sizeClasses = {
52
+ sm: "size-7",
53
+ default: "size-9",
54
+ lg: "size-11"
55
+ };
56
+ const variantClasses = {
57
+ default: "bg-background border border-input hover:bg-accent hover:text-accent-foreground data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:hover:bg-primary/90",
58
+ outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground data-[state=checked]:border-primary data-[state=checked]:text-primary",
59
+ ghost: "hover:bg-accent hover:text-accent-foreground data-[state=checked]:bg-primary/10 data-[state=checked]:text-primary"
60
+ };
61
+ return /* @__PURE__ */ jsx("button", {
62
+ ref,
63
+ type: "button",
64
+ role: "switch",
65
+ "aria-checked": checked,
66
+ "data-state": checked ? "checked" : "unchecked",
67
+ "data-slot": "icon-toggle",
68
+ disabled,
69
+ className: cn("inline-flex items-center justify-center rounded-md text-sm font-medium transition-all outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50", "[&_svg]:pointer-events-none [&_svg:not([class*=\"size-\"])]:size-4 [&_svg]:shrink-0", sizeClasses[size], variantClasses[variant], className),
70
+ onClick: handleClick,
71
+ ...props,
72
+ children: checked ? renderIcon(checkedIcon) : renderIcon(uncheckedIcon)
73
+ });
74
+ });
75
+ IconToggle.displayName = "IconToggle";
76
+
77
+ //#endregion
78
+ export { IconToggle };
@@ -1,10 +1,10 @@
1
1
  import { FileUploadInlineProps } from "./types.cjs";
2
- import * as react_jsx_runtime8 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime7 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/file-upload-inline/FileUploadInline.d.ts
5
5
  /**
6
6
  * FileUploadInline - An inline file upload component using FileUpload primitives
7
7
  */
8
- declare function FileUploadInline(props: FileUploadInlineProps): react_jsx_runtime8.JSX.Element;
8
+ declare function FileUploadInline(props: FileUploadInlineProps): react_jsx_runtime7.JSX.Element;
9
9
  //#endregion
10
10
  export { FileUploadInline };
@@ -1,10 +1,10 @@
1
1
  import { FileUploadInlineProps } from "./types.js";
2
- import * as react_jsx_runtime8 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime7 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/file-upload-inline/FileUploadInline.d.ts
5
5
  /**
6
6
  * FileUploadInline - An inline file upload component using FileUpload primitives
7
7
  */
8
- declare function FileUploadInline(props: FileUploadInlineProps): react_jsx_runtime8.JSX.Element;
8
+ declare function FileUploadInline(props: FileUploadInlineProps): react_jsx_runtime7.JSX.Element;
9
9
  //#endregion
10
10
  export { FileUploadInline };
package/dist/index.cjs CHANGED
@@ -31,6 +31,8 @@ require('./input/index.cjs');
31
31
  const require_LoadingOverlay = require('./LoadingOverlay.cjs');
32
32
  const require_IconPicker = require('./icon-selector/IconPicker.cjs');
33
33
  require('./icon-selector/index.cjs');
34
+ const require_svg = require('./utils/svg.cjs');
35
+ const require_IconToggle = require('./IconToggle.cjs');
34
36
  const require_Layout = require('./layout/Layout.cjs');
35
37
  const require_LayoutFooter = require('./layout/LayoutFooter.cjs');
36
38
  const require_LayoutHeader = require('./layout/LayoutHeader.cjs');
@@ -84,6 +86,7 @@ exports.DialogProvider = require_DialogProvider.DialogProvider;
84
86
  exports.FileUpload = require_FileUpload.FileUpload;
85
87
  exports.FileUploadInline = require_FileUploadInline.FileUploadInline;
86
88
  exports.IconPicker = require_IconPicker.IconPicker;
89
+ exports.IconToggle = require_IconToggle.IconToggle;
87
90
  exports.Input = require_Input.Input;
88
91
  exports.Layout = require_Layout.Layout;
89
92
  exports.LayoutFooter = require_LayoutFooter.LayoutFooter;
@@ -110,7 +113,9 @@ exports.ThemeModeToggleButton = require_ThemeModeToggleButton.ThemeModeToggleBut
110
113
  exports.ThemeProvider = require_ThemeProvider.ThemeProvider;
111
114
  exports.Toaster = require_ToastProvider.Toaster;
112
115
  exports.cn = __pixpilot_shadcn.cn;
116
+ exports.isSvgMarkupString = require_svg.isSvgMarkupString;
113
117
  exports.showConfirmDialog = require_confirmation_dialogs.showConfirmDialog;
118
+ exports.svgMarkupToMaskUrl = require_svg.svgMarkupToMaskUrl;
114
119
  exports.toast = require_toast.toast;
115
120
  exports.toastError = require_toast.toastError;
116
121
  exports.toastInfo = require_toast.toastInfo;
package/dist/index.d.cts CHANGED
@@ -30,6 +30,7 @@ import "./hooks/index.cjs";
30
30
  import { IconProvider, IconProviderLoader, IconProviderProps } from "./icon-selector/types.cjs";
31
31
  import { IconPicker, IconPickerProps, IconPickerVariant } from "./icon-selector/IconPicker.cjs";
32
32
  import "./icon-selector/index.cjs";
33
+ import { IconToggle, IconToggleProps } from "./IconToggle.cjs";
33
34
  import { Input, InputProps } from "./input/Input.cjs";
34
35
  import "./input/index.cjs";
35
36
  import { Layout, LayoutProps } from "./layout/Layout.cjs";
@@ -66,5 +67,6 @@ import "./theme-toggle/index.cjs";
66
67
  import { DEFAULT_ALERT_DURATION, ToastMessage, toast, toastError, toastInfo, toastSuccess, toastWarning } from "./toast/toast.cjs";
67
68
  import { Toaster } from "./toast/ToastProvider.cjs";
68
69
  import "./toast/index.cjs";
70
+ import { isSvgMarkupString, svgMarkupToMaskUrl } from "./utils/svg.cjs";
69
71
  import { cn } from "@pixpilot/shadcn";
70
- export { AbsoluteFill, Alert, AlertBaseProps, AlertProps, AlertVariant, AvatarUpload, AvatarUploadProps, BaseTabsTriggerProps, Button, ButtonLoaderProps, ButtonProps, CircleLoader, CircleLoaderProps, CloseButtonAbsolute, CloseButtonRounded, CloseButtonRoundedProps, ColorPicker, ColorPickerBase, ColorPickerBaseProps, ColorPickerBaseSection, ColorPickerProps, ColorSelect, ColorSelectOption, BaseColorSelectProps as ColorSelectProps, Combobox, ConfirmationDialogProps, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DatePickerProps, DialogProvider, DialogProviderProps, type FileMetadata, FileUpload, FileUploadBaseProps, FileUploadInline, FileUploadInlineBaseProps, FileUploadInlineProps, type FileUploadProgressCallBacks, type FileUploadProps, IconPicker, IconPickerProps, IconPickerVariant, IconProvider, IconProviderLoader, IconProviderProps, Input, InputProps, Layout, LayoutFooter, LayoutFooterProps, LayoutHeader, LayoutHeaderProps, LayoutMain, LayoutMainProps, LayoutProps, LoaderProps, LoadingOverlay, MultiFileUploadProps, OnChangeMultipleFiles, OnChangeSingleFile, Pagination, PaginationProps, PopoverCloseButtonProps, PresetColor, RichTextEditor, RichTextEditorProps, RichTextEditorSlots, ScaledPreview, ScaledPreviewProps, ScaledPreviewSize, Select, SelectOption, SingleFileUploadProps, Slider, SliderInput, SliderInputProps, SliderProps, SliderSelect, SliderSelectOption, SliderSelectProps, SliderSelectValue, Tabs, TabsContent, TabsContext, TabsContextValue, TabsList, TabsListProps, TabsTrigger, TabsTriggerProps, TabsVariant, TagsInput, TagsInputProps, ThemeModeDropdown, ThemeModeDropdownProps, ThemeModeSwitchInside, ThemeModeSwitchInsideProps, ThemeModeSwitchInsideSize, ThemeModeSwitchOutside, ThemeModeSwitchOutsideProps, ThemeModeToggleButton, ThemeModeToggleButtonProps, ThemeProvider, ThemeProviderProps, ToastMessage, Toaster, ToolbarItems, cn, showConfirmDialog, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
72
+ export { AbsoluteFill, Alert, AlertBaseProps, AlertProps, AlertVariant, AvatarUpload, AvatarUploadProps, BaseTabsTriggerProps, Button, ButtonLoaderProps, ButtonProps, CircleLoader, CircleLoaderProps, CloseButtonAbsolute, CloseButtonRounded, CloseButtonRoundedProps, ColorPicker, ColorPickerBase, ColorPickerBaseProps, ColorPickerBaseSection, ColorPickerProps, ColorSelect, ColorSelectOption, BaseColorSelectProps as ColorSelectProps, Combobox, ConfirmationDialogProps, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DatePickerProps, DialogProvider, DialogProviderProps, type FileMetadata, FileUpload, FileUploadBaseProps, FileUploadInline, FileUploadInlineBaseProps, FileUploadInlineProps, type FileUploadProgressCallBacks, type FileUploadProps, IconPicker, IconPickerProps, IconPickerVariant, IconProvider, IconProviderLoader, IconProviderProps, IconToggle, IconToggleProps, Input, InputProps, Layout, LayoutFooter, LayoutFooterProps, LayoutHeader, LayoutHeaderProps, LayoutMain, LayoutMainProps, LayoutProps, LoaderProps, LoadingOverlay, MultiFileUploadProps, OnChangeMultipleFiles, OnChangeSingleFile, Pagination, PaginationProps, PopoverCloseButtonProps, PresetColor, RichTextEditor, RichTextEditorProps, RichTextEditorSlots, ScaledPreview, ScaledPreviewProps, ScaledPreviewSize, Select, SelectOption, SingleFileUploadProps, Slider, SliderInput, SliderInputProps, SliderProps, SliderSelect, SliderSelectOption, SliderSelectProps, SliderSelectValue, Tabs, TabsContent, TabsContext, TabsContextValue, TabsList, TabsListProps, TabsTrigger, TabsTriggerProps, TabsVariant, TagsInput, TagsInputProps, ThemeModeDropdown, ThemeModeDropdownProps, ThemeModeSwitchInside, ThemeModeSwitchInsideProps, ThemeModeSwitchInsideSize, ThemeModeSwitchOutside, ThemeModeSwitchOutsideProps, ThemeModeToggleButton, ThemeModeToggleButtonProps, ThemeProvider, ThemeProviderProps, ToastMessage, Toaster, ToolbarItems, cn, isSvgMarkupString, showConfirmDialog, svgMarkupToMaskUrl, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
package/dist/index.d.ts CHANGED
@@ -32,6 +32,7 @@ import "./hooks/index.js";
32
32
  import { IconProvider, IconProviderLoader, IconProviderProps } from "./icon-selector/types.js";
33
33
  import { IconPicker, IconPickerProps, IconPickerVariant } from "./icon-selector/IconPicker.js";
34
34
  import "./icon-selector/index.js";
35
+ import { IconToggle, IconToggleProps } from "./IconToggle.js";
35
36
  import { Input, InputProps } from "./input/Input.js";
36
37
  import "./input/index.js";
37
38
  import { Layout, LayoutProps } from "./layout/Layout.js";
@@ -68,5 +69,6 @@ import "./theme-toggle/index.js";
68
69
  import { DEFAULT_ALERT_DURATION, ToastMessage, toast, toastError, toastInfo, toastSuccess, toastWarning } from "./toast/toast.js";
69
70
  import { Toaster } from "./toast/ToastProvider.js";
70
71
  import "./toast/index.js";
72
+ import { isSvgMarkupString, svgMarkupToMaskUrl } from "./utils/svg.js";
71
73
  import { cn } from "@pixpilot/shadcn";
72
- export { AbsoluteFill, Alert, AlertBaseProps, AlertProps, AlertVariant, AvatarUpload, AvatarUploadProps, BaseTabsTriggerProps, Button, ButtonLoaderProps, ButtonProps, CircleLoader, CircleLoaderProps, CloseButtonAbsolute, CloseButtonRounded, CloseButtonRoundedProps, ColorPicker, ColorPickerBase, ColorPickerBaseProps, ColorPickerBaseSection, ColorPickerProps, ColorSelect, ColorSelectOption, BaseColorSelectProps as ColorSelectProps, Combobox, ConfirmationDialogProps, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DatePickerProps, DialogProvider, DialogProviderProps, type FileMetadata, FileUpload, FileUploadBaseProps, FileUploadInline, FileUploadInlineBaseProps, FileUploadInlineProps, type FileUploadProgressCallBacks, type FileUploadProps, IconPicker, IconPickerProps, IconPickerVariant, IconProvider, IconProviderLoader, IconProviderProps, Input, InputProps, Layout, LayoutFooter, LayoutFooterProps, LayoutHeader, LayoutHeaderProps, LayoutMain, LayoutMainProps, LayoutProps, LoaderProps, LoadingOverlay, MultiFileUploadProps, OnChangeMultipleFiles, OnChangeSingleFile, Pagination, PaginationProps, PopoverCloseButtonProps, PresetColor, RichTextEditor, RichTextEditorProps, RichTextEditorSlots, ScaledPreview, ScaledPreviewProps, ScaledPreviewSize, Select, SelectOption, SingleFileUploadProps, Slider, SliderInput, SliderInputProps, SliderProps, SliderSelect, SliderSelectOption, SliderSelectProps, SliderSelectValue, Tabs, TabsContent, TabsContext, TabsContextValue, TabsList, TabsListProps, TabsTrigger, TabsTriggerProps, TabsVariant, TagsInput, TagsInputProps, ThemeModeDropdown, ThemeModeDropdownProps, ThemeModeSwitchInside, ThemeModeSwitchInsideProps, ThemeModeSwitchInsideSize, ThemeModeSwitchOutside, ThemeModeSwitchOutsideProps, ThemeModeToggleButton, ThemeModeToggleButtonProps, ThemeProvider, ThemeProviderProps, ToastMessage, Toaster, ToolbarItems, cn, showConfirmDialog, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
74
+ export { AbsoluteFill, Alert, AlertBaseProps, AlertProps, AlertVariant, AvatarUpload, AvatarUploadProps, BaseTabsTriggerProps, Button, ButtonLoaderProps, ButtonProps, CircleLoader, CircleLoaderProps, CloseButtonAbsolute, CloseButtonRounded, CloseButtonRoundedProps, ColorPicker, ColorPickerBase, ColorPickerBaseProps, ColorPickerBaseSection, ColorPickerProps, ColorSelect, ColorSelectOption, BaseColorSelectProps as ColorSelectProps, Combobox, ConfirmationDialogProps, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DatePickerProps, DialogProvider, DialogProviderProps, type FileMetadata, FileUpload, FileUploadBaseProps, FileUploadInline, FileUploadInlineBaseProps, FileUploadInlineProps, type FileUploadProgressCallBacks, type FileUploadProps, IconPicker, IconPickerProps, IconPickerVariant, IconProvider, IconProviderLoader, IconProviderProps, IconToggle, IconToggleProps, Input, InputProps, Layout, LayoutFooter, LayoutFooterProps, LayoutHeader, LayoutHeaderProps, LayoutMain, LayoutMainProps, LayoutProps, LoaderProps, LoadingOverlay, MultiFileUploadProps, OnChangeMultipleFiles, OnChangeSingleFile, Pagination, PaginationProps, PopoverCloseButtonProps, PresetColor, RichTextEditor, RichTextEditorProps, RichTextEditorSlots, ScaledPreview, ScaledPreviewProps, ScaledPreviewSize, Select, SelectOption, SingleFileUploadProps, Slider, SliderInput, SliderInputProps, SliderProps, SliderSelect, SliderSelectOption, SliderSelectProps, SliderSelectValue, Tabs, TabsContent, TabsContext, TabsContextValue, TabsList, TabsListProps, TabsTrigger, TabsTriggerProps, TabsVariant, TagsInput, TagsInputProps, ThemeModeDropdown, ThemeModeDropdownProps, ThemeModeSwitchInside, ThemeModeSwitchInsideProps, ThemeModeSwitchInsideSize, ThemeModeSwitchOutside, ThemeModeSwitchOutsideProps, ThemeModeToggleButton, ThemeModeToggleButtonProps, ThemeProvider, ThemeProviderProps, ToastMessage, Toaster, ToolbarItems, cn, isSvgMarkupString, showConfirmDialog, svgMarkupToMaskUrl, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
package/dist/index.js CHANGED
@@ -30,6 +30,8 @@ import "./input/index.js";
30
30
  import { LoadingOverlay } from "./LoadingOverlay.js";
31
31
  import { IconPicker } from "./icon-selector/IconPicker.js";
32
32
  import "./icon-selector/index.js";
33
+ import { isSvgMarkupString, svgMarkupToMaskUrl } from "./utils/svg.js";
34
+ import { IconToggle } from "./IconToggle.js";
33
35
  import { Layout } from "./layout/Layout.js";
34
36
  import { LayoutFooter } from "./layout/LayoutFooter.js";
35
37
  import { LayoutHeader } from "./layout/LayoutHeader.js";
@@ -64,4 +66,4 @@ import { Toaster } from "./toast/ToastProvider.js";
64
66
  import "./toast/index.js";
65
67
  import { cn } from "@pixpilot/shadcn";
66
68
 
67
- export { AbsoluteFill, Alert, AvatarUpload, Button, CircleLoader, CloseButtonAbsolute, CloseButtonRounded, ColorPicker, ColorPickerBase, ColorSelect, Combobox, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DialogProvider, FileUpload, FileUploadInline, IconPicker, Input, Layout, LayoutFooter, LayoutHeader, LayoutMain, LoadingOverlay, Pagination, RichTextEditor, ScaledPreview, Select, Slider, SliderInput, SliderSelect, Tabs, TabsContent, TabsContext, TabsList, TabsTrigger, TagsInput, ThemeModeDropdown, ThemeModeSwitchInside, ThemeModeSwitchOutside, ThemeModeToggleButton, ThemeProvider, Toaster, cn, showConfirmDialog, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
69
+ export { AbsoluteFill, Alert, AvatarUpload, Button, CircleLoader, CloseButtonAbsolute, CloseButtonRounded, ColorPicker, ColorPickerBase, ColorSelect, Combobox, ContentCard, DEFAULT_ALERT_DURATION, DatePicker, DialogProvider, FileUpload, FileUploadInline, IconPicker, IconToggle, Input, Layout, LayoutFooter, LayoutHeader, LayoutMain, LoadingOverlay, Pagination, RichTextEditor, ScaledPreview, Select, Slider, SliderInput, SliderSelect, Tabs, TabsContent, TabsContext, TabsList, TabsTrigger, TagsInput, ThemeModeDropdown, ThemeModeSwitchInside, ThemeModeSwitchOutside, ThemeModeToggleButton, ThemeProvider, Toaster, cn, isSvgMarkupString, showConfirmDialog, svgMarkupToMaskUrl, toast, toastError, toastInfo, toastSuccess, toastWarning, useMediaQuery, useSelectKeyboard, useTabsContext, useTheme };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime7 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime8 from "react/jsx-runtime";
2
2
  import { InputProps } from "@pixpilot/shadcn";
3
3
  import * as React$1 from "react";
4
4
 
@@ -10,6 +10,6 @@ type InputProps$1 = InputProps & {
10
10
  prefixClassName?: string;
11
11
  suffixClassName?: string;
12
12
  };
13
- declare function Input(props: InputProps$1): react_jsx_runtime7.JSX.Element;
13
+ declare function Input(props: InputProps$1): react_jsx_runtime8.JSX.Element;
14
14
  //#endregion
15
15
  export { Input, InputProps$1 as InputProps };
@@ -1,6 +1,6 @@
1
1
  import { InputProps } from "@pixpilot/shadcn";
2
2
  import * as React$1 from "react";
3
- import * as react_jsx_runtime7 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime8 from "react/jsx-runtime";
4
4
 
5
5
  //#region src/input/Input.d.ts
6
6
  type InputProps$1 = InputProps & {
@@ -10,6 +10,6 @@ type InputProps$1 = InputProps & {
10
10
  prefixClassName?: string;
11
11
  suffixClassName?: string;
12
12
  };
13
- declare function Input$1(props: InputProps$1): react_jsx_runtime7.JSX.Element;
13
+ declare function Input$1(props: InputProps$1): react_jsx_runtime8.JSX.Element;
14
14
  //#endregion
15
15
  export { Input$1 as Input, InputProps$1 as InputProps };
@@ -1,4 +1,5 @@
1
1
  const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_svg = require('../utils/svg.cjs');
2
3
  let __pixpilot_shadcn = require("@pixpilot/shadcn");
3
4
  __pixpilot_shadcn = require_rolldown_runtime.__toESM(__pixpilot_shadcn);
4
5
  let react = require("react");
@@ -7,14 +8,6 @@ let react_jsx_runtime = require("react/jsx-runtime");
7
8
  react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
8
9
 
9
10
  //#region src/rich-text-editor/ToolbarButton.tsx
10
- function isSvgMarkupString(value) {
11
- if (typeof value !== "string") return false;
12
- const trimmed = value.trim();
13
- return trimmed.startsWith("<svg") && trimmed.endsWith("</svg>");
14
- }
15
- function svgMarkupToMaskUrl(svgMarkup) {
16
- return `url("data:image/svg+xml,${encodeURIComponent(svgMarkup).replace(/'/gu, "%27").replace(/"/gu, "%22")}")`;
17
- }
18
11
  const ToolbarButton = ({ onClick, isActive, disabled, className, children, tooltip }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Tooltip, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipTrigger, {
19
12
  asChild: true,
20
13
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.Button, {
@@ -27,14 +20,14 @@ const ToolbarButton = ({ onClick, isActive, disabled, className, children, toolt
27
20
  onClick,
28
21
  disabled,
29
22
  className: (0, __pixpilot_shadcn.cn)("h-8 w-8 p-0", className),
30
- children: isSvgMarkupString(children) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23
+ children: require_svg.isSvgMarkupString(children) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
31
24
  "data-slot": "svg-mask",
32
25
  "aria-hidden": "true",
33
26
  className: "inline-block h-4 w-4",
34
27
  style: {
35
28
  backgroundColor: "currentColor",
36
- WebkitMaskImage: svgMarkupToMaskUrl(children),
37
- maskImage: svgMarkupToMaskUrl(children),
29
+ WebkitMaskImage: require_svg.svgMarkupToMaskUrl(children),
30
+ maskImage: require_svg.svgMarkupToMaskUrl(children),
38
31
  WebkitMaskRepeat: "no-repeat",
39
32
  maskRepeat: "no-repeat",
40
33
  WebkitMaskPosition: "center",
@@ -1,16 +1,9 @@
1
+ import { isSvgMarkupString, svgMarkupToMaskUrl } from "../utils/svg.js";
1
2
  import { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from "@pixpilot/shadcn";
2
3
  import React from "react";
3
4
  import { jsx, jsxs } from "react/jsx-runtime";
4
5
 
5
6
  //#region src/rich-text-editor/ToolbarButton.tsx
6
- function isSvgMarkupString(value) {
7
- if (typeof value !== "string") return false;
8
- const trimmed = value.trim();
9
- return trimmed.startsWith("<svg") && trimmed.endsWith("</svg>");
10
- }
11
- function svgMarkupToMaskUrl(svgMarkup) {
12
- return `url("data:image/svg+xml,${encodeURIComponent(svgMarkup).replace(/'/gu, "%27").replace(/"/gu, "%22")}")`;
13
- }
14
7
  const ToolbarButton = ({ onClick, isActive, disabled, className, children, tooltip }) => /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
15
8
  asChild: true,
16
9
  children: /* @__PURE__ */ jsx(Button, {
@@ -0,0 +1,25 @@
1
+
2
+ //#region src/utils/svg.ts
3
+ /**
4
+ * Checks if a value is an SVG markup string
5
+ * @param value - The value to check
6
+ * @returns True if the value is a string starting with '<svg' and ending with '</svg>'
7
+ */
8
+ function isSvgMarkupString(value) {
9
+ if (typeof value !== "string") return false;
10
+ const trimmed = value.trim();
11
+ return trimmed.startsWith("<svg") && trimmed.endsWith("</svg>");
12
+ }
13
+ /**
14
+ * Converts SVG markup string to a CSS mask-image data URL
15
+ * Useful for rendering SVG strings as masked icons that inherit currentColor
16
+ * @param svgMarkup - The SVG markup string
17
+ * @returns A CSS url() value for use in mask-image properties
18
+ */
19
+ function svgMarkupToMaskUrl(svgMarkup) {
20
+ return `url("data:image/svg+xml,${encodeURIComponent(svgMarkup).replace(/'/gu, "%27").replace(/"/gu, "%22")}")`;
21
+ }
22
+
23
+ //#endregion
24
+ exports.isSvgMarkupString = isSvgMarkupString;
25
+ exports.svgMarkupToMaskUrl = svgMarkupToMaskUrl;
@@ -0,0 +1,16 @@
1
+ //#region src/utils/svg.d.ts
2
+ /**
3
+ * Checks if a value is an SVG markup string
4
+ * @param value - The value to check
5
+ * @returns True if the value is a string starting with '<svg' and ending with '</svg>'
6
+ */
7
+ declare function isSvgMarkupString(value: unknown): value is string;
8
+ /**
9
+ * Converts SVG markup string to a CSS mask-image data URL
10
+ * Useful for rendering SVG strings as masked icons that inherit currentColor
11
+ * @param svgMarkup - The SVG markup string
12
+ * @returns A CSS url() value for use in mask-image properties
13
+ */
14
+ declare function svgMarkupToMaskUrl(svgMarkup: string): string;
15
+ //#endregion
16
+ export { isSvgMarkupString, svgMarkupToMaskUrl };
@@ -0,0 +1,16 @@
1
+ //#region src/utils/svg.d.ts
2
+ /**
3
+ * Checks if a value is an SVG markup string
4
+ * @param value - The value to check
5
+ * @returns True if the value is a string starting with '<svg' and ending with '</svg>'
6
+ */
7
+ declare function isSvgMarkupString(value: unknown): value is string;
8
+ /**
9
+ * Converts SVG markup string to a CSS mask-image data URL
10
+ * Useful for rendering SVG strings as masked icons that inherit currentColor
11
+ * @param svgMarkup - The SVG markup string
12
+ * @returns A CSS url() value for use in mask-image properties
13
+ */
14
+ declare function svgMarkupToMaskUrl(svgMarkup: string): string;
15
+ //#endregion
16
+ export { isSvgMarkupString, svgMarkupToMaskUrl };
@@ -0,0 +1,23 @@
1
+ //#region src/utils/svg.ts
2
+ /**
3
+ * Checks if a value is an SVG markup string
4
+ * @param value - The value to check
5
+ * @returns True if the value is a string starting with '<svg' and ending with '</svg>'
6
+ */
7
+ function isSvgMarkupString(value) {
8
+ if (typeof value !== "string") return false;
9
+ const trimmed = value.trim();
10
+ return trimmed.startsWith("<svg") && trimmed.endsWith("</svg>");
11
+ }
12
+ /**
13
+ * Converts SVG markup string to a CSS mask-image data URL
14
+ * Useful for rendering SVG strings as masked icons that inherit currentColor
15
+ * @param svgMarkup - The SVG markup string
16
+ * @returns A CSS url() value for use in mask-image properties
17
+ */
18
+ function svgMarkupToMaskUrl(svgMarkup) {
19
+ return `url("data:image/svg+xml,${encodeURIComponent(svgMarkup).replace(/'/gu, "%27").replace(/"/gu, "%22")}")`;
20
+ }
21
+
22
+ //#endregion
23
+ export { isSvgMarkupString, svgMarkupToMaskUrl };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/shadcn-ui",
3
3
  "type": "module",
4
- "version": "0.36.0",
4
+ "version": "0.37.0",
5
5
  "description": "Custom UI components and utilities built with shadcn/ui.",
6
6
  "author": "m.doaie <m.doaie@hotmail.com>",
7
7
  "license": "MIT",