canvasframework 0.5.18 → 0.5.19

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 (112) hide show
  1. package/components/Accordion.js +265 -0
  2. package/components/AndroidDatePickerDialog.js +406 -0
  3. package/components/AppBar.js +398 -0
  4. package/components/AudioPlayer.js +611 -0
  5. package/components/Avatar.js +202 -0
  6. package/components/Banner.js +342 -0
  7. package/components/BottomNavigationBar.js +433 -0
  8. package/components/BottomSheet.js +234 -0
  9. package/components/Button.js +358 -0
  10. package/components/Camera.js +644 -0
  11. package/components/Card.js +193 -0
  12. package/components/Chart.js +700 -0
  13. package/components/Checkbox.js +166 -0
  14. package/components/Chip.js +212 -0
  15. package/components/CircularProgress.js +327 -0
  16. package/components/ContextMenu.js +116 -0
  17. package/components/DatePicker.js +298 -0
  18. package/components/Dialog.js +337 -0
  19. package/components/Divider.js +125 -0
  20. package/components/Drawer.js +276 -0
  21. package/components/FAB.js +270 -0
  22. package/components/FileUpload.js +315 -0
  23. package/components/FloatedCamera.js +644 -0
  24. package/components/IOSDatePickerWheel.js +430 -0
  25. package/components/ImageCarousel.js +219 -0
  26. package/components/ImageComponent.js +223 -0
  27. package/components/Input.js +831 -0
  28. package/components/InputDatalist.js +723 -0
  29. package/components/InputTags.js +624 -0
  30. package/components/List.js +95 -0
  31. package/components/ListItem.js +269 -0
  32. package/components/Modal.js +364 -0
  33. package/components/MorphingFAB.js +428 -0
  34. package/components/MultiSelectDialog.js +206 -0
  35. package/components/NumberInput.js +271 -0
  36. package/components/PasswordInput.js +462 -0
  37. package/components/ProgressBar.js +88 -0
  38. package/components/QRCodeReader.js +539 -0
  39. package/components/RadioButton.js +151 -0
  40. package/components/SearchInput.js +315 -0
  41. package/components/SegmentedControl.js +357 -0
  42. package/components/Select.js +199 -0
  43. package/components/SelectDialog.js +255 -0
  44. package/components/Slider.js +113 -0
  45. package/components/SliverAppBar.js +139 -0
  46. package/components/Snackbar.js +243 -0
  47. package/components/SpeedDialFAB.js +397 -0
  48. package/components/Stepper.js +281 -0
  49. package/components/SwipeableListItem.js +327 -0
  50. package/components/Switch.js +147 -0
  51. package/components/Table.js +492 -0
  52. package/components/Tabs.js +423 -0
  53. package/components/Text.js +141 -0
  54. package/components/TextField.js +151 -0
  55. package/components/TimePicker.js +934 -0
  56. package/components/Toast.js +236 -0
  57. package/components/TreeView.js +420 -0
  58. package/components/Video.js +397 -0
  59. package/components/View.js +140 -0
  60. package/components/VirtualList.js +120 -0
  61. package/core/CanvasFramework.js +3045 -0
  62. package/core/Component.js +243 -0
  63. package/core/ThemeManager.js +358 -0
  64. package/core/UIBuilder.js +267 -0
  65. package/core/WebGLCanvasAdapter.js +782 -0
  66. package/features/Column.js +43 -0
  67. package/features/Grid.js +47 -0
  68. package/features/LayoutComponent.js +43 -0
  69. package/features/OpenStreetMap.js +310 -0
  70. package/features/Positioned.js +33 -0
  71. package/features/PullToRefresh.js +328 -0
  72. package/features/Row.js +40 -0
  73. package/features/SignaturePad.js +257 -0
  74. package/features/Skeleton.js +193 -0
  75. package/features/Stack.js +21 -0
  76. package/index.js +119 -0
  77. package/manager/AccessibilityManager.js +107 -0
  78. package/manager/ErrorHandler.js +59 -0
  79. package/manager/FeatureFlags.js +60 -0
  80. package/manager/MemoryManager.js +107 -0
  81. package/manager/PerformanceMonitor.js +84 -0
  82. package/manager/SecurityManager.js +54 -0
  83. package/package.json +22 -16
  84. package/utils/AnimationEngine.js +734 -0
  85. package/utils/CryptoManager.js +303 -0
  86. package/utils/DataStore.js +403 -0
  87. package/utils/DevTools.js +1618 -0
  88. package/utils/DevToolsConsole.js +201 -0
  89. package/utils/EventBus.js +407 -0
  90. package/utils/FetchClient.js +74 -0
  91. package/utils/FirebaseAuth.js +653 -0
  92. package/utils/FirebaseCore.js +246 -0
  93. package/utils/FirebaseFirestore.js +581 -0
  94. package/utils/FirebaseFunctions.js +97 -0
  95. package/utils/FirebaseRealtimeDB.js +498 -0
  96. package/utils/FirebaseStorage.js +612 -0
  97. package/utils/FormValidator.js +355 -0
  98. package/utils/GeoLocationService.js +62 -0
  99. package/utils/I18n.js +207 -0
  100. package/utils/IndexedDBManager.js +273 -0
  101. package/utils/InspectionOverlay.js +308 -0
  102. package/utils/NotificationManager.js +60 -0
  103. package/utils/OfflineSyncManager.js +342 -0
  104. package/utils/PayPalPayment.js +678 -0
  105. package/utils/QueryBuilder.js +478 -0
  106. package/utils/SafeArea.js +64 -0
  107. package/utils/SecureStorage.js +289 -0
  108. package/utils/StateManager.js +207 -0
  109. package/utils/StripePayment.js +552 -0
  110. package/utils/WebSocketClient.js +66 -0
  111. package/dist/canvasframework.js +0 -2
  112. package/dist/canvasframework.js.LICENSE.txt +0 -1
