@pixpilot/shadcn-ui 0.65.0 → 1.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.
Files changed (118) hide show
  1. package/dist/Button.cjs +11 -77
  2. package/dist/Button.d.cts +1 -24
  3. package/dist/Button.d.ts +1 -24
  4. package/dist/Button.js +13 -78
  5. package/dist/ButtonExtended.cjs +104 -0
  6. package/dist/ButtonExtended.d.cts +58 -0
  7. package/dist/ButtonExtended.d.ts +58 -0
  8. package/dist/ButtonExtended.js +99 -0
  9. package/dist/ColorPicker/ColorPicker.cjs +5 -57
  10. package/dist/ColorPicker/ColorPicker.d.cts +1 -0
  11. package/dist/ColorPicker/ColorPicker.js +9 -59
  12. package/dist/ColorPicker/index.d.cts +1 -0
  13. package/dist/ColorPickerBase/ColorPickerBase.cjs +19 -98
  14. package/dist/ColorPickerBase/ColorPickerBase.js +18 -96
  15. package/dist/ColorPickerBase/ColorPickerButton.cjs +54 -0
  16. package/dist/ColorPickerBase/ColorPickerButton.d.cts +14 -0
  17. package/dist/ColorPickerBase/ColorPickerButton.d.ts +14 -0
  18. package/dist/ColorPickerBase/ColorPickerButton.js +47 -0
  19. package/dist/ColorPickerBase/ColorPickerCompactControls.cjs +49 -0
  20. package/dist/ColorPickerBase/ColorPickerCompactControls.d.cts +8 -0
  21. package/dist/ColorPickerBase/ColorPickerCompactControls.d.ts +8 -0
  22. package/dist/ColorPickerBase/ColorPickerCompactControls.js +46 -0
  23. package/dist/ColorPickerBase/ColorPickerControls.cjs +33 -0
  24. package/dist/ColorPickerBase/ColorPickerControls.d.cts +15 -0
  25. package/dist/ColorPickerBase/ColorPickerControls.d.ts +15 -0
  26. package/dist/ColorPickerBase/ColorPickerControls.js +29 -0
  27. package/dist/ColorPickerBase/ColorPickerFormatControls.cjs +22 -0
  28. package/dist/ColorPickerBase/ColorPickerFormatControls.d.cts +12 -0
  29. package/dist/ColorPickerBase/ColorPickerFormatControls.d.ts +12 -0
  30. package/dist/ColorPickerBase/ColorPickerFormatControls.js +18 -0
  31. package/dist/ColorPickerBase/ColorPickerFormatInput.cjs +20 -0
  32. package/dist/ColorPickerBase/ColorPickerFormatInput.d.cts +8 -0
  33. package/dist/ColorPickerBase/ColorPickerFormatInput.d.ts +8 -0
  34. package/dist/ColorPickerBase/ColorPickerFormatInput.js +16 -0
  35. package/dist/ColorPickerBase/ColorPickerFullControls.cjs +44 -0
  36. package/dist/ColorPickerBase/ColorPickerFullControls.d.cts +8 -0
  37. package/dist/ColorPickerBase/ColorPickerFullControls.d.ts +8 -0
  38. package/dist/ColorPickerBase/ColorPickerFullControls.js +41 -0
  39. package/dist/ColorPickerBase/ColorPickerInput.cjs +36 -4
  40. package/dist/ColorPickerBase/ColorPickerInput.d.cts +12 -0
  41. package/dist/ColorPickerBase/ColorPickerInput.d.ts +12 -0
  42. package/dist/ColorPickerBase/ColorPickerInput.js +36 -6
  43. package/dist/ColorPickerBase/ColorPickerRoot.cjs +55 -0
  44. package/dist/ColorPickerBase/ColorPickerRoot.d.cts +6 -0
  45. package/dist/ColorPickerBase/ColorPickerRoot.d.ts +6 -0
  46. package/dist/ColorPickerBase/ColorPickerRoot.js +51 -0
  47. package/dist/ColorPickerBase/ColorPickerSwatch.cjs +19 -0
  48. package/dist/ColorPickerBase/ColorPickerSwatch.d.cts +8 -0
  49. package/dist/ColorPickerBase/ColorPickerSwatch.d.ts +8 -0
  50. package/dist/ColorPickerBase/ColorPickerSwatch.js +15 -0
  51. package/dist/ColorPickerBase/color-palette/ColorPickerColorPalette.cjs +101 -0
  52. package/dist/ColorPickerBase/color-palette/ColorPickerColorPalette.d.cts +14 -0
  53. package/dist/ColorPickerBase/color-palette/ColorPickerColorPalette.d.ts +14 -0
  54. package/dist/ColorPickerBase/color-palette/ColorPickerColorPalette.js +95 -0
  55. package/dist/ColorPickerBase/{PaletteSwatch.cjs → color-palette/PaletteSwatch.cjs} +3 -3
  56. package/dist/ColorPickerBase/{PaletteSwatch.js → color-palette/PaletteSwatch.js} +2 -2
  57. package/dist/ColorPickerBase/color-palette/index.cjs +1 -0
  58. package/dist/ColorPickerBase/color-palette/index.d.cts +1 -0
  59. package/dist/ColorPickerBase/color-palette/index.d.ts +1 -0
  60. package/dist/ColorPickerBase/color-palette/index.js +1 -0
  61. package/dist/ColorPickerBase/color-picker-context.cjs +16 -0
  62. package/dist/ColorPickerBase/color-picker-context.d.cts +14 -0
  63. package/dist/ColorPickerBase/color-picker-context.d.ts +14 -0
  64. package/dist/ColorPickerBase/color-picker-context.js +11 -0
  65. package/dist/ColorPickerBase/constants.cjs +13 -0
  66. package/dist/ColorPickerBase/constants.js +11 -0
  67. package/dist/ColorPickerBase/hooks/use-color-picker-base-swatch.cjs +4 -4
  68. package/dist/ColorPickerBase/hooks/use-color-picker-base-swatch.js +4 -4
  69. package/dist/ColorPickerBase/index.cjs +14 -0
  70. package/dist/ColorPickerBase/index.d.cts +13 -0
  71. package/dist/ColorPickerBase/index.d.ts +13 -2
  72. package/dist/ColorPickerBase/index.js +11 -0
  73. package/dist/ColorPickerBase/types.d.cts +11 -3
  74. package/dist/ColorPickerBase/types.d.ts +11 -3
  75. package/dist/ColorSelect.d.cts +2 -2
  76. package/dist/ColorSelect.d.ts +2 -2
  77. package/dist/ContentCard.d.cts +2 -2
  78. package/dist/ContentCard.d.ts +2 -2
  79. package/dist/DatePicker.d.cts +2 -2
  80. package/dist/DatePicker.d.ts +2 -2
  81. package/dist/IconToggle.cjs +44 -66
  82. package/dist/IconToggle.d.cts +2 -46
  83. package/dist/IconToggle.d.ts +2 -46
  84. package/dist/IconToggle.js +45 -66
  85. package/dist/Rating.d.cts +4 -4
  86. package/dist/Rating.d.ts +4 -4
  87. package/dist/Select.d.cts +2 -2
  88. package/dist/Select.d.ts +2 -2
  89. package/dist/ToggleButton.cjs +46 -0
  90. package/dist/ToggleButton.d.cts +41 -0
  91. package/dist/ToggleButton.d.ts +41 -0
  92. package/dist/ToggleButton.js +43 -0
  93. package/dist/dialog/Dialog.d.cts +4 -4
  94. package/dist/dialog/Dialog.d.ts +4 -4
  95. package/dist/file-upload/FileUpload.d.cts +2 -2
  96. package/dist/file-upload/FileUpload.d.ts +2 -2
  97. package/dist/file-upload-inline/FileUploadInline.d.ts +2 -2
  98. package/dist/file-upload-root/FileUploadRoot.d.ts +2 -2
  99. package/dist/index.cjs +33 -0
  100. package/dist/index.d.cts +17 -3
  101. package/dist/index.d.ts +15 -3
  102. package/dist/index.js +13 -1
  103. package/dist/input/Input.d.cts +2 -2
  104. package/dist/input/Input.d.ts +2 -2
  105. package/dist/tags-input/TagsInput.d.cts +2 -2
  106. package/dist/tags-input/TagsInput.d.ts +2 -2
  107. package/dist/tags-input/TagsInputInline.d.ts +2 -2
  108. package/dist/theme-toggle/ThemeModeDropdown.d.cts +2 -2
  109. package/dist/theme-toggle/ThemeModeDropdown.d.ts +2 -2
  110. package/dist/theme-toggle/ThemeModeSwitchInside.d.cts +2 -2
  111. package/dist/theme-toggle/ThemeModeSwitchOutside.d.cts +2 -2
  112. package/dist/theme-toggle/ThemeModeSwitchOutside.d.ts +2 -2
  113. package/dist/theme-toggle/ThemeModeToggleButton.d.cts +2 -2
  114. package/package.json +2 -2
  115. package/dist/ColorPickerBase/ColorPickerCompact.cjs +0 -59
  116. package/dist/ColorPickerBase/ColorPickerCompact.js +0 -54
  117. package/dist/ColorPickerBase/ColorPickerFull.cjs +0 -48
  118. package/dist/ColorPickerBase/ColorPickerFull.js +0 -44
