@wakastellar/ui 0.2.0 → 0.4.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 (66) hide show
  1. package/dist/blocks/activity-timeline/index.d.ts +73 -0
  2. package/dist/blocks/calendar-view/index.d.ts +56 -0
  3. package/dist/blocks/chat/index.d.ts +87 -0
  4. package/dist/blocks/dashboard/index.d.ts +92 -0
  5. package/dist/blocks/empty-states/index.d.ts +44 -0
  6. package/dist/blocks/error-pages/index.d.ts +52 -0
  7. package/dist/blocks/faq/index.d.ts +54 -0
  8. package/dist/blocks/file-manager/index.d.ts +81 -0
  9. package/dist/blocks/header/index.d.ts +86 -0
  10. package/dist/blocks/i18n-editor/index.d.ts +63 -0
  11. package/dist/blocks/index.d.ts +36 -0
  12. package/dist/blocks/kanban-board/index.d.ts +77 -0
  13. package/dist/blocks/landing/index.d.ts +101 -0
  14. package/dist/blocks/pricing/index.d.ts +60 -0
  15. package/dist/blocks/profile/index.d.ts +98 -0
  16. package/dist/blocks/settings/index.d.ts +62 -0
  17. package/dist/blocks/theme-creator-block/index.d.ts +86 -0
  18. package/dist/blocks/user-management/index.d.ts +95 -0
  19. package/dist/blocks/wizard/index.d.ts +88 -0
  20. package/dist/charts.cjs.js +1 -0
  21. package/dist/charts.d.ts +17 -0
  22. package/dist/charts.es.js +16 -0
  23. package/dist/cn-CAc3sAGM.js +21 -0
  24. package/dist/cn-zrNBeCrC.js +1 -0
  25. package/dist/components/DataTable/DataTableBody.d.ts +3 -1
  26. package/dist/components/DataTable/DataTableHeader.d.ts +3 -1
  27. package/dist/components/command/index.d.ts +5 -1
  28. package/dist/components/index.d.ts +19 -0
  29. package/dist/components/language-selector/index.d.ts +19 -1
  30. package/dist/components/theme-selector/index.d.ts +10 -0
  31. package/dist/components/waka-barcode/index.d.ts +27 -0
  32. package/dist/components/waka-breadcrumb/index.d.ts +43 -0
  33. package/dist/components/waka-combobox/index.d.ts +81 -0
  34. package/dist/components/waka-date-range-picker/index.d.ts +68 -0
  35. package/dist/components/waka-drawer/index.d.ts +59 -0
  36. package/dist/components/waka-image/index.d.ts +57 -0
  37. package/dist/components/waka-kanban/index.d.ts +68 -0
  38. package/dist/components/waka-modal/index.d.ts +82 -0
  39. package/dist/components/waka-number-input/index.d.ts +60 -0
  40. package/dist/components/waka-pagination/index.d.ts +67 -0
  41. package/dist/components/waka-qrcode/index.d.ts +32 -0
  42. package/dist/components/waka-segmented-control/index.d.ts +42 -0
  43. package/dist/components/waka-spinner/index.d.ts +57 -21
  44. package/dist/components/waka-stat/index.d.ts +57 -0
  45. package/dist/components/waka-stepper/index.d.ts +76 -0
  46. package/dist/components/waka-theme-creator/index.d.ts +73 -22
  47. package/dist/components/waka-time-picker/index.d.ts +51 -0
  48. package/dist/components/waka-timeline/index.d.ts +46 -0
  49. package/dist/components/waka-tree/index.d.ts +67 -0
  50. package/dist/components/waka-video/index.d.ts +66 -0
  51. package/dist/components/waka-virtual-list/index.d.ts +54 -0
  52. package/dist/export.cjs.js +1 -0
  53. package/dist/export.d.ts +28 -0
  54. package/dist/export.es.js +5 -0
  55. package/dist/index-CENPre_9.js +466 -0
  56. package/dist/index-CHLjUBPo.js +1 -0
  57. package/dist/index.cjs.js +54 -155
  58. package/dist/index.es.js +21942 -12131
  59. package/dist/rich-text.cjs.js +1 -0
  60. package/dist/rich-text.d.ts +21 -0
  61. package/dist/rich-text.es.js +4 -0
  62. package/dist/types-Bjy1Hy76.js +1111 -0
  63. package/dist/types-CHv7a1SP.js +1 -0
  64. package/dist/useDataTableImport-DqeEL4GC.js +124 -0
  65. package/dist/useDataTableImport-sQwBFAJ_.js +775 -0
  66. package/package.json +54 -5
