@wakastellar/ui 0.1.1 → 0.1.2
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/LICENSE +17 -0
- package/README.md +248 -355
- package/package.json +1 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 19 November 2007
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2025 Wakastellar
|
|
5
|
+
|
|
6
|
+
This program is free software: you can redistribute it and/or modify
|
|
7
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
(at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU Affero General Public License
|
|
17
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
package/README.md
CHANGED
|
@@ -1,398 +1,291 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
**Librairie UI étendue de ShadCN compatible TweakCN + i18n pour Next.js avec DataTable ultra-complet**
|
|
4
|
-
|
|
5
|
-
[](https://github.com/wakastellar/wakastellar-ui)
|
|
6
|
-
[](LICENSE)
|
|
7
|
-
[](https://nextjs.org/)
|
|
8
|
-
[](https://reactjs.org/)
|
|
9
|
-
|
|
10
|
-
## 🚀 Fonctionnalités principales
|
|
11
|
-
|
|
12
|
-
### 📊 **DataTable Ultra-Complet**
|
|
13
|
-
- **Virtualisation** : Performance optimisée pour de gros volumes de données
|
|
14
|
-
- **Groupement et agrégation** : Regroupement intelligent des lignes
|
|
15
|
-
- **Expansion des lignes** : Affichage de contenu détaillé
|
|
16
|
-
- **Redimensionnement des colonnes** : Ajustement dynamique de la largeur
|
|
17
|
-
- **Réordonnancement** : Glisser-déposer des colonnes
|
|
18
|
-
- **Export/Import multi-formats** : CSV, XLSX, JSON, PDF, XML
|
|
19
|
-
- **Édition inline** : Modification directe des cellules
|
|
20
|
-
- **Sélection avancée** : Single, multiple, range
|
|
21
|
-
- **Filtrage intelligent** : Filtres par type de données
|
|
22
|
-
- **Tri multi-colonnes** : Tri complexe et personnalisé
|
|
23
|
-
- **Pagination avancée** : Navigation optimisée
|
|
24
|
-
- **Thèmes personnalisés** : Personnalisation complète de l'apparence
|
|
25
|
-
- **Menu contextuel** : Actions rapides sur les lignes
|
|
26
|
-
- **Performance optimisée** : Debouncing et lazy loading
|
|
27
|
-
|
|
28
|
-
### 🎨 **Composants UI**
|
|
29
|
-
- **Composants ShadCN étendus** : Button, Card, Input, Dialog, etc.
|
|
30
|
-
- **Composants personnalisés** : WakaButton, WakaCard, WakaInput, etc.
|
|
31
|
-
- **Thèmes dynamiques** : Basculement entre thèmes en temps réel
|
|
32
|
-
- **Internationalisation** : Support multi-langues avec i18next
|
|
33
|
-
- **Responsive design** : Adaptation mobile et desktop
|
|
34
|
-
- **Accessibilité** : Conformité WCAG 2.1
|
|
35
|
-
|
|
36
|
-
### 🔧 **Architecture**
|
|
37
|
-
- **TypeScript strict** : Typage complet et sécurisé
|
|
38
|
-
- **Modularité** : Architecture modulaire et réutilisable
|
|
39
|
-
- **Performance** : Optimisations pour la production
|
|
40
|
-
- **Tests** : Tests unitaires et d'intégration
|
|
41
|
-
- **Documentation** : Documentation complète et exemples
|
|
42
|
-
|
|
43
|
-
## 📦 Installation
|
|
1
|
+
# @wakastellar/ui
|
|
44
2
|
|
|
45
|
-
|
|
46
|
-
# Installation via pnpm (recommandé)
|
|
47
|
-
pnpm add @wakastellar/ui
|
|
3
|
+
<div align="center">
|
|
48
4
|
|
|
49
|
-
|
|
50
|
-
npm
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
**Librairie de composants React professionnelle et modulaire pour applications Next.js modernes**
|
|
51
12
|
|
|
52
|
-
#
|
|
13
|
+
[Installation](#installation) • [Composants](#composants) • [Technologies](#technologies) • [Licence](#licence)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Description
|
|
20
|
+
|
|
21
|
+
`@wakastellar/ui` est une librairie de composants React complète, typée avec TypeScript strict, conçue pour les applications Next.js modernes. Elle inclut un DataTable avancé basé sur TanStack Table v8, un système de theming dynamique compatible Tailwind CSS et TweakCN, ainsi qu'une collection complète de composants UI prêts pour la production.
|
|
22
|
+
|
|
23
|
+
### Caractéristiques principales
|
|
24
|
+
|
|
25
|
+
- ✅ **TypeScript strict** - Typage complet et API type-safe
|
|
26
|
+
- ✅ **SSR/SSG Ready** - Compatible React 18/19 et Next.js 15+
|
|
27
|
+
- ✅ **Production-ready** - Builds ESM + CJS optimisés avec tree-shaking
|
|
28
|
+
- ✅ **Accessible** - Conforme ARIA et navigation clavier complète
|
|
29
|
+
- ✅ **Performant** - Virtualisation, debouncing, memoization
|
|
30
|
+
- ✅ **Themable** - Système de thèmes dynamique et variantes multiples
|
|
31
|
+
- ✅ **i18n Ready** - Support i18next / react-i18next
|
|
32
|
+
- ✅ **Headless UI** - Basé sur Radix UI primitives
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Installation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install @wakastellar/ui
|
|
40
|
+
# ou
|
|
41
|
+
pnpm add @wakastellar/ui
|
|
42
|
+
# ou
|
|
53
43
|
yarn add @wakastellar/ui
|
|
54
44
|
```
|
|
55
45
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
### Configuration de base
|
|
59
|
-
|
|
60
|
-
```tsx
|
|
61
|
-
// app/layout.tsx
|
|
62
|
-
import { ThemeProvider, I18nProvider } from '@wakastellar/ui'
|
|
63
|
-
import '@wakastellar/ui/styles'
|
|
64
|
-
|
|
65
|
-
export default function RootLayout({ children }) {
|
|
66
|
-
return (
|
|
67
|
-
<html lang="fr">
|
|
68
|
-
<body>
|
|
69
|
-
<ThemeProvider>
|
|
70
|
-
<I18nProvider>
|
|
71
|
-
{children}
|
|
72
|
-
</I18nProvider>
|
|
73
|
-
</ThemeProvider>
|
|
74
|
-
</body>
|
|
75
|
-
</html>
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
```
|
|
46
|
+
### Styles CSS
|
|
79
47
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
import { DataTable, ColumnDef } from '@wakastellar/ui'
|
|
84
|
-
|
|
85
|
-
interface User {
|
|
86
|
-
id: string
|
|
87
|
-
name: string
|
|
88
|
-
email: string
|
|
89
|
-
status: 'active' | 'inactive'
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const columns: ColumnDef<User>[] = [
|
|
93
|
-
{
|
|
94
|
-
accessorKey: 'name',
|
|
95
|
-
header: 'Nom',
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
accessorKey: 'email',
|
|
99
|
-
header: 'Email',
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
accessorKey: 'status',
|
|
103
|
-
header: 'Statut',
|
|
104
|
-
},
|
|
105
|
-
]
|
|
106
|
-
|
|
107
|
-
export default function UsersTable() {
|
|
108
|
-
const data: User[] = [
|
|
109
|
-
{ id: '1', name: 'John Doe', email: 'john@example.com', status: 'active' },
|
|
110
|
-
{ id: '2', name: 'Jane Smith', email: 'jane@example.com', status: 'inactive' },
|
|
111
|
-
]
|
|
112
|
-
|
|
113
|
-
return (
|
|
114
|
-
<DataTable
|
|
115
|
-
data={data}
|
|
116
|
-
columns={columns}
|
|
117
|
-
searchable
|
|
118
|
-
pagination
|
|
119
|
-
/>
|
|
120
|
-
)
|
|
121
|
-
}
|
|
48
|
+
```ts
|
|
49
|
+
import "@wakastellar/ui/dist/ui.css"
|
|
122
50
|
```
|
|
123
51
|
|
|
124
|
-
###
|
|
125
|
-
|
|
126
|
-
```tsx
|
|
127
|
-
import { DataTableAdvanced, ColumnDef } from '@wakastellar/ui'
|
|
128
|
-
|
|
129
|
-
export default function AdvancedTable() {
|
|
130
|
-
return (
|
|
131
|
-
<DataTableAdvanced
|
|
132
|
-
data={data}
|
|
133
|
-
columns={columns}
|
|
134
|
-
// Virtualisation pour de gros volumes
|
|
135
|
-
virtualization={{
|
|
136
|
-
type: 'dynamic',
|
|
137
|
-
itemHeight: 50,
|
|
138
|
-
overscan: 5
|
|
139
|
-
}}
|
|
140
|
-
// Groupement des données
|
|
141
|
-
grouping={{
|
|
142
|
-
enabled: true,
|
|
143
|
-
defaultGrouping: ['status']
|
|
144
|
-
}}
|
|
145
|
-
// Expansion des lignes
|
|
146
|
-
rowExpansion={{
|
|
147
|
-
enabled: true,
|
|
148
|
-
render: ({ row }) => <UserDetails user={row.original} />
|
|
149
|
-
}}
|
|
150
|
-
// Export/Import
|
|
151
|
-
enableExport={{
|
|
152
|
-
formats: ['csv', 'xlsx', 'pdf'],
|
|
153
|
-
filename: 'users-export'
|
|
154
|
-
}}
|
|
155
|
-
enableImport={{
|
|
156
|
-
formats: ['csv', 'xlsx'],
|
|
157
|
-
onImport: (data) => console.log('Données importées:', data)
|
|
158
|
-
}}
|
|
159
|
-
// Édition inline
|
|
160
|
-
edit={{
|
|
161
|
-
enabled: true,
|
|
162
|
-
mode: 'cell',
|
|
163
|
-
onSave: (row, values) => console.log('Sauvegardé:', values)
|
|
164
|
-
}}
|
|
165
|
-
// Thème personnalisé
|
|
166
|
-
theme={{
|
|
167
|
-
colors: {
|
|
168
|
-
primary: '#3b82f6',
|
|
169
|
-
secondary: '#64748b'
|
|
170
|
-
},
|
|
171
|
-
spacing: {
|
|
172
|
-
sm: '0.5rem',
|
|
173
|
-
md: '1rem'
|
|
174
|
-
}
|
|
175
|
-
}}
|
|
176
|
-
// Performance
|
|
177
|
-
performance={{
|
|
178
|
-
disableAnimations: false,
|
|
179
|
-
renderLimit: 100,
|
|
180
|
-
filterDebounceMs: 300
|
|
181
|
-
}}
|
|
182
|
-
/>
|
|
183
|
-
)
|
|
184
|
-
}
|
|
185
|
-
```
|
|
52
|
+
### Peer Dependencies
|
|
186
53
|
|
|
187
|
-
|
|
54
|
+
La librairie nécessite les dépendances suivantes (à installer si ce n'est pas déjà fait) :
|
|
188
55
|
|
|
189
|
-
|
|
56
|
+
- `react` >= 19.1.0
|
|
57
|
+
- `react-dom` >= 18.0.0
|
|
58
|
+
- `next` >= 15.5.4 (pour Next.js)
|
|
59
|
+
- `react-hook-form` >= 7.0.0 (optionnel, pour certains composants)
|
|
190
60
|
|
|
191
|
-
|
|
192
|
-
import { ThemeProvider } from '@wakastellar/ui'
|
|
61
|
+
---
|
|
193
62
|
|
|
194
|
-
|
|
195
|
-
return (
|
|
196
|
-
<ThemeProvider theme="default">
|
|
197
|
-
<YourApp />
|
|
198
|
-
</ThemeProvider>
|
|
199
|
-
)
|
|
200
|
-
}
|
|
201
|
-
```
|
|
63
|
+
## Technologies
|
|
202
64
|
|
|
203
|
-
###
|
|
204
|
-
|
|
205
|
-
```tsx
|
|
206
|
-
const customTheme = {
|
|
207
|
-
colors: {
|
|
208
|
-
primary: '#3b82f6',
|
|
209
|
-
secondary: '#64748b',
|
|
210
|
-
accent: '#f59e0b'
|
|
211
|
-
},
|
|
212
|
-
spacing: {
|
|
213
|
-
sm: '0.5rem',
|
|
214
|
-
md: '1rem',
|
|
215
|
-
lg: '1.5rem'
|
|
216
|
-
},
|
|
217
|
-
typography: {
|
|
218
|
-
fontFamily: 'Inter, sans-serif',
|
|
219
|
-
fontSize: {
|
|
220
|
-
sm: '0.875rem',
|
|
221
|
-
md: '1rem',
|
|
222
|
-
lg: '1.125rem'
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
<ThemeProvider theme={customTheme}>
|
|
228
|
-
<YourApp />
|
|
229
|
-
</ThemeProvider>
|
|
230
|
-
```
|
|
65
|
+
### Core
|
|
231
66
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const translations = {
|
|
238
|
-
fr: {
|
|
239
|
-
'table.search': 'Rechercher...',
|
|
240
|
-
'table.noData': 'Aucune donnée',
|
|
241
|
-
'table.loading': 'Chargement...'
|
|
242
|
-
},
|
|
243
|
-
en: {
|
|
244
|
-
'table.search': 'Search...',
|
|
245
|
-
'table.noData': 'No data',
|
|
246
|
-
'table.loading': 'Loading...'
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
<I18nProvider translations={translations} defaultLanguage="fr">
|
|
251
|
-
<YourApp />
|
|
252
|
-
</I18nProvider>
|
|
253
|
-
```
|
|
67
|
+
- **React** 19.1.0+
|
|
68
|
+
- **TypeScript** 5.5.0
|
|
69
|
+
- **Next.js** 15.5.4+
|
|
70
|
+
- **Tailwind CSS** 3.4.0
|
|
254
71
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
### DataTable (Basique)
|
|
258
|
-
- Pagination
|
|
259
|
-
- Tri
|
|
260
|
-
- Recherche
|
|
261
|
-
- Filtres
|
|
262
|
-
- Sélection
|
|
263
|
-
|
|
264
|
-
### DataTableAdvanced (Complet)
|
|
265
|
-
- Toutes les fonctionnalités du DataTable basique
|
|
266
|
-
- Virtualisation
|
|
267
|
-
- Groupement
|
|
268
|
-
- Expansion des lignes
|
|
269
|
-
- Redimensionnement des colonnes
|
|
270
|
-
- Réordonnancement
|
|
271
|
-
- Export/Import
|
|
272
|
-
- Édition inline
|
|
273
|
-
- Thèmes personnalisés
|
|
274
|
-
- Performance optimisée
|
|
275
|
-
|
|
276
|
-
## 🧪 Tests
|
|
72
|
+
### Build & Tooling
|
|
277
73
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
74
|
+
- **Vite** 7.1.9 - Build tool
|
|
75
|
+
- **vitest** 3.2.4 - Testing framework
|
|
76
|
+
- **eslint** - Linting
|
|
77
|
+
- **prettier** - Code formatting
|
|
281
78
|
|
|
282
|
-
|
|
283
|
-
pnpm test:watch
|
|
79
|
+
### Principales dépendances
|
|
284
80
|
|
|
285
|
-
|
|
286
|
-
|
|
81
|
+
- **@radix-ui/react-*** - Composants headless UI
|
|
82
|
+
- `@radix-ui/react-dialog` ^1.0.5
|
|
83
|
+
- `@radix-ui/react-select` ^2.0.0
|
|
84
|
+
- `@radix-ui/react-dropdown-menu` ^2.0.6
|
|
85
|
+
- `@radix-ui/react-tabs` ^1.0.4
|
|
86
|
+
- `@radix-ui/react-toast` ^1.1.5
|
|
87
|
+
- Et 20+ autres primitives Radix UI
|
|
287
88
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
89
|
+
- **@tanstack/react-table** ^8.21.3 - Moteur DataTable
|
|
90
|
+
- **@tanstack/react-virtual** ^3.13.12 - Virtualisation
|
|
91
|
+
- **i18next** ^23.7.0 - Internationalisation
|
|
92
|
+
- **date-fns** ^4.1.0 - Gestion des dates
|
|
93
|
+
- **lucide-react** ^0.293.0 - Icônes
|
|
94
|
+
- **class-variance-authority** ^0.7.1 - Variants
|
|
95
|
+
- **tailwind-merge** ^3.3.1 - Fusion de classes Tailwind
|
|
96
|
+
- **tailwind-variants** ^0.1.18 - Variants Tailwind
|
|
291
97
|
|
|
292
|
-
|
|
98
|
+
---
|
|
293
99
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
100
|
+
## Composants
|
|
101
|
+
|
|
102
|
+
### Data & Tables
|
|
103
|
+
|
|
104
|
+
- **DataTable** - Table de données basique
|
|
105
|
+
- **DataTableAdvanced** - Table de données avancée avec :
|
|
106
|
+
- Tri multi-colonnes
|
|
107
|
+
- Filtrage et recherche globale
|
|
108
|
+
- Pagination client/serveur
|
|
109
|
+
- Sélection simple/multiple
|
|
110
|
+
- Groupement et agrégation
|
|
111
|
+
- Expansion des lignes
|
|
112
|
+
- Édition inline avec validation
|
|
113
|
+
- Export/Import (CSV, XLSX, JSON, PDF)
|
|
114
|
+
- Virtualisation pour grandes quantités de données
|
|
115
|
+
|
|
116
|
+
### Formulaires
|
|
117
|
+
|
|
118
|
+
- **Button** - Boutons avec variantes et tailles
|
|
119
|
+
- **Input** - Champs de saisie texte
|
|
120
|
+
- **Textarea** - Zones de texte multilignes
|
|
121
|
+
- **Checkbox** - Cases à cocher
|
|
122
|
+
- **RadioGroup** - Groupes de boutons radio
|
|
123
|
+
- **Switch** - Interrupteurs toggle
|
|
124
|
+
- **Select** - Listes déroulantes
|
|
125
|
+
- **Slider** - Curseurs de sélection
|
|
126
|
+
- **InputOTP** - Champs OTP
|
|
127
|
+
- **Label** - Labels de formulaire
|
|
128
|
+
- **Form** - Intégration React Hook Form
|
|
129
|
+
|
|
130
|
+
### DateTime
|
|
131
|
+
|
|
132
|
+
- **Calendar** - Calendrier de sélection de date
|
|
133
|
+
- **WakaDateTimePicker** - Sélecteur de date/heure complet avec :
|
|
134
|
+
- Variants : date, time, datetime, range, multiple
|
|
135
|
+
- Presets configurables
|
|
136
|
+
- Validation avancée
|
|
137
|
+
- Support multi-langues
|
|
138
|
+
- Intégration React Hook Form
|
|
139
|
+
|
|
140
|
+
### Navigation
|
|
141
|
+
|
|
142
|
+
- **Tabs** - Onglets
|
|
143
|
+
- **Menubar** - Barre de menu
|
|
144
|
+
- **NavigationMenu** - Menu de navigation
|
|
145
|
+
- **DropdownMenu** - Menus déroulants
|
|
146
|
+
- **ContextMenu** - Menus contextuels
|
|
147
|
+
- **Command** - Palette de commandes (cmd+k)
|
|
148
|
+
- **WakaAdmincrumb** - Fil d'Ariane admin
|
|
149
|
+
|
|
150
|
+
### Overlays
|
|
151
|
+
|
|
152
|
+
- **Dialog** - Modales
|
|
153
|
+
- **AlertDialog** - Dialogues d'alerte
|
|
154
|
+
- **Popover** - Popovers
|
|
155
|
+
- **Tooltip** - Info-bulles
|
|
156
|
+
- **HoverCard** - Cartes au survol
|
|
157
|
+
- **Sheet** - Panneaux latéraux
|
|
158
|
+
|
|
159
|
+
### Feedback
|
|
160
|
+
|
|
161
|
+
- **Toast** / **Toaster** - Notifications toast
|
|
162
|
+
- **Alert** - Alertes
|
|
163
|
+
- **Progress** - Barres de progression
|
|
164
|
+
- **Skeleton** - Placeholders de chargement
|
|
165
|
+
- **WakaNotifications** - Système de notifications
|
|
166
|
+
- **WakaSpinner** - Indicateurs de chargement
|
|
167
|
+
|
|
168
|
+
### Layout
|
|
169
|
+
|
|
170
|
+
- **Card** - Cartes
|
|
171
|
+
- **Separator** - Séparateurs
|
|
172
|
+
- **ScrollArea** - Zones de défilement
|
|
173
|
+
- **AspectRatio** - Ratios d'aspect
|
|
174
|
+
- **Collapsible** - Éléments repliables
|
|
175
|
+
- **Accordion** - Accordéons
|
|
176
|
+
|
|
177
|
+
### Media
|
|
178
|
+
|
|
179
|
+
- **Avatar** - Avatars utilisateurs
|
|
180
|
+
- **WakaCarousel** - Carrousel d'images avec :
|
|
181
|
+
- Navigation clavier/tactile
|
|
182
|
+
- Mode plein écran
|
|
183
|
+
- Téléchargement et partage
|
|
184
|
+
- Autoplay avec contrôles
|
|
185
|
+
- Miniatures et indicateurs
|
|
186
|
+
|
|
187
|
+
### Typography
|
|
188
|
+
|
|
189
|
+
- **Typography** - Composants typographiques
|
|
190
|
+
- **Code** - Affichage de code avec coloration syntaxique
|
|
191
|
+
- **Heading** - Titres sémantiques h1-h6
|
|
192
|
+
- **Text** - Textes avec variantes
|
|
193
|
+
|
|
194
|
+
### Affichage
|
|
195
|
+
|
|
196
|
+
- **Badge** - Badges et étiquettes
|
|
197
|
+
- **Table** - Tables HTML de base
|
|
198
|
+
- **Tabs** - Onglets
|
|
199
|
+
|
|
200
|
+
### Configuration
|
|
201
|
+
|
|
202
|
+
- **LanguageSelector** - Sélecteur de langue avec i18n
|
|
203
|
+
- **ThemeSelector** - Sélecteur de thème
|
|
204
|
+
- **WakaThemeManager** - Gestionnaire de thèmes TweakCN
|
|
205
|
+
- **WakaThemeCreator** - Créateur de thèmes interactif
|
|
297
206
|
|
|
298
|
-
|
|
299
|
-
pnpm dev
|
|
207
|
+
---
|
|
300
208
|
|
|
301
|
-
|
|
302
|
-
pnpm build
|
|
209
|
+
## API
|
|
303
210
|
|
|
304
|
-
|
|
305
|
-
pnpm demo
|
|
306
|
-
```
|
|
211
|
+
Tous les composants sont typés avec TypeScript. Consultez les définitions de types dans `dist/index.d.ts` pour la documentation complète de l'API.
|
|
307
212
|
|
|
308
|
-
|
|
213
|
+
### Entry Points
|
|
309
214
|
|
|
310
|
-
|
|
311
|
-
@
|
|
312
|
-
|
|
313
|
-
│ ├── components/ # Composants UI
|
|
314
|
-
│ │ ├── DataTable/ # DataTable et composants avancés
|
|
315
|
-
│ │ ├── ui/ # Composants de base
|
|
316
|
-
│ │ └── ...
|
|
317
|
-
│ ├── contexts/ # Providers (Theme, I18n, Config)
|
|
318
|
-
│ ├── hooks/ # Hooks personnalisés
|
|
319
|
-
│ ├── utils/ # Fonctions utilitaires
|
|
320
|
-
│ ├── styles/ # Styles CSS/Tailwind
|
|
321
|
-
│ └── types/ # Types TypeScript
|
|
322
|
-
├── demo/ # Application de démonstration
|
|
323
|
-
├── tests/ # Tests unitaires
|
|
324
|
-
└── dist/ # Build de production
|
|
325
|
-
```
|
|
215
|
+
- **Import principal** : `import { Component } from "@wakastellar/ui"`
|
|
216
|
+
- **Styles** : `import "@wakastellar/ui/dist/ui.css"`
|
|
217
|
+
- **Exports** : ESM (`dist/index.es.js`) et CJS (`dist/index.cjs.js`)
|
|
326
218
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
### Tailwind CSS
|
|
330
|
-
|
|
331
|
-
```js
|
|
332
|
-
// tailwind.config.js
|
|
333
|
-
module.exports = {
|
|
334
|
-
content: [
|
|
335
|
-
'./src/**/*.{js,ts,jsx,tsx}',
|
|
336
|
-
'./node_modules/@wakastellar/ui/**/*.{js,ts,jsx,tsx}'
|
|
337
|
-
],
|
|
338
|
-
theme: {
|
|
339
|
-
extend: {
|
|
340
|
-
// Configuration personnalisée
|
|
341
|
-
}
|
|
342
|
-
},
|
|
343
|
-
plugins: [
|
|
344
|
-
require('@wakastellar/ui/tailwind-plugin')
|
|
345
|
-
]
|
|
346
|
-
}
|
|
347
|
-
```
|
|
219
|
+
---
|
|
348
220
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
```json
|
|
352
|
-
// tsconfig.json
|
|
353
|
-
{
|
|
354
|
-
"compilerOptions": {
|
|
355
|
-
"strict": true,
|
|
356
|
-
"esModuleInterop": true,
|
|
357
|
-
"skipLibCheck": true
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
```
|
|
221
|
+
## Bonnes pratiques
|
|
361
222
|
|
|
362
|
-
|
|
223
|
+
### Performance
|
|
363
224
|
|
|
364
|
-
-
|
|
365
|
-
-
|
|
366
|
-
-
|
|
367
|
-
- [Internationalisation](docs/i18n.md)
|
|
368
|
-
- [API Reference](docs/api.md)
|
|
369
|
-
- [Exemples](demo/)
|
|
225
|
+
- Utilisez la virtualisation pour les grandes quantités de données (DataTable)
|
|
226
|
+
- Debouncez les filtres et recherches
|
|
227
|
+
- Mémoïsez les colonnes et callbacks dans les DataTables
|
|
370
228
|
|
|
371
|
-
|
|
229
|
+
### Accessibilité
|
|
372
230
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
4. Push vers la branche (`git push origin feature/AmazingFeature`)
|
|
377
|
-
5. Ouvrir une Pull Request
|
|
231
|
+
- Fournissez des labels descriptifs pour tous les champs
|
|
232
|
+
- Validez la navigation clavier
|
|
233
|
+
- Respectez les standards ARIA
|
|
378
234
|
|
|
379
|
-
|
|
235
|
+
### Sécurité
|
|
380
236
|
|
|
381
|
-
|
|
237
|
+
- Validez et sanitisez tout contenu injecté dans les cellules (XSS)
|
|
238
|
+
- Ne loggez pas d'informations sensibles
|
|
239
|
+
- Utilisez des validations côté serveur en complément
|
|
382
240
|
|
|
383
|
-
|
|
241
|
+
### SSR/Next.js
|
|
242
|
+
|
|
243
|
+
- Évitez l'accès direct à `window` côté serveur
|
|
244
|
+
- Initialisez les données côté client si nécessaire
|
|
245
|
+
- Utilisez les composants avec `"use client"` pour l'interactivité
|
|
246
|
+
|
|
247
|
+
---
|
|
384
248
|
|
|
249
|
+
## Tests & Qualité
|
|
385
250
|
|
|
386
|
-
|
|
251
|
+
La librairie est testée avec :
|
|
387
252
|
|
|
388
|
-
-
|
|
389
|
-
-
|
|
390
|
-
-
|
|
391
|
-
-
|
|
392
|
-
-
|
|
393
|
-
-
|
|
253
|
+
- **vitest** 3.2.4 - Tests unitaires
|
|
254
|
+
- **@testing-library/react** - Tests de composants
|
|
255
|
+
- **@vitest/coverage-v8** - Couverture de code
|
|
256
|
+
- **TypeScript strict mode** - Validation de types
|
|
257
|
+
- **eslint** - Linting
|
|
258
|
+
- **prettier** - Formatage
|
|
259
|
+
|
|
260
|
+
**Recommandations pour l'intégration** :
|
|
261
|
+
|
|
262
|
+
- Testez les cas critiques (tri, filtres, pagination, sélection)
|
|
263
|
+
- Validez l'accessibilité (navigation clavier, lecteurs d'écran)
|
|
264
|
+
- Vérifiez le tree-shaking (ESM) et la taille des bundles
|
|
265
|
+
- Exécutez `tsc --noEmit` en CI pour valider les types
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Distribution
|
|
270
|
+
|
|
271
|
+
- **Format** : ESM + CJS
|
|
272
|
+
- **TypeScript** : Définitions de types incluses
|
|
273
|
+
- **Sourcemaps** : Incluses pour le debugging
|
|
274
|
+
- **Tree-shaking** : Supporté via ESM
|
|
275
|
+
- **Versioning** : SemVer (major.minor.patch)
|
|
394
276
|
|
|
395
277
|
---
|
|
396
278
|
|
|
397
|
-
|
|
279
|
+
## Licence
|
|
280
|
+
|
|
281
|
+
Ce projet est publié sous licence **AGPL-3.0**.
|
|
282
|
+
|
|
283
|
+
Voir le fichier [LICENSE](./LICENSE) pour plus de détails.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
<div align="center">
|
|
288
|
+
|
|
289
|
+
**Fait avec ❤️ par Wakastellar**
|
|
398
290
|
|
|
291
|
+
</div>
|