package/dist/Button.cjs CHANGED
@@ -2,101 +2,35 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_AbsoluteFill = require('./AbsoluteFill.cjs');
3
3
  let __pixpilot_shadcn = require("@pixpilot/shadcn");
4
4
  __pixpilot_shadcn = require_rolldown_runtime.__toESM(__pixpilot_shadcn);
5
- let lucide_react = require("lucide-react");
6
- lucide_react = require_rolldown_runtime.__toESM(lucide_react);
7
5
  let react = require("react");
8
6
  react = require_rolldown_runtime.__toESM(react);
9
7
  let react_jsx_runtime = require("react/jsx-runtime");
10
8
  react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
11
9
 
12
10
  //#region src/Button.tsx
13
- const LOADER_SIZE_SM = 14;
14
- const LOADER_SIZE_DEFAULT = 16;
15
- const LOADER_SIZE_LG = 20;
16
- /**
17
- * Get loader size based on button size
18
- */
19
- function getLoaderSize(size) {
20
- if (size === "xs" || size === "sm" || size === "icon-xs" || size === "icon-sm") return LOADER_SIZE_SM;
21
- if (size === "lg" || size === "icon-lg") return LOADER_SIZE_LG;
22
- return LOADER_SIZE_DEFAULT;
23
- }
24
- /**
25
- * Render tooltip content. If it's a string containing newlines, split into
26
- * paragraphs; otherwise render the node as-is.
27
- */
28
- async function renderTooltipContent(content) {
29
- if (typeof content === "string") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: content.split("\n").map((line, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: line }, i)) });
30
- return content;
31
- }
32
11
  function Button(props) {
33
- const { children, disabled, onClick, disabledTooltip, loading, loaderProps, onDisabledClick, tooltip, title, slots, className, variant, size, ref,...rest } = props;
34
- const { placement: loaderPlacement = "end" } = loaderProps || {};
12
+ const { children, disabled, onClick, onDisabledClick, title, slots, className, variant, size, ref,...rest } = props;
35
13
  const handleClick = (0, react.useCallback)((e) => {
36
14
  if (onClick && !disabled) onClick(e);
37
15
  }, [disabled, onClick]);
38
- const isDisabled = disabled || loading;
39
- const hasTooltip = Boolean(tooltip);
40
- const hasDisabledTooltip = Boolean(disabledTooltip) && isDisabled;
41
- const showTooltip = hasTooltip || hasDisabledTooltip;
42
- const tooltipContent = hasDisabledTooltip ? disabledTooltip : tooltip;
43
- const hasArea = variant !== "ghost" && variant !== "link";
44
- const Loader = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
45
- "data-slot": "button-loader",
46
- className: (0, __pixpilot_shadcn.cn)("flex items-center justify-center", loaderPlacement === "center" && "rounded-0 absolute inset-0", hasArea && loaderPlacement === "start" && "mr-1", hasArea && loaderPlacement === "end" && "ml-1"),
47
- ...slots?.loaderContainer,
48
- children: slots?.loader ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Loader2, {
49
- className: "animate-spin",
50
- style: {
51
- height: getLoaderSize(size),
52
- width: getLoaderSize(size)
53
- }
54
- })
55
- });
56
- const buttonContent = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Button, {
16
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Button, {
57
17
  ...rest,
58
18
  ref,
59
- disabled: isDisabled,
19
+ disabled,
60
20
  onClick: handleClick,
61
21
  className: (0, __pixpilot_shadcn.cn)("relative", className),
62
22
  variant,
63
23
  size,
64
24
  title,
65
- children: [
66
- Boolean(disabledTooltip) && isDisabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Tooltip, {
67
- ...slots?.tooltip,
68
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipTrigger, {
69
- asChild: true,
70
- ...slots?.tooltipTrigger,
71
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AbsoluteFill.AbsoluteFill, {
72
- onClick: onDisabledClick,
73
- style: {
74
- pointerEvents: "all",
75
- cursor: "not-allowed"
76
- }
77
- })
78
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipContent, {
79
- ...slots?.tooltipContent,
80
- children: renderTooltipContent(disabledTooltip)
81
- })]
82
- }),
83
- loading && loaderPlacement === "start" && Loader,
84
- children,
85
- loading && (loaderPlacement === "end" || loaderPlacement === "center") && Loader
86
- ]
87
- });
88
- if (showTooltip && !(Boolean(disabledTooltip) && isDisabled)) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Tooltip, {
89
- ...slots?.tooltip,
90
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipTrigger, {
91
- asChild: true,
92
- ...slots?.tooltipTrigger,
93
- children: buttonContent
94
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipContent, {
95
- ...slots?.tooltipContent,
96
- children: renderTooltipContent(tooltipContent)
97
- })]
25
+ children: [Boolean(disabled) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AbsoluteFill.AbsoluteFill, {
26
+ title,
27
+ onClick: onDisabledClick,
28
+ style: {
29
+ pointerEvents: "all",
30
+ cursor: "not-allowed"
31
+ }
32
+ }), children]
98
33
  });
