@donotdev/components 0.0.12 → 0.0.14
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 +0 -9
- package/dist/advanced/Bento/Bento.d.ts.map +1 -1
- package/dist/advanced/Bento/Bento.js +10 -0
- package/dist/advanced/Code/Code.d.ts +1 -9
- package/dist/advanced/Code/Code.d.ts.map +1 -1
- package/dist/advanced/Code/CodeContent.d.ts.map +1 -1
- package/dist/advanced/Code/CodeContent.js +5 -1
- package/dist/advanced/Code/CodeSkeleton.d.ts.map +1 -1
- package/dist/advanced/Code/CodeSkeleton.js +2 -1
- package/dist/advanced/JsonViewer/JsonViewer.d.ts.map +1 -1
- package/dist/advanced/JsonViewer/JsonViewer.js +2 -1
- package/dist/atomic/Accordion/index.d.ts.map +1 -1
- package/dist/atomic/Accordion/index.js +1 -1
- package/dist/atomic/ActionButton/index.d.ts.map +1 -1
- package/dist/atomic/AlertDialog/AlertDialogPrimitive.d.ts.map +1 -1
- package/dist/atomic/AlertDialog/index.js +2 -2
- package/dist/atomic/Avatar/AvatarPrimitive.d.ts +1 -1
- package/dist/atomic/Avatar/AvatarPrimitive.d.ts.map +1 -1
- package/dist/atomic/Avatar/AvatarPrimitive.js +0 -1
- package/dist/atomic/Blockquote/index.d.ts +1 -9
- package/dist/atomic/Blockquote/index.d.ts.map +1 -1
- package/dist/atomic/Button/index.d.ts +18 -1
- package/dist/atomic/Button/index.d.ts.map +1 -1
- package/dist/atomic/Button/index.js +15 -5
- package/dist/atomic/Calendar/index.d.ts.map +1 -1
- package/dist/atomic/Calendar/index.js +3 -2
- package/dist/atomic/Checkbox/CheckboxPrimitive.d.ts +1 -1
- package/dist/atomic/Checkbox/CheckboxPrimitive.d.ts.map +1 -1
- package/dist/atomic/Checkbox/CheckboxPrimitive.js +0 -1
- package/dist/atomic/Checkbox/index.d.ts +17 -3
- package/dist/atomic/Checkbox/index.d.ts.map +1 -1
- package/dist/atomic/Checkbox/index.js +22 -6
- package/dist/atomic/Collapsible/CollapsiblePrimitive.d.ts +1 -1
- package/dist/atomic/Collapsible/CollapsiblePrimitive.d.ts.map +1 -1
- package/dist/atomic/Collapsible/CollapsiblePrimitive.js +0 -1
- package/dist/atomic/Collapsible/index.d.ts.map +1 -1
- package/dist/atomic/Collapsible/index.js +6 -2
- package/dist/atomic/Combobox/index.d.ts.map +1 -1
- package/dist/atomic/Combobox/index.js +4 -4
- package/dist/atomic/CommandDialog/index.d.ts.map +1 -1
- package/dist/atomic/CommandDialog/index.js +1 -1
- package/dist/atomic/ContextMenu/ContextMenuPrimitive.d.ts +1 -1
- package/dist/atomic/ContextMenu/ContextMenuPrimitive.d.ts.map +1 -1
- package/dist/atomic/ContextMenu/ContextMenuPrimitive.js +0 -1
- package/dist/atomic/ContextMenu/index.d.ts.map +1 -1
- package/dist/atomic/Dialog/DialogPrimitive.d.ts.map +1 -1
- package/dist/atomic/Dialog/index.d.ts.map +1 -1
- package/dist/atomic/Dialog/index.js +1 -1
- package/dist/atomic/DropdownMenu/index.d.ts.map +1 -1
- package/dist/atomic/DropdownMenu/index.js +17 -3
- package/dist/atomic/DualCard/index.d.ts +10 -2
- package/dist/atomic/DualCard/index.d.ts.map +1 -1
- package/dist/atomic/DualCard/index.js +3 -3
- package/dist/atomic/FeatureFallback/index.js +1 -1
- package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts +1 -1
- package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts.map +1 -1
- package/dist/atomic/HoverCard/HoverCardPrimitive.js +0 -1
- package/dist/atomic/HoverCard/index.js +1 -1
- package/dist/atomic/Icons/Partner/providerIcons.d.ts.map +1 -1
- package/dist/atomic/Icons/Partner/providerIcons.js +17 -1
- package/dist/atomic/Input/index.d.ts +6 -1
- package/dist/atomic/Input/index.d.ts.map +1 -1
- package/dist/atomic/Input/index.js +17 -5
- package/dist/atomic/Label/FloatingLabel.d.ts +26 -10
- package/dist/atomic/Label/FloatingLabel.d.ts.map +1 -1
- package/dist/atomic/Label/FloatingLabel.js +14 -14
- package/dist/atomic/Label/index.d.ts +1 -1
- package/dist/atomic/Label/index.d.ts.map +1 -1
- package/dist/atomic/Label/index.js +1 -1
- package/dist/atomic/List/index.d.ts +8 -0
- package/dist/atomic/List/index.d.ts.map +1 -1
- package/dist/atomic/List/index.js +1 -1
- package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.d.ts +1 -1
- package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.d.ts.map +1 -1
- package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.js +0 -1
- package/dist/atomic/NavigationMenu/index.d.ts +1 -1
- package/dist/atomic/NavigationMenu/index.d.ts.map +1 -1
- package/dist/atomic/NavigationMenu/index.js +10 -1
- package/dist/atomic/Pagination/index.d.ts +7 -29
- package/dist/atomic/Pagination/index.d.ts.map +1 -1
- package/dist/atomic/Pagination/index.js +101 -71
- package/dist/atomic/PasswordInput/index.d.ts +1 -1
- package/dist/atomic/PasswordInput/index.d.ts.map +1 -1
- package/dist/atomic/PasswordInput/index.js +5 -1
- package/dist/atomic/Popover/index.d.ts +0 -8
- package/dist/atomic/Popover/index.d.ts.map +1 -1
- package/dist/atomic/Popover/index.js +1 -1
- package/dist/atomic/PortalButton/index.d.ts +8 -0
- package/dist/atomic/PortalButton/index.d.ts.map +1 -1
- package/dist/atomic/PortalButton/index.js +1 -1
- package/dist/atomic/Progress/ProgressPrimitive.d.ts +1 -1
- package/dist/atomic/Progress/ProgressPrimitive.d.ts.map +1 -1
- package/dist/atomic/Progress/ProgressPrimitive.js +0 -1
- package/dist/atomic/Progress/index.d.ts +8 -0
- package/dist/atomic/Progress/index.d.ts.map +1 -1
- package/dist/atomic/Progress/index.js +1 -1
- package/dist/atomic/RadioGroup/index.d.ts +0 -9
- package/dist/atomic/RadioGroup/index.d.ts.map +1 -1
- package/dist/atomic/RadioGroup/index.js +2 -2
- package/dist/atomic/RangeInput/index.d.ts +45 -0
- package/dist/atomic/RangeInput/index.d.ts.map +1 -0
- package/dist/atomic/RangeInput/index.js +63 -0
- package/dist/atomic/ScrollArea/ScrollAreaPrimitive.d.ts +1 -1
- package/dist/atomic/ScrollArea/ScrollAreaPrimitive.d.ts.map +1 -1
- package/dist/atomic/ScrollArea/ScrollAreaPrimitive.js +0 -1
- package/dist/atomic/Section/index.d.ts +0 -32
- package/dist/atomic/Section/index.d.ts.map +1 -1
- package/dist/atomic/Section/index.js +4 -4
- package/dist/atomic/Select/SelectPrimitive.d.ts +1 -1
- package/dist/atomic/Select/SelectPrimitive.d.ts.map +1 -1
- package/dist/atomic/Select/SelectPrimitive.js +0 -1
- package/dist/atomic/Select/index.d.ts.map +1 -1
- package/dist/atomic/Select/index.js +2 -1
- package/dist/atomic/Separator/SeparatorPrimitive.d.ts +1 -1
- package/dist/atomic/Separator/SeparatorPrimitive.d.ts.map +1 -1
- package/dist/atomic/Separator/SeparatorPrimitive.js +0 -1
- package/dist/atomic/Separator/index.d.ts +1 -1
- package/dist/atomic/Separator/index.d.ts.map +1 -1
- package/dist/atomic/Separator/index.js +0 -1
- package/dist/atomic/Sheet/index.d.ts +3 -1
- package/dist/atomic/Sheet/index.d.ts.map +1 -1
- package/dist/atomic/Sheet/index.js +3 -3
- package/dist/atomic/Slider/SliderPrimitive.d.ts +1 -1
- package/dist/atomic/Slider/SliderPrimitive.d.ts.map +1 -1
- package/dist/atomic/Slider/SliderPrimitive.js +0 -1
- package/dist/atomic/Slider/index.d.ts +3 -2
- package/dist/atomic/Slider/index.d.ts.map +1 -1
- package/dist/atomic/Slider/index.js +9 -7
- package/dist/atomic/Slot/index.d.ts.map +1 -1
- package/dist/atomic/Stepper/index.js +1 -1
- package/dist/atomic/Switch/SwitchPrimitive.d.ts +1 -1
- package/dist/atomic/Switch/SwitchPrimitive.d.ts.map +1 -1
- package/dist/atomic/Switch/SwitchPrimitive.js +0 -1
- package/dist/atomic/Switch/index.d.ts +3 -2
- package/dist/atomic/Switch/index.d.ts.map +1 -1
- package/dist/atomic/Switch/index.js +2 -3
- package/dist/atomic/Table/index.d.ts +20 -5
- package/dist/atomic/Table/index.d.ts.map +1 -1
- package/dist/atomic/Table/index.js +92 -22
- package/dist/atomic/Tabs/TabsPrimitive.d.ts +1 -1
- package/dist/atomic/Tabs/TabsPrimitive.d.ts.map +1 -1
- package/dist/atomic/Tabs/TabsPrimitive.js +0 -1
- package/dist/atomic/Tabs/index.js +1 -1
- package/dist/atomic/Tag/index.d.ts +8 -0
- package/dist/atomic/Tag/index.d.ts.map +1 -1
- package/dist/atomic/Tag/index.js +1 -1
- package/dist/atomic/Text/index.js +1 -1
- package/dist/atomic/Textarea/index.d.ts +4 -0
- package/dist/atomic/Textarea/index.d.ts.map +1 -1
- package/dist/atomic/Textarea/index.js +3 -3
- package/dist/atomic/Toaster/Toast.types.d.ts +17 -0
- package/dist/atomic/Toaster/Toast.types.d.ts.map +1 -0
- package/dist/atomic/Toaster/Toast.types.js +2 -0
- package/dist/atomic/Toaster/ToastPrimitive.d.ts +1 -1
- package/dist/atomic/Toaster/ToastPrimitive.d.ts.map +1 -1
- package/dist/atomic/ToggleGroup/ToggleGroupPrimitive.d.ts +1 -1
- package/dist/atomic/ToggleGroup/ToggleGroupPrimitive.d.ts.map +1 -1
- package/dist/atomic/Tooltip/TooltipPrimitive.d.ts +1 -1
- package/dist/atomic/Tooltip/TooltipPrimitive.d.ts.map +1 -1
- package/dist/atomic/Tooltip/TooltipPrimitive.js +0 -1
- package/dist/atomic/Tooltip/index.d.ts +6 -12
- package/dist/atomic/Tooltip/index.d.ts.map +1 -1
- package/dist/atomic/Tooltip/index.js +13 -23
- package/dist/atomic/VideoPlayer/index.d.ts +11 -1
- package/dist/atomic/VideoPlayer/index.d.ts.map +1 -1
- package/dist/atomic/VideoPlayer/index.js +6 -8
- package/dist/atomic/VisuallyHidden/VisuallyHiddenPrimitive.d.ts.map +1 -1
- package/dist/atomic/index.d.ts +2 -0
- package/dist/atomic/index.d.ts.map +1 -1
- package/dist/atomic/index.js +1 -0
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useToast.d.ts +2 -33
- package/dist/hooks/useToast.d.ts.map +1 -1
- package/dist/hooks/useToast.js +1 -0
- package/dist/index.js +4 -4
- package/dist/styles/index.css +489 -95
- package/dist/utils/variants.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -8,13 +8,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
* @since 0.0.1
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
|
-
import { ChevronUp, ChevronDown, Search
|
|
11
|
+
import { ChevronUp, ChevronDown, Search } 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';
|
|
15
15
|
import Checkbox from '../Checkbox';
|
|
16
16
|
import Input from '../Input';
|
|
17
|
-
import
|
|
17
|
+
import Pagination from '../Pagination';
|
|
18
|
+
import Select from '../Select';
|
|
18
19
|
import Stack from '../Stack';
|
|
19
20
|
import Text from '../Text';
|
|
20
21
|
import './Table.css';
|
|
@@ -66,12 +67,38 @@ function TableCaption({ className, ...props }) {
|
|
|
66
67
|
* @param {DataTableProps} props - The props for the data table
|
|
67
68
|
* @returns {ReactNode} The rendered data table
|
|
68
69
|
*/
|
|
69
|
-
const DataTable = ({ data, columns, sortable = true, selectable = false, searchable = true,
|
|
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, }) => {
|
|
70
71
|
const [sortColumn, setSortColumn] = useState('');
|
|
71
72
|
const [sortDirection, setSortDirection] = useState('asc');
|
|
72
73
|
const [searchQuery, setSearchQuery] = useState('');
|
|
73
74
|
const [selectedRows, setSelectedRows] = useState([]);
|
|
74
|
-
|
|
75
|
+
// Page size state (for client-side pagination) - default 12
|
|
76
|
+
const [internalPageSize, setInternalPageSize] = useState(12);
|
|
77
|
+
const effectivePageSize = pageSizeProp ?? internalPageSize;
|
|
78
|
+
// Controlled vs uncontrolled pagination
|
|
79
|
+
const isControlledPagination = currentPageProp !== undefined && onPageChange !== undefined;
|
|
80
|
+
const [internalPage, setInternalPage] = useState(1);
|
|
81
|
+
const currentPage = isControlledPagination ? currentPageProp : internalPage;
|
|
82
|
+
const handlePageChange = (page) => {
|
|
83
|
+
if (isControlledPagination) {
|
|
84
|
+
onPageChange?.(page);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
setInternalPage(page);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
// Handle page size change
|
|
91
|
+
const handlePageSizeChange = (newPageSize) => {
|
|
92
|
+
if (onPageSizeChange) {
|
|
93
|
+
// Controlled mode (server-side)
|
|
94
|
+
onPageSizeChange(newPageSize);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Uncontrolled mode (client-side) - update internal state
|
|
98
|
+
setInternalPageSize(newPageSize);
|
|
99
|
+
setInternalPage(1); // Reset to page 1
|
|
100
|
+
}
|
|
101
|
+
};
|
|
75
102
|
// Filter and sort data
|
|
76
103
|
const processedData = useMemo(() => {
|
|
77
104
|
let filtered = data;
|
|
@@ -98,11 +125,19 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
98
125
|
}
|
|
99
126
|
return filtered;
|
|
100
127
|
}, [data, searchQuery, sortColumn, sortDirection, columns]);
|
|
101
|
-
// Pagination
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
128
|
+
// Pagination: use server-side total if provided, otherwise client-side
|
|
129
|
+
const total = totalProp ?? processedData.length;
|
|
130
|
+
// Handle "All" case (pageSize = 0 means show all)
|
|
131
|
+
const isShowingAll = effectivePageSize === 0;
|
|
132
|
+
const pageSize = isShowingAll ? total : effectivePageSize;
|
|
133
|
+
const totalPages = isShowingAll ? 1 : Math.ceil(total / pageSize);
|
|
134
|
+
// For server-side pagination, data is already paginated - use as-is
|
|
135
|
+
// For client-side pagination, slice the data
|
|
136
|
+
const displayData = isControlledPagination && totalProp !== undefined
|
|
137
|
+
? processedData // Server-side: data already paginated
|
|
138
|
+
: pagination && !isShowingAll
|
|
139
|
+
? processedData.slice((currentPage - 1) * pageSize, currentPage * pageSize)
|
|
140
|
+
: processedData;
|
|
106
141
|
const handleSort = (column) => {
|
|
107
142
|
if (!sortable)
|
|
108
143
|
return;
|
|
@@ -112,7 +147,7 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
112
147
|
onSort?.(column, newDirection);
|
|
113
148
|
};
|
|
114
149
|
const handleSelectAll = (checked) => {
|
|
115
|
-
const newSelection = checked ?
|
|
150
|
+
const newSelection = checked ? displayData : [];
|
|
116
151
|
setSelectedRows(newSelection);
|
|
117
152
|
onSelect?.(newSelection);
|
|
118
153
|
};
|
|
@@ -127,11 +162,12 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
127
162
|
setSearchQuery(query);
|
|
128
163
|
onSearch?.(query);
|
|
129
164
|
};
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
165
|
+
// Industry standard pattern: When loading, pass empty rows to render actual structure
|
|
166
|
+
// Component will detect empty data and render skeleton bars in cells
|
|
167
|
+
const skeletonRows = Array.from({ length: 3 }, () => ({}));
|
|
168
|
+
const finalDisplayData = loading ? skeletonRows : displayData;
|
|
169
|
+
return (_jsxs(Stack, { gap: "medium", 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" })] })), _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
|
+
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) => {
|
|
135
171
|
// Only sort if clicking on header, not on interactive elements (buttons, inputs, etc.)
|
|
136
172
|
if (column.sortable) {
|
|
137
173
|
const target = e.target;
|
|
@@ -140,13 +176,47 @@ const DataTable = ({ data, columns, sortable = true, selectable = false, searcha
|
|
|
140
176
|
handleSort(column.key);
|
|
141
177
|
}
|
|
142
178
|
}
|
|
143
|
-
}, children: _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [typeof column.title === 'string' ? (_jsx(Text, { level: "body",
|
|
144
|
-
sortColumn === column.key
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
179
|
+
}, children: _jsxs(Stack, { direction: "row", align: "center", justify: column.align || 'start', gap: "tight", children: [typeof column.title === 'string' ? (_jsx(Text, { level: "body", children: column.title })) : (column.title), column.sortable &&
|
|
180
|
+
(sortColumn === column.key ? (sortDirection === 'asc' ? (_jsx(ChevronUp, { className: "dndev-size-md" })) : (_jsx(ChevronDown, { className: "dndev-size-md" }))) : (_jsx(ChevronUp, { className: "dndev-size-md", style: { opacity: 0.3 } })))] }) }, column.key)))] }) }), _jsx(TableBody, { children: finalDisplayData.map((row, index) => {
|
|
181
|
+
const isSkeletonRow = loading &&
|
|
182
|
+
Object.keys(row).length === 0;
|
|
183
|
+
return (_jsxs(TableRow, { onClick: (e) => {
|
|
184
|
+
if (onRowClick && !isSkeletonRow) {
|
|
185
|
+
const target = e.target;
|
|
186
|
+
// Prevent row click if clicking interactive elements
|
|
187
|
+
const isInteractive = target.closest('button, a, input, [role="button"], label');
|
|
188
|
+
if (!isInteractive) {
|
|
189
|
+
onRowClick(row);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, className: cn(isSkeletonRow && 'dndev-skeleton-row', onRowClick &&
|
|
193
|
+
!isSkeletonRow &&
|
|
194
|
+
'dndev-cursor-pointer dndev-hover-bg-muted'), children: [selectable && (_jsx(TableCell, { children: isSkeletonRow ? (_jsx("div", { className: "dndev-skeleton dndev-skeleton-pulse", style: {
|
|
195
|
+
width: 'var(--icon-md)',
|
|
196
|
+
height: 'var(--icon-md)',
|
|
197
|
+
borderRadius: 'var(--radius)',
|
|
198
|
+
}, "aria-hidden": "true" })) : (_jsx(Checkbox, { checked: selectedRows.includes(row), onCheckedChange: (checked) => handleSelectRow(row, !!checked), "aria-label": `Select row ${index + 1}` })) })), columns.map((column) => {
|
|
199
|
+
const cellValue = column.dataIndex
|
|
200
|
+
? row[column.dataIndex]
|
|
201
|
+
: null;
|
|
202
|
+
const isEmpty = cellValue === null ||
|
|
203
|
+
cellValue === undefined ||
|
|
204
|
+
cellValue === '';
|
|
205
|
+
// Always call render function if it exists (for action columns, etc.)
|
|
206
|
+
// Let the render function decide what to show for empty/skeleton states
|
|
207
|
+
if (column.render) {
|
|
208
|
+
return (_jsx(TableCell, { "data-align": column.align, children: column.render(cellValue, row, index) }, column.key));
|
|
209
|
+
}
|
|
210
|
+
// For data columns: show skeleton only when loading AND empty
|
|
211
|
+
// When not loading but empty, show empty string (fallback)
|
|
212
|
+
return (_jsx(TableCell, { "data-align": column.align, children: isSkeletonRow ? (_jsx("div", { className: "dndev-skeleton dndev-skeleton-pulse", style: {
|
|
213
|
+
height: 'var(--gap-md)',
|
|
214
|
+
width: index % 2 === 0 ? '80%' : '60%',
|
|
215
|
+
borderRadius: 'var(--radius)',
|
|
216
|
+
}, "aria-hidden": "true" })) : isEmpty ? ('' // Empty state - show nothing, not skeleton
|
|
217
|
+
) : (String(cellValue || '')) }, column.key));
|
|
218
|
+
})] }, index));
|
|
219
|
+
}) })] }), pagination && totalPages > 1 && (_jsx(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: handlePageChange, pageSize: pageSize, total: total, onPageSizeChange: handlePageSizeChange, showingLabel: showingLabel, previousLabel: paginationPreviousLabel, nextLabel: paginationNextLabel, itemsPerPagePlaceholder: paginationItemsPerPagePlaceholder }))] }));
|
|
150
220
|
};
|
|
151
221
|
export default Table;
|
|
152
222
|
export { TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, DataTable, };
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @author AMBROISE PARK Consulting
|
|
8
8
|
*/
|
|
9
9
|
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
10
|
-
import {
|
|
10
|
+
import type { ComponentProps } from 'react';
|
|
11
11
|
declare const TabsPrimitiveRoot: import("react").ForwardRefExoticComponent<TabsPrimitive.TabsProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
12
12
|
declare const TabsListPrimitive: ({ className, ...props }: ComponentProps<typeof TabsPrimitive.List>) => import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
declare const TabsTriggerPrimitive: ({ className, ...props }: ComponentProps<typeof TabsPrimitive.Trigger>) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tabs/TabsPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"TabsPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tabs/TabsPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAItD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,QAAA,MAAM,iBAAiB,oHAAqB,CAAC;AAE7C,QAAA,MAAM,iBAAiB,GAAI,yBAGxB,cAAc,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,4CAE3C,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,yBAG3B,cAAc,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,4CAM9C,CAAC;AAEF,KAAK,yBAAyB,GAAG,cAAc,CAC7C,OAAO,aAAa,CAAC,OAAO,CAC7B,GAAG;IACF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,qCAI3B,yBAAyB,4CAM3B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -9,7 +9,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
12
|
-
import {} from 'react';
|
|
13
12
|
import { cn } from '../../utils/helpers';
|
|
14
13
|
const TabsPrimitiveRoot = TabsPrimitive.Root;
|
|
15
14
|
const TabsListPrimitive = ({ className, ...props }) => (_jsx(TabsPrimitive.List, { className: cn(className), ...props }));
|
|
@@ -10,8 +10,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
10
10
|
*/
|
|
11
11
|
import { cva } from 'class-variance-authority';
|
|
12
12
|
import TabsPrimitive, { TabsListPrimitive, TabsTriggerPrimitive, TabsContentPrimitive, } from './TabsPrimitive';
|
|
13
|
-
import { cn, getVariantDataAttrs } from '../../utils/helpers';
|
|
14
13
|
import { THEME_VARIANT } from '../../utils/constants';
|
|
14
|
+
import { cn, getVariantDataAttrs } from '../../utils/helpers';
|
|
15
15
|
const tabsVariants = cva('', {
|
|
16
16
|
variants: {
|
|
17
17
|
variant: {
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tag component
|
|
3
|
+
* @description Interactive tag component for categorization and filters
|
|
4
|
+
*
|
|
5
|
+
* @version 0.0.1
|
|
6
|
+
* @since 0.0.1
|
|
7
|
+
* @author AMBROISE PARK Consulting
|
|
8
|
+
*/
|
|
1
9
|
import { type VariantProps } from 'class-variance-authority';
|
|
2
10
|
import './Tag.css';
|
|
3
11
|
import type { HTMLAttributes, ReactNode } from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tag/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tag/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,QAAA,MAAM,WAAW;;;8EAiBf,CAAC;AAEH,MAAM,WAAW,QACf,SACE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,EAChD,YAAY,CAAC,OAAO,WAAW,CAAC;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,GAAG,GAAI,4FAUV,QAAQ,4CAkCV,CAAC;AAEF,eAAe,GAAG,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/atomic/Tag/index.js
CHANGED
|
@@ -8,8 +8,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
* @since 0.0.1
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
|
-
import { X } from 'lucide-react';
|
|
12
11
|
import { cva } from 'class-variance-authority';
|
|
12
|
+
import { X } from 'lucide-react';
|
|
13
13
|
import { cn } from '../../utils/helpers';
|
|
14
14
|
import Icon from '../Icons/Icon';
|
|
15
15
|
import './Tag.css';
|
|
@@ -9,8 +9,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import { createElement, forwardRef, } from 'react';
|
|
12
|
-
import { cn, getVariantDataAttrs } from '../../utils/helpers';
|
|
13
12
|
import { THEME_VARIANT } from '../../utils/constants';
|
|
13
|
+
import { cn, getVariantDataAttrs } from '../../utils/helpers';
|
|
14
14
|
/**
|
|
15
15
|
* Text variant constants - THEME_VARIANT + CODE (Text-specific)
|
|
16
16
|
* Color variants for text styling via data-variant attribute
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { ComponentPropsWithRef } from 'react';
|
|
2
2
|
export interface TextareaProps extends ComponentPropsWithRef<'textarea'> {
|
|
3
|
+
/**
|
|
4
|
+
* Bare mode - no border/shadow (for use inside FloatingLabel or custom wrappers)
|
|
5
|
+
*/
|
|
6
|
+
bare?: boolean;
|
|
3
7
|
}
|
|
4
8
|
/**
|
|
5
9
|
* Textarea component with ref forwarding.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Textarea/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Textarea/index.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,MAAM,WAAW,aAAc,SAAQ,qBAAqB,CAAC,UAAU,CAAC;IACtE;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,4HAWb,CAAC;AAIF,eAAe,QAAQ,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
4
4
|
* @fileoverview Textarea component
|
|
5
5
|
* @description Accessible textarea component with mobile-friendly touch targets
|
|
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
|
*/
|
|
@@ -13,8 +13,8 @@ import { cn } from '../../utils/helpers';
|
|
|
13
13
|
/**
|
|
14
14
|
* Textarea component with ref forwarding.
|
|
15
15
|
*/
|
|
16
|
-
const Textarea = forwardRef(({ className, ...props }, ref) => {
|
|
17
|
-
return (_jsx("textarea", { ref: ref, className: cn('dndev-input', className), ...props }));
|
|
16
|
+
const Textarea = forwardRef(({ className, bare, ...props }, ref) => {
|
|
17
|
+
return (_jsx("textarea", { ref: ref, className: cn('dndev-input', className), "data-bare": bare || undefined, ...props }));
|
|
18
18
|
});
|
|
19
19
|
Textarea.displayName = 'Textarea';
|
|
20
20
|
export default Textarea;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Toast Types
|
|
3
|
+
* @description Type definitions for toast notifications
|
|
4
|
+
*
|
|
5
|
+
* @version 0.0.1
|
|
6
|
+
* @since 0.0.1
|
|
7
|
+
* @author AMBROISE PARK Consulting
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Toast type variants
|
|
11
|
+
*
|
|
12
|
+
* @version 0.0.1
|
|
13
|
+
* @since 0.0.1
|
|
14
|
+
* @author AMBROISE PARK Consulting
|
|
15
|
+
*/
|
|
16
|
+
export type ToastType = 'default' | 'success' | 'error' | 'warning' | 'info';
|
|
17
|
+
//# sourceMappingURL=Toast.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.types.d.ts","sourceRoot":"","sources":["../../../src/atomic/Toaster/Toast.types.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import * as ToastPrimitives from '@radix-ui/react-toast';
|
|
10
10
|
import { type VariantProps } from 'class-variance-authority';
|
|
11
|
-
import type { ToastType } from '
|
|
11
|
+
import type { ToastType } from './Toast.types';
|
|
12
12
|
import type { ComponentProps, ReactElement } from 'react';
|
|
13
13
|
declare const ToastProvider: import("react").FC<ToastPrimitives.ToastProviderProps>;
|
|
14
14
|
declare function ToastViewport({ className, ...props }: ComponentProps<typeof ToastPrimitives.Viewport>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Toaster/ToastPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ToastPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Toaster/ToastPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1D,QAAA,MAAM,aAAa,wDAA2B,CAAC;AAE/C,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,2CAOjD;AAED,QAAA,MAAM,aAAa;;8EAajB,CAAC;AAEH,UAAU,UACR,SACE,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,EAC3C,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,KAAK,kBAAkB,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AAE3D,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,2CA6BrE;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,MAAM,CAAC,2CAQ/C;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAyB9C;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAO9C;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,WAAW,CAAC,2CAOpD;AAED,eAAe,KAAK,CAAC;AACrB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,aAAa,EACb,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,GACZ,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @author AMBROISE PARK Consulting
|
|
9
9
|
*/
|
|
10
10
|
import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
|
|
11
|
-
import {
|
|
11
|
+
import type { ComponentProps } from 'react';
|
|
12
12
|
export type ToggleGroupPrimitiveProps = ComponentProps<typeof ToggleGroupPrimitive.Root> & {
|
|
13
13
|
'data-variant'?: string;
|
|
14
14
|
'data-size'?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleGroupPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/ToggleGroup/ToggleGroupPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"ToggleGroupPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/ToggleGroup/ToggleGroupPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAC;AAKrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAY5C,MAAM,MAAM,yBAAyB,GAAG,cAAc,CACpD,OAAO,oBAAoB,CAAC,IAAI,CACjC,GAAG;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,iBAAS,6BAA6B,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,cAAc,EAAE,WAAW,EAC3B,WAAW,EAAE,QAAQ,EACrB,GAAG,KAAK,EACT,EAAE,yBAAyB,2CAkB3B;AAED,MAAM,WAAW,6BAA8B,SAAQ,cAAc,CACnE,OAAO,oBAAoB,CAAC,IAAI,CACjC;IACC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,iBAAS,wBAAwB,CAAC,EAChC,SAAS,EACT,QAAQ,EACR,cAAc,EAAE,WAAW,EAC3B,WAAW,EAAE,QAAQ,EACrB,GAAG,KAAK,EACT,EAAE,6BAA6B,2CAe/B;AAED,eAAe,6BAA6B,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @author AMBROISE PARK Consulting
|
|
8
8
|
*/
|
|
9
9
|
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
10
|
-
import {
|
|
10
|
+
import type { ComponentProps } from 'react';
|
|
11
11
|
declare const TooltipProvider: import("react").FC<TooltipPrimitive.TooltipProviderProps>;
|
|
12
12
|
declare const TooltipPrimitiveComponent: import("react").FC<TooltipPrimitive.TooltipProps>;
|
|
13
13
|
declare const TooltipTrigger: import("react").ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/TooltipPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"TooltipPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/TooltipPrimitive.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,QAAA,MAAM,eAAe,2DAA4B,CAAC;AAClD,QAAA,MAAM,yBAAyB,mDAAwB,CAAC;AACxD,QAAA,MAAM,cAAc,oIAA2B,CAAC;AAEhD,UAAU,mBAAoB,SAAQ,cAAc,CAClD,OAAO,gBAAgB,CAAC,OAAO,CAChC;IACC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,UAAc,EACd,GAAG,KAAK,EACT,EAAE,mBAAmB,2CAarB;AAED,eAAe,yBAAyB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -9,7 +9,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
12
|
-
import {} from 'react';
|
|
13
12
|
import { cn } from '../../utils/helpers';
|
|
14
13
|
const TooltipProvider = TooltipPrimitive.Provider;
|
|
15
14
|
const TooltipPrimitiveComponent = TooltipPrimitive.Root;
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Tooltip component
|
|
3
|
-
* @description Accessible tooltip built on Radix UI primitives.
|
|
4
|
-
*
|
|
5
|
-
* Positioning: prop > CSS --tooltip-side > 'bottom'
|
|
6
|
-
* Smart hiding: Tooltip auto-hides when trigger has visible label
|
|
7
|
-
*
|
|
8
|
-
* @version 0.0.6
|
|
9
|
-
* @since 0.0.1
|
|
10
|
-
* @author AMBROISE PARK Consulting
|
|
11
|
-
*/
|
|
12
1
|
import { TooltipProvider } from './TooltipPrimitive';
|
|
13
2
|
import { type FloatingVariant } from '../../utils/constants';
|
|
14
3
|
import type { ReactNode } from 'react';
|
|
@@ -28,6 +17,11 @@ export interface TooltipProps {
|
|
|
28
17
|
* Auto-hides when trigger has visible label (e.g., button not in compact mode).
|
|
29
18
|
* Only shows tooltip when label is hidden, avoiding redundant information.
|
|
30
19
|
*
|
|
20
|
+
* Positioning priority:
|
|
21
|
+
* 1. Explicit `side` prop
|
|
22
|
+
* 2. CSS `--tooltip-side` property (set by container like Sidebar)
|
|
23
|
+
* 3. Default 'bottom'
|
|
24
|
+
*
|
|
31
25
|
* @example
|
|
32
26
|
* // Explicit side
|
|
33
27
|
* <Tooltip content="Help" side="right">...</Tooltip>
|
|
@@ -36,7 +30,7 @@ export interface TooltipProps {
|
|
|
36
30
|
* // Container-aware (sidebar sets --tooltip-side: right)
|
|
37
31
|
* <Tooltip content="Help">...</Tooltip>
|
|
38
32
|
*/
|
|
39
|
-
declare
|
|
33
|
+
declare function Tooltip({ content, children, side, align, delayDuration, variant, }: TooltipProps): import("react/jsx-runtime").JSX.Element;
|
|
40
34
|
export default Tooltip;
|
|
41
35
|
export { TooltipProvider };
|
|
42
36
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Tooltip/index.tsx"],"names":[],"mappings":"AAiBA,OAAyB,EAGvB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG/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;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,OAAO,CAAC,EACf,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,KAAgB,EAChB,aAAmB,EACnB,OAAO,GACR,EAAE,YAAY,2CAqDd;AAED,eAAe,OAAO,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
3
|
// packages/components/src/atomic/Tooltip/index.tsx
|
|
3
4
|
/**
|
|
@@ -7,36 +8,23 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
7
8
|
* Positioning: prop > CSS --tooltip-side > 'bottom'
|
|
8
9
|
* Smart hiding: Tooltip auto-hides when trigger has visible label
|
|
9
10
|
*
|
|
10
|
-
* @version 0.0.
|
|
11
|
+
* @version 0.0.7
|
|
11
12
|
* @since 0.0.1
|
|
12
13
|
* @author AMBROISE PARK Consulting
|
|
13
14
|
*/
|
|
15
|
+
import { useCallback, useRef, useState } from 'react';
|
|
14
16
|
import TooltipPrimitive, { TooltipTrigger, TooltipContent, TooltipProvider, } from './TooltipPrimitive';
|
|
15
17
|
import { FLOATING_VARIANT } from '../../utils/constants';
|
|
16
18
|
import { getVariantDataAttrs } from '../../utils/helpers';
|
|
17
|
-
import { useCallback, useRef, useState } from 'react';
|
|
18
19
|
/**
|
|
19
20
|
* Check if trigger element has a visible label.
|
|
20
|
-
*
|
|
21
|
-
* falls back to checking if label has content and isn't hidden.
|
|
21
|
+
* Returns true if label exists and has width (not hidden).
|
|
22
22
|
*/
|
|
23
23
|
function hasVisibleLabel(element) {
|
|
24
24
|
if (!element)
|
|
25
25
|
return false;
|
|
26
26
|
const label = element.querySelector('.dndev-interactive-label');
|
|
27
|
-
|
|
28
|
-
return false;
|
|
29
|
-
// Modern browsers: use checkVisibility() - avoids forced reflow
|
|
30
|
-
if ('checkVisibility' in label &&
|
|
31
|
-
typeof label.checkVisibility === 'function') {
|
|
32
|
-
return label.checkVisibility({
|
|
33
|
-
checkOpacity: true,
|
|
34
|
-
checkVisibilityCSS: true,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
// Fallback: check if element is in DOM and not display:none
|
|
38
|
-
// offsetParent is null for hidden elements (still forces reflow but only in older browsers)
|
|
39
|
-
return label.offsetParent !== null;
|
|
27
|
+
return label instanceof HTMLElement && label.offsetWidth > 0;
|
|
40
28
|
}
|
|
41
29
|
/**
|
|
42
30
|
* Accessible tooltip component.
|
|
@@ -44,6 +32,11 @@ function hasVisibleLabel(element) {
|
|
|
44
32
|
* Auto-hides when trigger has visible label (e.g., button not in compact mode).
|
|
45
33
|
* Only shows tooltip when label is hidden, avoiding redundant information.
|
|
46
34
|
*
|
|
35
|
+
* Positioning priority:
|
|
36
|
+
* 1. Explicit `side` prop
|
|
37
|
+
* 2. CSS `--tooltip-side` property (set by container like Sidebar)
|
|
38
|
+
* 3. Default 'bottom'
|
|
39
|
+
*
|
|
47
40
|
* @example
|
|
48
41
|
* // Explicit side
|
|
49
42
|
* <Tooltip content="Help" side="right">...</Tooltip>
|
|
@@ -52,7 +45,7 @@ function hasVisibleLabel(element) {
|
|
|
52
45
|
* // Container-aware (sidebar sets --tooltip-side: right)
|
|
53
46
|
* <Tooltip content="Help">...</Tooltip>
|
|
54
47
|
*/
|
|
55
|
-
|
|
48
|
+
function Tooltip({ content, children, side, align = 'center', delayDuration = 300, variant, }) {
|
|
56
49
|
const [mounted, setMounted] = useState(false);
|
|
57
50
|
const [cssSide, setCssSide] = useState(null);
|
|
58
51
|
const [open, setOpen] = useState(false);
|
|
@@ -71,13 +64,11 @@ const Tooltip = ({ content, children, side, align = 'center', delayDuration = 30
|
|
|
71
64
|
}, []);
|
|
72
65
|
// Handle open change - skip if label is visible
|
|
73
66
|
const handleOpenChange = useCallback((nextOpen) => {
|
|
74
|
-
if (!mounted)
|
|
75
|
-
return; // SSR: no-op
|
|
76
67
|
if (nextOpen && hasVisibleLabel(triggerElement.current)) {
|
|
77
68
|
return; // Label visible, don't show tooltip
|
|
78
69
|
}
|
|
79
70
|
setOpen(nextOpen);
|
|
80
|
-
}, [
|
|
71
|
+
}, []);
|
|
81
72
|
// Priority: prop > CSS > 'bottom'
|
|
82
73
|
const finalSide = side ?? cssSide ?? 'bottom';
|
|
83
74
|
const variantAttrs = getVariantDataAttrs({
|
|
@@ -85,8 +76,7 @@ const Tooltip = ({ content, children, side, align = 'center', delayDuration = 30
|
|
|
85
76
|
});
|
|
86
77
|
// Always pass open/onOpenChange to avoid controlled/uncontrolled switch
|
|
87
78
|
// During SSR (!mounted), open=false keeps it controlled but closed
|
|
88
|
-
// Wrap with TooltipProvider for SSR/static generation safety (nesting is fine)
|
|
89
79
|
return (_jsx(TooltipProvider, { children: _jsxs(TooltipPrimitive, { delayDuration: delayDuration, open: mounted ? open : false, onOpenChange: handleOpenChange, children: [_jsx(TooltipTrigger, { asChild: true, ref: triggerRef, children: children }), mounted && (_jsx(TooltipContent, { side: finalSide, align: align, ...variantAttrs, children: content }))] }) }));
|
|
90
|
-
}
|
|
80
|
+
}
|
|
91
81
|
export default Tooltip;
|
|
92
82
|
export { TooltipProvider };
|
|
@@ -97,7 +97,17 @@ export interface VideoPlayerProps {
|
|
|
97
97
|
* @default true
|
|
98
98
|
*/
|
|
99
99
|
allowFullscreen?: boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Aria label for the play button/thumbnail
|
|
102
|
+
* @default 'Click to watch video'
|
|
103
|
+
*/
|
|
104
|
+
playButtonLabel?: string;
|
|
105
|
+
/**
|
|
106
|
+
* Aria label for loading state
|
|
107
|
+
* @default 'Loading video'
|
|
108
|
+
*/
|
|
109
|
+
loadingLabel?: string;
|
|
100
110
|
}
|
|
101
|
-
declare const VideoPlayer: ({ url, trigger, thumbnail, eager, title, modal, aspectRatio, className, autoplay, allowFullscreen, }: VideoPlayerProps) => import("react/jsx-runtime").JSX.Element;
|
|
111
|
+
declare const VideoPlayer: ({ url, trigger, thumbnail, eager, title, modal, aspectRatio, className, autoplay, allowFullscreen, playButtonLabel, loadingLabel, }: VideoPlayerProps) => import("react/jsx-runtime").JSX.Element;
|
|
102
112
|
export default VideoPlayer;
|
|
103
113
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/VideoPlayer/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/VideoPlayer/index.tsx"],"names":[],"mappings":"AAqBA,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;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4JD,QAAA,MAAM,WAAW,GAAI,qIAalB,gBAAgB,4CAuJlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -9,9 +9,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
* @author AMBROISE PARK Consulting
|
|
10
10
|
*/
|
|
11
11
|
import { Play } from 'lucide-react';
|
|
12
|
-
import { useState, useEffect
|
|
13
|
-
import {
|
|
14
|
-
import { useIntersectionObserver } from '@donotdev/components';
|
|
12
|
+
import { useState, useEffect } from 'react';
|
|
13
|
+
import { useIntersectionObserver } from '../../hooks/useIntersectionObserver';
|
|
15
14
|
import { cn } from '../../utils/helpers';
|
|
16
15
|
import Button, { BUTTON_VARIANT } from '../Button';
|
|
17
16
|
import Dialog from '../Dialog';
|
|
@@ -139,8 +138,7 @@ const getThumbnailUrl = (urlOrConfig) => {
|
|
|
139
138
|
* Lazy-loads actual thumbnail on intersection
|
|
140
139
|
*/
|
|
141
140
|
const VideoPlaceholder = ({ aspectRatio, className, }) => (_jsxs("svg", { className: cn('dndev-video-placeholder', className), viewBox: "0 0 16 9", style: { aspectRatio, width: '100%', display: 'block' }, preserveAspectRatio: "xMidYMid meet", "aria-hidden": "true", children: [_jsx("rect", { width: "16", height: "9", fill: "var(--muted)" }), _jsx("circle", { cx: "8", cy: "4.5", r: "1.5", fill: "var(--foreground)", opacity: "0.8" }), _jsx("path", { d: "M7 3.5L7 5.5L9 4.5Z", fill: "var(--background)" })] }));
|
|
142
|
-
const VideoPlayer = ({ url = { platform: 'youtube', id: 'dQw4w9WgXcQ' }, trigger, thumbnail, eager = false, title = 'Video', modal = true, aspectRatio = '16/9', className, autoplay = false, allowFullscreen = true, }) => {
|
|
143
|
-
const { t } = useTranslation(['dndev']);
|
|
141
|
+
const VideoPlayer = ({ url = { platform: 'youtube', id: 'dQw4w9WgXcQ' }, trigger, thumbnail, eager = false, title = 'Video', modal = true, aspectRatio = '16/9', className, autoplay = false, allowFullscreen = true, playButtonLabel = 'Click to watch video', loadingLabel = 'Loading video', }) => {
|
|
144
142
|
const [isOpen, setIsOpen] = useState(false);
|
|
145
143
|
const [isLoaded, setIsLoaded] = useState(false);
|
|
146
144
|
const [iframeReady, setIframeReady] = useState(false);
|
|
@@ -176,17 +174,17 @@ const VideoPlayer = ({ url = { platform: 'youtube', id: 'dQw4w9WgXcQ' }, trigger
|
|
|
176
174
|
e.preventDefault();
|
|
177
175
|
setIsLoaded(true);
|
|
178
176
|
}
|
|
179
|
-
}, className: cn('dndev-video-thumbnail', className), style: { aspectRatio }, "aria-label":
|
|
177
|
+
}, className: cn('dndev-video-thumbnail', className), style: { aspectRatio }, "aria-label": playButtonLabel, children: [thumbnailLoaded && thumbnailUrl ? (_jsx("img", { src: thumbnailUrl, alt: title, loading: "eager", fetchPriority: "high", decoding: "async" })) : (_jsx(VideoPlaceholder, { aspectRatio: aspectRatio })), _jsx("div", { className: "dndev-video-play-overlay", children: _jsx(Play, { className: "dndev-video-play-icon" }) })] }));
|
|
180
178
|
}
|
|
181
179
|
// Clicked - show iframe with thumbnail overlay until iframe loads
|
|
182
180
|
return (_jsxs("div", { className: cn('dndev-video-container', className), style: { aspectRatio, position: 'relative' }, children: [videoFrame, !iframeReady && thumbnailUrl && (_jsxs("div", { className: "dndev-video-thumbnail dndev-video-loading-overlay", style: {
|
|
183
181
|
position: 'absolute',
|
|
184
182
|
inset: 0,
|
|
185
183
|
pointerEvents: 'none',
|
|
186
|
-
}, children: [_jsx("img", { src: thumbnailUrl, alt: title, loading: "eager", decoding: "async" }), _jsx("div", { className: "dndev-video-play-overlay dndev-video-loading", children: _jsx(Spinner, { "aria-label":
|
|
184
|
+
}, children: [_jsx("img", { src: thumbnailUrl, alt: title, loading: "eager", decoding: "async" }), _jsx("div", { className: "dndev-video-play-overlay dndev-video-loading", children: _jsx(Spinner, { "aria-label": loadingLabel }) })] }))] }));
|
|
187
185
|
}
|
|
188
186
|
// Modal mode - lazy-load iframe when modal opens
|
|
189
|
-
const defaultTrigger = (_jsxs("button", { ref: thumbnailRef, type: "button", className: "dndev-video-thumbnail", style: { aspectRatio }, "aria-label":
|
|
187
|
+
const defaultTrigger = (_jsxs("button", { ref: thumbnailRef, type: "button", className: "dndev-video-thumbnail", style: { aspectRatio }, "aria-label": playButtonLabel, children: [thumbnailLoaded && thumbnailUrl ? (_jsx("img", { src: thumbnailUrl, alt: title, loading: "eager", fetchPriority: "high", decoding: "async" })) : (_jsx(VideoPlaceholder, { aspectRatio: aspectRatio })), _jsx("div", { className: "dndev-video-play-overlay", children: _jsx(Play, { className: "dndev-video-play-icon" }) })] }));
|
|
190
188
|
return (_jsx(Dialog, { trigger: trigger || defaultTrigger, title: title, open: isOpen, onOpenChange: setIsOpen, showClose: true, className: "dndev-video-dialog", children: videoFrame }));
|
|
191
189
|
};
|
|
192
190
|
export default VideoPlayer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisuallyHiddenPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/VisuallyHidden/VisuallyHiddenPrimitive.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,KAAK,mBAAmB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"VisuallyHiddenPrimitive.d.ts","sourceRoot":"","sources":["../../../src/atomic/VisuallyHidden/VisuallyHiddenPrimitive.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,KAAK,mBAAmB,MAAM,iCAAiC,CAAC;AAIvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,QAAA,MAAM,uBAAuB,GAAI,yBAG9B,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,4CAEjD,CAAC;AAEF,eAAe,uBAAuB,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
package/dist/atomic/index.d.ts
CHANGED
|
@@ -105,6 +105,8 @@ export type { ProgressProps } from './Progress';
|
|
|
105
105
|
export { default as RadioGroup } from './RadioGroup';
|
|
106
106
|
export * from './RadioGroup/RadioGroupPrimitive';
|
|
107
107
|
export type { RadioOption, RadioGroupProps, RadioGroupVariant, } from './RadioGroup';
|
|
108
|
+
export { default as RangeInput } from './RangeInput';
|
|
109
|
+
export type { RangeInputProps } from './RangeInput';
|
|
108
110
|
export { default as ScrollArea, ScrollBar } from './ScrollArea';
|
|
109
111
|
export * from './ScrollArea/ScrollAreaPrimitive';
|
|
110
112
|
export type { ScrollAreaProps, ScrollBarProps } from './ScrollArea';
|