@donotdev/components 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced/Bento/Bento.d.ts +1 -1
- package/dist/advanced/Bento/Bento.js +1 -1
- package/dist/advanced/Code/CodeContent.js +1 -1
- package/dist/atomic/Alert/index.js +1 -1
- package/dist/atomic/CopyToClipboard/index.d.ts +3 -1
- package/dist/atomic/CopyToClipboard/index.d.ts.map +1 -1
- package/dist/atomic/CopyToClipboard/index.js +5 -3
- package/dist/atomic/DropdownMenu/DropdownMenuPrimitive.d.ts.map +1 -1
- package/dist/atomic/DropdownMenu/DropdownMenuPrimitive.js +5 -21
- package/dist/atomic/DropdownMenu/index.d.ts.map +1 -1
- package/dist/atomic/DropdownMenu/index.js +6 -16
- package/dist/atomic/Grid/index.d.ts +2 -2
- package/dist/atomic/Grid/index.js +2 -2
- package/dist/atomic/HeroSection/index.js +1 -1
- package/dist/atomic/Rating/index.d.ts.map +1 -1
- package/dist/atomic/Section/index.js +1 -1
- package/dist/atomic/Stack/index.d.ts +2 -2
- package/dist/atomic/Stack/index.js +2 -2
- package/dist/atomic/Stepper/index.js +1 -1
- package/dist/atomic/Table/index.d.ts +24 -2
- package/dist/atomic/Table/index.d.ts.map +1 -1
- package/dist/atomic/Table/index.js +55 -6
- package/dist/atomic/Text/index.d.ts +2 -0
- package/dist/atomic/Text/index.d.ts.map +1 -1
- package/dist/atomic/Text/index.js +2 -1
- package/dist/index.js +6 -4
- package/dist/styles/index.css +28 -24
- package/package.json +1 -1
|
@@ -142,7 +142,7 @@ function Code({ children, language = 'tsx', className, showLineNumbers = true, w
|
|
|
142
142
|
useEffect(() => {
|
|
143
143
|
setIsClient(true);
|
|
144
144
|
}, []);
|
|
145
|
-
return (_jsxs(Stack, { gap: "none", className: "dndev-code dndev-surface", "data-glow": "blank", "data-compact": compact, children: [!compact && (_jsx("div", { className: "dndev-code-header", children: _jsxs(Stack, { direction: "row", align: "center", justify: "between",
|
|
145
|
+
return (_jsxs(Stack, { gap: "none", className: "dndev-code dndev-surface", "data-glow": "blank", "data-compact": compact, children: [!compact && (_jsx("div", { className: "dndev-code-header", children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", children: [_jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsxs("div", { className: "dndev-code-traffic-lights", children: [_jsx("div", { className: "dndev-code-traffic-light", "data-color": "red" }), _jsx("div", { className: "dndev-code-traffic-light", "data-color": "yellow" }), _jsx("div", { className: "dndev-code-traffic-light", "data-color": "green" })] }), _jsx(Text, { as: "span", className: "dndev-code-language", children: language }), _jsxs(Text, { as: "span", className: "dndev-code-line-count", children: [lines.length, " line", lines.length !== 1 ? 's' : ''] })] }), showCopyButton && isClient && (_jsx(CopyToClipboard, { text: children, onCopy: onCopy }))] }) })), _jsx(ScrollArea, { className: "dndev-code-content", showHorizontal: !wrapLines, showVertical: true, children: _jsx("pre", { className: "dndev-code-pre", "data-wrap": wrapLines, "data-compact": compact, children: showLineNumbers ? (_jsxs(Stack, { direction: "row", gap: "none", children: [_jsx("div", { className: "dndev-code-line-numbers", children: lines.map((_, index) => (_jsx("div", { className: "dndev-code-line-number", children: String(index + 1).padStart(2, ' ') }, index))) }), highlightedCode ? (_jsx("code", { className: "dndev-code-code", dangerouslySetInnerHTML: { __html: highlightedCode } })) : (_jsx("code", { className: "dndev-code-code", children: lines.map((line, index) => (_jsx(Text, { as: "code", variant: "code", style: {
|
|
146
146
|
display: 'block',
|
|
147
147
|
background: 'transparent',
|
|
148
148
|
padding: 0,
|
|
@@ -72,7 +72,7 @@ const Alert = ({ className, variant = ALERT_VARIANT.DEFAULT, hideIcon = false, t
|
|
|
72
72
|
const variantAttrs = getVariantDataAttrs({
|
|
73
73
|
variant: getThemeVariant(variant),
|
|
74
74
|
});
|
|
75
|
-
return (_jsxs(Stack, { direction: "row",
|
|
75
|
+
return (_jsxs(Stack, { direction: "row", role: "alert", className: cn(alertVariants({ variant }), className), ...variantAttrs, title: tooltip, ...props, children: [!hideIcon && (_jsx(Icon, { icon: IconComponent, className: "dndev-size-md dndev-flex-shrink-0", "aria-hidden": "true" })), _jsxs(Stack, { gap: "tight", flex: "1", className: "dndev-min-w-0", children: [title && (_jsx("div", { className: "dndev-alert-title dndev-text-h5", children: title })), description && (_jsx("div", { className: "dndev-text-base dndev-alert-description", children: description })), children] })] }));
|
|
76
76
|
};
|
|
77
77
|
export default Alert;
|
|
78
78
|
export { alertVariants };
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type ButtonProps } from '../Button';
|
|
2
2
|
import './CopyToClipboard.css';
|
|
3
|
-
export interface CopyToClipboardProps extends Omit<ButtonProps, '
|
|
3
|
+
export interface CopyToClipboardProps extends Omit<ButtonProps, 'children' | 'icon' | 'onCopy'> {
|
|
4
4
|
/** Text to copy to clipboard */
|
|
5
5
|
text: string;
|
|
6
6
|
/** Custom copy button content */
|
|
7
7
|
children?: React.ReactNode;
|
|
8
8
|
/** Callback when copy is successful */
|
|
9
9
|
onCopy?: (text: string) => void;
|
|
10
|
+
/** Optional onClick handler (called after copy, can be used for stopPropagation) */
|
|
11
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
10
12
|
/** Tooltip text when not copied */
|
|
11
13
|
tooltipText?: string;
|
|
12
14
|
/** Tooltip text when copied */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CopyToClipboard/index.tsx"],"names":[],"mappings":"AAgBA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CopyToClipboard/index.tsx"],"names":[],"mappings":"AAgBA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,WAAW,EACX,UAAU,GAAG,MAAM,GAAG,QAAQ,CAC/B;IACC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uCAAuC;IACvC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oFAAoF;IACpF,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC3D,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CA2DrE,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -19,9 +19,9 @@ import './CopyToClipboard.css';
|
|
|
19
19
|
* @since 0.0.1
|
|
20
20
|
* @author AMBROISE PARK Consulting
|
|
21
21
|
*/
|
|
22
|
-
export const CopyToClipboard = ({ text, children, variant = 'ghost', className, onCopy, tooltipText = 'Copy to clipboard', copiedTooltipText = 'Copied!', showTooltip = true, ariaLabel, ...buttonProps }) => {
|
|
22
|
+
export const CopyToClipboard = ({ text, children, variant = 'ghost', className, onCopy, onClick, tooltipText = 'Copy to clipboard', copiedTooltipText = 'Copied!', showTooltip = true, ariaLabel, ...buttonProps }) => {
|
|
23
23
|
const [copied, setCopied] = useState(false);
|
|
24
|
-
const handleCopy = useCallback(async () => {
|
|
24
|
+
const handleCopy = useCallback(async (e) => {
|
|
25
25
|
try {
|
|
26
26
|
if (typeof window === 'undefined' || !navigator?.clipboard) {
|
|
27
27
|
console.warn('Clipboard API not available');
|
|
@@ -31,12 +31,14 @@ export const CopyToClipboard = ({ text, children, variant = 'ghost', className,
|
|
|
31
31
|
setCopied(true);
|
|
32
32
|
onCopy?.(text);
|
|
33
33
|
setTimeout(() => setCopied(false), 2000);
|
|
34
|
+
// Call onClick handler if provided (e.g., for stopPropagation)
|
|
35
|
+
onClick?.(e);
|
|
34
36
|
}
|
|
35
37
|
catch (error) {
|
|
36
38
|
console.error('Failed to copy to clipboard:', error);
|
|
37
39
|
// No fallback - modern browsers should support clipboard API
|
|
38
40
|
}
|
|
39
|
-
}, [text, onCopy]);
|
|
41
|
+
}, [text, onCopy, onClick]);
|
|
40
42
|
return (_jsx(Button, { type: "button", variant: variant, display: DISPLAY.COMPACT, icon: copied ? Check : Copy, onClick: handleCopy, tooltip: showTooltip ? (copied ? copiedTooltipText : tooltipText) : undefined, className: cn('dndev-copy-button-transition', copied && 'dndev-copy-button-scaled', className), "aria-label": ariaLabel || (copied ? 'Copied to clipboard' : 'Copy to clipboard'), ...buttonProps, children: children }));
|
|
41
43
|
};
|
|
42
44
|
export default CopyToClipboard;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenuPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/DropdownMenu/DropdownMenuPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,iBAAiB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"DropdownMenuPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/DropdownMenu/DropdownMenuPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,iBAAiB,MAAM,+BAA+B,CAAC;AAKnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,QAAA,MAAM,qBAAqB,yDAAyB,CAAC;AACrD,QAAA,MAAM,4BAA4B,0IAA4B,CAAC;AAC/D,QAAA,MAAM,0BAA0B,qIAA0B,CAAC;AAC3D,QAAA,MAAM,2BAA2B,+DAA2B,CAAC;AAC7D,QAAA,MAAM,wBAAwB,4DAAwB,CAAC;AACvD,QAAA,MAAM,+BAA+B,0IAA+B,CAAC;AAErE,QAAA,MAAM,+BAA+B,GAAI,0CAKtC,cAAc,CAAC,OAAO,iBAAiB,CAAC,UAAU,CAAC,GAAG;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,4CASA,CAAC;AAEF,QAAA,MAAM,+BAA+B,GAAI,yBAGtC,cAAc,CAAC,OAAO,iBAAiB,CAAC,UAAU,CAAC,4CAErD,CAAC;AAEF,QAAA,MAAM,4BAA4B,GAAI,8DAMnC,cAAc,CAAC,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG;IACpD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC3C,4CAYA,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAAI,yCAKhC,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,4CAQA,CAAC;AAEF,QAAA,MAAM,iCAAiC,GAAI,qDAMxC,cAAc,CAAC,OAAO,iBAAiB,CAAC,YAAY,CAAC,GAAG;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,4CAcA,CAAC;AAEF,QAAA,MAAM,8BAA8B,GAAI,4CAKrC,cAAc,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,GAAG;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,4CAaA,CAAC;AAEF,QAAA,MAAM,0BAA0B,GAAI,yCAKjC,cAAc,CAAC,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,4CAOA,CAAC;AAEF,QAAA,MAAM,8BAA8B,GAAI,kCAIrC,cAAc,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,GAAG;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,4CAMA,CAAC;AAEF,QAAA,MAAM,6BAA6B,GAAI,yBAGpC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,4CAEvC,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC;AACjC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,iCAAiC,EACjC,8BAA8B,EAC9B,0BAA0B,EAC1B,8BAA8B,EAC9B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,+BAA+B,EAC/B,+BAA+B,EAC/B,+BAA+B,GAChC,CAAC"}
|
|
@@ -9,7 +9,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import * as RadixDropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
12
|
-
import { Slot } from '@radix-ui/react-slot';
|
|
13
12
|
import { Check, ChevronRight, Circle } from 'lucide-react';
|
|
14
13
|
import { cn } from '../../utils/helpers';
|
|
15
14
|
const DropdownMenuPrimitive = RadixDropdownMenu.Root;
|
|
@@ -23,26 +22,11 @@ const DropdownMenuSubContentPrimitive = ({ className, ...props }) => (_jsx(Radix
|
|
|
23
22
|
const DropdownMenuContentPrimitive = ({ className, sideOffset = 4, align = 'start', onCloseAutoFocus = (e) => e.preventDefault(), ...props }) => {
|
|
24
23
|
return (_jsx(RadixDropdownMenu.Portal, { children: _jsx(RadixDropdownMenu.Content, { sideOffset: sideOffset, align: align, onCloseAutoFocus: onCloseAutoFocus, className: cn(className), ...props }) }));
|
|
25
24
|
};
|
|
26
|
-
const DropdownMenuItemPrimitive = ({ className, inset, asChild = false, ...props }) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
};
|
|
30
|
-
const
|
|
31
|
-
const Comp = asChild ? Slot : RadixDropdownMenu.CheckboxItem;
|
|
32
|
-
return (_jsxs(Comp, { className: cn(className), "data-role": "menu-item", "data-inset": "true", checked: checked, ...props, children: [_jsx(RadixDropdownMenu.ItemIndicator, { children: _jsx(Check, {}) }), children] }));
|
|
33
|
-
};
|
|
34
|
-
const DropdownMenuRadioItemPrimitive = ({ className, children, asChild = false, ...props }) => {
|
|
35
|
-
const Comp = asChild ? Slot : RadixDropdownMenu.RadioItem;
|
|
36
|
-
return (_jsxs(Comp, { className: cn(className), "data-role": "menu-item", "data-inset": "true", ...props, children: [_jsx(RadixDropdownMenu.ItemIndicator, { children: _jsx(Circle, {}) }), children] }));
|
|
37
|
-
};
|
|
38
|
-
const DropdownMenuLabelPrimitive = ({ className, inset, asChild = false, ...props }) => {
|
|
39
|
-
const Comp = asChild ? Slot : RadixDropdownMenu.Label;
|
|
40
|
-
return (_jsx(Comp, { className: cn(className), "data-inset": inset ? 'true' : undefined, ...props }));
|
|
41
|
-
};
|
|
42
|
-
const DropdownMenuSeparatorPrimitive = ({ className, asChild = false, ...props }) => {
|
|
43
|
-
const Comp = asChild ? Slot : RadixDropdownMenu.Separator;
|
|
44
|
-
return _jsx(Comp, { className: cn(className), ...props });
|
|
45
|
-
};
|
|
25
|
+
const DropdownMenuItemPrimitive = ({ className, inset, asChild = false, ...props }) => (_jsx(RadixDropdownMenu.Item, { className: cn(className), "data-role": "menu-item", "data-inset": inset ? 'true' : undefined, asChild: asChild, ...props }));
|
|
26
|
+
const DropdownMenuCheckboxItemPrimitive = ({ className, children, checked, asChild = false, ...props }) => (_jsxs(RadixDropdownMenu.CheckboxItem, { className: cn(className), "data-role": "menu-item", "data-inset": "true", checked: checked, asChild: asChild, ...props, children: [_jsx(RadixDropdownMenu.ItemIndicator, { children: _jsx(Check, {}) }), children] }));
|
|
27
|
+
const DropdownMenuRadioItemPrimitive = ({ className, children, asChild = false, ...props }) => (_jsxs(RadixDropdownMenu.RadioItem, { className: cn(className), "data-role": "menu-item", "data-inset": "true", asChild: asChild, ...props, children: [_jsx(RadixDropdownMenu.ItemIndicator, { children: _jsx(Circle, {}) }), children] }));
|
|
28
|
+
const DropdownMenuLabelPrimitive = ({ className, inset, asChild = false, ...props }) => (_jsx(RadixDropdownMenu.Label, { className: cn(className), "data-inset": inset ? 'true' : undefined, asChild: asChild, ...props }));
|
|
29
|
+
const DropdownMenuSeparatorPrimitive = ({ className, asChild = false, ...props }) => (_jsx(RadixDropdownMenu.Separator, { className: cn(className), asChild: asChild, ...props }));
|
|
46
30
|
const DropdownMenuShortcutPrimitive = ({ className, ...props }) => {
|
|
47
31
|
return _jsx("span", { className: cn(className), ...props });
|
|
48
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/DropdownMenu/index.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,oBAAoB,CAAC;AAc5B,KAAK,oBAAoB,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gDAAgD;IAChD,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,sBAAsB,GAAG,oBAAoB,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,uBAAuB,GAAG,oBAAoB,GAAG;IACpD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B,sBAAsB,GACtB,qBAAqB,GACrB,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1C,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,QAAA,MAAM,YAAY,GAAI,+EAQnB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/DropdownMenu/index.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,oBAAoB,CAAC;AAc5B,KAAK,oBAAoB,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gDAAgD;IAChD,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,sBAAsB,GAAG,oBAAoB,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,uBAAuB,GAAG,oBAAoB,GAAG;IACpD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B,sBAAsB,GACtB,qBAAqB,GACrB,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1C,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,QAAA,MAAM,YAAY,GAAI,+EAQnB,iBAAiB,mDAsPnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
11
11
|
* @author AMBROISE PARK Consulting
|
|
12
12
|
*/
|
|
13
13
|
import { ChevronRight, Check } from 'lucide-react';
|
|
14
|
-
import { Children
|
|
14
|
+
import { Children } from 'react';
|
|
15
15
|
import { DropdownMenuPrimitive, DropdownMenuTriggerPrimitive, DropdownMenuContentPrimitive, DropdownMenuItemPrimitive, DropdownMenuSubPrimitive, DropdownMenuSubTriggerPrimitive, DropdownMenuSubContentPrimitive, DropdownMenuPortalPrimitive, DropdownMenuLabelPrimitive, DropdownMenuSeparatorPrimitive, } from './DropdownMenuPrimitive';
|
|
16
16
|
import { cn } from '../../utils/helpers';
|
|
17
17
|
import ScrollArea from '../ScrollArea';
|
|
@@ -48,22 +48,12 @@ const getIconOnlyAriaLabel = (hasIcon, hasLabel, label, fallback) => {
|
|
|
48
48
|
const DropdownMenu = ({ trigger, items = [], children, contentWidth, contentAlign = 'start', open, onOpenChange, }) => {
|
|
49
49
|
if (!trigger)
|
|
50
50
|
return null;
|
|
51
|
-
// Normalize children to ensure keys (React.Children.toArray handles this automatically)
|
|
52
51
|
const normalizedChildren = children ? Children.toArray(children) : [];
|
|
53
|
-
// Wrap children in DropdownMenuItemPrimitive
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (isValidElement(child) &&
|
|
59
|
-
child.props?.['data-role'] === 'menu-item') {
|
|
60
|
-
// Already a menu item, don't wrap
|
|
61
|
-
return child;
|
|
62
|
-
}
|
|
63
|
-
// Wrap child in DropdownMenuItemPrimitive for auto-close behavior
|
|
64
|
-
// Using asChild merges props correctly with the child component
|
|
65
|
-
return (_jsx(DropdownMenuItemPrimitive, { className: "dndev-interactive", asChild: true, children: child }, index));
|
|
66
|
-
});
|
|
52
|
+
// Wrap children in DropdownMenuItemPrimitive (without asChild).
|
|
53
|
+
// Radix renders its own wrapper element with proper onSelect → auto-close.
|
|
54
|
+
// asChild doesn't work here because components (GoTo, ThemeToggle, etc.)
|
|
55
|
+
// don't forward Radix's merged event handlers to the DOM.
|
|
56
|
+
const wrappedChildren = normalizedChildren.map((child, index) => (_jsx(DropdownMenuItemPrimitive, { children: child }, index)));
|
|
67
57
|
const content = (_jsxs(_Fragment, { children: [wrappedChildren, items.length > 0 &&
|
|
68
58
|
items.map((item, index) => {
|
|
69
59
|
// Label item
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @example
|
|
6
6
|
* ```tsx
|
|
7
7
|
* // Fixed 3-column grid
|
|
8
|
-
* <Grid cols={3}
|
|
8
|
+
* <Grid cols={3}>
|
|
9
9
|
* <Card />
|
|
10
10
|
* <Card />
|
|
11
11
|
* <Card />
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* // Responsive grid: [mobile, tablet, laptop, desktop]
|
|
15
15
|
* // 1 col on mobile/tablet, 2 on laptop, 3 on desktop
|
|
16
|
-
* <Grid cols={[1, 1, 2, 3]}
|
|
16
|
+
* <Grid cols={[1, 1, 2, 3]}>
|
|
17
17
|
* <Card />
|
|
18
18
|
* <Card />
|
|
19
19
|
* <Card />
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @example
|
|
7
7
|
* ```tsx
|
|
8
8
|
* // Fixed 3-column grid
|
|
9
|
-
* <Grid cols={3}
|
|
9
|
+
* <Grid cols={3}>
|
|
10
10
|
* <Card />
|
|
11
11
|
* <Card />
|
|
12
12
|
* <Card />
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* // Responsive grid: [mobile, tablet, laptop, desktop]
|
|
16
16
|
* // 1 col on mobile/tablet, 2 on laptop, 3 on desktop
|
|
17
|
-
* <Grid cols={[1, 1, 2, 3]}
|
|
17
|
+
* <Grid cols={[1, 1, 2, 3]}>
|
|
18
18
|
* <Card />
|
|
19
19
|
* <Card />
|
|
20
20
|
* <Card />
|
|
@@ -56,7 +56,7 @@ const HeroSection = forwardRef(function HeroSection({ as = 'section', badge, tit
|
|
|
56
56
|
...props.style,
|
|
57
57
|
},
|
|
58
58
|
...props,
|
|
59
|
-
}, _jsxs(Stack, {
|
|
59
|
+
}, _jsxs(Stack, { children: [badge && _jsx(Badge, { variant: BADGE_VARIANT.ACCENT, children: badge }), title && (_jsx(Text, { as: "div", level: "h1", className: "dndev-hero-title", "data-gradient-text": variant === 'subtle' ? undefined : variant || 'primary', children: title })), subtitle && (_jsx(Text, { as: "p", level: "body", className: "dndev-hero-subtitle", children: subtitle })), children] }));
|
|
60
60
|
});
|
|
61
61
|
HeroSection.displayName = 'HeroSection';
|
|
62
62
|
export default HeroSection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Rating/index.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG7E,OAAO,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,OAAO,CAAC;AAE3D,QAAA,MAAM,cAAc;;8EAgBlB,CAAC;AAEH,MAAM,WAAW,WACf,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Rating/index.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG7E,OAAO,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,OAAO,CAAC;AAE3D,QAAA,MAAM,cAAc;;8EAgBlB,CAAC;AAEH,MAAM,WAAW,WACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAChD,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAiBD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,MAAM,GAAI,gHAWb,WAAW,4CAkHb,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,IAAI,cAAc,EAAE,CAAC;AAC7D,YAAY,EAAE,cAAc,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
8
8
|
* @example
|
|
9
9
|
* ```tsx
|
|
10
10
|
* // Fixed 3 columns
|
|
11
|
-
* <Section title="Features" gridCols={3}>
|
|
11
|
+
* <Section title="Features" gridCols={[1,1,3,3]}>
|
|
12
12
|
* <Card />
|
|
13
13
|
* <Card />
|
|
14
14
|
* <Card />
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @example
|
|
7
7
|
* ```tsx
|
|
8
8
|
* // Vertical stack (default div)
|
|
9
|
-
* <Stack
|
|
9
|
+
* <Stack>
|
|
10
10
|
* <Label>Email</Label>
|
|
11
11
|
* <Input />
|
|
12
12
|
* </Stack>
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* </Stack>
|
|
25
25
|
*
|
|
26
26
|
* // Centered, fit-content width with start-aligned items
|
|
27
|
-
* <Stack
|
|
27
|
+
* <Stack align="start" width="fit" centered>
|
|
28
28
|
* <Label>Item 1</Label>
|
|
29
29
|
* <Label>Item 2</Label>
|
|
30
30
|
* </Stack>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @example
|
|
8
8
|
* ```tsx
|
|
9
9
|
* // Vertical stack (default div)
|
|
10
|
-
* <Stack
|
|
10
|
+
* <Stack>
|
|
11
11
|
* <Label>Email</Label>
|
|
12
12
|
* <Input />
|
|
13
13
|
* </Stack>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* </Stack>
|
|
26
26
|
*
|
|
27
27
|
* // Centered, fit-content width with start-aligned items
|
|
28
|
-
* <Stack
|
|
28
|
+
* <Stack align="start" width="fit" centered>
|
|
29
29
|
* <Label>Item 1</Label>
|
|
30
30
|
* <Label>Item 2</Label>
|
|
31
31
|
* </Stack>
|
|
@@ -79,7 +79,7 @@ export const Stepper = ({ steps, defaultStep = 0, showStepNumbers = true, showNa
|
|
|
79
79
|
if (!currentStep) {
|
|
80
80
|
return null;
|
|
81
81
|
}
|
|
82
|
-
return (_jsxs(Stack, { ref: containerRef,
|
|
82
|
+
return (_jsxs(Stack, { ref: containerRef, className: cn('dndev-stepper-container', className), onKeyDown: handleKeyDown, tabIndex: 0, role: "region", "aria-label": "Stepper navigation", children: [_jsxs("div", { className: "dndev-stepper-nav", children: [showNavigation && (_jsx("button", { onClick: () => handleStepChange(activeStep - 1), disabled: isFirstStep, className: "dndev-interactive", "data-role": "stepper-nav-arrow", "aria-label": previousLabel, ...variantAttrs, children: _jsx(ChevronLeft, {}) })), steps.map((step, index) => (_jsxs("div", { className: "dndev-stepper-nav-item", children: [_jsx("button", { onClick: () => handleStepChange(index), className: "dndev-interactive", "data-role": "stepper-button", "data-state": index === activeStep
|
|
83
83
|
? 'active'
|
|
84
84
|
: index < activeStep
|
|
85
85
|
? 'completed'
|
|
@@ -91,6 +91,26 @@ export interface DataTableProps<T = any> {
|
|
|
91
91
|
onRowClick?: (row: T) => void;
|
|
92
92
|
/** Additional CSS classes */
|
|
93
93
|
className?: string;
|
|
94
|
+
/**
|
|
95
|
+
* Enable export functionality (CSV download button)
|
|
96
|
+
* @default false
|
|
97
|
+
*/
|
|
98
|
+
exportable?: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Custom filename for export (without extension)
|
|
101
|
+
* @default 'export'
|
|
102
|
+
*/
|
|
103
|
+
exportFilename?: string;
|
|
104
|
+
/**
|
|
105
|
+
* Callback when export is triggered. If provided, handles export externally.
|
|
106
|
+
* Receives the processed (filtered/sorted) data array.
|
|
107
|
+
*/
|
|
108
|
+
onExport?: (data: T[]) => void;
|
|
109
|
+
/**
|
|
110
|
+
* Label for the export button
|
|
111
|
+
* @default 'Export'
|
|
112
|
+
*/
|
|
113
|
+
exportLabel?: string;
|
|
94
114
|
}
|
|
95
115
|
/**
|
|
96
116
|
* Basic Table wrapper component.
|
|
@@ -105,7 +125,7 @@ declare function TableHead({ className, ...props }: HTMLAttributes<HTMLTableCell
|
|
|
105
125
|
declare function TableCell({ className, ...props }: HTMLAttributes<HTMLTableCellElement>): import("react/jsx-runtime").JSX.Element;
|
|
106
126
|
declare function TableCaption({ className, ...props }: HTMLAttributes<HTMLTableCaptionElement>): import("react/jsx-runtime").JSX.Element;
|
|
107
127
|
/**
|
|
108
|
-
* High-level DataTable component with built-in sorting, filtering, search, and
|
|
128
|
+
* High-level DataTable component with built-in sorting, filtering, search, pagination, and export.
|
|
109
129
|
*
|
|
110
130
|
* @component
|
|
111
131
|
* @example
|
|
@@ -118,12 +138,14 @@ declare function TableCaption({ className, ...props }: HTMLAttributes<HTMLTableC
|
|
|
118
138
|
* ]}
|
|
119
139
|
* searchable
|
|
120
140
|
* pagination
|
|
141
|
+
* exportable
|
|
142
|
+
* exportFilename="users-export"
|
|
121
143
|
* />
|
|
122
144
|
* ```
|
|
123
145
|
* @param {DataTableProps} props - The props for the data table
|
|
124
146
|
* @returns {ReactNode} The rendered data table
|
|
125
147
|
*/
|
|
126
|
-
declare const DataTable: <T = any>({ data, columns, sortable, selectable, searchable, pagination, currentPage: currentPageProp, pageSize: pageSizeProp, total: totalProp, onPageChange, onPageSizeChange, showingLabel, paginationPreviousLabel, paginationNextLabel, paginationItemsPerPagePlaceholder, loading, gridLines, onSort, onSelect, onSearch, onRowClick, className, }: DataTableProps<T>) => ReactNode;
|
|
148
|
+
declare const DataTable: <T = any>({ data, columns, sortable, selectable, searchable, pagination, currentPage: currentPageProp, pageSize: pageSizeProp, total: totalProp, onPageChange, onPageSizeChange, showingLabel, paginationPreviousLabel, paginationNextLabel, paginationItemsPerPagePlaceholder, loading, gridLines, onSort, onSelect, onSearch, onRowClick, className, exportable, exportFilename, onExport, exportLabel, }: DataTableProps<T>) => ReactNode;
|
|
127
149
|
export default Table;
|
|
128
150
|
export { TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, DataTable, };
|
|
129
151
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Table/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AAUf,OAAO,aAAa,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7D;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,GAAG;IACrC,iBAAiB;IACjB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,yBAAyB;IACzB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,wGAAwG;IACxG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IACvC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Table/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
// packages/components/src/atomic/Table/index.tsx
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Table component
|
|
5
|
-
* @description Enhanced table with sorting, filtering, and
|
|
5
|
+
* @description Enhanced table with sorting, filtering, selection, and export
|
|
6
6
|
*
|
|
7
|
-
* @version 0.0.
|
|
7
|
+
* @version 0.0.2
|
|
8
8
|
* @since 0.0.1
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
|
-
import { ChevronUp, ChevronDown, Search } from 'lucide-react';
|
|
11
|
+
import { ChevronUp, ChevronDown, Search, Download } from 'lucide-react';
|
|
12
12
|
import { useState, useMemo, } from 'react';
|
|
13
13
|
import { cn } from '../../utils/helpers';
|
|
14
14
|
import Button, { BUTTON_VARIANT } from '../Button';
|
|
@@ -49,7 +49,7 @@ function TableCaption({ className, ...props }) {
|
|
|
49
49
|
}
|
|
50
50
|
// Enhanced DataTable component
|
|
51
51
|
/**
|
|
52
|
-
* High-level DataTable component with built-in sorting, filtering, search, and
|
|
52
|
+
* High-level DataTable component with built-in sorting, filtering, search, pagination, and export.
|
|
53
53
|
*
|
|
54
54
|
* @component
|
|
55
55
|
* @example
|
|
@@ -62,12 +62,14 @@ function TableCaption({ className, ...props }) {
|
|
|
62
62
|
* ]}
|
|
63
63
|
* searchable
|
|
64
64
|
* pagination
|
|
65
|
+
* exportable
|
|
66
|
+
* exportFilename="users-export"
|
|
65
67
|
* />
|
|
66
68
|
* ```
|
|
67
69
|
* @param {DataTableProps} props - The props for the data table
|
|
68
70
|
* @returns {ReactNode} The rendered data table
|
|
69
71
|
*/
|
|
70
|
-
const DataTable = ({ data, columns, sortable = true, selectable = false, searchable = true, pagination = true, currentPage: currentPageProp, pageSize: pageSizeProp, total: totalProp, onPageChange, onPageSizeChange, showingLabel, paginationPreviousLabel, paginationNextLabel, paginationItemsPerPagePlaceholder, loading = false, gridLines = false, onSort, onSelect, onSearch, onRowClick, className, }) => {
|
|
72
|
+
const DataTable = ({ data, columns, sortable = true, selectable = false, searchable = true, pagination = true, currentPage: currentPageProp, pageSize: pageSizeProp, total: totalProp, onPageChange, onPageSizeChange, showingLabel, paginationPreviousLabel, paginationNextLabel, paginationItemsPerPagePlaceholder, loading = false, gridLines = false, onSort, onSelect, onSearch, onRowClick, className, exportable = false, exportFilename = 'export', onExport, exportLabel = 'Export', }) => {
|
|
71
73
|
const [sortColumn, setSortColumn] = useState('');
|
|
72
74
|
const [sortDirection, setSortDirection] = useState('asc');
|
|
73
75
|
const [searchQuery, setSearchQuery] = useState('');
|
|
@@ -162,11 +164,58 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
162
164
|
setSearchQuery(query);
|
|
163
165
|
onSearch?.(query);
|
|
164
166
|
};
|
|
167
|
+
/**
|
|
168
|
+
* Export processed data to CSV
|
|
169
|
+
* Uses the current filtered/sorted data, respecting column definitions
|
|
170
|
+
*/
|
|
171
|
+
const handleExport = () => {
|
|
172
|
+
// If custom handler provided, delegate to it
|
|
173
|
+
if (onExport) {
|
|
174
|
+
onExport(processedData);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Get column headers (only data columns, not render-only columns)
|
|
178
|
+
const dataColumns = columns.filter((col) => col.dataIndex);
|
|
179
|
+
const headers = dataColumns
|
|
180
|
+
.map((col) => {
|
|
181
|
+
// Extract string title, handle ReactNode titles
|
|
182
|
+
const title = col.title;
|
|
183
|
+
return typeof title === 'string' ? title : col.key;
|
|
184
|
+
})
|
|
185
|
+
.join(',');
|
|
186
|
+
// Build CSV rows
|
|
187
|
+
const rows = processedData.map((row) => dataColumns
|
|
188
|
+
.map((col) => {
|
|
189
|
+
const value = col.dataIndex ? row[col.dataIndex] : '';
|
|
190
|
+
// Escape quotes and wrap in quotes if contains comma, quote, or newline
|
|
191
|
+
const stringValue = String(value ?? '');
|
|
192
|
+
if (stringValue.includes(',') ||
|
|
193
|
+
stringValue.includes('"') ||
|
|
194
|
+
stringValue.includes('\n')) {
|
|
195
|
+
return `"${stringValue.replace(/"/g, '""')}"`;
|
|
196
|
+
}
|
|
197
|
+
return stringValue;
|
|
198
|
+
})
|
|
199
|
+
.join(','));
|
|
200
|
+
// Combine headers and rows
|
|
201
|
+
const csv = [headers, ...rows].join('\n');
|
|
202
|
+
// Create and trigger download
|
|
203
|
+
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
|
|
204
|
+
const url = URL.createObjectURL(blob);
|
|
205
|
+
const link = document.createElement('a');
|
|
206
|
+
link.setAttribute('href', url);
|
|
207
|
+
link.setAttribute('download', `${exportFilename}.csv`);
|
|
208
|
+
link.style.visibility = 'hidden';
|
|
209
|
+
document.body.appendChild(link);
|
|
210
|
+
link.click();
|
|
211
|
+
document.body.removeChild(link);
|
|
212
|
+
URL.revokeObjectURL(url);
|
|
213
|
+
};
|
|
165
214
|
// Industry standard pattern: When loading, pass empty rows to render actual structure
|
|
166
215
|
// Component will detect empty data and render skeleton bars in cells
|
|
167
216
|
const skeletonRows = Array.from({ length: 3 }, () => ({}));
|
|
168
217
|
const finalDisplayData = loading ? skeletonRows : displayData;
|
|
169
|
-
return (_jsxs(Stack, { gap: "
|
|
218
|
+
return (_jsxs(Stack, { children: [(searchable || exportable) && (_jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [searchable && (_jsxs(Stack, { direction: "row", align: "center", className: "dndev-relative dndev-flex-1 dndev-table-search-container", children: [_jsx(Search, { className: "dndev-table-search-icon" }), _jsx(Input, { placeholder: "Search...", value: searchQuery, onChange: (e) => handleSearch(e.target.value), className: "dndev-table-search-input" })] })), exportable && (_jsx(Button, { variant: "outline", icon: Download, onClick: handleExport, disabled: loading || processedData.length === 0, display: "compact", "aria-label": exportLabel, children: exportLabel }))] })), _jsxs(Table, { className: cn(gridLines && 'dndev-table-grid'), children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [selectable && (_jsx(TableHead, { className: "dndev-w-touch", children: _jsx(Checkbox, { checked: selectedRows.length === displayData.length &&
|
|
170
219
|
displayData.length > 0, onCheckedChange: handleSelectAll, "aria-label": "Select all rows" }) })), columns.map((column) => (_jsx(TableHead, { className: cn(column.sortable && 'dndev-cursor-pointer'), "data-sortable": column.sortable, "data-align": column.align, style: { width: column.width }, onClick: (e) => {
|
|
171
220
|
// Only sort if clicking on header, not on interactive elements (buttons, inputs, etc.)
|
|
172
221
|
if (column.sortable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Text/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;CAGf,CAAC;AAEX;;GAEG;AACH,UAAU,YAAY;IACpB;;;;;;;;;;OAUG;IACH,EAAE,CAAC,EACC,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,MAAM,GACN,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,MAAM,GACN,QAAQ,GACR,IAAI,CAAC;IAET,wBAAwB;IACxB,QAAQ,EAAE,SAAS,CAAC;IAEpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;IAE3D;;;;;;;OAOG;IACH,KAAK,CAAC,EACF,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,MAAM,GACN,OAAO,GACP,SAAS,CAAC;IAEd;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Text/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;CAGf,CAAC;AAEX;;GAEG;AACH,UAAU,YAAY;IACpB;;;;;;;;;;OAUG;IACH,EAAE,CAAC,EACC,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,MAAM,GACN,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,MAAM,GACN,QAAQ,GACR,IAAI,CAAC;IAET,wBAAwB;IACxB,QAAQ,EAAE,SAAS,CAAC;IAEpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;IAE3D;;;;;;;OAOG;IACH,KAAK,CAAC,EACF,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,MAAM,GACN,OAAO,GACP,SAAS,CAAC;IAEd;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IAEnD,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,KAAK,IAAI,YAAY,GACjE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,YAAY,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,QAAA,MAAM,IAAI,uHAuDR,CAAC;AAIH,eAAe,IAAI,CAAC;AACpB,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -79,7 +79,7 @@ export const TEXT_VARIANT = {
|
|
|
79
79
|
* @param {TextProps} props - The props for the text
|
|
80
80
|
* @returns {JSX.Element} The rendered text component
|
|
81
81
|
*/
|
|
82
|
-
const Text = forwardRef(function Text({ as = 'div', children, variant = TEXT_VARIANT.DEFAULT, level, align, weight, className, ...props }, ref) {
|
|
82
|
+
const Text = forwardRef(function Text({ as = 'div', children, variant = TEXT_VARIANT.DEFAULT, level, align, weight, italic, className, ...props }, ref) {
|
|
83
83
|
const Component = as;
|
|
84
84
|
const variantAttrs = getVariantDataAttrs({ variant });
|
|
85
85
|
// Auto-map as prop to level if level not explicitly provided
|
|
@@ -99,6 +99,7 @@ const Text = forwardRef(function Text({ as = 'div', children, variant = TEXT_VAR
|
|
|
99
99
|
className: cn('dndev-text-base', className),
|
|
100
100
|
'data-text-align': align || undefined,
|
|
101
101
|
'data-font-weight': weight || undefined,
|
|
102
|
+
'data-italic': italic || undefined,
|
|
102
103
|
...variantAttrs,
|
|
103
104
|
...levelAttrs,
|
|
104
105
|
...props,
|