@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.
Files changed (179) hide show
  1. package/dist/advanced/Bento/Bento.d.ts +0 -9
  2. package/dist/advanced/Bento/Bento.d.ts.map +1 -1
  3. package/dist/advanced/Bento/Bento.js +10 -0
  4. package/dist/advanced/Code/Code.d.ts +1 -9
  5. package/dist/advanced/Code/Code.d.ts.map +1 -1
  6. package/dist/advanced/Code/CodeContent.d.ts.map +1 -1
  7. package/dist/advanced/Code/CodeContent.js +5 -1
  8. package/dist/advanced/Code/CodeSkeleton.d.ts.map +1 -1
  9. package/dist/advanced/Code/CodeSkeleton.js +2 -1
  10. package/dist/advanced/JsonViewer/JsonViewer.d.ts.map +1 -1
  11. package/dist/advanced/JsonViewer/JsonViewer.js +2 -1
  12. package/dist/atomic/Accordion/index.d.ts.map +1 -1
  13. package/dist/atomic/Accordion/index.js +1 -1
  14. package/dist/atomic/ActionButton/index.d.ts.map +1 -1
  15. package/dist/atomic/AlertDialog/AlertDialogPrimitive.d.ts.map +1 -1
  16. package/dist/atomic/AlertDialog/index.js +2 -2
  17. package/dist/atomic/Avatar/AvatarPrimitive.d.ts +1 -1
  18. package/dist/atomic/Avatar/AvatarPrimitive.d.ts.map +1 -1
  19. package/dist/atomic/Avatar/AvatarPrimitive.js +0 -1
  20. package/dist/atomic/Blockquote/index.d.ts +1 -9
  21. package/dist/atomic/Blockquote/index.d.ts.map +1 -1
  22. package/dist/atomic/Button/index.d.ts +18 -1
  23. package/dist/atomic/Button/index.d.ts.map +1 -1
  24. package/dist/atomic/Button/index.js +15 -5
  25. package/dist/atomic/Calendar/index.d.ts.map +1 -1
  26. package/dist/atomic/Calendar/index.js +3 -2
  27. package/dist/atomic/Checkbox/CheckboxPrimitive.d.ts +1 -1
  28. package/dist/atomic/Checkbox/CheckboxPrimitive.d.ts.map +1 -1
  29. package/dist/atomic/Checkbox/CheckboxPrimitive.js +0 -1
  30. package/dist/atomic/Checkbox/index.d.ts +17 -3
  31. package/dist/atomic/Checkbox/index.d.ts.map +1 -1
  32. package/dist/atomic/Checkbox/index.js +22 -6
  33. package/dist/atomic/Collapsible/CollapsiblePrimitive.d.ts +1 -1
  34. package/dist/atomic/Collapsible/CollapsiblePrimitive.d.ts.map +1 -1
  35. package/dist/atomic/Collapsible/CollapsiblePrimitive.js +0 -1
  36. package/dist/atomic/Collapsible/index.d.ts.map +1 -1
  37. package/dist/atomic/Collapsible/index.js +6 -2
  38. package/dist/atomic/Combobox/index.d.ts.map +1 -1
  39. package/dist/atomic/Combobox/index.js +4 -4
  40. package/dist/atomic/CommandDialog/index.d.ts.map +1 -1
  41. package/dist/atomic/CommandDialog/index.js +1 -1
  42. package/dist/atomic/ContextMenu/ContextMenuPrimitive.d.ts +1 -1
  43. package/dist/atomic/ContextMenu/ContextMenuPrimitive.d.ts.map +1 -1
  44. package/dist/atomic/ContextMenu/ContextMenuPrimitive.js +0 -1
  45. package/dist/atomic/ContextMenu/index.d.ts.map +1 -1
  46. package/dist/atomic/Dialog/DialogPrimitive.d.ts.map +1 -1
  47. package/dist/atomic/Dialog/index.d.ts.map +1 -1
  48. package/dist/atomic/Dialog/index.js +1 -1
  49. package/dist/atomic/DropdownMenu/index.d.ts.map +1 -1
  50. package/dist/atomic/DropdownMenu/index.js +17 -3
  51. package/dist/atomic/DualCard/index.d.ts +10 -2
  52. package/dist/atomic/DualCard/index.d.ts.map +1 -1
  53. package/dist/atomic/DualCard/index.js +3 -3
  54. package/dist/atomic/FeatureFallback/index.js +1 -1
  55. package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts +1 -1
  56. package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts.map +1 -1
  57. package/dist/atomic/HoverCard/HoverCardPrimitive.js +0 -1
  58. package/dist/atomic/HoverCard/index.js +1 -1
  59. package/dist/atomic/Icons/Partner/providerIcons.d.ts.map +1 -1
  60. package/dist/atomic/Icons/Partner/providerIcons.js +17 -1
  61. package/dist/atomic/Input/index.d.ts +6 -1
  62. package/dist/atomic/Input/index.d.ts.map +1 -1
  63. package/dist/atomic/Input/index.js +17 -5
  64. package/dist/atomic/Label/FloatingLabel.d.ts +26 -10
  65. package/dist/atomic/Label/FloatingLabel.d.ts.map +1 -1
  66. package/dist/atomic/Label/FloatingLabel.js +14 -14
  67. package/dist/atomic/Label/index.d.ts +1 -1
  68. package/dist/atomic/Label/index.d.ts.map +1 -1
  69. package/dist/atomic/Label/index.js +1 -1
  70. package/dist/atomic/List/index.d.ts +8 -0
  71. package/dist/atomic/List/index.d.ts.map +1 -1
  72. package/dist/atomic/List/index.js +1 -1
  73. package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.d.ts +1 -1
  74. package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.d.ts.map +1 -1
  75. package/dist/atomic/NavigationMenu/NavigationMenuPrimitive.js +0 -1
  76. package/dist/atomic/NavigationMenu/index.d.ts +1 -1
  77. package/dist/atomic/NavigationMenu/index.d.ts.map +1 -1
  78. package/dist/atomic/NavigationMenu/index.js +10 -1
  79. package/dist/atomic/Pagination/index.d.ts +7 -29
  80. package/dist/atomic/Pagination/index.d.ts.map +1 -1
  81. package/dist/atomic/Pagination/index.js +101 -71
  82. package/dist/atomic/PasswordInput/index.d.ts +1 -1
  83. package/dist/atomic/PasswordInput/index.d.ts.map +1 -1
  84. package/dist/atomic/PasswordInput/index.js +5 -1
  85. package/dist/atomic/Popover/index.d.ts +0 -8
  86. package/dist/atomic/Popover/index.d.ts.map +1 -1
  87. package/dist/atomic/Popover/index.js +1 -1
  88. package/dist/atomic/PortalButton/index.d.ts +8 -0
  89. package/dist/atomic/PortalButton/index.d.ts.map +1 -1
  90. package/dist/atomic/PortalButton/index.js +1 -1
  91. package/dist/atomic/Progress/ProgressPrimitive.d.ts +1 -1
  92. package/dist/atomic/Progress/ProgressPrimitive.d.ts.map +1 -1
  93. package/dist/atomic/Progress/ProgressPrimitive.js +0 -1
  94. package/dist/atomic/Progress/index.d.ts +8 -0
  95. package/dist/atomic/Progress/index.d.ts.map +1 -1
  96. package/dist/atomic/Progress/index.js +1 -1
  97. package/dist/atomic/RadioGroup/index.d.ts +0 -9
  98. package/dist/atomic/RadioGroup/index.d.ts.map +1 -1
  99. package/dist/atomic/RadioGroup/index.js +2 -2
  100. package/dist/atomic/RangeInput/index.d.ts +45 -0
  101. package/dist/atomic/RangeInput/index.d.ts.map +1 -0
  102. package/dist/atomic/RangeInput/index.js +63 -0
  103. package/dist/atomic/ScrollArea/ScrollAreaPrimitive.d.ts +1 -1
  104. package/dist/atomic/ScrollArea/ScrollAreaPrimitive.d.ts.map +1 -1
  105. package/dist/atomic/ScrollArea/ScrollAreaPrimitive.js +0 -1
  106. package/dist/atomic/Section/index.d.ts +0 -32
  107. package/dist/atomic/Section/index.d.ts.map +1 -1
  108. package/dist/atomic/Section/index.js +4 -4
  109. package/dist/atomic/Select/SelectPrimitive.d.ts +1 -1
  110. package/dist/atomic/Select/SelectPrimitive.d.ts.map +1 -1
  111. package/dist/atomic/Select/SelectPrimitive.js +0 -1
  112. package/dist/atomic/Select/index.d.ts.map +1 -1
  113. package/dist/atomic/Select/index.js +2 -1
  114. package/dist/atomic/Separator/SeparatorPrimitive.d.ts +1 -1
  115. package/dist/atomic/Separator/SeparatorPrimitive.d.ts.map +1 -1
  116. package/dist/atomic/Separator/SeparatorPrimitive.js +0 -1
  117. package/dist/atomic/Separator/index.d.ts +1 -1
  118. package/dist/atomic/Separator/index.d.ts.map +1 -1
  119. package/dist/atomic/Separator/index.js +0 -1
  120. package/dist/atomic/Sheet/index.d.ts +3 -1
  121. package/dist/atomic/Sheet/index.d.ts.map +1 -1
  122. package/dist/atomic/Sheet/index.js +3 -3
  123. package/dist/atomic/Slider/SliderPrimitive.d.ts +1 -1
  124. package/dist/atomic/Slider/SliderPrimitive.d.ts.map +1 -1
  125. package/dist/atomic/Slider/SliderPrimitive.js +0 -1
  126. package/dist/atomic/Slider/index.d.ts +3 -2
  127. package/dist/atomic/Slider/index.d.ts.map +1 -1
  128. package/dist/atomic/Slider/index.js +9 -7
  129. package/dist/atomic/Slot/index.d.ts.map +1 -1
  130. package/dist/atomic/Stepper/index.js +1 -1
  131. package/dist/atomic/Switch/SwitchPrimitive.d.ts +1 -1
  132. package/dist/atomic/Switch/SwitchPrimitive.d.ts.map +1 -1
  133. package/dist/atomic/Switch/SwitchPrimitive.js +0 -1
  134. package/dist/atomic/Switch/index.d.ts +3 -2
  135. package/dist/atomic/Switch/index.d.ts.map +1 -1
  136. package/dist/atomic/Switch/index.js +2 -3
  137. package/dist/atomic/Table/index.d.ts +20 -5
  138. package/dist/atomic/Table/index.d.ts.map +1 -1
  139. package/dist/atomic/Table/index.js +92 -22
  140. package/dist/atomic/Tabs/TabsPrimitive.d.ts +1 -1
  141. package/dist/atomic/Tabs/TabsPrimitive.d.ts.map +1 -1
  142. package/dist/atomic/Tabs/TabsPrimitive.js +0 -1
  143. package/dist/atomic/Tabs/index.js +1 -1
  144. package/dist/atomic/Tag/index.d.ts +8 -0
  145. package/dist/atomic/Tag/index.d.ts.map +1 -1
  146. package/dist/atomic/Tag/index.js +1 -1
  147. package/dist/atomic/Text/index.js +1 -1
  148. package/dist/atomic/Textarea/index.d.ts +4 -0
  149. package/dist/atomic/Textarea/index.d.ts.map +1 -1
  150. package/dist/atomic/Textarea/index.js +3 -3
  151. package/dist/atomic/Toaster/Toast.types.d.ts +17 -0
  152. package/dist/atomic/Toaster/Toast.types.d.ts.map +1 -0
  153. package/dist/atomic/Toaster/Toast.types.js +2 -0
  154. package/dist/atomic/Toaster/ToastPrimitive.d.ts +1 -1
  155. package/dist/atomic/Toaster/ToastPrimitive.d.ts.map +1 -1
  156. package/dist/atomic/ToggleGroup/ToggleGroupPrimitive.d.ts +1 -1
  157. package/dist/atomic/ToggleGroup/ToggleGroupPrimitive.d.ts.map +1 -1
  158. package/dist/atomic/Tooltip/TooltipPrimitive.d.ts +1 -1
  159. package/dist/atomic/Tooltip/TooltipPrimitive.d.ts.map +1 -1
  160. package/dist/atomic/Tooltip/TooltipPrimitive.js +0 -1
  161. package/dist/atomic/Tooltip/index.d.ts +6 -12
  162. package/dist/atomic/Tooltip/index.d.ts.map +1 -1
  163. package/dist/atomic/Tooltip/index.js +13 -23
  164. package/dist/atomic/VideoPlayer/index.d.ts +11 -1
  165. package/dist/atomic/VideoPlayer/index.d.ts.map +1 -1
  166. package/dist/atomic/VideoPlayer/index.js +6 -8
  167. package/dist/atomic/VisuallyHidden/VisuallyHiddenPrimitive.d.ts.map +1 -1
  168. package/dist/atomic/index.d.ts +2 -0
  169. package/dist/atomic/index.d.ts.map +1 -1
  170. package/dist/atomic/index.js +1 -0
  171. package/dist/hooks/index.d.ts +2 -1
  172. package/dist/hooks/index.d.ts.map +1 -1
  173. package/dist/hooks/useToast.d.ts +2 -33
  174. package/dist/hooks/useToast.d.ts.map +1 -1
  175. package/dist/hooks/useToast.js +1 -0
  176. package/dist/index.js +4 -4
  177. package/dist/styles/index.css +489 -95
  178. package/dist/utils/variants.d.ts.map +1 -1
  179. 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, Filter } from 'lucide-react';
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 Skeleton from '../Skeleton';
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, filterable = false, pagination = true, pageSize = 10, loading = false, gridLines = false, onSort, onSelect, onSearch, onFilter, className, }) => {
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
- const [currentPage, setCurrentPage] = useState(1);
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 totalPages = Math.ceil(processedData.length / pageSize);
103
- const paginatedData = pagination
104
- ? processedData.slice((currentPage - 1) * pageSize, currentPage * pageSize)
105
- : processedData;
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 ? paginatedData : [];
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
- if (loading) {
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))) })] }));
132
- }
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) => {
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", style: { paddingInline: 'var(--gap-sm)' }, children: column.title })) : (column.title), column.sortable &&
144
- sortColumn === column.key &&
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
146
- ? column.render(column.dataIndex ? row[column.dataIndex] : null, row, index)
147
- : column.dataIndex
148
- ? String(row[column.dataIndex] || '')
149
- : '' }, column.key)))] }, index))) })] }), pagination && totalPages > 1 && (_jsxs(Stack, { direction: "row", align: "center", justify: "between", children: [_jsxs("div", { className: "dndev-text-sm dndev-text-muted", children: ["Showing ", (currentPage - 1) * pageSize + 1, " to", ' ', Math.min(currentPage * pageSize, processedData.length), " of", ' ', processedData.length, " results"] }), _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, onClick: () => setCurrentPage(Math.max(1, currentPage - 1)), disabled: currentPage === 1, children: "Previous" }), _jsxs("span", { className: "dndev-text-sm", children: ["Page ", currentPage, " of ", totalPages] }), _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, onClick: () => setCurrentPage(Math.min(totalPages, currentPage + 1)), disabled: currentPage === totalPages, children: "Next" })] })] }))] }));
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 { type ComponentProps } from 'react';
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;AACtD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,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"}
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":"AAYA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,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"}
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"}
@@ -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":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,MAAM,WAAW,aAAc,SAAQ,qBAAqB,CAAC,UAAU,CAAC;CAAG;AAE3E;;GAEG;AACH,QAAA,MAAM,QAAQ,4HAMb,CAAC;AAIF,eAAe,QAAQ,CAAC"}
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.1
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"}
@@ -0,0 +1,2 @@
1
+ // packages/components/src/atomic/Toaster/Toast.types.ts
2
+ export {};
@@ -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 '../../hooks/useToast';
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,sBAAsB,CAAC;AACtD,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"}
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 { type ComponentProps } from 'react';
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;AACrE,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAchE,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"}
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 { type ComponentProps } from 'react';
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;AAC5D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,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"}
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 const Tooltip: ({ content, children, side, align, delayDuration, variant, }: TooltipProps) => import("react/jsx-runtime").JSX.Element;
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":"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"}
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.6
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
- * Uses checkVisibility() API when available (lighter than offsetWidth),
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
- if (!(label instanceof HTMLElement))
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
- const Tooltip = ({ content, children, side, align = 'center', delayDuration = 300, variant, }) => {
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
- }, [mounted]);
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":"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"}
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, useRef } from 'react';
13
- import { useTranslation } from '@donotdev/core';
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": t('video.clickToWatch', 'Click to watch video'), 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" }) })] }));
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": t('video.loading', 'Loading video') }) })] }))] }));
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": t('video.clickToWatch', 'Click to watch video'), 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" }) })] }));
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;AAGvE,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"}
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"}
@@ -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';