@alveole/components 1.8.4 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/core/Section/Section.stories.d.ts.map +1 -1
  2. package/dist/core/Section/Section.stories.js +9 -3
  3. package/dist/core/Section/Section.stories.sources.d.ts.map +1 -1
  4. package/dist/core/Section/Section.stories.sources.js +2 -2
  5. package/dist/generated/version.d.ts +1 -1
  6. package/dist/generated/version.d.ts.map +1 -1
  7. package/dist/generated/version.js +1 -1
  8. package/dist/stories/index.d.ts +1 -0
  9. package/dist/stories/index.d.ts.map +1 -1
  10. package/dist/stories/index.js +1 -0
  11. package/dist/ui/ActionMenu/ActionMenu.stories.d.ts +1 -0
  12. package/dist/ui/ActionMenu/ActionMenu.stories.d.ts.map +1 -1
  13. package/dist/ui/ActionMenu/ActionMenu.stories.js +2 -1
  14. package/dist/ui/Button/Button.d.ts +4 -2
  15. package/dist/ui/Button/Button.d.ts.map +1 -1
  16. package/dist/ui/Button/Button.js +19 -10
  17. package/dist/ui/Button/Button.stories.d.ts +6 -1
  18. package/dist/ui/Button/Button.stories.d.ts.map +1 -1
  19. package/dist/ui/Button/Button.stories.js +2 -0
  20. package/dist/ui/Button/Button.stories.sources.d.ts +2 -0
  21. package/dist/ui/Button/Button.stories.sources.d.ts.map +1 -1
  22. package/dist/ui/Button/Button.stories.sources.js +3 -0
  23. package/dist/ui/Button/Button.styles.d.ts +3 -0
  24. package/dist/ui/Button/Button.styles.d.ts.map +1 -1
  25. package/dist/ui/Button/Button.styles.js +3 -0
  26. package/dist/ui/Checkbox/Checkbox.d.ts +2 -1
  27. package/dist/ui/Checkbox/Checkbox.d.ts.map +1 -1
  28. package/dist/ui/Checkbox/Checkbox.js +3 -4
  29. package/dist/ui/Checkbox/Checkbox.stories.d.ts +3 -2
  30. package/dist/ui/Checkbox/Checkbox.stories.d.ts.map +1 -1
  31. package/dist/ui/Checkbox/Checkbox.stories.js +1 -1
  32. package/dist/ui/Checkbox/Checkbox.stories.sources.d.ts +2 -2
  33. package/dist/ui/Checkbox/Checkbox.stories.sources.d.ts.map +1 -1
  34. package/dist/ui/Checkbox/Checkbox.stories.sources.js +2 -2
  35. package/dist/ui/Checkbox/Checkbox.utils.d.ts +5 -0
  36. package/dist/ui/Checkbox/Checkbox.utils.d.ts.map +1 -0
  37. package/dist/ui/Checkbox/Checkbox.utils.js +7 -0
  38. package/dist/ui/Checkbox/CheckboxContainer.d.ts +7 -2
  39. package/dist/ui/Checkbox/CheckboxContainer.d.ts.map +1 -1
  40. package/dist/ui/Checkbox/CheckboxContainer.js +4 -2
  41. package/dist/ui/Checkbox/CheckboxIndicator.d.ts +4 -1
  42. package/dist/ui/Checkbox/CheckboxIndicator.d.ts.map +1 -1
  43. package/dist/ui/Checkbox/CheckboxIndicator.js +5 -3
  44. package/dist/ui/Checkbox/CheckboxLabel.d.ts +4 -1
  45. package/dist/ui/Checkbox/CheckboxLabel.d.ts.map +1 -1
  46. package/dist/ui/Checkbox/CheckboxLabel.js +4 -2
  47. package/dist/ui/DataTable/DataTable.d.ts +27 -0
  48. package/dist/ui/DataTable/DataTable.d.ts.map +1 -0
  49. package/dist/ui/DataTable/DataTable.js +58 -0
  50. package/dist/ui/DataTable/DataTable.stories.d.ts +205 -0
  51. package/dist/ui/DataTable/DataTable.stories.d.ts.map +1 -0
  52. package/dist/ui/DataTable/DataTable.stories.js +499 -0
  53. package/dist/ui/DataTable/DataTable.stories.sources.d.ts +25 -0
  54. package/dist/ui/DataTable/DataTable.stories.sources.d.ts.map +1 -0
  55. package/dist/ui/DataTable/DataTable.stories.sources.js +27 -0
  56. package/dist/ui/DataTable/DataTable.styles.d.ts +175 -0
  57. package/dist/ui/DataTable/DataTable.styles.d.ts.map +1 -0
  58. package/dist/ui/DataTable/DataTable.styles.js +163 -0
  59. package/dist/ui/DataTable/DataTable.types.d.ts +20 -0
  60. package/dist/ui/DataTable/DataTable.types.d.ts.map +1 -0
  61. package/dist/ui/DataTable/DataTable.types.js +1 -0
  62. package/dist/ui/DataTable/DataTableCell.d.ts +12 -0
  63. package/dist/ui/DataTable/DataTableCell.d.ts.map +1 -0
  64. package/dist/ui/DataTable/DataTableCell.js +18 -0
  65. package/dist/ui/DataTable/DataTableFooter.d.ts +8 -0
  66. package/dist/ui/DataTable/DataTableFooter.d.ts.map +1 -0
  67. package/dist/ui/DataTable/DataTableFooter.js +26 -0
  68. package/dist/ui/DataTable/DataTableHeaderCell.d.ts +9 -0
  69. package/dist/ui/DataTable/DataTableHeaderCell.d.ts.map +1 -0
  70. package/dist/ui/DataTable/DataTableHeaderCell.js +12 -0
  71. package/dist/ui/DataTable/DataTablePagination.d.ts +12 -0
  72. package/dist/ui/DataTable/DataTablePagination.d.ts.map +1 -0
  73. package/dist/ui/DataTable/DataTablePagination.js +78 -0
  74. package/dist/ui/DataTable/DataTableRow.d.ts +16 -0
  75. package/dist/ui/DataTable/DataTableRow.d.ts.map +1 -0
  76. package/dist/ui/DataTable/DataTableRow.js +26 -0
  77. package/dist/ui/DataTable/index.d.ts +5 -0
  78. package/dist/ui/DataTable/index.d.ts.map +1 -0
  79. package/dist/ui/DataTable/index.js +4 -0
  80. package/dist/ui/Header/Header.d.ts +4 -1
  81. package/dist/ui/Header/Header.d.ts.map +1 -1
  82. package/dist/ui/Header/Header.js +4 -3
  83. package/dist/ui/Header/Header.stories.d.ts +1 -1
  84. package/dist/ui/ListItem/ListItem.stories.d.ts +1 -0
  85. package/dist/ui/ListItem/ListItem.stories.d.ts.map +1 -1
  86. package/dist/ui/ListItem/ListItem.stories.js +4 -1
  87. package/dist/ui/index.d.ts +1 -0
  88. package/dist/ui/index.d.ts.map +1 -1
  89. package/dist/ui/index.js +1 -0
  90. package/package.json +15 -15
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { DataTableColumn, DataTableSize, DataTableSort } from './DataTable.types';
3
+ export type DataTableProps<Row> = {
4
+ columns: DataTableColumn<Row>[];
5
+ data: Row[];
6
+ keyExtractor: (row: Row, index: number) => string;
7
+ /** Densité du tableau : influence les paddings des cellules. @default 'sm' */
8
+ size?: DataTableSize;
9
+ selectable?: boolean;
10
+ /** Contrôlé : clés des lignes sélectionnées. Sans valeur, la sélection est gérée en interne. */
11
+ selectedKeys?: string[];
12
+ onSelectionChange?: (keys: string[]) => void;
13
+ /** Contrôlé : colonne/direction de tri actives. Sans valeur, le tri est géré en interne (non appliqué aux données, voir `onSortChange`). */
14
+ sort?: DataTableSort | null;
15
+ onSortChange?: (sort: DataTableSort | null) => void;
16
+ onRowPress?: (row: Row, index: number) => void;
17
+ /**
18
+ * Masque la ligne d'en-têtes de colonnes (labels, icônes de tri, case "tout sélectionner").
19
+ * Le tri reste utilisable via `sort`/`onSortChange` piloté depuis l'extérieur (ex. un menu).
20
+ */
21
+ hideHeader?: boolean;
22
+ renderNoContent?: () => React.ReactNode;
23
+ /** Rendu en bas du tableau, typiquement un <DataTableFooter/> avec compteur + <DataTablePagination/>. */
24
+ footer?: React.ReactNode;
25
+ };
26
+ export declare const DataTable: <Row>(props: DataTableProps<Row>) => React.JSX.Element;
27
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/ui/DataTable/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgBlF,MAAM,MAAM,cAAc,CAAC,GAAG,IAAI;IAChC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAElD,8EAA8E;IAC9E,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAE7C,4IAA4I;IAC5I,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IAEpD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAExC,yGAAyG;IACzG,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,GAAG,EAAG,OAAO,cAAc,CAAC,GAAG,CAAC,sBAiHzD,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { ScrollView } from 'react-native';
4
+ import { Box, Typography } from '../../core';
5
+ import { CheckboxContainer, CheckboxIndicator } from '../Checkbox';
6
+ import { useStyles } from './DataTable.styles';
7
+ import { DataTableHeaderCell } from './DataTableHeaderCell';
8
+ import { DataTableRow } from './DataTableRow';
9
+ const headerSelectionCellStyleBySize = {
10
+ sm: 'headerSelectionCellSm',
11
+ md: 'headerSelectionCellMd',
12
+ lg: 'headerSelectionCellLg',
13
+ };
14
+ const headerRowStyleBySize = {
15
+ sm: 'headerRowSm',
16
+ md: 'headerRowMd',
17
+ lg: 'headerRowLg',
18
+ };
19
+ export const DataTable = (props) => {
20
+ const { columns, data, keyExtractor, size = 'md', selectable = false, selectedKeys: controlledSelectedKeys, onSelectionChange, sort: controlledSort, onSortChange, onRowPress, hideHeader = false, renderNoContent, footer, } = props;
21
+ const styles = useStyles();
22
+ const [internalSelectedKeys, setInternalSelectedKeys] = React.useState([]);
23
+ const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys;
24
+ const setSelectedKeys = (keys) => {
25
+ onSelectionChange?.(keys);
26
+ if (controlledSelectedKeys === undefined)
27
+ setInternalSelectedKeys(keys);
28
+ };
29
+ const [internalSort, setInternalSort] = React.useState(null);
30
+ const sort = controlledSort !== undefined ? controlledSort : internalSort;
31
+ const setSort = (next) => {
32
+ onSortChange?.(next);
33
+ if (controlledSort === undefined)
34
+ setInternalSort(next);
35
+ };
36
+ const rowKeys = React.useMemo(() => data.map((row, index) => keyExtractor(row, index)), [data, keyExtractor]);
37
+ const allSelected = selectable && rowKeys.length > 0 && rowKeys.every(key => selectedKeys.includes(key));
38
+ const someSelected = selectable && !allSelected && rowKeys.some(key => selectedKeys.includes(key));
39
+ const toggleAll = () => setSelectedKeys(allSelected ? [] : rowKeys);
40
+ const toggleRow = (rowKey, checked) => {
41
+ setSelectedKeys(checked ? [...selectedKeys, rowKey] : selectedKeys.filter(key => key !== rowKey));
42
+ };
43
+ const handleHeaderPress = (column) => {
44
+ if (sort?.columnId !== column.id) {
45
+ setSort({ columnId: column.id, direction: 'asc' });
46
+ }
47
+ else if (sort.direction === 'asc') {
48
+ setSort({ columnId: column.id, direction: 'desc' });
49
+ }
50
+ else {
51
+ setSort(null);
52
+ }
53
+ };
54
+ return (_jsxs(Box, { tag: "data-table", style: styles.table, children: [_jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: true, contentContainerStyle: styles.scrollContent, children: [!hideHeader && (_jsxs(Box, { tag: "data-table-header-row", style: [styles.headerRow, styles[headerRowStyleBySize[size]]], children: [selectable && (_jsx(Box, { tag: "data-table-header-selection-cell", style: [styles.headerSelectionCell, styles[headerSelectionCellStyleBySize[size]]], children: _jsx(CheckboxContainer, { id: "data-table--select-all", variant: "small", checked: someSelected ? 'indeterminate' : allSelected, onCheckedChange: toggleAll, children: _jsx(CheckboxIndicator, { variant: "small", indeterminate: someSelected }) }) })), columns.map(column => (_jsx(DataTableHeaderCell, { column: column, sortDirection: sort?.columnId === column.id ? sort.direction : undefined, size: size, onPress: () => handleHeaderPress(column) }, column.id)))] })), data.map((row, index) => {
55
+ const rowKey = rowKeys[index];
56
+ return (_jsx(DataTableRow, { row: row, rowIndex: index, rowKey: rowKey, columns: columns, selectable: selectable, selected: selectedKeys.includes(rowKey), size: size, noBorderBottom: !footer && index === data.length - 1, onSelectedChange: checked => toggleRow(rowKey, checked), onPress: onRowPress ? () => onRowPress(row, index) : undefined }, rowKey));
57
+ })] }), data.length === 0 && (_jsx(Box, { tag: "data-table-empty", style: styles.emptyState, children: renderNoContent ? renderNoContent() : _jsx(Typography, { style: styles.emptyStateLabel, children: "Aucune donn\u00E9e" }) })), footer] }));
58
+ };
@@ -0,0 +1,205 @@
1
+ import React from 'react';
2
+ declare const _default: {
3
+ title: string;
4
+ tags: "ui"[];
5
+ experimental: false;
6
+ figmaURL: string;
7
+ description: string;
8
+ shortDescription: string;
9
+ component: <Row>(props: import("./DataTable").DataTableProps<Row>) => React.JSX.Element;
10
+ styleFn: () => {
11
+ table: {
12
+ display: "flex";
13
+ flexDirection: "column";
14
+ borderWidth: number;
15
+ borderColor: string;
16
+ borderRadius: import("@alveole/theme").Radius;
17
+ overflow: "hidden";
18
+ backgroundColor: string;
19
+ };
20
+ scrollContent: {
21
+ display: "flex";
22
+ flexDirection: "column";
23
+ flexGrow: number;
24
+ minWidth: string;
25
+ };
26
+ headerRow: {
27
+ display: "flex";
28
+ flexDirection: "row";
29
+ alignItems: "stretch";
30
+ backgroundColor: string;
31
+ borderBottomWidth: number;
32
+ borderBottomColor: string;
33
+ };
34
+ headerRowSm: {
35
+ minHeight: number;
36
+ };
37
+ headerRowMd: {
38
+ minHeight: number;
39
+ };
40
+ headerRowLg: {
41
+ minHeight: number;
42
+ };
43
+ headerCell: {
44
+ display: "flex";
45
+ flexDirection: "row";
46
+ alignItems: "center";
47
+ gap: string | number;
48
+ };
49
+ headerCellSm: {
50
+ paddingLeft: string | number;
51
+ paddingRight: string | number;
52
+ };
53
+ headerCellMd: {
54
+ paddingLeft: string | number;
55
+ paddingRight: string | number;
56
+ };
57
+ headerCellLg: {
58
+ paddingLeft: string | number;
59
+ paddingRight: string | number;
60
+ };
61
+ headerLabel: {
62
+ color: string;
63
+ fontSize: 12;
64
+ lineHeight: 20;
65
+ letterSpacing: 0;
66
+ fontFamily: string;
67
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
68
+ };
69
+ headerLabelActive: {
70
+ color: string;
71
+ };
72
+ headerSelectionCell: {
73
+ display: "flex";
74
+ flexDirection: "row";
75
+ alignItems: "center";
76
+ justifyContent: "center";
77
+ };
78
+ headerSelectionCellSm: {
79
+ width: number;
80
+ paddingLeft: string | number;
81
+ paddingRight: string | number;
82
+ };
83
+ headerSelectionCellMd: {
84
+ width: number;
85
+ paddingLeft: string | number;
86
+ paddingRight: string | number;
87
+ };
88
+ headerSelectionCellLg: {
89
+ width: number;
90
+ paddingLeft: string | number;
91
+ paddingRight: string | number;
92
+ };
93
+ row: {
94
+ display: "flex";
95
+ flexDirection: "row";
96
+ alignItems: "stretch";
97
+ backgroundColor: string;
98
+ borderBottomWidth: number;
99
+ borderBottomColor: string;
100
+ };
101
+ rowSm: {
102
+ minHeight: number;
103
+ };
104
+ rowMd: {
105
+ minHeight: number;
106
+ };
107
+ rowLg: {
108
+ minHeight: number;
109
+ };
110
+ rowHoverable: {
111
+ cursor: "pointer";
112
+ };
113
+ rowHover: {
114
+ backgroundColor: string;
115
+ };
116
+ rowSelected: {
117
+ backgroundColor: string;
118
+ };
119
+ cell: {
120
+ display: "flex";
121
+ flexDirection: "row";
122
+ alignItems: "center";
123
+ minWidth: number;
124
+ };
125
+ cellSm: {
126
+ paddingLeft: string | number;
127
+ paddingRight: string | number;
128
+ };
129
+ cellMd: {
130
+ paddingLeft: string | number;
131
+ paddingRight: string | number;
132
+ };
133
+ cellLg: {
134
+ paddingLeft: string | number;
135
+ paddingRight: string | number;
136
+ };
137
+ cellAlignEnd: {
138
+ justifyContent: "flex-end";
139
+ };
140
+ cellText: {
141
+ color: string;
142
+ fontSize: 14;
143
+ lineHeight: 20;
144
+ letterSpacing: 0;
145
+ fontFamily: string;
146
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
147
+ };
148
+ selectionCell: {
149
+ display: "flex";
150
+ flexDirection: "row";
151
+ alignItems: "center";
152
+ justifyContent: "center";
153
+ };
154
+ selectionCellSm: {
155
+ width: number;
156
+ paddingLeft: string | number;
157
+ paddingRight: string | number;
158
+ };
159
+ selectionCellMd: {
160
+ width: number;
161
+ paddingLeft: string | number;
162
+ paddingRight: string | number;
163
+ };
164
+ selectionCellLg: {
165
+ width: number;
166
+ paddingLeft: string | number;
167
+ paddingRight: string | number;
168
+ };
169
+ emptyState: {
170
+ display: "flex";
171
+ alignItems: "center";
172
+ justifyContent: "center";
173
+ padding: string | number;
174
+ };
175
+ emptyStateLabel: {
176
+ color: string;
177
+ fontSize: 14;
178
+ lineHeight: 20;
179
+ letterSpacing: 0;
180
+ fontFamily: string;
181
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
182
+ };
183
+ };
184
+ };
185
+ export default _default;
186
+ export declare const Default: () => React.JSX.Element;
187
+ export declare const WithSelection: () => React.JSX.Element;
188
+ export declare const Sizes: () => React.JSX.Element;
189
+ export declare const ManyColumns: () => React.JSX.Element;
190
+ export declare const WithSorting: () => React.JSX.Element;
191
+ export declare const WithCustomCells: () => React.JSX.Element;
192
+ export declare const WithoutHeader: () => React.JSX.Element;
193
+ export declare const WithPagination: () => React.JSX.Element;
194
+ /**
195
+ * Reproduction de la vue "Deployments" de Vercel avec nos composants : `Tag` pour les pastilles
196
+ * d'environnement, `Badge` pour le statut, `Avatar` pour l'auteur, `ActionMenu` pour le menu contextuel
197
+ * "..." de chaque ligne, et `Popover` sur la date pour afficher le détail (temps relatif + horodatage
198
+ * UTC et fuseau local), comme chez Vercel. Le pied de page est ici un simple slot `footer` (pas
199
+ * `DataTableFooter`, qui sert au duo compteur+pagination) : un bouton pleine largeur, puis une note de
200
+ * rétention accompagnée d'une action.
201
+ */
202
+ export declare const AsDeploymentList: () => React.JSX.Element;
203
+ export declare const Empty: () => React.JSX.Element;
204
+ export * as Sources from './DataTable.stories.sources';
205
+ //# sourceMappingURL=DataTable.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/DataTable/DataTable.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiB1B,wBAiBkB;AA+ElB,eAAO,MAAM,OAAO,yBAA+F,CAAC;AAEpH,eAAO,MAAM,aAAa,yBAEzB,CAAC;AAEF,eAAO,MAAM,KAAK,yBAejB,CAAC;AAgNF,eAAO,MAAM,WAAW,yBAEvB,CAAC;AAEF,eAAO,MAAM,WAAW,yBAsBvB,CAAC;AAEF,eAAO,MAAM,eAAe,yBAmC3B,CAAC;AAEF,eAAO,MAAM,aAAa,yBAEzB,CAAC;AAEF,eAAO,MAAM,cAAc,yBAe1B,CAAC;AAuLF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,yBAkH5B,CAAC;AAEF,eAAO,MAAM,KAAK,yBAajB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC"}