@donotdev/components 0.0.10 → 0.0.12
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/atomic/Accordion/index.d.ts +2 -16
- package/dist/atomic/Accordion/index.d.ts.map +1 -1
- package/dist/atomic/Accordion/index.js +4 -25
- package/dist/atomic/Alert/index.d.ts.map +1 -1
- package/dist/atomic/Alert/index.js +1 -1
- package/dist/atomic/Button/index.js +6 -3
- package/dist/atomic/Calendar/index.js +1 -1
- package/dist/atomic/CallToAction/index.d.ts.map +1 -1
- package/dist/atomic/CallToAction/index.js +1 -1
- package/dist/atomic/Collapsible/index.d.ts +12 -16
- package/dist/atomic/Collapsible/index.d.ts.map +1 -1
- package/dist/atomic/Collapsible/index.js +24 -24
- package/dist/atomic/Combobox/index.d.ts +9 -47
- package/dist/atomic/Combobox/index.d.ts.map +1 -1
- package/dist/atomic/Combobox/index.js +135 -87
- package/dist/atomic/Dialog/index.d.ts.map +1 -1
- package/dist/atomic/Dialog/index.js +1 -1
- package/dist/atomic/DropdownMenu/index.js +1 -1
- package/dist/atomic/Input/index.d.ts +1 -1
- package/dist/atomic/Input/index.d.ts.map +1 -1
- package/dist/atomic/Input/index.js +6 -22
- package/dist/atomic/Label/FloatingLabel.d.ts +31 -0
- package/dist/atomic/Label/FloatingLabel.d.ts.map +1 -0
- package/dist/atomic/Label/FloatingLabel.js +34 -0
- package/dist/atomic/Label/index.d.ts +5 -1
- package/dist/atomic/Label/index.d.ts.map +1 -1
- package/dist/atomic/Label/index.js +8 -2
- package/dist/atomic/PasswordInput/index.d.ts +9 -10
- package/dist/atomic/PasswordInput/index.d.ts.map +1 -1
- package/dist/atomic/PasswordInput/index.js +10 -30
- package/dist/atomic/Section/index.d.ts +25 -1
- package/dist/atomic/Section/index.d.ts.map +1 -1
- package/dist/atomic/Section/index.js +22 -4
- package/dist/atomic/Select/index.d.ts +3 -1
- package/dist/atomic/Select/index.d.ts.map +1 -1
- package/dist/atomic/Select/index.js +13 -24
- package/dist/atomic/Skeleton/index.d.ts.map +1 -1
- package/dist/atomic/Skeleton/index.js +6 -3
- package/dist/atomic/Switch/index.d.ts +18 -4
- package/dist/atomic/Switch/index.d.ts.map +1 -1
- package/dist/atomic/Switch/index.js +25 -6
- package/dist/atomic/Table/index.d.ts +17 -7
- package/dist/atomic/Table/index.d.ts.map +1 -1
- package/dist/atomic/Table/index.js +13 -3
- package/dist/atomic/Tooltip/index.d.ts.map +1 -1
- package/dist/atomic/Tooltip/index.js +6 -2
- package/dist/atomic/VideoPlayer/index.d.ts.map +1 -1
- package/dist/atomic/index.d.ts +2 -3
- package/dist/atomic/index.d.ts.map +1 -1
- package/dist/atomic/index.js +1 -2
- package/dist/hooks/useIntersectionObserver.js +3 -1
- package/dist/index.js +4 -4
- package/dist/styles/index.css +495 -81
- package/package.json +1 -1
- package/dist/atomic/Combobox/ComboboxPrimitive.d.ts +0 -18
- package/dist/atomic/Combobox/ComboboxPrimitive.d.ts.map +0 -1
- package/dist/atomic/Combobox/ComboboxPrimitive.js +0 -14
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// packages/components/src/atomic/PasswordInput/index.tsx
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview PasswordInput component
|
|
@@ -9,25 +9,26 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import { Eye, EyeOff } from 'lucide-react';
|
|
12
|
-
import { useState, useId
|
|
12
|
+
import { useState, useId } from 'react';
|
|
13
13
|
import { cn } from '../../utils/helpers';
|
|
14
|
-
import
|
|
15
|
-
import Label from '../Label';
|
|
14
|
+
import { FloatingLabel } from '../Label';
|
|
16
15
|
import './PasswordInput.css';
|
|
17
16
|
/**
|
|
18
17
|
* PasswordInput Component
|
|
19
18
|
*
|
|
20
19
|
* A password input field with show/hide toggle functionality.
|
|
21
20
|
* Features industry-standard UX patterns:
|
|
22
|
-
* - Eye icon toggle (show/hide password)
|
|
23
|
-
* - Keyboard accessibility (Enter to toggle)
|
|
21
|
+
* - Eye icon toggle (show/hide password) - ALWAYS at end, cannot be overridden
|
|
24
22
|
* - Smooth icon transitions
|
|
25
23
|
* - Mobile-friendly touch targets
|
|
26
24
|
* - Screen reader support
|
|
27
25
|
* - ARIA labels and descriptions
|
|
28
26
|
*
|
|
27
|
+
* Opinionated: Eye icon is ALWAYS positioned at end with inline styles.
|
|
28
|
+
* If you need different behavior, create your own component.
|
|
29
|
+
*
|
|
29
30
|
* @component
|
|
30
|
-
* @version 0.0.
|
|
31
|
+
* @version 0.0.2
|
|
31
32
|
* @since 0.0.1
|
|
32
33
|
* @author AMBROISE PARK Consulting
|
|
33
34
|
* @example
|
|
@@ -36,13 +37,12 @@ import './PasswordInput.css';
|
|
|
36
37
|
* value={password}
|
|
37
38
|
* onChange={setPassword}
|
|
38
39
|
* placeholder="Enter password"
|
|
39
|
-
* showToggle={true}
|
|
40
40
|
* />
|
|
41
41
|
* ```
|
|
42
42
|
* @param {PasswordInputProps} props - The props for the password input
|
|
43
43
|
* @returns {JSX.Element} The rendered password input
|
|
44
44
|
*/
|
|
45
|
-
const PasswordInput = ({ className,
|
|
45
|
+
const PasswordInput = ({ className, visible: controlledVisible, onVisibilityChange, label, value, onFocus, onBlur, required, ...props }) => {
|
|
46
46
|
const id = useId();
|
|
47
47
|
const [internalVisible, setInternalVisible] = useState(false);
|
|
48
48
|
// Use controlled or internal state
|
|
@@ -55,26 +55,6 @@ const PasswordInput = ({ className, showToggle = true, toggleButton, visible: co
|
|
|
55
55
|
}
|
|
56
56
|
onVisibilityChange?.(newVisible);
|
|
57
57
|
};
|
|
58
|
-
|
|
59
|
-
if (e.key === 'Enter' && showToggle) {
|
|
60
|
-
e.preventDefault();
|
|
61
|
-
toggleVisibility();
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
return (_jsxs("div", { className: "dndev-relative", children: [hasLabel && (_jsx(Label, { htmlFor: id, style: {
|
|
65
|
-
position: 'absolute',
|
|
66
|
-
left: 'var(--gap-md)',
|
|
67
|
-
top: 'calc(-1 * var(--font-size-xs) / 2 - 1px)',
|
|
68
|
-
fontSize: 'var(--font-size-xs)',
|
|
69
|
-
fontWeight: 500,
|
|
70
|
-
color: props.disabled
|
|
71
|
-
? 'var(--muted-foreground)'
|
|
72
|
-
: 'var(--foreground)',
|
|
73
|
-
pointerEvents: 'none',
|
|
74
|
-
zIndex: 1,
|
|
75
|
-
backgroundColor: 'var(--background)',
|
|
76
|
-
padding: '0 var(--gap-xs)',
|
|
77
|
-
lineHeight: 1,
|
|
78
|
-
}, children: label })), _jsx("input", { id: id, type: isVisible ? 'text' : 'password', value: value, className: cn('dndev-input', showToggle && 'dndev-password-input-with-toggle', className), onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur, ...props }), showToggle && (_jsx(Button, { type: "button", variant: BUTTON_VARIANT.GHOST, className: "dndev-password-toggle-button", onClick: toggleVisibility, "aria-label": isVisible ? 'Hide password' : 'Show password', "aria-describedby": props['aria-describedby'], tabIndex: -1, children: toggleButton || (_jsx(_Fragment, { children: isVisible ? (_jsx(EyeOff, { className: "dndev-size-md dndev-password-toggle-icon" })) : (_jsx(Eye, { className: "dndev-size-md dndev-password-toggle-icon" })) })) }))] }));
|
|
58
|
+
return (_jsxs("div", { className: "dndev-relative", children: [hasLabel && (_jsx(FloatingLabel, { htmlFor: id, disabled: props.disabled, required: required, children: label })), _jsx("input", { id: id, type: isVisible ? 'text' : 'password', value: value, className: cn('dndev-input', 'dndev-password-input-with-toggle', className), onFocus: onFocus, onBlur: onBlur, required: required, ...props }), _jsx("button", { type: "button", className: "dndev-password-toggle-button", onClick: toggleVisibility, "aria-label": isVisible ? 'Hide password' : 'Show password', "aria-describedby": props['aria-describedby'], tabIndex: -1, children: isVisible ? (_jsx(EyeOff, { className: "dndev-size-md dndev-password-toggle-icon" })) : (_jsx(Eye, { className: "dndev-size-md dndev-password-toggle-icon" })) })] }));
|
|
79
59
|
};
|
|
80
60
|
export default PasswordInput;
|
|
@@ -18,9 +18,15 @@
|
|
|
18
18
|
* <Card />
|
|
19
19
|
* <Card />
|
|
20
20
|
* </Section>
|
|
21
|
+
*
|
|
22
|
+
* // Collapsible section
|
|
23
|
+
* <Section title="Details" collapsible defaultOpen={false}>
|
|
24
|
+
* <Card />
|
|
25
|
+
* <Card />
|
|
26
|
+
* </Section>
|
|
21
27
|
* ```
|
|
22
28
|
*
|
|
23
|
-
* @version 0.0.
|
|
29
|
+
* @version 0.0.5
|
|
24
30
|
* @since 0.0.1
|
|
25
31
|
* @author AMBROISE PARK Consulting
|
|
26
32
|
*/
|
|
@@ -61,6 +67,24 @@ interface SectionOwnProps {
|
|
|
61
67
|
* @default 'medium'
|
|
62
68
|
*/
|
|
63
69
|
gridGap?: 'none' | 'tight' | 'medium' | 'large';
|
|
70
|
+
/**
|
|
71
|
+
* Whether the section is collapsible
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
collapsible?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Controlled open state (when collapsible)
|
|
77
|
+
*/
|
|
78
|
+
open?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Callback when open state changes (when collapsible)
|
|
81
|
+
*/
|
|
82
|
+
onOpenChange?: (open: boolean) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Default open state (uncontrolled, when collapsible)
|
|
85
|
+
* @default false
|
|
86
|
+
*/
|
|
87
|
+
defaultOpen?: boolean;
|
|
64
88
|
}
|
|
65
89
|
/**
|
|
66
90
|
* Polymorphic Section props
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Section/index.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Section/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAa,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AASpD,OAAO,eAAe,CAAC;AAEvB;;GAEG;AACH,UAAU,eAAe;IACvB;;;OAGG;IACH,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAEtD,sBAAsB;IACtB,QAAQ,EAAE,SAAS,CAAC;IAEpB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IAE7D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEnC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEnC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEhD;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,IAAI,eAAe,GAC3E,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,eAAe,CAAC,CAAC;AAExD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,OAAO,8HAmGZ,CAAC;AAIF,eAAe,OAAO,CAAC"}
|
|
@@ -20,18 +20,27 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
20
20
|
* <Card />
|
|
21
21
|
* <Card />
|
|
22
22
|
* </Section>
|
|
23
|
+
*
|
|
24
|
+
* // Collapsible section
|
|
25
|
+
* <Section title="Details" collapsible defaultOpen={false}>
|
|
26
|
+
* <Card />
|
|
27
|
+
* <Card />
|
|
28
|
+
* </Section>
|
|
23
29
|
* ```
|
|
24
30
|
*
|
|
25
|
-
* @version 0.0.
|
|
31
|
+
* @version 0.0.5
|
|
26
32
|
* @since 0.0.1
|
|
27
33
|
* @author AMBROISE PARK Consulting
|
|
28
34
|
*/
|
|
29
|
-
import { createElement, forwardRef, } from 'react';
|
|
35
|
+
import { createElement, forwardRef, useState, } from 'react';
|
|
36
|
+
import { Plus, Minus } from 'lucide-react';
|
|
30
37
|
import { GAP_VARIANT } from '../../styles/componentConstants';
|
|
31
38
|
import { cn } from '../../utils/helpers';
|
|
32
39
|
import Grid, {} from '../Grid';
|
|
33
40
|
import Separator, { SEPARATOR_VARIANT } from '../Separator';
|
|
34
41
|
import Text from '../Text';
|
|
42
|
+
import Stack from '../Stack';
|
|
43
|
+
import CollapsiblePrimitive, { CollapsibleTrigger, CollapsibleContent, } from '../Collapsible/CollapsiblePrimitive';
|
|
35
44
|
import './Section.css';
|
|
36
45
|
/**
|
|
37
46
|
* Minimal layout section with title, optional separator, and tone backgrounds.
|
|
@@ -46,9 +55,18 @@ import './Section.css';
|
|
|
46
55
|
* </Section>
|
|
47
56
|
* ```
|
|
48
57
|
*/
|
|
49
|
-
const Section = forwardRef(function Section({ as = 'section', children, title, separator = false, tone = 'base', align: textAlign = 'center', gridCols, gridGap, className, ...props }, ref) {
|
|
58
|
+
const Section = forwardRef(function Section({ as = 'section', children, title, separator = false, tone = 'base', align: textAlign = 'center', gridCols, gridGap, collapsible = false, open, onOpenChange, defaultOpen = false, className, ...props }, ref) {
|
|
50
59
|
const Component = as;
|
|
60
|
+
const [internalOpen, setInternalOpen] = useState(() => collapsible ? defaultOpen : false);
|
|
61
|
+
const isControlled = collapsible && open !== undefined;
|
|
62
|
+
const isOpen = isControlled ? open : internalOpen;
|
|
63
|
+
const handleOpenChange = isControlled ? onOpenChange : setInternalOpen;
|
|
51
64
|
const content = gridCols ? (_jsx(Grid, { cols: gridCols, gap: gridGap || GAP_VARIANT.MEDIUM, children: children })) : (children);
|
|
65
|
+
const titleElement = title &&
|
|
66
|
+
(collapsible ? (_jsx(CollapsibleTrigger, { asChild: true, children: _jsxs(Stack, { as: "div", direction: "row", align: "center", justify: "between", className: "dndev-section-title-trigger", children: [_jsx(Text, { as: "div", level: "h2", className: "dndev-section-title", children: title }), isOpen ? (_jsx(Minus, { className: "dndev-section-icon", "aria-hidden": "true" })) : (_jsx(Plus, { className: "dndev-section-icon", "aria-hidden": "true" }))] }) })) : (_jsx(Text, { as: "div", level: "h2", className: "dndev-section-title", children: title })));
|
|
67
|
+
const sectionContent = collapsible ? (_jsxs(CollapsiblePrimitive, { ...(isControlled
|
|
68
|
+
? { open: isOpen, onOpenChange: handleOpenChange }
|
|
69
|
+
: { defaultOpen: defaultOpen, onOpenChange: handleOpenChange }), children: [titleElement, _jsx(CollapsibleContent, { className: "dndev-collapsible-content", children: content })] })) : (_jsxs(_Fragment, { children: [titleElement, content] }));
|
|
52
70
|
return createElement(Component, {
|
|
53
71
|
ref,
|
|
54
72
|
'aria-label': props['aria-label'],
|
|
@@ -56,7 +74,7 @@ const Section = forwardRef(function Section({ as = 'section', children, title, s
|
|
|
56
74
|
'data-tone': tone,
|
|
57
75
|
'data-text-align': textAlign,
|
|
58
76
|
...props,
|
|
59
|
-
}, _jsxs(_Fragment, { children: [separator && _jsx(Separator, { variant: SEPARATOR_VARIANT.ACCENT }),
|
|
77
|
+
}, _jsxs(_Fragment, { children: [separator && _jsx(Separator, { variant: SEPARATOR_VARIANT.ACCENT }), _jsx("div", { className: "dndev-section-content", children: sectionContent })] }));
|
|
60
78
|
});
|
|
61
79
|
Section.displayName = 'Section';
|
|
62
80
|
export default Section;
|
|
@@ -25,6 +25,8 @@ export interface SelectProps extends Omit<ComponentProps<typeof SelectRootPrimit
|
|
|
25
25
|
isLoading?: boolean;
|
|
26
26
|
/** Label for floating label - automatically floats when both label and placeholder are provided */
|
|
27
27
|
label?: string;
|
|
28
|
+
/** Whether the field is required - shows asterisk indicator */
|
|
29
|
+
required?: boolean;
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
32
|
* Accessible select component built on Radix UI primitives.
|
|
@@ -46,6 +48,6 @@ export interface SelectProps extends Omit<ComponentProps<typeof SelectRootPrimit
|
|
|
46
48
|
* @param {SelectProps} props - The props for the select
|
|
47
49
|
* @returns {JSX.Element} The rendered select
|
|
48
50
|
*/
|
|
49
|
-
declare const Select: ({ value, onValueChange, placeholder, options, trigger, disabled, isLoading, defaultValue, label, ...props }: SelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
declare const Select: ({ value, onValueChange, placeholder, options, trigger, disabled, isLoading, defaultValue, label, required, ...props }: SelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
50
52
|
export default Select;
|
|
51
53
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Select/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Select/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,mBAON,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,WAAY,SAAQ,IAAI,CACvC,cAAc,CAAC,OAAO,mBAAmB,CAAC,EAC1C,UAAU,CACX;IACC,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAA,MAAM,MAAM,GAAI,uHAYb,WAAW,4CAoHb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -12,7 +12,8 @@ import * as SelectRadix from '@radix-ui/react-select';
|
|
|
12
12
|
import { Check, ChevronDown } from 'lucide-react';
|
|
13
13
|
import { useState, useId } from 'react';
|
|
14
14
|
import { cn } from '../../utils/helpers';
|
|
15
|
-
import
|
|
15
|
+
import { FloatingLabel } from '../Label';
|
|
16
|
+
import ScrollArea from '../ScrollArea';
|
|
16
17
|
import SelectRootPrimitive, { SelectTriggerPrimitive, SelectValuePrimitive, SelectContentPrimitive, SelectItemPrimitive, SelectLabelPrimitive, SelectSeparatorPrimitive, } from './SelectPrimitive';
|
|
17
18
|
import './Select.css';
|
|
18
19
|
/**
|
|
@@ -35,31 +36,19 @@ import './Select.css';
|
|
|
35
36
|
* @param {SelectProps} props - The props for the select
|
|
36
37
|
* @returns {JSX.Element} The rendered select
|
|
37
38
|
*/
|
|
38
|
-
const Select = ({ value, onValueChange, placeholder = 'Select an option...', options = [], trigger, disabled, isLoading, defaultValue, label, ...props }) => {
|
|
39
|
+
const Select = ({ value, onValueChange, placeholder = 'Select an option...', options = [], trigger, disabled, isLoading, defaultValue, label, required, ...props }) => {
|
|
39
40
|
const id = useId();
|
|
40
41
|
const [isOpen, setIsOpen] = useState(false);
|
|
41
42
|
const hasLabel = !!label;
|
|
42
|
-
const customTrigger = trigger ? (_jsx(SelectTriggerPrimitive, { asChild: true, disabled: disabled, className: "dndev-input dndev-select-trigger", children: trigger })) : (_jsxs("div", { className: "dndev-relative", children: [hasLabel && (_jsx(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
padding: '0 var(--gap-xs)',
|
|
53
|
-
lineHeight: 1,
|
|
54
|
-
}, children: label })), _jsxs(SelectTriggerPrimitive, { id: id, className: "dndev-input dndev-select-trigger", disabled: disabled, children: [isLoading ? (_jsxs("div", { className: "dndev-select-loading-container", children: [_jsx("div", { className: "dndev-animate-spin dndev-select-loading-spinner" }), _jsx("span", { children: "Loading..." })] })) : (_jsx(SelectValuePrimitive, { placeholder: placeholder })), _jsx(SelectRadix.Icon, { asChild: true, children: _jsx(ChevronDown, {}) })] })] }));
|
|
55
|
-
return (_jsxs(SelectRootPrimitive, { value: value, onValueChange: onValueChange, defaultValue: defaultValue, disabled: disabled, onOpenChange: setIsOpen, ...props, children: [customTrigger, _jsx(SelectRadix.Portal, { children: _jsx(SelectContentPrimitive, { className: "dndev-floating dndev-menu-content dndev-z-tooltip dndev-select-content", position: "popper", side: "bottom", sideOffset: 4, align: "start", "data-glow": "blank", children: _jsx(SelectRadix.Viewport, { children: options.map((option) => {
|
|
56
|
-
if (option.value === '__label__') {
|
|
57
|
-
return (_jsx(SelectLabelPrimitive, { className: "dndev-menu-label", children: option.label }, option.label));
|
|
58
|
-
}
|
|
59
|
-
if (option.value === '__separator__') {
|
|
60
|
-
return (_jsx(SelectSeparatorPrimitive, { className: "dndev-menu-separator" }, "separator"));
|
|
61
|
-
}
|
|
62
|
-
return (_jsxs(SelectItemPrimitive, { value: option.value, disabled: option.disabled, className: "dndev-interactive", "data-role": "menu-item", children: [option.content ? (option.content) : (_jsx(_Fragment, { children: _jsxs(SelectRadix.ItemText, { children: [_jsx("span", { children: option.label }), option.description && (_jsx("span", { className: "dndev-select-item-description", children: option.description }))] }) })), _jsx(SelectRadix.ItemIndicator, { className: "dndev-dropdown-menu-checkmark dndev-dropdown-menu-trailing", children: _jsx(Check, {}) })] }, option.value));
|
|
63
|
-
}) }) }) })] }));
|
|
43
|
+
const customTrigger = trigger ? (_jsx(SelectTriggerPrimitive, { asChild: true, disabled: disabled, className: "dndev-input dndev-select-trigger", children: trigger })) : (_jsxs("div", { className: "dndev-relative", children: [hasLabel && (_jsx(FloatingLabel, { htmlFor: id, disabled: disabled, required: required, children: label })), _jsxs(SelectTriggerPrimitive, { id: id, className: "dndev-input dndev-select-trigger", disabled: disabled, children: [isLoading ? (_jsxs("div", { className: "dndev-select-loading-container", children: [_jsx("div", { className: "dndev-animate-spin dndev-select-loading-spinner" }), _jsx("span", { children: "Loading..." })] })) : (_jsx(SelectValuePrimitive, { placeholder: placeholder })), _jsx(SelectRadix.Icon, { asChild: true, children: _jsx(ChevronDown, {}) })] })] }));
|
|
44
|
+
return (_jsxs(SelectRootPrimitive, { value: value, onValueChange: onValueChange, defaultValue: defaultValue, disabled: disabled, onOpenChange: setIsOpen, ...props, children: [customTrigger, _jsx(SelectRadix.Portal, { children: _jsx(SelectContentPrimitive, { className: "dndev-floating dndev-menu-content dndev-z-tooltip dndev-select-content", position: "popper", side: "bottom", sideOffset: 4, align: "start", "data-glow": "blank", children: _jsx(SelectRadix.Viewport, { children: _jsx(ScrollArea, { className: "dndev-menu-scroll-area", end: true, children: options.map((option) => {
|
|
45
|
+
if (option.value === '__label__') {
|
|
46
|
+
return (_jsx(SelectLabelPrimitive, { className: "dndev-menu-label", children: option.label }, option.label));
|
|
47
|
+
}
|
|
48
|
+
if (option.value === '__separator__') {
|
|
49
|
+
return (_jsx(SelectSeparatorPrimitive, { className: "dndev-menu-separator" }, "separator"));
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs(SelectItemPrimitive, { value: option.value, disabled: option.disabled, className: "dndev-interactive", "data-role": "menu-item", children: [option.content ? (option.content) : (_jsx(_Fragment, { children: _jsxs(SelectRadix.ItemText, { children: [_jsx("span", { children: option.label }), option.description && (_jsx("span", { className: "dndev-select-item-description", children: option.description }))] }) })), _jsx(SelectRadix.ItemIndicator, { className: "dndev-dropdown-menu-checkmark dndev-dropdown-menu-trailing", children: _jsx(Check, {}) })] }, option.value));
|
|
52
|
+
}) }) }) }) })] }));
|
|
64
53
|
};
|
|
65
54
|
export default Select;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Skeleton/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACzE,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9E,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAuBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAiB,EACjB,IAAe,EACf,KAAK,EACL,MAAM,EACN,KAAS,EACT,YAAY,EAAE,SAA6B,EAC3C,GAAG,KAAK,EACT,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Skeleton/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACzE,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9E,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAuBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAiB,EACjB,IAAe,EACf,KAAK,EACL,MAAM,EACN,KAAS,EACT,YAAY,EAAE,SAA6B,EAC3C,GAAG,KAAK,EACT,EAAE,aAAa,2CAiDf;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -11,16 +11,16 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
11
11
|
import { cn } from '../../utils/helpers';
|
|
12
12
|
const sizePresets = {
|
|
13
13
|
text: { height: 'var(--gap-md)', width: '100%' },
|
|
14
|
-
heading: { height: 'var(--icon-touch)', width: '
|
|
14
|
+
heading: { height: 'var(--icon-touch)', width: '100%' },
|
|
15
15
|
avatar: {
|
|
16
16
|
height: 'var(--icon-touch)',
|
|
17
17
|
width: 'var(--icon-touch)',
|
|
18
18
|
borderRadius: 'var(--radius-full)',
|
|
19
19
|
},
|
|
20
|
-
button: { height: 'var(--icon-touch)', width: '
|
|
20
|
+
button: { height: 'var(--icon-touch)', width: '100%' },
|
|
21
21
|
card: { height: '8rem', width: '100%' },
|
|
22
22
|
image: { height: '12rem', width: '100%' },
|
|
23
|
-
custom: {},
|
|
23
|
+
custom: { width: '100%' },
|
|
24
24
|
};
|
|
25
25
|
const animationClasses = {
|
|
26
26
|
pulse: 'dndev-skeleton-pulse',
|
|
@@ -56,10 +56,13 @@ function Skeleton({ className, variant = 'pulse', size = 'custom', width, height
|
|
|
56
56
|
const animationClass = animationClasses[variant];
|
|
57
57
|
const style = {
|
|
58
58
|
...sizeStyles,
|
|
59
|
+
// Width: explicit width prop overrides preset, otherwise use preset (defaults to 100%)
|
|
59
60
|
...(width && { width: typeof width === 'number' ? `${width}px` : width }),
|
|
61
|
+
// Height: explicit height prop overrides preset
|
|
60
62
|
...(height && {
|
|
61
63
|
height: typeof height === 'number' ? `${height}px` : height,
|
|
62
64
|
}),
|
|
65
|
+
// User-provided style overrides everything
|
|
63
66
|
...props.style,
|
|
64
67
|
};
|
|
65
68
|
if (lines > 1) {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Switch component
|
|
3
3
|
* @description Accessible switch component built on Radix UI primitives with semantic color variants.
|
|
4
|
+
* Supports optional labels for binary choices (e.g., Manual/Automatic).
|
|
4
5
|
*
|
|
5
|
-
* @version 0.0.
|
|
6
|
+
* @version 0.0.2
|
|
6
7
|
* @since 0.0.1
|
|
7
8
|
* @author AMBROISE PARK Consulting
|
|
8
9
|
*/
|
|
@@ -14,21 +15,34 @@ import './Switch.css';
|
|
|
14
15
|
export interface SwitchProps extends ComponentProps<typeof SwitchPrimitives.Root> {
|
|
15
16
|
/** Semantic color variant */
|
|
16
17
|
variant?: ControlVariant;
|
|
18
|
+
/** Label for unchecked state (e.g., "Manual") */
|
|
19
|
+
uncheckedLabel?: string;
|
|
20
|
+
/** Label for checked state (e.g., "Automatic") */
|
|
21
|
+
checkedLabel?: string;
|
|
17
22
|
}
|
|
18
23
|
/**
|
|
19
24
|
* Accessible switch control with semantic color variants.
|
|
20
|
-
* Supports
|
|
25
|
+
* Supports optional labels for binary choices with automatic active/inactive styling.
|
|
21
26
|
*
|
|
22
27
|
* @component
|
|
23
28
|
* @example
|
|
24
29
|
* ```tsx
|
|
30
|
+
* // Simple switch without labels
|
|
25
31
|
* <Switch checked={enabled} onCheckedChange={setEnabled} variant="success" />
|
|
26
|
-
*
|
|
32
|
+
*
|
|
33
|
+
* // Switch with labels (Manual/Automatic)
|
|
34
|
+
* <Switch
|
|
35
|
+
* checked={isAutomatic}
|
|
36
|
+
* onCheckedChange={setIsAutomatic}
|
|
37
|
+
* uncheckedLabel="Manual"
|
|
38
|
+
* checkedLabel="Automatic"
|
|
39
|
+
* variant="muted"
|
|
40
|
+
* />
|
|
27
41
|
* ```
|
|
28
42
|
* @param {SwitchProps} props - The props for the switch
|
|
29
43
|
* @returns {JSX.Element} The rendered switch
|
|
30
44
|
*/
|
|
31
|
-
declare const Switch: ({ className, variant, ...props }: SwitchProps) => import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
declare const Switch: ({ className, variant, uncheckedLabel, checkedLabel, checked, ...props }: SwitchProps) => import("react/jsx-runtime").JSX.Element;
|
|
32
46
|
export default Switch;
|
|
33
47
|
export { SwitchPrimitive, CONTROL_VARIANT as SWITCH_VARIANT };
|
|
34
48
|
export type { ControlVariant as SwitchVariant };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Switch/index.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Switch/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,WAAY,SAAQ,cAAc,CACjD,OAAO,gBAAgB,CAAC,IAAI,CAC7B;IACC,6BAA6B;IAC7B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,MAAM,GAAI,yEAOb,WAAW,4CAyCb,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,eAAe,IAAI,cAAc,EAAE,CAAC;AAC9D,YAAY,EAAE,cAAc,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// packages/components/src/atomic/Switch/index.tsx
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Switch component
|
|
5
5
|
* @description Accessible switch component built on Radix UI primitives with semantic color variants.
|
|
6
|
+
* Supports optional labels for binary choices (e.g., Manual/Automatic).
|
|
6
7
|
*
|
|
7
|
-
* @version 0.0.
|
|
8
|
+
* @version 0.0.2
|
|
8
9
|
* @since 0.0.1
|
|
9
10
|
* @author AMBROISE PARK Consulting
|
|
10
11
|
*/
|
|
@@ -34,20 +35,38 @@ const switchVariants = cva('dndev-switch', {
|
|
|
34
35
|
});
|
|
35
36
|
/**
|
|
36
37
|
* Accessible switch control with semantic color variants.
|
|
37
|
-
* Supports
|
|
38
|
+
* Supports optional labels for binary choices with automatic active/inactive styling.
|
|
38
39
|
*
|
|
39
40
|
* @component
|
|
40
41
|
* @example
|
|
41
42
|
* ```tsx
|
|
43
|
+
* // Simple switch without labels
|
|
42
44
|
* <Switch checked={enabled} onCheckedChange={setEnabled} variant="success" />
|
|
43
|
-
*
|
|
45
|
+
*
|
|
46
|
+
* // Switch with labels (Manual/Automatic)
|
|
47
|
+
* <Switch
|
|
48
|
+
* checked={isAutomatic}
|
|
49
|
+
* onCheckedChange={setIsAutomatic}
|
|
50
|
+
* uncheckedLabel="Manual"
|
|
51
|
+
* checkedLabel="Automatic"
|
|
52
|
+
* variant="muted"
|
|
53
|
+
* />
|
|
44
54
|
* ```
|
|
45
55
|
* @param {SwitchProps} props - The props for the switch
|
|
46
56
|
* @returns {JSX.Element} The rendered switch
|
|
47
57
|
*/
|
|
48
|
-
const Switch = ({ className, variant, ...props }) => {
|
|
58
|
+
const Switch = ({ className, variant, uncheckedLabel, checkedLabel, checked, ...props }) => {
|
|
49
59
|
const variantAttrs = getVariantDataAttrs({ variant });
|
|
50
|
-
|
|
60
|
+
const hasLabels = uncheckedLabel || checkedLabel;
|
|
61
|
+
const switchElement = (_jsx(SwitchPrimitives.Root, { className: cn(switchVariants({ variant }), className), ...variantAttrs, checked: checked, ...props, children: _jsx(SwitchPrimitives.Thumb, { className: cn('dndev-switch-thumb') }) }));
|
|
62
|
+
// If no labels, return just the switch
|
|
63
|
+
if (!hasLabels) {
|
|
64
|
+
return switchElement;
|
|
65
|
+
}
|
|
66
|
+
// With labels: render [uncheckedLabel] [Switch] [checkedLabel]
|
|
67
|
+
// Add data-checked attribute to container for CSS styling
|
|
68
|
+
const isChecked = checked ?? false;
|
|
69
|
+
return (_jsxs("div", { className: "dndev-switch-with-labels", "data-checked": isChecked ? 'true' : 'false', children: [uncheckedLabel && (_jsx("span", { className: "dndev-switch-label dndev-switch-label-unchecked", children: uncheckedLabel })), switchElement, checkedLabel && (_jsx("span", { className: "dndev-switch-label dndev-switch-label-checked", children: checkedLabel }))] }));
|
|
51
70
|
};
|
|
52
71
|
export default Switch;
|
|
53
72
|
export { SwitchPrimitive, CONTROL_VARIANT as SWITCH_VARIANT };
|
|
@@ -3,9 +3,10 @@ import './Table.css';
|
|
|
3
3
|
/**
|
|
4
4
|
* Table column configuration
|
|
5
5
|
*
|
|
6
|
-
* LAYOUT
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* LAYOUT EXCEPTIONS:
|
|
7
|
+
* - `width`: Layout control for structural column layout (not styling)
|
|
8
|
+
* - `render`: Render prop pattern for custom cell content (modern children pattern)
|
|
9
|
+
* This is the preferred way to handle dynamic cell content vs nested component composition.
|
|
9
10
|
*
|
|
10
11
|
* @version 0.0.1
|
|
11
12
|
* @since 0.0.1
|
|
@@ -13,10 +14,16 @@ import './Table.css';
|
|
|
13
14
|
*/
|
|
14
15
|
export interface TableColumn<T = any> {
|
|
15
16
|
key: string;
|
|
16
|
-
|
|
17
|
+
/** Column header - can be a string or ReactNode (e.g., Button, icon) */
|
|
18
|
+
title: string | ReactNode;
|
|
17
19
|
dataIndex?: keyof T;
|
|
18
20
|
sortable?: boolean;
|
|
19
21
|
filterable?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Render prop for custom cell content - RENDER PROP EXCEPTION
|
|
24
|
+
* Modern pattern for dynamic content generation. Preferred over nested component composition.
|
|
25
|
+
* Allows rendering custom components (buttons, inputs, etc.) within table cells.
|
|
26
|
+
*/
|
|
20
27
|
render?: (value: any, record: T, index: number) => ReactNode;
|
|
21
28
|
/**
|
|
22
29
|
* Column width - LAYOUT EXCEPTION
|
|
@@ -26,9 +33,10 @@ export interface TableColumn<T = any> {
|
|
|
26
33
|
width?: string | number;
|
|
27
34
|
/**
|
|
28
35
|
* Text alignment - LAYOUT CONTROL
|
|
29
|
-
* Semantic alignment for data presentation (
|
|
36
|
+
* Semantic alignment for data presentation (start for text, end for numbers).
|
|
37
|
+
* Uses logical alignment for RTL support.
|
|
30
38
|
*/
|
|
31
|
-
align?: '
|
|
39
|
+
align?: 'start' | 'center' | 'end';
|
|
32
40
|
}
|
|
33
41
|
/**
|
|
34
42
|
* Data table component props
|
|
@@ -56,6 +64,8 @@ export interface DataTableProps<T = any> {
|
|
|
56
64
|
pageSize?: number;
|
|
57
65
|
/** Loading state */
|
|
58
66
|
loading?: boolean;
|
|
67
|
+
/** Excel-like grid lines (borders on all cells) */
|
|
68
|
+
gridLines?: boolean;
|
|
59
69
|
/** Callback when sorting changes */
|
|
60
70
|
onSort?: (column: string, direction: 'asc' | 'desc') => void;
|
|
61
71
|
/** Callback when selection changes */
|
|
@@ -98,7 +108,7 @@ declare function TableCaption({ className, ...props }: HTMLAttributes<HTMLTableC
|
|
|
98
108
|
* @param {DataTableProps} props - The props for the data table
|
|
99
109
|
* @returns {ReactNode} The rendered data table
|
|
100
110
|
*/
|
|
101
|
-
declare const DataTable: <T = any>({ data, columns, sortable, selectable, searchable, filterable, pagination, pageSize, loading, onSort, onSelect, onSearch, onFilter, className, }: DataTableProps<T>) => ReactNode;
|
|
111
|
+
declare const DataTable: <T = any>({ data, columns, sortable, selectable, searchable, filterable, pagination, pageSize, loading, gridLines, onSort, onSelect, onSearch, onFilter, className, }: DataTableProps<T>) => ReactNode;
|
|
102
112
|
export default Table;
|
|
103
113
|
export { TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, DataTable, };
|
|
104
114
|
//# 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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Table/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import Checkbox from '../Checkbox';
|
|
|
16
16
|
import Input from '../Input';
|
|
17
17
|
import Skeleton from '../Skeleton';
|
|
18
18
|
import Stack from '../Stack';
|
|
19
|
+
import Text from '../Text';
|
|
19
20
|
import './Table.css';
|
|
20
21
|
/**
|
|
21
22
|
* Basic Table wrapper component.
|
|
@@ -65,7 +66,7 @@ function TableCaption({ className, ...props }) {
|
|
|
65
66
|
* @param {DataTableProps} props - The props for the data table
|
|
66
67
|
* @returns {ReactNode} The rendered data table
|
|
67
68
|
*/
|
|
68
|
-
const DataTable = ({ data, columns, sortable = true, selectable = false, searchable = true, filterable = false, pagination = true, pageSize = 10, loading = false, onSort, onSelect, onSearch, onFilter, className, }) => {
|
|
69
|
+
const DataTable = ({ data, columns, sortable = true, selectable = false, searchable = true, filterable = false, pagination = true, pageSize = 10, loading = false, gridLines = false, onSort, onSelect, onSearch, onFilter, className, }) => {
|
|
69
70
|
const [sortColumn, setSortColumn] = useState('');
|
|
70
71
|
const [sortDirection, setSortDirection] = useState('asc');
|
|
71
72
|
const [searchQuery, setSearchQuery] = useState('');
|
|
@@ -129,8 +130,17 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
129
130
|
if (loading) {
|
|
130
131
|
return (_jsxs(Stack, { gap: "medium", children: [_jsxs(Stack, { direction: "row", align: "center", justify: "between", children: [_jsx(Skeleton, { className: "dndev-h-touch dndev-w-16" }), _jsx(Skeleton, { className: "dndev-h-touch dndev-w-8" })] }), _jsx(Stack, { gap: "tight", children: Array.from({ length: 5 }, (_, i) => (_jsx(Skeleton, { className: "dndev-w-full dndev-h-touch" }, i))) })] }));
|
|
131
132
|
}
|
|
132
|
-
return (_jsxs(Stack, { gap: "medium", children: [(searchable || filterable) && (_jsxs(Stack, { direction: "row", align: "center", justify: "between", 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" })] })), filterable && (_jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: Filter, children: "Filters" }))] })), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [selectable && (_jsx(TableHead, { className: "dndev-w-touch", children: _jsx(Checkbox, { checked: selectedRows.length === paginatedData.length &&
|
|
133
|
-
paginatedData.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: () =>
|
|
133
|
+
return (_jsxs(Stack, { gap: "medium", children: [(searchable || filterable) && (_jsxs(Stack, { direction: "row", align: "center", justify: "between", 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" })] })), filterable && (_jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: Filter, children: "Filters" }))] })), _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 === paginatedData.length &&
|
|
134
|
+
paginatedData.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) => {
|
|
135
|
+
// Only sort if clicking on header, not on interactive elements (buttons, inputs, etc.)
|
|
136
|
+
if (column.sortable) {
|
|
137
|
+
const target = e.target;
|
|
138
|
+
const isInteractive = target.closest('button, input, a, [role="button"]');
|
|
139
|
+
if (!isInteractive) {
|
|
140
|
+
handleSort(column.key);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, children: _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [typeof column.title === 'string' ? (_jsx(Text, { level: "body", style: { paddingInline: 'var(--gap-sm)' }, children: column.title })) : (column.title), column.sortable &&
|
|
134
144
|
sortColumn === column.key &&
|
|
135
145
|
(sortDirection === 'asc' ? (_jsx(ChevronUp, { className: "dndev-size-md" })) : (_jsx(ChevronDown, { className: "dndev-size-md" })))] }) }, column.key)))] }) }), _jsx(TableBody, { children: paginatedData.map((row, index) => (_jsxs(TableRow, { children: [selectable && (_jsx(TableCell, { children: _jsx(Checkbox, { checked: selectedRows.includes(row), onCheckedChange: (checked) => handleSelectRow(row, !!checked), "aria-label": `Select row ${index + 1}` }) })), columns.map((column) => (_jsx(TableCell, { "data-align": column.align, children: column.render
|
|
136
146
|
? column.render(column.dataIndex ? row[column.dataIndex] : null, row, index)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAyB,EAGvB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,KAAK,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAyB,EAGvB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,KAAK,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AA4BD;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,OAAO,GAAI,6DAOd,YAAY,4CA0Dd,CAAC;AAEF,eAAe,OAAO,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -27,8 +27,12 @@ function hasVisibleLabel(element) {
|
|
|
27
27
|
if (!(label instanceof HTMLElement))
|
|
28
28
|
return false;
|
|
29
29
|
// Modern browsers: use checkVisibility() - avoids forced reflow
|
|
30
|
-
if ('checkVisibility' in label &&
|
|
31
|
-
|
|
30
|
+
if ('checkVisibility' in label &&
|
|
31
|
+
typeof label.checkVisibility === 'function') {
|
|
32
|
+
return label.checkVisibility({
|
|
33
|
+
checkOpacity: true,
|
|
34
|
+
checkVisibilityCSS: true,
|
|
35
|
+
});
|
|
32
36
|
}
|
|
33
37
|
// Fallback: check if element is in DOM and not display:none
|
|
34
38
|
// offsetParent is null for hidden elements (still forces reflow but only in older browsers)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/VideoPlayer/index.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,qFAAqF;IACrF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/VideoPlayer/index.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,qFAAqF;IACrF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA4JD,QAAA,MAAM,WAAW,GAAI,sGAWlB,gBAAgB,4CAwJlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
package/dist/atomic/index.d.ts
CHANGED
|
@@ -47,7 +47,6 @@ export { default as Collapsible } from './Collapsible';
|
|
|
47
47
|
export * from './Collapsible/CollapsiblePrimitive';
|
|
48
48
|
export type { CollapsibleProps } from './Collapsible';
|
|
49
49
|
export { default as Combobox, COMBOBOX_VARIANT } from './Combobox';
|
|
50
|
-
export * from './Combobox/ComboboxPrimitive';
|
|
51
50
|
export type { ComboboxProps, ComboboxOption, ComboboxVariant, } from './Combobox';
|
|
52
51
|
export { default as Command } from './Command';
|
|
53
52
|
export type { CommandProps, CommandItem, CommandGroup } from './Command';
|
|
@@ -79,9 +78,9 @@ export { default as InfiniteScroll } from './InfiniteScroll';
|
|
|
79
78
|
export type { InfiniteScrollProps } from './InfiniteScroll';
|
|
80
79
|
export { default as Input } from './Input';
|
|
81
80
|
export type { InputProps } from './Input';
|
|
82
|
-
export { default as Label } from './Label';
|
|
81
|
+
export { default as Label, FloatingLabel } from './Label';
|
|
83
82
|
export * from './Label/LabelPrimitive';
|
|
84
|
-
export type { LabelProps } from './Label';
|
|
83
|
+
export type { LabelProps, FloatingLabelProps } from './Label';
|
|
85
84
|
export { default as List } from './List';
|
|
86
85
|
export type { ListProps, ListItem } from './List';
|
|
87
86
|
export { default as NavigationMenu } from './NavigationMenu';
|