@@ -5,6 +5,40 @@ export interface ThemeVersion {
5
5
  changelog?: string;
6
6
  css: string;
7
7
  }
8
+ /**
9
+ * Ressource personnalisée pour le thème
10
+ */
11
+ export interface ThemeCustomResource {
12
+ /** Clé unique de la ressource */
13
+ key: string;
14
+ /** URL de la ressource (après upload S3) */
15
+ url: string;
16
+ /** Type de fichier */
17
+ type: "image" | "icon" | "font" | "other";
18
+ /** Nom du fichier original */
19
+ filename: string;
20
+ /** Taille en octets */
21
+ size?: number;
22
+ }
23
+ /**
24
+ * Configuration des assets du thème (login, etc.)
25
+ */
26
+ export interface ThemeAssets {
27
+ /** Logo pour le mode clair */
28
+ logo_light?: string;
29
+ /** Logo pour le mode sombre */
30
+ logo_dark?: string;
31
+ /** Image de fond pour le mode clair */
32
+ background_light?: string;
33
+ /** Image de fond pour le mode sombre */
34
+ background_dark?: string;
35
+ /** Favicon */
36
+ favicon?: string;
37
+ /** Image de sponsor (mode clair) */
38
+ sponsor_light?: string;
39
+ /** Image de sponsor (mode sombre) */
40
+ sponsor_dark?: string;
41
+ }
8
42
  export interface ThemeMetadata {
9
43
  id: string;
10
44
  label: string;
@@ -13,47 +47,64 @@ export interface ThemeMetadata {
13
47
  author?: string;
14
48
  versions: ThemeVersion[];
15
49
  currentVersion: string;
50
+ /** Assets du thème (logos, backgrounds) */
51
+ assets?: ThemeAssets;
52
+ /** Ressources personnalisées */
53
+ customResources?: ThemeCustomResource[];
16
54
  }
17
- export interface S3UploadConfig {
18
- /** URL de base du bucket S3 */
19
- baseUrl: string;
20
- /** Méthode HTTP pour l'upload (PUT ou POST) */
21
- method?: "PUT" | "POST";
22
- /** Headers personnalisés pour l'authentification */
23
- headers?: Record<string, string>;
24
- /** Préfixe des fichiers */
25
- prefix?: string;
26
- /** Extension des fichiers */
27
- extension?: string;
55
+ /**
56
+ * Réponse de l'API d'upload de fichier
57
+ */
58
+ export interface FileUploadResponse {
59
+ /** URL du fichier uploadé */
60
+ url: string;
61
+ /** Nom du fichier */
62
+ filename?: string;
63
+ /** Taille du fichier en octets */
64
+ size?: number;
28
65
  }
29
- export interface WakaThemeCreatorProps {
30
- /** Configuration S3 pour l'upload */
31
- s3Config: S3UploadConfig;
32
- /** Callback après sauvegarde réussie */
33
- onSave?: (theme: ThemeMetadata) => void;
34
- /** Callback après suppression */
35
- onDelete?: (themeId: string) => void;
36
- /** Callback pour charger un thème depuis S3 */
66
+ /**
67
+ * Configuration de l'API pour le ThemeCreator
68
+ */
69
+ export interface ThemeCreatorApiConfig {
70
+ /** Callback pour uploader un fichier (logo, background, etc.) */
71
+ onUploadFile: (file: File, themeId: string, assetType: string) => Promise<FileUploadResponse>;
72
+ /** Callback pour sauvegarder le thème complet */
73
+ onSaveTheme: (theme: ThemeMetadata) => Promise<void>;
74
+ /** Callback pour supprimer un thème */
75
+ onDeleteTheme?: (themeId: string) => Promise<void>;
76
+ /** Callback pour charger les détails d'un thème */
37
77
  onLoadTheme?: (themeId: string) => Promise<ThemeMetadata | null>;
78
+ /** Callback pour supprimer un asset */
79
+ onDeleteAsset?: (themeId: string, assetType: string) => Promise<void>;
80
+ }
81
+ export interface WakaThemeCreatorProps {
82
+ /** Configuration de l'API */
83
+ apiConfig: ThemeCreatorApiConfig;
38
84
  /** Thèmes existants à charger */
39
85
  existingThemes?: ThemeMetadata[];
86
+ /** Callback après sauvegarde réussie */
87
+ onSaveSuccess?: (theme: ThemeMetadata) => void;
88
+ /** Callback après suppression */
89
+ onDeleteSuccess?: (themeId: string) => void;
40
90
  /** Classe CSS personnalisée */
41
91
  className?: string;
42
92
  }
43
93
  /**
44
94
  * WakaThemeCreator
45
95
  *
46
- * Composant d'administration pour créer, prévisualiser et publier des thèmes TweakCN sur S3.
96
+ * Composant d'administration pour créer, prévisualiser et publier des thèmes TweakCN.
47
97
  *
48
98
  * Features:
49
99
  * - Création de thèmes avec CSS TweakCN
50
100
  * - Prévisualisation en temps réel
51
101
  * - Gestion des versions
52
- * - Upload sur S3/MinIO
102
+ * - Upload via API (POST)
103
+ * - Gestion des ressources (logos, backgrounds, custom)
53
104
  * - Historique des modifications
54
105
  * - Validation du CSS
55
106
  */
56
- export declare function WakaThemeCreator({ s3Config, onSave, onDelete, onLoadTheme, existingThemes, className, }: WakaThemeCreatorProps): import("react/jsx-runtime").JSX.Element;
107
+ export declare function WakaThemeCreator({ apiConfig, existingThemes, onSaveSuccess, onDeleteSuccess, className, }: WakaThemeCreatorProps): import("react/jsx-runtime").JSX.Element;
57
108
  export declare namespace WakaThemeCreator {
58
109
  var displayName: string;
59
110
  }
@@ -0,0 +1,51 @@
1
+ import * as React from "react";
2
+ export interface WakaTimePickerProps {
3
+ /** Valeur sélectionnée (format HH:mm ou HH:mm:ss) */
4
+ value?: string;
5
+ /** Callback lors du changement */
6
+ onChange?: (value: string) => void;
7
+ /** Placeholder */
8
+ placeholder?: string;
9
+ /** Format d'affichage */
10
+ format?: "12h" | "24h";
11
+ /** Afficher les secondes */
12
+ showSeconds?: boolean;
13
+ /** Intervalle des minutes (5, 10, 15, 30) */
14
+ minuteStep?: number;
15
+ /** Intervalle des secondes */
16
+ secondStep?: number;
17
+ /** Heure minimum */
18
+ minTime?: string;
19
+ /** Heure maximum */
20
+ maxTime?: string;
21
+ /** Désactivé */
22
+ disabled?: boolean;
23
+ /** Erreur */
24
+ error?: boolean;
25
+ /** Taille */
26
+ size?: "sm" | "md" | "lg";
27
+ /** Classes CSS additionnelles */
28
+ className?: string;
29
+ /** ID pour l'accessibilité */
30
+ id?: string;
31
+ /** Nom du champ */
32
+ name?: string;
33
+ }
34
+ export declare function WakaTimePicker({ value, onChange, placeholder, format, showSeconds, minuteStep, secondStep, minTime, maxTime, disabled, error, size, className, id, name, }: WakaTimePickerProps): import("react/jsx-runtime").JSX.Element;
35
+ export interface UseTimePickerOptions {
36
+ /** Valeur initiale */
37
+ initialValue?: string;
38
+ /** Format */
39
+ format?: "12h" | "24h";
40
+ /** Afficher les secondes */
41
+ showSeconds?: boolean;
42
+ }
43
+ export declare function useTimePicker(options?: UseTimePickerOptions): {
44
+ value: string;
45
+ onChange: React.Dispatch<React.SetStateAction<string>>;
46
+ clear: () => void;
47
+ setNow: () => void;
48
+ format: "12h" | "24h";
49
+ showSeconds: boolean;
50
+ };
51
+ export default WakaTimePicker;
@@ -0,0 +1,46 @@
1
+ import * as React from "react";
2
+ export type TimelineItemStatus = "completed" | "current" | "pending" | "error";
3
+ export interface TimelineItem {
4
+ /** Identifiant unique */
5
+ id: string;
6
+ /** Titre de l'élément */
7
+ title: string;
8
+ /** Description */
9
+ description?: string;
10
+ /** Date/heure */
11
+ date?: Date | string;
12
+ /** Statut */
13
+ status?: TimelineItemStatus;
14
+ /** Icône personnalisée */
15
+ icon?: React.ReactNode;
16
+ /** Couleur personnalisée */
17
+ color?: string;
18
+ /** Contenu supplémentaire (collapsible) */
19
+ content?: React.ReactNode;
20
+ /** Données additionnelles */
21
+ data?: Record<string, unknown>;
22
+ }
23
+ export interface WakaTimelineProps {
24
+ /** Éléments de la timeline */
25
+ items: TimelineItem[];
26
+ /** Orientation */
27
+ orientation?: "vertical" | "horizontal";
28
+ /** Position de la ligne (vertical seulement) */
29
+ linePosition?: "left" | "center" | "right";
30
+ /** Taille */
31
+ size?: "sm" | "md" | "lg";
32
+ /** Afficher les dates */
33
+ showDates?: boolean;
34
+ /** Format de date */
35
+ dateFormat?: Intl.DateTimeFormatOptions;
36
+ /** Éléments collapsibles */
37
+ collapsible?: boolean;
38
+ /** Alterner les côtés (linePosition=center) */
39
+ alternate?: boolean;
40
+ /** Callback lors du clic sur un élément */
41
+ onItemClick?: (item: TimelineItem) => void;
42
+ /** Classes CSS additionnelles */
43
+ className?: string;
44
+ }
45
+ export declare function WakaTimeline({ items, orientation, linePosition, size, showDates, dateFormat, collapsible, alternate, onItemClick, className, }: WakaTimelineProps): import("react/jsx-runtime").JSX.Element;
46
+ export default WakaTimeline;
@@ -0,0 +1,67 @@
1
+ import * as React from "react";
2
+ export interface TreeNode {
3
+ /** Identifiant unique du noeud */
4
+ id: string;
5
+ /** Libellé du noeud */
6
+ label: string;
7
+ /** Icône personnalisée */
8
+ icon?: React.ReactNode;
9
+ /** Enfants du noeud */
10
+ children?: TreeNode[];
11
+ /** Données additionnelles */
12
+ data?: Record<string, unknown>;
13
+ /** Désactiver le noeud */
14
+ disabled?: boolean;
15
+ /** Noeud sélectionnable */
16
+ selectable?: boolean;
17
+ }
18
+ export interface WakaTreeProps {
19
+ /** Données de l'arbre */
20
+ data: TreeNode[];
21
+ /** IDs des noeuds sélectionnés */
22
+ selectedIds?: string[];
23
+ /** Callback lors de la sélection */
24
+ onSelect?: (ids: string[]) => void;
25
+ /** IDs des noeuds développés */
26
+ expandedIds?: string[];
27
+ /** Callback lors du développement */
28
+ onExpand?: (ids: string[]) => void;
29
+ /** Mode de sélection */
30
+ selectionMode?: "none" | "single" | "multiple";
31
+ /** Afficher les checkboxes */
32
+ showCheckboxes?: boolean;
33
+ /** Afficher les icônes de fichier/dossier */
34
+ showIcons?: boolean;
35
+ /** Activer le drag & drop */
36
+ draggable?: boolean;
37
+ /** Callback lors du drop */
38
+ onDrop?: (draggedId: string, targetId: string, position: "before" | "after" | "inside") => void;
39
+ /** Taille */
40
+ size?: "sm" | "md" | "lg";
41
+ /** Classes CSS additionnelles */
42
+ className?: string;
43
+ /** Développer tout par défaut */
44
+ defaultExpandAll?: boolean;
45
+ }
46
+ export declare function WakaTree({ data, selectedIds: controlledSelectedIds, onSelect, expandedIds: controlledExpandedIds, onExpand, selectionMode, showCheckboxes, showIcons, draggable, onDrop: onDropProp, size, className, defaultExpandAll, }: WakaTreeProps): import("react/jsx-runtime").JSX.Element;
47
+ /**
48
+ * Trouve un noeud par son ID dans l'arbre
49
+ */
50
+ export declare function findNodeById(nodes: TreeNode[], id: string): TreeNode | null;
51
+ /**
52
+ * Met à jour un noeud dans l'arbre (retourne un nouvel arbre)
53
+ */
54
+ export declare function updateNode(nodes: TreeNode[], id: string, updates: Partial<TreeNode>): TreeNode[];
55
+ /**
56
+ * Supprime un noeud de l'arbre (retourne un nouvel arbre)
57
+ */
58
+ export declare function removeNode(nodes: TreeNode[], id: string): TreeNode[];
59
+ /**
60
+ * Ajoute un noeud enfant à un parent
61
+ */
62
+ export declare function addChildNode(nodes: TreeNode[], parentId: string, newNode: TreeNode): TreeNode[];
63
+ /**
64
+ * Déplace un noeud dans l'arbre
65
+ */
66
+ export declare function moveNode(nodes: TreeNode[], draggedId: string, targetId: string, position: "before" | "after" | "inside"): TreeNode[];
67
+ export default WakaTree;
@@ -0,0 +1,66 @@
1
+ import * as React from "react";
2
+ export interface VideoSource {
3
+ src: string;
4
+ type?: string;
5
+ quality?: string;
6
+ }
7
+ export interface WakaVideoProps {
8
+ /** Source(s) de la vidéo */
9
+ src: string | VideoSource[];
10
+ /** URL du poster */
11
+ poster?: string;
12
+ /** Lecture automatique */
13
+ autoPlay?: boolean;
14
+ /** Boucle */
15
+ loop?: boolean;
16
+ /** Muet */
17
+ muted?: boolean;
18
+ /** Afficher les contrôles */
19
+ controls?: boolean;
20
+ /** Précharger la vidéo */
21
+ preload?: "none" | "metadata" | "auto";
22
+ /** Largeur */
23
+ width?: number | string;
24
+ /** Hauteur */
25
+ height?: number | string;
26
+ /** Aspect ratio */
27
+ aspectRatio?: string;
28
+ /** Afficher le bouton plein écran */
29
+ showFullscreen?: boolean;
30
+ /** Afficher le sélecteur de vitesse */
31
+ showPlaybackSpeed?: boolean;
32
+ /** Afficher le sélecteur de qualité */
33
+ showQualitySelector?: boolean;
34
+ /** Vitesses de lecture disponibles */
35
+ playbackSpeeds?: number[];
36
+ /** Callback quand la vidéo est prête */
37
+ onReady?: () => void;
38
+ /** Callback lors de la lecture */
39
+ onPlay?: () => void;
40
+ /** Callback lors de la pause */
41
+ onPause?: () => void;
42
+ /** Callback quand la vidéo se termine */
43
+ onEnded?: () => void;
44
+ /** Callback lors du changement de temps */
45
+ onTimeUpdate?: (currentTime: number) => void;
46
+ /** Callback en cas d'erreur */
47
+ onError?: (error: Error) => void;
48
+ /** Classes CSS additionnelles */
49
+ className?: string;
50
+ }
51
+ export declare function WakaVideo({ src, poster, autoPlay, loop, muted, controls, preload, width, height, aspectRatio, showFullscreen, showPlaybackSpeed, showQualitySelector, playbackSpeeds, onReady, onPlay, onPause, onEnded, onTimeUpdate, onError, className, }: WakaVideoProps): import("react/jsx-runtime").JSX.Element;
52
+ export interface UseVideoOptions {
53
+ autoPlay?: boolean;
54
+ muted?: boolean;
55
+ }
56
+ export declare function useVideo(options?: UseVideoOptions): {
57
+ isPlaying: boolean;
58
+ isMuted: boolean;
59
+ currentTime: number;
60
+ duration: number;
61
+ onPlay: () => void;
62
+ onPause: () => void;
63
+ onTimeUpdate: React.Dispatch<React.SetStateAction<number>>;
64
+ onReady: () => void;
65
+ };
66
+ export default WakaVideo;
@@ -0,0 +1,54 @@
1
+ import * as React from "react";
2
+ export interface WakaVirtualListProps<T> {
3
+ /** Données à afficher */
4
+ items: T[];
5
+ /** Hauteur de chaque élément (ou fonction pour hauteur variable) */
6
+ itemHeight: number | ((item: T, index: number) => number);
7
+ /** Hauteur du conteneur */
8
+ height: number;
9
+ /** Largeur du conteneur */
10
+ width?: number | string;
11
+ /** Nombre d'éléments à pré-rendre au-dessus/en-dessous */
12
+ overscan?: number;
13
+ /** Fonction de rendu d'un élément */
14
+ renderItem: (item: T, index: number, style: React.CSSProperties) => React.ReactNode;
15
+ /** Callback lors du scroll */
16
+ onScroll?: (scrollTop: number) => void;
17
+ /** Callback quand on atteint la fin */
18
+ onEndReached?: () => void;
19
+ /** Seuil pour déclencher onEndReached (en pixels) */
20
+ endReachedThreshold?: number;
21
+ /** Afficher un indicateur de chargement à la fin */
22
+ isLoading?: boolean;
23
+ /** Élément à afficher pendant le chargement */
24
+ loadingElement?: React.ReactNode;
25
+ /** Élément à afficher si la liste est vide */
26
+ emptyElement?: React.ReactNode;
27
+ /** Classes CSS additionnelles */
28
+ className?: string;
29
+ /** Classes CSS pour le conteneur interne */
30
+ innerClassName?: string;
31
+ /** Référence au conteneur de scroll */
32
+ scrollRef?: React.RefObject<HTMLDivElement>;
33
+ }
34
+ export declare function WakaVirtualList<T>({ items, itemHeight, height, width, overscan, renderItem, onScroll, onEndReached, endReachedThreshold, isLoading, loadingElement, emptyElement, className, innerClassName, scrollRef: externalScrollRef, }: WakaVirtualListProps<T>): import("react/jsx-runtime").JSX.Element;
35
+ export interface UseVirtualListOptions {
36
+ itemCount: number;
37
+ itemHeight: number;
38
+ containerHeight: number;
39
+ overscan?: number;
40
+ }
41
+ export declare function useVirtualList(options: UseVirtualListOptions): {
42
+ totalHeight: number;
43
+ virtualItems: {
44
+ index: number;
45
+ start: number;
46
+ size: number;
47
+ }[];
48
+ startIndex: number;
49
+ endIndex: number;
50
+ handleScroll: (e: React.UIEvent<HTMLElement>) => void;
51
+ scrollToIndex: (index: number) => void;
52
+ scrollTop: number;
53
+ };
54
+ export default WakaVirtualList;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useDataTableImport-DqeEL4GC.js");exports.useDataTableExport=e.useDataTableExport;exports.useDataTableImport=e.useDataTableImport;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Entry point pour les fonctionnalités d'export du DataTable
3
+ *
4
+ * Usage:
5
+ * ```ts
6
+ * import { useDataTableExport } from "@wakastellar/ui/export"
7
+ * ```
8
+ *
9
+ * Dépendances optionnelles selon le format:
10
+ *
11
+ * Pour l'export Excel (.xlsx):
12
+ * - xlsx (>=0.18.0)
13
+ * ```bash
14
+ * pnpm add xlsx
15
+ * ```
16
+ *
17
+ * Pour l'export PDF:
18
+ * - jspdf (>=2.5.0)
19
+ * - jspdf-autotable (>=3.5.0)
20
+ * ```bash
21
+ * pnpm add jspdf jspdf-autotable
22
+ * ```
23
+ *
24
+ * Note: Les formats CSV, JSON et XML fonctionnent sans dépendances supplémentaires.
25
+ */
26
+ export { useDataTableExport } from './components/DataTable/hooks/useDataTableExport';
27
+ export { useDataTableImport } from './components/DataTable/hooks/useDataTableImport';
28
+ export type { ExportConfig, ImportConfig, ExportableCellValue, ImportedRowData, } from './components/DataTable/types';
@@ -0,0 +1,5 @@
1
+ import { u as t, a as o } from "./useDataTableImport-sQwBFAJ_.js";
2
+ export {
3
+ t as useDataTableExport,
4
+ o as useDataTableImport
5
+ };