@@ -0,0 +1,223 @@
1
+ import Component from '../core/Component.js';
2
+ /**
3
+ * Composant d'image
4
+ * @class
5
+ * @extends Component
6
+ * @property {string} src - URL de l'image
7
+ * @property {string} fit - Mode d'ajustement ('cover', 'contain', 'fill', 'none')
8
+ * @property {number} borderRadius - Rayon des coins
9
+ * @property {string} placeholder - Couleur de placeholder
10
+ * @property {boolean} loaded - Image chargée
11
+ * @property {boolean} loading - En cours de chargement
12
+ * @property {boolean} error - Erreur de chargement
13
+ * @property {HTMLImageElement} img - Élément image HTML
14
+ */
15
+ class ImageComponent extends Component {
16
+ /**
17
+ * Crée une instance de ImageComponent
18
+ * @param {CanvasFramework} framework - Framework parent
19
+ * @param {Object} [options={}] - Options de configuration
20
+ * @param {string} [options.src=''] - URL de l'image
21
+ * @param {string} [options.fit='cover'] - Mode d'ajustement
22
+ * @param {number} [options.borderRadius=0] - Rayon des coins
23
+ * @param {string} [options.placeholder='#E0E0E0'] - Couleur de placeholder
24
+ */
25
+ constructor(framework, options = {}) {
26
+ super(framework, options);
27
+ this.src = options.src || '';
28
+ this.fit = options.fit || 'cover'; // cover, contain, fill, none
29
+ this.borderRadius = options.borderRadius || 0;
30
+ this.placeholder = options.placeholder || '#E0E0E0';
31
+ this.loaded = false;
32
+ this.loading = false;
33
+ this.error = false;
34
+
35
+ // Créer l'élément image
36
+ this.img = null;
37
+ if (this.src) {
38
+ this.loadImage();
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Charge l'image
44
+ * @private
45
+ */
46
+ loadImage() {
47
+ if (this.loading) return;
48
+
49
+ this.loading = true;
50
+ this.img = new Image();
51
+ this.img.crossOrigin = 'anonymous';
52
+
53
+ this.img.onload = () => {
54
+ this.loaded = true;
55
+ this.loading = false;
56
+ this.error = false;
57
+ };
58
+
59
+ this.img.onerror = () => {
60
+ this.loaded = false;
61
+ this.loading = false;
62
+ this.error = true;
63
+ };
64
+
65
+ this.img.src = this.src;
66
+ }
67
+
68
+ /**
69
+ * Change l'URL de l'image
70
+ * @param {string} newSrc - Nouvelle URL
71
+ */
72
+ setSrc(newSrc) {
73
+ this.src = newSrc;
74
+ this.loaded = false;
75
+ this.error = false;
76
+ this.loadImage();
77
+ }
78
+
79
+ /**
80
+ * Dessine l'image
81
+ * @param {CanvasRenderingContext2D} ctx - Contexte de dessin
82
+ */
83
+ draw(ctx) {
84
+ ctx.save();
85
+
86
+ // Clipping avec borderRadius
87
+ if (this.borderRadius > 0) {
88
+ ctx.beginPath();
89
+ this.roundRect(ctx, this.x, this.y, this.width, this.height, this.borderRadius);
90
+ ctx.clip();
91
+ }
92
+
93
+ if (this.loaded && this.img) {
94
+ // Dessiner l'image selon le mode fit
95
+ const imgRatio = this.img.width / this.img.height;
96
+ const boxRatio = this.width / this.height;
97
+
98
+ let drawWidth, drawHeight, drawX, drawY;
99
+
100
+ switch (this.fit) {
101
+ case 'cover':
102
+ if (imgRatio > boxRatio) {
103
+ drawHeight = this.height;
104
+ drawWidth = drawHeight * imgRatio;
105
+ drawX = this.x - (drawWidth - this.width) / 2;
106
+ drawY = this.y;
107
+ } else {
108
+ drawWidth = this.width;
109
+ drawHeight = drawWidth / imgRatio;
110
+ drawX = this.x;
111
+ drawY = this.y - (drawHeight - this.height) / 2;
112
+ }
113
+ break;
114
+
115
+ case 'contain':
116
+ if (imgRatio > boxRatio) {
117
+ drawWidth = this.width;
118
+ drawHeight = drawWidth / imgRatio;
119
+ drawX = this.x;
120
+ drawY = this.y + (this.height - drawHeight) / 2;
121
+ } else {
122
+ drawHeight = this.height;
123
+ drawWidth = drawHeight * imgRatio;
124
+ drawX = this.x + (this.width - drawWidth) / 2;
125
+ drawY = this.y;
126
+ }
127
+ break;
128
+
129
+ case 'fill':
130
+ drawX = this.x;
131
+ drawY = this.y;
132
+ drawWidth = this.width;
133
+ drawHeight = this.height;
134
+ break;
135
+
136
+ case 'none':
137
+ drawX = this.x + (this.width - this.img.width) / 2;
138
+ drawY = this.y + (this.height - this.img.height) / 2;
139
+ drawWidth = this.img.width;
140
+ drawHeight = this.img.height;
141
+ break;
142
+
143
+ default:
144
+ drawX = this.x;
145
+ drawY = this.y;
146
+ drawWidth = this.width;
147
+ drawHeight = this.height;
148
+ }
149
+
150
+ ctx.drawImage(this.img, drawX, drawY, drawWidth, drawHeight);
151
+
152
+ } else if (this.loading) {
153
+ // Placeholder avec spinner
154
+ ctx.fillStyle = this.placeholder;
155
+ ctx.fillRect(this.x, this.y, this.width, this.height);
156
+
157
+ // Petit spinner au centre
158
+ const centerX = this.x + this.width / 2;
159
+ const centerY = this.y + this.height / 2;
160
+ const spinnerSize = Math.min(40, this.width / 3, this.height / 3);
161
+
162
+ ctx.strokeStyle = '#999999';
163
+ ctx.lineWidth = 3;
164
+ ctx.lineCap = 'round';
165
+ const rotation = (Date.now() / 10) % 360 * (Math.PI / 180);
166
+ ctx.beginPath();
167
+ ctx.arc(centerX, centerY, spinnerSize / 2, rotation, rotation + Math.PI * 1.5);
168
+ ctx.stroke();
169
+
170
+ } else if (this.error) {
171
+ // Placeholder avec icône d'erreur
172
+ ctx.fillStyle = this.placeholder;
173
+ ctx.fillRect(this.x, this.y, this.width, this.height);
174
+
175
+ ctx.fillStyle = '#999999';
176
+ ctx.font = '48px sans-serif';
177
+ ctx.textAlign = 'center';
178
+ ctx.textBaseline = 'middle';
179
+ ctx.fillText('⚠️', this.x + this.width / 2, this.y + this.height / 2);
180
+
181
+ } else {
182
+ // Placeholder simple
183
+ ctx.fillStyle = this.placeholder;
184
+ ctx.fillRect(this.x, this.y, this.width, this.height);
185
+ }
186
+
187
+ ctx.restore();
188
+ }
189
+
190
+ /**
191
+ * Dessine un rectangle avec coins arrondis
192
+ * @param {CanvasRenderingContext2D} ctx - Contexte de dessin
193
+ * @param {number} x - Position X
194
+ * @param {number} y - Position Y
195
+ * @param {number} width - Largeur
196
+ * @param {number} height - Hauteur
197
+ * @param {number} radius - Rayon des coins
198
+ * @private
199
+ */
200
+ roundRect(ctx, x, y, width, height, radius) {
201
+ ctx.beginPath();
202
+ ctx.moveTo(x + radius, y);
203
+ ctx.lineTo(x + width - radius, y);
204
+ ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
205
+ ctx.lineTo(x + width, y + height - radius);
206
+ ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
207
+ ctx.lineTo(x + radius, y + height);
208
+ ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
209
+ ctx.lineTo(x, y + radius);
210
+ ctx.quadraticCurveTo(x, y, x + radius, y);
211
+ ctx.closePath();
212
+ }
213
+
214
+ /**
215
+ * Vérifie si un point est dans les limites
216
+ * @returns {boolean} False (non cliquable par défaut)
217
+ */
218
+ isPointInside() {
219
+ return false; // Non cliquable par défaut
220
+ }
221
+ }
222
+
223
+ export default ImageComponent;