99
- return buttonContent;
100
34
  }
101
35
  Button.displayName = "Button";
102
36
 
package/dist/Button.d.cts CHANGED
@@ -4,30 +4,7 @@ import React from "react";
4
4
  import { VariantProps } from "class-variance-authority";
5
5
 
6
6
  //#region src/Button.d.ts
7
- interface ButtonLoaderProps {
8
- /**
9
- * Position of the loader relative to button content
10
- * @default 'end'
11
- */
12
- placement?: 'start' | 'end' | 'center';
13
- }
14
7
  interface ButtonProps extends React.ComponentProps<typeof Button>, VariantProps<typeof buttonVariants> {
15
- /**
16
- * Tooltip message to show when button is disabled
17
- */
18
- disabledTooltip?: React.ReactNode;
19
- /**
20
- * Regular tooltip message
21
- */
22
- tooltip?: React.ReactNode;
23
- /**
24
- * Loading state
25
- */
26
- loading?: boolean;
27
- /**
28
- * Loader configuration
29
- */
30
- loaderProps?: ButtonLoaderProps;
31
8
  /**
32
9
  * Click handler for when disabled button is clicked
33
10
  */
@@ -55,4 +32,4 @@ declare namespace Button$1 {
55
32
  var displayName: string;
56
33
  }
57
34
  //#endregion
58
- export { Button$1 as Button, ButtonLoaderProps, ButtonProps };
35
+ export { Button$1 as Button, ButtonProps };
package/dist/Button.d.ts CHANGED
@@ -4,30 +4,7 @@ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
  import { VariantProps } from "class-variance-authority";
5
5
 
6
6
  //#region src/Button.d.ts
7
- interface ButtonLoaderProps {
8
- /**
9
- * Position of the loader relative to button content
10
- * @default 'end'
11
- */
12
- placement?: 'start' | 'end' | 'center';
13
- }
14
7
  interface ButtonProps extends React.ComponentProps<typeof Button>, VariantProps<typeof buttonVariants> {
15
- /**
16
- * Tooltip message to show when button is disabled
17
- */
18
- disabledTooltip?: React.ReactNode;
19
- /**
20
- * Regular tooltip message
21
- */
22
- tooltip?: React.ReactNode;
23
- /**
24
- * Loading state
25
- */
26
- loading?: boolean;
27
- /**
28
- * Loader configuration
29
- */
30
- loaderProps?: ButtonLoaderProps;
31
8
  /**
32
9
  * Click handler for when disabled button is clicked
33
10
  */
@@ -55,4 +32,4 @@ declare namespace Button$1 {
55
32
  var displayName: string;
56
33
  }
57
34
  //#endregion
58
- export { Button$1 as Button, ButtonLoaderProps, ButtonProps };
35
+ export { Button$1 as Button, ButtonProps };
package/dist/Button.js CHANGED
@@ -1,97 +1,32 @@
1
1
  import { AbsoluteFill } from "./AbsoluteFill.js";
2
- import { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from "@pixpilot/shadcn";
3
- import { Loader2 } from "lucide-react";
2
+ import { Button, cn } from "@pixpilot/shadcn";
4
3
  import React, { useCallback } from "react";
5
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
6
5
 
7
6
  //#region src/Button.tsx
8
- const LOADER_SIZE_SM = 14;
9
- const LOADER_SIZE_DEFAULT = 16;
10
- const LOADER_SIZE_LG = 20;
11
- /**
12
- * Get loader size based on button size
13
- */
14
- function getLoaderSize(size) {
15
- if (size === "xs" || size === "sm" || size === "icon-xs" || size === "icon-sm") return LOADER_SIZE_SM;
16
- if (size === "lg" || size === "icon-lg") return LOADER_SIZE_LG;
17
- return LOADER_SIZE_DEFAULT;
18
- }
19
- /**
20
- * Render tooltip content. If it's a string containing newlines, split into
21
- * paragraphs; otherwise render the node as-is.
22
- */
23
- async function renderTooltipContent(content) {
24
- if (typeof content === "string") return /* @__PURE__ */ jsx(Fragment, { children: content.split("\n").map((line, i) => /* @__PURE__ */ jsx("p", { children: line }, i)) });
25
- return content;
26
- }
27
7
  function Button$1(props) {
28
- const { children, disabled, onClick, disabledTooltip, loading, loaderProps, onDisabledClick, tooltip, title, slots, className, variant, size, ref,...rest } = props;
29
- const { placement: loaderPlacement = "end" } = loaderProps || {};
8
+ const { children, disabled, onClick, onDisabledClick, title, slots, className, variant, size, ref,...rest } = props;
30
9
  const handleClick = useCallback((e) => {
31
10
  if (onClick && !disabled) onClick(e);
32
11
  }, [disabled, onClick]);
33
- const isDisabled = disabled || loading;
34
- const hasTooltip = Boolean(tooltip);
35
- const hasDisabledTooltip = Boolean(disabledTooltip) && isDisabled;
36
- const showTooltip = hasTooltip || hasDisabledTooltip;
37
- const tooltipContent = hasDisabledTooltip ? disabledTooltip : tooltip;
38
- const hasArea = variant !== "ghost" && variant !== "link";
39
- const Loader = /* @__PURE__ */ jsx("div", {
40
- "data-slot": "button-loader",
41
- className: cn("flex items-center justify-center", loaderPlacement === "center" && "rounded-0 absolute inset-0", hasArea && loaderPlacement === "start" && "mr-1", hasArea && loaderPlacement === "end" && "ml-1"),
42
- ...slots?.loaderContainer,
43
- children: slots?.loader ?? /* @__PURE__ */ jsx(Loader2, {
44
- className: "animate-spin",
45
- style: {
46
- height: getLoaderSize(size),
47
- width: getLoaderSize(size)
48
- }
49
- })
50
- });
51
- const buttonContent = /* @__PURE__ */ jsxs(Button, {
12
+ return /* @__PURE__ */ jsxs(Button, {
52
13
  ...rest,
53
14
  ref,
54
- disabled: isDisabled,
15
+ disabled,
55
16
  onClick: handleClick,
56
17
  className: cn("relative", className),
57
18
  variant,
58
19
  size,
59
20
  title,
60
- children: [
61
- Boolean(disabledTooltip) && isDisabled && /* @__PURE__ */ jsxs(Tooltip, {
62
- ...slots?.tooltip,
63
- children: [/* @__PURE__ */ jsx(TooltipTrigger, {
64
- asChild: true,
65
- ...slots?.tooltipTrigger,
66
- children: /* @__PURE__ */ jsx(AbsoluteFill, {
67
- onClick: onDisabledClick,
68
- style: {
69
- pointerEvents: "all",
70
- cursor: "not-allowed"
71
- }
72
- })
73
- }), /* @__PURE__ */ jsx(TooltipContent, {
74
- ...slots?.tooltipContent,
75
- children: renderTooltipContent(disabledTooltip)
76
- })]
77
- }),
78
- loading && loaderPlacement === "start" && Loader,
79
- children,
80
- loading && (loaderPlacement === "end" || loaderPlacement === "center") && Loader
81
- ]
82
- });
83
- if (showTooltip && !(Boolean(disabledTooltip) && isDisabled)) return /* @__PURE__ */ jsxs(Tooltip, {
84
- ...slots?.tooltip,
85
- children: [/* @__PURE__ */ jsx(TooltipTrigger, {
86
- asChild: true,
87
- ...slots?.tooltipTrigger,
88
- children: buttonContent
89
- }), /* @__PURE__ */ jsx(TooltipContent, {
90
- ...slots?.tooltipContent,
91
- children: renderTooltipContent(tooltipContent)
92
- })]
21
+ children: [Boolean(disabled) && /* @__PURE__ */ jsx(AbsoluteFill, {
22
+ title,
23
+ onClick: onDisabledClick,
24
+ style: {
25
+ pointerEvents: "all",
26
+ cursor: "not-allowed"
27
+ }
28
+ }), children]
93
29
  });
94
- return buttonContent;
95
30
  }
96
31
  Button$1.displayName = "Button";
97
32
 
@@ -0,0 +1,104 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_AbsoluteFill = require('./AbsoluteFill.cjs');
3
+ let __pixpilot_shadcn = require("@pixpilot/shadcn");
4
+ __pixpilot_shadcn = require_rolldown_runtime.__toESM(__pixpilot_shadcn);
5
+ let lucide_react = require("lucide-react");
6
+ lucide_react = require_rolldown_runtime.__toESM(lucide_react);
7
+ let react = require("react");
8
+ react = require_rolldown_runtime.__toESM(react);
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
11
+
12
+ //#region src/ButtonExtended.tsx
13
+ const LOADER_SIZE_SM = 14;
14
+ const LOADER_SIZE_DEFAULT = 16;
15
+ const LOADER_SIZE_LG = 20;
16
+ /**
17
+ * Get loader size based on button size
18
+ */
19
+ function getLoaderSize(size) {
20
+ if (size === "xs" || size === "sm" || size === "icon-xs" || size === "icon-sm") return LOADER_SIZE_SM;
21
+ if (size === "lg" || size === "icon-lg") return LOADER_SIZE_LG;
22
+ return LOADER_SIZE_DEFAULT;
23
+ }
24
+ /**
25
+ * Render tooltip content. If it's a string containing newlines, split into
26
+ * paragraphs; otherwise render the node as-is.
27
+ */
28
+ async function renderTooltipContent(content) {
29
+ if (typeof content === "string") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: content.split("\n").map((line, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: line }, i)) });
30
+ return content;
31
+ }
32
+ function ButtonExtended(props) {
33
+ const { children, disabled, onClick, disabledTooltip, loading, loaderProps, onDisabledClick, tooltip, title, slots, className, variant, size, ref,...rest } = props;
34
+ const { placement: loaderPlacement = "end" } = loaderProps || {};
35
+ const handleClick = (0, react.useCallback)((e) => {
36
+ if (onClick && !disabled) onClick(e);
37
+ }, [disabled, onClick]);
38
+ const isDisabled = disabled || loading;
39
+ const hasTooltip = Boolean(tooltip);
40
+ const hasDisabledTooltip = Boolean(disabledTooltip) && isDisabled;
41
+ const showTooltip = hasTooltip || hasDisabledTooltip;
42
+ const tooltipContent = hasDisabledTooltip ? disabledTooltip : tooltip;
43
+ const hasArea = variant !== "ghost" && variant !== "link";
44
+ const Loader = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
45
+ "data-slot": "button-loader",
46
+ className: (0, __pixpilot_shadcn.cn)("flex items-center justify-center", loaderPlacement === "center" && "rounded-0 absolute inset-0", hasArea && loaderPlacement === "start" && "mr-1", hasArea && loaderPlacement === "end" && "ml-1"),
47
+ ...slots?.loaderContainer,
48
+ children: slots?.loader ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Loader2, {
49
+ className: "animate-spin",
50
+ style: {
51
+ height: getLoaderSize(size),
52
+ width: getLoaderSize(size)
53
+ }
54
+ })
55
+ });
56
+ const buttonContent = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Button, {
57
+ ...rest,
58
+ ref,
59
+ disabled: isDisabled,
60
+ onClick: handleClick,
61
+ className: (0, __pixpilot_shadcn.cn)("relative", className),
62
+ variant,
63
+ size,
64
+ title,
65
+ children: [
66
+ Boolean(disabledTooltip) && isDisabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Tooltip, {
67
+ ...slots?.tooltip,
68
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipTrigger, {
69
+ asChild: true,
70
+ ...slots?.tooltipTrigger,
71
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AbsoluteFill.AbsoluteFill, {
72
+ onClick: onDisabledClick,
73
+ style: {
74
+ pointerEvents: "all",
75
+ cursor: "not-allowed"
76
+ }
77
+ })
78
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipContent, {
79
+ ...slots?.tooltipContent,
80
+ children: renderTooltipContent(disabledTooltip)
81
+ })]
82
+ }),
83
+ loading && loaderPlacement === "start" && Loader,
84
+ children,
85
+ loading && (loaderPlacement === "end" || loaderPlacement === "center") && Loader
86
+ ]
87
+ });
88
+ if (showTooltip && !(Boolean(disabledTooltip) && isDisabled)) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Tooltip, {
89
+ ...slots?.tooltip,
90
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipTrigger, {
91
+ asChild: true,
92
+ ...slots?.tooltipTrigger,
93
+ children: buttonContent
94
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.TooltipContent, {
95
+ ...slots?.tooltipContent,
96
+ children: renderTooltipContent(tooltipContent)
97
+ })]
98
+ });
99
+ return buttonContent;
100
+ }
101
+ ButtonExtended.displayName = "ButtonExtended";
102
+
103
+ //#endregion
104
+ exports.ButtonExtended = ButtonExtended;
@@ -0,0 +1,58 @@
1
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
2
+ import { Button, Tooltip, TooltipContent, TooltipTrigger, buttonVariants } from "@pixpilot/shadcn";
3
+ import React from "react";
4
+ import { VariantProps } from "class-variance-authority";
5
+
6
+ //#region src/ButtonExtended.d.ts
7
+ interface ButtonExtendedLoaderProps {
8
+ /**
9
+ * Position of the loader relative to button content
10
+ * @default 'end'
11
+ */
12
+ placement?: 'start' | 'end' | 'center';
13
+ }
14
+ interface ButtonExtendedProps extends React.ComponentProps<typeof Button>, VariantProps<typeof buttonVariants> {
15
+ /**
16
+ * Tooltip message to show when button is disabled
17
+ */
18
+ disabledTooltip?: React.ReactNode;
19
+ /**
20
+ * Regular tooltip message
21
+ */
22
+ tooltip?: React.ReactNode;
23
+ /**
24
+ * Loading state
25
+ */
26
+ loading?: boolean;
27
+ /**
28
+ * Loader configuration
29
+ */
30
+ loaderProps?: ButtonExtendedLoaderProps;
31
+ /**
32
+ * Click handler for when disabled button is clicked
33
+ */
34
+ onDisabledClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
35
+ /**
36
+ * Props to pass to the tooltip component
37
+ */
38
+ /**
39
+ * Slots to customize tooltip components and their props.
40
+ */
41
+ slots?: {
42
+ tooltip?: Omit<React.ComponentProps<typeof Tooltip>, 'children' | 'delayDuration'>;
43
+ tooltipTrigger?: Omit<React.ComponentProps<typeof TooltipTrigger>, 'children'>;
44
+ tooltipContent?: React.ComponentProps<typeof TooltipContent>;
45
+ /** Props applied to the loader container element */
46
+ loaderContainer?: React.HTMLAttributes<HTMLDivElement>;
47
+ /** Custom loader node to render instead of the default `Loader2` */
48
+ loader?: React.ReactNode;
49
+ };
50
+ }
51
+ declare function ButtonExtended(props: ButtonExtendedProps & {
52
+ ref?: React.Ref<HTMLButtonElement>;
53
+ }): react_jsx_runtime1.JSX.Element;
54
+ declare namespace ButtonExtended {
55
+ var displayName: string;
56
+ }
57
+ //#endregion
58
+ export { ButtonExtended, ButtonExtendedLoaderProps, ButtonExtendedProps };
@@ -0,0 +1,58 @@
1
+ import { Button, Tooltip, TooltipContent, TooltipTrigger, buttonVariants } from "@pixpilot/shadcn";
2
+ import React from "react";
3
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
4
+ import { VariantProps } from "class-variance-authority";
5
+
6
+ //#region src/ButtonExtended.d.ts
7
+ interface ButtonExtendedLoaderProps {
8
+ /**
9
+ * Position of the loader relative to button content
10
+ * @default 'end'
11
+ */
12
+ placement?: 'start' | 'end' | 'center';
13
+ }
14
+ interface ButtonExtendedProps extends React.ComponentProps<typeof Button>, VariantProps<typeof buttonVariants> {
15
+ /**
16
+ * Tooltip message to show when button is disabled
17
+ */
18
+ disabledTooltip?: React.ReactNode;
19
+ /**
20
+ * Regular tooltip message
21
+ */
22
+ tooltip?: React.ReactNode;
23
+ /**
24
+ * Loading state
25
+ */
26
+ loading?: boolean;
27
+ /**
28
+ * Loader configuration
29
+ */
30
+ loaderProps?: ButtonExtendedLoaderProps;
31
+ /**
32
+ * Click handler for when disabled button is clicked
33
+ */
34
+ onDisabledClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
35
+ /**
36
+ * Props to pass to the tooltip component
37
+ */
38
+ /**
39
+ * Slots to customize tooltip components and their props.
40
+ */
41
+ slots?: {
42
+ tooltip?: Omit<React.ComponentProps<typeof Tooltip>, 'children' | 'delayDuration'>;
43
+ tooltipTrigger?: Omit<React.ComponentProps<typeof TooltipTrigger>, 'children'>;
44
+ tooltipContent?: React.ComponentProps<typeof TooltipContent>;
45
+ /** Props applied to the loader container element */
46
+ loaderContainer?: React.HTMLAttributes<HTMLDivElement>;
47
+ /** Custom loader node to render instead of the default `Loader2` */
48
+ loader?: React.ReactNode;
49
+ };
50
+ }
51
+ declare function ButtonExtended(props: ButtonExtendedProps & {
52
+ ref?: React.Ref<HTMLButtonElement>;
53
+ }): react_jsx_runtime1.JSX.Element;
54
+ declare namespace ButtonExtended {
55
+ var displayName: string;
56
+ }
57
+ //#endregion
58
+ export { ButtonExtended, ButtonExtendedLoaderProps, ButtonExtendedProps };
@@ -0,0 +1,99 @@
1
+ import { AbsoluteFill } from "./AbsoluteFill.js";
2
+ import { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from "@pixpilot/shadcn";
3
+ import { Loader2 } from "lucide-react";
4
+ import React, { useCallback } from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region src/ButtonExtended.tsx
8
+ const LOADER_SIZE_SM = 14;
9
+ const LOADER_SIZE_DEFAULT = 16;
10
+ const LOADER_SIZE_LG = 20;
11
+ /**
12
+ * Get loader size based on button size
13
+ */
14
+ function getLoaderSize(size) {
15
+ if (size === "xs" || size === "sm" || size === "icon-xs" || size === "icon-sm") return LOADER_SIZE_SM;
16
+ if (size === "lg" || size === "icon-lg") return LOADER_SIZE_LG;
17
+ return LOADER_SIZE_DEFAULT;
18
+ }
19
+ /**
20
+ * Render tooltip content. If it's a string containing newlines, split into
21
+ * paragraphs; otherwise render the node as-is.
22
+ */
23
+ async function renderTooltipContent(content) {
24
+ if (typeof content === "string") return /* @__PURE__ */ jsx(Fragment, { children: content.split("\n").map((line, i) => /* @__PURE__ */ jsx("p", { children: line }, i)) });
25
+ return content;
26
+ }
27
+ function ButtonExtended(props) {
28
+ const { children, disabled, onClick, disabledTooltip, loading, loaderProps, onDisabledClick, tooltip, title, slots, className, variant, size, ref,...rest } = props;
29
+ const { placement: loaderPlacement = "end" } = loaderProps || {};
30
+ const handleClick = useCallback((e) => {
31
+ if (onClick && !disabled) onClick(e);
32
+ }, [disabled, onClick]);
33
+ const isDisabled = disabled || loading;
34
+ const hasTooltip = Boolean(tooltip);
35
+ const hasDisabledTooltip = Boolean(disabledTooltip) && isDisabled;
36
+ const showTooltip = hasTooltip || hasDisabledTooltip;
37
+ const tooltipContent = hasDisabledTooltip ? disabledTooltip : tooltip;
38
+ const hasArea = variant !== "ghost" && variant !== "link";
39
+ const Loader = /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "button-loader",
41
+ className: cn("flex items-center justify-center", loaderPlacement === "center" && "rounded-0 absolute inset-0", hasArea && loaderPlacement === "start" && "mr-1", hasArea && loaderPlacement === "end" && "ml-1"),
42
+ ...slots?.loaderContainer,
43
+ children: slots?.loader ?? /* @__PURE__ */ jsx(Loader2, {
44
+ className: "animate-spin",
45
+ style: {
46
+ height: getLoaderSize(size),
47
+ width: getLoaderSize(size)
48
+ }
49
+ })
50
+ });
51
+ const buttonContent = /* @__PURE__ */ jsxs(Button, {
52
+ ...rest,
53
+ ref,
54
+ disabled: isDisabled,
55
+ onClick: handleClick,
56
+ className: cn("relative", className),
57
+ variant,
58
+ size,
59
+ title,
60
+ children: [
61
+ Boolean(disabledTooltip) && isDisabled && /* @__PURE__ */ jsxs(Tooltip, {
62
+ ...slots?.tooltip,
63
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, {
64
+ asChild: true,
65
+ ...slots?.tooltipTrigger,
66
+ children: /* @__PURE__ */ jsx(AbsoluteFill, {
67
+ onClick: onDisabledClick,
68
+ style: {
69
+ pointerEvents: "all",
70
+ cursor: "not-allowed"
71
+ }
72
+ })
73
+ }), /* @__PURE__ */ jsx(TooltipContent, {
74
+ ...slots?.tooltipContent,
75
+ children: renderTooltipContent(disabledTooltip)
76
+ })]
77
+ }),
78
+ loading && loaderPlacement === "start" && Loader,
79
+ children,
80
+ loading && (loaderPlacement === "end" || loaderPlacement === "center") && Loader
81
+ ]
82
+ });
83
+ if (showTooltip && !(Boolean(disabledTooltip) && isDisabled)) return /* @__PURE__ */ jsxs(Tooltip, {
84
+ ...slots?.tooltip,
85
+ children: [/* @__PURE__ */ jsx(TooltipTrigger, {
86
+ asChild: true,
87
+ ...slots?.tooltipTrigger,
88
+ children: buttonContent
89
+ }), /* @__PURE__ */ jsx(TooltipContent, {
90
+ ...slots?.tooltipContent,
91
+ children: renderTooltipContent(tooltipContent)
92
+ })]
93
+ });
94
+ return buttonContent;
95
+ }
96
+ ButtonExtended.displayName = "ButtonExtended";
97
+
98
+ //#endregion
99
+ export { ButtonExtended };